some cleanup, BASIC line finding now properly uses stack
This commit is contained in:
1 parent
bd9211e1ea
commit
5db25db3b5
20 files changed
+116
-86
No files matched your search
@@ -0,0 +1,192 @@
|
||||
// #LAYOUT# STD * #TAKE
|
||||
// #LAYOUT# * BASIC_0 #TAKE
|
||||
// #LAYOUT# * * #IGNORE
|
||||
|
||||
|
||||
shell_main_loop:
|
||||
|
||||
// Tell user we are ready
|
||||
ldx #IDX__STR_READY
|
||||
jsr print_packed_misc_str
|
||||
|
||||
// Enable Kernal messages
|
||||
lda #$80
|
||||
jsr JSETMSG
|
||||
|
||||
shell_read_next_line:
|
||||
|
||||
// Read a line of input
|
||||
ldx #$00
|
||||
!:
|
||||
jsr JCHRIN
|
||||
bcs !-
|
||||
|
||||
// Check for RETURN key
|
||||
cmp #$0D
|
||||
beq shell_got_line
|
||||
|
||||
// Not carriage return, so try to append to line so far
|
||||
cpx #80
|
||||
bcs_16 do_STRING_TOO_LONG_error // see Computes Mapping the 64 p93
|
||||
|
||||
sta BUF,x
|
||||
inx
|
||||
jmp !-
|
||||
|
||||
shell_got_line:
|
||||
|
||||
// Store length of input buffer ready for tokenising
|
||||
stx __tokenise_work1
|
||||
// XXX we should probably store 0 at the end of used BUF
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
shell_strip_leading_spaces:
|
||||
|
||||
// Strip leading spaces from the line
|
||||
lda BUF
|
||||
cmp #$20
|
||||
bne shell_process_line // branch if no more leading spaces
|
||||
|
||||
// We have a leading space - strip it away
|
||||
ldx #$01
|
||||
!:
|
||||
lda BUF,x
|
||||
sta BUF-1,x
|
||||
inx
|
||||
cpx __tokenise_work1
|
||||
bne !-
|
||||
|
||||
// Reduce length of input by one
|
||||
dec __tokenise_work1
|
||||
|
||||
// Stop trying to rim if we run out of input
|
||||
bne shell_strip_leading_spaces
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
shell_process_line:
|
||||
|
||||
// Print a new line
|
||||
jsr print_return
|
||||
|
||||
// Ignore empty lines
|
||||
lda __tokenise_work1
|
||||
beq shell_read_next_line
|
||||
|
||||
// Check if a wedge should take over
|
||||
|
||||
#if CONFIG_DOS_WEDGE || CONFIG_TAPE_WEDGE
|
||||
|
||||
ldx __tokenise_work1 // size of the input, wedges need this XXX this should not be needed
|
||||
|
||||
// Check if DOS wedge should take over
|
||||
lda BUF
|
||||
|
||||
#if CONFIG_DOS_WEDGE
|
||||
|
||||
cmp #$40 // '@'
|
||||
beq_16 wedge_dos
|
||||
|
||||
#endif
|
||||
#if CONFIG_TAPE_WEDGE
|
||||
|
||||
cmp #$5F // left arrow
|
||||
beq_16 wedge_tape
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
// Tokenise the line
|
||||
jsr tokenise_line
|
||||
|
||||
// Has the user entered a line of BASIC beginning with a number?
|
||||
lda BUF
|
||||
cmp #$30
|
||||
bcc shell_execute_line
|
||||
cmp #$39
|
||||
bcs shell_execute_line
|
||||
|
||||
// Yes, the line begins with a number - parse it and check validity
|
||||
|
||||
// The injest_number follows __tokenise_work1 as the offset into the line,
|
||||
// so remember the line length somewhere else for now.
|
||||
lda __tokenise_work1
|
||||
sta __tokenise_work2
|
||||
lda #$00
|
||||
sta __tokenise_work1
|
||||
|
||||
// Try to read line number
|
||||
lda #<BUF
|
||||
sta TXTPTR+0
|
||||
lda #>BUF
|
||||
sta TXTPTR+1
|
||||
|
||||
jsr basic_parse_line_number
|
||||
|
||||
// Get pointer to next char
|
||||
lda TXTPTR+0
|
||||
sta __tokenise_work1
|
||||
|
||||
// Got a valid line number - we will be adding/deleting a new line
|
||||
|
||||
// Skip any spaces after the line number
|
||||
ldx __tokenise_work1
|
||||
!:
|
||||
lda BUF,x
|
||||
cmp #$20
|
||||
bne !+
|
||||
inx
|
||||
bne !-
|
||||
!:
|
||||
stx __tokenise_work1
|
||||
|
||||
// FALLTROUGH
|
||||
|
||||
shell_add_delete_line:
|
||||
|
||||
// First, clear all variables, so that we only have to shove BASIC text around
|
||||
jsr basic_do_clr
|
||||
.break
|
||||
// Delete line if present
|
||||
jsr find_line
|
||||
|
||||
// XXX
|
||||
|
||||
bcs !+
|
||||
|
||||
// Delete the line, whether we are deleting or
|
||||
// replacing the line
|
||||
jsr basic_delete_line
|
||||
!:
|
||||
// Insert new line if non-zero length, i.e., that
|
||||
// we are not just deleting the line.
|
||||
lda __tokenise_work1
|
||||
cmp __tokenise_work2
|
||||
beq !+
|
||||
jsr basic_insert_line
|
||||
!:
|
||||
// No READY message after entering or deleting a line of BASIC
|
||||
jmp shell_read_next_line
|
||||
|
||||
|
||||
shell_execute_line:
|
||||
|
||||
// Setup pointer to the statement
|
||||
lda #<BUF
|
||||
sta TXTPTR+0
|
||||
lda #>BUF
|
||||
sta TXTPTR+1
|
||||
|
||||
// There is no stored line, so zero that pointer out
|
||||
lda #$00
|
||||
sta OLDTXT+0
|
||||
sta OLDTXT+1
|
||||
|
||||
// Put invalid line number in current line number value,
|
||||
// so that we know we are in direct mode (Computes Mapping the 64 p19)
|
||||
lda #$FF
|
||||
sta CURLIN+1
|
||||
|
||||
jmp execute_statements
|
||||
Reference in new issue
Block a user