mirror of
https://github.com/imjasonh/nescript
synced 2026-07-11 02:02:58 +00:00
63 lines
1.9 KiB
Text
63 lines
1.9 KiB
Text
|
|
// sha256/keyboard.ne — key-to-character lookup + input dispatch.
|
|||
|
|
//
|
|||
|
|
// The on-screen keyboard is a 5-row × 8-column grid of cells.
|
|||
|
|
// `kb_row` and `kb_col` in state.ne store the cursor position.
|
|||
|
|
// The character produced when the user presses A is looked up
|
|||
|
|
// here. Special values are encoded with ASCII control codes so
|
|||
|
|
// they're distinguishable from printable bytes:
|
|||
|
|
//
|
|||
|
|
// KEY_BKSP (0x08) — bottom row col 6. Delete one char.
|
|||
|
|
// KEY_ENTER (0x0A) — bottom row col 7. Start compression.
|
|||
|
|
//
|
|||
|
|
// The grid layout (matches the keyboard in background.ne):
|
|||
|
|
//
|
|||
|
|
// row 0: A B C D E F G H
|
|||
|
|
// row 1: I J K L M N O P
|
|||
|
|
// row 2: Q R S T U V W X
|
|||
|
|
// row 3: Y Z 0 1 2 3 4 5
|
|||
|
|
// row 4: 6 7 8 9 _ . < >
|
|||
|
|
|
|||
|
|
var KB_CHARS: u8[40] = [
|
|||
|
|
0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, // A B C D E F G H
|
|||
|
|
0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, // I J K L M N O P
|
|||
|
|
0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, // Q R S T U V W X
|
|||
|
|
0x59, 0x5A, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, // Y Z 0 1 2 3 4 5
|
|||
|
|
0x36, 0x37, 0x38, 0x39, 0x20, 0x2E, 0x08, 0x0A // 6 7 8 9 ' ' '.' BKSP ENTER
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
// Look up the character emitted by the key at (kb_row, kb_col).
|
|||
|
|
fun current_key() -> u8 {
|
|||
|
|
var idx: u8 = (kb_row << 3) + kb_col // row * 8 + col
|
|||
|
|
return KB_CHARS[idx]
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Append a byte to the input buffer. Does nothing if the buffer
|
|||
|
|
// is already at INPUT_MAX — users wanting to correct their
|
|||
|
|
// input reach for backspace first.
|
|||
|
|
fun input_append(ch: u8) {
|
|||
|
|
if msg_len >= INPUT_MAX {
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
msg[msg_len] = ch
|
|||
|
|
msg_len += 1
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Delete the last byte, if any.
|
|||
|
|
fun input_backspace() {
|
|||
|
|
if msg_len == 0 {
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
msg_len -= 1
|
|||
|
|
msg[msg_len] = 0
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Wipe the entire buffer. Triggered by SELECT from any state.
|
|||
|
|
fun input_clear() {
|
|||
|
|
var i: u8 = 0
|
|||
|
|
while i < INPUT_MAX {
|
|||
|
|
msg[i] = 0
|
|||
|
|
i += 1
|
|||
|
|
}
|
|||
|
|
msg_len = 0
|
|||
|
|
}
|