Unified Mode-Q and Mode-X blitters in DOS port.

This commit is contained in:
stainless
2001-11-14 09:31:37 +00:00
parent 395e6025f1
commit 1ef0eba904

View File

@@ -371,147 +371,33 @@ NEWSYM copymodex224
jne .startcopy jne .startcopy
ret ret
.startcopy .startcopy
; select 1st plane
mov dx,03C4h mov dx,03C4h
mov ax,0102h mov ax,0102h
out dx,ax out dx,ax
; video memory selector
push es push es
mov ax,[selcA000] mov ax,[selcA000]
mov es,ax mov es,ax
mov esi,[vidbuffer] mov esi,[vidbuffer]
mov edi,8
add esi,16+256+32 ; center on output screen
mov edi,(320-256)/2/4
; address of first source line to copy
add esi,(16+256+16)+16
; select output video page
xor eax,eax
cmp byte[whichpage],0 cmp byte[whichpage],0
jne .pageb jne .pageb
add edi,19200 mov eax,(320*225)/4
.pageb .pageb
mov [.startesi],esi
mov [.startedi],edi
mov dl,222 mov dl,222
.loopa1 jmp copymodexloop
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
SECTION .bss
.startesi resd 1
.startedi resd 1
SECTION .text
;******************************************************* ;*******************************************************
; CopyModeX 240 Copies buffer into unchained 320x240 ; CopyModeX 240 Copies buffer into unchained 320x240
@@ -526,158 +412,35 @@ NEWSYM copymodex240
mov dx,03C4h mov dx,03C4h
mov ax,0102h mov ax,0102h
out dx,ax out dx,ax
; video memory selector
push es push es
mov ax,[selcA000] mov ax,[selcA000]
mov es,ax mov es,ax
mov esi,[vidbuffer] mov esi,[vidbuffer]
mov edi,8
; center on output screen
mov edi,(320-256)/2/4
cmp word[resolutn],224 cmp word[resolutn],224
jne .res239 jne .res239
mov edi,8*80+8 mov edi,(8*320+32)/4
.res239 .res239
add esi,16+256+32
; address of first source line to copy
add esi,(16+256+16)+16
; select output video page
xor eax,eax
cmp byte[whichpage],0 cmp byte[whichpage],0
jne .pageb jne .pageb
add edi,19200 mov eax,(320*240)/4
.pageb .pageb
mov [.startesi],esi
mov [.startedi],edi
mov dl,[resolutn]
dec dl
dec dl
.loopa
mov ecx,16
.loopb
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 .loopb
add esi,32
add edi,16
dec dl
jnz .loopa
mov dx,03C4h
mov ax,0202h ; set as plane 2
out dx,ax
mov esi,[.startesi]
inc esi
mov edi,[.startedi]
mov dl,[resolutn]
dec dl
dec dl
.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 ; set as plane 3
out dx,ax
mov esi,[.startesi]
add esi,2
mov edi,[.startedi]
mov dl,[resolutn]
dec dl
dec dl
.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 ; set as plane 4
out dx,ax
mov esi,[.startesi]
add esi,3
mov edi,[.startedi]
mov dl,[resolutn]
dec dl
dec dl
.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
SECTION .bss
.startesi resd 1
.startedi resd 1
SECTION .text mov dl,[resolutn]
sub dl,2
jmp copymodexloop
;******************************************************* ;*******************************************************
; CopyModeX 256 Copies buffer into unchained 320x256 ; CopyModeX 256 Copies buffer into unchained 320x256
@@ -688,27 +451,51 @@ NEWSYM copymodex256
jne .startcopy jne .startcopy
ret ret
.startcopy .startcopy
; select 1st plane
mov dx,03C4h mov dx,03C4h
mov ax,0102h mov ax,0102h
out dx,ax out dx,ax
; video memory selector
push es push es
mov ax,[selcA000] mov ax,[selcA000]
mov es,ax mov es,ax
mov esi,[vidbuffer] mov esi,[vidbuffer]
mov edi,8*80+8
; center on output screen
mov edi,(8*320+(320-256)/2)/4
cmp word[resolutn],224 cmp word[resolutn],224
jne .res239 jne .res239
add edi,8*80 mov edi,(16*320+(320-256)/2)/4
.res239 .res239
add esi,16+256+32
; address of first source line to copy
add esi,(16+256+16)+16
; select output video page
xor eax,eax
cmp byte[whichpage],0 cmp byte[whichpage],0
jne .pageb jne .pageb
add edi,19200 mov eax,(320*256)/4
.pageb .pageb
mov [.startesi],esi
mov [.startedi],edi
mov dl,[resolutn] mov dl,[resolutn]
sub dl,2 sub dl,2
jmp copymodexloop
;eax = VGA address of output page
;edi = offset in current page of first line
;esi = address of first line to be copied
;dl = number of lines to copy
NEWSYM copymodexloop
add edi,eax
mov [.pageaddress],eax
mov [.linecount],dl
mov [.startesi],esi
mov [.startedi],edi
.loopa1 .loopa1
mov ecx,16 mov ecx,16
.loopb1 .loopb1
@@ -732,8 +519,7 @@ NEWSYM copymodex256
mov esi,[.startesi] mov esi,[.startesi]
inc esi inc esi
mov edi,[.startedi] mov edi,[.startedi]
mov dl,[resolutn] mov dl,[.linecount]
sub dl,2
.loopa2 .loopa2
mov ecx,16 mov ecx,16
.loopb2 .loopb2
@@ -757,8 +543,7 @@ NEWSYM copymodex256
mov esi,[.startesi] mov esi,[.startesi]
add esi,2 add esi,2
mov edi,[.startedi] mov edi,[.startedi]
mov dl,[resolutn] mov dl,[.linecount]
sub dl,2
.loopa3 .loopa3
mov ecx,16 mov ecx,16
.loopb3 .loopb3
@@ -782,8 +567,7 @@ NEWSYM copymodex256
mov esi,[.startesi] mov esi,[.startesi]
add esi,3 add esi,3
mov edi,[.startedi] mov edi,[.startedi]
mov dl,[resolutn] mov dl,[.linecount]
sub dl,2
.loopa4 .loopa4
mov ecx,16 mov ecx,16
.loopb4 .loopb4
@@ -801,45 +585,41 @@ NEWSYM copymodex256
add edi,16 add edi,16
dec dl dec dl
jnz .loopa4 jnz .loopa4
pop es pop es
cmp byte[whichpage],0
; flip pages by setting new offset
mov dx,03D4h
mov al,0Ch
out dx,al
inc dx
mov al,[.pageaddress+1]
out dx,al
dec dx
mov al,0Dh
out dx,al
inc dx
mov al,[.pageaddress]
out dx,al
mov al,[whichpage]
test al,al
mov al,0
jne .setpageb jne .setpageb
mov dx,03D4h mov al,1
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 .setpageb
mov dx,03D4h mov [whichpage],al
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 ret
SECTION .bss SECTION .bss
.startesi resd 1 .startesi resd 1
.startedi resd 1 .startedi resd 1
.pageaddress resd 1
.linecount resd 1
NEWSYM whichpage, resb 1 ; active page and visual page locations NEWSYM whichpage, resb 1 ; active page and visual page locations
SECTION .text SECTION .text
;******************************************************* ;*******************************************************
; CopyModeQ 224 Copies buffer into chained 256x224 ; CopyModeQ 224 Copies buffer into chained 256x224
;******************************************************* ;*******************************************************
@@ -858,26 +638,8 @@ NEWSYM copymodeq224
mov edi,256 mov edi,256
mov dl,224-2 mov dl,224-2
cmp byte[MMXSupport],1 jmp copymodeqloop
je near .loopb
.loopa
mov ecx,256/4
rep movsd
add esi,16+16
dec dl
jnz .loopa
jmp .done
.loopb
mov ecx,256/16
MMXStuff
add esi,16+16
dec dl
jnz .loopb
emms
.done
pop es
ret
;******************************************************* ;*******************************************************
; CopyModeQ 240 Copies buffer into chained 256x240 ; CopyModeQ 240 Copies buffer into chained 256x240
@@ -903,26 +665,8 @@ NEWSYM copymodeq240
dec dl dec dl
dec dl dec dl
cmp byte[MMXSupport],1 jmp copymodeqloop
je near .loopb
.loopa
mov ecx,256/4
rep movsd
add esi,16+16
dec dl
jnz .loopa
jmp .done
.loopb
mov ecx,256/16
MMXStuff
add esi,16+16
dec dl
jnz .loopb
emms
.done
pop es
ret
;******************************************************** ;********************************************************
; CopyModeQ 256 Copies buffer into chained 256x256 ; CopyModeQ 256 Copies buffer into chained 256x256
@@ -949,6 +693,7 @@ NEWSYM copymodeq256
dec dl dec dl
dec dl dec dl
copymodeqloop:
cmp byte[MMXSupport],1 cmp byte[MMXSupport],1
je near .loopb je near .loopb
.loopa .loopa