1385 lines
20 KiB
NASM
1385 lines
20 KiB
NASM
;====================================================
|
|
;
|
|
; TED5 ASM Routines
|
|
;
|
|
;====================================================
|
|
IDEAL
|
|
P386N
|
|
MODEL medium,C
|
|
|
|
extrn XMSdriver:DWORD
|
|
extrn videomode:WORD,xmshandle:WORD,XMSlookup:WORD
|
|
extrn tilenum:WORD,lasticon:WORD,firsticon:WORD
|
|
extrn CGAlookup:WORD,EGA1lookup:WORD,EGA2lookup:WORD,VGAlookup:WORD
|
|
|
|
DATASEG
|
|
|
|
SCindex = 3c4h
|
|
SCmapmask = 2
|
|
GCindex = 3CEh
|
|
GCreadmap = 4
|
|
GCmode = 5
|
|
|
|
CombTable dw CombineCGA,CombineEGA,CombineEGA,CombineVGA
|
|
DrawTable dw DrawTCGA,DrawTEGA1,DrawTEGA2,DrawTVGA
|
|
OverTable dw OverlayCGA,OverlayEGA,OverlayEGA,OverlayVGA
|
|
|
|
cgacolors db 55h,0aah
|
|
egacolors dw 0,0ffffh
|
|
|
|
oldh db 0
|
|
oldy dw 0
|
|
horzadd dw 0
|
|
wsize dw 1,2,4
|
|
hsize dw 8,16,32
|
|
twidth dw 0
|
|
theight dw 0
|
|
bmlen dw 0
|
|
masklen dw 0
|
|
|
|
csize dw 32,64,256
|
|
esize dw 32,128,512
|
|
vsize dw 64,256,1024
|
|
|
|
cmsize dw 64,128,512
|
|
emsize dw 40,160,640
|
|
vmsize dw 128,512,2048
|
|
|
|
PUBLIC tdata
|
|
tdata db 2048 dup(?)
|
|
tdata1 db 2048 dup(?)
|
|
|
|
;
|
|
; XMS move structure
|
|
;
|
|
blen dw 0,0
|
|
shandle dw 0
|
|
soff dd 0
|
|
dhandle dw 0
|
|
doff dd tdata1
|
|
|
|
|
|
Csparse dw csp8,csp16,csp32
|
|
Esparse dw esp8,esp16,esp32
|
|
Vsparse dw vsp8,vsp16,vsp32
|
|
|
|
csp8 db 0ffh,0ffh
|
|
REPT 7
|
|
db 0c0h,0
|
|
ENDM
|
|
csp16 db 4 dup (0ffh)
|
|
REPT 15
|
|
db 0c0h
|
|
db 3 dup (0)
|
|
ENDM
|
|
csp32 db 8 dup (0ffh)
|
|
REPT 31
|
|
db 0c0h
|
|
db 7 dup(0)
|
|
ENDM
|
|
|
|
LABEL esp8 BYTE
|
|
REPT 4
|
|
db 0ffh
|
|
db 7 dup (80h)
|
|
ENDM
|
|
LABEL esp16 BYTE
|
|
REPT 4
|
|
db 0ffh,0ffh
|
|
REPT 15
|
|
db 80h,0
|
|
ENDM
|
|
ENDM
|
|
LABEL esp32 BYTE
|
|
REPT 4
|
|
db 4 dup (0ffh)
|
|
REPT 31
|
|
db 80h,0,0,0
|
|
ENDM
|
|
ENDM
|
|
|
|
vsp8 db 8 dup(0ffh)
|
|
REPT 7
|
|
db 0ffh,7 dup(0)
|
|
ENDM
|
|
vsp16 db 16 dup(0ffh)
|
|
REPT 15
|
|
db 0ffh,15 dup(0)
|
|
ENDM
|
|
vsp32 db 32 dup(0ffh)
|
|
REPT 31
|
|
db 0ffh,31 dup(0)
|
|
ENDM
|
|
|
|
|
|
CODESEG
|
|
;====================================================
|
|
;
|
|
; Combine tiles together (background,foreground,icons)
|
|
;
|
|
;====================================================
|
|
PUBLIC CombineTiles
|
|
PROC CombineTiles
|
|
ARG tileb:WORD,tilef:WORD,tilei:WORD,tsize:WORD
|
|
|
|
push si
|
|
push di
|
|
|
|
cld
|
|
mov bx,[tsize]
|
|
shl bx,1
|
|
mov dx,[hsize+bx-2]
|
|
mov [theight],dx
|
|
mov cx,[wsize+bx-2]
|
|
mov [twidth],cx
|
|
mov ax,[xmshandle]
|
|
mov [shandle],ax ;set XMS handle
|
|
|
|
mov si,[videomode]
|
|
shl si,1
|
|
mov ax,[CombTable+si]
|
|
jmp ax
|
|
;
|
|
; Combine CGA tiles
|
|
;
|
|
LABEL CombineCGA PROC
|
|
|
|
shl [twidth],1
|
|
mov cx,[cmsize+bx-2]
|
|
mov [bmlen],cx
|
|
mov ax,[csize+bx-2] ;get length of block to move
|
|
mov [blen],ax
|
|
sub cx,ax
|
|
mov [masklen],cx
|
|
|
|
;
|
|
; Handle the background tiles first!
|
|
;
|
|
mov ax,[tileb]
|
|
cmp ax,8000h ;solid color?
|
|
jb @@c1
|
|
neg ax
|
|
|
|
mov di,ds
|
|
mov es,di
|
|
mov di,OFFSET tdata
|
|
mov bx,ax
|
|
and bx,1
|
|
mov al,[cgacolors+bx]
|
|
|
|
mov cx,[blen]
|
|
rep stosb
|
|
jmp SHORT @@c2
|
|
|
|
@@c1:
|
|
shl ax,2
|
|
mov bx,ax
|
|
mov es,[XMSlookup] ;(LONG SEG *)
|
|
mov ax,[es:bx]
|
|
mov [WORD PTR soff],ax
|
|
mov ax,[es:bx+2]
|
|
mov [WORD PTR soff+2],ax
|
|
cmp ax,-1 ;SPARSE TILE?
|
|
je @@c1a
|
|
|
|
mov ax,OFFSET tdata ;(quickie modification since "doff"
|
|
mov [WORD doff],ax ; should always point to "tdata1")
|
|
mov si,OFFSET blen
|
|
mov ah,11
|
|
call [DWORD XMSdriver] ;move tile into tdata1
|
|
mov ax,OFFSET tdata1
|
|
mov [WORD doff],ax ;ahhh....back to normal
|
|
|
|
jmp @@c2
|
|
;
|
|
; Copy sparse tile to tdata
|
|
;
|
|
@@c1a:
|
|
mov bx,[tsize]
|
|
shl bx,1
|
|
mov si,[Csparse+bx-2]
|
|
mov di,OFFSET tdata
|
|
mov cx,[blen]
|
|
shr cx,1 ;for WORD copy
|
|
mov ax,ds
|
|
mov es,ax
|
|
rep movsw
|
|
|
|
;
|
|
; Handle foreground tiles
|
|
;
|
|
@@c2:
|
|
mov bx,[tilef]
|
|
cmp bx,0
|
|
je @@c3 ;any masked tile?
|
|
|
|
shl bx,2
|
|
mov es,[XMSlookup]
|
|
mov ax,[es:bx]
|
|
mov [WORD PTR soff],ax
|
|
mov ax,[es:bx+2]
|
|
mov [WORD PTR soff+2],ax
|
|
cmp ax,-1 ;SPARSE MASKED TILE?
|
|
je @@c3
|
|
|
|
mov ax,[bmlen]
|
|
mov [blen],ax ;set masked tile length for XMS copy
|
|
mov si,OFFSET blen
|
|
mov ah,11
|
|
call [DWORD XMSdriver] ;move tile into tdata1
|
|
;
|
|
; now we have the masked tile in "tdata1".
|
|
; time to mask it onto "tdata"
|
|
;
|
|
mov si,OFFSET tdata1
|
|
add si,[masklen] ;SI = masked tile's tiledata
|
|
mov di,OFFSET tdata ;DI = tile in "tdata"
|
|
|
|
mov dx,[theight]
|
|
mov bx,OFFSET tdata1 ;BX = mask
|
|
@@c2a:
|
|
mov cx,[twidth]
|
|
@@c2b:
|
|
mov al,[bx] ;get mask byte
|
|
and [di],al ;and tdata with it
|
|
lodsb ;get tilem byte
|
|
or [di],al ;OR it onto tdata
|
|
inc di
|
|
inc bx
|
|
loop @@c2b
|
|
dec dx
|
|
jnz @@c2a
|
|
;
|
|
; Handle icons (foreground tiles)
|
|
;
|
|
@@c3:
|
|
mov bx,[tilei]
|
|
cmp bx,[lasticon]
|
|
ja @@cexit ;any icons?
|
|
cmp bx,[firsticon]
|
|
jbe @@cexit
|
|
|
|
shl bx,2
|
|
mov es,[XMSlookup]
|
|
mov ax,[es:bx]
|
|
mov [WORD PTR soff],ax
|
|
mov ax,[es:bx+2]
|
|
mov [WORD PTR soff+2],ax
|
|
|
|
mov ax,[bmlen]
|
|
mov [blen],ax ;set masked tile length for XMS copy
|
|
mov si,OFFSET blen
|
|
mov ah,11
|
|
call [DWORD XMSdriver] ;move tile into tdata1
|
|
;
|
|
; now we have the masked tile in "tdata1".
|
|
; time to mask it onto "tdata"
|
|
;
|
|
mov si,OFFSET tdata1
|
|
add si,[masklen] ;SI = masked tile's tiledata
|
|
mov di,OFFSET tdata ;DI = tile in "tdata"
|
|
|
|
mov dx,[theight]
|
|
mov bx,OFFSET tdata1 ;BX = mask
|
|
@@c3a:
|
|
mov cx,[twidth]
|
|
@@c3b:
|
|
mov al,[bx] ;get mask byte
|
|
and [di],al ;and tdata with it
|
|
lodsb ;get tilem byte
|
|
or [di],al ;OR it onto tdata
|
|
inc di
|
|
inc bx
|
|
loop @@c3b
|
|
dec dx
|
|
jnz @@c3a
|
|
@@cexit:
|
|
pop di
|
|
pop si
|
|
ret
|
|
|
|
;
|
|
; Combine EGA tiles
|
|
;
|
|
LABEL CombineEGA PROC
|
|
|
|
mov cx,[emsize+bx-2]
|
|
mov [bmlen],cx
|
|
mov ax,[esize+bx-2] ;get length of block to move
|
|
mov [blen],ax
|
|
sub cx,ax
|
|
mov [masklen],cx
|
|
|
|
;
|
|
; Handle the background tiles first!
|
|
;
|
|
mov ax,[tileb]
|
|
cmp ax,8000h ;solid color?
|
|
jb @@e1
|
|
neg ax
|
|
|
|
mov di,ds
|
|
mov es,di
|
|
mov di,OFFSET tdata
|
|
mov dx,ax
|
|
|
|
mov cx,[blen] ;plane 0
|
|
shr cx,3
|
|
mov bx,dx
|
|
shr dx,1
|
|
and bx,1
|
|
shl bx,1
|
|
mov ax,[egacolors+bx]
|
|
rep stosw
|
|
|
|
mov cx,[blen] ;plane 1
|
|
shr cx,3
|
|
mov bx,dx
|
|
shr dx,1
|
|
and bx,1
|
|
shl bx,1
|
|
mov ax,[egacolors+bx]
|
|
rep stosw
|
|
|
|
mov cx,[blen] ;plane 2
|
|
shr cx,3
|
|
mov bx,dx
|
|
shr dx,1
|
|
and bx,1
|
|
shl bx,1
|
|
mov ax,[egacolors+bx]
|
|
rep stosw
|
|
|
|
mov cx,[blen] ;plane 3
|
|
shr cx,3
|
|
mov bx,dx
|
|
shr dx,1
|
|
and bx,1
|
|
shl bx,1
|
|
mov ax,[egacolors+bx]
|
|
rep stosw
|
|
jmp SHORT @@e2
|
|
|
|
@@e1:
|
|
shl ax,2
|
|
mov bx,ax
|
|
mov es,[XMSlookup] ;(LONG SEG *)
|
|
mov ax,[es:bx]
|
|
mov [WORD PTR soff],ax
|
|
mov ax,[es:bx+2]
|
|
mov [WORD PTR soff+2],ax
|
|
cmp ax,-1 ;SPARSE TILE?
|
|
je @@e1a
|
|
|
|
mov ax,OFFSET tdata ;(quickie modification since "doff"
|
|
mov [WORD doff],ax ; should always point to "tdata1")
|
|
mov si,OFFSET blen
|
|
mov ah,11
|
|
call [DWORD XMSdriver] ;move tile into tdata1
|
|
mov ax,OFFSET tdata1
|
|
mov [WORD doff],ax ;ahhh....back to normal
|
|
|
|
jmp @@e2
|
|
;
|
|
; Copy sparse tile to tdata
|
|
;
|
|
@@e1a:
|
|
mov bx,[tsize]
|
|
shl bx,1
|
|
mov si,[Esparse+bx-2]
|
|
mov di,OFFSET tdata
|
|
mov cx,[blen]
|
|
shr cx,1 ;for WORD copy
|
|
mov ax,ds
|
|
mov es,ax
|
|
rep movsw
|
|
|
|
;
|
|
; Handle foreground tiles
|
|
;
|
|
@@e2:
|
|
mov bx,[tilef]
|
|
cmp bx,0
|
|
je @@e3 ;any masked tile?
|
|
|
|
shl bx,2
|
|
mov es,[XMSlookup]
|
|
mov ax,[es:bx]
|
|
mov [WORD PTR soff],ax
|
|
mov ax,[es:bx+2]
|
|
mov [WORD PTR soff+2],ax
|
|
cmp ax,-1 ;SPARSE MASKED TILE?
|
|
je @@e3
|
|
|
|
mov ax,[bmlen]
|
|
mov [blen],ax ;set masked tile length for XMS copy
|
|
mov si,OFFSET blen
|
|
mov ah,11
|
|
call [DWORD XMSdriver] ;move tile into tdata1
|
|
;
|
|
; now we have the masked tile in "tdata1".
|
|
; time to mask it onto "tdata"
|
|
;
|
|
mov si,OFFSET tdata1
|
|
add si,[masklen] ;SI = masked tile's tiledata
|
|
mov di,OFFSET tdata ;DI = tile in "tdata"
|
|
mov ah,4
|
|
@@e2a0:
|
|
mov dx,[theight]
|
|
mov bx,OFFSET tdata1 ;BX = mask
|
|
@@e2a:
|
|
mov cx,[twidth]
|
|
@@e2b:
|
|
mov al,[bx] ;get mask byte
|
|
and [di],al ;and tdata with it
|
|
lodsb ;get tilem byte
|
|
or [di],al ;OR it onto tdata
|
|
inc di
|
|
inc bx
|
|
loop @@e2b
|
|
dec dx
|
|
jnz @@e2a
|
|
dec ah
|
|
jnz @@e2a0 ;do all 4 planes!
|
|
;
|
|
; Handle icons (foreground tiles)
|
|
;
|
|
@@e3:
|
|
mov bx,[tilei]
|
|
cmp bx,[lasticon]
|
|
ja @@eexit ;any icons?
|
|
cmp bx,[firsticon]
|
|
jbe @@eexit
|
|
|
|
shl bx,2
|
|
mov es,[XMSlookup]
|
|
mov ax,[es:bx]
|
|
mov [WORD PTR soff],ax
|
|
mov ax,[es:bx+2]
|
|
mov [WORD PTR soff+2],ax
|
|
|
|
mov ax,[bmlen]
|
|
mov [blen],ax ;set masked tile length for XMS copy
|
|
mov si,OFFSET blen
|
|
mov ah,11
|
|
call [DWORD XMSdriver] ;move tile into tdata1
|
|
;
|
|
; now we have the masked tile in "tdata1".
|
|
; time to mask it onto "tdata"
|
|
;
|
|
mov si,OFFSET tdata1
|
|
add si,[masklen] ;SI = masked tile's tiledata
|
|
mov di,OFFSET tdata ;DI = tile in "tdata"
|
|
mov ah,4
|
|
@@e3a0:
|
|
mov dx,[theight]
|
|
mov bx,OFFSET tdata1 ;BX = mask
|
|
@@e3a:
|
|
mov cx,[twidth]
|
|
@@e3b:
|
|
mov al,[bx] ;get mask byte
|
|
and [di],al ;and tdata with it
|
|
lodsb ;get tilem byte
|
|
or [di],al ;OR it onto tdata
|
|
inc di
|
|
inc bx
|
|
loop @@e3b
|
|
dec dx
|
|
jnz @@e3a
|
|
dec ah
|
|
jnz @@e3a0 ;do all 4 planes!
|
|
@@eexit:
|
|
pop di
|
|
pop si
|
|
ret
|
|
|
|
;
|
|
; Combine VGA tiles
|
|
;
|
|
LABEL CombineVGA PROC
|
|
|
|
shl [twidth],3
|
|
mov cx,[vmsize+bx-2]
|
|
mov [bmlen],cx
|
|
mov ax,[vsize+bx-2] ;get length of block to move
|
|
mov [blen],ax
|
|
sub cx,ax
|
|
mov [masklen],cx
|
|
|
|
;
|
|
; Handle the background tiles first!
|
|
;
|
|
mov ax,[tileb]
|
|
cmp ax,8000h ;solid color?
|
|
jb @@v1
|
|
neg ax
|
|
|
|
mov di,ds
|
|
mov es,di
|
|
mov di,OFFSET tdata
|
|
shl ax,4
|
|
mov bx,[blen]
|
|
shr bx,3
|
|
|
|
mov cx,bx
|
|
rep stosb
|
|
inc al
|
|
mov cx,bx
|
|
rep stosb
|
|
inc al
|
|
mov cx,bx
|
|
rep stosb
|
|
inc al
|
|
mov cx,bx
|
|
rep stosb
|
|
inc al
|
|
mov cx,bx
|
|
rep stosb
|
|
inc al
|
|
mov cx,bx
|
|
rep stosb
|
|
inc al
|
|
mov cx,bx
|
|
rep stosb
|
|
inc al
|
|
mov cx,bx
|
|
rep stosb
|
|
|
|
jmp SHORT @@v2
|
|
|
|
@@v1:
|
|
shl ax,2
|
|
mov bx,ax
|
|
mov es,[XMSlookup] ;(LONG SEG *)
|
|
mov ax,[es:bx]
|
|
mov [WORD PTR soff],ax
|
|
mov ax,[es:bx+2]
|
|
mov [WORD PTR soff+2],ax
|
|
cmp ax,-1 ;SPARSE TILE?
|
|
je @@v1a
|
|
|
|
mov ax,OFFSET tdata ;(quickie modification since "doff"
|
|
mov [WORD doff],ax ; should always point to "tdata1")
|
|
mov si,OFFSET blen
|
|
mov ah,11
|
|
call [DWORD XMSdriver] ;move tile into tdata1
|
|
mov ax,OFFSET tdata1
|
|
mov [WORD doff],ax ;ahhh....back to normal
|
|
|
|
jmp @@v2
|
|
;
|
|
; Copy sparse tile to tdata
|
|
;
|
|
@@v1a:
|
|
mov bx,[tsize]
|
|
shl bx,1
|
|
mov si,[Vsparse+bx-2]
|
|
mov di,OFFSET tdata
|
|
mov cx,[blen]
|
|
shr cx,1 ;for WORD copy
|
|
mov ax,ds
|
|
mov es,ax
|
|
rep movsw
|
|
|
|
;
|
|
; Handle foreground tiles
|
|
;
|
|
@@v2:
|
|
mov bx,[tilef]
|
|
cmp bx,0
|
|
je @@v3 ;any masked tile?
|
|
|
|
shl bx,2
|
|
mov es,[XMSlookup]
|
|
mov ax,[es:bx]
|
|
mov [WORD PTR soff],ax
|
|
mov ax,[es:bx+2]
|
|
mov [WORD PTR soff+2],ax
|
|
cmp ax,-1 ;SPARSE MASKED TILE?
|
|
je @@v3
|
|
|
|
mov ax,[bmlen]
|
|
mov [blen],ax ;set masked tile length for XMS copy
|
|
mov si,OFFSET blen
|
|
mov ah,11
|
|
call [DWORD XMSdriver] ;move tile into tdata1
|
|
;
|
|
; now we have the masked tile in "tdata1".
|
|
; time to mask it onto "tdata"
|
|
;
|
|
mov si,OFFSET tdata1
|
|
add si,[masklen] ;SI = masked tile's tiledata
|
|
mov di,OFFSET tdata ;DI = tile in "tdata"
|
|
|
|
mov dx,[theight]
|
|
mov bx,OFFSET tdata1 ;BX = mask
|
|
@@v2a:
|
|
mov cx,[twidth]
|
|
@@v2b:
|
|
mov al,[bx] ;get mask byte
|
|
and [di],al ;and tdata with it
|
|
lodsb ;get tilem byte
|
|
or [di],al ;OR it onto tdata
|
|
inc di
|
|
inc bx
|
|
loop @@v2b
|
|
dec dx
|
|
jnz @@v2a
|
|
;
|
|
; Handle icons (foreground tiles)
|
|
;
|
|
@@v3:
|
|
mov bx,[tilei]
|
|
cmp bx,[lasticon]
|
|
ja @@vexit ;any icons?
|
|
cmp bx,[firsticon]
|
|
jbe @@vexit
|
|
|
|
shl bx,2
|
|
mov es,[XMSlookup]
|
|
mov ax,[es:bx]
|
|
mov [WORD PTR soff],ax
|
|
mov ax,[es:bx+2]
|
|
mov [WORD PTR soff+2],ax
|
|
|
|
mov ax,[bmlen]
|
|
mov [blen],ax ;set masked tile length for XMS copy
|
|
mov si,OFFSET blen
|
|
mov ah,11
|
|
call [DWORD XMSdriver] ;move tile into tdata1
|
|
;
|
|
; now we have the masked tile in "tdata1".
|
|
; time to mask it onto "tdata"
|
|
;
|
|
mov si,OFFSET tdata1
|
|
add si,[masklen] ;SI = masked tile's tiledata
|
|
mov di,OFFSET tdata ;DI = tile in "tdata"
|
|
|
|
mov dx,[theight]
|
|
mov bx,OFFSET tdata1 ;BX = mask
|
|
@@v3a:
|
|
mov cx,[twidth]
|
|
@@v3b:
|
|
mov al,[bx] ;get mask byte
|
|
and [di],al ;and tdata with it
|
|
lodsb ;get tilem byte
|
|
or [di],al ;OR it onto tdata
|
|
inc di
|
|
inc bx
|
|
loop @@v3b
|
|
dec dx
|
|
jnz @@v3a
|
|
@@vexit:
|
|
pop di
|
|
pop si
|
|
ret
|
|
ENDP
|
|
|
|
|
|
;====================================================
|
|
;
|
|
; Draw a tile in any of the video modes
|
|
; NOTE: ONLY WORKS WITH TSIZE=2!
|
|
;
|
|
;====================================================
|
|
PUBLIC DrawTile
|
|
PROC DrawTile
|
|
ARG x:WORD,y:WORD,tsize:WORD
|
|
|
|
push si
|
|
push di
|
|
|
|
mov bx,[tsize]
|
|
shl bx,1
|
|
mov ah,[BYTE PTR hsize+bx-2]
|
|
mov [oldh],ah
|
|
mov cx,[wsize+bx-2]
|
|
|
|
mov bx,[videomode]
|
|
shl bx,1
|
|
mov dx,[DrawTable+bx]
|
|
|
|
mov bx,[y]
|
|
shl bx,1
|
|
jmp dx
|
|
|
|
label DrawTCGA proc
|
|
|
|
mov ax,0b800h
|
|
mov es,ax
|
|
mov si,OFFSET tdata
|
|
mov di,[x]
|
|
shl di,1
|
|
add di,[CGAlookup+bx]
|
|
mov bx,cx
|
|
shl bx,1
|
|
mov ah,[oldh]
|
|
@@c1:
|
|
mov cx,bx
|
|
rep movsb
|
|
sub di,bx
|
|
xor di,2000h
|
|
mov cx,bx
|
|
rep movsb
|
|
sub di,bx
|
|
xor di,2000h
|
|
add di,80
|
|
|
|
sub ah,2
|
|
jnz @@c1
|
|
|
|
pop di
|
|
pop si
|
|
ret
|
|
;
|
|
; EGA1/2/3 TILE DRAW ROUTINES
|
|
;
|
|
label DrawTEGA1 proc
|
|
mov [horzadd],38
|
|
mov di,[EGA1lookup+bx]
|
|
jmp SHORT DoDrawEGAT
|
|
label DrawTEGA2 proc
|
|
mov [horzadd],78
|
|
mov di,[EGA2lookup+bx]
|
|
jmp SHORT DoDrawEGAT
|
|
label DoDrawEGAT proc
|
|
add di,[x]
|
|
mov [oldy],di
|
|
mov si,OFFSET tdata
|
|
mov bx,0a000h
|
|
mov es,bx
|
|
mov bx,cx
|
|
;
|
|
; AH : height
|
|
; BX : width
|
|
; ES:DI : dest
|
|
; DS:SI : source
|
|
;
|
|
cld
|
|
mov dx,GCindex
|
|
mov al,GCmode
|
|
out dx,al
|
|
inc dx
|
|
mov al,0
|
|
out dx,al
|
|
;
|
|
; Plane 0
|
|
;
|
|
mov dx,SCindex
|
|
mov al,SCmapmask
|
|
out dx,al
|
|
inc dx
|
|
mov al,1
|
|
out dx,al
|
|
|
|
mov dx,[horzadd]
|
|
@@1:
|
|
mov cx,bx
|
|
rep movsb
|
|
add di,dx
|
|
dec ah
|
|
jne @@1
|
|
;
|
|
; Plane 1
|
|
;
|
|
mov dx,SCindex
|
|
mov al,SCmapmask
|
|
out dx,al
|
|
inc dx
|
|
mov al,2
|
|
out dx,al
|
|
|
|
mov dx,[horzadd]
|
|
mov di,[oldy]
|
|
mov ah,[oldh]
|
|
@@2:
|
|
mov cx,bx
|
|
rep movsb
|
|
add di,dx
|
|
dec ah
|
|
jne @@2
|
|
;
|
|
; Plane 2
|
|
;
|
|
mov dx,SCindex
|
|
mov al,SCmapmask
|
|
out dx,al
|
|
inc dx
|
|
mov al,4
|
|
out dx,al
|
|
|
|
mov dx,[horzadd]
|
|
mov di,[oldy]
|
|
mov ah,[oldh]
|
|
@@3:
|
|
mov cx,bx
|
|
rep movsb
|
|
add di,dx
|
|
dec ah
|
|
jne @@3
|
|
;
|
|
; Plane 3
|
|
;
|
|
mov dx,SCindex
|
|
mov al,SCmapmask
|
|
out dx,al
|
|
inc dx
|
|
mov al,8
|
|
out dx,al
|
|
|
|
mov dx,[horzadd]
|
|
mov di,[oldy]
|
|
mov ah,[oldh]
|
|
@@4:
|
|
mov cx,bx
|
|
rep movsb
|
|
add di,dx
|
|
dec ah
|
|
jne @@4
|
|
|
|
pop di
|
|
pop si
|
|
ret
|
|
|
|
label DrawTVGA proc
|
|
|
|
mov ax,0a000h
|
|
mov es,ax
|
|
mov si,OFFSET tdata
|
|
mov di,[x]
|
|
shl di,3
|
|
add di,[VGAlookup+bx]
|
|
mov bx,cx
|
|
shl bx,2
|
|
mov ah,[oldh]
|
|
@@v1:
|
|
mov cx,bx
|
|
rep movsw
|
|
add di,304
|
|
|
|
dec ah
|
|
jnz @@v1
|
|
|
|
pop di
|
|
pop si
|
|
ret
|
|
ENDP
|
|
|
|
;////////////////////////////////////////////////////////////////////
|
|
;
|
|
; TED5 screen scroll routines!
|
|
;
|
|
;////////////////////////////////////////////////////////////////////
|
|
PROC CopyCGA
|
|
PUBLIC CopyCGA
|
|
ARG srcx:WORD,srcy:WORD,width:WORD,height:WORD,destx:WORD,desty:WORD
|
|
USES si,di
|
|
push ds
|
|
|
|
mov ax,0b800h
|
|
mov es,ax
|
|
mov ds,ax
|
|
shl [width],1
|
|
shl [destx],1
|
|
shl [srcx],1
|
|
|
|
mov ax,[srcy]
|
|
cmp ax,[desty]
|
|
jb @@1
|
|
ja @@2
|
|
mov ax,[srcx]
|
|
cmp ax,[destx]
|
|
jb @@0
|
|
;
|
|
; Copy from sourcex to destx, right
|
|
;
|
|
mov dx,[height]
|
|
mov bx,[srcy] ;source & dest are the same!
|
|
shl bx,1
|
|
cld
|
|
|
|
@@aa:
|
|
mov si,[ss:CGAlookup+bx]
|
|
mov di,si
|
|
add si,[srcx]
|
|
add di,[destx]
|
|
mov cx,[width]
|
|
rep movsb
|
|
add bx,2
|
|
dec dx
|
|
jnz @@aa
|
|
jz @@exit
|
|
;
|
|
; Copy from end of sourcex to end of destx, left
|
|
;
|
|
@@0:
|
|
mov dx,[height]
|
|
mov bx,[srcy] ;source & dest are the same!
|
|
shl bx,1
|
|
|
|
@@0a0:
|
|
mov si,[ss:CGAlookup+bx]
|
|
mov di,si
|
|
add si,[srcx]
|
|
add si,[width]
|
|
dec si
|
|
add di,[destx]
|
|
add di,[width]
|
|
dec di
|
|
mov cx,[width]
|
|
std
|
|
rep movsb
|
|
cld
|
|
add bx,2
|
|
dec dx
|
|
jnz @@0a0
|
|
jz @@exit
|
|
;
|
|
; Copy from end of sourcey to end of desty, up
|
|
;
|
|
@@1:
|
|
mov ah,[BYTE height]
|
|
mov dl,[BYTE srcy]
|
|
add dl,ah
|
|
dec dl
|
|
mov dh,[BYTE desty]
|
|
add dh,ah
|
|
dec dh
|
|
cld
|
|
|
|
@@1a0:
|
|
mov bx,[srcy]
|
|
add bx,[height]
|
|
dec bx
|
|
shl bx,1
|
|
mov si,[ss:CGAlookup+bx]
|
|
mov bx,[desty]
|
|
add bx,[height]
|
|
dec bx
|
|
shl bx,1
|
|
mov di,[ss:CGAlookup+bx]
|
|
add si,[srcx]
|
|
add di,[destx]
|
|
mov cx,[width]
|
|
rep movsb
|
|
dec [height]
|
|
jnz @@1a0
|
|
jz @@exit
|
|
;
|
|
; Copy from sourcey to desty, down
|
|
;
|
|
@@2:
|
|
mov ah,[BYTE height]
|
|
mov dl,[BYTE srcy]
|
|
mov dh,[BYTE desty]
|
|
cld
|
|
|
|
@@2a0:
|
|
mov bx,[srcy]
|
|
shl bx,1
|
|
mov si,[ss:CGAlookup+bx]
|
|
mov bx,[desty]
|
|
shl bx,1
|
|
mov di,[ss:CGAlookup+bx]
|
|
add si,[srcx]
|
|
add di,[destx]
|
|
mov cx,[width]
|
|
rep movsb
|
|
inc [srcy]
|
|
inc [desty]
|
|
dec [height]
|
|
jnz @@2a0
|
|
jz @@exit
|
|
@@exit:
|
|
pop ds
|
|
ret
|
|
ENDP
|
|
|
|
|
|
PROC CopyEGA
|
|
PUBLIC CopyEGA
|
|
ARG srcx:WORD,srcy:WORD,width:WORD,height:WORD,destx:WORD,desty:WORD
|
|
USES si,di
|
|
push ds
|
|
|
|
mov dx,GCindex
|
|
mov ax,GCmode OR 100h
|
|
out dx,ax
|
|
|
|
mov ax,0a000h
|
|
mov es,ax
|
|
mov ds,ax
|
|
|
|
mov ax,[srcy]
|
|
cmp ax,[desty]
|
|
jb @@1
|
|
ja @@2
|
|
mov ax,[srcx]
|
|
cmp ax,[destx]
|
|
jb @@0
|
|
;
|
|
; Copy from sourcex to destx, right
|
|
;
|
|
mov dx,[height]
|
|
mov bx,[srcy] ;source & dest are the same!
|
|
shl bx,1
|
|
cld
|
|
|
|
cmp [ss:videomode],2
|
|
jb @@a
|
|
@@aa:
|
|
mov si,[ss:EGA2lookup+bx]
|
|
mov di,si
|
|
add si,[srcx]
|
|
add di,[destx]
|
|
mov cx,[width]
|
|
rep movsb
|
|
add bx,2
|
|
dec dx
|
|
jnz @@aa
|
|
jz @@exit
|
|
@@a:
|
|
mov si,[ss:EGA1lookup+bx]
|
|
mov di,si
|
|
add si,[srcx]
|
|
add di,[destx]
|
|
mov cx,[width]
|
|
rep movsb
|
|
add bx,2
|
|
dec dx
|
|
jnz @@a
|
|
jz @@exit
|
|
;
|
|
; Copy from end of sourcex to end of destx, left
|
|
;
|
|
@@0:
|
|
mov dx,[height]
|
|
mov bx,[srcy] ;source & dest are the same!
|
|
shl bx,1
|
|
|
|
cmp [ss:videomode],2
|
|
jb @@0a
|
|
@@0a0:
|
|
mov si,[ss:EGA2lookup+bx]
|
|
mov di,si
|
|
add si,[srcx]
|
|
add si,[width]
|
|
dec si
|
|
add di,[destx]
|
|
add di,[width]
|
|
dec di
|
|
mov cx,[width]
|
|
std
|
|
rep movsb
|
|
cld
|
|
add bx,2
|
|
dec dx
|
|
jnz @@0a0
|
|
jz @@exit
|
|
@@0a:
|
|
mov si,[ss:EGA1lookup+bx]
|
|
mov di,si
|
|
add si,[srcx]
|
|
add si,[width]
|
|
dec si
|
|
add di,[destx]
|
|
add di,[width]
|
|
dec di
|
|
mov cx,[width]
|
|
std
|
|
rep movsb
|
|
cld
|
|
add bx,2
|
|
dec dx
|
|
jnz @@0a
|
|
jz @@exit
|
|
;
|
|
; Copy from end of sourcey to end of desty, up
|
|
;
|
|
@@1:
|
|
mov ah,[BYTE height]
|
|
mov dl,[BYTE srcy]
|
|
add dl,ah
|
|
dec dl
|
|
mov dh,[BYTE desty]
|
|
add dh,ah
|
|
dec dh
|
|
cld
|
|
|
|
cmp [ss:videomode],2
|
|
jb @@1a
|
|
@@1a0:
|
|
mov bx,[srcy]
|
|
add bx,[height]
|
|
dec bx
|
|
shl bx,1
|
|
mov si,[ss:EGA2lookup+bx]
|
|
mov bx,[desty]
|
|
add bx,[height]
|
|
dec bx
|
|
shl bx,1
|
|
mov di,[ss:EGA2lookup+bx]
|
|
add si,[srcx]
|
|
add di,[destx]
|
|
mov cx,[width]
|
|
rep movsb
|
|
dec [height]
|
|
jnz @@1a0
|
|
jz @@exit
|
|
@@1a:
|
|
mov bl,dl
|
|
xor bh,bh
|
|
shl bx,1
|
|
mov si,[ss:EGA1lookup+bx]
|
|
mov bl,dh
|
|
xor bh,bh
|
|
shl bx,1
|
|
mov di,[ss:EGA1lookup+bx]
|
|
add si,[srcx]
|
|
add di,[destx]
|
|
mov cx,[width]
|
|
rep movsb
|
|
dec dl
|
|
dec dh
|
|
dec ah
|
|
jnz @@1a
|
|
jz @@exit
|
|
;
|
|
; Copy from sourcey to desty, down
|
|
;
|
|
@@2:
|
|
mov ah,[BYTE height]
|
|
mov dl,[BYTE srcy]
|
|
mov dh,[BYTE desty]
|
|
cld
|
|
|
|
cmp [ss:videomode],2
|
|
jb @@2a
|
|
@@2a0:
|
|
mov bx,[srcy]
|
|
shl bx,1
|
|
mov si,[ss:EGA2lookup+bx]
|
|
mov bx,[desty]
|
|
shl bx,1
|
|
mov di,[ss:EGA2lookup+bx]
|
|
add si,[srcx]
|
|
add di,[destx]
|
|
mov cx,[width]
|
|
rep movsb
|
|
inc [srcy]
|
|
inc [desty]
|
|
dec [height]
|
|
jnz @@2a0
|
|
jz @@exit
|
|
@@2a:
|
|
mov bl,dl
|
|
xor bh,bh
|
|
shl bx,1
|
|
mov si,[ss:EGA1lookup+bx]
|
|
mov bl,dh
|
|
xor bh,bh
|
|
shl bx,1
|
|
mov di,[ss:EGA1lookup+bx]
|
|
add si,[srcx]
|
|
add di,[destx]
|
|
mov cx,[width]
|
|
rep movsb
|
|
inc dl
|
|
inc dh
|
|
dec ah
|
|
jnz @@2a
|
|
@@exit:
|
|
pop ds
|
|
ret
|
|
ENDP
|
|
|
|
PROC CopyVGA
|
|
PUBLIC CopyVGA
|
|
ARG srcx:WORD,srcy:WORD,width:WORD,height:WORD,destx:WORD,desty:WORD
|
|
USES si,di
|
|
push ds
|
|
|
|
mov ax,0a000h
|
|
mov es,ax
|
|
mov ds,ax
|
|
shl [width],3
|
|
shl [destx],3
|
|
shl [srcx],3
|
|
|
|
mov ax,[srcy]
|
|
cmp ax,[desty]
|
|
jb @@1
|
|
ja @@2
|
|
mov ax,[srcx]
|
|
cmp ax,[destx]
|
|
jb @@0
|
|
;
|
|
; Copy from sourcex to destx, right
|
|
;
|
|
mov dx,[height]
|
|
mov bx,[srcy] ;source & dest are the same!
|
|
shl bx,1
|
|
cld
|
|
|
|
@@aa:
|
|
mov si,[ss:VGAlookup+bx]
|
|
mov di,si
|
|
add si,[srcx]
|
|
add di,[destx]
|
|
mov cx,[width]
|
|
rep movsb
|
|
add bx,2
|
|
dec dx
|
|
jnz @@aa
|
|
jz @@exit
|
|
;
|
|
; Copy from end of sourcex to end of destx, left
|
|
;
|
|
@@0:
|
|
mov dx,[height]
|
|
mov bx,[srcy] ;source & dest are the same!
|
|
shl bx,1
|
|
|
|
@@0a0:
|
|
mov si,[ss:VGAlookup+bx]
|
|
mov di,si
|
|
add si,[srcx]
|
|
add si,[width]
|
|
dec si
|
|
add di,[destx]
|
|
add di,[width]
|
|
dec di
|
|
mov cx,[width]
|
|
std
|
|
rep movsb
|
|
cld
|
|
add bx,2
|
|
dec dx
|
|
jnz @@0a0
|
|
jz @@exit
|
|
;
|
|
; Copy from end of sourcey to end of desty, up
|
|
;
|
|
@@1:
|
|
mov ah,[BYTE height]
|
|
mov dl,[BYTE srcy]
|
|
add dl,ah
|
|
dec dl
|
|
mov dh,[BYTE desty]
|
|
add dh,ah
|
|
dec dh
|
|
cld
|
|
|
|
@@1a0:
|
|
mov bx,[srcy]
|
|
add bx,[height]
|
|
dec bx
|
|
shl bx,1
|
|
mov si,[ss:VGAlookup+bx]
|
|
mov bx,[desty]
|
|
add bx,[height]
|
|
dec bx
|
|
shl bx,1
|
|
mov di,[ss:VGAlookup+bx]
|
|
add si,[srcx]
|
|
add di,[destx]
|
|
mov cx,[width]
|
|
rep movsb
|
|
dec [height]
|
|
jnz @@1a0
|
|
jz @@exit
|
|
;
|
|
; Copy from sourcey to desty, down
|
|
;
|
|
@@2:
|
|
mov ah,[BYTE height]
|
|
mov dl,[BYTE srcy]
|
|
mov dh,[BYTE desty]
|
|
cld
|
|
|
|
@@2a0:
|
|
mov bx,[srcy]
|
|
shl bx,1
|
|
mov si,[ss:VGAlookup+bx]
|
|
mov bx,[desty]
|
|
shl bx,1
|
|
mov di,[ss:VGAlookup+bx]
|
|
add si,[srcx]
|
|
add di,[destx]
|
|
mov cx,[width]
|
|
rep movsb
|
|
inc [srcy]
|
|
inc [desty]
|
|
dec [height]
|
|
jnz @@2a0
|
|
jz @@exit
|
|
@@exit:
|
|
pop ds
|
|
ret
|
|
ENDP
|
|
|
|
;////////////////////////////////////////////////////////////////////
|
|
;
|
|
; OVERLAY routine
|
|
;
|
|
;////////////////////////////////////////////////////////////////////
|
|
PROC Overlay
|
|
PUBLIC Overlay
|
|
ARG tsize:WORD
|
|
|
|
push di
|
|
push si
|
|
|
|
mov di,OFFSET tdata
|
|
mov bx,[tsize]
|
|
shl bx,1
|
|
mov si,[videomode]
|
|
shl si,1
|
|
mov ax,[OverTable+si]
|
|
jmp ax
|
|
|
|
LABEL OverlayCGA PROC
|
|
|
|
mov cx,[csize+bx-2]
|
|
shr cx,1
|
|
mov si,[Csparse+bx-2]
|
|
@@c1: lodsw
|
|
or [di],ax
|
|
add di,2
|
|
loop @@c1
|
|
|
|
pop si
|
|
pop di
|
|
ret
|
|
|
|
LABEL OverlayEGA PROC
|
|
|
|
mov cx,[esize+bx-2]
|
|
shr cx,1
|
|
mov si,[Esparse+bx-2]
|
|
@@e1: lodsw
|
|
or [di],ax
|
|
add di,2
|
|
loop @@e1
|
|
|
|
pop si
|
|
pop di
|
|
ret
|
|
|
|
LABEL OverlayVGA PROC
|
|
|
|
mov cx,[vsize+bx-2]
|
|
shr cx,1
|
|
mov si,[Vsparse+bx-2]
|
|
@@v1: lodsw
|
|
or [di],ax
|
|
add di,2
|
|
loop @@v1
|
|
|
|
pop si
|
|
pop di
|
|
ret
|
|
|
|
ENDP
|
|
|
|
END |