( 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
+++ /dev/null
-( 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