about summary refs log tree commit diff stats
path: root/apps
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2021-07-26 17:17:19 -0700
committerKartik K. Agaram <vc@akkartik.com>2021-07-26 17:19:04 -0700
commitbfa0efb7d11f14aa3830ad82c75ad8e965d96343 (patch)
tree525d1b1a910ef45ee77eb2d7009a70189f1e8196 /apps
parent46441d7204cb14e14bc25ff3c43a912281035a1c (diff)
downloadmu-bfa0efb7d11f14aa3830ad82c75ad8e965d96343.tar.gz
game of life in lisp
Super slow; each frame is cleared as a sort of progress indicator while
it computes the next frame.

In the process I realize I need to adjust every single trace in the
shell sources to be more fault-tolerant to a filled-up trace stream.
Diffstat (limited to 'apps')
-rw-r--r--apps/life.mu36
1 files changed, 18 insertions, 18 deletions
diff --git a/apps/life.mu b/apps/life.mu
index a65347bf..10914c41 100644
--- a/apps/life.mu
+++ b/apps/life.mu
@@ -17,18 +17,18 @@ fn state _grid: (addr array boolean), x: int, y: int -> _/eax: boolean {
     break-if->=
     return 0/false
   }
-  compare x, 0x100/width
+  compare x, 0x80/width
   {
     break-if-<
     return 0/false
   }
-  compare y, 0xc0/height
+  compare y, 0x60/height
   {
     break-if-<
     return 0/false
   }
   var idx/eax: int <- copy y
-  idx <- shift-left 8/log2width
+  idx <- shift-left 7/log2width
   idx <- add x
   var grid/esi: (addr array boolean) <- copy _grid
   var result/eax: (addr boolean) <- index grid, idx
@@ -38,7 +38,7 @@ fn state _grid: (addr array boolean), x: int, y: int -> _/eax: boolean {
 fn set-state _grid: (addr array boolean), x: int, y: int, val: boolean {
   # don't bother checking bounds
   var idx/eax: int <- copy y
-  idx <- shift-left 8/log2width
+  idx <- shift-left 7/log2width
   idx <- add x
   var grid/esi: (addr array boolean) <- copy _grid
   var result/eax: (addr boolean) <- index grid, idx
@@ -114,11 +114,11 @@ fn num-live-neighbors grid: (addr array boolean), x: int, y: int -> _/eax: int {
 fn step old-grid: (addr array boolean), new-grid: (addr array boolean) {
   var y/ecx: int <- copy 0
   {
-    compare y, 0xc0/height
+    compare y, 0x60/height
     break-if->=
     var x/edx: int <- copy 0
     {
-      compare x, 0x100/width
+      compare x, 0x80/width
       break-if->=
       var n/eax: int <- num-live-neighbors old-grid, x, y
       # if neighbors < 2, die of loneliness
@@ -157,9 +157,9 @@ fn step old-grid: (addr array boolean), new-grid: (addr array boolean) {
 # color a square of size 'side' starting at x*side, y*side
 fn render-square _x: int, _y: int, color: int {
   var y/edx: int <- copy _y
-  y <- shift-left 2/log2side
+  y <- shift-left 3/log2side
   var side/ebx: int <- copy 1
-  side <- shift-left 2/log2side
+  side <- shift-left 3/log2side
   var ymax/ecx: int <- copy y
   ymax <- add side
   {
@@ -167,7 +167,7 @@ fn render-square _x: int, _y: int, color: int {
     break-if->=
     {
       var x/eax: int <- copy _x
-      x <- shift-left 2/log2side
+      x <- shift-left 3/log2side
       var xmax/ecx: int <- copy x
       xmax <- add side
       {
@@ -196,12 +196,12 @@ fn render grid: (addr array boolean) {
       compare state, 0/false
       {
         break-if-=
-        render-square x, y, 3/cyan
+        render-square x, y, 0/black
       }
       compare state, 0/false
       {
         break-if-!=
-        render-square x, y, 0/black
+        render-square x, y, 3/cyan
       }
       x <- increment
       loop
@@ -220,20 +220,20 @@ fn main screen: (addr screen), keyboard: (addr keyboard), data-disk: (addr disk)
   # allocate on the heap
   var grid1-storage: (handle array boolean)
   var grid1-ah/eax: (addr handle array boolean) <- address grid1-storage
-  populate grid1-ah, 0xc000  # width * height
+  populate grid1-ah, 0x3000  # width * height
   var _grid1/eax: (addr array boolean) <- lookup *grid1-ah
   var grid1/esi: (addr array boolean) <- copy _grid1
   var grid2-storage: (handle array boolean)
   var grid2-ah/eax: (addr handle array boolean) <- address grid2-storage
-  populate grid2-ah, 0xc000  # width * height
+  populate grid2-ah, 0x3000  # width * height
   var _grid2/eax: (addr array boolean) <- lookup *grid2-ah
   var grid2/edi: (addr array boolean) <- copy _grid2
   # initialize grid1
-  set-state grid1, 0x80, 0x5f, 1/live
-  set-state grid1, 0x81, 0x5f, 1/live
-  set-state grid1, 0x7f, 0x60, 1/live
-  set-state grid1, 0x80, 0x60, 1/live
-  set-state grid1, 0x80, 0x61, 1/live
+  set-state grid1, 0x40, 0x2f, 1/live
+  set-state grid1, 0x41, 0x2f, 1/live
+  set-state grid1, 0x3f, 0x30, 1/live
+  set-state grid1, 0x40, 0x30, 1/live
+  set-state grid1, 0x40, 0x31, 1/live
   # render grid1
   render grid1
   {