begin implementing basic text manipulation routines.

This commit is contained in:
Paul Gardner-Stephen committed 2019-04-27 23:47:06 +09:30
1 parent 6d57d17b74
commit 5358743318
7 files changed
+149 -1

No files matched your search

+13
View File
@@ -25,6 +25,7 @@
.alias basic_start_of_free_space_ptr $31
.alias basic_start_of_strings_ptr $33
.alias basic_top_of_memory_ptr $37
.alias basic_current_line_ptr $3d
.alias basic_numeric_work_area $57 ; $57 - $60 inclusive = 10 bytes
@@ -115,3 +116,15 @@
.alias enable_case_switch $0291
.alias screen_scroll_disable $0292
.alias pal_or_ntsc $02A6
;; 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
;; a counter, so that if an NMI occurs, it doesn't crash the machine, but can be captured.
.alias missed_nmi_flag $2A7
.alias tiny_nmi_handler $2A8
.alias peek_under_roms tiny_nmi_handler+peek_under_roms_routine-tiny_nmi_handler_routine
.alias poke_under_roms tiny_nmi_handler+poke_under_roms_routine-tiny_nmi_handler_routine
.alias memmap_allram tiny_nmi_handler+memmap_allram_routine-tiny_nmi_handler_routine
.alias memmap_normal tiny_nmi_handler+memmap_normal_routine-tiny_nmi_handler_routine
+9
View File
@@ -0,0 +1,9 @@
;; Delete the current BASIC line, which is assumed to have already
;; been found with basic_find_line.
;; Really only consists of copying memory down.
;; The only complication is that we have to do the copy with ROMs
;; banked out. Oh, yes, and we have to update all the links in
;; the following basic lines.
basic_delete_line:
sec
rts
+46
View File
@@ -0,0 +1,46 @@
;; Find the BASIC line with number basic_line_number
basic_find_line:
;; Get pointer to start of BASIC text
lda basic_start_of_text_ptr+0
sta basic_current_line_ptr+0
lda basic_start_of_text_ptr+1
sta basic_current_line_ptr+1
basic_find_line_loop:
;; Then search for line number
;; Line number
ldy #2
ldx #<basic_current_line_ptr
jsr peek_under_roms
cmp basic_line_number+0
bne not_this_line
iny
jsr peek_under_roms
cmp basic_line_number+1
bne not_this_line
clc
rts
not_this_line:
;; Not this line, so advance to next line
ldy #0
ldx #<basic_current_line_ptr
jsr peek_under_roms
bne more_lines_exist
iny
jsr peek_under_roms
bne more_lines_exist
;; no more lines exist, return failure
sec
rts
more_lines_exist:
;; A = high byte of line
pha
dey
jsr peek_under_roms
sta basic_current_line_ptr+0
pla
sta basic_current_line_ptr+1
jmp basic_find_line_loop
+11
View File
@@ -0,0 +1,11 @@
;; Insert the tokenised line stored at $0200.
;; First work out where in the list to put it
;; (basic_find_line with the line number can be used to work
;; out the insertion point, as it should abort once it finds a
;; line number too high).
;; Then all we have to do is push the rest of the BASIC text up,
;; and update the pointers in all following basic lines.
basic_insert_line:
sec
rts
+11 -1
View File
@@ -91,6 +91,12 @@ ml_bad_line_number:
;; Got a valid line number.
;; First, clear all variables, so that we only have to shove BASIC text around.
;; (We could later remove this requirement, and the only effect should be
;; to slow things down, and that you might have to either CLR if there is no
;; memory free, or else it would auto CLR when you ran out of program space).
jsr basic_do_clr
;; Copy to line number holder
lda basic_fac1_mantissa+0
sta basic_line_number+0
@@ -98,8 +104,12 @@ ml_bad_line_number:
sta basic_line_number+1
;; Delete line if present
jsr basic_find_line
bcs +
jsr basic_delete_line
*
;; Insert new line if non-zero length
jsr basic_insert_line
not_a_line:
+2
View File
@@ -1,5 +1,7 @@
;; Clear screen etc, show READY prompt.
basic_warm_start:
jsr install_ram_routines
jmp basic_main_loop
+57
View File
@@ -0,0 +1,57 @@
;; IMPORTANT:
;; These routines lengths cannot be changed without changing
;; the aliases for peek_under_roms, poke_under_roms etc
;; in ,aliases.s.
;; Thus those addresses are expressed using formulae.
install_ram_routines:
;; Copy routines into place
ldx #ram_routines_len-1
*
lda ram_routines_start,x
sta tiny_nmi_handler,x
dex
bpl -
;; Point NMI handler to tiny_nmi_handler
lda #<tiny_nmi_handler
sta $FFFE
lda #>tiny_nmi_handler
sta $FFFF
rts
ram_routines_start:
tiny_nmi_handler_routine:
inc missed_nmi_flag
rti
peek_under_roms_routine:
stx peek_under_roms+7 ;Offset of arg of lda ($00),y
jsr memmap_allram
lda ($00),y
jmp memmap_normal
poke_under_roms_routine:
stx poke_under_roms+7 ;Offset of arg of lda ($00),y
jsr memmap_allram
sta ($00),y
;; FALL THROUGH
memmap_normal_routine:
pha
lda #$37
sta $01
pla
cli
rts
memmap_allram_routine:
sei
lda #$04
sta $01
rts
ram_routines_end:
.alias ram_routines_len ram_routines_end-ram_routines_start