about summary refs log tree commit diff stats
path: root/apps/tile/surface.mu
diff options
context:
space:
mode:
Diffstat (limited to 'apps/tile/surface.mu')
-rw-r--r--apps/tile/surface.mu412
1 files changed, 0 insertions, 412 deletions
diff --git a/apps/tile/surface.mu b/apps/tile/surface.mu
deleted file mode 100644
index 2e353022..00000000
--- a/apps/tile/surface.mu
+++ /dev/null
@@ -1,412 +0,0 @@
-# A surface is a large 2-D grid that you can only see a subset of through the
-# screen.
-# Imagine a pin going through both surface and screen. As we update the
-# surface contents, the pinned point stays fixed, providing a sense of
-# stability.
-
-type surface {
-  screen: (handle screen)
-  data: (handle array screen-cell)
-  nrows: int
-  ncols: int
-  screen-nrows: int
-  screen-ncols: int
-  pin-row: int  # 1-indexed
-  pin-col: int  # 1-indexed
-  pin-screen-row: int  # 1-indexed
-  pin-screen-col: int  # 1-indexed
-}
-
-# intended mostly for tests; could be slow
-fn initialize-surface-with _self: (addr surface), in: (addr array byte) {
-  var self/esi: (addr surface) <- copy _self
-  # fill in nrows, ncols
-  var nrows/ecx: int <- num-lines in
-  var dest/eax: (addr int) <- get self, nrows
-  copy-to *dest, nrows
-  var ncols/edx: int <- first-line-length in  # assume all lines are the same length
-  dest <- get self, ncols
-  copy-to *dest, ncols
-  # fill in data
-  var len/ecx: int <- copy nrows
-  len <- multiply ncols
-  var out/edi: (addr surface) <- copy _self
-  var data/eax: (addr handle array screen-cell) <- get out, data
-  populate data, len
-  var data-addr/eax: (addr array screen-cell) <- lookup *data
-  fill-in data-addr, in
-  # fill in screen-nrows, screen-ncols
-  {
-    var screen-ah/eax: (addr handle screen) <- get self, screen
-    var _screen-addr/eax: (addr screen) <- lookup *screen-ah
-    var screen-addr/edi: (addr screen) <- copy _screen-addr
-    var nrows/eax: int <- copy 0
-    var ncols/ecx: int <- copy 0
-    nrows, ncols <- screen-size screen-addr
-    var dest/edi: (addr int) <- get self, screen-nrows
-    copy-to *dest, nrows
-    dest <- get self, screen-ncols
-    copy-to *dest, ncols
-  }
-}
-
-fn pin-surface-at _self: (addr surface), r: int, c: int {
-  var self/esi: (addr surface) <- copy _self
-  var dest/ecx: (addr int) <- get self, pin-row
-  var tmp/eax: int <- copy r
-  copy-to *dest, tmp
-  dest <- get self, pin-col
-  tmp <- copy c
-  copy-to *dest, tmp
-}
-
-fn pin-surface-to _self: (addr surface), sr: int, sc: int {
-  var self/esi: (addr surface) <- copy _self
-  var dest/ecx: (addr int) <- get self, pin-screen-row
-  var tmp/eax: int <- copy sr
-  copy-to *dest, tmp
-  dest <- get self, pin-screen-col
-  tmp <- copy sc
-  copy-to *dest, tmp
-}
-
-fn render-surface _self: (addr surface) {
-#?   print-string-to-real-screen "render-surface\n"
-  var self/esi: (addr surface) <- copy _self
-  # clear screen
-  var screen-ah/eax: (addr handle screen) <- get self, screen
-  var screen/eax: (addr screen) <- lookup *screen-ah
-  clear-screen screen
-  #
-  var nrows/edx: (addr int) <- get self, screen-nrows
-  var ncols/ebx: (addr int) <- get self, screen-ncols
-  var screen-row/ecx: int <- copy 1
-  {
-    compare screen-row, *nrows
-    break-if->
-    var screen-col/eax: int <- copy 1
-    {
-      compare screen-col, *ncols
-      break-if->
-#?       print-string-to-real-screen "X"
-      print-surface-cell-at self, screen-row, screen-col
-      screen-col <- increment
-      loop
-    }
-#?     print-string-to-real-screen "\n"
-    screen-row <- increment
-    loop
-  }
-}
-
-fn print-surface-cell-at _self: (addr surface), screen-row: int, screen-col: int {
-  var self/esi: (addr surface) <- copy _self
-  var row/ecx: int <- screen-row-to-surface self, screen-row
-  var col/edx: int <- screen-col-to-surface self, screen-col
-  var data-ah/edi: (addr handle array screen-cell) <- get self, data
-  var _data-addr/eax: (addr array screen-cell) <- lookup *data-ah
-  var data-addr/edi: (addr array screen-cell) <- copy _data-addr
-  var idx/eax: int <- surface-screen-cell-index self, row, col
-  # if out of bounds, print ' '
-  compare idx, 0
-  {
-    break-if->=
-    var space/ecx: grapheme <- copy 0x20
-    var screen-ah/edi: (addr handle screen) <- get self, screen
-    var screen/eax: (addr screen) <- lookup *screen-ah
-    print-grapheme screen, space
-    return
-  }
-  # otherwise print the appropriate screen-cell
-  var offset/ecx: (offset screen-cell) <- compute-offset data-addr, idx
-  var src/ecx: (addr screen-cell) <- index data-addr, offset
-  var screen-ah/edi: (addr handle screen) <- get self, screen
-  var screen/eax: (addr screen) <- lookup *screen-ah
-  print-screen-cell screen, src
-}
-
-# print a cell with all its formatting at the cursor location
-fn print-screen-cell screen: (addr screen), _cell: (addr screen-cell) {
-  var cell/esi: (addr screen-cell) <- copy _cell
-  reset-formatting screen
-  var fg/eax: (addr int) <- get cell, color
-  var bg/ecx: (addr int) <- get cell, background-color
-  start-color screen, *fg, *bg
-  var tmp/eax: (addr boolean) <- get cell, bold?
-  {
-    compare *tmp, 0
-    break-if-=
-    start-bold screen
-  }
-  {
-    tmp <- get cell, underline?
-    compare *tmp, 0
-    break-if-=
-    start-underline screen
-  }
-  {
-    tmp <- get cell, reverse?
-    compare *tmp, 0
-    break-if-=
-    start-reverse-video screen
-  }
-  {
-    tmp <- get cell, blink?
-    compare *tmp, 0
-    break-if-=
-    start-blinking screen
-  }
-  var g/eax: (addr grapheme) <- get cell, data
-  print-grapheme screen, *g
-#?   var g2/eax: grapheme <- copy *g
-#?   var g3/eax: int <- copy g2
-#?   print-int32-hex-to-real-screen g3
-#?   print-string-to-real-screen "\n"
-}
-
-fn surface-screen-cell-index _self: (addr surface), row: int, col: int -> _/eax: int {
-  var self/esi: (addr surface) <- copy _self
-#?   print-int32-hex-to-real-screen row
-#?   print-string-to-real-screen ", "
-#?   print-int32-hex-to-real-screen col
-#?   print-string-to-real-screen "\n"
-  var result/eax: int <- copy -1
-  {
-    compare row, 1
-    break-if-<
-    compare col, 1
-    break-if-<
-    var nrows-addr/ecx: (addr int) <- get self, nrows
-    var nrows/ecx: int <- copy *nrows-addr
-    compare row, nrows
-    break-if->
-    var ncols-addr/ecx: (addr int) <- get self, ncols
-    var ncols/ecx: int <- copy *ncols-addr
-    compare col, ncols
-    break-if->
-  #?   print-string-to-real-screen "!\n"
-    result <- copy row
-    result <- subtract 1
-    result <- multiply ncols
-    result <- add col
-    result <- subtract 1
-  }
-  return result
-}
-
-fn screen-row-to-surface _self: (addr surface), screen-row: int -> _/ecx: int {
-  var self/esi: (addr surface) <- copy _self
-  var result/ecx: int <- copy screen-row
-  var tmp/eax: (addr int) <- get self, pin-row
-  result <- add *tmp
-  tmp <- get self, pin-screen-row
-  result <- subtract *tmp
-  return result
-}
-
-fn max _a: int, b: int -> _/eax: int {
-  var a/eax: int <- copy _a
-  compare a, b
-  {
-    break-if->
-    return b
-  }
-  return a
-}
-
-fn min _a: int, b: int -> _/eax: int {
-  var a/eax: int <- copy _a
-  compare a, b
-  {
-    break-if->
-    return a
-  }
-  return b
-}
-
-fn screen-col-to-surface _self: (addr surface), screen-col: int -> _/edx: int {
-  var self/esi: (addr surface) <- copy _self
-  var result/edx: int <- copy screen-col
-  var tmp/eax: (addr int) <- get self, pin-col
-  result <- add *tmp
-  tmp <- get self, pin-screen-col
-  result <- subtract *tmp
-  return result
-}
-
-fn surface-row-to-screen _self: (addr surface), row: int -> _/ecx: int {
-  var self/esi: (addr surface) <- copy _self
-  var result/ecx: int <- copy row
-  var tmp/eax: (addr int) <- get self, pin-screen-row
-  result <- add *tmp
-  tmp <- get self, pin-row
-  result <- subtract *tmp
-  return result
-}
-
-fn surface-col-to-screen _self: (addr surface), col: int -> _/edx: int {
-  var self/esi: (addr surface) <- copy _self
-  var result/edx: int <- copy col
-  var tmp/eax: (addr int) <- get self, pin-screen-col
-  result <- add *tmp
-  tmp <- get self, pin-col
-  result <- subtract *tmp
-  return result
-}
-
-# assumes last line doesn't end in '\n'
-fn num-lines in: (addr array byte) -> _/ecx: int {
-  var s: (stream byte 0x100)
-  var s-addr/esi: (addr stream byte) <- address s
-  write s-addr, in
-  var result/ecx: int <- copy 1
-  {
-    var done?/eax: boolean <- stream-empty? s-addr
-    compare done?, 0/false
-    break-if-!=
-    var g/eax: grapheme <- read-grapheme s-addr
-    compare g, 0xa/newline
-    loop-if-!=
-    result <- increment
-    loop
-  }
-  return result
-}
-
-fn first-line-length in: (addr array byte) -> _/edx: int {
-  var s: (stream byte 0x100)
-  var s-addr/esi: (addr stream byte) <- address s
-  write s-addr, in
-  var result/edx: int <- copy 0
-  {
-    var done?/eax: boolean <- stream-empty? s-addr
-    compare done?, 0/false
-    break-if-!=
-    var g/eax: grapheme <- read-grapheme s-addr
-    compare g, 0xa/newline
-    break-if-=
-    result <- increment
-    loop
-  }
-  return result
-}
-
-fn fill-in _out: (addr array screen-cell), in: (addr array byte) {
-  var s: (stream byte 0x100)
-  var out/edi: (addr array screen-cell) <- copy _out
-  var s-addr/esi: (addr stream byte) <- address s
-  write s-addr, in
-  var idx/ecx: int <- copy 0
-  {
-    var done?/eax: boolean <- stream-empty? s-addr
-    compare done?, 0/false
-    break-if-!=
-    var g/eax: grapheme <- read-grapheme s-addr
-    compare g, 0xa/newline
-    loop-if-=
-    var offset/edx: (offset screen-cell) <- compute-offset out, idx
-    var dest/edx: (addr screen-cell) <- index out, offset
-    var dest2/edx: (addr grapheme) <- get dest, data
-    copy-to *dest2, g
-    idx <- increment
-    loop
-  }
-}
-
-# pin (1, 1) to (1, 1) on screen
-fn test-surface-pin-at-origin {
-  var s: surface
-  var s-addr/esi: (addr surface) <- address s
-  # surface contents are a fixed grid with 8 rows and 6 columns
-  # (strip vowels second time around to break vertical alignment of letters)
-  initialize-surface-with-fake-screen s-addr, 3, 4, "abcdef\nghijkl\nmnopqr\nstuvwx\nyzabcd\nfghjkl\nmnpqrs\ntvwxyz"
-  pin-surface-at s-addr, 1, 1  # surface row and column
-  pin-surface-to s-addr, 1, 1  # screen row and column
-  render-surface s-addr
-  var screen-ah/eax: (addr handle screen) <- get s-addr, screen
-  var screen-addr/eax: (addr screen) <- lookup *screen-ah
-  check-screen-row screen-addr, 1, "abcd", "F - test-surface-pin-at-origin"
-  check-screen-row screen-addr, 2, "ghij", "F - test-surface-pin-at-origin"
-  check-screen-row screen-addr, 3, "mnop", "F - test-surface-pin-at-origin"
-}
-
-# pin (1, 1) to (2, 1) on screen; screen goes past edge of the universe
-fn test-surface-pin-2 {
-  var s: surface
-  var s-addr/esi: (addr surface) <- address s
-  # surface contents are a fixed grid with 8 rows and 6 columns
-  # (strip vowels second time around to break vertical alignment of letters)
-  initialize-surface-with-fake-screen s-addr, 3, 4, "abcdef\nghijkl\nmnopqr\nstuvwx\nyzabcd\nfghjkl\nmnpqrs\ntvwxyz"
-  pin-surface-at s-addr, 1, 1  # surface row and column
-  pin-surface-to s-addr, 2, 1  # screen row and column
-  render-surface s-addr
-  var screen-ah/eax: (addr handle screen) <- get s-addr, screen
-  var screen-addr/eax: (addr screen) <- lookup *screen-ah
-  # surface edge reached (should seldom happen in the app)
-  check-screen-row screen-addr, 1, "    ", "F - test-surface-pin-2"
-  check-screen-row screen-addr, 2, "abcd", "F - test-surface-pin-2"
-  check-screen-row screen-addr, 3, "ghij", "F - test-surface-pin-2"
-}
-
-# pin (2, 1) to (1, 1) on screen
-fn test-surface-pin-3 {
-  var s: surface
-  var s-addr/esi: (addr surface) <- address s
-  # surface contents are a fixed grid with 8 rows and 6 columns
-  # (strip vowels second time around to break vertical alignment of letters)
-  initialize-surface-with-fake-screen s-addr, 3, 4, "abcdef\nghijkl\nmnopqr\nstuvwx\nyzabcd\nfghjkl\nmnpqrs\ntvwxyz"
-  pin-surface-at s-addr, 2, 1  # surface row and column
-  pin-surface-to s-addr, 1, 1  # screen row and column
-  render-surface s-addr
-  var screen-ah/eax: (addr handle screen) <- get s-addr, screen
-  var screen-addr/eax: (addr screen) <- lookup *screen-ah
-  check-screen-row screen-addr, 1, "ghij", "F - test-surface-pin-3"
-  check-screen-row screen-addr, 2, "mnop", "F - test-surface-pin-3"
-  check-screen-row screen-addr, 3, "stuv", "F - test-surface-pin-3"
-}
-
-# pin (1, 1) to (1, 2) on screen; screen goes past edge of the universe
-fn test-surface-pin-4 {
-  var s: surface
-  var s-addr/esi: (addr surface) <- address s
-  # surface contents are a fixed grid with 8 rows and 6 columns
-  # (strip vowels second time around to break vertical alignment of letters)
-  initialize-surface-with-fake-screen s-addr, 3, 4, "abcdef\nghijkl\nmnopqr\nstuvwx\nyzabcd\nfghjkl\nmnpqrs\ntvwxyz"
-  pin-surface-at s-addr, 1, 1  # surface row and column
-  pin-surface-to s-addr, 1, 2  # screen row and column
-  render-surface s-addr
-  var screen-ah/eax: (addr handle screen) <- get s-addr, screen
-  var screen-addr/eax: (addr screen) <- lookup *screen-ah
-  # surface edge reached (should seldom happen in the app)
-  check-screen-row screen-addr, 1, " abc", "F - test-surface-pin-4"
-  check-screen-row screen-addr, 2, " ghi", "F - test-surface-pin-4"
-  check-screen-row screen-addr, 3, " mno", "F - test-surface-pin-4"
-}
-
-# pin (1, 2) to (1, 1) on screen
-fn test-surface-pin-5 {
-  var s: surface
-  var s-addr/esi: (addr surface) <- address s
-  # surface contents are a fixed grid with 8 rows and 6 columns
-  # (strip vowels second time around to break vertical alignment of letters)
-  initialize-surface-with-fake-screen s-addr, 3, 4, "abcdef\nghijkl\nmnopqr\nstuvwx\nyzabcd\nfghjkl\nmnpqrs\ntvwxyz"
-  pin-surface-at s-addr, 1, 2  # surface row and column
-  pin-surface-to s-addr, 1, 1  # screen row and column
-  render-surface s-addr
-  var screen-ah/eax: (addr handle screen) <- get s-addr, screen
-  var screen-addr/eax: (addr screen) <- lookup *screen-ah
-  check-screen-row screen-addr, 1, "bcde", "F - test-surface-pin-5"
-  check-screen-row screen-addr, 2, "hijk", "F - test-surface-pin-5"
-  check-screen-row screen-addr, 3, "nopq", "F - test-surface-pin-5"
-}
-
-fn initialize-surface-with-fake-screen _self: (addr surface), nrows: int, ncols: int, in: (addr array byte) {
-  var self/esi: (addr surface) <- copy _self
-  # fill in screen
-  var screen-ah/eax: (addr handle screen) <- get self, screen
-  allocate screen-ah
-  var screen-addr/eax: (addr screen) <- lookup *screen-ah
-  initialize-screen screen-addr, nrows, ncols
-  # fill in everything else
-  initialize-surface-with self, in
-}