85 lines
2.0 KiB
Forth
85 lines
2.0 KiB
Forth
# 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
|
|
}
|
|
}
|