From 9854017d73ec98dfda74de196720e29310241164 Mon Sep 17 00:00:00 2001 From: Ryan <> Date: Mon, 6 Oct 2025 20:20:22 -0500 Subject: [PATCH] Add PS2 keyboard handling and remove old source --- projects/cpu_0/asm/entry.asm | 8 + projects/cpu_0/asm/ps2_keyboard.asm | 292 ++++++++++++++++++++ projects/cpu_0/asm/write.asm | 411 ---------------------------- 3 files changed, 300 insertions(+), 411 deletions(-) delete mode 100644 projects/cpu_0/asm/write.asm diff --git a/projects/cpu_0/asm/entry.asm b/projects/cpu_0/asm/entry.asm index 73ce9b1..2f6f69f 100644 --- a/projects/cpu_0/asm/entry.asm +++ b/projects/cpu_0/asm/entry.asm @@ -7,6 +7,14 @@ start: #8 0xc3i8 call host_seg_lower_set #8 0x02i8 call host_seg_dp_set +_start_wait_ps2: + call ps2_available + jz _start_wait_ps2 + call ps2_getc + dup call uart_putc + call vga_console_putc + jmp _start_wait_ps2 + halt: #8 0xc0i8 #32 host_swled !8 drop _halt: diff --git a/projects/cpu_0/asm/ps2_keyboard.asm b/projects/cpu_0/asm/ps2_keyboard.asm index 3510b0f..b3e67c9 100644 --- a/projects/cpu_0/asm/ps2_keyboard.asm +++ b/projects/cpu_0/asm/ps2_keyboard.asm @@ -4,10 +4,302 @@ ps2_reset: ( Enable PS2 block and Rx interrupt ) #8 0x41i8 #32 ps2_ctrl !8 drop #8 0x01i8 #32 ps2_imask !8 drop + + ( Clear the key statuses ) + #8 0x00i8 #32 ps2_is_keyup !8 + #32 ps2_is_extended !8 + #32 ps2_is_caplock !8 + #32 ps2_buffer_head !8 + #32 ps2_buffer_tail !8 drop + #32 ps2_keydown #8 0x00i8 #32 0x00000200i32 call mem_set_8 + ; ( PS2 interface interrupt ) ( -- ) ps2_int: + ( Restart on critical errors ) + #32 ps2_error @8 jz _ps2_int_noerror + #8 0x00i8 #32 ps2_ctrl !8 drop + nop nop nop nop nop nop nop nop ( Guarantee at least 16 clock cycles to flush the SRL counters ) + nop nop nop nop nop nop nop nop + #8 0x41i8 #32 ps2_ctrl !8 drop + ; + +_ps2_int_noerror: + ( Clear any w1c flags that are unhandled so far ) + #32 ps2_iflag @8 + #32 ps2_iflag !8 + + ( Check for available bytes ) + #8 0x01i8 & jz _ps2_int_ret + #32 ps2_data @8 + call ps2_handle_scancode +_ps2_int_ret: + ; + + +( Handle a byte coming in from the PS2 interface ) +( scancode -- ) +ps2_handle_scancode: + ( Check for scancode modifier flags ) + dup #8 0xf0i8 - jz _ps2_handle_scancode_mark_keyup + dup #8 0xe0i8 - jz _ps2_handle_scancode_mark_extended + + ( Check for capslock toggle ) + dup #8 0x58i8 - jz _ps2_handle_scancode_capslock ( skip if not capslock key ) + jmp _ps2_handle_scancode_notcapslock +_ps2_handle_scancode_capslock: + #32 ps2_keydown #8 0x58i8 + @8 + jp _ps2_handle_scancode_notcapslock ( skip if capslock key already down ) + #32 ps2_is_keyup @8 + jp _ps2_handle_scancode_notcapslock ( skip if current scancode is break ) + #32 ps2_is_caplock @8 #8 0x01i8 ^ + #32 ps2_is_caplock !8 drop ( toggle capslock state ) +_ps2_handle_scancode_notcapslock: + + ( Record the key up/down status ) + dup #32 ps2_keydown + + #32 ps2_is_extended @8 + shl shl shl shl shl shl shl shl + + #32 ps2_is_keyup @8 #8 0x01i8 ^ + swap !8 drop + + #32 ps2_is_keyup @8 jp _ps2_handle_scancode_done + dup call ps2_handle_keypress + +_ps2_handle_scancode_done: + #8 0x00i8 #32 ps2_is_keyup !8 + #32 ps2_is_extended !8 drop drop ; +_ps2_handle_scancode_mark_keyup: + #8 0x01i8 #32 ps2_is_keyup !8 drop drop ; +_ps2_handle_scancode_mark_extended: + #8 0x01i8 #32 ps2_is_extended !8 drop drop ; + + +( Handle a keypress event to convert to ASCII and insert into the buffer ) +( scancode -- ) +ps2_handle_keypress: + ( 0b00000cas - ctrl alt shift ) + #32 ps2_keydown #8 0x14i8 + @8 ( Left ctrl ) + #32 ps2_keydown #32 0x114i32 + @8 | ( Or right ctrl ) + shl + #32 ps2_keydown #8 0x11i8 + @8 ( Left alt ) + #32 ps2_keydown #32 0x111i32 + @8 | ( Or right alt ) + | shl + #32 ps2_keydown #8 0x12i8 + @8 ( Left shift ) + #32 ps2_keydown #8 0x59i8 + @8 | ( Or right shift ) + #32 ps2_is_caplock @8 ^ ( Xor capslock state ) + | + shl shl shl shl shl shl shl shl | + #32 ps2_scancode_lut + @8 + dup jz _ps2_handle_keypress_done + dup jn _ps2_handle_keypress_done + dup call ps2_putc +_ps2_handle_keypress_done: + drop ; + + +( Put an ASCII character into the buffer for later, drops if no space available ) +( c -- ) +ps2_putc: + call ps2_available #8 0x0fi8 - jz _ps2_putc_done + #32 ps2_buffer_head @8 #32 ps2_buffer + !8 + #32 ps2_buffer_head @8 #8 0x01i8 + #8 0x0fi8 & + #32 ps2_buffer_head !8 drop +_ps2_putc_done: + drop ; + + +( Check if data are available in the buffer ) +( -- N ) +ps2_available: + #32 ps2_buffer_tail @8 + #32 ps2_buffer_head @8 + - #8 0x0fi8 & ; + + +( Get an ASCII character from the buffer, NUL if none are available ) +( -- c ) +ps2_getc: + #8 0x00i8 + call ps2_available + jz _ps2_getc_done + #32 ps2_buffer_tail @8 #32 ps2_buffer + @8 + + #32 ps2_buffer_tail @8 #8 0x01i8 + #8 0x0fi8 & + #32 ps2_buffer_tail !8 drop +_ps2_getc_done: ; + + +( ---------------------------------------------------------------------------- ) +( Scancode to ASCII look up table ) + +ps2_scancode_lut: + ( Unmodified ) + ( 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f ) + ( 0x00 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x09i8 "`" 0x00i8 + ( 0x10 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 "q" "1" 0x00i8 0x00i8 0x00i8 "z" "s" "a" "w" "2" 0x00i8 + ( 0x20 ) 0x00i8 "c" "x" "d" "e" "4" "3" 0x00i8 0x00i8 0x20i8 "v" "f" "t" "r" "5" 0x00i8 + ( 0x30 ) 0x00i8 "n" "b" "h" "g" "y" "6" 0x00i8 0x00i8 0x00i8 "m" "j" "u" "7" "8" 0x00i8 + ( 0x40 ) 0x00i8 "," "k" "i" "o" "0" "9" 0x00i8 0x00i8 "." "/" "l" ";" "p" "-" 0x00i8 + ( 0x50 ) 0x00i8 0x00i8 "'" 0x00i8 "[" 0x3di8 0x00i8 0x00i8 0x00i8 0x00i8 0x0ai8 "]" 0x00i8 "\" 0x00i8 0x00i8 + ( 0x60 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x08i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x70 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x80 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x90 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xa0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xb0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xc0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xd0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xe0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xf0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + + ( Shift ) + ( 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f ) + ( 0x00 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x09i8 "~" 0x00i8 + ( 0x10 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 "Q" "!" 0x00i8 0x00i8 0x00i8 "Z" "S" "A" "W" "@" 0x00i8 + ( 0x20 ) 0x00i8 "C" "X" "D" "E" "$" "#" 0x00i8 0x00i8 0x20i8 "V" "F" "T" "R" "%" 0x00i8 + ( 0x30 ) 0x00i8 "N" "B" "H" "G" "Y" "^" 0x00i8 0x00i8 0x00i8 "M" "J" "U" "&" "*" 0x00i8 + ( 0x40 ) 0x00i8 "<" "K" "I" "O" ")" "(" 0x00i8 0x00i8 ">" "?" "L" ":" "P" "_" 0x00i8 + ( 0x50 ) 0x00i8 0x00i8 0x22i8 0x00i8 "{" "+" 0x00i8 0x00i8 0x00i8 0x00i8 0x0ai8 "}" 0x00i8 "|" 0x00i8 0x00i8 + ( 0x60 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x08i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x70 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x80 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x90 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xa0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xb0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xc0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xd0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xe0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xf0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + + ( Alt ) + ( 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f ) + ( 0x00 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x10 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x20 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x30 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x40 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x50 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x60 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x70 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x80 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x90 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xa0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xb0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xc0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xd0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xe0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xf0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + + ( Alt+Shift ) + ( 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f ) + ( 0x00 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x10 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x20 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x30 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x40 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x50 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x60 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x70 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x80 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x90 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xa0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xb0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xc0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xd0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xe0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xf0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + + ( Ctrl ) + ( 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f ) + ( 0x00 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x09i8 "`" 0x00i8 + ( 0x10 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x11i8 0x00i8 0x00i8 0x00i8 0x00i8 0x1ai8 0x13i8 0x01i8 0x17i8 0x00i8 0x00i8 + ( 0x20 ) 0x00i8 0x03i8 0x18i8 0x04i8 0x05i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x16i8 0x06i8 0x14i8 0x12i8 0x00i8 0x00i8 + ( 0x30 ) 0x00i8 0x0ei8 0x02i8 0x08i8 0x07i8 0x19i8 0x00i8 0x00i8 0x00i8 0x00i8 0x0di8 0x0ai8 0x15i8 0x00i8 0x00i8 0x00i8 + ( 0x40 ) 0x00i8 "," 0x0bi8 0x09i8 0x0fi8 0x00i8 0x00i8 0x00i8 0x00i8 "." "/" 0x0ci8 ";" 0x10i8 "-" 0x00i8 + ( 0x50 ) 0x00i8 0x00i8 "'" 0x00i8 0x1bi8 0x3di8 0x00i8 0x00i8 0x00i8 0x00i8 0x0ai8 0x1di8 0x00i8 0x1ci8 0x00i8 0x00i8 + ( 0x60 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x08i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x70 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x80 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x90 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xa0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xb0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xc0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xd0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xe0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xf0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + + ( Ctrl+Shift ) + ( 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f ) + ( 0x00 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x10 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x20 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x30 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x40 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x50 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x60 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x70 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x80 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x90 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xa0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xb0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xc0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xd0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xe0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xf0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + + ( Ctrl+Alt ) + ( 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f ) + ( 0x00 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x10 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x20 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x30 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x40 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x50 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x60 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x70 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x80 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x90 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xa0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xb0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xc0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xd0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xe0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xf0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + + ( Ctrl+Alt+Shift ) + ( 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0a 0x0b 0x0c 0x0d 0x0e 0x0f ) + ( 0x00 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x10 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x20 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x30 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x40 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x50 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x60 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x70 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x80 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0x90 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xa0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xb0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xc0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xd0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xe0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + ( 0xf0 ) 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 0x00i8 + + +( ---------------------------------------------------------------------------- ) +( RAM variables ) + +ps2_is_keyup=0x01001000 +ps2_is_extended=0x01001001 +ps2_is_caplock=0x01001002 +ps2_buffer_head=0x01001003 +ps2_buffer_tail=0x01001004 +ps2_buffer=0x01001010 + +( 512 bytes, 256 normal scancodes, 256 extended 0xe0 scancodes ) +( ps2_keydown[N] = 0x00 if key with scancode N is up, 0x01 if down ) +ps2_keydown=0x01001100 diff --git a/projects/cpu_0/asm/write.asm b/projects/cpu_0/asm/write.asm deleted file mode 100644 index 33a1f0f..0000000 --- a/projects/cpu_0/asm/write.asm +++ /dev/null @@ -1,411 +0,0 @@ -( VGA region bases ) -vga_scr=0x02000000 -vga_tile=0x02004000 -vga_pal=0x02006000 - -( host registers ) -host_ctrl=0x02008000 -host_flags=0x02008001 -host_mbox=0x02008002 -host_swled=0x02008003 -host_sseg0=0x02008004 -host_sseg1=0x02008005 -host_sseg2=0x02008006 -host_sseg3=0x02008007 - -( ps2 registers ) -ps2_ctrl=0x02008008 -ps2_imask=0x02008009 -ps2_iflag=0x0200800a -ps2_error=0x0200800b -ps2_data=0x0200800c - -( rs232 registers ) -uart_ctrl=0x02008010 -uart_baudl=0x02008011 -uart_baudh=0x02008012 -uart_imask=0x02008013 -uart_iflag=0x02008014 -uart_data=0x02008015 - -( timer registers ) -timer0_ctrl=0x02008018 -timer0_count_l=0x02008019 -timer0_count_m=0x0200801a -timer0_count_h=0x0200801b -timer1_ctrl=0x0200801c -timer1_count_l=0x0200801d -timer1_count_m=0x0200801e -timer1_count_h=0x0200801f - - -( ---------------------------------------------------------------------------- ) -( Interrupt service routines ) - - -( ivec -- ) -isr: - dup #8 5i8 - jn isr_unk - dup + dup + #32 isr_jumptable + @32 >r ; - - align -isr_jumptable: - isr_reset - isr_flags - isr_ps2 - isr_uart - isr_timer0 - isr_timer1 - - -( reset ) -isr_reset: - ( Write palette to VGA controller ) - #8 0x00i8 #32 vga_pal #8 0x00i8 + !8 drop - #8 0x60i8 #32 vga_pal #8 0x01i8 + !8 drop - #8 0x03i8 #32 vga_pal #8 0x02i8 + !8 drop - #8 0x01i8 #32 vga_pal #8 0x03i8 + !8 drop - #8 0x6ci8 #32 vga_pal #8 0x04i8 + !8 drop - #8 0x0di8 #32 vga_pal #8 0x05i8 + !8 drop - #8 0x61i8 #32 vga_pal #8 0x06i8 + !8 drop - #8 0x6di8 #32 vga_pal #8 0x07i8 + !8 drop - #8 0x92i8 #32 vga_pal #8 0x08i8 + !8 drop - #8 0xe0i8 #32 vga_pal #8 0x09i8 + !8 drop - #8 0x1ci8 #32 vga_pal #8 0x0ai8 + !8 drop - #8 0x13i8 #32 vga_pal #8 0x0bi8 + !8 drop - #8 0xfci8 #32 vga_pal #8 0x0ci8 + !8 drop - #8 0x1fi8 #32 vga_pal #8 0x0di8 + !8 drop - #8 0xe3i8 #32 vga_pal #8 0x0ei8 + !8 drop - #8 0xffi8 #32 vga_pal #8 0x0fi8 + !8 drop - - ( Clear LEDs ) - #8 0x00i8 #32 host_swled !8 drop - #8 0xffi8 #32 host_sseg0 !8 drop - #8 0xffi8 #32 host_sseg1 !8 drop - #8 0xffi8 #32 host_sseg2 !8 drop - #8 0xffi8 #32 host_sseg3 !8 drop - - ( Enable PS2 block and Rx interrupt ) - ( #8 0x41i8 #32 ps2_ctrl !8 drop - #8 0x01i8 #32 ps2_imask !8 drop ) - - ( 9600 baud, enable Tx/Rx ) - #8 0x01i8 #32 uart_baudh !8 drop - #8 0x46i8 #32 uart_baudl !8 drop - ( #8 0x01i8 #32 uart_imask !8 drop ) - #8 0x13i8 #32 uart_ctrl !8 drop - - ( Enable timer 0 with 1s period, auto-restart ) - ( #8 0x02i8 #32 timer0_count_h !8 drop ) - ( #8 0xfai8 #32 timer0_count_m !8 drop ) - ( #8 0xf0i8 #32 timer0_count_l !8 drop ) - ( #8 0x0fi8 #32 timer0_ctrl !8 drop ) - - ( enable interrupts and start ) - ien jmp start - - -( host flags ) -isr_flags: - #8 0x81i8 #32 host_swled !8 drop - - #32 host_flags @8 - #32 host_swled !8 - #32 host_flags !8 drop - ien ; - - -( ps2 ) -isr_ps2: - #8 0x82i8 #32 host_swled !8 drop - ( Pull data ) - #32 ps2_data @8 - #32 host_swled !8 drop - ien ; - - -( uart ) -isr_uart: - #8 0x83i8 #32 host_swled !8 drop - ( echo ) - #32 uart_data @8 - #32 uart_data !8 drop - ien ; - - -( timer 0 ) -isr_timer0: - #8 0x84i8 #32 host_swled !8 drop - ( clear interrupt flag ) - #32 timer0_ctrl @8 - #32 timer0_ctrl !8 drop - ien ; - - -( timer 1 ) -isr_timer1: - #8 0x85i8 #32 host_swled !8 drop - ( clear interrupt flag ) - #32 timer1_ctrl @8 - #32 timer1_ctrl !8 drop - ien ; - - -( unknown ) -isr_unk: - #8 0xffi8 #32 host_swled !8 drop - jmp halt - - -( ---------------------------------------------------------------------------- ) -( VGA subroutines ) - - -cursor_loc=0x01000000 -cursor_col=0x01000004 - - -( Set up the cursor position and color ) -( -- ) -console_init: - #8 0x00i8 #32 cursor_loc !32 drop ( Set the cursor to the beginning of the screen ) - #8 0x3bi8 #32 cursor_col !8 drop ( Set the cursor color to light blue on dark blue ) - #32 vga_scr #32 0x00003b20i32 #32 4800i32 call mem_set_16 - ; - - -( Print a character to the VGA display ) -( c -- ) -console_putc: - #32 vga_scr #32 cursor_loc @32 + dup >r - !8 drop - #32 cursor_col @8 r> #8 1i8 + !8 drop - #32 cursor_loc dup @32 #8 0x02i8 + swap !32 drop - ; - - -( Print an ASCIIZ string out the VGA display ) -( &s -- ) -console_puts: -_console_puts_loop: - dup @8 dup jz _console_puts_done - call console_putc - #8 0x01i8 + jmp _console_puts_loop -_console_puts_done: - drop drop ; - - -( ---------------------------------------------------------------------------- ) -( Host controller subroutines ) - - -( Print a byte to the seven-segment display upper byte ) -( b -- ) -seg_put_upper: - dup #8 0x0fi8 & ( Extract lower nibble ) - #32 seg_lut + @8 ( Look up segment value ) - #32 host_sseg2 @8 ( Read existing value ) - #8 0x80i8 & | ( Mask out only the decimal point and combine ) - #32 host_sseg2 !8 drop ( Write back to segment register ) - - lsr lsr lsr lsr ( Extract upper nibble ) - #32 seg_lut + @8 ( Look up segment value ) - #32 host_sseg3 @8 ( Read existing value ) - #8 0x80i8 & | ( Mask out only decimal point and combine ) - #32 host_sseg3 !8 drop ( Write back to segment register ) - - ; - - -( Print a byte to the seven-segment display lower byte ) -( b -- ) -seg_put_lower: - dup #8 0x0fi8 & ( Extract lower nibble ) - #32 seg_lut + @8 ( Look up segment value ) - #32 host_sseg0 @8 ( Read existing value ) - #8 0x80i8 & | ( Mask out only the decimal point and combine ) - #32 host_sseg0 !8 drop ( Write back to segment register ) - - lsr lsr lsr lsr ( Extract upper nibble ) - #32 seg_lut + @8 ( Look up segment value ) - #32 host_sseg1 @8 ( Read existing value ) - #8 0x80i8 & | ( Mask out only decimal point and combine ) - #32 host_sseg1 !8 drop ( Write back to segment register ) - - ; - - -( Clear the seven-segment display upper byte ) -( -- ) -seg_clr_upper: - #32 host_sseg2 @8 #8 0x7fi8 | ( Read original value and clear all segments except point ) - #32 host_sseg2 !8 drop ( Write back into segment register ) - #32 host_sseg3 @8 #8 0x7fi8 | ( Read original value and clear all segments except point ) - #32 host_sseg3 !8 drop ( Write back into segment register ) - ; - - -( Clear the seven-segment display lower byte ) -( -- ) -seg_clr_upper: - #32 host_sseg0 @8 #8 0x7fi8 | ( Read original value and clear all segments except point ) - #32 host_sseg0 !8 drop ( Write back into segment register ) - #32 host_sseg1 @8 #8 0x7fi8 | ( Read original value and clear all segments except point ) - #32 host_sseg1 !8 drop ( Write back into segment register ) - ; - - -( Turn on a decimal point on the seven-segment display ) -( n -- ) -seg_set_dp: - dup #8 0x03i8 - jn _seg_set_dp_x - #32 host_sseg0 + - dup @8 #8 0x7fi8 & - swap !8 -_seg_set_dp_x: - drop ; - - -( Turn off a decimal point on the seven-segment display ) -( n -- ) -seg_clr_dp: - dup #8 0x03i8 - jn _seg_clr_dp_x - #32 host_sseg0 + - dup @8 #8 0x80i8 | - swap !8 -_seg_clr_dp_x: - drop ; - - -seg_lut: - 0x40i8 0x79i8 0x24i8 0x30i8 - 0x19i8 0x12i8 0x02i8 0x78i8 - 0x00i8 0x10i8 0x08i8 0x03i8 - 0x46i8 0x21i8 0x06i8 0x0ei8 - - -( ---------------------------------------------------------------------------- ) -( PS2 subroutines ) - - -( ---------------------------------------------------------------------------- ) -( UART subroutines ) - - -( Print a byte out the UART ) -( c -- ) -uart_putc: - ( Wait for available space in the Tx FIFO ) -_uart_putc_wait: - #32 uart_iflag @8 - #8 0x04i8 & jz _uart_putc_wait - - ( Write byte to UART data register ) - #32 uart_data !8 drop ; - - -( Print an ASCIIZ string out the UART ) -( &s -- ) -uart_puts: -_uart_puts_loop: - dup @8 dup jz _uart_puts_done - call uart_putc - #8 0x01i8 + jmp _uart_puts_loop -_uart_puts_done: - drop drop ; - - -( ---------------------------------------------------------------------------- ) -( Utility subroutines ) - - -( Copy block of bytes, allowing for overlap ) -( src dest count -- ) -mem_move: - >r - >r dup r> swap - >r dup r> swap - - ( dest-src ) - dup jz _mem_move_none - jp _mem_move_back - - ( Copy the block front-to-back ) -_mem_move_front_loop: - r@ jz _mem_move_done - >r dup @8 r@ !8 drop - #8 1i8 + r> #8 1i8 + - #8 1i8 r> - >r - jmp _mem_move_front_loop - -_mem_move_back: - ( Copy the block back-to-front ) - r@ swap >r + - r> r@ + -_mem_move_back_loop: - r@ jz _mem_move_done - #8 1i8 swap - - >r #8 1i8 swap - - dup @8 r@ !8 drop r> - #8 1i8 r> - >r - jmp _mem_move_back_loop - -_mem_move_none: - drop -_mem_move_done: - r> drop drop drop ; - - -( Fill a block of memory with bytes ) -( dest value count -- ) -mem_set_8: - >r -_mem_set_8_loop: - r@ jz _mem_set_8_done - >r dup r> swap !8 - >r #8 1i8 + r> - #8 1i8 r> - >r - jmp _mem_set_8_loop -_mem_set_8_done: - r> drop drop drop ; - - -( Fill a block of memory with 16-bit values ) -( dest value count -- ) -mem_set_16: - >r -_mem_set_16_loop: - r@ jz _mem_set_16_done - >r dup r@ swap !8 drop - #8 1i8 + dup r@ lsr lsr lsr lsr lsr lsr lsr lsr swap !8 drop - #8 1i8 + r> - #8 1i8 r> - >r - jmp _mem_set_16_loop -_mem_set_16_done: - r> drop drop drop ; - - -( ---------------------------------------------------------------------------- ) -( Entry point after reset ) - -start: - ( Send greetz to the l33tz ) - #32 greetz_uart call uart_puts - - #8 0xa5i8 call seg_put_upper - #8 0xc3i8 call seg_put_lower - #8 0x02i8 call seg_set_dp - - call console_init - #32 greetz_vga call console_puts - -halt: - #8 0xc0i8 #32 host_swled !8 drop -_halt: - jmp _halt - - -greetz_uart: - "Hellorld," 0x20i8 "through" 0x20i8 "the" 0x20i8 "UART!" 0x0ai8 0x0di8 0x00i8 - -greetz_vga: - "Hellorld," 0x20i8 "through" 0x20i8 "VGA!" 0x0ai8 0x0di8 0x00i8 -- 2.43.0