diff options
-rw-r--r-- | apps/browse/paginated-screen.mu | 218 |
1 files changed, 210 insertions, 8 deletions
diff --git a/apps/browse/paginated-screen.mu b/apps/browse/paginated-screen.mu index 44d112ba..86ec5b6b 100644 --- a/apps/browse/paginated-screen.mu +++ b/apps/browse/paginated-screen.mu @@ -16,10 +16,12 @@ type paginated-screen { page-width: int top-margin: int left-margin: int + # page bounds toprow: int - botrow: int + botrow: int # (inclusive) leftcol: int - rightcol: int + rightcol: int # (exclusive) + # current cursor position row: int col: int } @@ -57,11 +59,12 @@ fn initialize-paginated-screen _self: (addr paginated-screen), page-width: int, dest <- get self, left-margin copy-to *dest, tmp } - # self->toprow = top-margin + # self->toprow = 1 + top-margin { var tmp/eax: int <- copy top-margin dest <- get self, toprow - copy-to *dest, tmp + copy-to *dest, 1 + add-to *dest, tmp } # self->botrow = nrows { @@ -77,16 +80,24 @@ fn start-drawing _self: (addr paginated-screen) { clear-paginated-screen self var tmp/eax: (addr int) <- copy 0 var tmp2/ecx: int <- copy 0 - # self->leftcol = left-margin + # self->leftcol = 1 + left-margin tmp <- get self, left-margin tmp2 <- copy *tmp tmp <- get self, leftcol - copy-to *tmp, tmp2 + copy-to *tmp, 1 + add-to *tmp, tmp2 +#? print-string-to-real-screen "start: left column: " +#? print-int32-hex-to-real-screen *tmp # self->rightcol = self->leftcol + page-width tmp <- get self, page-width tmp2 <- copy *tmp + tmp <- get self, leftcol + tmp2 <- add *tmp tmp <- get self, rightcol - copy-to *tmp, tmp2 # left-margin + page-width + copy-to *tmp, tmp2 +#? print-string-to-real-screen "; right column: " +#? print-int32-hex-to-real-screen *tmp +#? print-string-to-real-screen "\n" # self->row = self->toprow tmp <- get self, toprow tmp2 <- copy *tmp @@ -143,7 +154,7 @@ $add-grapheme:body: { tmp <- get self, rightcol compare tmp2, *tmp { - break-if-<= + break-if-< next-line self reposition-cursor self } @@ -164,6 +175,189 @@ fn test-print-grapheme-on-paginated-screen { check-screen-row screen-addr, 1, "a", "F - test-print-grapheme-on-paginated-screen" } +fn test-print-single-page { + var pg-on-stack: paginated-screen + var pg/eax: (addr paginated-screen) <- address pg-on-stack + initialize-fake-paginated-screen pg, 2, 4, 2, 0, 0 # 2 rows, 4 columns, 2 pages * 2 columns each + start-drawing pg + # pages at columns [1, 3), [3, 5] +#? { +#? var foo/eax: boolean <- done-drawing? pg +#? var foo2/eax: int <- copy foo +#? print-int32-hex-to-real-screen foo2 +#? print-string-to-real-screen "\n" +#? } + var c/ecx: grapheme <- copy 0x61 # 'a' + add-grapheme pg, c +#? { +#? var foo/eax: boolean <- done-drawing? pg +#? var foo2/eax: int <- copy foo +#? print-int32-hex-to-real-screen foo2 +#? print-string-to-real-screen "\n" +#? } + var c/ecx: grapheme <- copy 0x62 # 'b' + add-grapheme pg, c +#? { +#? var foo/eax: boolean <- done-drawing? pg +#? var foo2/eax: int <- copy foo +#? print-int32-hex-to-real-screen foo2 +#? print-string-to-real-screen "\n" +#? } + var c/ecx: grapheme <- copy 0x63 # 'c' + add-grapheme pg, c +#? { +#? var foo/eax: boolean <- done-drawing? pg +#? var foo2/eax: int <- copy foo +#? print-int32-hex-to-real-screen foo2 +#? print-string-to-real-screen "\n" +#? } + var c/ecx: grapheme <- copy 0x64 # 'd' + add-grapheme pg, c +#? { +#? var foo/eax: boolean <- done-drawing? pg +#? var foo2/eax: int <- copy foo +#? print-int32-hex-to-real-screen foo2 +#? print-string-to-real-screen "\n" +#? } + var screen-ah/eax: (addr handle screen) <- get pg, screen + var screen-addr/eax: (addr screen) <- lookup *screen-ah + check-screen-row screen-addr, 1, "ab ", "F - test-print-single-page/row1" + check-screen-row screen-addr, 2, "cd ", "F - test-print-single-page/row2" + # currently it's hard-coded that we avoid printing to the bottom-most row of the screen +} + +fn test-print-multiple-pages { + var pg-on-stack: paginated-screen + var pg/eax: (addr paginated-screen) <- address pg-on-stack + initialize-fake-paginated-screen pg, 2, 2, 1, 0, 0 # 2 rows, 2 columns, 2 pages * 1 column each + start-drawing pg +#? { +#? var foo/eax: boolean <- done-drawing? pg +#? var foo2/eax: int <- copy foo +#? print-int32-hex-to-real-screen foo2 +#? print-string-to-real-screen "\n" +#? } + var c/ecx: grapheme <- copy 0x61 # 'a' + add-grapheme pg, c +#? { +#? var foo/eax: boolean <- done-drawing? pg +#? var foo2/eax: int <- copy foo +#? print-int32-hex-to-real-screen foo2 +#? print-string-to-real-screen "\n" +#? } + var c/ecx: grapheme <- copy 0x62 # 'b' + add-grapheme pg, c +#? { +#? var foo/eax: boolean <- done-drawing? pg +#? var foo2/eax: int <- copy foo +#? print-int32-hex-to-real-screen foo2 +#? print-string-to-real-screen "\n" +#? } + var c/ecx: grapheme <- copy 0x63 # 'c' + add-grapheme pg, c +#? { +#? var foo/eax: boolean <- done-drawing? pg +#? var foo2/eax: int <- copy foo +#? print-int32-hex-to-real-screen foo2 +#? print-string-to-real-screen "\n" +#? } + var c/ecx: grapheme <- copy 0x64 # 'd' + add-grapheme pg, c +#? { +#? var foo/eax: boolean <- done-drawing? pg +#? var foo2/eax: int <- copy foo +#? print-int32-hex-to-real-screen foo2 +#? print-string-to-real-screen "\n" +#? } + var screen-ah/eax: (addr handle screen) <- get pg, screen + var screen-addr/eax: (addr screen) <- lookup *screen-ah + check-screen-row screen-addr, 1, "ac", "F - test-print-multiple-pages/row1" + check-screen-row screen-addr, 2, "bd", "F - test-print-multiple-pages/row2" + # currently it's hard-coded that we avoid printing to the bottom-most row of the screen +} + +fn test-print-multiple-pages-2 { + var pg-on-stack: paginated-screen + var pg/eax: (addr paginated-screen) <- address pg-on-stack + initialize-fake-paginated-screen pg, 2, 4, 2, 0, 0 # 2 rows, 4 columns, 2 pages * 2 columns each + start-drawing pg +#? { +#? var foo/eax: boolean <- done-drawing? pg +#? var foo2/eax: int <- copy foo +#? print-int32-hex-to-real-screen foo2 +#? print-string-to-real-screen "\n" +#? } + var c/ecx: grapheme <- copy 0x61 # 'a' + add-grapheme pg, c +#? { +#? var foo/eax: boolean <- done-drawing? pg +#? var foo2/eax: int <- copy foo +#? print-int32-hex-to-real-screen foo2 +#? print-string-to-real-screen "\n" +#? } + var c/ecx: grapheme <- copy 0x62 # 'b' + add-grapheme pg, c +#? { +#? var foo/eax: boolean <- done-drawing? pg +#? var foo2/eax: int <- copy foo +#? print-int32-hex-to-real-screen foo2 +#? print-string-to-real-screen "\n" +#? } + var c/ecx: grapheme <- copy 0x63 # 'c' + add-grapheme pg, c +#? { +#? var foo/eax: boolean <- done-drawing? pg +#? var foo2/eax: int <- copy foo +#? print-int32-hex-to-real-screen foo2 +#? print-string-to-real-screen "\n" +#? } + var c/ecx: grapheme <- copy 0x64 # 'd' + add-grapheme pg, c +#? { +#? var foo/eax: boolean <- done-drawing? pg +#? var foo2/eax: int <- copy foo +#? print-int32-hex-to-real-screen foo2 +#? print-string-to-real-screen "\n" +#? } + var c/ecx: grapheme <- copy 0x65 # 'e' + add-grapheme pg, c +#? { +#? var foo/eax: boolean <- done-drawing? pg +#? var foo2/eax: int <- copy foo +#? print-int32-hex-to-real-screen foo2 +#? print-string-to-real-screen "\n" +#? } + var c/ecx: grapheme <- copy 0x66 # 'f' + add-grapheme pg, c +#? { +#? var foo/eax: boolean <- done-drawing? pg +#? var foo2/eax: int <- copy foo +#? print-int32-hex-to-real-screen foo2 +#? print-string-to-real-screen "\n" +#? } + var c/ecx: grapheme <- copy 0x67 # 'g' + add-grapheme pg, c +#? { +#? var foo/eax: boolean <- done-drawing? pg +#? var foo2/eax: int <- copy foo +#? print-int32-hex-to-real-screen foo2 +#? print-string-to-real-screen "\n" +#? } + var c/ecx: grapheme <- copy 0x68 # 'h' + add-grapheme pg, c +#? { +#? var foo/eax: boolean <- done-drawing? pg +#? var foo2/eax: int <- copy foo +#? print-int32-hex-to-real-screen foo2 +#? print-string-to-real-screen "\n" +#? } + var screen-ah/eax: (addr handle screen) <- get pg, screen + var screen-addr/eax: (addr screen) <- lookup *screen-ah + check-screen-row screen-addr, 1, "abef", "F - test-print-multiple-pages-2/row1" + check-screen-row screen-addr, 2, "cdgh", "F - test-print-multiple-pages-2/row2" + # currently it's hard-coded that we avoid printing to the bottom-most row of the screen +} + fn initialize-fake-paginated-screen _self: (addr paginated-screen), nrows: int, ncols: int, page-width: int, top-margin: int, left-margin: int { var self/esi: (addr paginated-screen) <- copy _self var screen-ah/eax: (addr handle screen) <- get self, screen @@ -179,6 +373,11 @@ fn reposition-cursor _self: (addr paginated-screen) { var self/esi: (addr paginated-screen) <- copy _self var r/ecx: (addr int) <- get self, row var c/edx: (addr int) <- get self, col +#? print-string-to-real-screen "reposition cursor: " +#? print-int32-hex-to-real-screen *r +#? print-string-to-real-screen ", " +#? print-int32-hex-to-real-screen *c +#? print-string-to-real-screen "\n" var screen-ah/eax: (addr handle screen) <- get self, screen var screen-addr/eax: (addr screen) <- lookup *screen-ah move-cursor screen-addr, *r *c @@ -247,6 +446,9 @@ fn next-line _self: (addr paginated-screen) { # self->row++ tmp <- get self, row increment *tmp +#? print-string-to-real-screen "next-line: row: " +#? print-int32-hex-to-real-screen *tmp +#? print-string-to-real-screen "\n" # if (self->row > self->botrow) next-page(self) tmp2 <- copy *tmp tmp <- get self, botrow |