recipe main [ default-space:address:array:location <- new location:type, 30:literal switch-to-display width:number <- display-width { wide-enough?:boolean <- greater-than width:number, 100:literal break-if wide-enough?:boolean return-to-console assert wide-enough?:boolean, [screen too narrow; we don't support less than 100 characters yet] } divider:number, _ <- divide-with-remainder width:number, 2:literal draw-column 0:literal/screen, divider:number x:address:array:character <- new [1:integer <- add 2:literal, 2:literal] y:address:array:character <- edit x:address:array:character, 0:literal/screen, 0:literal, 0:literal, 5:literal, divider:number #? draw-bounding-box 0:literal/screen, 0:literal, 0:literal, 5:literal, divider:number left:number <- add divider:number, 1:literal y:address:array:character <- edit 0:literal, 0:literal/screen, 0:literal, left:number, 2:literal, width:number move-cursor 0:literal/screen, 0:literal, 0:literal wait-for-key-from-keyboard return-to-console ] recipe draw-column [ default-space:address:array:location <- new location:type, 30:literal screen:address <- next-ingredient col:number <- next-ingredient curr:number <- copy 0:literal max:number <- screen-height screen:address { continue?:boolean <- lesser-than curr:number, max:number break-unless continue?:boolean move-cursor screen:address, curr:number, col:number print-character screen:address, 9474:literal/vertical, 245:literal/grey curr:number <- add curr:number, 1:literal loop } move-cursor screen:address, 0:literal, 0:literal ] recipe edit [ default-space:address:array:location <- new location:type, 30:literal in:address:array:character <- next-ingredient screen:address <- next-ingredient top:number <- next-ingredient left:number <- next-ingredient bottom:number <- next-ingredient right:number <- next-ingredient # draw bottom boundary curr:number <- copy left:number { continue?:boolean <- lesser-than curr:number, right:number break-unless continue?:boolean move-cursor screen:address, bottom:number, curr:number print-character screen:address, 9472:literal/vertical, 245:literal/grey curr:number <- add curr:number, 1:literal loop } move-cursor screen:address, top:number, left:number ] recipe draw-bounding-box [ default-space:address:array:location <- new location:type, 30:literal screen:address <- next-ingredient # sanity-check the box bounds top:number <- next-ingredient { out?:boolean <- lesser-than top:number, 0:literal break-unless out?:boolean top:number <- copy 0:literal } left:number <- next-ingredient { out?:boolean <- lesser-than left:number, 0:literal break-unless out?:boolean left:number <- copy 0:literal } bottom:number <- next-ingredient { height:number <- screen-height screen:address out?:boolean <- greater-or-equal bottom:number, height:number break-unless out?:boolean bottom:number <- subtract height:number, 1:literal } right:number <- next-ingredient { width:number <- screen-width screen:address out?:boolean <- greater-or-equal right:number, width:number break-unless out?:boolean right:number <- subtract width:number, 1:literal } #? print-integer screen:address, bottom:number #? print-character screen:address, 32:literal/space #? print-integer screen:address, right:number # top border move-cursor screen:address, top:number, left:number print-character screen:address, 9484:literal/down-right, 245:literal/grey x:number <- add left:number, 1:literal # exclude corner { continue?:boolean <- lesser-than x:number, right:number break-unless continue?:boolean print-character screen:address, 9472:literal/horizontal, 245:literal/grey x:number <- add x:number, 1:literal loop } print-character screen:address, 9488:literal/down-left, 245:literal/grey # bottom border move-cursor screen:address, bottom:number, left:number print-character screen:address, 9492:literal/up-right, 245:literal/grey x:number <- add left:number, 1:literal # exclude corner { continue?:boolean <- lesser-than x:number, right:number break-unless continue?:boolean print-character screen:address, 9472:literal/horizontal, 245:literal/grey x:number <- add x:number, 1:literal loop } print-character screen:address, 9496:literal/up-left, 245:literal/grey # left and right borders x:number <- add top:number, 1:literal # exclude corner { continue?:boolean <- lesser-than x:number, bottom:number break-unless continue?:boolean move-cursor screen:address, x:number, left:number print-character screen:address, 9474:literal/vertical, 245:literal/grey move-cursor screen:address, x:number, right:number print-character screen:address, 9474:literal/vertical, 245:literal/grey x:number <- add x:number, 1:literal loop } # position cursor inside box move-cursor screen:address, top:number, left:number cursor-down screen:address cursor-right screen:address ]