about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-06-05 15:38:29 -0700
committerKartik Agaram <vc@akkartik.com>2020-06-05 15:38:29 -0700
commite8d793e9552d56e6389d53b8c0b3c27d53f2b82c (patch)
treef8b62f29a961dbabd3dbfc29ddc343a3c8119bef
parent5b2dc00888d5e14bab8a1b06596b5ea8f8a29dd9 (diff)
downloadmu-e8d793e9552d56e6389d53b8c0b3c27d53f2b82c.tar.gz
6473
-rw-r--r--prototypes/browse/21/README.md1
-rw-r--r--prototypes/browse/21/file-state.mu44
-rw-r--r--prototypes/browse/21/main.mu50
-rw-r--r--prototypes/browse/21/screen-position-state.mu143
4 files changed, 238 insertions, 0 deletions
diff --git a/prototypes/browse/21/README.md b/prototypes/browse/21/README.md
new file mode 100644
index 00000000..baa760a2
--- /dev/null
+++ b/prototypes/browse/21/README.md
@@ -0,0 +1 @@
+Switch page-height to nrows.
diff --git a/prototypes/browse/21/file-state.mu b/prototypes/browse/21/file-state.mu
new file mode 100644
index 00000000..35f40229
--- /dev/null
+++ b/prototypes/browse/21/file-state.mu
@@ -0,0 +1,44 @@
+type file-state {
+  source: (handle buffered-file)
+  eof?: boolean
+}
+
+fn init-file-state _self: (addr file-state), filename: (addr array byte) {
+  var self/eax: (addr file-state) <- copy _self
+  load-file self, filename
+  var eof/eax: (addr boolean) <- get self, eof?
+  copy-to *eof, 0  # false
+}
+
+fn load-file _self: (addr file-state), filename: (addr array byte) {
+  var self/eax: (addr file-state) <- copy _self
+  var out/esi: (addr handle buffered-file) <- get self, source
+  open filename, 0, out  # 0 = read mode
+}
+
+fn next-char _self: (addr file-state) -> result/eax: byte {
+  var self/ecx: (addr file-state) <- copy _self
+  var source/eax: (addr handle buffered-file) <- get self, source
+  var in/eax: (addr buffered-file) <- lookup *source
+  result <- read-byte-buffered in
+  # if result == EOF, set eof?
+  compare result, 0xffffffff  # EOF marker
+  {
+    var eof/ecx: (addr boolean) <- get self, eof?
+    copy-to *eof, 1  # true
+  }
+}
+
+fn done-reading? _self: (addr file-state) -> result/eax: boolean {
+  var self/eax: (addr file-state) <- copy _self
+  var eof/eax: (addr boolean) <- get self, eof?
+  result <- copy *eof
+}
+
+fn dump in: (addr buffered-file) {
+  var c/eax: byte <- read-byte-buffered in
+  compare c, 0xffffffff  # EOF marker
+  break-if-=
+  print-byte c
+  loop
+}
diff --git a/prototypes/browse/21/main.mu b/prototypes/browse/21/main.mu
new file mode 100644
index 00000000..c936a575
--- /dev/null
+++ b/prototypes/browse/21/main.mu
@@ -0,0 +1,50 @@
+fn main args: (addr array (addr array byte)) -> exit-status/ebx: int {
+  # initialize fs from args[1]
+  var filename/eax: (addr array byte) <- first-arg args
+  var file-state-storage: file-state
+  var fs/esi: (addr file-state) <- address file-state-storage
+  init-file-state fs, filename
+  #
+  enable-screen-grid-mode
+  enable-keyboard-immediate-mode
+  # initialize screen state from screen size
+  var screen-position-state-storage: screen-position-state
+  var screen-position-state/eax: (addr screen-position-state) <- address screen-position-state-storage
+  init-screen-position-state screen-position-state
+  {
+    render fs, screen-position-state
+    var key/eax: byte <- read-key
+  }
+  enable-keyboard-type-mode
+  enable-screen-type-mode
+  exit-status <- copy 0
+}
+
+fn render fs: (addr file-state), state: (addr screen-position-state) {
+  start-drawing state
+  render-normal fs, state
+}
+
+fn render-normal fs: (addr file-state), state: (addr screen-position-state) {
+  {
+    # if done-drawing?(state) break
+    var done?/eax: boolean <- done-drawing? state
+    compare done?, 0  # false
+    break-if-!=
+    #
+    var c/eax: byte <- next-char fs
+    # if (c == EOF) break
+    compare c, 0xffffffff  # EOF marker
+    break-if-=
+    #
+    add-char state, c
+    #
+    loop
+  }
+}
+
+fn first-arg args-on-stack: (addr array (addr array byte)) -> out/eax: (addr array byte) {
+  var args/eax: (addr array (addr array byte)) <- copy args-on-stack
+  var result/eax: (addr addr array byte) <- index args, 1
+  out <- copy *result
+}
diff --git a/prototypes/browse/21/screen-position-state.mu b/prototypes/browse/21/screen-position-state.mu
new file mode 100644
index 00000000..8864cbe8
--- /dev/null
+++ b/prototypes/browse/21/screen-position-state.mu
@@ -0,0 +1,143 @@
+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
+  #   text-width
+  var self/esi: (addr screen-position-state) <- copy _self
+  var nrows/eax: int <- copy 0
+  var ncols/ecx: int <- copy 0
+  nrows, ncols <- screen-size
+  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
+  # self->leftcol = page-margin
+  dest <- get self, leftcol
+  copy-to *dest, 5  # left-margin
+  # self->rightcol = self->leftcol + text-width
+  dest <- get self, rightcol
+  copy-to *dest, 0x45  # left-margin + text-width
+  #
+  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
+  # 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
+  # TMP
+  var tmp/eax: (addr int) <- get self, row
+  increment *tmp
+}
+
+fn done-drawing? _self: (addr screen-position-state) -> result/eax: boolean {
+  var self/esi: (addr screen-position-state) <- copy _self
+  # TMP
+  var r/eax: (addr int) <- get self, row
+  var tmp/ecx: (addr int) <- get self, botrow
+  var max/ecx: int <- copy *tmp
+$done-drawing?:check: {
+    compare *r, max
+    {
+      break-if->=
+      result <- copy 0  # false
+      break $done-drawing?:check
+    }
+    {
+      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
+}
559' href='#n559'>559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667