110 lines
1.3 KiB
NASM
110 lines
1.3 KiB
NASM
; ID_VL.ASM
|
|
|
|
IDEAL
|
|
MODEL MEDIUM,C
|
|
|
|
INCLUDE 'ID_VL.EQU'
|
|
|
|
SCREENSEG = 0a000h
|
|
|
|
UPDATEWIDE = 20
|
|
UPDATEHIGH = 13
|
|
|
|
DATASEG
|
|
|
|
|
|
EXTRN bufferofs :WORD
|
|
EXTRN displayofs :WORD
|
|
EXTRN ylookup :WORD
|
|
EXTRN linewidth :WORD
|
|
EXTRN blockstarts :WORD ;offsets from drawofs for each update block
|
|
|
|
EXTRN update :BYTE
|
|
|
|
CODESEG
|
|
|
|
|
|
;=================
|
|
;
|
|
; VH_UpdateScreen
|
|
;
|
|
;=================
|
|
|
|
PROC VH_UpdateScreen
|
|
PUBLIC VH_UpdateScreen
|
|
USES si,di
|
|
|
|
mov dx,SC_INDEX
|
|
mov ax,SC_MAPMASK+15*256
|
|
out dx,ax
|
|
|
|
mov dx,GC_INDEX
|
|
mov al,GC_MODE
|
|
out dx,al
|
|
|
|
inc dx
|
|
in al,dx
|
|
and al,252
|
|
or al,1
|
|
out dx,al
|
|
|
|
mov bx,UPDATEWIDE*UPDATEHIGH-1 ; bx is the tile number
|
|
mov dx,[linewidth]
|
|
|
|
;
|
|
; see if the tile needs to be copied
|
|
;
|
|
@@checktile:
|
|
test [update+bx],1
|
|
jnz @@copytile
|
|
@@next:
|
|
dec bx
|
|
jns @@checktile
|
|
|
|
;
|
|
; done
|
|
;
|
|
mov dx,GC_INDEX+1
|
|
in al,dx
|
|
and al,NOT 3
|
|
or al,0
|
|
out dx,al
|
|
ret
|
|
|
|
;
|
|
; copy a tile
|
|
;
|
|
@@copytile:
|
|
mov [update+bx],0
|
|
shl bx,1
|
|
mov si,[blockstarts+bx]
|
|
shr bx,1
|
|
mov di,si
|
|
add si,[bufferofs]
|
|
add di,[displayofs]
|
|
|
|
mov ax,SCREENSEG
|
|
mov ds,ax
|
|
|
|
REPT 16
|
|
mov al,[si]
|
|
mov [di],al
|
|
mov al,[si+1]
|
|
mov [di+1],al
|
|
mov al,[si+2]
|
|
mov [di+2],al
|
|
mov al,[si+3]
|
|
mov [di+3],al
|
|
add si,dx
|
|
add di,dx
|
|
ENDM
|
|
|
|
mov ax,ss
|
|
mov ds,ax
|
|
jmp @@next
|
|
|
|
ENDP
|
|
|
|
|
|
END
|
|
|