Added my last two video modes to the DOS port.

This commit is contained in:
stainless
2001-09-10 07:31:07 +00:00
parent 5dbc7f8cd3
commit 48580f1915
8 changed files with 568 additions and 203 deletions

View File

@@ -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

View File

@@ -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
; ****************************

View File

@@ -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
;*******************************************************

View File

@@ -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

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -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