more BASIC cleanup

This commit is contained in:
FeralChild64 committed 2020-06-06 23:10:45 +02:00
1 parent cdeaf05ccd
commit 08f6fe9ed7
14 files changed
+142 -182

No files matched your search

-164
View File
@@ -1,164 +0,0 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// Tries to execute the statement, and all the subsequent ones
//
basic_execute_statement:
// Check for RUN/STOP
lda STKEY
bpl_16 cmd_stop
// Skip over any white spaces and colons (':')
!:
jsr fetch_character
cmp #$20 // space, can be skipped
beq !-
cmp #$3A // colon, can be skipped
beq !-
// Check if end of the line
cmp #$00
beq basic_end_of_line
// Not end of the line - we actually have something to execute
// XXX continue rework from here
pha
jsr unconsume_character
pla
// The checks should be done in order of frequency, so that we are as
// fast as possible.
cmp #$7f
bcc not_a_token
// It is a token - consume this character
jsr consume_character
#if !HAS_OPCODES_65C02
// Get the jump table entry for it, push it on the stack, and then RTS to start it.
tax
lda command_jumptable_hi - $80, x
pha
lda command_jumptable_lo - $80, x
pha
rts
#else // HAS_OPCODES_65C02
asl
tax
jmp (command_jumptable, x)
#endif
not_a_token:
// Space, which we can also just ignore
cmp #$20
beq basic_skip_char
// End of line?
cmp #$00
beq basic_end_of_line
// :, i.e., statement separator, which we can simply ignore
cmp #$3a
beq basic_skip_char
// If all else fails, it is a syntax error
jmp do_SYNTAX_error
basic_skip_char:
jsr consume_character
jmp basic_execute_statement
basic_end_of_line:
// If we reach the end are in direct mode, then
// go back to reading input, else look for the
// next line, and advance to that, or else
// return to READY prompt because we have run out
// of program.
// XXX - If not in direct mode, then advance to next line, if there is
// one.
// Are we in direct mode
lda CURLIN+1
cmp #$ff
bne basic_not_direct_mode
// Yes, we were in direct mode, so stop now
jmp basic_main_loop
basic_not_direct_mode:
// Copy line number to previous line number
lda CURLIN+0
sta OLDLIN+0
lda CURLIN+1
sta OLDLIN+1
// Advance the basic line pointer to the next line
jsr basic_follow_link_to_next_line
// Are we at the end of the program?
lda OLDTXT+0
ora OLDTXT+1
bne basic_execute_from_current_line
// End of program found
jmp basic_main_loop
basic_execute_from_current_line:
// Check if pointer is null, if so, we are at the end of
// the program.
ldy #0
jsr peek_line_pointer_null_check
bcs !+
// End of program reached
jmp basic_main_loop
!:
// Skip pointer and line number to get address of first statement
lda OLDTXT+0
clc
adc #4
sta TXTPTR+0
lda OLDTXT+1
adc #0
sta TXTPTR+1
ldy #2
#if CONFIG_MEMORY_MODEL_60K
ldx #<OLDTXT
jsr peek_under_roms
#else // CONFIG_MEMORY_MODEL_38K
lda (OLDTXT),y
#endif
sta CURLIN+0
iny
#if CONFIG_MEMORY_MODEL_60K
jsr peek_under_roms
#else // CONFIG_MEMORY_MODEL_38K
lda (OLDTXT),y
#endif
sta CURLIN+1
jmp basic_execute_statement
+1 -5
View File
@@ -5,10 +5,6 @@
basic_main_loop:
// XXX - Check if direct or program mode, and get next line of input
// the appropriate way.
// XXX - For now, it is hard coded to direct mode
// Tell user we are ready
jsr ready_message
@@ -177,4 +173,4 @@ not_a_line:
lda #$FF
sta CURLIN+1
jmp basic_execute_statement
jmp execute_statements
+3 -3
View File
@@ -7,6 +7,6 @@ cmd_clr:
jsr basic_do_clr
// CLR command does not stop execution
// (Cconfirmed on a c64)
jmp basic_execute_statement
// CLR command does not stop execution (confirmed on a C64)
jmp execute_statements
+2 -2
View File
@@ -65,7 +65,7 @@ cmd_load_no_error:
// For VERIFY - this is it
lda VERCKB
bne_16 basic_execute_statement
bne_16 execute_statements
// C64 BASIC apparently does not clear variables after a LOAD in the
// middle of a program. For safety, we do.
@@ -89,7 +89,7 @@ cmd_load_no_error:
inx
beq cmd_load_end // branch if direct mode
jmp basic_execute_from_current_line
jmp execute_line
cmd_load_end:
+2 -2
View File
@@ -7,6 +7,6 @@ cmd_new:
jsr basic_do_new
// NEW command terminates execution
// (Confirmed on a C64)
// NEW command terminates execution (confirmed on a C64)
jmp basic_main_loop
+1 -1
View File
@@ -85,4 +85,4 @@ cmd_print_new_line_done:
cmd_print_done:
jmp basic_execute_statement
jmp execute_statements
+2 -1
View File
@@ -6,4 +6,5 @@
// REM statement just skips to the next line
cmd_rem:
jmp basic_end_of_line
jmp execute_statements_end_of_line
+1 -1
View File
@@ -24,4 +24,4 @@ cmd_goto:
jmp do_UNDEFD_STATEMENT_error
!:
// Run it!
jmp basic_execute_from_current_line
jmp execute_line
+1 -1
View File
@@ -36,4 +36,4 @@ cmd_save:
// The end
jmp basic_execute_statement
jmp execute_statements
+1 -1
View File
@@ -62,7 +62,7 @@ cmd_sys_setup_call:
// Call the routine.
jsr USRPOK
jmp basic_execute_statement
jmp execute_statements
//
+3
View File
@@ -7,6 +7,9 @@
//
// XXX use separate jumptables for commands and functions
.const command_list = List().add(
// $80 - $8F
+124
View File
@@ -0,0 +1,124 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// Tries to execute the statement, and all the subsequent ones
//
execute_statements:
// Check for RUN/STOP
lda STKEY
bpl_16 cmd_stop
// Skip over any white spaces and colons (':')
!:
jsr fetch_character
cmp #$20 // space, can be skipped
beq !-
cmp #$3A // colon, can be skipped
beq !-
// Check if end of the line
cmp #$00
beq execute_statements_end_of_line
// Not end of the line - it seems we actually have something to execute
cmp #$7F
bcc_16 do_SYNTAX_error // branch if not a token XXX here we should handle variable assignments
#if !HAS_OPCODES_65C02
// Get the jump table entry for it, push it on the stack, and then RTS to start it.
tax
lda command_jumptable_hi - $80, x
pha
lda command_jumptable_lo - $80, x
pha
rts
#else // HAS_OPCODES_65C02
// Use jumptable to go to the token
asl
tax
jmp (command_jumptable, x)
#endif
execute_statements_end_of_line:
// First check, if we are in direct mode - if so,
// end the execution and go to main loop
ldx CURLIN+1
inx
beq_16 basic_main_loop
// Advance to the next line - first copy the line number
// to previous line number
lda CURLIN+0
sta OLDLIN+0
lda CURLIN+1
sta OLDLIN+1
// Advance the basic line pointer to the next line; if end,
// go to the main loop
jsr basic_follow_link_to_next_line
lda OLDTXT+0
ora OLDTXT+1
beq_16 basic_main_loop
// FALLTROUGH
execute_line:
// Check if pointer is null, if so, we are at the end of the program
ldy #0
jsr peek_line_pointer_null_check
bcc_16 basic_main_loop // branch if end of program reached
// Skip pointer and line number to get address of first statement
lda OLDTXT+0
clc
adc #$04
sta TXTPTR+0
lda OLDTXT+1
adc #$00
sta TXTPTR+1
ldy #$02
#if CONFIG_MEMORY_MODEL_60K
ldx #<OLDTXT
jsr peek_under_roms
#else // CONFIG_MEMORY_MODEL_38K
lda (OLDTXT),y
#endif
sta CURLIN+0
iny
#if CONFIG_MEMORY_MODEL_60K
jsr peek_under_roms
#else // CONFIG_MEMORY_MODEL_38K
lda (OLDTXT),y
#endif
sta CURLIN+1
jmp execute_statements
File renamed without changes.
+1 -1
View File
@@ -98,7 +98,7 @@ wedge_dos_change_drive:
!:
sta FA
jsr print_return
jmp basic_end_of_line
jmp basic_main_loop
wedge_dos_status_get: