about summary refs log blame commit diff stats
path: root/apps/tile/main.mu
blob: 7c7065fc3d3a5b8c997de4e13c1cee615dcdf30e (plain) (tree)
































                                                                             











































                                                         
 
fn main args-on-stack: (addr array addr array byte) -> exit-status/ebx: int {
  var args/eax: (addr array addr array byte) <- copy args-on-stack
  var len/ecx: int <- length args
  $main-body: {
    # if no args, run in interactive mode
    compare len, 1
    {
      break-if->
      exit-status <- interactive args-on-stack
      break $main-body
    }
    # else if single arg is 'test', run tests
    compare len, 2
    {
      break-if-!=
      var tmp/ecx: (addr addr array byte) <- index args, 1
      var tmp2/eax: boolean <- string-equal? *tmp, "test"
      compare tmp2, 0
      {
        break-if-=
        run-tests
        exit-status <- copy 0  # TODO: get at Num-test-failures somehow
        break $main-body
      }
    }
    # otherwise error message
    print-string-to-real-screen "usage: tile\n"
    print-string-to-real-screen "    or tile test\n"
    exit-status <- copy 1
  }
}

fn interactive args: (addr array addr array byte) -> exit-status/ebx: int {
  enable-screen-grid-mode
  enable-keyboard-immediate-mode
  var buf-storage: gap-buffer
  var buf/esi: (addr gap-buffer) <- address buf-storage
  initialize-gap-buffer buf
  #
  {
    render 0, buf
    var key/eax: byte <- read-key-from-real-keyboard
    compare key, 0x71  # 'q'
    break-if-=
    var g/ecx: grapheme <- copy key
    add-grapheme buf, g
    loop
  }
  enable-keyboard-type-mode
  enable-screen-type-mode
  exit-status <- copy 0
}

fn render screen: (addr screen), buf: (addr gap-buffer) {
  clear-screen screen
  var nrows/eax: int <- copy 0
  var ncols/ecx: int <- copy 0
  nrows, ncols <- screen-size screen
  var midcol/edx: int <- copy ncols
  midcol <- shift-right 1
  draw-vertical-line screen, 1, nrows, midcol
  var midrow/ebx: int <- copy 0
  {
    var tmp/eax: int <- try-divide nrows, 3
    midrow <- copy tmp
  }
  var left-col/edx: int <- copy midcol
  left-col <- increment
  draw-horizontal-line screen, midrow, left-col, ncols
  # initialize cursor
  var start-row/ebx: int <- copy midrow
  start-row <- subtract 3
  var start-col/edx: int <- copy left-col
  start-col <- increment
  move-cursor screen, start-row, start-col
  #
  render-gap-buffer screen, buf
}