;--- BEGIN ---------------------------------------------------;
BITS 16
ORG 0100h
;--- CODE ----------------------------------------------------;
SEGMENT .text
;--- Main ----------------------------------------------------;
Main: mov ax, cs ; find DATA segment
mov ds, ax ; assign to ds register
mov ax, 0b800h ; ASSUMES COLOR VGA 80x25 TEXT
mov es, ax
xor ax, ax
xor bx, bx
xor cx, cx
xor dx, dx
; mov si, 0
;.Cloop:mov [byte prebuf+si], 32
; mov [byte postbuf+si], 32
; inc si
; cmp si, 162
; jne .Cloop
mov si, 0
mov di, 0
.L1: mov al, [es:di] ; get pixel at pt
cmp al, 32
je .Off
.On: call Neighbours
cmp al, 2
je .Life
cmp al, 3
je .Life
.Deth: mov [cabuf+si], byte 32 ; stick zero in lifebuf
jmp .Cont
.Off: call Neighbours
cmp al, 3
jne .Deth
mov [cabuf+si], byte 32
.Life: inc byte [cabuf+si] ; inc lifebuf
cmp [cabuf+si], byte 31
jne .Cont
dec byte [cabuf+si] ; inc lifebuf
.Cont: inc di
inc di
inc si
cmp si, 2000
jne .L1
; now, is there a keypress outstanding?
mov ah, 1
int 16h
jnz .Exit
; no... update screen and repeat
mov di, 0
mov si, 0
.L2: mov al, [cabuf+si]
mov [es:di], al
inc di
inc di
inc si
cmp si, 2000
jne .L2
mov di, 0
mov si, 0
jmp .L1
.Exit: ;mov ax, 4c00h
;int 21h
retf
;--- Neighbours ----------------------------------------------;
Neighbours:
; di = position in es where pixel is
; al = returned: number of 'on' neighbours
; sum significant bits of: di-1 di+1
; di-321 di-320 di-319
; di+319 di+320 di+321
xor ax, ax
cmp [es:di-2], byte 32
je .N1
inc al
.N1: cmp [es:di+2], byte 32
je .N2
inc al
.N2: cmp [es:di-162], byte 32
je .N3
inc al
.N3: cmp [es:di-160], byte 32
je .N4
inc al
.N4: cmp [es:di-158], byte 32
je .N5
inc al
.N5: cmp [es:di+158], byte 32
je .N6
inc al
.N6: cmp [es:di+160], byte 32
je .N7
inc al
.N7: cmp [es:di+162], byte 32
je .N8
inc al
.N8: ret
;--- DATA ----------------------------------------------------;
SEGMENT .bss
cabuf: RESB 2000