https://github.com/akkartik/mu/blob/main/linux/tile/box.mu

      1 fn draw-box screen: (addr screen), row1: int, col1: int, row2: int, col2: int {
      2   draw-horizontal-line screen, row1, col1, col2
      3   draw-vertical-line screen, row1, row2, col1
      4   draw-horizontal-line screen, row2, col1, col2
      5   draw-vertical-line screen, row1, row2, col2
      6   draw-top-left-corner screen, row1, col1
      7   draw-top-right-corner screen, row1, col2
      8   draw-bottom-left-corner screen, row2, col1
      9   draw-bottom-right-corner screen, row2, col2
     10 }
     11
     12 fn draw-hatching screen: (addr screen), row1: int, col1: int, row2: int, col2: int {
     13   var c/eax: int <- copy col1
     14   var r1/ecx: int <- copy row1
     15   r1 <- increment
     16   c <- add 2
     17   {
     18     compare c, col2
     19     break-if->=
     20     draw-vertical-line screen, r1, row2, c
     21     c <- add 2
     22     loop
     23   }
     24 }
     25
     26 fn draw-horizontal-line screen: (addr screen), row: int, col1: int, col2: int {
     27   var col/eax: int <- copy col1
     28   move-cursor screen, row, col
     29   {
     30     compare col, col2
     31     break-if->=
     32     print-code-point screen, 0x2500
     33     col <- increment
     34     loop
     35   }
     36 }
     37
     38 fn draw-vertical-line screen: (addr screen), row1: int, row2: int, col: int {
     39   var row/eax: int <- copy row1
     40   {
     41     compare row, row2
     42     break-if->=
     43     move-cursor screen, row, col
     44     print-code-point screen, 0x2502
     45     row <- increment
     46     loop
     47   }
     48 }
     49
     50 fn draw-top-left-corner screen: (addr screen), row: int, col: int {
     51   move-cursor screen, row, col
     52   print-code-point screen, 0x250c
     53 }
     54
     55 fn draw-top-right-corner screen: (addr screen), row: int, col: int {
     56   move-cursor screen, row, col
     57   print-code-point screen, 0x2510
     58 }
     59
     60 fn draw-bottom-left-corner screen: (addr screen), row: int, col: int {
     61   move-cursor screen, row, col
     62   print-code-point screen, 0x2514
     63 }
     64
     65 fn draw-bottom-right-corner screen: (addr screen), row: int, col: int {
     66   move-cursor screen, row, col
     67   print-code-point screen, 0x2518
     68 }
     69
     70 # erase parts of screen the slow way
     71 fn clear-rect screen: (addr screen), row1: int, col1: int, row2: int, col2: int {
     72   var i/eax: int <- copy row1
     73   {
     74     compare i, row2
     75     break-if->
     76     var j/ecx: int <- copy col1
     77     move-cursor screen, i, j
     78     {
     79       compare j, col2
     80       break-if->
     81       print-grapheme screen 0x20/space
     82       j <- increment
     83       loop
     84     }
     85     i <- increment
     86     loop
     87   }
     88 }
     89
     90 fn clear-rect2 screen: (addr screen), row1: int, col1: int, w: int, h: int {
     91   var i/eax: int <- copy 0
     92   var curr-row/esi: int <- copy row1
     93   {
     94     compare i, w
     95     break-if->=
     96     move-cursor screen, curr-row, col1
     97     var j/ecx: int <- copy 0
     98     {
     99       compare j, h
    100       break-if->=
    101       print-grapheme screen 0x20/space
    102       j <- increment
    103       loop
    104     }
    105     i <- increment
    106     curr-row <- increment
    107     loop
    108   }
    109 }