about summary refs log blame commit diff stats
path: root/prototypes/tile/2.mu
blob: 6339d61e2b4a93a805626639a6058807c2cf466a (plain) (tree)
1
2
3
4
5
6
7
8
                                        





                                                                            
                                                              


                                     
                





















                                                                 
                                                            


                             
                




                                                                  





                                     
                                 


                           
                         







                                    
                         










                                           
                             

                              

                                 



                    
# load test: animate a whole lot of text
#
# Requires a large file called "x" containing just ascii characters. One way
# to generate it:
#   cat /dev/urandom |base64 - |head -n 1000 > x
# then merge pairs of lines.
#
# This prototype assumes it's in a window 185 characters wide.

fn main -> exit-status/ebx: int {
  var num-lines/ecx: int <- copy 0x10
  clear-screen 0
  # open a file
  var f: (addr buffered-file)
  {
    var f-handle: (handle buffered-file)
    var f-in/eax: (addr handle buffered-file) <- address f-handle
    open "x", 0, f-in  # for reading
    var f-out/eax: (addr buffered-file) <- lookup f-handle
    copy-to f, f-out
  }
  # main loop
  var row/eax: int <- copy 1
  {
    compare row, 0x10  # 16
    break-if->
    render f, row, num-lines
    row <- increment
#?     sleep 0 0x5f5e100  # 100ms
    loop
  }
  # wait for a key
  {
    enable-keyboard-immediate-mode
      var dummy/eax: grapheme <- read-key-from-real-keyboard
    enable-keyboard-type-mode
  }
  # clean up
  clear-screen 0
  exit-status <- copy 0
}

fn render f: (addr buffered-file), start-row: int, num-rows: int {
  var num-cols/ecx: int <- copy 0xb9  # 185
  # if necessary, clear the row above
$render:clear-loop: {
    compare start-row, 1
    break-if-<=
    decrement start-row
    var col/eax: int <- copy 1
    move-cursor 0, start-row, col
    {
      compare col, num-cols
      break-if->
      print-string 0, " "
      col <- increment
      loop
    }
    increment start-row
  }
  # render rest of screen below
  var row/edx: int <- copy start-row
  var col/ebx: int <- copy 1
  move-cursor 0, row, col
$render:render-loop: {
    compare row, num-rows
    break-if->=
    var c/eax: byte <- read-byte-buffered f
    compare c, 0xffffffff  # EOF marker
    break-if-=
    compare c, 0xa  # newline
    {
      break-if-!=
      row <- increment
      col <- copy 0
      move-cursor 0, row, col
      loop $render:render-loop
    }
    var g/eax: grapheme <- copy c
    print-grapheme 0, g
    col <- increment
    loop
  }
}