;---------------------------------------------------------------------
; FADE - Clear screen by fading out, 78 bytes! - Tylisha C. Andersen
;---------------------------------------------------------------------
.model tiny
.code
.186
org 100h
;---------------------------------------------------------------------
main: mov bp, 300h ; bp = 300h (number of bytes, buffer offset)
;
call vret ; wait for vertical retrace
mov di, bp ; di = buffer
mov dl, 0C7h ; dx = DAC read select port
xor al, al ; select DAC register 0
out dx, al ;
mov dl, 0C9h ; dx = DAC data port
mov cx, bp ; read 768 bytes from the DAC data port into
rep insb ; the buffer (read the original palette)
;
mov bx, 63 ; 63 iterations always clear all colors
m_1: mov si, bp ; si, di = buffer
mov di, bp ;
mov cx, bp ; for each of 768 data bytes:
;
m_2: lodsb ; load byte
cmp al, 1 ; if it's greater than zero, reduce it by 1
adc al, -1 ;
stosb ; store byte
loop m_2 ; loop
;
mov cl, 4 ; wait for vertical retrace 4 times
m_3: call vret ; for a delay of about 0.06 seconds
loop m_3 ;
mov si, bp ; si = buffer
mov dl, 0C8h ; dx = DAC write select port
xor al, al ; select DAC register 0
out dx, al ;
inc dx ; dx = DAC data port
mov cx, bp ; send 768 bytes from the buffer to the DAC
rep outsb ; data port (set the current palette)
;
dec bx ; loop
jnz m_1 ;
;
mov ax, 3 ; set video mode 3 (clears the screen)
int 10h ;
ret ; return
;---------------------------------------------------------------------
vret: mov dx, 03DAh ; dx = IS1 port, waiting for retrace
v_1: in al, dx ; wait for bit 3 to go off (active period)
test al, 8 ;
jnz v_1 ;
v_2: in al, dx ; wait for bit 3 to come on (retrace period)
test al, 8 ;
jz v_2 ;
ret ; return
end main