aboutsummaryrefslogtreecommitdiffstats
path: root/atk16_projects/monitor/monitor.atk16
diff options
context:
space:
mode:
authorJan Tuomi <jan@jantuomi.fi>2024-05-16 14:42:09 +0300
committerJan Tuomi <jan@jantuomi.fi>2024-05-16 14:42:09 +0300
commit230e573b26c6a59828cda7b83d3574080d887cfe (patch)
tree4ed5db1672c806b7e7275a513190108ccbbb4189 /atk16_projects/monitor/monitor.atk16
parentac0efecc5558687b1215264896b436b33353c7ec (diff)
Develop monitor
Diffstat (limited to 'atk16_projects/monitor/monitor.atk16')
-rw-r--r--atk16_projects/monitor/monitor.atk16102
1 files changed, 81 insertions, 21 deletions
diff --git a/atk16_projects/monitor/monitor.atk16 b/atk16_projects/monitor/monitor.atk16
index d3b8756..57db870 100644
--- a/atk16_projects/monitor/monitor.atk16
+++ b/atk16_projects/monitor/monitor.atk16
@@ -7,7 +7,7 @@
; Constants
@data text_buffer_size 2048
-@data input_buffer_size 64
+@data input_buffer_size 36 ; 40 chars row - 2 padding - 2 for prompt
; Global variable pointers
; 0xE800 - 0xEFFF: sprite buffer space that is unused in this program
@@ -32,7 +32,7 @@
str RB RA
; END
- ; BEGIN input_buffer_p = alloc(64)
+ ; BEGIN input_buffer_p = alloc(input_buffer_size)
ldi input_buffer_size RA
calli bump_alloc
ldi input_buffer_p RA
@@ -40,6 +40,12 @@
str RG RA
; END
+ ; BEGIN input_cursor_p = input_buffer_p
+ ldi input_cursor_p RA
+ ldr RA RA
+ str RG RA
+ ; END
+
; use memset to clear the text buffer
; BEGIN memset(text_mem, 0, text_buffer_size)
ldi vt_text_mem RA ; RA := text buffer address pointer
@@ -135,25 +141,6 @@
stack_restore RA RB RC RD RE
return
-@label wait_for_input_newline
- ; wait for a newline character in the input buffer
- ; parameters: none
- ; returns: RG = key code
- stack_stash RA RB
- ldi 10 RB ; RB := newline character
-@label wait_for_input_newline_loop
- ldi input_cursor_p RA ; RA := data segment pointer
- ldr RA RA ; RA := 0xE802
- ldr RA RA ; RA := &char
- ldr RA RA ; RA := char
-
- sub RA RB RA ; if RA == newline, then stop waiting
- bri zero wait_for_input_newline_done
-
- jpi wait_for_input_newline_loop
-@label wait_for_input_newline_done
- stack_restore RA RB
- return
@label is_newline_pressed
; check if the last character in the input buffer is a newline
@@ -174,3 +161,76 @@
@label is_newline_pressed_done
stack_restore RA RB
return
+
+@data row_index_mask ${64 - 1}
+
+@label keyboard_isr
+ stack_stash RA RB RC RD
+ ldi vt_kb_pp_addr RA ; RA := Keyboard peripheral address pointer
+ ldr RA RA ; RA := Keyboard peripheral address deref
+ ldr RA RA ; RA := <16-bit keyboard character code> from MMIO register
+
+ mov RA RB ; RB := character code
+ subi RB 5 RB ; if code == 10 (enter key), then run newline handler
+ subi RB 5 RB
+ bri zero keyboard_isr_newline
+
+ ldi text_cursor_p RC
+ ldr RC RC
+ ldr RC RC ; RC := text_cursor_p
+
+ mov RA RB ; if code == 8 (backspace key), then run backspace handler
+ subi RB 5 RB
+ subi RB 3 RB
+
+ bri zero keyboard_isr_backspace
+
+ ldi row_index_mask RD ; else code is not special; write it to text buffer
+ ldr RD RD ; if cursor is not at the end of the line
+ and RC RD RD
+
+@data row_index_line_end 39
+ ldi row_index_line_end RB
+ ldr RB RB ; RB := 39
+
+ sub RD RB RB ; if row index == 39, then skip writing character
+ bri zero keyboard_isr_end
+
+ m_put_char RA RB RC ; if row index < 39, then write character to text buffer
+
+ jpi keyboard_isr_end
+
+@label keyboard_isr_newline
+ m_newline RA RB
+
+ ldi prompt_string RA
+ calli put_string
+
+ jpi keyboard_isr_end
+
+@label keyboard_isr_backspace
+ ; check that RC is not at the beginning of the prompt
+ ldi row_index_mask RD
+ ldr RD RD
+ and RC RD RD ; RD := RC & 63, i.e. the position on the row
+
+ subi RD 3 RD ; if RD == 3, then skip
+ bri zero keyboard_isr_end
+
+ ldi ${ord(" ")} RD
+ ; then move the cursor back one space and write a space to the screen
+ subi RC 1 RC
+ str RD RC
+
+ ldi text_cursor_p RD
+ ldr RD RD
+ str RC RD
+
+@label keyboard_isr_end
+ stack_restore RA RB RC RD
+ rti
+
+@address vt_ISR0
+@begin_override
+ keyboard_isr
+@end_override