View Source Document

belife.s

;--- 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