; Life simulator, 72 bytes - Tenie Remmel
; If no args, regs on startup are:
; AX = BX = 0000h
; SI = IP = 0100h
; DI = SP = FFFEh
Ideal
Model Tiny
P386
CodeSeg
Org 100h
Start: mov al,13h ;Set mode 13h
int 10h
mov ds,ax ;Seed RNG with clock
mov ax,[033Ch]
push 09000h ;DS = last 64K segment
pop ds
push 0A000h ;ES = video memory
pop es
;BX is already zero
RandLoop: add ax,ax ;Generate random number
setc [bx]
jnc RandSkip
xor al,45
RandSkip: dec bx
jnz RandLoop
; BX will not be equal to 3 the first time this loop is executed, but
; it will be for all other times. As SI = 0100h and DI = FFFEh on
; startup, SI - DI will be equal to 258.
LifeLoop: xchg cx,ax
AccLoop: add cl,[di+bx-64] ;Add in this column
add cl,[si+bx-2]
add cl,[si+bx+318]
dec bx ;Loop back
jnz AccLoop
mov al,[si] ;Get center cell, set pixel
stosb
stc ;3 = birth, 4 = stay (tricky):
rcr al,cl ; 1.00?0000x --> 0.0x100?00 (rcr 3)
and al,20h ; ^carry | ^
; +---> 0.00x100?0 (rcr 4)
or [si],al ;Add in new cell ^
shr [byte di-65],5 ;Shift previous value
mov bl,3 ;3 iterations in AccLoop
inc si ;Loop while not zero
jnz LifeLoop
mov ah,1 ;Check for key
int 16h
jz LifeLoop ;Loop if no key
xchg ax,bx ;Set text mode
int 10h
ret ;Return
End Start