This commit is contained in:
Kartik Agaram 2020-09-07 22:18:44 -07:00
parent fc42975cf4
commit 664910816c
2 changed files with 26 additions and 24 deletions

View File

@ -10,12 +10,12 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
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
var paginated-screen-storage: paginated-screen
var paginated-screen/eax: (addr paginated-screen) <- address paginated-screen-storage
init-paginated-screen paginated-screen
normal-text 0
{
render 0, fs, screen-position-state
render 0, fs, paginated-screen
var key/eax: byte <- read-key
compare key, 0x71 # 'q'
loop-if-!=
@ -25,12 +25,12 @@ fn main args: (addr array addr array byte) -> exit-status/ebx: int {
exit-status <- copy 0
}
fn render screen: (addr screen), fs: (addr buffered-file), state: (addr screen-position-state) {
fn render screen: (addr screen), fs: (addr buffered-file), state: (addr paginated-screen) {
start-drawing state
render-normal screen, fs, state
}
fn render-normal screen: (addr screen), fs: (addr buffered-file), state: (addr screen-position-state) {
fn render-normal screen: (addr screen), fs: (addr buffered-file), state: (addr paginated-screen) {
var newline-seen?/esi: boolean <- copy 0 # false
var start-of-paragraph?/edi: boolean <- copy 1 # true
var previous-grapheme/ebx: grapheme <- copy 0
@ -140,7 +140,7 @@ $render-normal:whitespace-separated-regions: {
} # $render-normal:loop
}
fn render-header-line screen: (addr screen), fs: (addr buffered-file), state: (addr screen-position-state) {
fn render-header-line screen: (addr screen), fs: (addr buffered-file), state: (addr paginated-screen) {
$render-header-line:body: {
# compute color based on number of '#'s
var header-level/esi: int <- copy 1 # caller already grabbed one
@ -219,7 +219,7 @@ $start-heading:body: {
}
}
fn render-until-asterisk fs: (addr buffered-file), state: (addr screen-position-state) {
fn render-until-asterisk fs: (addr buffered-file), state: (addr paginated-screen) {
{
# if done-drawing?(state) break
var done?/eax: boolean <- done-drawing? state
@ -240,7 +240,7 @@ fn render-until-asterisk fs: (addr buffered-file), state: (addr screen-position-
}
}
fn render-until-underscore fs: (addr buffered-file), state: (addr screen-position-state) {
fn render-until-underscore fs: (addr buffered-file), state: (addr paginated-screen) {
{
# if done-drawing?(state) break
var done?/eax: boolean <- done-drawing? state

View File

@ -1,4 +1,6 @@
type screen-position-state {
# if a screen is too wide, split it up into a fixed size of pages
type paginated-screen {
nrows: int # const
ncols: int # const
toprow: int
@ -9,12 +11,12 @@ type screen-position-state {
col: int
}
fn init-screen-position-state _self: (addr screen-position-state) {
fn init-paginated-screen _self: (addr paginated-screen) {
# hardcoded parameters:
# top-margin
# page-margin
# page-width
var self/esi: (addr screen-position-state) <- copy _self
var self/esi: (addr paginated-screen) <- copy _self
var nrows/eax: int <- copy 0xa
var ncols/ecx: int <- copy 0x20
nrows, ncols <- screen-size 0 # Comment this out to debug with a tiny page. You'll also need to adjust rightcol below.
@ -35,8 +37,8 @@ fn init-screen-position-state _self: (addr screen-position-state) {
start-drawing self
}
fn start-drawing _self: (addr screen-position-state) {
var self/esi: (addr screen-position-state) <- copy _self
fn start-drawing _self: (addr paginated-screen) {
var self/esi: (addr paginated-screen) <- copy _self
var tmp/eax: (addr int) <- copy 0
var tmp2/ecx: int <- copy 0
clear-screen 0
@ -61,9 +63,9 @@ fn start-drawing _self: (addr screen-position-state) {
reposition-cursor self
}
fn add-grapheme _self: (addr screen-position-state), c: grapheme {
fn add-grapheme _self: (addr paginated-screen), c: grapheme {
$add-grapheme:body: {
var self/esi: (addr screen-position-state) <- copy _self
var self/esi: (addr paginated-screen) <- copy _self
{
compare c, 0xa # newline
break-if-!=
@ -88,8 +90,8 @@ $add-grapheme:body: {
}
}
fn next-line _self: (addr screen-position-state) {
var self/esi: (addr screen-position-state) <- copy _self
fn next-line _self: (addr paginated-screen) {
var self/esi: (addr paginated-screen) <- copy _self
var tmp/eax: (addr int) <- copy 0
var tmp2/ecx: int <- copy 0
# self->col = self->leftcol
@ -110,8 +112,8 @@ fn next-line _self: (addr screen-position-state) {
}
}
fn next-page _self: (addr screen-position-state) {
var self/esi: (addr screen-position-state) <- copy _self
fn next-page _self: (addr paginated-screen) {
var self/esi: (addr paginated-screen) <- copy _self
var tmp/eax: (addr int) <- copy 0
var tmp2/ecx: int <- copy 0
#? # temporary: stop
@ -143,10 +145,10 @@ fn next-page _self: (addr screen-position-state) {
copy-to *tmp, tmp2
}
fn done-drawing? _self: (addr screen-position-state) -> result/eax: boolean {
fn done-drawing? _self: (addr paginated-screen) -> result/eax: boolean {
$done-drawing?:body: {
# return self->rightcol >= self->ncols
var self/esi: (addr screen-position-state) <- copy _self
var self/esi: (addr paginated-screen) <- copy _self
var max/ecx: (addr int) <- get self, ncols
var tmp/eax: (addr int) <- get self, rightcol
var right/eax: int <- copy *tmp
@ -163,8 +165,8 @@ $done-drawing?:body: {
}
}
fn reposition-cursor _self: (addr screen-position-state) {
var self/esi: (addr screen-position-state) <- copy _self
fn reposition-cursor _self: (addr paginated-screen) {
var self/esi: (addr paginated-screen) <- copy _self
var r/eax: (addr int) <- get self, row
var c/ecx: (addr int) <- get self, col
move-cursor 0, *r *c