mu/apps/tile.mu

61 lines
1.3 KiB
Plaintext

# little example program: animate a line in text-mode
fn main -> exit-status/ebx: int {
clear-screen
move-cursor-on-screen 5, 5
print-string-to-screen "_________"
enable-keyboard-immediate-mode
var dummy/eax: byte <- read-key
var row/eax: int <- copy 5
{
compare row, 0xe # 15
break-if-=
animate row
row <- increment
sleep 0 0x5f5e100 # 100ms
loop
}
var dummy/eax: byte <- read-key
enable-keyboard-type-mode
clear-screen
exit-status <- copy 0
}
fn animate row: int {
var col/eax: int <- copy 5
{
compare col, 0xe
break-if-=
move-cursor-on-screen row, col
print-string-to-screen " "
increment row
move-cursor-on-screen row, col
print-string-to-screen "_"
decrement row
col <- increment
loop
}
}
type timespec {
tv_sec: int
tv_nsec: int
}
# prototype wrapper around syscall_nanosleep
# nsecs must be less than 999999999 or 0x3b9ac9ff nanoseconds
fn sleep secs: int, nsecs: int {
var t: timespec
# initialize t
var tmp/eax: (addr int) <- get t, tv_sec
var tmp2/ecx: int <- copy secs
copy-to *tmp, tmp2
tmp <- get t, tv_nsec
tmp2 <- copy nsecs
copy-to *tmp, tmp2
# perform the syscall
var t-addr/ebx: (addr timespec) <- address t
var rem-addr/ecx: (addr timespec) <- copy 0
syscall_nanosleep
}