diff options
Diffstat (limited to '071print.mu')
-rw-r--r-- | 071print.mu | 454 |
1 files changed, 224 insertions, 230 deletions
diff --git a/071print.mu b/071print.mu index 7b52b920..075318a9 100644 --- a/071print.mu +++ b/071print.mu @@ -17,71 +17,68 @@ container screen-cell [ recipe new-fake-screen [ local-scope result:address:screen <- new screen:type - width:address:number <- get-address result:address:screen/lookup, num-columns:offset - width:address:number/lookup <- next-ingredient - height:address:number <- get-address result:address:screen/lookup, num-rows:offset - height:address:number/lookup <- next-ingredient -#? $print height:address:number/lookup, 10/newline - row:address:number <- get-address result:address:screen/lookup, cursor-row:offset - row:address:number/lookup <- copy 0 - column:address:number <- get-address result:address:screen/lookup, cursor-column:offset - column:address:number/lookup <- copy 0 - bufsize:number <- multiply width:address:number/lookup, height:address:number/lookup - buf:address:address:array:screen-cell <- get-address result:address:screen/lookup, data:offset - buf:address:address:array:screen-cell/lookup <- new screen-cell:type, bufsize:number - clear-screen result:address:screen - reply result:address:screen + width:address:number <- get-address *result, num-columns:offset + *width <- next-ingredient + height:address:number <- get-address *result, num-rows:offset + *height <- next-ingredient + row:address:number <- get-address *result, cursor-row:offset + *row <- copy 0 + column:address:number <- get-address *result, cursor-column:offset + *column <- copy 0 + bufsize:number <- multiply *width, *height + buf:address:address:array:screen-cell <- get-address *result, data:offset + *buf <- new screen-cell:type, bufsize + clear-screen result + reply result ] recipe clear-screen [ local-scope sc:address:screen <- next-ingredient -#? $print [clearing screen -#? ] #? 1 # if x exists { - break-unless sc:address:screen + break-unless sc # clear fake screen - buf:address:array:screen-cell <- get sc:address:screen/lookup, data:offset - max:number <- length buf:address:array:screen-cell/lookup + buf:address:array:screen-cell <- get *sc, data:offset + max:number <- length *buf i:number <- copy 0 { - done?:boolean <- greater-or-equal i:number, max:number - break-if done?:boolean - curr:address:screen-cell <- index-address buf:address:array:screen-cell/lookup, i:number - curr-content:address:character <- get-address curr:address:screen-cell/lookup, contents:offset - curr-content:address:character/lookup <- copy [ ] - curr-color:address:character <- get-address curr:address:screen-cell/lookup, color:offset - curr-color:address:character/lookup <- copy 7/white - i:number <- add i:number, 1 + done?:boolean <- greater-or-equal i, max + break-if done? + curr:address:screen-cell <- index-address *buf, i + curr-content:address:character <- get-address *curr, contents:offset + *curr-content <- copy [ ] + curr-color:address:character <- get-address *curr, color:offset + *curr-color <- copy 7/white + i <- add i, 1 loop } # reset cursor - cur:address:number <- get-address sc:address:screen/lookup, cursor-row:offset - cur:address:number/lookup <- copy 0 - cur:address:number <- get-address sc:address:screen/lookup, cursor-column:offset - cur:address:number/lookup <- copy 0 - reply sc:address:screen/same-as-ingredient:0 + x:address:number <- get-address *sc, cursor-row:offset + *x <- copy 0 + x <- get-address *sc, cursor-column:offset + *x <- copy 0 + reply sc/same-as-ingredient:0 } # otherwise, real screen clear-display - reply sc:address:screen/same-as-ingredient:0 + reply sc/same-as-ingredient:0 ] -recipe fake-screen-is-clear? [ +recipe fake-screen-is-empty? [ local-scope sc:address:screen <- next-ingredient - reply-unless sc:address:screen, 1/true - buf:address:array:screen-cell <- get sc:address:screen/lookup, data:offset + reply-unless sc, 1/true + buf:address:array:screen-cell <- get *sc, data:offset i:number <- copy 0 - len:number <- length buf:address:array:screen-cell/lookup + len:number <- length *buf { - done?:boolean <- greater-or-equal i:number, len:number - break-if done?:boolean - curr:screen-cell <- index buf:address:array:screen-cell/lookup, i:number - curr-contents:character <- get curr:screen-cell, contents:offset - i:number <- add i:number, 1 - loop-unless curr-contents:character + done?:boolean <- greater-or-equal i, len + break-if done? + curr:screen-cell <- index *buf, i + curr-contents:character <- get curr, contents:offset + i <- add i, 1 + loop-unless curr-contents # not 0 reply 0/false } @@ -95,91 +92,91 @@ recipe print-character [ color:number, color-found?:boolean <- next-ingredient { # default color to white - break-if color-found?:boolean - color:number <- copy 7/white + break-if color-found? + color <- copy 7/white } bg-color:number, bg-color-found?:boolean <- next-ingredient { # default bg-color to black - break-if bg-color-found?:boolean - bg-color:number <- copy 0/black + break-if bg-color-found? + bg-color <- copy 0/black } #? trace [app], [print character] #? 1 { # if x exists # (handle special cases exactly like in the real screen) - break-unless sc:address:screen - width:number <- get sc:address:screen/lookup, num-columns:offset - height:number <- get sc:address:screen/lookup, num-rows:offset + break-unless sc + width:number <- get *sc, num-columns:offset + height:number <- get *sc, num-rows:offset # if cursor is out of bounds, silently exit - row:address:number <- get-address sc:address:screen/lookup, cursor-row:offset - legal?:boolean <- greater-or-equal row:address:number/lookup, 0 - reply-unless legal?:boolean, sc:address:screen - legal?:boolean <- lesser-than row:address:number/lookup, height:number - reply-unless legal?:boolean, sc:address:screen - column:address:number <- get-address sc:address:screen/lookup, cursor-column:offset - legal?:boolean <- greater-or-equal column:address:number/lookup, 0 - reply-unless legal?:boolean, sc:address:screen - legal?:boolean <- lesser-than column:address:number/lookup, width:number - reply-unless legal?:boolean, sc:address:screen + row:address:number <- get-address *sc, cursor-row:offset + legal?:boolean <- greater-or-equal *row, 0 + reply-unless legal?, sc + legal? <- lesser-than *row, height + reply-unless legal?, sc + column:address:number <- get-address *sc, cursor-column:offset + legal? <- greater-or-equal *column, 0 + reply-unless legal?, sc + legal? <- lesser-than *column, width + reply-unless legal?, sc # special-case: newline { - newline?:boolean <- equal c:character, 10/newline -#? $print c:character, [ ], newline?:boolean, 10/newline - break-unless newline?:boolean + newline?:boolean <- equal c, 10/newline +#? $print c, [ ], newline?, 10/newline + break-unless newline? { # unless cursor is already at bottom - bottom:number <- subtract height:number, 1 - at-bottom?:boolean <- greater-or-equal row:address:number/lookup, bottom:number - break-if at-bottom?:boolean + bottom:number <- subtract height, 1 + at-bottom?:boolean <- greater-or-equal *row, bottom + break-if at-bottom? # move it to the next row - column:address:number/lookup <- copy 0 - row:address:number/lookup <- add row:address:number/lookup, 1 + *column <- copy 0 + *row <- add *row, 1 } - reply sc:address:screen/same-as-ingredient:0 + reply sc/same-as-ingredient:0 } # save character in fake screen - index:number <- multiply row:address:number/lookup, width:number - index:number <- add index:number, column:address:number/lookup - buf:address:array:screen-cell <- get sc:address:screen/lookup, data:offset - len:number <- length buf:address:array:screen-cell/lookup + index:number <- multiply *row, width + index <- add index, *column + buf:address:array:screen-cell <- get *sc, data:offset + len:number <- length *buf # special-case: backspace { - backspace?:boolean <- equal c:character, 8 - break-unless backspace?:boolean + backspace?:boolean <- equal c, 8 + break-unless backspace? { # unless cursor is already at left margin - at-left?:boolean <- lesser-or-equal column:address:number/lookup, 0 - break-if at-left?:boolean + at-left?:boolean <- lesser-or-equal *column, 0 + break-if at-left? # clear previous location - column:address:number/lookup <- subtract column:address:number/lookup, 1 - index:number <- subtract index:number, 1 - cursor:address:screen-cell <- index-address buf:address:array:screen-cell/lookup, index:number - cursor-contents:address:character <- get-address cursor:address:screen-cell/lookup, contents:offset - cursor-color:address:number <- get-address cursor:address:screen-cell/lookup, color:offset - cursor-contents:address:character/lookup <- copy 32/space - cursor-color:address:number/lookup <- copy 7/white + *column <- subtract *column, 1 + index <- subtract index, 1 + cursor:address:screen-cell <- index-address *buf, index + cursor-contents:address:character <- get-address *cursor, contents:offset + *cursor-contents <- copy 32/space + cursor-color:address:number <- get-address *cursor, color:offset + *cursor-color <- copy 7/white } - reply sc:address:screen/same-as-ingredient:0 + reply sc/same-as-ingredient:0 } -#? $print [saving character ], c:character, [ to fake screen ], cursor:address/screen, 10/newline - cursor:address:screen-cell <- index-address buf:address:array:screen-cell/lookup, index:number - cursor-contents:address:character <- get-address cursor:address:screen-cell/lookup, contents:offset - cursor-color:address:number <- get-address cursor:address:screen-cell/lookup, color:offset - cursor-contents:address:character/lookup <- copy c:character - cursor-color:address:number/lookup <- copy color:number +#? $print [saving character ], c, [ to fake screen ], cursor, 10/newline + cursor:address:screen-cell <- index-address *buf, index + cursor-contents:address:character <- get-address *cursor, contents:offset + *cursor-contents <- copy c + cursor-color:address:number <- get-address *cursor, color:offset + *cursor-color <- copy color # increment column unless it's already all the way to the right { - right:number <- subtract width:number, 1 - at-right?:boolean <- greater-or-equal column:address:number/lookup, right:number - break-if at-right?:boolean - column:address:number/lookup <- add column:address:number/lookup, 1 + right:number <- subtract width, 1 + at-right?:boolean <- greater-or-equal *column, right + break-if at-right? + *column <- add *column, 1 } - reply sc:address:screen/same-as-ingredient:0 + reply sc/same-as-ingredient:0 } # otherwise, real screen - print-character-to-display c:character, color:number, bg-color:number - reply sc:address:screen/same-as-ingredient:0 + print-character-to-display c, color, bg-color + reply sc/same-as-ingredient:0 ] scenario print-character-at-top-left [ @@ -187,8 +184,8 @@ scenario print-character-at-top-left [ #? $start-tracing #? 3 1:address:screen <- new-fake-screen 3/width, 2/height 1:address:screen <- print-character 1:address:screen, 97 # 'a' - 2:address:array:screen-cell <- get 1:address:screen/lookup, data:offset - 3:array:screen-cell <- copy 2:address:array:screen-cell/lookup + 2:address:array:screen-cell <- get *1:address:screen, data:offset + 3:array:screen-cell <- copy *2:address:array:screen-cell ] memory-should-contain [ 3 <- 6 # width*height @@ -202,8 +199,8 @@ scenario print-character-color [ run [ 1:address:screen <- new-fake-screen 3/width, 2/height 1:address:screen <- print-character 1:address:screen, 97/a, 1/red - 2:address:array:screen-cell <- get 1:address:screen/lookup, data:offset - 3:array:screen-cell <- copy 2:address:array:screen-cell/lookup + 2:address:array:screen-cell <- get *1:address:screen, data:offset + 3:array:screen-cell <- copy *2:address:array:screen-cell ] memory-should-contain [ 3 <- 6 # width*height @@ -219,9 +216,9 @@ scenario print-backspace-character [ 1:address:screen <- new-fake-screen 3/width, 2/height 1:address:screen <- print-character 1:address:screen, 97 # 'a' 1:address:screen <- print-character 1:address:screen, 8 # backspace - 2:number <- get 1:address:screen/lookup, cursor-column:offset - 3:address:array:screen-cell <- get 1:address:screen/lookup, data:offset - 4:array:screen-cell <- copy 3:address:array:screen-cell/lookup + 2:number <- get *1:address:screen, cursor-column:offset + 3:address:array:screen-cell <- get *1:address:screen, data:offset + 4:array:screen-cell <- copy *3:address:array:screen-cell ] memory-should-contain [ 2 <- 0 # cursor column @@ -238,9 +235,9 @@ scenario print-extra-backspace-character [ 1:address:screen <- print-character 1:address:screen, 97 # 'a' 1:address:screen <- print-character 1:address:screen, 8 # backspace 1:address:screen <- print-character 1:address:screen, 8 # backspace - 2:number <- get 1:address:screen/lookup, cursor-column:offset - 3:address:array:screen-cell <- get 1:address:screen/lookup, data:offset - 4:array:screen-cell <- copy 3:address:array:screen-cell/lookup + 2:number <- get *1:address:screen, cursor-column:offset + 3:address:array:screen-cell <- get *1:address:screen, data:offset + 4:array:screen-cell <- copy *3:address:array:screen-cell ] memory-should-contain [ 2 <- 0 # cursor column @@ -257,9 +254,9 @@ scenario print-at-right-margin [ 1:address:screen <- print-character 1:address:screen, 97 # 'a' 1:address:screen <- print-character 1:address:screen, 98 # 'b' 1:address:screen <- print-character 1:address:screen, 99 # 'c' - 2:number <- get 1:address:screen/lookup, cursor-column:offset - 3:address:array:screen-cell <- get 1:address:screen/lookup, data:offset - 4:array:screen-cell <- copy 3:address:array:screen-cell/lookup + 2:number <- get *1:address:screen, cursor-column:offset + 3:address:array:screen-cell <- get *1:address:screen, data:offset + 4:array:screen-cell <- copy *3:address:array:screen-cell ] memory-should-contain [ 2 <- 1 # cursor column @@ -278,10 +275,10 @@ scenario print-newline-character [ 1:address:screen <- new-fake-screen 3/width, 2/height 1:address:screen <- print-character 1:address:screen, 97 # 'a' 1:address:screen <- print-character 1:address:screen, 10/newline - 2:number <- get 1:address:screen/lookup, cursor-row:offset - 3:number <- get 1:address:screen/lookup, cursor-column:offset - 4:address:array:screen-cell <- get 1:address:screen/lookup, data:offset - 5:array:screen-cell <- copy 4:address:array:screen-cell/lookup + 2:number <- get *1:address:screen, cursor-row:offset + 3:number <- get *1:address:screen, cursor-column:offset + 4:address:array:screen-cell <- get *1:address:screen, data:offset + 5:array:screen-cell <- copy *4:address:array:screen-cell ] memory-should-contain [ 2 <- 1 # cursor row @@ -299,8 +296,8 @@ scenario print-newline-at-bottom-line [ 1:address:screen <- print-character 1:address:screen, 10/newline 1:address:screen <- print-character 1:address:screen, 10/newline 1:address:screen <- print-character 1:address:screen, 10/newline - 2:number <- get 1:address:screen/lookup, cursor-row:offset - 3:number <- get 1:address:screen/lookup, cursor-column:offset + 2:number <- get *1:address:screen, cursor-row:offset + 3:number <- get *1:address:screen, cursor-column:offset ] memory-should-contain [ 2 <- 1 # cursor row @@ -317,10 +314,10 @@ scenario print-at-bottom-right [ 1:address:screen <- print-character 1:address:screen, 99 # 'c' 1:address:screen <- print-character 1:address:screen, 10/newline 1:address:screen <- print-character 1:address:screen, 100 # 'd' - 2:number <- get 1:address:screen/lookup, cursor-row:offset - 3:number <- get 1:address:screen/lookup, cursor-column:offset - 4:address:array:screen-cell <- get 1:address:screen/lookup, data:offset - 5:array:screen-cell <- copy 4:address:array:screen-cell/lookup + 2:number <- get *1:address:screen, cursor-row:offset + 3:number <- get *1:address:screen, cursor-column:offset + 4:address:array:screen-cell <- get *1:address:screen, data:offset + 5:array:screen-cell <- copy *4:address:array:screen-cell ] memory-should-contain [ 2 <- 1 # cursor row @@ -343,27 +340,27 @@ recipe clear-line [ sc:address:screen <- next-ingredient # if x exists, clear line in fake screen { - break-unless sc:address:screen - width:number <- get sc:address:screen/lookup, num-columns:offset - column:address:number <- get-address sc:address:screen/lookup, cursor-column:offset - original-column:number <- copy column:address:number/lookup + break-unless sc + width:number <- get *sc, num-columns:offset + column:address:number <- get-address *sc, cursor-column:offset + original-column:number <- copy *column # space over the entire line #? $start-tracing #? 1 { -#? $print column:address:number/lookup, 10/newline - right:number <- subtract width:number, 1 - done?:boolean <- greater-or-equal column:address:number/lookup, right:number - break-if done?:boolean - print-character sc:address:screen, [ ] # implicitly updates 'column' +#? $print *column, 10/newline + right:number <- subtract width, 1 + done?:boolean <- greater-or-equal *column, right + break-if done? + print-character sc, [ ] # implicitly updates 'column' loop } # now back to where the cursor was - column:address:number/lookup <- copy original-column:number - reply sc:address:screen/same-as-ingredient:0 + *column <- copy original-column + reply sc/same-as-ingredient:0 } # otherwise, real screen clear-line-on-display - reply sc:address:screen/same-as-ingredient:0 + reply sc/same-as-ingredient:0 ] recipe cursor-position [ @@ -371,13 +368,13 @@ recipe cursor-position [ sc:address:screen <- next-ingredient # if x exists, lookup cursor in fake screen { - break-unless sc:address:screen - row:number <- get sc:address:screen/lookup, cursor-row:offset - column:number <- get sc:address:screen/lookup, cursor-column:offset - reply row:number, column:number, sc:address:screen/same-as-ingredient:0 + break-unless sc + row:number <- get *sc, cursor-row:offset + column:number <- get *sc, cursor-column:offset + reply row, column, sc/same-as-ingredient:0 } - row:number, column:number <- cursor-position-on-display - reply row:number, column:number, sc:address:screen/same-as-ingredient:0 + row, column <- cursor-position-on-display + reply row, column, sc/same-as-ingredient:0 ] recipe move-cursor [ @@ -387,16 +384,16 @@ recipe move-cursor [ new-column:number <- next-ingredient # if x exists, move cursor in fake screen { - break-unless sc:address:screen - row:address:number <- get-address sc:address:screen/lookup, cursor-row:offset - row:address:number/lookup <- copy new-row:number - column:address:number <- get-address sc:address:screen/lookup, cursor-column:offset - column:address:number/lookup <- copy new-column:number - reply sc:address:screen/same-as-ingredient:0 + break-unless sc + row:address:number <- get-address *sc, cursor-row:offset + *row <- copy new-row + column:address:number <- get-address *sc, cursor-column:offset + *column <- copy new-column + reply sc/same-as-ingredient:0 } # otherwise, real screen - move-cursor-on-display new-row:number, new-column:number - reply sc:address:screen/same-as-ingredient:0 + move-cursor-on-display new-row, new-column + reply sc/same-as-ingredient:0 ] scenario clear-line-erases-printed-characters [ @@ -409,8 +406,8 @@ scenario clear-line-erases-printed-characters [ 1:address:screen <- move-cursor 1:address:screen, 0/row, 0/column # clear line 1:address:screen <- clear-line 1:address:screen - 2:address:array:screen-cell <- get 1:address:screen/lookup, data:offset - 3:array:screen-cell <- copy 2:address:array:screen-cell/lookup + 2:address:array:screen-cell <- get *1:address:screen, data:offset + 3:array:screen-cell <- copy *2:address:array:screen-cell ] # screen should be blank memory-should-contain [ @@ -435,25 +432,22 @@ recipe cursor-down [ sc:address:screen <- next-ingredient # if x exists, move cursor in fake screen { - break-unless sc:address:screen + break-unless sc { # if row < height-1 - height:number <- get sc:address:screen/lookup, num-rows:offset - row:address:number <- get-address sc:address:screen/lookup, cursor-row:offset - max:number <- subtract height:number, 1 - at-bottom?:boolean <- greater-or-equal row:address:number/lookup, max:number - break-if at-bottom?:boolean + height:number <- get *sc, num-rows:offset + row:address:number <- get-address *sc, cursor-row:offset + max:number <- subtract height, 1 + at-bottom?:boolean <- greater-or-equal *row, max + break-if at-bottom? # row = row+1 -#? $print [AAA: ], row:address:number, [ -> ], row:address:number/lookup, 10/newline - row:address:number/lookup <- add row:address:number/lookup, 1 -#? $print [BBB: ], row:address:number, [ -> ], row:address:number/lookup, 10/newline -#? $start-tracing #? 1 + *row <- add *row, 1 } - reply sc:address:screen/same-as-ingredient:0 + reply sc/same-as-ingredient:0 } # otherwise, real screen move-cursor-down-on-display - reply sc:address:screen/same-as-ingredient:0 + reply sc/same-as-ingredient:0 ] recipe cursor-up [ @@ -461,20 +455,20 @@ recipe cursor-up [ sc:address:screen <- next-ingredient # if x exists, move cursor in fake screen { - break-unless sc:address:screen + break-unless sc { # if row > 0 - row:address:number <- get-address sc:address:screen/lookup, cursor-row:offset - at-top?:boolean <- lesser-or-equal row:address:number/lookup, 0 - break-if at-top?:boolean + row:address:number <- get-address *sc, cursor-row:offset + at-top?:boolean <- lesser-or-equal *row, 0 + break-if at-top? # row = row-1 - row:address:number/lookup <- subtract row:address:number/lookup, 1 + *row <- subtract *row, 1 } - reply sc:address:screen/same-as-ingredient:0 + reply sc/same-as-ingredient:0 } # otherwise, real screen move-cursor-up-on-display - reply sc:address:screen/same-as-ingredient:0 + reply sc/same-as-ingredient:0 ] recipe cursor-right [ @@ -482,22 +476,22 @@ recipe cursor-right [ sc:address:screen <- next-ingredient # if x exists, move cursor in fake screen { - break-unless sc:address:screen + break-unless sc { # if column < width-1 - width:number <- get sc:address:screen/lookup, num-columns:offset - column:address:number <- get-address sc:address:screen/lookup, cursor-column:offset - max:number <- subtract width:number, 1 - at-bottom?:boolean <- greater-or-equal column:address:number/lookup, max:number - break-if at-bottom?:boolean + width:number <- get *sc, num-columns:offset + column:address:number <- get-address *sc, cursor-column:offset + max:number <- subtract width, 1 + at-bottom?:boolean <- greater-or-equal *column, max + break-if at-bottom? # column = column+1 - column:address:number/lookup <- add column:address:number/lookup, 1 + *column <- add *column, 1 } - reply sc:address:screen/same-as-ingredient:0 + reply sc/same-as-ingredient:0 } # otherwise, real screen move-cursor-right-on-display - reply sc:address:screen/same-as-ingredient:0 + reply sc/same-as-ingredient:0 ] recipe cursor-left [ @@ -505,37 +499,37 @@ recipe cursor-left [ sc:address:screen <- next-ingredient # if x exists, move cursor in fake screen { - break-unless sc:address:screen + break-unless sc { # if column > 0 - column:address:number <- get-address sc:address:screen/lookup, cursor-column:offset - at-top?:boolean <- lesser-or-equal column:address:number/lookup, 0 - break-if at-top?:boolean + column:address:number <- get-address *sc, cursor-column:offset + at-top?:boolean <- lesser-or-equal *column, 0 + break-if at-top? # column = column-1 - column:address:number/lookup <- subtract column:address:number/lookup, 1 + *column <- subtract *column, 1 } - reply sc:address:screen/same-as-ingredient:0 + reply sc/same-as-ingredient:0 } # otherwise, real screen move-cursor-left-on-display - reply sc:address:screen/same-as-ingredient:0 + reply sc/same-as-ingredient:0 ] recipe cursor-to-start-of-line [ local-scope sc:address:screen <- next-ingredient - row:number, _, sc:address:screen <- cursor-position sc:address:screen + row:number, _, sc <- cursor-position sc column:number <- copy 0 - sc:address:screen <- move-cursor sc:address:screen, row:number, column:number - reply sc:address:screen/same-as-ingredient:0 + sc <- move-cursor sc, row, column + reply sc/same-as-ingredient:0 ] recipe cursor-to-next-line [ local-scope screen:address <- next-ingredient - screen:address <- cursor-down screen:address - screen:address <- cursor-to-start-of-line screen:address - reply screen:address/same-as-ingredient:0 + screen <- cursor-down screen + screen <- cursor-to-start-of-line screen + reply screen/same-as-ingredient:0 ] recipe screen-width [ @@ -543,13 +537,13 @@ recipe screen-width [ sc:address:screen <- next-ingredient # if x exists, move cursor in fake screen { - break-unless sc:address:screen - width:number <- get sc:address:screen/lookup, num-columns:offset - reply width:number + break-unless sc + width:number <- get *sc, num-columns:offset + reply width } # otherwise, real screen width:number <- display-width - reply width:number + reply width ] recipe screen-height [ @@ -557,13 +551,13 @@ recipe screen-height [ sc:address:screen <- next-ingredient # if x exists, move cursor in fake screen { - break-unless sc:address:screen - height:number <- get sc:address:screen/lookup, num-rows:offset - reply height:number + break-unless sc + height:number <- get *sc, num-rows:offset + reply height } # otherwise, real screen height:number <- display-height - reply height:number + reply height ] recipe hide-cursor [ @@ -571,12 +565,12 @@ recipe hide-cursor [ screen:address <- next-ingredient # if x exists (not real display), do nothing { - break-unless screen:address - reply screen:address + break-unless screen + reply screen } # otherwise, real screen hide-cursor-on-display - reply screen:address + reply screen ] recipe show-cursor [ @@ -584,12 +578,12 @@ recipe show-cursor [ screen:address <- next-ingredient # if x exists (not real display), do nothing { - break-unless screen:address - reply screen:address + break-unless screen + reply screen } # otherwise, real screen show-cursor-on-display - reply screen:address + reply screen ] recipe hide-screen [ @@ -597,12 +591,12 @@ recipe hide-screen [ screen:address <- next-ingredient # if x exists (not real display), do nothing { - break-unless screen:address - reply screen:address + break-unless screen + reply screen } # otherwise, real screen hide-display - reply screen:address + reply screen ] recipe show-screen [ @@ -610,12 +604,12 @@ recipe show-screen [ screen:address <- next-ingredient # if x exists (not real display), do nothing { - break-unless screen:address - reply screen:address + break-unless screen + reply screen } # otherwise, real screen show-display - reply screen:address + reply screen ] recipe print-string [ @@ -625,26 +619,26 @@ recipe print-string [ color:number, color-found?:boolean <- next-ingredient { # default color to white - break-if color-found?:boolean - color:number <- copy 7/white + break-if color-found? + color <- copy 7/white } bg-color:number, bg-color-found?:boolean <- next-ingredient { # default bg-color to black - break-if bg-color-found?:boolean - bg-color:number <- copy 0/black + break-if bg-color-found? + bg-color <- copy 0/black } - len:number <- length s:address:array:character/lookup + len:number <- length *s i:number <- copy 0 { - done?:boolean <- greater-or-equal i:number, len:number - break-if done?:boolean - c:character <- index s:address:array:character/lookup, i:number - print-character screen:address, c:character, color:number, bg-color:number - i:number <- add i:number, 1 + done?:boolean <- greater-or-equal i, len + break-if done? + c:character <- index *s, i + print-character screen, c, color, bg-color + i <- add i, 1 loop } - reply screen:address/same-as-ingredient:0 + reply screen/same-as-ingredient:0 ] scenario print-string-stops-at-right-margin [ @@ -652,8 +646,8 @@ scenario print-string-stops-at-right-margin [ 1:address:screen <- new-fake-screen 3/width, 2/height 2:address:array:character <- new [abcd] 1:address:screen <- print-string 1:address:screen, 2:address:array:character - 3:address:array:screen-cell <- get 1:address:screen/lookup, data:offset - 4:array:screen-cell <- copy 3:address:array:screen-cell/lookup + 3:address:array:screen-cell <- get *1:address:screen, data:offset + 4:array:screen-cell <- copy *3:address:array:screen-cell ] memory-should-contain [ 4 <- 6 # width*height @@ -674,17 +668,17 @@ recipe print-integer [ color:number, color-found?:boolean <- next-ingredient { # default color to white - break-if color-found?:boolean - color:number <- copy 7/white + break-if color-found? + color <- copy 7/white } bg-color:number, bg-color-found?:boolean <- next-ingredient { # default bg-color to black - break-if bg-color-found?:boolean - bg-color:number <- copy 0/black + break-if bg-color-found? + bg-color <- copy 0/black } # todo: other bases besides decimal - s:address:array:character <- integer-to-decimal-string n:number - print-string screen:address, s:address:array:character, color:number, bg-color:number - reply screen:address/same-as-ingredient:0 + s:address:array:character <- integer-to-decimal-string n + print-string screen, s, color, bg-color + reply screen/same-as-ingredient:0 ] |