diff --git a/zsnes/src/cfgload.asm b/zsnes/src/cfgload.asm index 6727a482..857eb1ce 100644 --- a/zsnes/src/cfgload.asm +++ b/zsnes/src/cfgload.asm @@ -621,12 +621,13 @@ db '',13,10 %endif %ifdef __MSDOS__ db '; Video Mode, 0 - 10',13,10 -db '; 0 = 256x224x8B (MODEQ) 1 = 256x256x8B (MODEQ)',13,10 -db '; 2 = 320x240x8B (MODEX) 3 = 640x480x16B (VESA1)',13,10 -db '; 4 = 320x240x8B (VESA2) 5 = 320x240x16B (VESA2)',13,10 -db '; 6 = 320x480x8B (VESA2) 7 = 320x480x16B (VESA2)',13,10 -db '; 8 = 512x384x8B (VESA2) 9 = 512x384x16B (VESA2)',13,10 -db '; 10 = 640x480x8B (VESA2) 11 = 640x480x16B (VESA2)',13,10 +db '; 0 = 256x224x8B (MODEQ) 1 = 256x240x8B (MODEQ)',13,10 +db '; 2 = 256x256x8B (MODEQ) 3 = 320x240x8B (MODEX)',13,10 +db '; 4 = 640x480x16B (VESA1) 5 = 320x240x8B (VESA2)',13,10 +db '; 6 = 320x240x16B (VESA2) 7 = 320x480x8B (VESA2)',13,10 +db '; 8 = 320x480x16B (VESA2) 9 = 512x384x8B (VESA2)',13,10 +db '; 10 = 512x384x16B (VESA2) 11 = 640x480x8B (VESA2)',13,10 +db '; 12 = 640x480x16B (VESA2)',13,10 db '',13,10 db 'VideoModeDos = %U',13,10 db '',13,10 diff --git a/zsnes/src/dos/dosintrf.asm b/zsnes/src/dos/dosintrf.asm index 37334a72..91992580 100644 --- a/zsnes/src/dos/dosintrf.asm +++ b/zsnes/src/dos/dosintrf.asm @@ -1013,43 +1013,44 @@ NEWSYM ClearScreen SECTION .data ; Total Number of Video Modes -NEWSYM NumVideoModes, dd 12 +NEWSYM NumVideoModes, dd 13 ; GUI Video Mode Names - Make sure that all names are of the same length ; and end with a NULL terminator NEWSYM GUIVideoModeNames db '256X224X8B MODEQ',0 ; 0 -db '256X256X8B MODEQ',0 ; 1 -db '320X240X8B MODEX',0 ; 2 -db '640X480X16B VESA1',0 ; 3 -db '320X240X8B VESA2',0 ; 4 -db '320X240X16B VESA2',0 ; 5 -db '320X480X8B VESA2',0 ; 6 -db '320X480X16B VESA2',0 ; 7 -db '512X384X8B VESA2',0 ; 8 -db '512X384X16B VESA2',0 ; 9 -db '640X480X8B VESA2',0 ; 10 -db '640X480X16B VESA2',0 ; 11 +db '256X240X8B MODEQ',0 ; 1 +db '256X256X8B MODEQ',0 ; 2 +db '320X240X8B MODEX',0 ; 3 +db '640X480X16B VESA1',0 ; 4 +db '320X240X8B VESA2',0 ; 5 +db '320X240X16B VESA2',0 ; 6 +db '320X480X8B VESA2',0 ; 7 +db '320X480X16B VESA2',0 ; 8 +db '512X384X8B VESA2',0 ; 9 +db '512X384X16B VESA2',0 ; 10 +db '640X480X8B VESA2',0 ; 11 +db '640X480X16B VESA2',0 ; 12 db ' ',0 ; Video Mode Feature Availability (1 = Available, 0 = Not Available) ; Left side starts with Video Mode 0 -NEWSYM GUI16VID, db 0,0,0,1,0,1,0,1,0,1,0,1,0 ; 16-bit mode -NEWSYM GUINGVID, db 1,1,1,1,1,1,1,0,1,1,1,1,0 ; New Graphics Mode Available -NEWSYM GUISLVID, db 0,0,0,1,0,0,1,1,0,0,1,1,0 ; Scanlines -NEWSYM GUIINVID, db 0,0,0,0,0,0,0,0,0,0,0,1,0 ; Interpolation -NEWSYM GUIEAVID, db 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,0,0,1,1,0 ; (Interp | Eagle) -NEWSYM GUIFSVID, db 0,0,0,0,1,1,0,0,0,0,1,1,0 ; Full Screen -NEWSYM GUISSVID, db 0,0,0,1,0,0,0,0,0,0,1,1,0 ; Small Screen -NEWSYM GUITBVID, db 0,0,0,0,1,1,1,1,1,1,1,1,0 ; Triple Buffering -NEWSYM GUIHSVID, db 0,0,0,0,0,0,0,1,0,0,0,1,0 ; Half/Quarter Scanlines -NEWSYM GUI2xVID, db 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 ; If Windows Full Screen -NEWSYM GUII2VID, db 0,0,0,0,0,0,0,0,0,0,0,0,0 ; Interpolation -NEWSYM GUIM7VID, db 0,0,0,0,0,0,0,0,0,0,0,1,0 ; Interpolation -NEWSYM GUIBIFIL, db 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 ; Triple Buffering (Win) +NEWSYM GUI16VID, db 0,0,0,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,0,1,1,1,1,0 ; New Graphics Mode Available +NEWSYM GUISLVID, db 0,0,0,0,1,0,0,1,1,0,0,1,1,0 ; Scanlines +NEWSYM GUIINVID, db 0,0,0,0,0,0,0,0,0,0,0,0,1,0 ; Interpolation +NEWSYM GUIEAVID, db 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,0,0,0,1,1,0 ; (Interp | Eagle) +NEWSYM GUIFSVID, db 0,0,0,0,0,1,1,0,0,0,0,1,1,0 ; Full Screen +NEWSYM GUISSVID, db 0,0,0,0,1,0,0,0,0,0,0,1,1,0 ; Small Screen +NEWSYM GUITBVID, db 0,0,0,0,0,1,1,1,1,1,1,1,1,0 ; Triple Buffering +NEWSYM GUIHSVID, db 0,0,0,0,0,0,0,0,1,0,0,0,1,0 ; Half/Quarter Scanlines +NEWSYM GUI2xVID, db 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 ; If Windows Full Screen +NEWSYM GUII2VID, db 0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; Interpolation +NEWSYM GUIM7VID, db 0,0,0,0,0,0,0,0,0,0,0,0,1,0 ; Interpolation +NEWSYM GUIBIFIL, db 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 ; Triple Buffering (Win) SECTION .text ; **************************** diff --git a/zsnes/src/dos/initvid.asm b/zsnes/src/dos/initvid.asm index ad6fe127..af3937d6 100644 --- a/zsnes/src/dos/initvid.asm +++ b/zsnes/src/dos/initvid.asm @@ -56,26 +56,28 @@ NEWSYM dosinitvideo cmp byte[cvidmode],0 je near .initmodeq224 cmp byte[cvidmode],1 - je near .initmodeq + je near .initmodeq240 cmp byte[cvidmode],2 - je near .initmodex + je near .initmodeq cmp byte[cvidmode],3 - je near .initvesa12640x480x16 + je near .initmodex cmp byte[cvidmode],4 - je near .initvesa2320x240x8 + je near .initvesa12640x480x16 cmp byte[cvidmode],5 - je near .initvesa2320x240x16 + je near .initvesa2320x240x8 cmp byte[cvidmode],6 - je near .initvesa2320x480x8 + je near .initvesa2320x240x16 cmp byte[cvidmode],7 - je near .initvesa2320x480x16 + je near .initvesa2320x480x8 cmp byte[cvidmode],8 - je near .initvesa2512x384x8 + je near .initvesa2320x480x16 cmp byte[cvidmode],9 - je near .initvesa2512x384x16 + je near .initvesa2512x384x8 cmp byte[cvidmode],10 - je near .initvesa2640x480x8 + je near .initvesa2512x384x16 cmp byte[cvidmode],11 + je near .initvesa2640x480x8 + cmp byte[cvidmode],12 je near .initvesa2640x480x16 ret @@ -492,6 +494,135 @@ NEWSYM dosinitvideo ret +;******************************************************* +; InitModeQ240 Sets up 256x240 chained mode +;******************************************************* + +.initmodeq240 + mov byte[cbitmode],0 + + mov ax,0013h + int 10h + + ; enable writes + mov dx,03d4h + mov ax,0011h + out dx,ax + inc dx + in ax,dx + and ax,007fh + push ax + mov dx,03d4h + mov ax,0011h + out dx,ax + inc dx + pop ax + out dx,ax + + ; tweak regs + mov dx,03c2h + mov ax,00e3h + out dx,ax + + mov dx,03d4h + mov ax,1 + out dx,ax + inc dx + mov ax,003fh + out dx,ax + + mov dx,03d4h + mov ax,2 + out dx,ax + inc dx + mov ax,0040h + out dx,ax + + mov dx,03d4h + mov ax,4 + out dx,ax + inc dx + mov ax,004ah + out dx,ax + + mov dx,03d4h + mov ax,5 + out dx,ax + inc dx + mov ax,009ah + out dx,ax + + mov dx,03d4h + mov ax,6 + out dx,ax + inc dx + mov ax,000dh + out dx,ax + + mov dx,03d4h + mov ax,7 + out dx,ax + inc dx + mov ax,003eh + out dx,ax + + mov dx,03d4h + mov ax,9 + out dx,ax + inc dx + mov ax,0041h + out dx,ax + + mov dx,03d4h + mov ax,0010h + out dx,ax + inc dx + mov ax,00eah + out dx,ax + + mov dx,03d4h + mov ax,0011h + out dx,ax + inc dx + mov ax,00ach + out dx,ax + + mov dx,03d4h + mov ax,0012h + out dx,ax + inc dx + mov ax,00dfh + out dx,ax + + mov dx,03d4h + mov ax,0013h + out dx,ax + inc dx + mov ax,0020h + out dx,ax + + mov dx,03d4h + mov ax,0015h + out dx,ax + inc dx + mov ax,00e7h + out dx,ax + + mov dx,03d4h + mov ax,0016h + out dx,ax + inc dx + mov ax,0006h + out dx,ax + +%ifdef __MSDOS__ + call cscopymodeq +%endif + + call makepal + + ret + ;******************************************************* ; InitVESA2 320x240x8 Set up Linear 320x240x8b ;******************************************************* diff --git a/zsnes/src/dos/zloader.c b/zsnes/src/dos/zloader.c index 25308124..0ef88973 100644 --- a/zsnes/src/dos/zloader.c +++ b/zsnes/src/dos/zloader.c @@ -198,7 +198,7 @@ int pccmdline(void) { if(!hasroom) return 4; cvidmode=my_atoi(argv[p+1]); - if(cvidmode > 11) return 13; + if(cvidmode > 12) return 13; p++; } break; diff --git a/zsnes/src/ui.asm b/zsnes/src/ui.asm index 71ce4c66..055ca326 100644 --- a/zsnes/src/ui.asm +++ b/zsnes/src/ui.asm @@ -1438,12 +1438,13 @@ SECTION .data db ' -u Force PAL timing',13,10 %ifndef __LINUX__ db ' -v # Select Video Mode :',13,10 - db ' 0 = 256x224x8B (MODEQ) 1 = 256x256x8B (MODEQ)',13,10 - db ' 2 = 320x240x8B (MODEX) 3 = 640x480x16B (VESA1)',13,10 - db ' 4 = 320x240x8B (VESA2) 5 = 320x240x16B (VESA2)',13,10 - db ' 6 = 320x480x8B (VESA2) 7 = 320x480x16B (VESA2)',13,10 - db ' 8 = 512x384x8B (VESA2) 9 = 512x384x16B (VESA2)',13,10 - db ' 10 = 640x480x8B (VESA2) 11 = 640x480x16B (VESA2)',13,10 + db ' 0 = 256x224x8B (MODEQ) 1 = 256x240x8B (MODEQ)',13,10 + db ' 2 = 256x256x8B (MODEQ) 3 = 320x240x8B (MODEX)',13,10 + db ' 4 = 640x480x16B (VESA1) 5 = 320x240x8B (VESA2)',13,10 + db ' 6 = 320x240x16B (VESA2) 7 = 320x480x8B (VESA2)',13,10 + db ' 8 = 320x480x16B (VESA2) 9 = 512x384x8B (VESA2)',13,10 + db ' 10 = 512x384x16B (VESA2) 11 = 640x480x8B (VESA2)',13,10 + db ' 12 = 640x480x16B (VESA2)',13,10 %endif db ' -w Enable VSync',13,10 db 'Press any key to continue.',0 diff --git a/zsnes/src/vcache.asm b/zsnes/src/vcache.asm index 405383a1..10c13aec 100644 --- a/zsnes/src/vcache.asm +++ b/zsnes/src/vcache.asm @@ -270,9 +270,9 @@ NEWSYM cachevideo je .nohires cmp byte[scanlines],1 je .nohires - cmp byte[cvidmode],6 + cmp byte[cvidmode],7 je .yeshires - cmp byte[cvidmode],10 + cmp byte[cvidmode],11 jne .nohires .yeshires mov byte[Mode7HiRes],1 diff --git a/zsnes/src/video/copyvid.inc b/zsnes/src/video/copyvid.inc index 347d58ed..3548adc3 100644 --- a/zsnes/src/video/copyvid.inc +++ b/zsnes/src/video/copyvid.inc @@ -262,27 +262,29 @@ ScreenShow: cmp byte[cvidmode],0 je near copymodeq224 cmp byte[cvidmode],1 + je near copymodeq240 + cmp byte[cvidmode],2 je near copymodeq .debug - cmp byte[cvidmode],2 - je near copymodex cmp byte[cvidmode],3 - je near copyvesa12640x480x16b + je near copymodex cmp byte[cvidmode],4 - je near copyvesa2320x240x8b + je near copyvesa12640x480x16b cmp byte[cvidmode],5 - je near copyvesa2320x240x16b + je near copyvesa2320x240x8b cmp byte[cvidmode],6 - je near copyvesa2320x480x8b + je near copyvesa2320x240x16b cmp byte[cvidmode],7 + je near copyvesa2320x480x8b + cmp byte[cvidmode],8 je near copyvesa2320x480x16b - cmp byte[cvidmode],8 + cmp byte[cvidmode],9 je near copyvesa2512x384x8b - cmp byte[cvidmode],9 - je near copyvesa2512x384x16b cmp byte[cvidmode],10 - je near copyvesa2640x480x8b + je near copyvesa2512x384x16b cmp byte[cvidmode],11 + je near copyvesa2640x480x8b + cmp byte[cvidmode],12 je near copyvesa2640x480x16b cmp byte[curblank],40h je .startcopy @@ -304,26 +306,28 @@ ScreenShowGUI: cmp byte[cvidmode],0 je near copymodeq224 cmp byte[cvidmode],1 - je near copymodeq + je near copymodeq240 cmp byte[cvidmode],2 - je near copymodex + je near copymodeq cmp byte[cvidmode],3 - je near copyvesa12640x480x16bgui + je near copymodex cmp byte[cvidmode],4 - je near copyvesa2320x240x8b + je near copyvesa12640x480x16bgui cmp byte[cvidmode],5 - je near copyvesa2320x240x16bgui + je near copyvesa2320x240x8b cmp byte[cvidmode],6 - je near copyvesa2320x480x8bgui + je near copyvesa2320x240x16bgui cmp byte[cvidmode],7 - je near copyvesa2320x480x16bgui + je near copyvesa2320x480x8bgui cmp byte[cvidmode],8 - je near copyvesa2512x384x8b + je near copyvesa2320x480x16bgui cmp byte[cvidmode],9 - je near copyvesa2512x384x16bgui + je near copyvesa2512x384x8b cmp byte[cvidmode],10 - je near copyvesa2640x480x8bgui + je near copyvesa2512x384x16bgui cmp byte[cvidmode],11 + je near copyvesa2640x480x8bgui + cmp byte[cvidmode],12 je near copyvesa2640x480x16bgui jmp copymodeq %endif @@ -575,6 +579,46 @@ NEWSYM copymodeq224 pop es ret +;******************************************************* +; CopyModeQ240 Copies buffer into chained 256x240 +;******************************************************* + +NEWSYM copymodeq240 + cmp byte[curblank],40h + jne .startcopy + ret +.startcopy + push es + mov es,[selcA000] + mov esi,[vidbuffer] + mov edi,256 + cmp word[resolutn],224 + jne .res239 + add edi,8*256 +.res239 + add esi,16+256+32 + mov edx,[resolutn] + sub edx,2 + cmp byte[FPUCopy],2 + je near .loopb +.loopa + mov ecx,64 + rep movsd + add esi,32 + dec edx + jnz .loopa + jmp .done +.loopb + mov ecx,16 + MMXStuff + add esi,32 + dec edx + jnz .loopb + emms +.done + pop es + ret + ;******************************************************* ; Copy VESA2 320x240x8b Copies buffer to 320x240x8bVBE2 ;******************************************************* @@ -5434,28 +5478,30 @@ NEWSYM copyvesa12640x480x16b NEWSYM DOSClearScreen %ifdef __MSDOS__ cmp byte[cvidmode],0 - je near copymodeq224 + je near cscopymodeq cmp byte[cvidmode],1 je near cscopymodeq cmp byte[cvidmode],2 - je near cscopymodex + je near cscopymodeq cmp byte[cvidmode],3 - je near cscopyvesa12640x480x16b + je near cscopymodex cmp byte[cvidmode],4 - je near cscopyvesa2320x240x8b + je near cscopyvesa12640x480x16b cmp byte[cvidmode],5 - je near cscopyvesa2320x240x16b + je near cscopyvesa2320x240x8b cmp byte[cvidmode],6 - je near cscopyvesa2320x480x8b + je near cscopyvesa2320x240x16b cmp byte[cvidmode],7 - je near cscopyvesa2320x480x16b + je near cscopyvesa2320x480x8b cmp byte[cvidmode],8 - je near cscopyvesa2512x384x8b + je near cscopyvesa2320x480x16b cmp byte[cvidmode],9 - je near cscopyvesa2512x384x16b + je near cscopyvesa2512x384x8b cmp byte[cvidmode],10 - je near cscopyvesa2640x480x8b + je near cscopyvesa2512x384x16b cmp byte[cvidmode],11 + je near cscopyvesa2640x480x8b + cmp byte[cvidmode],12 je near cscopyvesa2640x480x16b %endif ret @@ -5625,11 +5671,11 @@ NEWSYM GetScreen ; jbe .getscreen ; ret ;.getscreen - cmp byte[cvidmode],5 + cmp byte[cvidmode],6 je near getcopyvesa2320x240x16b - cmp byte[cvidmode],11 + cmp byte[cvidmode],12 ; je near getcopyvesa2640x480x16b - cmp byte[cvidmode],9 + cmp byte[cvidmode],10 ; je near getcopyvesa2512x384x16b %endif ret