( -- )
ps2_int:
( Restart on critical errors )
- #32 ps2_error @8 jz _ps2_int_noerror
+ #32 ps2_error @8 jz .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:
+.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
+ #8 0x01i8 & jz .ret
#32 ps2_data @8
call ps2_handle_scancode
-_ps2_int_ret:
+.ret:
;
( 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
+ dup #8 0xf0i8 - jz .mark_keyup
+ dup #8 0xe0i8 - jz .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:
+ dup #8 0x58i8 - jz .capslock ( skip if not capslock key )
+ jmp .notcapslock
+.capslock:
#32 ps2_keydown #8 0x58i8 + @8
- jp _ps2_handle_scancode_notcapslock ( skip if capslock key already down )
+ jp .notcapslock ( skip if capslock key already down )
#32 ps2_is_keyup @8
- jp _ps2_handle_scancode_notcapslock ( skip if current scancode is break )
+ jp .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:
+.notcapslock:
( Record the key up/down status )
dup #32 ps2_keydown +
#32 ps2_is_keyup @8 #8 0x01i8 ^
swap !8 drop
- #32 ps2_is_keyup @8 jp _ps2_handle_scancode_done
+ #32 ps2_is_keyup @8 jp .done
dup call ps2_handle_keypress
-_ps2_handle_scancode_done:
+.done:
#8 0x00i8 #32 ps2_is_keyup !8
#32 ps2_is_extended !8 drop drop ;
-_ps2_handle_scancode_mark_keyup:
+.mark_keyup:
#8 0x01i8 #32 ps2_is_keyup !8 drop drop ;
-_ps2_handle_scancode_mark_extended:
+.mark_extended:
#8 0x01i8 #32 ps2_is_extended !8 drop drop ;
|
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 jz .done
+ dup jn .done
dup call ps2_putc
-_ps2_handle_keypress_done:
+.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
+ call ps2_available #8 0x0fi8 - jz .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:
+.done:
drop ;
ps2_getc:
#8 0x00i8
call ps2_available
- jz _ps2_getc_done
+ jz .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:
+.done:
;
( ivec -- )
isr_unknown:
#32 host_swled !8 drop idis
-_isr_unknown_halt:
- jmp _isr_unknown_halt
+.halt:
+ jmp .halt
( ---------------------------------------------------------------------------- )
>r dup r> swap
>r dup r> swap
- ( dest-src )
- dup jz _mem_move_none
- jp _mem_move_back
+ dup jz .none
+ jp .back
( Copy the block front-to-back )
-_mem_move_front_loop:
- r@ jz _mem_move_done
+.front_loop:
+ r@ jz .done
>r dup @8 r@ !8 drop
#8 1i8 + r> #8 1i8 +
#8 1i8 r> - >r
- jmp _mem_move_front_loop
+ jmp .front_loop
-_mem_move_back:
+.back:
( Copy the block back-to-front )
r@ swap >r +
r> r@ +
-_mem_move_back_loop:
- r@ jz _mem_move_done
+.back_loop:
+ r@ jz .done
#8 1i8 swap -
>r #8 1i8 swap -
dup @8 r@ !8 drop r>
#8 1i8 r> - >r
- jmp _mem_move_back_loop
+ jmp .back_loop
-_mem_move_none:
+.none:
drop
-_mem_move_done:
+.done:
r> drop drop drop ;
( dest value count -- )
mem_set_8:
>r
-_mem_set_8_loop:
- r@ jz _mem_set_8_done
+.loop:
+ r@ jz .done
>r dup r> swap !8
>r #8 1i8 + r>
#8 1i8 r> - >r
- jmp _mem_set_8_loop
-_mem_set_8_done:
+ jmp .loop
+.done:
r> drop drop drop ;
( dest value count -- )
mem_set_16:
>r
-_mem_set_16_loop:
- r@ jz _mem_set_16_done
+.loop:
+ r@ jz .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:
+ jmp .loop
+.done:
r> drop drop drop ;
+
+
+( Multiply two unsigned integers )
+( a b -- b*a )
+mul_uu:
+ #8 0i8 ~ >r >r >r #8 0i8 ( acc ) ( ctr b a )
+.loop:
+ ( acc ) ( ctr b a )
+ ( if ctr == 0 then done )
+ r> r> r> dup jz .done
+
+ ( acc a b ctr ) ( )
+ ( decrement counter )
+ lsr >r
+
+ ( acc a b ) ( ctr )
+ ( shift accumulator )
+ >r >r shl r> r>
+
+ ( acc a b ) ( ctr )
+ ( if b & 0x80000000 then acc += a )
+ dup #32 0x80000000i32 & jz .next
+ >r dup >r +
+
+ ( acc ) ( ctr b a )
+ r> r>
+
+.next:
+ ( acc a b ) ( ctr )
+ shl
+ >r >r jmp .loop
+
+.done:
+ ( acc a b ctr ) ( )
+ drop drop drop ;
+
+
+( Divide an unsigned integer by another unsigned integer )
+( a b -- b/a )
+div_uu:
+ ;
+
+
+( Take one unsigned integer modulo another unsigned integer )
+( a b -- b%a )
+mod_uu:
+ ;