From d4fa4e1fdb05422f14f278196066962aa1f0498a Mon Sep 17 00:00:00 2001 From: stainless <> Date: Wed, 5 Sep 2001 23:14:01 +0000 Subject: [PATCH] Added a new video mode to the DOS port. --- zsnes/src/cfgload.asm | 12 +-- zsnes/src/dos/dosintrf.asm | 57 +++++++------- zsnes/src/dos/initvid.asm | 150 +++++++++++++++++++++++++++++++++--- zsnes/src/dos/zloader.c | 2 +- zsnes/src/ui.asm | 12 +-- zsnes/src/vcache.asm | 4 +- zsnes/src/video/copyvid.inc | 107 +++++++++++++++++-------- 7 files changed, 257 insertions(+), 87 deletions(-) diff --git a/zsnes/src/cfgload.asm b/zsnes/src/cfgload.asm index 03ada5fc..6727a482 100644 --- a/zsnes/src/cfgload.asm +++ b/zsnes/src/cfgload.asm @@ -621,12 +621,12 @@ db '',13,10 %endif %ifdef __MSDOS__ db '; Video Mode, 0 - 10',13,10 -db '; 0 = 256x256x8B (MODEQ) 1 = 320x240x8B (MODEX)',13,10 -db '; 2 = 640x480x16B (VESA1) 3 = 320x240x8B (VESA2)',13,10 -db '; 4 = 320x240x16B (VESA2) 5 = 320x480x8B (VESA2)',13,10 -db '; 6 = 320x480x16B (VESA2) 7 = 512x384x8B (VESA2)',13,10 -db '; 8 = 512x384x16B (VESA2) 9 = 640x480x8B (VESA2)',13,10 -db '; 10 = 640x480x16B (VESA2)',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 '',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 e9817146..37334a72 100644 --- a/zsnes/src/dos/dosintrf.asm +++ b/zsnes/src/dos/dosintrf.asm @@ -1013,42 +1013,43 @@ NEWSYM ClearScreen SECTION .data ; Total Number of Video Modes -NEWSYM NumVideoModes, dd 11 +NEWSYM NumVideoModes, dd 12 ; GUI Video Mode Names - Make sure that all names are of the same length ; and end with a NULL terminator NEWSYM GUIVideoModeNames -db '256X256X8B MODEQ',0 ; 0 -db '320X240X8B MODEX',0 ; 1 -db '640X480X16B VESA1',0 ; 2 -db '320X240X8B VESA2',0 ; 3 -db '320X240X16B VESA2',0 ; 4 -db '320X480X8B VESA2',0 ; 5 -db '320X480X16B VESA2',0 ; 6 -db '512X384X8B VESA2',0 ; 7 -db '512X384X16B VESA2',0 ; 8 -db '640X480X8B VESA2',0 ; 9 -db '640X480X16B VESA2',0 ; 10 +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 ' ',0 ; Video Mode Feature Availability (1 = Available, 0 = Not Available) ; Left side starts with Video Mode 0 -NEWSYM GUI16VID, db 0,0,1,0,1,0,1,0,1,0,1,0 ; 16-bit mode -NEWSYM GUINGVID, db 1,1,1,1,1,1,0,1,1,1,1,0 ; New Graphics Mode Available -NEWSYM GUISLVID, db 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,1,0 ; Interpolation -NEWSYM GUIEAVID, db 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,1,1,0 ; (Interp | Eagle) -NEWSYM GUIFSVID, db 0,0,0,1,1,0,0,0,0,1,1,0 ; Full Screen -NEWSYM GUISSVID, db 0,0,1,0,0,0,0,0,0,1,1,0 ; Small Screen -NEWSYM GUITBVID, db 0,0,0,1,1,1,1,1,1,1,1,0 ; Triple Buffering -NEWSYM GUIHSVID, db 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,1,0 ; 2xSaI/Super Eagle Engines -NEWSYM GUIWFVID, db 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 ; Interpolation -NEWSYM GUIM7VID, db 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 ; Bilinear Filtering -NEWSYM GUITBWVID, db 0,0,0,0,0,0,0,0,0,0,0,0 ; Triple Buffering (Win) +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) SECTION .text ; **************************** diff --git a/zsnes/src/dos/initvid.asm b/zsnes/src/dos/initvid.asm index a364083e..da9630f9 100644 --- a/zsnes/src/dos/initvid.asm +++ b/zsnes/src/dos/initvid.asm @@ -20,7 +20,7 @@ EXTSYM AddSub256,InitVesa2,cbitmode,cvidmode,makepal EXTSYM scanlines,selcA000,vesa2_bits,vesa2_bpos,vesa2_clbit EXTSYM vesa2_gpos,vesa2_rpos,vesa2_usbit,vesa2_x,vesa2_y -EXTSYM vesa2selec,InitVesa12,videotroub +EXTSYM vesa2selec,InitVesa12,videotroub,cscopymodeq NEWSYM InitVidAsmStart @@ -51,26 +51,28 @@ NEWSYM dosinitvideo mov byte[res640],0 mov byte[res480],0 cmp byte[cvidmode],0 - je near .initmodeq + je near .initmodeq224 cmp byte[cvidmode],1 - je near .initmodex + je near .initmodeq cmp byte[cvidmode],2 - je near .initvesa12640x480x16 + je near .initmodex cmp byte[cvidmode],3 - je near .initvesa2320x240x8 + je near .initvesa12640x480x16 cmp byte[cvidmode],4 - je near .initvesa2320x240x16 + je near .initvesa2320x240x8 cmp byte[cvidmode],5 - je near .initvesa2320x480x8 + je near .initvesa2320x240x16 cmp byte[cvidmode],6 - je near .initvesa2320x480x16 + je near .initvesa2320x480x8 cmp byte[cvidmode],7 - je near .initvesa2512x384x8 + je near .initvesa2320x480x16 cmp byte[cvidmode],8 - je near .initvesa2512x384x16 + je near .initvesa2512x384x8 cmp byte[cvidmode],9 - je near .initvesa2640x480x8 + je near .initvesa2512x384x16 cmp byte[cvidmode],10 + je near .initvesa2640x480x8 + cmp byte[cvidmode],11 je near .initvesa2640x480x16 ret @@ -358,6 +360,132 @@ NEWSYM dosinitvideo ; pop es ; ret +;******************************************************* +; InitModeQ224 Sets up 256x224 chained mode +;******************************************************* + +.initmodeq224 + 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,000bh + 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,0061h + out dx,ax + + mov dx,03d4h + mov ax,0010h + out dx,ax + inc dx + mov ax,00dah + out dx,ax + + mov dx,03d4h + mov ax,0011h + out dx,ax + inc dx + mov ax,009ah + out dx,ax + + mov dx,03d4h + mov ax,0012h + out dx,ax + inc dx + mov ax,00bfh + 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,0007h + out dx,ax + + mov dx,03d4h + mov ax,0016h + out dx,ax + inc dx + mov ax,001ah + out dx,ax + + call cscopymodeq + call makepal + + ret + ;******************************************************* ; InitVESA2 320x240x8 Set up Linear 320x240x8b ;******************************************************* diff --git a/zsnes/src/dos/zloader.c b/zsnes/src/dos/zloader.c index 1af1b41a..25308124 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 > 10) return 13; + if(cvidmode > 11) return 13; p++; } break; diff --git a/zsnes/src/ui.asm b/zsnes/src/ui.asm index 146dd41e..71ce4c66 100644 --- a/zsnes/src/ui.asm +++ b/zsnes/src/ui.asm @@ -1438,12 +1438,12 @@ SECTION .data db ' -u Force PAL timing',13,10 %ifndef __LINUX__ db ' -v # Select Video Mode :',13,10 - db ' 0 = 256x256x8B (MODEQ) 1 = 320x240x8B (MODEX)',13,10 - db ' 2 = 640x480x16B (VESA1) 3 = 320x240x8B (VESA2)',13,10 - db ' 4 = 320x240x16B (VESA2) 5 = 320x480x8B (VESA2)',13,10 - db ' 6 = 320x480x16B (VESA2) 7 = 512x384x8B (VESA2)',13,10 - db ' 8 = 512x384x16B (VESA2) 9 = 640x480x8B (VESA2)',13,10 - db ' 10 = 640x480x16B (VESA2)',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 %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 d91f39b2..405383a1 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],5 + cmp byte[cvidmode],6 je .yeshires - cmp byte[cvidmode],9 + cmp byte[cvidmode],10 jne .nohires .yeshires mov byte[Mode7HiRes],1 diff --git a/zsnes/src/video/copyvid.inc b/zsnes/src/video/copyvid.inc index 2ab3fead..347d58ed 100644 --- a/zsnes/src/video/copyvid.inc +++ b/zsnes/src/video/copyvid.inc @@ -260,27 +260,29 @@ ScreenShow: cmp byte[debugdisble],0 je .debug cmp byte[cvidmode],0 + je near copymodeq224 + cmp byte[cvidmode],1 je near copymodeq .debug - cmp byte[cvidmode],1 - je near copymodex cmp byte[cvidmode],2 - je near copyvesa12640x480x16b + je near copymodex cmp byte[cvidmode],3 - je near copyvesa2320x240x8b + je near copyvesa12640x480x16b cmp byte[cvidmode],4 - je near copyvesa2320x240x16b + je near copyvesa2320x240x8b cmp byte[cvidmode],5 - je near copyvesa2320x480x8b + je near copyvesa2320x240x16b cmp byte[cvidmode],6 + je near copyvesa2320x480x8b + cmp byte[cvidmode],7 je near copyvesa2320x480x16b - cmp byte[cvidmode],7 + cmp byte[cvidmode],8 je near copyvesa2512x384x8b - cmp byte[cvidmode],8 - je near copyvesa2512x384x16b cmp byte[cvidmode],9 - je near copyvesa2640x480x8b + je near copyvesa2512x384x16b cmp byte[cvidmode],10 + je near copyvesa2640x480x8b + cmp byte[cvidmode],11 je near copyvesa2640x480x16b cmp byte[curblank],40h je .startcopy @@ -300,26 +302,28 @@ NEWSYM dosvidpastecopyscr ScreenShowGUI: cmp byte[cvidmode],0 - je near copymodeq + je near copymodeq224 cmp byte[cvidmode],1 - je near copymodex + je near copymodeq cmp byte[cvidmode],2 - je near copyvesa12640x480x16bgui + je near copymodex cmp byte[cvidmode],3 - je near copyvesa2320x240x8b + je near copyvesa12640x480x16bgui cmp byte[cvidmode],4 - je near copyvesa2320x240x16bgui + je near copyvesa2320x240x8b cmp byte[cvidmode],5 - je near copyvesa2320x480x8bgui + je near copyvesa2320x240x16bgui cmp byte[cvidmode],6 - je near copyvesa2320x480x16bgui + je near copyvesa2320x480x8bgui cmp byte[cvidmode],7 - je near copyvesa2512x384x8b + je near copyvesa2320x480x16bgui cmp byte[cvidmode],8 - je near copyvesa2512x384x16bgui + je near copyvesa2512x384x8b cmp byte[cvidmode],9 - je near copyvesa2640x480x8bgui + je near copyvesa2512x384x16bgui cmp byte[cvidmode],10 + je near copyvesa2640x480x8bgui + cmp byte[cvidmode],11 je near copyvesa2640x480x16bgui jmp copymodeq %endif @@ -536,6 +540,41 @@ NEWSYM copymodeq pop es ret +;******************************************************* +; CopyModeQ224 Copies buffer into chained 256x224 +;******************************************************* + +NEWSYM copymodeq224 + cmp byte[curblank],40h + jne .startcopy + ret +.startcopy + push es + mov es,[selcA000] + mov esi,[vidbuffer] + add esi,16+256+32 + mov edi,256 + mov edx,222 + 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 ;******************************************************* @@ -5395,26 +5434,28 @@ NEWSYM copyvesa12640x480x16b NEWSYM DOSClearScreen %ifdef __MSDOS__ cmp byte[cvidmode],0 - je near cscopymodeq + je near copymodeq224 cmp byte[cvidmode],1 - je near cscopymodex + je near cscopymodeq cmp byte[cvidmode],2 - je near cscopyvesa12640x480x16b + je near cscopymodex cmp byte[cvidmode],3 - je near cscopyvesa2320x240x8b + je near cscopyvesa12640x480x16b cmp byte[cvidmode],4 - je near cscopyvesa2320x240x16b + je near cscopyvesa2320x240x8b cmp byte[cvidmode],5 - je near cscopyvesa2320x480x8b + je near cscopyvesa2320x240x16b cmp byte[cvidmode],6 - je near cscopyvesa2320x480x16b + je near cscopyvesa2320x480x8b cmp byte[cvidmode],7 - je near cscopyvesa2512x384x8b + je near cscopyvesa2320x480x16b cmp byte[cvidmode],8 - je near cscopyvesa2512x384x16b + je near cscopyvesa2512x384x8b cmp byte[cvidmode],9 - je near cscopyvesa2640x480x8b + je near cscopyvesa2512x384x16b cmp byte[cvidmode],10 + je near cscopyvesa2640x480x8b + cmp byte[cvidmode],11 je near cscopyvesa2640x480x16b %endif ret @@ -5584,11 +5625,11 @@ NEWSYM GetScreen ; jbe .getscreen ; ret ;.getscreen - cmp byte[cvidmode],4 + cmp byte[cvidmode],5 je near getcopyvesa2320x240x16b - cmp byte[cvidmode],10 + cmp byte[cvidmode],11 ; je near getcopyvesa2640x480x16b - cmp byte[cvidmode],8 + cmp byte[cvidmode],9 ; je near getcopyvesa2512x384x16b %endif ret