32 lines
1.1 KiB
Forth
32 lines
1.1 KiB
Forth
# read line from keyboard into stream while also echoing to screen
|
|
# abort on stream overflow
|
|
fn read-line-from-keyboard keyboard: (addr keyboard), out: (addr stream byte), screen: (addr screen), fg: int, bg: int {
|
|
clear-stream out
|
|
$read-line-from-keyboard:loop: {
|
|
draw-cursor screen, 0x20/space
|
|
var key/eax: byte <- read-key keyboard
|
|
compare key, 0xa/newline
|
|
break-if-=
|
|
compare key, 0
|
|
loop-if-=
|
|
compare key, 8/backspace
|
|
{
|
|
break-if-!=
|
|
undo-append-byte out
|
|
draw-code-point-at-cursor-over-full-screen screen, 0x20/space, fg 0/bg # clear cursor
|
|
move-cursor-left screen
|
|
move-cursor-left screen
|
|
draw-code-point-at-cursor-over-full-screen screen, 0x20/space, fg 0/bg # clear old cursor
|
|
move-cursor-left screen
|
|
loop $read-line-from-keyboard:loop
|
|
}
|
|
var key2/eax: int <- copy key
|
|
append-byte out, key2
|
|
var c/eax: code-point <- copy key2
|
|
draw-code-point-at-cursor-over-full-screen screen, c, fg bg
|
|
loop
|
|
}
|
|
# clear cursor
|
|
draw-code-point-at-cursor-over-full-screen screen, 0x20/space, fg bg
|
|
}
|