Thanks gentlemen.
I will study and use what looks appropriate for the code.
Andy
; life.asm By Vladislav Kaipetsky and Tenie Remmel
; Tasm code
.model small
.586
.stack 200h
.data
Vesa_Err db "Can not set Vesa mode !",0
.code
Start:
SETUP101: ; Initialize for mode 101, 640 x 480 x 256 colors
mov ax,@data
mov ds,ax
MOV AH,4FH ; VESA functions
MOV AL,2 ; Set Video mode
MOV BX,101h ; = video mode
INT 10H
; Should check for success/failure here
CMP AX,4FH ; AL = 4FH, AH = 0 for success
JNZ SET101
jmp Next
SET101:
;CALL RESET_VID
MOV DX,OFFSET VESA_ERR
;print error message and exit
mov ah,9
int 21h
mov ax,4c00h
int 21h
next:
mov ds,ax ;DS = 13h
mov ebx,[033Ch] ;Seed RNG with clock
mov ax,cs ;DS, ES = virtual video
add ah,10h
mov ds,ax
mov es,ax
xor cx,cx ;64K bytes
RandLoop: add ebx,ebx ;Generate random number
jnc RandSkip
xor bl,197
stc
RandSkip: sbb al,al ;Mask for 0 or 15
and al,15
stosb ;Store byte
loop RandLoop ;Loop back
push 0A000h ;ES = video memory
pop es
MainLoop: mov si,320 ;Display this frame
push si
xor di,di
mov cx,32000
rep movsw
mov cx,64000 ;Set up for LifeLoop
pop di
LifeLoop: mov ax,-1 ;Get boundary count
sub al,[di-1]
sub ah,[di+1]
sub al,[di-321]
sub ah,[di+319]
sub ax,[di-320]
sub ax,[di+320]
add al,ah
and al,0Fh
cmp al,1 ;2 = stay, 3 = birth
jl LifeStay ;any other = death
jg LifeLB ;actual value is 2 less
or [byte di],10h ;Birth: add 10h
jmp LifeLB
LifeStay: mov al,[di] ;Stay: add 10h if it's on
add al,al
or [di],al
LifeLB: inc di ;Loop back
loop LifeLoop
CleanLoop: mov al,[di] ;Get pixel
and al,10h ;10h, 1Fh -> 0Fh
cmp al,1 ;00h, 0Fh -> 00h
adc al,-1
mov [di],al ;Set pixel
inc di ;Loop back
loop CleanLoop
mov ah,1 ;Check for key
int 16h
jz MainLoop ;Loop if no key
mov ax,3 ;Set text mode
int 10h
ret ;Return
End Start