primitive: read line from keyboard

Blocking.
This commit is contained in:
Kartik K. Agaram 2021-10-13 23:14:20 -07:00
parent d280bd8dac
commit db0363462f
2 changed files with 21 additions and 19 deletions

20
516read-line.mu Normal file
View File

@ -0,0 +1,20 @@
# 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
{
draw-cursor screen, 0x20/space
var key/eax: byte <- read-key keyboard
compare key, 0xa/newline
break-if-=
compare key, 0
loop-if-=
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
}

View File

@ -19,28 +19,10 @@ fn main screen: (addr screen), keyboard: (addr keyboard), data-disk: (addr disk)
var in-storage: (stream byte 0x80)
var in/esi: (addr stream byte) <- address in-storage
var y/ecx: int <- copy 0
var space/edx: code-point <- copy 0x20
# read-eval-print loop
{
# print prompt
var x/eax: int <- draw-text-rightward screen, "> ", 0/x, 0x80/xmax, y, 3/fg/cyan, 0/bg
# read line from keyboard
clear-stream in
{
draw-cursor screen, space
var key/eax: byte <- read-key keyboard
compare key, 0xa/newline
break-if-=
compare key, 0
loop-if-=
var key2/eax: int <- copy key
append-byte in, key2
var c/eax: code-point <- copy key2
draw-code-point-at-cursor-over-full-screen screen, c, 0xf/fg, 0/bg
loop
}
# clear cursor
draw-code-point-at-cursor-over-full-screen screen, space, 3/fg/never-used, 0/bg
read-line-from-keyboard keyboard, in, screen, 0xf/fg 0/bg
# parse and eval
var out/eax: int <- simplify in
# print