36 lines
1.2 KiB
Forth
36 lines
1.2 KiB
Forth
# Counter app
|
|
# https://eugenkiss.github.io/7guis/tasks/#counter
|
|
#
|
|
# To build:
|
|
# $ ./translate counter.mu
|
|
# To run:
|
|
# $ qemu-system-i386 code.img
|
|
|
|
fn main screen: (addr screen), keyboard: (addr keyboard), data-disk: (addr disk) {
|
|
var count/ecx: int <- copy 0
|
|
# widget title
|
|
set-cursor-position screen, 0x1f/x 0xe/y
|
|
draw-text-rightward-from-cursor-over-full-screen screen, " Counter ", 0xf/fg 0x16/bg
|
|
# event loop
|
|
{
|
|
# draw current state to screen
|
|
clear-rect screen, 0x1f/xmin 0xf/ymin, 0x40/xmax 0x14/ymax, 0xc5/color
|
|
set-cursor-position screen, 0x20/x 0x10/y
|
|
draw-int32-decimal-wrapping-right-then-down-from-cursor-over-full-screen screen, count, 7/fg 0xc5/bg
|
|
# render a menu bar
|
|
set-cursor-position screen, 0x24/x 0x12/y
|
|
draw-text-rightward-from-cursor-over-full-screen screen, " enter ", 0/fg 0x5c/bg=highlight
|
|
draw-text-rightward-from-cursor-over-full-screen screen, " increment ", 7/fg 0xc5/bg
|
|
# process a single keystroke
|
|
{
|
|
var key/eax: byte <- read-key keyboard
|
|
compare key, 0
|
|
loop-if-=
|
|
compare key, 0xa/newline
|
|
break-if-!=
|
|
count <- increment
|
|
}
|
|
loop
|
|
}
|
|
}
|