255 lines
4.5 KiB
NASM
255 lines
4.5 KiB
NASM
|
;
|
||
|
; LIFE.ASM
|
||
|
;
|
||
|
; This program displays Conways game of life
|
||
|
;
|
||
|
; Compile with FASM v1.49 for DOS;
|
||
|
;
|
||
|
; Version 0.1a 20th May 2004
|
||
|
; Ivan Poddubny
|
||
|
;
|
||
|
; Version 0.1 30th March 2004
|
||
|
; Mike Hibbett
|
||
|
;
|
||
|
; This is an experiment to see how small a usefull application can get
|
||
|
|
||
|
include "lang.inc"
|
||
|
include "macros.inc"
|
||
|
|
||
|
use32
|
||
|
org 0x0
|
||
|
|
||
|
db 'MENUET01' ; 8 byte id
|
||
|
dd 0x01 ; header version
|
||
|
dd START ; start of code
|
||
|
dd I_END ; size of image
|
||
|
dd 0xc1000 ; memory for app
|
||
|
dd 0xc1000 ; esp
|
||
|
dd 0x0 , 0x0 ; I_Param , I_Icon
|
||
|
|
||
|
;include "DEBUG.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
|
||
|
|
||
|
mov eax, 40
|
||
|
mov ebx, 100101b
|
||
|
int 0x40
|
||
|
|
||
|
call draw_window
|
||
|
|
||
|
still:
|
||
|
|
||
|
; mov eax, 23 ; wait here for event
|
||
|
; mov ebx, 5
|
||
|
; int 0x40
|
||
|
mov eax, 11
|
||
|
int 0x40
|
||
|
|
||
|
test eax, eax
|
||
|
je nokey
|
||
|
cmp eax,1 ; redraw request ?
|
||
|
je red
|
||
|
cmp eax,3 ; button in buffer ?
|
||
|
je button
|
||
|
cmp eax,6
|
||
|
je mouse
|
||
|
|
||
|
jmp still
|
||
|
|
||
|
|
||
|
mouse:
|
||
|
mov eax, 37
|
||
|
mov ebx, 2
|
||
|
int 0x40
|
||
|
test eax, eax
|
||
|
jz still
|
||
|
|
||
|
mov eax, 37
|
||
|
mov ebx, 1
|
||
|
int 0x40
|
||
|
sub eax, 5*65536+20
|
||
|
mov ebx, eax
|
||
|
shr eax, 16
|
||
|
and ebx, 0xffff
|
||
|
|
||
|
; WRITE COORDINATES
|
||
|
; dpd eax
|
||
|
; dps " "
|
||
|
; dpd ebx
|
||
|
; dps <10,13>
|
||
|
|
||
|
cmp ax, 0
|
||
|
js still
|
||
|
cmp bx, 0
|
||
|
js still
|
||
|
|
||
|
shl ebx, 9
|
||
|
add ebx, eax
|
||
|
imul ebx, 3
|
||
|
add ebx, I_END
|
||
|
mov [ebx], dword 0xFFFFFFFF
|
||
|
jmp draw
|
||
|
|
||
|
red: ; REDRAW WINDOW
|
||
|
call draw_window
|
||
|
jmp still
|
||
|
|
||
|
|
||
|
nokey:
|
||
|
; cycle life state
|
||
|
|
||
|
mov eax,5
|
||
|
mov ebx,5
|
||
|
int 0x40
|
||
|
|
||
|
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
|
||
|
draw:
|
||
|
mov ebx, I_END
|
||
|
mov ecx, 512*65536+512
|
||
|
mov edx, 5*65536+22
|
||
|
mov eax,7
|
||
|
int 0x40
|
||
|
|
||
|
jmp still
|
||
|
|
||
|
button: ; BUTTON - only close supported
|
||
|
or eax,-1
|
||
|
int 0x40
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
; *********************************************
|
||
|
; ******* WINDOW DEFINITIONS AND DRAW ********
|
||
|
; *********************************************
|
||
|
|
||
|
|
||
|
draw_window:
|
||
|
mov eax,12
|
||
|
mov ebx,1
|
||
|
int 0x40
|
||
|
|
||
|
mov eax,0 ; open window
|
||
|
mov ebx,50*65536+512+9
|
||
|
mov ecx,50*65536+512+22+4
|
||
|
mov edx,0x03000000
|
||
|
int 0x40
|
||
|
|
||
|
mov eax,4 ; WINDOW LABEL
|
||
|
mov ebx,8*65536+8
|
||
|
mov ecx,0x10ffffff
|
||
|
mov edx,header
|
||
|
mov esi,header.size
|
||
|
int 0x40
|
||
|
|
||
|
mov eax,12 ; function 12:tell os about windowdraw
|
||
|
mov ebx,2 ; 2, end of draw
|
||
|
int 0x40
|
||
|
|
||
|
ret
|
||
|
|
||
|
|
||
|
|
||
|
; DATA AREA
|
||
|
|
||
|
header db 'Life'
|
||
|
.size = $ - header
|
||
|
|
||
|
I_END:
|