+++ /dev/null
-/* FCE Ultra - NES/Famicom Emulator\r
- *\r
- * Copyright notice for this file:\r
- * Copyright (C) 1998 \Firebug\\r
- * Copyright (C) 2002 Ben Parnell\r
- *\r
- * This program is free software; you can redistribute it and/or modify\r
- * it under the terms of the GNU General Public License as published by\r
- * the Free Software Foundation; either version 2 of the License, or\r
- * (at your option) any later version.\r
- *\r
- * This program is distributed in the hope that it will be useful,\r
- * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
- * GNU General Public License for more details.\r
- *\r
- * You should have received a copy of the GNU General Public License\r
- * along with this program; if not, write to the Free Software\r
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
- */\r
-\r
-#include <stdio.h>\r
-#include <string.h>\r
-#include <dpmi.h>\r
-#include <sys/farptr.h>\r
-#include <go32.h>\r
-#include <pc.h>\r
-\r
-#include "dos.h"\r
-#include "dos-video.h"\r
-\r
-#define TEXT 3\r
-#define G320x200x256 0x13\r
-\r
-static void vga_waitretrace(void)\r
-{ \r
- while(inp(0x3da)&0x8); \r
- while(!(inp(0x3da)&0x8));\r
-}\r
-\r
-static void vga_setmode(int mode)\r
-{\r
- __dpmi_regs regs;\r
-\r
- memset(®s,0,sizeof(regs));\r
- regs.x.ax=mode;\r
-\r
- __dpmi_int(0x10,®s);\r
-}\r
-\r
-void vga_setpalette(int i, int r, int g, int b)\r
-{ \r
- outp(0x3c8,i);\r
- outp(0x3c9,r);\r
- outp(0x3c9,g);\r
- outp(0x3c9,b); \r
-}\r
-\r
-int FCEUDvmode=1;\r
-\r
-static int vidready=0;\r
-\r
-/* Part of the VGA low-level mass register setting code derived from\r
- code by \Firebug\.\r
-*/\r
-\r
-#include "vgatweak.c"\r
-\r
-void SetBorder(void)\r
-{\r
- inportb(0x3da);\r
- outportb(0x3c0,(0x11|0x20));\r
- outportb(0x3c0,0x80);\r
-}\r
-\r
-void TweakVGA(int VGAMode)\r
-{\r
- int I;\r
- \r
- vga_waitretrace();\r
-\r
- outportb(0x3C8,0x00);\r
- for(I=0;I<768;I++) outportb(0x3C9,0x00);\r
-\r
- outportb(0x3D4,0x11);\r
- I=inportb(0x3D5)&0x7F;\r
- outportb(0x3D4,0x11);\r
- outportb(0x3D5,I);\r
-\r
- switch(VGAMode)\r
- {\r
- case 1: for(I=0;I<25;I++) VGAPortSet(v256x240[I]);break;\r
- case 2: for(I=0;I<25;I++) VGAPortSet(v256x256[I]);break;\r
- case 3: for(I=0;I<25;I++) VGAPortSet(v256x256S[I]);break;\r
- case 6: for(I=0;I<25;I++) VGAPortSet(v256x224S[I]);break;\r
- case 8: for(I=0;I<25;I++) VGAPortSet(v256x224_103[I]);break;\r
- default: break;\r
- }\r
-\r
- outportb(0x3da,0);\r
-}\r
-\r
-\r
-static uint8 palettedbr[256],palettedbg[256],palettedbb[256];\r
-\r
-static void FlushPalette(void)\r
-{\r
- int x;\r
- for(x=0;x<256;x++)\r
- {\r
- int z=x;\r
- vga_setpalette(z,palettedbr[x]>>2,palettedbg[x]>>2,palettedbb[x]>>2);\r
- }\r
-}\r
-\r
-void FCEUD_SetPalette(uint8 index, uint8 r, uint8 g, uint8 b)\r
-{\r
- palettedbr[index]=r;\r
- palettedbg[index]=g;\r
- palettedbb[index]=b;\r
- if(vidready)\r
- {\r
- vga_setpalette(index,r>>2,g>>2,b>>2);\r
- }\r
-}\r
-\r
-\r
-void FCEUD_GetPalette(uint8 i, uint8 *r, uint8 *g, uint8 *b)\r
-{\r
- *r=palettedbr[i];\r
- *g=palettedbg[i];\r
- *b=palettedbb[i];\r
-}\r
-\r
-static uint32 ScreenLoc;\r
-\r
-int InitVideo(void)\r
-{\r
- vidready=0;\r
- switch(FCEUDvmode)\r
- {\r
- default:\r
- case 1:\r
- case 2:\r
- case 3:\r
- case 6:\r
- case 8:\r
- vga_setmode(G320x200x256);\r
- vidready|=1;\r
- ScreenLoc=0xa0000;\r
- TweakVGA(FCEUDvmode);\r
- SetBorder();\r
- DOSMemSet(ScreenLoc, 128, 256*256);\r
- break;\r
- }\r
- vidready|=2;\r
- FlushPalette();\r
- return 1;\r
-}\r
-\r
-void KillVideo(void)\r
-{\r
- if(vidready)\r
- {\r
- vga_setmode(TEXT);\r
- vidready=0;\r
- }\r
-}\r
-void LockConsole(void){}\r
-void UnlockConsole(void){}\r
-void BlitScreen(uint8 *XBuf)\r
-{\r
- uint32 dest;\r
- int tlines;\r
-\r
- if(eoptions&4 && !NoWaiting)\r
- vga_waitretrace();\r
-\r
- tlines=erendline-srendline+1;\r
-\r
- dest=ScreenLoc;\r
-\r
- switch(FCEUDvmode)\r
- {\r
- case 1:dest+=(((240-tlines)>>1)<<8);break;\r
- case 2:\r
- case 3:dest+=(((256-tlines)>>1)<<8);break;\r
- case 4:\r
- case 5:dest+=(((240-tlines)>>1)*640+((640-512)>>1));break;\r
- case 8:\r
- case 6:if(tlines>224) tlines=224;dest+=(((224-tlines)>>1)<<8);break;\r
- }\r
- \r
- XBuf+=(srendline<<8)+(srendline<<4);\r
- \r
- _farsetsel(_dos_ds);\r
- if(eoptions&DO_CLIPSIDES)\r
- {\r
- asm volatile( \r
- "agoop1:\n\t"\r
- "movl $30,%%eax\n\t"\r
- "agoop2:\n\t"\r
- "movl (%%esi),%%edx\n\t"\r
- "movl 4(%%esi),%%ecx\n\t"\r
- ".byte 0x64 \n\t"\r
- "movl %%edx,(%%edi)\n\t"\r
- ".byte 0x64 \n\t"\r
- "movl %%ecx,4(%%edi)\n\t"\r
- "addl $8,%%esi\n\t"\r
- "addl $8,%%edi\n\t"\r
- "decl %%eax\n\t"\r
- "jne agoop2\n\t"\r
- "addl $32,%%esi\n\t"\r
- "addl $16,%%edi\n\t"\r
- "decb %%bl\n\t"\r
- "jne agoop1\n\t"\r
- :\r
- : "S" (XBuf+8), "D" (dest+8), "b" (tlines)\r
- : "%eax","%cc","%edx","%ecx" );\r
- }\r
- else\r
- {\r
- asm volatile( \r
- "goop1:\n\t"\r
- "movl $32,%%eax\n\t"\r
- "goop2:\n\t"\r
- "movl (%%esi),%%edx\n\t"\r
- "movl 4(%%esi),%%ecx\n\t"\r
- ".byte 0x64 \n\t"\r
- "movl %%edx,(%%edi)\n\t"\r
- ".byte 0x64 \n\t"\r
- "movl %%ecx,4(%%edi)\n\t"\r
- "addl $8,%%esi\n\t"\r
- "addl $8,%%edi\n\t"\r
- "decl %%eax\n\t"\r
- "jne goop2\n\t"\r
- "addl $16,%%esi\n\t"\r
- "decb %%bl\n\t"\r
- "jne goop1\n\t"\r
- :\r
- : "S" (XBuf), "D" (dest), "b" (tlines)\r
- : "%eax","%cc","%edx","%ecx" );\r
- }\r
-}\r
-\r
-\r