]> git.the-white-hart.net Git - vhdl/commitdiff
Add PS2 keyboard handling and remove old source
authorRyan <>
Tue, 7 Oct 2025 01:20:22 +0000 (20:20 -0500)
committerRyan <>
Tue, 7 Oct 2025 01:20:22 +0000 (20:20 -0500)
projects/cpu_0/asm/entry.asm
projects/cpu_0/asm/ps2_keyboard.asm
projects/cpu_0/asm/write.asm [deleted file]

index 73ce9b1414fba3e5ac8c1969e075518abfa15776..2f6f69fd261e8dbe22759b8150c143a4eb31c43d 100644 (file)
@@ -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:
index 3510b0facf0cea4f2aa549b6174ea02d4a8f7dcf..b3e67c9c4c6e28a08668ec82bf657d5b0eb7fbf5 100644 (file)
@@ -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 (file)
index 33a1f0f..0000000
+++ /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