From 670bf6ed01b539868e13c7c8f2b8a33755289e51 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Tue, 22 Sep 2020 10:13:35 -0700 Subject: 6833 - tile: right-justify for negative numbers --- 407print-int32-decimal-right-justified.mu | 78 ++++++++++++++++++------------- apps/tile/environment.mu | 10 ++-- apps/tile/int-stack.mu | 7 +-- 3 files changed, 55 insertions(+), 40 deletions(-) diff --git a/407print-int32-decimal-right-justified.mu b/407print-int32-decimal-right-justified.mu index d9b7e5b6..7d83217a 100644 --- a/407print-int32-decimal-right-justified.mu +++ b/407print-int32-decimal-right-justified.mu @@ -1,12 +1,12 @@ -# print n with enough leading spaces to be right-justified with max -# only works for positive ints for now -fn print-int32-decimal-right-justified screen: (addr screen), n: int, max: int { - var threshold/eax: int <- right-justify-threshold max +# print 'n' with enough leading spaces to be right-justified with 'threshold' +# 'threshold' should be the minimum positive number for some width +fn print-int32-decimal-right-justified screen: (addr screen), n: int, _threshold: int { + # tweak things for negative numbers + var n2/ecx: int <- right-justify-threshold-decimal n + var threshold/eax: int <- copy _threshold { -#? print-int32-decimal screen, threshold - compare n, threshold + compare n2, threshold break-if->= -#? print-string screen, "!" print-grapheme screen, 0x20 # space threshold <- try-divide threshold, 0xa loop @@ -14,39 +14,53 @@ fn print-int32-decimal-right-justified screen: (addr screen), n: int, max: int { print-int32-decimal screen, n } -fn right-justify-threshold n: int -> result/eax: int { +# return the minimum positive number with the same width in decimal as 'n' +fn right-justify-threshold-decimal n: int -> result/ecx: int { + var ten/edx: int <- copy 0xa # constant + # replace '-' at the start with '0' at the end var curr/eax: int <- copy n - var out/esi: int <- copy 1 - var ten/ecx: int <- copy 0xa # constant + compare curr, 0 + { + break-if->= + curr <- negate + curr <- multiply ten + } + # now we're dealing with a positive number + result <- copy 1 { compare curr, 0xa break-if-< curr <- try-divide curr, 0xa - out <- multiply ten + result <- multiply ten loop } - result <- copy out } fn test-right-justify-threshold { - var x/eax: int <- right-justify-threshold 0 - check-ints-equal x, 1, "F - test-right-justify-threshold: 0" - x <- right-justify-threshold 1 - check-ints-equal x, 1, "F - test-right-justify-threshold: 1" - x <- right-justify-threshold 4 - check-ints-equal x, 1, "F - test-right-justify-threshold: 4" - x <- right-justify-threshold 9 - check-ints-equal x, 1, "F - test-right-justify-threshold: 9" - x <- right-justify-threshold 0xa - check-ints-equal x, 0xa, "F - test-right-justify-threshold: 10" - x <- right-justify-threshold 0xb - check-ints-equal x, 0xa, "F - test-right-justify-threshold: 11" - x <- right-justify-threshold 0x4f # 79 - check-ints-equal x, 0xa, "F - test-right-justify-threshold: 79" - x <- right-justify-threshold 0x64 # 100 - check-ints-equal x, 0x64, "F - test-right-justify-threshold: 100" - x <- right-justify-threshold 0x3e7 # 999 - check-ints-equal x, 0x64, "F - test-right-justify-threshold: 999" - x <- right-justify-threshold 0x3e8 # 1000 - check-ints-equal x, 0x3e8, "F - test-right-justify-threshold: 1000" + var x/ecx: int <- right-justify-threshold-decimal 0 + check-ints-equal x, 1, "F - test-right-justify-threshold-decimal: 0" + x <- right-justify-threshold-decimal 1 + check-ints-equal x, 1, "F - test-right-justify-threshold-decimal: 1" + x <- right-justify-threshold-decimal 4 + check-ints-equal x, 1, "F - test-right-justify-threshold-decimal: 4" + x <- right-justify-threshold-decimal 9 + check-ints-equal x, 1, "F - test-right-justify-threshold-decimal: 9" + x <- right-justify-threshold-decimal 0xa + check-ints-equal x, 0xa, "F - test-right-justify-threshold-decimal: 10" + x <- right-justify-threshold-decimal 0xb + check-ints-equal x, 0xa, "F - test-right-justify-threshold-decimal: 11" + x <- right-justify-threshold-decimal 0x4f # 79 + check-ints-equal x, 0xa, "F - test-right-justify-threshold-decimal: 79" + x <- right-justify-threshold-decimal 0x64 # 100 + check-ints-equal x, 0x64, "F - test-right-justify-threshold-decimal: 100" + x <- right-justify-threshold-decimal 0x65 # 101 + check-ints-equal x, 0x64, "F - test-right-justify-threshold-decimal: 101" + x <- right-justify-threshold-decimal 0x3e7 # 999 + check-ints-equal x, 0x64, "F - test-right-justify-threshold-decimal: 999" + x <- right-justify-threshold-decimal 0x3e8 # 1000 + check-ints-equal x, 0x3e8, "F - test-right-justify-threshold-decimal: 1000" + x <- right-justify-threshold-decimal -1 + check-ints-equal x, 0xa, "F - test-right-justify-threshold-decimal: -1" + x <- right-justify-threshold-decimal -0xb # -11 + check-ints-equal x, 0x64, "F - test-right-justify-threshold-decimal: -11" } diff --git a/apps/tile/environment.mu b/apps/tile/environment.mu index 8b7cfc1e..aeaa9167 100644 --- a/apps/tile/environment.mu +++ b/apps/tile/environment.mu @@ -211,8 +211,8 @@ fn render-column screen: (addr screen), first-word: (addr word), final-word: (ad evaluate first-word, final-word, stack-addr # render stack var curr-row/edx: int <- copy 6 # input-row 3 + stack-margin-top 3 - var _max-val/eax: int <- max-stack-value stack-addr - var max-val/esi: int <- copy _max-val + var _justify-threshold/eax: int <- max-stack-justify-threshold stack-addr + var justify-threshold/esi: int <- copy _justify-threshold var i/eax: int <- int-stack-length stack-addr { compare i, 0 @@ -220,7 +220,7 @@ fn render-column screen: (addr screen), first-word: (addr word), final-word: (ad move-cursor screen, curr-row, indented-col { var val/eax: int <- pop-int-stack stack-addr - render-integer screen, val, max-val + render-integer screen, val, justify-threshold var size/eax: int <- decimal-size val compare size, max-width break-if-<= @@ -261,7 +261,7 @@ fn render-column screen: (addr screen), first-word: (addr word), final-word: (ad } # synaesthesia -fn render-integer screen: (addr screen), val: int, max-val: int { +fn render-integer screen: (addr screen), val: int, justify-threshold: int { var bg/eax: int <- hash-color val var fg/ecx: int <- copy 7 { @@ -281,7 +281,7 @@ fn render-integer screen: (addr screen), val: int, max-val: int { } start-color screen, fg, bg print-grapheme screen, 0x20 # space - print-int32-decimal-right-justified screen, val, max-val + print-int32-decimal-right-justified screen, val, justify-threshold print-grapheme screen, 0x20 # space } diff --git a/apps/tile/int-stack.mu b/apps/tile/int-stack.mu index 74aa16fd..65b9107b 100644 --- a/apps/tile/int-stack.mu +++ b/apps/tile/int-stack.mu @@ -68,7 +68,7 @@ fn int-stack-length _self: (addr int-stack) -> result/eax: int { result <- copy *top-addr } -fn max-stack-value _self: (addr int-stack) -> result/eax: int { +fn max-stack-justify-threshold _self: (addr int-stack) -> result/eax: int { var self/esi: (addr int-stack) <- copy _self var data-ah/edi: (addr handle array int) <- get self, data var _data/eax: (addr array int) <- lookup *data-ah @@ -80,10 +80,11 @@ fn max-stack-value _self: (addr int-stack) -> result/eax: int { compare i, *top-addr break-if->= var g/edx: (addr int) <- index data, i - compare *g, result + var threshold/ecx: int <- right-justify-threshold-decimal *g + compare threshold, result { break-if-<= - result <- copy *g + result <- copy threshold } i <- increment loop -- cgit 1.4.1-2-gfad0