diff options
-rw-r--r-- | baremetal/life.mu | 56 |
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 |