; This was my submission for the 1996 EFNet #coders 256-byte fire competition
; Obviously it was targeted toward 16-bit realmode DOS.
.model tiny
.386
.data
cnt dw 0 ;this is for timing the ending clear
fireof dw 81 ;this is for the ending clear
rand1 dw 1234h
rand2 dw 4321h
pad dd 0 ;pad it to 256 bytes
.code
org 100h
main proc
start:
;;;set the video mode;;;
mov ax,13h
int 10h
mov dx,3c4h
mov ax,604h
out dx,ax
mov ax,0f02h
out dx,ax
mov dx,3d4h
mov ax,14h
out dx,ax
mov ax,0e317h
out dx,ax
mov al,9
out dx,al
inc dx
in al,dx
and al,0e0h
add al,7
out dx,al
;;;set the palette;;;
mov dx,3c8h
xor ax,ax
out dx,al
inc dx
mov cx,128
pallp:
push ax
shr al,1
out dx,al
shr al,2
out dx,al
shr al,1
out dx,al
pop ax
inc al
loop pallp
push 0a000h
pop es
;;;main loop;;;
firelp:
mov cx,4399
mov di,80
bufr1:
mov ax,es:[di-1] ;angle the flame
add al,ah
shr al,1 ;average top two
mov bx,es:[di+80]
add bl,bh
shr bl,1 ;average bottom two
add al,bl
shr al,1 ;average top/bottom
jz bufr2
dec al
jz bufr2
dec al
bufr2:
mov bx,di
sub bx,fireof
mov es:[bx],al
inc di
loop bufr1
cmp cnt,0
jg blowflame
mov ah,1
int 16h
jz ok
inc cnt
ok:
xor dl,dl
mov di,4320
mov cx,80
newline:
;;;get random;;;
in al,40h
add ax,rand1
mov bx,ax
add ax,rand2
mov rand2,bx
xchg al,ah
mov rand1,ax
and al,1
dec al
mov dl,al
mov es:[di],dl
mov es:[di+80],dl
inc di
loop newline
jmp doloop
blowflame:
inc cnt
cmp cnt,50 ;kill flame?
jge killflame
dec fireof
jmp doloop
killflame:
xor ax,ax
mov di,4320
mov cx,80
fllp:
mov es:[di],ax
add di,2
dec cx
jne fllp
doloop:
mov dx,3dah
vt: in al,dx
test al,8
jnz vt
nvt: in al,dx
test al,8
jz nvt
cmp cnt,60 ;quit?
jne firelp
mov ax,3
int 10h
mov ax,4c00h
int 21h
main endp
end start