parent
453f421bae
commit
f61dc00291
@ -0,0 +1,175 @@ |
|||||||
|
( |
||||||
|
; simple GOL with screen and a buffer |
||||||
|
|
||||||
|
(sc-init 400 400) |
||||||
|
(sc-opt SCREEN_UPSCALE 10) |
||||||
|
(sc-opt SCREEN_AUTO_BLIT 0) |
||||||
|
(def W 40) |
||||||
|
(def H 40) |
||||||
|
(def XMAX 39) ; W-1 |
||||||
|
(def YMAX 39) ; H-1 |
||||||
|
(def NCELLS 1600) ; W*H |
||||||
|
|
||||||
|
(sc-erase 0) ; all black |
||||||
|
(sym ng g15) |
||||||
|
(mkbf ng NCELLS) |
||||||
|
|
||||||
|
; one glider |
||||||
|
(bfwr @ng 1 1) |
||||||
|
(bfwr @ng 42 1) |
||||||
|
(bfwr @ng 80 1) |
||||||
|
(bfwr @ng 81 1) |
||||||
|
(bfwr @ng 82 1) |
||||||
|
|
||||||
|
; another glider |
||||||
|
(bfwr @ng 16 1) |
||||||
|
(bfwr @ng 55 1) |
||||||
|
(bfwr @ng 95 1) |
||||||
|
(bfwr @ng 96 1) |
||||||
|
(bfwr @ng 97 1) |
||||||
|
|
||||||
|
(:loop) |
||||||
|
(sc-poll) |
||||||
|
; TODO interactivity? |
||||||
|
(call Display) |
||||||
|
(sc-blit) |
||||||
|
(mslp 200) |
||||||
|
(j :loop) |
||||||
|
|
||||||
|
(proc CountNeighbors x y |
||||||
|
(sym xx r4) |
||||||
|
(sym yy r5) |
||||||
|
(sym i r6) |
||||||
|
(sym count r7) |
||||||
|
|
||||||
|
; yeah this sucks. it's correct, though |
||||||
|
|
||||||
|
(:a) |
||||||
|
(add yy y -1 (neg? (j :d))) |
||||||
|
(add xx x -1 (neg? (j :b))) |
||||||
|
(mul i yy W) |
||||||
|
(add i xx) |
||||||
|
(bfrd r0 @ng i) |
||||||
|
(and r0 0xFF (nz? (inc count))) |
||||||
|
|
||||||
|
(:b) |
||||||
|
(mul i yy W) |
||||||
|
(add i x) |
||||||
|
(bfrd r0 @ng i) |
||||||
|
(and r0 0xFF (nz? (inc count))) |
||||||
|
|
||||||
|
(:c) |
||||||
|
(add xx x 1) |
||||||
|
(cmp xx W (ge? (j :d))) |
||||||
|
(mul i yy W) |
||||||
|
(add i xx) |
||||||
|
(bfrd r0 @ng i) |
||||||
|
(and r0 0xFF (nz? (inc count))) |
||||||
|
|
||||||
|
(:d) |
||||||
|
(add xx x -1 (neg? (j :f))) |
||||||
|
(mul i y W) |
||||||
|
(add i xx) |
||||||
|
(bfrd r0 @ng i) |
||||||
|
(and r0 0xFF (nz? (inc count))) |
||||||
|
|
||||||
|
; there is no E |
||||||
|
|
||||||
|
(:f) |
||||||
|
(add xx x 1) |
||||||
|
(cmp xx W (ge? (j :g))) |
||||||
|
(mul i y W) |
||||||
|
(add i xx) |
||||||
|
(bfrd r0 @ng i) |
||||||
|
(and r0 0xFF (nz? (inc count))) |
||||||
|
|
||||||
|
(:g) |
||||||
|
(add yy y 1) |
||||||
|
(cmp yy H (ge? (j :end))) |
||||||
|
(add xx x -1 (neg? (j :h))) |
||||||
|
(mul i yy W) |
||||||
|
(add i xx) |
||||||
|
(bfrd r0 @ng i) |
||||||
|
(and r0 0xFF (nz? (inc count))) |
||||||
|
|
||||||
|
(:h) |
||||||
|
(add yy y 1) |
||||||
|
(cmp yy H (ge? (j :end))) |
||||||
|
(mul i yy W) |
||||||
|
(add i x) |
||||||
|
(bfrd r0 @ng i) |
||||||
|
(and r0 0xFF (nz? (inc count))) |
||||||
|
|
||||||
|
(:i) |
||||||
|
(add yy y 1) |
||||||
|
(cmp yy H (ge? (j :end))) |
||||||
|
(add xx x 1) |
||||||
|
(cmp xx W (ge? (j :end))) |
||||||
|
(mul i yy W) |
||||||
|
(add i xx) |
||||||
|
(bfrd r0 @ng i) |
||||||
|
(and r0 0xFF (nz? (inc count))) |
||||||
|
|
||||||
|
(:end) |
||||||
|
(ret count) |
||||||
|
) |
||||||
|
|
||||||
|
(proc Display |
||||||
|
; display and calc next gen |
||||||
|
(sym x r4) |
||||||
|
(sym y r5) |
||||||
|
(sym i r6) |
||||||
|
(:next) |
||||||
|
; The lower byte contains 0 or 1 |
||||||
|
; the second byte will be filled with the next gen |
||||||
|
|
||||||
|
(bfrd r0 @ng i) |
||||||
|
|
||||||
|
; Show this gen |
||||||
|
(and r0 0xFF |
||||||
|
(nz? (sc-wr x y 0xffffff)) |
||||||
|
(z? (sc-wr x y 0x000000))) |
||||||
|
|
||||||
|
(call CountNeighbors x y) |
||||||
|
|
||||||
|
; stay: 2,3 |
||||||
|
; die: >3 |
||||||
|
; born: 3 |
||||||
|
|
||||||
|
(cmp res0 2 |
||||||
|
(eq? (ld8 r0:8 r0)) ; stasis |
||||||
|
(ne? |
||||||
|
(tst r0 |
||||||
|
(z? |
||||||
|
(cmp res0 3 (eq? (ld8 r0:8 1))) ; birth |
||||||
|
) |
||||||
|
(nz? |
||||||
|
(cmp res0 3 (eq? (ld8 r0:8 1))) ; stay alive |
||||||
|
) |
||||||
|
) |
||||||
|
) |
||||||
|
) |
||||||
|
|
||||||
|
(bfwr @ng i r0) |
||||||
|
|
||||||
|
(inc i) |
||||||
|
(inc x) |
||||||
|
(cmp x W |
||||||
|
(ne? (j :next))) |
||||||
|
(ld x 0) |
||||||
|
(inc y) |
||||||
|
(cmp y H |
||||||
|
(eq? (j :next2))) |
||||||
|
(j :next) |
||||||
|
|
||||||
|
; Shift all by 8 to the right (generation shift) |
||||||
|
(:next2) |
||||||
|
(dec i) |
||||||
|
(bfrd r0 @ng i) |
||||||
|
(lsr r0 8) |
||||||
|
(bfwr @ng i r0) |
||||||
|
(tst i) |
||||||
|
(j.nz :next2) |
||||||
|
(ret) |
||||||
|
) |
||||||
|
) |
Loading…
Reference in new issue