about summary refs log tree commit diff stats
path: root/baremetal/life.mu
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2021-02-13 17:50:45 -0800
committerKartik K. Agaram <vc@akkartik.com>2021-02-13 17:50:45 -0800
commit9b5ead67eca1b6e1afeeba63e9c68b2790c26436 (patch)
tree7f29cc45826910f683b217252b7e434f15469bee /baremetal/life.mu
parent7b0f543e9d2b7c122372b254df9a2165822337a0 (diff)
downloadmu-9b5ead67eca1b6e1afeeba63e9c68b2790c26436.tar.gz
7736
Game of Life with a larger grid.
Diffstat (limited to 'baremetal/life.mu')
-rw-r--r--baremetal/life.mu56
1 files changed, 34 insertions, 22 deletions
diff --git a/baremetal/life.mu b/baremetal/life.mu
index 9c8dc4a7..a2e1124b 100644
--- a/baremetal/life.mu
+++ b/baremetal/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, 0x40/width
+  compare x, 0x100/width
   {
     break-if-<
     return 0/false
   }
-  compare y, 0x30/height
+  compare y, 0xc0/height
   {
     break-if-<
     return 0/false
   }
   var idx/eax: int <- copy y
-  idx <- shift-left 6/log2width
+  idx <- shift-left 8/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 6/log2width
+  idx <- shift-left 8/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, 0x30/height
+    compare y, 0xc0/height
     break-if->=
     var x/edx: int <- copy 0
     {
-      compare x, 0x40/width
+      compare x, 0x100/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 4/log2side
+  y <- shift-left 2/log2side
   var side/ebx: int <- copy 1
-  side <- shift-left 4/log2side
+  side <- shift-left 2/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 4/log2side
+      x <- shift-left 2/log2side
       var xmax/ecx: int <- copy x
       xmax <- add side
       {
@@ -186,11 +186,11 @@ fn render-square _x: int, _y: int, color: int {
 fn render grid: (addr array boolean) {
   var y/ecx: int <- copy 0
   {
-    compare y, 0x30/height
+    compare y, 0xc0/height
     break-if->=
     var x/edx: int <- copy 0
     {
-      compare x, 0x40/width
+      compare x, 0x100/width
       break-if->=
       var state/eax: boolean <- state grid, x, y
       compare state, 0/false
@@ -212,21 +212,33 @@ fn render grid: (addr array boolean) {
 }
 
 fn main {
-  var grid1-storage: (array boolean 0xc00)  # width * height
-  var grid1/esi: (addr array boolean) <- address grid1-storage
-  var grid2-storage: (array boolean 0xc00)  # width * height
-  var grid2/edi: (addr array boolean) <- address grid2-storage
+#?   # allocate on the stack
+#?   var grid1-storage: (array boolean 0xc000)  # width * height
+#?   var grid1/esi: (addr array boolean) <- address grid1-storage
+#?   var grid2-storage: (array boolean 0xc000)  # width * height
+#?   var grid2/edi: (addr array boolean) <- address grid2-storage
+  # 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
+  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
+  var _grid2/eax: (addr array boolean) <- lookup *grid2-ah
+  var grid2/edi: (addr array boolean) <- copy _grid2
   # initialize grid1
-  set-state grid1, 0x20, 0x17, 1/live
-  set-state grid1, 0x21, 0x17, 1/live
-  set-state grid1, 0x1f, 0x18, 1/live
-  set-state grid1, 0x20, 0x18, 1/live
-  set-state grid1, 0x20, 0x19, 1/live
-  # end 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
+  # render grid1
   render grid1
   {
     var key/eax: byte <- read-key 0/keyboard
-    # press key to step
+#?     # press key to step
 #?     compare key, 0
 #?     loop-if-=
     # press key to quit