forked from MightyPork/crsn
Compare commits
4 Commits
0006cd06ec
...
2800b8cab2
Author | SHA1 | Date |
---|---|---|
Ondřej Hruška | 2800b8cab2 | 4 years ago |
Ondřej Hruška | 54ff5fbce9 | 4 years ago |
Ondřej Hruška | 8d10fa406d | 4 years ago |
Ondřej Hruška | f61dc00291 | 4 years ago |
@ -0,0 +1,242 @@ |
|||||||
|
( |
||||||
|
; simple GOL with screen and a buffer + DRAWING!!! |
||||||
|
|
||||||
|
; Middle-click to payse or resume |
||||||
|
; (hold the button until paused - there is a sleep between generations and checking buttons) |
||||||
|
; |
||||||
|
; When paused, draw with left (white) and right (black) mouse buttons |
||||||
|
; |
||||||
|
; Resume by clicking middle again. |
||||||
|
|
||||||
|
(def GENERATION_MS 200) |
||||||
|
|
||||||
|
; Real pixel size |
||||||
|
(sc-init 400 400) |
||||||
|
; Upscaling factor (bug pixels) |
||||||
|
(sc-opt SCREEN_UPSCALE 10) |
||||||
|
|
||||||
|
; Number of big pixels |
||||||
|
(def W 40) |
||||||
|
(def H 40) |
||||||
|
|
||||||
|
; !!! If you change size, also update the following constants. |
||||||
|
; Compile-time math is not implemented yet. |
||||||
|
|
||||||
|
(def XMAX 39) ; W-1 |
||||||
|
(def YMAX 39) ; H-1 |
||||||
|
(def NCELLS 1600) ; W*H |
||||||
|
|
||||||
|
; --- end of config --- |
||||||
|
(sc-opt SCREEN_AUTO_BLIT 0) |
||||||
|
|
||||||
|
(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) |
||||||
|
|
||||||
|
|
||||||
|
(def LBTN 0) |
||||||
|
(def RBTN 1) |
||||||
|
(def MBTN 2) |
||||||
|
|
||||||
|
(:loop) |
||||||
|
(sc-poll) |
||||||
|
|
||||||
|
; Drawing |
||||||
|
(sc-mbtn _ MBTN |
||||||
|
(nz? |
||||||
|
(:release) |
||||||
|
(sc-poll) |
||||||
|
(mslp 10) |
||||||
|
(sc-mbtn _ MBTN (nz? (j :release))) |
||||||
|
|
||||||
|
(:mousing) |
||||||
|
(sc-poll) |
||||||
|
(mslp 10) |
||||||
|
|
||||||
|
(ld r3 -1) |
||||||
|
|
||||||
|
(sc-mbtn _ LBTN) |
||||||
|
(ld.nz r3 1) |
||||||
|
(sc-mbtn _ RBTN) |
||||||
|
(ld.nz r3 0) |
||||||
|
|
||||||
|
(tst r3 (nneg? |
||||||
|
(sc-mouse r0 r1) |
||||||
|
|
||||||
|
(tst r3) |
||||||
|
(sc-wr.nz r0 r1 #ffffff) |
||||||
|
(sc-wr.z r0 r1 #000000) |
||||||
|
|
||||||
|
(sc-blit) |
||||||
|
(mul r1 W) |
||||||
|
(add r0 r1) |
||||||
|
(ld8 r3:8 r3) |
||||||
|
(bfwr @ng r0 r3) |
||||||
|
)) |
||||||
|
|
||||||
|
(sc-mbtn _ MBTN |
||||||
|
(z? (j :mousing))) |
||||||
|
|
||||||
|
(:release2) |
||||||
|
(sc-poll) |
||||||
|
(mslp 10) |
||||||
|
(sc-mbtn _ MBTN (nz? (j :release2))) |
||||||
|
) |
||||||
|
) |
||||||
|
|
||||||
|
(call Display) |
||||||
|
(sc-blit) |
||||||
|
(mslp GENERATION_MS) |
||||||
|
(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