diff --git a/zsnes/src/cfgload.asm b/zsnes/src/cfgload.asm index 64adaac2..be33fe9a 100644 --- a/zsnes/src/cfgload.asm +++ b/zsnes/src/cfgload.asm @@ -619,7 +619,7 @@ db 'VideoModeLin = %U',13,10 db '',13,10 %endif %ifdef __MSDOS__ -db '; Video Mode, 0 - 16',13,10 +db '; Video Mode, 0 - 18',13,10 db '; 0 = 256x224x8B (MODEQ) 1 = 256x240x8B (MODEQ)',13,10 db '; 2 = 256x256x8B (MODEQ) 3 = 320x224x8B (MODEX)',13,10 db '; 4 = 320x240x8B (MODEX) 5 = 320x256x8B (MODEX)',13,10 @@ -628,7 +628,8 @@ db '; 8 = 320x240x16B (VESA2) 9 = 320x480x8B (VESA2)',13,10 db '; 10 = 320x480x16B (VESA2) 11 = 512x384x8B (VESA2)',13,10 db '; 12 = 512x384x16B (VESA2) 13 = 640x400x8B (VESA2)',13,10 db '; 14 = 640x400x16B (VESA2) 15 = 640x480x8B (VESA2)',13,10 -db '; 16 = 640x480x16B (VESA2)',13,10 +db '; 16 = 640x480x16B (VESA2) 17 = 800x600x8B (VESA2)',13,10 +db '; 18 = 800x600x16B (VESA2)',13,10 db '',13,10 db 'VideoModeDos = %U',13,10 db '',13,10 @@ -638,9 +639,9 @@ db '',13,10 db 'Sound = %V',13,10 db '',13,10 db '; Sound Sampling Rate',13,10 -db '; 0 = 8000Hz, 1 = 11025Hz, 2 = 22050Hz, 3 = 44100Hz',13,10 -db '; 4 = 16000Hz, 5 = 32000Hz',13,10 -db '',13,10 +db '; 0 = 8,000 Hz, 1 = 11,025 Hz, 2 = 22,050 Hz',13,10 +db '; 3 = 44,100 Hz, 4 = 16,000 Hz, 5 = 32,000 Hz',13,10 +db '',13,10 db 'SoundRate = %W',13,10 db '',13,10 db '; Stereo (0 = off, 1 = on)',13,10 diff --git a/zsnes/src/dos/dosintrf.asm b/zsnes/src/dos/dosintrf.asm index 2a326bcf..fdb80a3a 100644 --- a/zsnes/src/dos/dosintrf.asm +++ b/zsnes/src/dos/dosintrf.asm @@ -1014,7 +1014,7 @@ NEWSYM ClearScreen SECTION .data ; Total Number of Video Modes -NEWSYM NumVideoModes, dd 17 +NEWSYM NumVideoModes, dd 19 ; GUI Video Mode Names - Make sure that all names are of the same length ; and end with a NULL terminator @@ -1036,26 +1036,29 @@ db '640X400X8B VESA2',0 ; 13 db '640X400X16B VESA2',0 ; 14 db '640X480X8B VESA2',0 ; 15 db '640X480X16B VESA2',0 ; 16 +db '800X600X8B VESA2',0 ; 17 +db '800X600X16B VESA2',0 ; 18 db ' ',0 ; Video Mode Feature Availability (1 = Available, 0 = Not Available) ; Left side starts with Video Mode 0 -NEWSYM GUI16VID, db 0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0 ; 16-bit mode -NEWSYM GUINGVID, db 1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0 ; New Graphics Mode Available -NEWSYM GUISLVID, db 0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,1,0 ; Scanlines -NEWSYM GUIINVID, db 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0 ; Interpolation -NEWSYM GUIEAVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0 ; Eagle -NEWSYM GUIIEVID, db 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,0 ; (Interp | Eagle) -NEWSYM GUIFSVID, db 0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,1,0 ; Full Screen -NEWSYM GUISSVID, db 0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,0 ; Small Screen -NEWSYM GUITBVID, db 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0 ; Triple Buffering -NEWSYM GUIHSVID, db 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0 ; Half/Quarter Scanlines -NEWSYM GUI2xVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 ; 2xSaI/Super Eagle Engines -NEWSYM GUIWFVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; If Windows Full Screen -NEWSYM GUII2VID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Super 2xSAI Engine -NEWSYM GUIM7VID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0 ; Hi-Resolution Mode 7 -NEWSYM GUIBIFIL, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Bilinear Filtering -NEWSYM GUITBWVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Triple Buffering (Win) +NEWSYM GUI16VID, db 0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0 ; 16-bit mode +NEWSYM GUINGVID, db 1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,1,1,1,0 ; New Graphics Mode Available +NEWSYM GUISLVID, db 0,0,1,0,0,1,1,0,0,1,1,0,0,0,0,1,1,1,1,0 ; Scanlines +NEWSYM GUIINVID, db 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0 ; Interpolation +NEWSYM GUIEAVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0 ; Eagle +NEWSYM GUIIEVID, db 0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,0,0,0 ; (Interp | Eagle) +NEWSYM GUIFSVID, db 0,0,0,0,0,0,0,1,1,1,1,0,0,1,1,1,1,1,1,0 ; Full Screen +NEWSYM GUIWSVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0 ; (Full Scr. | Wide Scr.) +NEWSYM GUISSVID, db 0,0,0,0,0,0,1,0,0,0,0,1,1,1,1,1,1,1,1,0 ; Small Screen +NEWSYM GUITBVID, db 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0 ; Triple Buffering +NEWSYM GUIHSVID, db 0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0 ; Half/Quarter Scanlines +NEWSYM GUI2xVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0 ; 2xSaI/Super Eagle Engines +NEWSYM GUIWFVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; If Windows Full Screen +NEWSYM GUII2VID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Super 2xSAI Engine +NEWSYM GUIM7VID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0 ; Hi-Resolution Mode 7 +NEWSYM GUIBIFIL, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Bilinear Filtering +NEWSYM GUITBWVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Triple Buffering (Win) SECTION .text ; **************************** diff --git a/zsnes/src/dos/initvid.asm b/zsnes/src/dos/initvid.asm index 11c13b06..70f1b9da 100644 --- a/zsnes/src/dos/initvid.asm +++ b/zsnes/src/dos/initvid.asm @@ -89,6 +89,10 @@ NEWSYM dosinitvideo je near .initvesa2640x480x8 cmp byte[cvidmode],16 je near .initvesa2640x480x16 + cmp byte[cvidmode],17 + je near .initvesa2800x600x8 + cmp byte[cvidmode],18 + je near .initvesa2800x600x16 ret %include "dos/vga.inc" @@ -299,6 +303,66 @@ NEWSYM dosinitvideo pop es ret +;******************************************************* +; InitVESA2 800x600x8 Set up Linear 800x600x8b +;******************************************************* + +.initvesa2800x600x8 + mov byte[res640],1 + mov byte[res480],1 + mov word[vesa2_x],800 + mov word[vesa2_y],600 + mov byte[vesa2_bits],8 + call InitVesa2 + cmp byte[videotroub],1 + jne .notrouble11 + ret +.notrouble11 + call makepal + ; clear screen (800*600 bytes) + push es + mov ax,[vesa2selec] + mov es,ax + mov edi,0 + mov ecx,800*600 +.looph2 + mov byte[es:edi],0 + inc edi + dec ecx + jnz .looph2 + pop es + ret + +;******************************************************* +; InitVESA2 800x600x16 Set up Linear 800x600x16b +;******************************************************* + +.initvesa2800x600x16 + mov byte[res640],1 + mov byte[res480],1 + mov byte[cbitmode],1 + mov word[vesa2_x],800 + mov word[vesa2_y],600 + mov byte[vesa2_bits],16 + call InitVesa2 + cmp byte[videotroub],1 + jne .notrouble12 + ret +.notrouble12 + ; clear screen (800*600*2 bytes) + push es + mov ax,[vesa2selec] + mov es,ax + mov edi,0 + mov ecx,800*600*2 +.looph3 + mov byte[es:edi],0 + inc edi + dec ecx + jnz .looph3 + pop es + ret + ;******************************************************* ; InitVESA2 320x480x8 Set up Linear 320x480x8b ;******************************************************* diff --git a/zsnes/src/dos/zloader.c b/zsnes/src/dos/zloader.c index baae777d..38c10324 100644 --- a/zsnes/src/dos/zloader.c +++ b/zsnes/src/dos/zloader.c @@ -261,7 +261,9 @@ int pccmdline(void) } case 'n': { - scanlines=1; + if(!hasroom) return 4; + scanlines=my_atoi(argv[p+1]); + p++; break; } case 's': diff --git a/zsnes/src/gui/gui.asm b/zsnes/src/gui/gui.asm index 73d2830f..ed0e68d8 100644 --- a/zsnes/src/gui/gui.asm +++ b/zsnes/src/gui/gui.asm @@ -135,7 +135,7 @@ EXTSYM NumVideoModes EXTSYM cfgvolume, MusicVol, DSPMem EXTSYM NumInputDevices,GUIInputNames EXTSYM GUIVideoModeNames -EXTSYM GUISLVID,GUIINVID,GUIEAVID,GUIIEVID,GUIFSVID +EXTSYM GUISLVID,GUIINVID,GUIEAVID,GUIIEVID,GUIFSVID,GUIWSVID EXTSYM GUISSVID,GUITBVID,GUIHSVID,GUI2xVID,GUII2VID,GUIM7VID EXTSYM cfgsoundon,cfgSoundQuality,cfgStereoSound EXTSYM convertnum,converthex diff --git a/zsnes/src/gui/guiwindp.inc b/zsnes/src/gui/guiwindp.inc index 177873c6..7d646356 100644 --- a/zsnes/src/gui/guiwindp.inc +++ b/zsnes/src/gui/guiwindp.inc @@ -1714,7 +1714,12 @@ DisplayGUIVideo: xor eax,eax mov al,[cvidmode] cmp byte[GUIFSVID+eax],0 - je .notext5 + je near .notext5 + cmp byte[GUIWSVID+eax],0 + je .notext4a + GUIOuttextwin2u 5,26,93,GUIVideoText5b,1 + jmp .notext5 +.notext4a GUIOuttextwin2u 5,26,93,GUIVideoText5,1 .notext5 xor eax,eax @@ -1810,7 +1815,12 @@ DisplayGUIVideo: xor eax,eax mov al,[cvidmode] cmp byte[GUIFSVID+eax],0 - je .notext5b + je near .notext5b + cmp byte[GUIWSVID+eax],0 + je .notext4ba + GUIOuttextwin2 5,25,92,GUIVideoText5b + jmp .notext5b +.notext4ba GUIOuttextwin2 5,25,92,GUIVideoText5 .notext5b xor eax,eax @@ -2126,6 +2136,7 @@ GUIVideoTextbf db 'BILINEAR FILTER',0 GUIVideoText3 db 'INTERPOLATION',0 ; -y GUIVideoText4 db 'EAGLE ENGINE',0 ; -y GUIVideoText5 db 'FULL SCREEN',0 ; -c +GUIVideoText5b db 'WIDE SCREEN',0 ; -c GUIVideoText6 db 'SMALL SCREEN',0 ; -c GUIVideoText7 db 'TRIPLE BUFFERING',0 ; -c GUIVideoText8b db 'HI-RESOLUTION MODE7',0 ; -c diff --git a/zsnes/src/linux/sdlintrf.asm b/zsnes/src/linux/sdlintrf.asm index af79d05a..5bbebd49 100644 --- a/zsnes/src/linux/sdlintrf.asm +++ b/zsnes/src/linux/sdlintrf.asm @@ -947,6 +947,7 @@ NEWSYM GUII2VID, db 0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Interpolation(w) NEWSYM GUIEAVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Eagle NEWSYM GUIIEVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; (Interp | Eagle) NEWSYM GUIFSVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Full Screen +NEWSYM GUIWSVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; (Full Scr. | Wide Scr.) NEWSYM GUISSVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Small Screen NEWSYM GUITBVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Triple Buffering NEWSYM GUIHSVID, db 0,0,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1 ; Half/Quarter Scanlines diff --git a/zsnes/src/ui.asm b/zsnes/src/ui.asm index 08bb7902..60abcfec 100644 --- a/zsnes/src/ui.asm +++ b/zsnes/src/ui.asm @@ -1429,35 +1429,35 @@ SECTION .data .noparams db 'Usage : ZSNES [-d,-f #, ... ] ',13,10 db ' Eg : ZSNES -s -r 2 game.smc',13,10,13,10 %endif - db ' -0 Disable Color 0 modification in 256 color modes',13,10 + db ' -0 Disable Color 0 modification in 8-bit modes',13,10 db ' -1 #/-2 # Select Player 1/2 Input :',13,10 db ' 0 = None 1 = Keyboard 2 = Joystick 3 = Gamepad',13,10 db ' 4 = 4Button 5 = 6Button 6 = Sidewinder ',13,10 db ' -7 Disable SPC700 speedhack',13,10 db ' -8 Force 8-bit sound',13,10 db ' -9 Off by 1 line fix',13,10 - db ' -a Turn on auto frame skip',13,10 + db ' -a Enable automatic frame rate',13,10 %ifdef __LINUX__ - db ' -cs Scale to fit screen (320x240 VESA2/640x480 VESA2)',13,10 + db ' -cs Enable full/wide screen (when available)',13,10 %else - db ' -c Scale to fit screen (320x240 VESA2/640x480 VESA2)',13,10 + db ' -c Enable full screen (when available)',13,10 %endif db ' -cb Remove Background Color in 256 color video modes',13,10 - db ' -cc No image scale and center image in screen (640x480 only)',13,10 + db ' -cc Enable small screen (when available)',13,10 ; debugger not available in linux version ; because of bios interrupt code %ifndef __LINUX__ - db ' -d Start with debugger',13,10 + db ' -d Start with debugger enabled',13,10 %endif db ' -dd Disable sound DSP emulation',13,10 %ifndef __LINUX__ - db ' -e Skip enter key press at the beginning',13,10 + ;db ' -e Skip enter key press at the beginning',13,10 %endif - db ' -f # Turn on frame skip [0..9]',13,10 - db ' -g # Set Gamma Correction [0...15, 0 = 1.0, 15 = 2.0]',13,10 + db ' -f # Enable fixed frame rate [0...9]',13,10 %ifndef __LINUX__ - db ' - Only works properly in 256 color video modes',13,10 + db ' -g # Specify gamma correction value [0...15]',13,10 + db ' (Only works properly in 8-bit modes)',13,10 %endif db ' -h Force HiROM',13,10 db ' -i Uninterleave ROM Image',13,10 @@ -1466,13 +1466,18 @@ SECTION .data db 'Press any key to continue.',0 .noparms2 db 13,' -l Force LoROM ',13,10 db ' -m Disable GUI',13,10 - db ' -n Turn scanlines on (640x480 only)',13,10 +%ifdef __LINUX__ + db ' -n Enable full scanlines (when available)',13,10 +%else + db ' -n # Enable scanlines (when available)',13,10 + db ' Where # is: 1 = full, 2 = 25%, 3 = 50%',13,10 +%endif %ifdef __LINUX__ db ' -of Enable FPU copy ',13,10 %else ; db ' -o Enable FPU copy ',13,10 %endif - db ' -om Enable MMX copy',13,10 + db ' -om Enable MMX support (when available)',13,10 db ' -p # Percentage of instructions to execute [50..120]',13,10 db ' -r # Set Sampling Sound Blaster Sampling Rate & Bit :',13,10 db ' 0 = 8000Hz 1 = 11025Hz 2 = 22050Hz 3 = 44100Hz',13,10 @@ -1496,15 +1501,16 @@ SECTION .data db ' 10 = 320x480x16B (VESA2) 11 = 512x384x8B (VESA2)',13,10 db ' 12 = 512x384x16B (VESA2) 13 = 640x400x8B (VESA2)',13,10 db ' 14 = 640x400x16B (VESA2) 15 = 640x480x8B (VESA2)',13,10 - db ' 16 = 640x480x16B (VESA2)',13,10 + db ' 16 = 640x480x16B (VESA2) 17 = 800x600x8B (VESA2)',13,10 + db ' 18 = 800x600x16B (VESA2)',13,10 %endif - db ' -w Enable VSync (disables Triple Buffering)',13,10 + db ' -w Enable vsync (disables triple buffering)',13,10 db 'Press any key to continue.',0 .noparms3 db 13,' -y Enable EAGLE (640x480x8B only) or Interpolation (640x480x16B only)',13,10 - db ' -z Enable Stereo Sound',13,10 %ifdef __MSDOS__ - db ' -3 Enable Triple Buffering (disables VSync)',13,10 + db ' -3 Enable triple buffering (disables vsync)',13,10 %endif + db ' -z Enable Stereo Sound',13,10 db '',13,10 db ' File Formats Supported by GUI : .SMC,.SFC,.SWC,.FIG,.058,.078,.1,.USA,.JAP',13,10 %ifdef __MSDOS__ diff --git a/zsnes/src/video/copyvid.inc b/zsnes/src/video/copyvid.inc index c1c99375..384a0a92 100644 --- a/zsnes/src/video/copyvid.inc +++ b/zsnes/src/video/copyvid.inc @@ -226,11 +226,11 @@ PreTripleBuffer: SECTION .data ; Please don't break this again. :) -VidModeSize dd 0,0,0,0,0,0,0,320*240,320*240*2,320*480,320*480*2 - dd 512*384,512*384*2,640*400,640*400*2,640*480,640*480*2 -VidModeLine dd 0,0,0,0,0,0,0,240,240,480,480,384,384,400,400,480,480 +VidModeSize dd 0,0,0,0,0,0,0,320*240,320*240*2,320*480,320*480*2,512*384 + dd 512*384*2,640*400,640*400*2,640*480,640*480*2,800*600,800*600*2 +VidModeLine dd 0,0,0,0,0,0,0,240,240,480,480,384,384,400,400,480,480,600,600 NEWSYM VidStartDraw, dd 0 -VidModeComp db 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1 +VidModeComp db 0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1 CVidStartAd db 0 ApplyStart db 4 @@ -298,6 +298,10 @@ ScreenShow: je near copyvesa2640x480x8b cmp byte[cvidmode],16 je near copyvesa2640x480x16b + cmp byte[cvidmode],17 + je near copyvesa2800x600x8b + cmp byte[cvidmode],18 + je near copyvesa2800x600x16b cmp byte[curblank],40h je .startcopy inc byte[curfps2] @@ -349,6 +353,10 @@ ScreenShowGUI: je near copyvesa2640x480x8bgui cmp byte[cvidmode],16 je near copyvesa2640x480x16bgui + cmp byte[cvidmode],17 + je near copyvesa2800x600x8b + cmp byte[cvidmode],18 + je near copyvesa2800x600x16b jmp copymodeq256 %endif @@ -987,7 +995,7 @@ NEWSYM copyvesa2320x240x8b mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] - mov edi,32 + mov edi,320+32 cmp word[resolutn],224 jne .res239 add edi,8*320 @@ -1067,7 +1075,7 @@ NEWSYM copyvesa2320x480x8b mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] - mov edi,32 + mov edi,320*2+32 cmp word[resolutn],224 jne .res239 add edi,8*320 @@ -1270,6 +1278,290 @@ NEWSYM copyvesa2320x480x8b ; jmp .returnloop +;******************************************************* +; Copy VESA2 800x600x8b Copies buffer to 800x600x8bVBE2 +;******************************************************* + +NEWSYM copyvesa2800x600x8b + cmp byte[curblank],40h + jne .startcopy + ret + +.startcopy + push es + mov ax,[vesa2selec] + mov es,ax + mov esi,[vidbuffer] + mov edi,60*800+144 + cmp word[resolutn],224 + jne .res239 + add edi,8*800 +.res239 + add edi,[VidStartDraw] + add esi,16+256+16+16 + xor eax,eax + mov dl,[resolutn] + dec dl + dec dl + cmp byte[ScreenScale],1 + je near .fullscreen + cmp byte[smallscreenon],1 + je near .smallscreen + + cmp byte[scanlines],1 + je .loopa2 +.loopa + mov ecx,256/2 + call .loopa3 + sub esi,256 + add edi,144+144 + mov ecx,256/2 + call .loopa3 + add esi,16+16 + add edi,144+144 + dec dl + jnz .loopa + jmp .done +.loopa2 + mov ecx,256/2 + call .loopa3 + add esi,16+16 + add edi,144+800+144 + dec dl + jnz .loopa2 + jmp .done +.loopa3 + mov al,[esi] + mov bl,[esi+1] + mov ah,al + mov bh,bl + mov [es:edi],ax + mov [es:edi+2],bx + add esi,byte 2 + add edi,byte 4 + dec ecx + jnz .loopa3 + ret + +.smallscreen + add edi,120*800+128 + cmp byte[MMXSupport],1 + je .ssloopb +.ssloopa + mov ecx,256/4 + rep movsd + add esi,16+16 + add edi,272+272 + dec dl + jnz .ssloopa + jmp .done +.ssloopb + mov ecx,256/16 + MMXStuff + add esi,16+16 + add edi,272+272 + dec dl + jnz .ssloopb + jmp .done + +.fullscreen + sub edi,128 + cmp byte[scanlines],1 + je .fsloopa2 +.fsloopa + mov ecx,256/4 + call .fsloopb + sub esi,256 + add edi,16+16 + mov ecx,256/4 + call .fsloopb + add esi,16+16 + add edi,16+16 + dec dl + jnz .fsloopa + jmp .done +.fsloopa2 + mov ecx,256/4 + call .fsloopb + add esi,16+16 + add edi,16+800+16 + dec dl + jnz .fsloopa2 + jmp .done +.fsloopb + push ecx + push edx + mov al,[esi] + mov bl,[esi+1] + mov cl,[esi+2] + mov dl,[esi+3] + mov ah,al + mov bh,bl + mov ch,cl + mov dh,dl + mov [es:edi],ax + mov [es:edi+2],ax + mov [es:edi+4],bx + mov [es:edi+6],cx + mov [es:edi+8],cx + mov [es:edi+10],dx + pop edx + pop ecx + add esi,byte 4 + add edi,byte 8+4 + dec ecx + jnz .fsloopb + ret + +.done + pop es + ret + + +;********************************************************* +; Copy VESA2 800x600x16b Copies buffer to 800x600x16bVBE2 +;********************************************************* + +NEWSYM copyvesa2800x600x16b + cmp byte[curblank],40h + jne .startcopy + ret + +.startcopy + push es + mov ax,[vesa2selec] + mov es,ax + mov esi,[vidbuffer] + mov edi,60*800*2+144*2 + cmp word[resolutn],224 + jne .res239 + add edi,8*800*2 +.res239 + add edi,[VidStartDraw] + add esi,16*2+256*2+16*2+16*2 + xor eax,eax + mov dl,[resolutn] + dec dl + dec dl + cmp byte[ScreenScale],1 + je near .fullscreen + cmp byte[smallscreenon],1 + je near .smallscreen + + cmp byte[scanlines],1 + je .loopa2 +.loopa + mov ecx,256/2 + call .loopa3 + sub esi,256*2 + add edi,144*2+144*2 + mov ecx,256/2 + call .loopa3 + add esi,16*2+16*2 + add edi,144*2+144*2 + dec dl + jnz .loopa + jmp .done +.loopa2 + mov ecx,256/2 + call .loopa3 + add esi,16*2+16*2 + add edi,144*2+800*2+144*2 + dec dl + jnz .loopa2 + jmp .done +.loopa3 + mov ax,[esi] + mov bx,[esi+2] + mov [es:edi],ax + mov [es:edi+2],ax + mov [es:edi+4],bx + mov [es:edi+6],bx + add esi,byte 4 + add edi,byte 8 + dec ecx + jnz .loopa3 + ret + +.smallscreen + add edi,120*800*2+128*2 + cmp byte[MMXSupport],1 + je .ssloopb +.ssloopa + mov ecx,256/4*2 + rep movsd + add esi,16*2+16*2 + add edi,272*2+272*2 + dec dl + jnz .ssloopa + jmp .done +.ssloopb + mov ecx,256/16*2 + MMXStuff + add esi,16*2+16*2 + add edi,272*2+272*2 + dec dl + jnz .ssloopb + jmp .done + +.fullscreen + sub edi,128*2 + cmp byte[scanlines],1 + je .fsloopa2 +.fsloopa + mov ecx,256/4 + call .fsloopb + sub esi,256*2 + add edi,16*2+16*2 + mov ecx,256/4 + call .fsloopb + add esi,16*2+16*2 + add edi,16*2+16*2 + dec dl + jnz .fsloopa + jmp .done +.fsloopa2 + mov ecx,256/4 + call .fsloopb + add esi,16*2+16*2 + add edi,16*2+800*2+16*2 + dec dl + jnz .fsloopa2 + jmp .done +.fsloopb + push ecx + push edx + mov ax,[esi] + mov bx,[esi+2] + mov cx,[esi+4] + mov dx,[esi+6] + shr eax,8 + shr ebx,8 + shr ecx,8 + shr edx,8 + mov ax,[esi] + mov bx,[esi+2] + mov cx,[esi+4] + mov dx,[esi+6] + mov [es:edi],eax + mov [es:edi+4],eax + mov [es:edi+8],ebx + mov [es:edi+12],ecx + mov [es:edi+16],ecx + mov [es:edi+20],edx + pop edx + pop ecx + add esi,byte 8 + add edi,byte 16+8 + dec ecx + jnz .fsloopb + ret + +.done + pop es + ret + + ;******************************************************* ; Copy VESA2 640x400x8b Copies buffer to 640x400x8bVBE2 ;******************************************************* @@ -1284,7 +1576,7 @@ NEWSYM copyvesa2640x400x8b mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] - mov edi,20*640+64 + mov edi,640+20*640+64 cmp word[resolutn],224 jne .res239 add edi,12*640 @@ -1401,7 +1693,7 @@ NEWSYM copyvesa2640x400x16b mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] - mov edi,20*640*2+64*2 + mov edi,640*2+20*640*2+64*2 cmp word[resolutn],224 jne .res239 add edi,12*640*2 @@ -2662,7 +2954,7 @@ NEWSYM copyvesa2320x240x16b mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] - mov edi,32*2 + mov edi,320*2+32*2 cmp word[resolutn],224 jne .res239 add edi,8*320*2 @@ -3053,7 +3345,7 @@ NEWSYM copyvesa2320x480x16b mov ax,[vesa2selec] mov es,ax mov esi,[vidbuffer] - mov edi,32*2 + mov edi,320*2*2+32*2 cmp word[resolutn],224 jne .res239 add edi,8*320*2 @@ -6355,6 +6647,10 @@ NEWSYM DOSClearScreen je near cscopyvesa2640x480x8b cmp byte[cvidmode],16 je near cscopyvesa2640x480x16b + cmp byte[cvidmode],17 + je near cscopyvesa2800x600x8b + cmp byte[cvidmode],18 + je near cscopyvesa2800x600x16b %endif ret @@ -6456,6 +6752,36 @@ NEWSYM cscopyvesa2640x480x16b pop es ret +NEWSYM cscopyvesa2800x600x8b + push es + mov ax,[vesa2selec] + mov es,ax + mov edi,[VidStartDraw] + mov ecx,800*600 + TripleBufferClear +.loopb + mov byte[es:edi],0 + inc edi + dec ecx + jnz .loopb + pop es + ret + +NEWSYM cscopyvesa2800x600x16b + push es + mov ax,[vesa2selec] + mov es,ax + mov edi,[VidStartDraw] + mov ecx,800*600*2 + TripleBufferClear +.loopb + mov byte[es:edi],0 + inc edi + dec ecx + jnz .loopb + pop es + ret + NEWSYM cscopyvesa2640x400x8b push es mov ax,[vesa2selec] diff --git a/zsnes/src/win/winintrf.asm b/zsnes/src/win/winintrf.asm index 0ff345fd..ab9e0887 100644 --- a/zsnes/src/win/winintrf.asm +++ b/zsnes/src/win/winintrf.asm @@ -1246,6 +1246,7 @@ NEWSYM GUII2VID, db 0,0,0,1,0,1,1,1,0,0,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,0,1,1,0,1, NEWSYM GUIEAVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Eagle NEWSYM GUIIEVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; (Interp | Eagle) NEWSYM GUIFSVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Full Screen +NEWSYM GUIWSVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; (Full Scr. | Wide Scr.) NEWSYM GUISSVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Small Screen NEWSYM GUITBVID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Triple Buffering NEWSYM GUIHSVID, db 0,0,0,1,0,1,1,1,0,0,1,0,1,0,1,1,0,1,0,1,1,0,1,0,1,0,1,1,0,1,0,1,1 ; Half/Quarter Scanlines