From 48580f1915da92a2c516349a58149c3a30f27076 Mon Sep 17 00:00:00 2001 From: stainless <> Date: Mon, 10 Sep 2001 07:31:07 +0000 Subject: [PATCH] Added my last two video modes to the DOS port. --- zsnes/src/cfgload.asm | 15 +- zsnes/src/dos/dosintrf.asm | 56 ++-- zsnes/src/dos/initvid.asm | 84 ++++-- zsnes/src/dos/vga.inc | 18 ++ zsnes/src/dos/zloader.c | 2 +- zsnes/src/ui.asm | 15 +- zsnes/src/vcache.asm | 4 +- zsnes/src/video/copyvid.inc | 577 +++++++++++++++++++++++++++--------- 8 files changed, 568 insertions(+), 203 deletions(-) diff --git a/zsnes/src/cfgload.asm b/zsnes/src/cfgload.asm index af5e9948..b7a1ec8f 100644 --- a/zsnes/src/cfgload.asm +++ b/zsnes/src/cfgload.asm @@ -49,7 +49,7 @@ NEWSYM cfgStereoSound, db 0 NEWSYM cfgguioff, db 0 NEWSYM cfgper2exec, db 100 %ifdef __MSDOS__ -NEWSYM cfgcvidmode, db 3 +NEWSYM cfgcvidmode, db 4 %else NEWSYM cfgcvidmode, db 1 %endif @@ -626,12 +626,13 @@ db '',13,10 %ifdef __MSDOS__ db '; Video Mode, 0 - 10',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 '; 2 = 256x256x8B (MODEQ) 3 = 320x224x8B (MODEX)',13,10 +db '; 4 = 320x240x8B (MODEX) 5 = 320x256x8B (MODEX)',13,10 +db '; 6 = 640x480x16B (VESA1) 7 = 320x240x8B (VESA2)',13,10 +db '; 8 = 320x240x16B (VESA2) 9 = 320x480x8B (VESA2)',13,10 +db '; 10 = 320x480x16B (VESA2) 11 = 512x384x8B (VESA2)',13,10 +db '; 12 = 512x384x16B (VESA2) 13 = 640x480x8B (VESA2)',13,10 +db '; 14 = 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 08ef32e3..49911176 100644 --- a/zsnes/src/dos/dosintrf.asm +++ b/zsnes/src/dos/dosintrf.asm @@ -1015,7 +1015,7 @@ NEWSYM ClearScreen SECTION .data ; Total Number of Video Modes -NEWSYM NumVideoModes, dd 13 +NEWSYM NumVideoModes, dd 15 ; GUI Video Mode Names - Make sure that all names are of the same length ; and end with a NULL terminator @@ -1023,36 +1023,38 @@ NEWSYM GUIVideoModeNames db '256X224X8B MODEQ',0 ; 0 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 '320X224X8B MODEX',0 ; 3 +db '320X240X8B MODEX',0 ; 4 +db '320X256X8B MODEX',0 ; 5 +db '640X480X16B VESA1',0 ; 6 +db '320X240X8B VESA2',0 ; 7 +db '320X240X16B VESA2',0 ; 8 +db '320X480X8B VESA2',0 ; 9 +db '320X480X16B VESA2',0 ; 10 +db '512X384X8B VESA2',0 ; 11 +db '512X384X16B VESA2',0 ; 12 +db '640X480X8B VESA2',0 ; 13 +db '640X480X16B VESA2',0 ; 14 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,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,1,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) +NEWSYM GUI16VID, db 0,0,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,1,1,0,1,1,1,1,0 ; New Graphics Mode Available +NEWSYM GUISLVID, db 0,0,1,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,0,0,1,0 ; Interpolation +NEWSYM GUIEAVID, db 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,0,0,0,0,0,1,1,0 ; (Interp | Eagle) +NEWSYM GUIFSVID, db 0,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0 ; Full Screen +NEWSYM GUISSVID, db 0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0 ; Small Screen +NEWSYM GUITBVID, db 0,0,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,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,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 ; If Windows Full Screen +NEWSYM GUII2VID, db 0,0,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,0,0,1,0 ; Interpolation +NEWSYM GUIBIFIL, db 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 ; Triple Buffering (Win) SECTION .text ; **************************** diff --git a/zsnes/src/dos/initvid.asm b/zsnes/src/dos/initvid.asm index 741056cb..fd5e893f 100644 --- a/zsnes/src/dos/initvid.asm +++ b/zsnes/src/dos/initvid.asm @@ -41,7 +41,7 @@ SECTION .text NEWSYM dosinitvideo2 cmp byte[cvidmode],2 jne .nomodeq - jmp dosinitvideo.initmodeq + jmp dosinitvideo.initmodeq256 .nomodeq ret @@ -57,26 +57,30 @@ NEWSYM dosinitvideo cmp byte[cvidmode],1 je near .initmodeq240 cmp byte[cvidmode],2 - je near .initmodeq + je near .initmodeq256 cmp byte[cvidmode],3 - je near .initmodex + je near .initmodex224 cmp byte[cvidmode],4 - je near .initvesa12640x480x16 + je near .initmodex240 cmp byte[cvidmode],5 - je near .initvesa2320x240x8 + je near .initmodex256 cmp byte[cvidmode],6 - je near .initvesa2320x240x16 + je near .initvesa12640x480x16 cmp byte[cvidmode],7 - je near .initvesa2320x480x8 + je near .initvesa2320x240x8 cmp byte[cvidmode],8 - je near .initvesa2320x480x16 + je near .initvesa2320x240x16 cmp byte[cvidmode],9 - je near .initvesa2512x384x8 + je near .initvesa2320x480x8 cmp byte[cvidmode],10 - je near .initvesa2512x384x16 + je near .initvesa2320x480x16 cmp byte[cvidmode],11 - je near .initvesa2640x480x8 + je near .initvesa2512x384x8 cmp byte[cvidmode],12 + je near .initvesa2512x384x16 + cmp byte[cvidmode],13 + je near .initvesa2640x480x8 + cmp byte[cvidmode],14 je near .initvesa2640x480x16 ret @@ -84,19 +88,7 @@ NEWSYM dosinitvideo ;******************************************************* -; InitModeX Sets up 320x240 unchained mode -;******************************************************* - -.initmodex -%ifdef __MSDOS__ - SetVGAMode .Mode320x240 - call cscopymodex -%endif - call makepal - ret - -;******************************************************* -; InitModeQ224 Sets up 256x224 chained mode +; InitModeQ 224 Sets up 256x224 chained mode ;******************************************************* .initmodeq224 @@ -108,7 +100,7 @@ NEWSYM dosinitvideo ret ;******************************************************* -; InitModeQ240 Sets up 256x240 chained mode +; InitModeQ 240 Sets up 256x240 chained mode ;******************************************************* .initmodeq240 @@ -120,10 +112,10 @@ NEWSYM dosinitvideo ret ;******************************************************* -; InitModeQ Sets up 256x256 chained mode +; InitModeQ 256 Sets up 256x256 chained mode ;******************************************************* -.initmodeq +.initmodeq256 %ifdef __MSDOS__ cmp byte[scanlines],1 jne .noscanlines @@ -140,6 +132,44 @@ NEWSYM dosinitvideo call makepal ret + +;******************************************************* +; InitModeX 224 Sets up 320x224 unchained mode +;******************************************************* + +.initmodex224 +%ifdef __MSDOS__ + SetVGAMode .Mode320x224 + call cscopymodex +%endif + call makepal + ret + +;******************************************************* +; InitModeX 240 Sets up 320x240 unchained mode +;******************************************************* + +.initmodex240 +%ifdef __MSDOS__ + SetVGAMode .Mode320x240 + call cscopymodex +%endif + call makepal + ret + +;******************************************************* +; InitModeX 256 Sets up 320x256 unchained mode +;******************************************************* + +.initmodex256 +%ifdef __MSDOS__ + SetVGAMode .Mode320x256 + call cscopymodex +%endif + call makepal + ret + + ;******************************************************* ; InitVESA2 320x240x8 Set up Linear 320x240x8b ;******************************************************* diff --git a/zsnes/src/dos/vga.inc b/zsnes/src/dos/vga.inc index 23a861de..047b58f9 100644 --- a/zsnes/src/dos/vga.inc +++ b/zsnes/src/dos/vga.inc @@ -1,4 +1,6 @@ +; by kode54, stainless + %ifdef __MSDOS__ %macro SetVGAMode 1 mov byte[cbitmode],0 @@ -97,6 +99,14 @@ SECTION .data dw 03c4h,00e04h,03ceh,04005h,03cEh,00506h,03c0h,04110h,03c0h,00013h dd 0 +.Mode320x224 + dw 03c2h,0e300h,03d4h,05f00h,03d4h,04f01h,03d4h,05002h,03d4h,08203h + dw 03d4h,05404h,03d4h,08005h,03d4h,00b06h,03d4h,03e07h,03d4h,00008h + dw 03d4h,04109h,03d4h,0da10h,03d4h,09c11h,03d4h,0c012h,03d4h,02813h + dw 03d4h,00014h,03d4h,0c715h,03d4h,00416h,03d4h,0e317h,03c4h,00101h + dw 03c4h,00604h,03ceh,04005h,03ceh,00506h,03c0h,04110h,03c0h,00013h + dd 0 + .Mode320x240 dw 03c2h,0e300h,03d4h,05f00h,03d4h,04f01h,03d4h,05002h,03d4h,08203h dw 03d4h,05404h,03d4h,08005h,03d4h,00d06h,03d4h,03e07h,03d4h,00008h @@ -105,6 +115,14 @@ SECTION .data dw 03c4h,00604h,03ceh,04005h,03ceh,00506h,03c0h,04110h,03c0h,00013h dd 0 +.Mode320x256 + dw 03c2h,0e300h,03d4h,05f00h,03d4h,04f01h,03d4h,05002h,03d4h,08203h + dw 03d4h,05404h,03d4h,08005h,03d4h,02306h,03d4h,0b207h,03d4h,00008h + dw 03d4h,06109h,03d4h,00a10h,03d4h,0ac11h,03d4h,0ff12h,03d4h,02813h + dw 03d4h,00014h,03d4h,00715h,03d4h,01a16h,03d4h,0e317h,03c4h,00101h + dw 03c4h,00604h,03ceh,04005h,03ceh,00506h,03c0h,04110h,03c0h,00013h + dd 0 + SECTION .text %endif diff --git a/zsnes/src/dos/zloader.c b/zsnes/src/dos/zloader.c index 6b322793..6d2c07bc 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 > 12) return 13; + if(cvidmode > 14) return 13; p++; } break; diff --git a/zsnes/src/ui.asm b/zsnes/src/ui.asm index 3fdb9d99..f211f3de 100644 --- a/zsnes/src/ui.asm +++ b/zsnes/src/ui.asm @@ -223,7 +223,7 @@ NEWSYM BitConv32Ptr, dd 0 NEWSYM previdmode, db 0 ; previous video mode %ifdef __MSDOS__ -NEWSYM cvidmode, db 3 ; video mode, 0=320x240, 1=256x256 +NEWSYM cvidmode, db 4 ; video mode, 0=320x240, 1=256x256 %else NEWSYM cvidmode, db 1 ; video mode, 0=320x240, 1=256x256 %endif @@ -1455,12 +1455,13 @@ SECTION .data %ifndef __LINUX__ db ' -v # Select Video Mode :',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 ' 2 = 256x256x8B (MODEQ) 3 = 320x224x8B (MODEX)',13,10 + db ' 4 = 320x240x8B (MODEX) 5 = 320x256x8B (MODEX)',13,10 + db ' 6 = 640x480x16B (VESA1) 7 = 320x240x8B (VESA2)',13,10 + db ' 8 = 320x240x16B (VESA2) 9 = 320x480x8B (VESA2)',13,10 + db ' 10 = 320x480x16B (VESA2) 11 = 512x384x8B (VESA2)',13,10 + db ' 12 = 512x384x16B (VESA2) 13 = 640x480x8B (VESA2)',13,10 + db ' 14 = 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 633ed614..7c9c91e3 100644 --- a/zsnes/src/vcache.asm +++ b/zsnes/src/vcache.asm @@ -271,9 +271,9 @@ NEWSYM cachevideo je .nohires cmp byte[scanlines],1 je .nohires - cmp byte[cvidmode],7 + cmp byte[cvidmode],9 je .yeshires - cmp byte[cvidmode],11 + cmp byte[cvidmode],13 jne .nohires .yeshires mov byte[Mode7HiRes],1 diff --git a/zsnes/src/video/copyvid.inc b/zsnes/src/video/copyvid.inc index 32262da5..b32ff2f5 100644 --- a/zsnes/src/video/copyvid.inc +++ b/zsnes/src/video/copyvid.inc @@ -224,12 +224,11 @@ PreTripleBuffer: ret %endif -; stupid fix :) -VidModeSize dd 0,0,0,0,320*240,320*240*2,0,320*480,320*480*2 +VidModeSize dd 0,0,0,0,0,0,320*240,320*240*2,0,320*480,320*480*2 dd 512*384,512*384*2,640*480,640*480*2 -VidModeLine dd 0,0,0,0,240,240,0,480,480,384,384,480,480 +VidModeLine dd 0,0,0,0,0,0,240,240,0,480,480,384,384,480,480 NEWSYM VidStartDraw, dd 0 -VidModeComp db 0,0,0,0,0,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 CVidStartAd db 0 ApplyStart db 4 NEWSYM NextLineStart, dd 0 @@ -260,31 +259,35 @@ ScreenShow: cmp byte[debugdisble],0 je .debug cmp byte[cvidmode],2 - je near copymodeq + je near copymodeq256 .debug cmp byte[cvidmode],0 je near copymodeq224 cmp byte[cvidmode],1 je near copymodeq240 cmp byte[cvidmode],3 - je near copymodex + je near copymodex224 cmp byte[cvidmode],4 - je near copyvesa12640x480x16b + je near copymodex240 cmp byte[cvidmode],5 - je near copyvesa2320x240x8b + je near copymodex256 cmp byte[cvidmode],6 - je near copyvesa2320x240x16b + je near copyvesa12640x480x16b cmp byte[cvidmode],7 - je near copyvesa2320x480x8b + je near copyvesa2320x240x8b cmp byte[cvidmode],8 - je near copyvesa2320x480x16b - cmp byte[cvidmode],9 - je near copyvesa2512x384x8b + je near copyvesa2320x240x16b + cmp byte[cvidmode],9 + je near copyvesa2320x480x8b cmp byte[cvidmode],10 - je near copyvesa2512x384x16b - cmp byte[cvidmode],11 - je near copyvesa2640x480x8b + je near copyvesa2320x480x16b + cmp byte[cvidmode],11 + je near copyvesa2512x384x8b cmp byte[cvidmode],12 + je near copyvesa2512x384x16b + cmp byte[cvidmode],13 + je near copyvesa2640x480x8b + cmp byte[cvidmode],14 je near copyvesa2640x480x16b cmp byte[curblank],40h je .startcopy @@ -292,7 +295,7 @@ ScreenShow: ; call sounddisplay call hextestoutput .startcopy - jmp copymodeq + jmp copymodeq256 NEWSYM dosvidpastecopyscr cmp byte[curblank],40h @@ -308,50 +311,204 @@ ScreenShowGUI: cmp byte[cvidmode],1 je near copymodeq240 cmp byte[cvidmode],2 - je near copymodeq + je near copymodeq256 cmp byte[cvidmode],3 - je near copymodex + je near copymodex224 cmp byte[cvidmode],4 - je near copyvesa12640x480x16bgui + je near copymodex240 cmp byte[cvidmode],5 - je near copyvesa2320x240x8b + je near copymodex256 cmp byte[cvidmode],6 - je near copyvesa2320x240x16bgui + je near copyvesa12640x480x16bgui cmp byte[cvidmode],7 - je near copyvesa2320x480x8bgui + je near copyvesa2320x240x8b cmp byte[cvidmode],8 - je near copyvesa2320x480x16bgui + je near copyvesa2320x240x16bgui cmp byte[cvidmode],9 - je near copyvesa2512x384x8b + je near copyvesa2320x480x8bgui cmp byte[cvidmode],10 - je near copyvesa2512x384x16bgui + je near copyvesa2320x480x16bgui cmp byte[cvidmode],11 - je near copyvesa2640x480x8bgui + je near copyvesa2512x384x8b cmp byte[cvidmode],12 + je near copyvesa2512x384x16bgui + cmp byte[cvidmode],13 + je near copyvesa2640x480x8bgui + cmp byte[cvidmode],14 je near copyvesa2640x480x16bgui - jmp copymodeq + jmp copymodeq256 %endif -;******************************************************* -; CopyModeX Copies buffer into unchained 320x240 -;******************************************************* %ifdef __MSDOS__ -NEWSYM copymodex +;******************************************************* +; CopyModeX 224 Copies buffer into unchained 320x224 +;******************************************************* + +NEWSYM copymodex224 cmp byte[curblank],40h jne .startcopy ret .startcopy - ; select plane 1 mov dx,03C4h - mov ax,0102h ; set as plane 1 + mov ax,0102h + out dx,ax + push es + mov ax,[selcA000] + mov es,ax + mov esi,[vidbuffer] + mov edi,8 + add esi,16+256+32 + cmp byte[whichpage],0 + jne .pageb + add edi,19200 +.pageb + mov [.startesi],esi + mov [.startedi],edi + mov dl,222 +.loopa1 + mov ecx,16 +.loopb1 + mov ah,[esi+12] + mov al,[esi+8] + shl eax,16 + mov ah,[esi+4] + mov al,[esi+0] + mov [es:edi],eax + add esi,16 + add edi,4 + dec ecx + jnz .loopb1 + add esi,32 + add edi,16 + dec dl + jnz .loopa1 + mov dx,03C4h + mov ax,0202h + out dx,ax + mov esi,[.startesi] + inc esi + mov edi,[.startedi] + mov dl,222 +.loopa2 + mov ecx,16 +.loopb2 + mov ah,[esi+12] + mov al,[esi+8] + shl eax,16 + mov ah,[esi+4] + mov al,[esi+0] + mov [es:edi],eax + add esi,16 + add edi,4 + dec ecx + jnz .loopb2 + add esi,32 + add edi,16 + dec dl + jnz .loopa2 + mov dx,03C4h + mov ax,0402h + out dx,ax + mov esi,[.startesi] + add esi,2 + mov edi,[.startedi] + mov dl,222 +.loopa3 + mov ecx,16 +.loopb3 + mov ah,[esi+12] + mov al,[esi+8] + shl eax,16 + mov ah,[esi+4] + mov al,[esi+0] + mov [es:edi],eax + add esi,16 + add edi,4 + dec ecx + jnz .loopb3 + add esi,32 + add edi,16 + dec dl + jnz .loopa3 + mov dx,03C4h + mov ax,0802h + out dx,ax + mov esi,[.startesi] + add esi,3 + mov edi,[.startedi] + mov dl,222 +.loopa4 + mov ecx,16 +.loopb4 + mov ah,[esi+12] + mov al,[esi+8] + shl eax,16 + mov ah,[esi+4] + mov al,[esi+0] + mov [es:edi],eax + add esi,16 + add edi,4 + dec ecx + jnz .loopb4 + add esi,32 + add edi,16 + dec dl + jnz .loopa4 + pop es + cmp byte[whichpage],0 + jne .setpageb + mov dx,03D4h + mov al,0Ch + out dx,al + inc dx + mov al,75 + out dx,al + dec dx + mov al,0Dh + out dx,al + inc dx + xor al,al + out dx,al + mov byte[whichpage],1 + ret +.setpageb + mov dx,03D4h + mov al,0Ch + out dx,al + inc dx + xor al,al + out dx,al + dec dx + mov al,0Dh + out dx,al + inc dx + xor al,al + out dx,al + mov byte[whichpage],0 + ret +.startesi dd 0 +.startedi dd 0 + +;******************************************************* +; CopyModeX 240 Copies buffer into unchained 320x240 +;******************************************************* + +NEWSYM copymodex240 + cmp byte[curblank],40h + jne .startcopy + ret +.startcopy + ; select 1st plane + mov dx,03C4h + mov ax,0102h out dx,ax push es mov ax,[selcA000] mov es,ax mov esi,[vidbuffer] - mov edi,8 ; Draw @ Y from 9 to 247 + mov edi,8 cmp word[resolutn],224 jne .res239 mov edi,8*80+8 @@ -496,13 +653,248 @@ NEWSYM copymodex .startesi dd 0 .startedi dd 0 +;******************************************************* +; CopyModeX 256 Copies buffer into unchained 320x256 +;******************************************************* + +NEWSYM copymodex256 + cmp byte[curblank],40h + jne .startcopy + ret +.startcopy + mov dx,03C4h + mov ax,0102h + out dx,ax + push es + mov ax,[selcA000] + mov es,ax + mov esi,[vidbuffer] + mov edi,8*80+8 + cmp word[resolutn],224 + jne .res239 + add edi,8*80 +.res239 + add esi,16+256+32 + cmp byte[whichpage],0 + jne .pageb + add edi,19200 +.pageb + mov [.startesi],esi + mov [.startedi],edi + mov dl,[resolutn] + sub dl,2 +.loopa1 + mov ecx,16 +.loopb1 + mov ah,[esi+12] + mov al,[esi+8] + shl eax,16 + mov ah,[esi+4] + mov al,[esi+0] + mov [es:edi],eax + add esi,16 + add edi,4 + dec ecx + jnz .loopb1 + add esi,32 + add edi,16 + dec dl + jnz .loopa1 + mov dx,03C4h + mov ax,0202h + out dx,ax + mov esi,[.startesi] + inc esi + mov edi,[.startedi] + mov dl,[resolutn] + sub dl,2 +.loopa2 + mov ecx,16 +.loopb2 + mov ah,[esi+12] + mov al,[esi+8] + shl eax,16 + mov ah,[esi+4] + mov al,[esi+0] + mov [es:edi],eax + add esi,16 + add edi,4 + dec ecx + jnz .loopb2 + add esi,32 + add edi,16 + dec dl + jnz .loopa2 + mov dx,03C4h + mov ax,0402h + out dx,ax + mov esi,[.startesi] + add esi,2 + mov edi,[.startedi] + mov dl,[resolutn] + sub dl,2 +.loopa3 + mov ecx,16 +.loopb3 + mov ah,[esi+12] + mov al,[esi+8] + shl eax,16 + mov ah,[esi+4] + mov al,[esi+0] + mov [es:edi],eax + add esi,16 + add edi,4 + dec ecx + jnz .loopb3 + add esi,32 + add edi,16 + dec dl + jnz .loopa3 + mov dx,03C4h + mov ax,0802h + out dx,ax + mov esi,[.startesi] + add esi,3 + mov edi,[.startedi] + mov dl,[resolutn] + sub dl,2 +.loopa4 + mov ecx,16 +.loopb4 + mov ah,[esi+12] + mov al,[esi+8] + shl eax,16 + mov ah,[esi+4] + mov al,[esi+0] + mov [es:edi],eax + add esi,16 + add edi,4 + dec ecx + jnz .loopb4 + add esi,32 + add edi,16 + dec dl + jnz .loopa4 + pop es + cmp byte[whichpage],0 + jne .setpageb + mov dx,03D4h + mov al,0Ch + out dx,al + inc dx + mov al,75 + out dx,al + dec dx + mov al,0Dh + out dx,al + inc dx + xor al,al + out dx,al + mov byte[whichpage],1 + ret +.setpageb + mov dx,03D4h + mov al,0Ch + out dx,al + inc dx + xor al,al + out dx,al + dec dx + mov al,0Dh + out dx,al + inc dx + xor al,al + out dx,al + mov byte[whichpage],0 + ret +.startesi dd 0 +.startedi dd 0 + NEWSYM whichpage, db 0 ; active page and visual page locations + ;******************************************************* -; CopyModeQ Copies buffer into chained 256x256 +; CopyModeQ 224 Copies buffer into chained 256x224 ;******************************************************* -NEWSYM copymodeq +NEWSYM copymodeq224 + cmp byte[curblank],40h + jne .startcopy + ret +.startcopy + push es + mov ax,[selcA000] + mov es,ax + mov esi,[vidbuffer] + add esi,16+256+32 + mov edi,256 + mov dl,222 + cmp byte[FPUCopy],2 + je near .loopb +.loopa + mov ecx,64 + rep movsd + add esi,32 + dec dl + jnz .loopa + jmp .done +.loopb + mov ecx,16 + MMXStuff + add esi,32 + dec dl + jnz .loopb + emms +.done + pop es + ret + +;******************************************************* +; CopyModeQ 240 Copies buffer into chained 256x240 +;******************************************************* + +NEWSYM copymodeq240 + cmp byte[curblank],40h + jne .startcopy + ret +.startcopy + push es + mov ax,[selcA000] + mov es,ax + mov esi,[vidbuffer] + mov edi,256 + cmp word[resolutn],224 + jne .res239 + add edi,8*256 +.res239 + add esi,16+256+32 + mov dl,[resolutn] + sub dl,2 + cmp byte[FPUCopy],2 + je near .loopb +.loopa + mov ecx,64 + rep movsd + add esi,32 + dec dl + jnz .loopa + jmp .done +.loopb + mov ecx,16 + MMXStuff + add esi,32 + dec dl + jnz .loopb + emms +.done + pop es + ret + +;******************************************************** +; CopyModeQ 256 Copies buffer into chained 256x256 +;******************************************************** + +NEWSYM copymodeq256 cmp byte[curblank],40h jne .startcopy ret @@ -524,109 +916,26 @@ NEWSYM copymodeq dec dl dec dl cmp byte[FPUCopy],2 - je near .loopc + je near .loopb .loopa mov ecx,64 rep movsd add esi,32 dec dl jnz .loopa - pop es - ret - -.loopc + jmp .done +.loopb mov ecx,16 MMXStuff add esi,32 dec dl - jnz .loopc - emms - pop es - ret - -;******************************************************* -; CopyModeQ224 Copies buffer into chained 256x224 -;******************************************************* - -NEWSYM copymodeq224 - cmp byte[curblank],40h ; Check for VBlank. - jne .startcopy ; OK, no VBlank... - ret -.startcopy - push es ; Backup ES register. -; mov ax,[selcA000] -; mov es,ax - mov es,[selcA000] ; Get 0xA000 selector. - mov esi,[vidbuffer] ; vidbuffer to source. -; mov ebp,[vidbufferm] - add esi,16+256+32 ; Skip top+bottom lines. -; add ebp,16+256+32 - mov edi,256 ; Start at second line. - mov edx,222 ; Only copy 222 lines. - cmp byte[FPUCopy],2 ; Check for MMX enable. - je near .loopb -.loopa - mov ecx,64 - rep movsd ; Copy 64 32-bit words. - add esi,32 ; Skip vidbuffer margins. - dec edx - jnz .loopa ; Loop for each line. - jmp .done -.loopb - mov ecx,16 - MMXStuff ; Copy 16 64-bit words. - add esi,32 ; ... - dec edx - jnz .loopb ; ... - emms ; Empty MMX state. -.done - pop es ; Restore ES register. - ret - -;******************************************************* -; CopyModeQ240 Copies buffer into chained 256x240 -;******************************************************* - -NEWSYM copymodeq240 - cmp byte[curblank],40h - jne .startcopy - ret -.startcopy - push es -; mov ax,[selcA000] -; mov es,ax - mov es,[selcA000] - mov esi,[vidbuffer] -; mov ebp,[vidbufferm] - mov edi,256 - cmp word[resolutn],224 - jne .res239 - add edi,8*256 -.res239 - add esi,16+256+32 -; add ebp,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 ;******************************************************* @@ -5506,22 +5815,26 @@ NEWSYM DOSClearScreen cmp byte[cvidmode],3 je near cscopymodex cmp byte[cvidmode],4 - je near cscopyvesa12640x480x16b + je near cscopymodex cmp byte[cvidmode],5 - je near cscopyvesa2320x240x8b + je near cscopymodex cmp byte[cvidmode],6 - je near cscopyvesa2320x240x16b + je near cscopyvesa12640x480x16b cmp byte[cvidmode],7 - je near cscopyvesa2320x480x8b + je near cscopyvesa2320x240x8b cmp byte[cvidmode],8 - je near cscopyvesa2320x480x16b + je near cscopyvesa2320x240x16b cmp byte[cvidmode],9 - je near cscopyvesa2512x384x8b + je near cscopyvesa2320x480x8b cmp byte[cvidmode],10 - je near cscopyvesa2512x384x16b + je near cscopyvesa2320x480x16b cmp byte[cvidmode],11 - je near cscopyvesa2640x480x8b + je near cscopyvesa2512x384x8b cmp byte[cvidmode],12 + je near cscopyvesa2512x384x16b + cmp byte[cvidmode],13 + je near cscopyvesa2640x480x8b + cmp byte[cvidmode],14 je near cscopyvesa2640x480x16b %endif ret