diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2021-05-16 18:05:52 -0700 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2021-05-16 19:40:49 -0700 |
commit | fbaa30b5f75724868d5af5150c654f4ecd3789fd (patch) | |
tree | a5de08dc6b3c7f05cfd1824367e38339f8596e47 | |
parent | 237ba6e9a8492731acb7a6b5f0fcf94c63dd1fd1 (diff) | |
download | mu-fbaa30b5f75724868d5af5150c654f4ecd3789fd.tar.gz |
build out the lowest zoom
-rw-r--r-- | hest-life.mu | 117 |
1 files changed, 115 insertions, 2 deletions
diff --git a/hest-life.mu b/hest-life.mu index 72ed5306..411f6f1f 100644 --- a/hest-life.mu +++ b/hest-life.mu @@ -26,6 +26,7 @@ fn main screen: (addr screen), keyboard: (addr keyboard), data-disk: (addr disk) } type environment { + data: (handle array handle array boolean) zoom: int # 0 = 1024 px per cell; 5 = 4px per cell; each step adjusts by a factor of 4 tick: int } @@ -40,6 +41,12 @@ fn render screen: (addr screen), _self: (addr environment) { render0 screen, self return } + compare *zoom, 4 + { + break-if-!= + render4 screen, self + return + } } fn render0 screen: (addr screen), _self: (addr environment) { @@ -173,8 +180,6 @@ fn edit keyboard: (addr keyboard), _self: (addr environment) { var self/esi: (addr environment) <- copy _self var key/eax: byte <- read-key keyboard # TODO: hotkeys - var dest/eax: (addr int) <- get self, tick - increment *dest } fn pause _self: (addr environment) { @@ -190,8 +195,116 @@ fn pause _self: (addr environment) { fn step _self: (addr environment) { var self/esi: (addr environment) <- copy _self + var tick-a/ecx: (addr int) <- get self, tick + var zoom/edx: (addr int) <- get self, zoom + compare *zoom, 0 + { + break-if-!= + increment *tick-a + return + } + compare *zoom, 4 + { + break-if-!= + add-to *tick-a, 0x10 + return + } + var tick/eax: int <- copy *tick-a + tick <- and 0xf + compare tick, 0 + { + break-if-!= + step4 self + } } fn initialize-environment _self: (addr environment) { var self/esi: (addr environment) <- copy _self + var zoom/eax: (addr int) <- get self, zoom + copy-to *zoom, 4 + var data-ah/eax: (addr handle array handle array boolean) <- get self, data + populate data-ah, 0x100 + var data/eax: (addr array handle array boolean) <- lookup *data-ah + var y/ecx: int <- copy 0 + { + compare y, 0xc0 + break-if->= + var dest-ah/eax: (addr handle array boolean) <- index data, y + populate dest-ah, 0x100 + y <- increment + loop + } + set self, 0x80, 0x5f + set self, 0x81, 0x5f + set self, 0x7f, 0x60 + set self, 0x80, 0x60 + set self, 0x80, 0x61 +} + +fn set _self: (addr environment), _x: int, _y: int { + var self/esi: (addr environment) <- copy _self + var data-ah/eax: (addr handle array handle array boolean) <- get self, data + var data/eax: (addr array handle array boolean) <- lookup *data-ah + var y/ecx: int <- copy _y + var row-ah/eax: (addr handle array boolean) <- index data, y + var row/eax: (addr array boolean) <- lookup *row-ah + var x/ecx: int <- copy _x + var dest/eax: (addr boolean) <- index row, x + copy-to *dest, 1/true +} + +fn state _self: (addr environment), _x: int, _y: int -> _/eax: boolean { + var self/esi: (addr environment) <- copy _self + var data-ah/eax: (addr handle array handle array boolean) <- get self, data + var data/eax: (addr array handle array boolean) <- lookup *data-ah + var y/ecx: int <- copy _y + var row-ah/eax: (addr handle array boolean) <- index data, y + var row/eax: (addr array boolean) <- lookup *row-ah + var x/ecx: int <- copy _x + var src/eax: (addr boolean) <- index row, x + return *src +} + +fn render4 screen: (addr screen), _self: (addr environment) { + var self/esi: (addr environment) <- copy _self + var y/ecx: int <- copy 0 + { + compare y, 0xc0/height + break-if->= + var x/edx: int <- copy 0 + { + compare x, 0x100/width + break-if->= + var state/eax: boolean <- state self, x, y + compare state, 0/false + { + break-if-= + render4-cell screen, x, y, 0xf/alive + } + compare state, 0/false + { + break-if-!= + render4-cell screen, x, y, 0x1a/dead + } + x <- increment + loop + } + y <- increment + loop + } +} + +fn render4-cell screen: (addr screen), x: int, y: int, color: int { + var xmin/eax: int <- copy x + xmin <- shift-left 2 + var xmax/ecx: int <- copy xmin + xmax <- add 4 + var ymin/edx: int <- copy y + ymin <- shift-left 2 + var ymax/ebx: int <- copy ymin + ymax <- add 4 + draw-rect screen, xmin ymin, xmax ymax, color +} + +fn step4 _self: (addr environment) { } |