about summary refs log tree commit diff stats
path: root/084console.mu
Commit message (Expand)AuthorAgeFilesLines
* 2576 - distinguish allocated addresses from othersKartik K. Agaram2016-01-191-11/+11
* 2612Kartik K. Agaram2015-11-291-9/+9
* 2468 - overload print-character as just 'print'Kartik K. Agaram2015-11-211-1/+1
* 2460 - headers for remaining recipesKartik K. Agaram2015-11-181-26/+21
* 2430 - make room for more transformsKartik K. Agaram2015-11-131-0/+113
/a> 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
type screen-position-state {
  nrows: int  # const
  ncols: int  # const
  toprow: int
  botrow: int
  leftcol: int
  rightcol: int
  row: int
  col: int
}

fn init-screen-position-state _self: (addr screen-position-state) {
  # hardcoded parameters:
  #   top-margin
  #   page-margin
  #   page-width
  var self/esi: (addr screen-position-state) <- copy _self
  var nrows/eax: int <- copy 0xa
  var ncols/ecx: int <- copy 0x20
  nrows, ncols <- screen-size  # Comment this out to debug with a tiny page. You'll also need to adjust rightcol below.
  var dest/edx: (addr int) <- copy 0
  # self->nrows = nrows
  dest <- get self, nrows
  copy-to *dest, nrows
  # self->ncols = ncols
  dest <- get self, ncols
  copy-to *dest, ncols
  # self->toprow = top-margin
  dest <- get self, toprow
  copy-to *dest, 2  # top-margin
  # self->botrow = nrows
  dest <- get self, botrow
  copy-to *dest, nrows
  #
  start-drawing self
}

fn start-drawing _self: (addr screen-position-state) {
  var self/esi: (addr screen-position-state) <- copy _self
  var tmp/eax: (addr int) <- copy 0
  var tmp2/ecx: int <- copy 0
  clear-screen
  # self->leftcol = page-margin
  tmp <- get self, leftcol
  copy-to *tmp, 5  # left-margin
  # self->rightcol = self->leftcol + page-width
  tmp <- get self, rightcol
#?   copy-to *tmp, 0x1f  # ncols - 1
  copy-to *tmp, 0x45  # left-margin + page-width
  # self->row = self->toprow
  tmp <- get self, toprow
  tmp2 <- copy *tmp
  tmp <- get self, row
  copy-to *tmp, tmp2
  # self->col = self->leftcol
  tmp <- get self, leftcol
  tmp2 <- copy *tmp
  tmp <- get self, col
  copy-to *tmp, tmp2
  #
  reposition-cursor self
}

fn add-char _self: (addr screen-position-state), c: byte {
$add-char:body: {
  var self/esi: (addr screen-position-state) <- copy _self
  {
    compare c, 0xa  # newline
    break-if-!=
    next-line self
    reposition-cursor self
    break $add-char:body
  }
  # print c
  print-byte c
  # self->col++
  var tmp/eax: (addr int) <- get self, col
  increment *tmp
  # if (self->col > self->rightcol) next-line(self)
  var tmp2/ecx: int <- copy *tmp
  tmp <- get self, rightcol
  compare tmp2, *tmp
  {
    break-if-<=
    next-line self
    reposition-cursor self
  }
}
}

fn next-line _self: (addr screen-position-state) {
  var self/esi: (addr screen-position-state) <- copy _self
  var tmp/eax: (addr int) <- copy 0
  var tmp2/ecx: int <- copy 0
  # self->col = self->leftcol
  tmp <- get self, leftcol
  tmp2 <- copy *tmp
  tmp <- get self, col
  copy-to *tmp, tmp2
  # self->row++
  tmp <- get self, row
  increment *tmp
  # if (self->row > self->botrow) next-page(self)
  tmp2 <- copy *tmp
  tmp <- get self, botrow
  compare tmp2, *tmp
  {
    break-if-<=
    next-page self
  }
}

fn next-page _self: (addr screen-position-state) {
  var self/esi: (addr screen-position-state) <- copy _self
  var tmp/eax: (addr int) <- copy 0
  var tmp2/ecx: int <- copy 0
#?   # temporary: stop
#?   tmp <- get self, ncols
#?   tmp2 <- copy *tmp
#?   tmp <- get self, rightcol
#?   copy-to *tmp, tmp2
  # real: multiple pages
  # self->leftcol = self->rightcol + page-margin
  tmp <- get self, rightcol
  tmp2 <- copy *tmp
  tmp2 <- add 5  # page-margin
  tmp <- get self, leftcol
  copy-to *tmp, tmp2
  # self->rightcol = self->leftcol + page-width
  tmp2 <- copy *tmp
  tmp2 <- add 0x40  # page-width
  tmp <- get self, rightcol
  copy-to *tmp, tmp2
  # self->row = self->toprow
  tmp <- get self, toprow
  tmp2 <- copy *tmp
  tmp <- get self, row
  copy-to *tmp, tmp2
  # self->col = self->leftcol
  tmp <- get self, leftcol
  tmp2 <- copy *tmp
  tmp <- get self, col
  copy-to *tmp, tmp2
}

fn done-drawing? _self: (addr screen-position-state) -> result/eax: boolean {
$done-drawing?:body: {
  # return self->rightcol >= self->ncols
  var self/esi: (addr screen-position-state) <- copy _self
  var max/ecx: (addr int) <- get self, ncols
  var tmp/eax: (addr int) <- get self, rightcol
  var right/eax: int <- copy *tmp
  compare right, *max
  {
    break-if->=
    result <- copy 0  # false
    break $done-drawing?:body
  }
  {
    break-if-<
    result <- copy 1  # true
  }
}
}

fn reposition-cursor _self: (addr screen-position-state) {
  var self/esi: (addr screen-position-state) <- copy _self
  var r/eax: (addr int) <- get self, row
  var c/ecx: (addr int) <- get self, col
  move-cursor *r *c
}