Discussion:
Life
(too old to reply)
Kerr-Mudd,John
2020-04-13 12:01:19 UTC
Permalink
John Horton Conway left us 2 days ago;
https://en.wikipedia.org/wiki/John_Horton_Conway#Conway's_Game_of_Life

I've been looking at this tiny life implementation in asm:

I think I've figured out how it works; the new life/death is very clever.
(I can't recall where I got it from now; I may have changed some comments
)

; Life simulator, 72 bytes - Vladislav Kaipetsky and Tenie Remmel
; 65 bytes - Mark Andreas

; If no args, regs on startup are:

; AX = BX = 0000h
; SI = IP = 0100h
; DI = SP = FFFEh

;IDEAL
;MODEL TINY
;P386
;CODESEG

;; MJ nasm Feb 2020
cpu 186
ORG 100h

Start: int 1ah ; ah=00: cx=hours, dx=tic counter

mov al,13h ; Set mode 13h
int 10h
push 09000h ; DS = last 64K segment
pop ds
push 0A000h ; ES = video memory
pop es
xchg ax,dx ; tick in ax
RandLoop:
rol ax,1 ; Generate random number
adc [bx],al ;;; set starting life pattern
dec bx
jnz RandLoop

; BX will not be equal to 3 the first time this loop is executed, but
; it will be for all other times. As SI = 0100h and DI = FFFEh on
; startup, SI - DI will be equal to 258.

LifeLoop:
xchg cx,ax ; reset acc
AccLoop:
add cl,[di+bx-64] ; Add in this column
add cl,[si+bx-2]
add cl,[si+bx+318]
dec bx ; Loop back
jnz AccLoop

mov al,[si] ; Get center cell
stosb ;;; to screen
stc ; 3 = birth, 4 = stay (tricky):
rcr al,cl ; 1.00?0000x --> 0.0x100?00 (rcr 3)
and al,20h ; ^carry | ^
; +---> 0.00x100?0 (rcr 4)
or [si],al ; Add in new cell ^
shr byte [di-65],5 ; Shift value in prev row

mov bl,3 ; 3 iterations in AccLoop
inc si ; Loop while not zero
jnz LifeLoop

mov ah,1 ; Check for key
int 16h
jz LifeLoop ; Loop if no key

xchg ax,bx ; Set text mode
int 10h
ret ; Return

;End Start
;Note from John:
;You may replace the key check with the following snippet:
; in al,60h
; das
; jc LifeLoop
--
Bah, and indeed, Humbug.
Steve
2020-04-13 12:20:27 UTC
Permalink
Hi,
Post by Kerr-Mudd,John
John Horton Conway left us 2 days ago;
https://en.wikipedia.org/wiki/John_Horton_Conway#Conway's_Game_of_Life
Sorry to hear that. His biography "Genius at Play, The
Curious Mind of John Conway", by Siobhan Roberts was a
was an interesting book. Worth reading.
Wow. That will take some time to figure out.

Regards,

Steve N.
Terje Mathisen
2020-04-13 14:06:21 UTC
Permalink
Post by Steve
Hi,
Post by Kerr-Mudd,John
John Horton Conway left us 2 days ago;
https://en.wikipedia.org/wiki/John_Horton_Conway#Conway's_Game_of_Life
Ouch, that's very sad. I first read about Life in Scientific American
decades ago. SInce then I have thought about and written a bunch of code
to implement it.

The fastest I came up to must have been my submission to Mike Abrash
Code Optimization challenge: I knew that I was doing the minimum
possible instructions/cell so nobody would beat me on a 386 cpu (I used
32-bit instructions in a 16-bit program). Unfortunately, the competition
target was the 486, which was the first x86 with a cache.

David Stafford's code was in fact twice as fast as mine, because he
maintained a live list so he only needed to update cells around
currently live cells, so even though I ran much faster for the first 200
(or so) iterations when we started with a random 50% live cells, hw blew
me away on the remaining 1800 iterations.
Post by Steve
Sorry to hear that. His biography "Genius at Play, The
Curious Mind of John Conway", by Siobhan Roberts was a
was an interesting book. Worth reading.
Wow. That will take some time to figure out.
Indeed. A quick read totally failed to show me how it works. :-)

Terje
Post by Steve
Regards,
Steve N.
--
- <Terje.Mathisen at tmsw.no>
"almost all programming can be viewed as an exercise in caching"
Kerr-Mudd,John
2020-04-14 11:59:18 UTC
Permalink
On Mon, 13 Apr 2020 14:06:21 GMT, Terje Mathisen
Post by Terje Mathisen
Post by Steve
Hi,
Post by Kerr-Mudd,John
John Horton Conway left us 2 days ago;
Wow. That will take some time to figure out.
Indeed. A quick read totally failed to show me how it works. :-)
It stores the life state(s) in an array at 0x9000. this uses bit 0 for
current life and bit 5 for new life.
After setting things up with a "random" pattern, the main loop passes
through all points in the array, then checks for a key to end.
The secondary loop is per pixel and gathers the total for the 9 [current
& surrounding] cells into cl. The "stc; rcr al,cl; and al,0x20" cunningly
sets the new life value in bit 5, clearing the other bits. This bit is
moved from newlife to currlife in the already processed part; avoiding
any overlap.
--
Bah, and indeed, Humbug.
Robert Riebisch
2020-04-13 14:32:56 UTC
Permalink
Post by Kerr-Mudd,John
John Horton Conway left us 2 days ago;
https://en.wikipedia.org/wiki/John_Horton_Conway#Conway's_Game_of_Life
Just to mention: "On 11 April 2020, at age 82, he died of COVID-19 at
his home in New Jersey."
--
Robert Riebisch
Loading...