; Fire simulation, good for demos - by Tenie Remmel
Ideal
Model Tiny
P386
CodeSeg
Org 100h
Proc Fire
mov ax,13h ;Set video mode 13h
int 10h
mov dx,03D4h ;Set bigger pixels
mov ax,4209h
out dx,ax
mov di,offset PalDB ;Set last part of palette
mov al,03Fh
mov cx,528
rep stosb
mov dx,3c8h ;Set custom palette
xor al,al
out dx,al
inc dx
mov cx,768
mov si,offset Pal
rep outsb
mov ax,cs ;Get extra segments
add ax,1000h
mov fs,ax
add ax,1000h
mov gs,ax
push fs ;Clear frame 1
pop es
xor di,di
xor eax,eax
mov cx,10560
rep stosd
push gs ;Clear frame 2
pop es
xor di,di
mov cx,10560
rep stosd
MainLoop: push fs gs ;DS = frame 1
pop es ds ;ES = frame 2
mov si,321 ;SI = (1, 1), DI = (1, 0)
mov di,1 ;this makes it move up
mov cx,41918 ;CX = count
CalcLoop: mov al,[si] ;AX = average of the four
xor ah,ah ;surrounding pixels
add al,[si+319]
adc ah,0
add al,[si+320]
adc ah,0
add al,[si+321]
adc ah,0
shr ax,2
cmp ax,1 ;Decrement if it isn't zero
adc ax,-1
stosb ;Write pixel
inc si ;Advance pointer
dec cx ;Loop back
jnz CalcLoop
mov di,41600 ;DI = 3rd-to-last row
mov cx,320 ;320 pixels
mov eax,[cs:RandNum] ;EAX = random number
RandLoop1: imul eax,69069 ;Set top row random pixel
inc eax
mov bl,ah
and bl,31
add bl,50
mov [es:di-320],bl
imul eax,69069 ;Set middle row random pixel
inc eax
mov bl,ah
and bl,31
add bl,70
mov [es:di],bl
imul eax,69069 ;Set bottom row random pixel
inc eax
mov bl,ah
and bl,31
add bl,100
mov [es:di+320],bl
inc di ;Next pixel
loop RandLoop1 ;Loop back
imul eax,69069 ;CL = random value
inc eax
mov cl,al
and cx,15
mov si,41600 ;SI = 3rd-to-last row
RandLoop2: imul eax,69069 ;Get random number
inc eax
push ax ;DI = random position
xor dx,dx ;from 0 to 320
mov bx,320
div bx
mov di,dx
pop ax
add di,si
xor bl,bl ;BL = 0FFh
dec bl
mov [es:di-319],bl ;Draw a 3x3 square
mov [es:di-320],bl
mov [es:di-321],bl
mov [es:di-1],bl
mov [es:di],bl
mov [es:di+1],bl
mov [es:di+319],bl
mov [es:di+320],bl
mov [es:di+321],bl
loop RandLoop2 ;Loop back
mov [cs:RandNum],eax ;Save random number
push 0A000h gs ;ES = 0A000h
pop ds es ;DS = frame 2
xor si,si ;Set up for blit
xor di,di
mov cx,10560 ;132 lines
rep movsd
push fs gs ;Swap frames
pop fs gs
mov ah,1 ;Check for a key
int 16h
jz MainLoop ;Loop back
xor ah,ah ;Eat the key
int 16h
mov ax,3 ;Restore video mode
int 10h
ret ;Return
RandNum dd 0 ;Random number
EndP Fire
;************* Custom palette
Pal db 0,0,0,0,0,2,0,0,4,0,0,6,0,0,8,0,0,10,0,0,12,0,0,14
db 0,0,16,2,0,14,4,0,12,6,0,10,8,0,8,10,0,6,12,0,4,14
db 0,2,16,0,0,19,0,0,22,0,0,25,0,0,28,0,0,31,0,0,34,0,0
db 37,0,0,39,0,0,42,0,0,45,0,0,48,0,0,51,0,0,54,0,0,57
db 0,0,60,0,0,63,0,0,63,2,0,63,5,0,63,7,0,63,10,0,63,13
db 0,63,15,0,63,18,0,63,21,0,63,23,0,63,26,0,63,28,0,63
db 31,0,63,34,0,63,36,0,63,39,0,63,42,0,63,44,0,63,47,0
db 63,49,0,63,52,0,63,55,0,63,57,0,63,60,0,63,63,0,63
db 63,2,63,63,5,63,63,7,63,63,10,63,63,13,63,63,15,63
db 63,18,63,63,21,63,63,23,63,63,26,63,63,28,63,63,31
db 63,63,34,63,63,36,63,63,39,63,63,42,63,63,44,63,63
db 47,63,63,49,63,63,52,63,63,55,63,63,57,63,63,60
PalDB db 528 dup(?) ;Last part of palette
End Fire