diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2021-07-26 17:17:19 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2021-07-26 17:19:04 -0700 |
commit | bfa0efb7d11f14aa3830ad82c75ad8e965d96343 (patch) | |
tree | 525d1b1a910ef45ee77eb2d7009a70189f1e8196 /apps | |
parent | 46441d7204cb14e14bc25ff3c43a912281035a1c (diff) | |
download | mu-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.mu | 36 |
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 { |