about summary refs log tree commit diff stats
path: root/071print.mu
diff options
context:
space:
mode:
Diffstat (limited to '071print.mu')
-rw-r--r--071print.mu454
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
 ]