From 9a7e5742207bf316d408aa7515a9fa956ed9edfa Mon Sep 17 00:00:00 2001 From: rs <> Date: Fri, 10 Oct 2025 00:40:58 -0500 Subject: [PATCH] Use local labels and fix duplicated label --- projects/cpu_0/asm/entry.asm | 10 ++-- projects/cpu_0/asm/host.asm | 10 ++-- projects/cpu_0/asm/ps2_keyboard.asm | 46 +++++++-------- projects/cpu_0/asm/runtime.asm | 89 ++++++++++++++++++++++------- projects/cpu_0/asm/uart_console.asm | 12 ++-- 5 files changed, 107 insertions(+), 60 deletions(-) diff --git a/projects/cpu_0/asm/entry.asm b/projects/cpu_0/asm/entry.asm index 2f6f69f..8390d1c 100644 --- a/projects/cpu_0/asm/entry.asm +++ b/projects/cpu_0/asm/entry.asm @@ -7,18 +7,18 @@ start: #8 0xc3i8 call host_seg_lower_set #8 0x02i8 call host_seg_dp_set -_start_wait_ps2: +.wait_ps2: call ps2_available - jz _start_wait_ps2 + jz .wait_ps2 call ps2_getc dup call uart_putc call vga_console_putc - jmp _start_wait_ps2 + jmp .wait_ps2 halt: #8 0xc0i8 #32 host_swled !8 drop -_halt: - jmp _halt +.halt: + jmp .halt greetz_uart: diff --git a/projects/cpu_0/asm/host.asm b/projects/cpu_0/asm/host.asm index ec340ad..4c6d1af 100644 --- a/projects/cpu_0/asm/host.asm +++ b/projects/cpu_0/asm/host.asm @@ -67,7 +67,7 @@ seg_upper_clr: ( Clear the seven-segment display lower byte ) ( -- ) -seg_upper_clr: +seg_lower_clr: #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 ) @@ -78,22 +78,22 @@ seg_upper_clr: ( Turn on a decimal point on the seven-segment display ) ( n -- ) host_seg_dp_set: - dup #8 0x03i8 - jn _host_seg_dp_set_x + dup #8 0x03i8 - jn .x #32 host_sseg0 + dup @8 #8 0x7fi8 & swap !8 -_host_seg_dp_set_x: +.x: drop ; ( Turn off a decimal point on the seven-segment display ) ( n -- ) host_seg_dp_clr: - dup #8 0x03i8 - jn _host_seg_dp_clr_x + dup #8 0x03i8 - jn .x #32 host_sseg0 + dup @8 #8 0x80i8 | swap !8 -_host_seg_dp_clr_x: +.x: drop ; diff --git a/projects/cpu_0/asm/ps2_keyboard.asm b/projects/cpu_0/asm/ps2_keyboard.asm index b3e67c9..4d73421 100644 --- a/projects/cpu_0/asm/ps2_keyboard.asm +++ b/projects/cpu_0/asm/ps2_keyboard.asm @@ -20,23 +20,23 @@ ps2_reset: ( -- ) 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: ; @@ -44,20 +44,20 @@ _ps2_int_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 + @@ -66,15 +66,15 @@ _ps2_handle_scancode_notcapslock: #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 ; @@ -94,21 +94,21 @@ ps2_handle_keypress: | 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 ; @@ -125,11 +125,11 @@ ps2_available: 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: ; diff --git a/projects/cpu_0/asm/runtime.asm b/projects/cpu_0/asm/runtime.asm index 1798a0c..e5ad06f 100644 --- a/projects/cpu_0/asm/runtime.asm +++ b/projects/cpu_0/asm/runtime.asm @@ -116,8 +116,8 @@ isr_timer1: ( ivec -- ) isr_unknown: #32 host_swled !8 drop idis -_isr_unknown_halt: - jmp _isr_unknown_halt +.halt: + jmp .halt ( ---------------------------------------------------------------------------- ) @@ -131,32 +131,32 @@ mem_move: >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 ; @@ -164,13 +164,13 @@ _mem_move_done: ( 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 ; @@ -178,12 +178,59 @@ _mem_set_8_done: ( 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: + ; diff --git a/projects/cpu_0/asm/uart_console.asm b/projects/cpu_0/asm/uart_console.asm index f0895ea..d3415b1 100644 --- a/projects/cpu_0/asm/uart_console.asm +++ b/projects/cpu_0/asm/uart_console.asm @@ -19,9 +19,9 @@ uart_int: ( c -- ) uart_putc: ( Wait for available space in the Tx FIFO ) -_uart_putc_wait: +.wait: #32 uart_iflag @8 - #8 0x04i8 & jz _uart_putc_wait + #8 0x04i8 & jz .wait ( Write byte to UART data register ) #32 uart_data !8 drop ; @@ -30,11 +30,11 @@ _uart_putc_wait: ( Print an ASCIIZ string out the UART ) ( &s -- ) uart_puts: -_uart_puts_loop: - dup @8 dup jz _uart_puts_done +.loop: + dup @8 dup jz .done call uart_putc - #8 0x01i8 + jmp _uart_puts_loop -_uart_puts_done: + #8 0x01i8 + jmp .loop +.done: drop drop ; -- 2.43.0