diff --git a/apps/browse.mu b/apps/browse.mu index 5a490848..c50a619f 100644 --- a/apps/browse.mu +++ b/apps/browse.mu @@ -1,4 +1,10 @@ -# render text with word-wrap +# Render text with word-wrap. +# +# To run: +# $ ./translate_mu apps/browse.mu +# $ ./a.elf __text_file__ +# +# Press 'q' to quit. All other keys scroll down. fn main args: (addr array (addr array byte)) -> exit-status/ebx: int { var filename/eax: (addr array byte) <- first-arg args diff --git a/apps/ex2.2.mu b/apps/ex2.2.mu index dce1fe3f..b177e770 100644 --- a/apps/ex2.2.mu +++ b/apps/ex2.2.mu @@ -1,3 +1,12 @@ +# Increment a number, and return the result in the exit code. +# +# To run: +# $ ./translate_mu apps/ex2.2.mu +# $ ./a.elf +# Expected result: +# $ echo $? +# 7 + fn main -> result/ebx: int { result <- foo } diff --git a/apps/ex3.mu b/apps/ex3.mu index aaef1175..efe6a317 100644 --- a/apps/ex3.mu +++ b/apps/ex3.mu @@ -1,3 +1,12 @@ +# Add the first 10 numbers, and return the result in the exit code. +# +# To run: +# $ ./translate_mu apps/browse.mu +# $ ./a.elf +# Expected result: +# $ echo $? +# 55 + fn main -> result/ebx: int { result <- copy 0 var i/eax: int <- copy 1 diff --git a/apps/tui.mu b/apps/tui.mu index e2f97609..07d3147e 100644 --- a/apps/tui.mu +++ b/apps/tui.mu @@ -1,4 +1,8 @@ -# test some primitives for text-mode +# Test some primitives for text-mode. +# +# To run: +# $ ./translate_mu apps/tui.mu +# $ ./a.elf fn main -> exit-status/ebx: int { var nrows/eax: int <- copy 0 diff --git a/html/apps/browse.mu.html b/html/apps/browse.mu.html index 491d5920..a6fcc4cd 100644 --- a/html/apps/browse.mu.html +++ b/html/apps/browse.mu.html @@ -56,123 +56,129 @@ if ('onhashchange' in window) {
https://github.com/akkartik/mu/blob/master/apps/browse.mu- 1 # render text with word-wrap - 2 - 3 fn main args: (addr array (addr array byte)) -> exit-status/ebx: int { - 4 var filename/eax: (addr array byte) <- first-arg args - 5 var file/esi: (addr buffered-file) <- load-file filename - 6 enable-screen-grid-mode - 7 var nrows/eax: int <- copy 0 - 8 var ncols/ecx: int <- copy 0 - 9 nrows, ncols <- screen-size - 10 enable-keyboard-immediate-mode - 11 { - 12 render file, nrows, ncols - 13 var key/eax: byte <- read-key - 14 compare key, 0x71 # 'q' - 15 loop-if-!= - 16 } - 17 enable-keyboard-type-mode - 18 enable-screen-type-mode - 19 exit-status <- copy 0 - 20 } - 21 - 22 # decide how to lay out pages on screen - 23 fn render in: (addr buffered-file), nrows: int, ncols: int { - 24 # Fit multiple pages on screen on separate columns, each wide enough to read - 25 # comfortably. - 26 # Pages are separated horizontally by a 'page margin'. Among other reasons, - 27 # this allows the odd line to bleed out on the right if necessary. - 28 # - 29 # hardcoded parameters: - 30 # top-margin - 31 # page-margin - 32 # text-width - 33 var toprow/eax: int <- copy 2 # top-margin - 34 var botrow/ecx: int <- copy nrows - 35 var leftcol/edx: int <- copy 5 # page-margin - 36 var rightcol/ebx: int <- copy leftcol - 37 rightcol <- add 0x40 # text-width = 64 characters - 38 { - 39 compare rightcol, ncols - 40 break-if->= - 41 render-page in, toprow, leftcol, botrow, rightcol - 42 leftcol <- copy rightcol - 43 leftcol <- add 5 # page-margin - 44 rightcol <- copy leftcol - 45 rightcol <- add 0x40 # text-width - 46 loop - 47 } - 48 } - 49 - 50 fn render-page in: (addr buffered-file), toprow: int, leftcol: int, botrow: int, rightcol: int { - 51 clear toprow, leftcol, botrow, rightcol - 52 # render screen rows - 53 var row/ecx: int <- copy toprow - 54 $line-loop: { - 55 compare row, botrow - 56 break-if->= - 57 var col/edx: int <- copy leftcol - 58 move-cursor row, col - 59 { - 60 compare col, rightcol - 61 break-if->= - 62 var c/eax: byte <- read-byte-buffered in - 63 compare c, 0xffffffff # EOF marker - 64 break-if-= $line-loop - 65 compare c, 0xa # newline - 66 break-if-= # no need to print newlines - 67 print-byte c - 68 col <- increment - 69 loop - 70 } - 71 row <- increment - 72 loop - 73 } - 74 } - 75 - 76 fn clear toprow: int, leftcol: int, botrow: int, rightcol: int { - 77 var row/ecx: int <- copy toprow - 78 { - 79 compare row, botrow - 80 break-if->= - 81 var col/edx: int <- copy leftcol - 82 move-cursor row, col - 83 { - 84 compare col, rightcol - 85 break-if->= - 86 print-string " " - 87 col <- increment - 88 loop - 89 } - 90 row <- increment - 91 loop - 92 } - 93 } - 94 - 95 fn first-arg args-on-stack: (addr array (addr array byte)) -> out/eax: (addr array byte) { - 96 var args/eax: (addr array (addr array byte)) <- copy args-on-stack - 97 var result/eax: (addr addr array byte) <- index args, 1 - 98 out <- copy *result + 1 # Render text with word-wrap. + 2 # + 3 # To run: + 4 # $ ./translate_mu apps/browse.mu + 5 # $ ./a.elf __text_file__ + 6 # + 7 # Press 'q' to quit. All other keys scroll down. + 8 + 9 fn main args: (addr array (addr array byte)) -> exit-status/ebx: int { + 10 var filename/eax: (addr array byte) <- first-arg args + 11 var file/esi: (addr buffered-file) <- load-file filename + 12 enable-screen-grid-mode + 13 var nrows/eax: int <- copy 0 + 14 var ncols/ecx: int <- copy 0 + 15 nrows, ncols <- screen-size + 16 enable-keyboard-immediate-mode + 17 { + 18 render file, nrows, ncols + 19 var key/eax: byte <- read-key + 20 compare key, 0x71 # 'q' + 21 loop-if-!= + 22 } + 23 enable-keyboard-type-mode + 24 enable-screen-type-mode + 25 exit-status <- copy 0 + 26 } + 27 + 28 # decide how to lay out pages on screen + 29 fn render in: (addr buffered-file), nrows: int, ncols: int { + 30 # Fit multiple pages on screen on separate columns, each wide enough to read + 31 # comfortably. + 32 # Pages are separated horizontally by a 'page margin'. Among other reasons, + 33 # this allows the odd line to bleed out on the right if necessary. + 34 # + 35 # hardcoded parameters: + 36 # top-margin + 37 # page-margin + 38 # text-width + 39 var toprow/eax: int <- copy 2 # top-margin + 40 var botrow/ecx: int <- copy nrows + 41 var leftcol/edx: int <- copy 5 # page-margin + 42 var rightcol/ebx: int <- copy leftcol + 43 rightcol <- add 0x40 # text-width = 64 characters + 44 { + 45 compare rightcol, ncols + 46 break-if->= + 47 render-page in, toprow, leftcol, botrow, rightcol + 48 leftcol <- copy rightcol + 49 leftcol <- add 5 # page-margin + 50 rightcol <- copy leftcol + 51 rightcol <- add 0x40 # text-width + 52 loop + 53 } + 54 } + 55 + 56 fn render-page in: (addr buffered-file), toprow: int, leftcol: int, botrow: int, rightcol: int { + 57 clear toprow, leftcol, botrow, rightcol + 58 # render screen rows + 59 var row/ecx: int <- copy toprow + 60 $line-loop: { + 61 compare row, botrow + 62 break-if->= + 63 var col/edx: int <- copy leftcol + 64 move-cursor row, col + 65 { + 66 compare col, rightcol + 67 break-if->= + 68 var c/eax: byte <- read-byte-buffered in + 69 compare c, 0xffffffff # EOF marker + 70 break-if-= $line-loop + 71 compare c, 0xa # newline + 72 break-if-= # no need to print newlines + 73 print-byte c + 74 col <- increment + 75 loop + 76 } + 77 row <- increment + 78 loop + 79 } + 80 } + 81 + 82 fn clear toprow: int, leftcol: int, botrow: int, rightcol: int { + 83 var row/ecx: int <- copy toprow + 84 { + 85 compare row, botrow + 86 break-if->= + 87 var col/edx: int <- copy leftcol + 88 move-cursor row, col + 89 { + 90 compare col, rightcol + 91 break-if->= + 92 print-string " " + 93 col <- increment + 94 loop + 95 } + 96 row <- increment + 97 loop + 98 } 99 } 100 -101 fn load-file filename: (addr array byte) -> out/esi: (addr buffered-file) { -102 var result: (handle buffered-file) -103 { -104 var tmp1/eax: (addr handle buffered-file) <- address result -105 open filename, 0, tmp1 -106 } -107 var tmp2/eax: (addr buffered-file) <- lookup result -108 out <- copy tmp2 -109 } -110 -111 fn dump in: (addr buffered-file) { -112 var c/eax: byte <- read-byte-buffered in -113 compare c, 0xffffffff # EOF marker -114 break-if-= -115 print-byte c -116 loop -117 } +101 fn first-arg args-on-stack: (addr array (addr array byte)) -> out/eax: (addr array byte) { +102 var args/eax: (addr array (addr array byte)) <- copy args-on-stack +103 var result/eax: (addr addr array byte) <- index args, 1 +104 out <- copy *result +105 } +106 +107 fn load-file filename: (addr array byte) -> out/esi: (addr buffered-file) { +108 var result: (handle buffered-file) +109 { +110 var tmp1/eax: (addr handle buffered-file) <- address result +111 open filename, 0, tmp1 +112 } +113 var tmp2/eax: (addr buffered-file) <- lookup result +114 out <- copy tmp2 +115 } +116 +117 fn dump in: (addr buffered-file) { +118 var c/eax: byte <- read-byte-buffered in +119 compare c, 0xffffffff # EOF marker +120 break-if-= +121 print-byte c +122 loop +123 }