forked from KolibriOS/kolibrios
6c508d6aa3
git-svn-id: svn://kolibrios.org@1775 a494cfbc-eb01-0410-851d-a64ba20cac60
191 lines
4.0 KiB
NASM
191 lines
4.0 KiB
NASM
;
|
|
; LIFE.ASM
|
|
;
|
|
; This program displays Conways game of life
|
|
;
|
|
; Compile with FASM for Menuet;
|
|
;
|
|
;
|
|
; Version 0.1 30th March 2004
|
|
; Mike Hibbett
|
|
;
|
|
; Version 0.2 23th May 2004
|
|
; Random generation dots with start
|
|
;
|
|
; Convert to ASCL Libary by Pavlushin Evgeni
|
|
;
|
|
; This is an experiment to see how small a usefull application can get
|
|
;
|
|
|
|
use32
|
|
org 0x0
|
|
|
|
db 'MENUET01' ; 8 byte id
|
|
dd 0x01 ; header version
|
|
dd START ; start of code
|
|
dd I_END ; size of image
|
|
dd 0x100000 ; memory for app
|
|
dd 0x100000 ; esp
|
|
dd 0x0 , 0x0 ; I_Param , I_Icon
|
|
include 'ascl.inc'
|
|
|
|
macro setcell x,y { mov [esi + 512*(y)*3 + (x)*3], al }
|
|
|
|
START:
|
|
|
|
mov al, 0xFF
|
|
mov esi, I_END
|
|
|
|
; This is the seed pattern.
|
|
|
|
; Life needs a seed pattern, which is 'hardcode' at compile time
|
|
; The grid is 512 wide (x direction) by 512 deep (y direction)
|
|
; setcell take the arguments setcell x,y
|
|
; 0,0 is the top left corner.
|
|
|
|
setcell 200,120
|
|
setcell 201,120
|
|
setcell 200,121
|
|
setcell 199,121
|
|
setcell 200,122
|
|
|
|
setcell 70,120
|
|
setcell 71,120
|
|
setcell 70,121
|
|
setcell 69,121
|
|
setcell 70,122
|
|
|
|
call draw_window
|
|
|
|
;Random generation dots
|
|
|
|
mov ecx,20000
|
|
xxx:
|
|
push ecx
|
|
random 30000,edi ;up pice of screen
|
|
mov al,0xff
|
|
shl edi,3
|
|
; mov [I_END+edi],al
|
|
; random 50000,edi ;down pice of screen
|
|
; mov al,0xff
|
|
; shl edi,3
|
|
add edi,512*460 ;760
|
|
mov [I_END+edi],al
|
|
pop ecx
|
|
dec ecx
|
|
jnz xxx
|
|
|
|
still:
|
|
|
|
timeevent 5,nokey,red,key,button ;Wait EVENT with 5 fps
|
|
jmp still
|
|
|
|
red: ; REDRAW WINDOW
|
|
call draw_window
|
|
jmp still
|
|
|
|
key: ; KEY
|
|
mov eax,2 ; get it, but ignore
|
|
int 0x40
|
|
|
|
nokey:
|
|
|
|
; cycle life state
|
|
|
|
mov esi, I_END + 512*3
|
|
|
|
mov al, 0xFF
|
|
|
|
lifeloop:
|
|
mov ah, 0
|
|
cmp [esi - 3], al
|
|
jne t2
|
|
inc ah
|
|
t2:
|
|
cmp [esi + 3], al
|
|
jne t3
|
|
inc ah
|
|
t3:
|
|
cmp [esi - 512*3], al
|
|
jne t4
|
|
inc ah
|
|
t4:
|
|
cmp [esi + 512*3], al
|
|
jne t5
|
|
inc ah
|
|
t5:
|
|
cmp [esi - 512*3 - 3], al
|
|
jne t6
|
|
inc ah
|
|
t6:
|
|
cmp [esi - 512*3 + 3], al
|
|
jne t7
|
|
inc ah
|
|
t7:
|
|
cmp [esi + 512*3 - 3], al
|
|
jne t8
|
|
inc ah
|
|
t8:
|
|
cmp [esi + 512*3 + 3], al
|
|
jne tend
|
|
inc ah
|
|
|
|
tend:
|
|
; If cell is empty but has 3 neigbours, birth
|
|
; If cell is occupied and has 2,3 neigbours, live
|
|
; else die
|
|
|
|
cmp ah, 3
|
|
jne btest
|
|
mov [esi+1], al
|
|
jmp nextcell
|
|
|
|
btest:
|
|
cmp ah, 2
|
|
jne nextcell
|
|
cmp [esi], al
|
|
jne nextcell
|
|
mov [esi+1], al
|
|
|
|
nextcell:
|
|
add esi, 3
|
|
cmp esi, I_END + 512*512*3
|
|
jne lifeloop
|
|
|
|
; copy new generation across
|
|
|
|
mov ecx, 512*512*3
|
|
mov esi, I_END+1
|
|
mov edi, I_END
|
|
rep movsb ; copy the data across
|
|
|
|
mov ecx, 512*512
|
|
mov esi, I_END
|
|
nc1:
|
|
mov [esi+2], byte 0
|
|
add esi, 3
|
|
loop nc1
|
|
|
|
mov ebx, I_END
|
|
mov ecx, 512*65536+512
|
|
mov edx, 5*65536+20
|
|
mov eax,7
|
|
int 0x40
|
|
|
|
jmp still
|
|
|
|
button: ; BUTTON - only close supported
|
|
close
|
|
|
|
; *********************************************
|
|
; ******* WINDOW DEFINITIONS AND DRAW ********
|
|
; *********************************************
|
|
draw_window:
|
|
startwd
|
|
window 50,50,512+9,512+23,window_Skinned
|
|
label 8,8,'Life Screen',cl_White+font_Big
|
|
endwd
|
|
ret
|
|
|
|
I_END:
|