diff --git a/c64/basic/,aliases.s b/c64/basic/,aliases.s index e477fe69..712e7c35 100644 --- a/c64/basic/,aliases.s +++ b/c64/basic/,aliases.s @@ -126,6 +126,12 @@ .alias screen_scroll_disable $0292 .alias pal_or_ntsc $02A6 + ;; Registers for SYS call + .alias sys_reg_a $30c + .alias sys_reg_x $30d + .alias sys_reg_y $30e + .alias sys_reg_p $30f + .alias sys_jmp $310 ;; BASIC uses some extra bytes for memory access under ROMs located at $2A7 onwards ;; IRQs are disabled when doing such accesses, and a default NMI handler only increments diff --git a/c64/basic/cmd_sys.s b/c64/basic/cmd_sys.s new file mode 100644 index 00000000..d8d1e984 --- /dev/null +++ b/c64/basic/cmd_sys.s @@ -0,0 +1,32 @@ +cmd_sys: + + jsr basic_end_of_statement_check + bcc + + + ;; SYS requires an argument + ldx #10 + jmp do_basic_error + +* + jsr basic_parse_line_number + + ;; setup call + lda #$4c ;JMP + sta sys_jmp + lda basic_line_number+0 + sta sys_jmp+1 + lda basic_line_number+1 + sta sys_jmp+2 + + ;; Setup the register values + lda sys_reg_p + pha + lda sys_reg_a + ldx sys_reg_x + ldy sys_reg_y + plp + + ;; Call the routine. + jsr sys_jmp + + jmp basic_run_next_statement diff --git a/c64/basic/cmd_unimplemented.s b/c64/basic/cmd_unimplemented.s index 6fc2a27d..bdb846d5 100644 --- a/c64/basic/cmd_unimplemented.s +++ b/c64/basic/cmd_unimplemented.s @@ -29,7 +29,6 @@ cmd_printhash: cmd_print: cmd_cont: cmd_cmd: -cmd_sys: cmd_open: ;; $A0-$AF diff --git a/c64/basic/injest_number.s b/c64/basic/injest_number.s index 947d7d89..a48c995a 100644 --- a/c64/basic/injest_number.s +++ b/c64/basic/injest_number.s @@ -59,6 +59,9 @@ injest_number: ;; Set sign to negative lda #$ff sta basic_fac1_sign + + ;; Skip over the minus sign + jsr basic_consume_character ij_not_minus: @@ -68,7 +71,7 @@ ij_loop1: lda (basic_current_statement_ptr),y cmp #$30 bcc ij_not_a_digit - cmp #$39 + cmp #$3a bcs ij_not_a_digit ;; It is a digit