;\ \ \ // / /\ \/ Vyhen (The Furrrnace) ; \ \ \/ /\ \/ /\ \ a 100-byte intrrro ; \/ / / / /\ \ \/ by Rrrola ;grrreets to everrryone who loves the smell of napalm in the morrrning ; VERSION R G B H I S L F C W COLORANT ; CuCl2 8 2 0 0 -32 5 addsp+ror2 sub add xchg copper(II) chloride ; CH3CH2OH 4 4 2 0 -28 5 imul5+inc sub mov xchg ethyl alcohol ; Li2CO3 0 3 2 0 12 6 imul91+inc sub or xchg lithium carbonate ; Na2B4O7 1 0 3 -16 -14 6 imul53+inc sbb mov mov borax ; NaCl 0 1 5 6 0 6 addbx+ror1 sbb mov mov table salt ; vyhen 0 1 3 0 -32 5 addbx sub mov xchg blackbody radiation R equ 0 ; palette shifts (color of the flame) G equ 1 B equ 3 H equ 0 ; minimum smoke heat I equ -32; heat increment S equ 5 ; heat shift (5 or 6) org 100h ; assume ah=bx=0 si=100h sp=-2 ;Initializtion mov al,13h int 10h les bp,[bx] ; bp = 20CD, es ~ A000 (we don't care ;-)) ;Palette pop ax ; sp = 0 mov dx,3C8h out dx,al inc dx ; dx stays 0x3C9 P mov cx,R+16 | G+16<<5 | B+16<<10 ; cx = 01bbbb1gggg1rrrr push sp push sp ; sp stays -1024 = 0xFC00 Q shrd ax,bx,cl cmp al,63 jb O mov al,63 ; ax = min(63, palIndex>>[R|G|B]) O out dx,al shr cx,5 jnz Q inc bl jnz P ; bl = palIndex = 0..255 ;Main loop M mov bx,dx ; bx = adr L add bp,bx ; bp = parabola (flickering flames) ;ror bp,1 ;>S sub al,bh shr ax,S ; sets zero flag imul di,ax,320 jz Z ; if (raise == 0) R = 0; else R = [adr+320*raise-1] mov al,[bx+di] Z inc bx mov ch,[bx] jnz L mov di,sp ; screen copy (0x0100->0xFC00) mov ch,40h rep movsd in al,60h dec ax ; ah=0 from shifting jnz M push ax ret