7762 - baremetal/shell: backspace

The text buffer can now shrink, which means we need to be careful to erase
the old location of the cursor. Just clear screen before render each time.
Which means we need to be more efficient with our rendering.
This commit is contained in:
Kartik K. Agaram 2021-02-20 22:45:10 -08:00
parent 684c096203
commit cf5c8bc6b0
2 changed files with 21 additions and 5 deletions

View File

@ -7,11 +7,13 @@ fn main {
initialize-sandbox sandbox
{
render-sandbox 0/screen, sandbox, 2/x, 2/y
var key/eax: byte <- read-key 0/keyboard
compare key, 0
loop-if-=
# no way to quit right now; just reboot
edit-sandbox sandbox, key
{
var key/eax: byte <- read-key 0/keyboard
compare key, 0
loop-if-=
# no way to quit right now; just reboot
edit-sandbox sandbox, key
}
loop
}
}

View File

@ -34,7 +34,15 @@ fn add-grapheme-to-sandbox _self: (addr sandbox), c: grapheme {
add-grapheme-at-gap data, c
}
fn delete-grapheme-before-cursor _self: (addr sandbox) {
var self/esi: (addr sandbox) <- copy _self
var data-ah/eax: (addr handle gap-buffer) <- get self, data
var data/eax: (addr gap-buffer) <- lookup *data-ah
delete-before-gap data
}
fn render-sandbox screen: (addr screen), _self: (addr sandbox), x: int, y: int {
clear-screen screen
var self/esi: (addr sandbox) <- copy _self
var data-ah/eax: (addr handle gap-buffer) <- get self, data
var data/eax: (addr gap-buffer) <- lookup *data-ah
@ -43,5 +51,11 @@ fn render-sandbox screen: (addr screen), _self: (addr sandbox), x: int, y: int {
fn edit-sandbox self: (addr sandbox), key: byte {
var g/edx: grapheme <- copy key
{
compare g, 8/backspace
break-if-!=
delete-grapheme-before-cursor self
return
}
add-grapheme-to-sandbox self, g
}