BASIC editor rework finished

This commit is contained in:
FeralChild64 committed 2020-07-01 03:39:37 +02:00
1 parent 4bae8ae878
commit 8d705f2f6d
23 files changed
+302 -426

No files matched your search

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
Binary file not shown.
+9 -9
View File
@@ -32,7 +32,7 @@
.label LASTPT = $17 // $17-$18 pointer to the last used slot in the temporary string descriptor
.label TEMPST = $19 // $19-$21 temporary string stack descriptors
.label INDEX = $22 // $22-$25 temporary variables, [!] our usage might be different
.label RESHO = $26 // $26-$2A -- NOT IMPLEMENTED --
.label RESHO = $26 // $26-$2A temporary variables, [!] our usage might be different
.label TXTTAB = $2B // $2B-$2C start of BASIC code
.label VARTAB = $2D // $2D-$2E end of BASIC code, start of variables
.label ARYTAB = $2F // $2F-$30 -- NOT IMPLEMENTED --
@@ -235,15 +235,15 @@
// IRQs are disabled when doing such accesses, and a default NMI handler only increments
// a counter, so that if an NMI occurs, it does not crash the machine, but can be captured.
.label missed_nmi_flag = $2A7
.label tiny_nmi_handler = $2A8
.label peek_under_roms = tiny_nmi_handler + peek_under_roms_routine - tiny_nmi_handler_routine
.label poke_under_roms = tiny_nmi_handler + poke_under_roms_routine - tiny_nmi_handler_routine
.label memmap_allram = tiny_nmi_handler + memmap_allram_routine - tiny_nmi_handler_routine
.label memmap_normal = tiny_nmi_handler + memmap_normal_routine - tiny_nmi_handler_routine
.label missed_nmi_flag = $2A7
.label tiny_nmi_handler = $2A8
.label peek_under_roms = tiny_nmi_handler + peek_under_roms_routine - tiny_nmi_handler_routine
.label poke_under_roms = tiny_nmi_handler + poke_under_roms_routine - tiny_nmi_handler_routine
.label memmap_allram = tiny_nmi_handler + memmap_allram_routine - tiny_nmi_handler_routine
.label memmap_normal = tiny_nmi_handler + memmap_normal_routine - tiny_nmi_handler_routine
#if SEGMENT_BASIC
.label shift_mem_up = tiny_nmi_handler + shift_mem_up_routine - tiny_nmi_handler_routine
.label shift_mem_down = tiny_nmi_handler + shift_mem_down_routine - tiny_nmi_handler_routine
.label shift_mem_up_internal = tiny_nmi_handler + shift_mem_up_routine - tiny_nmi_handler_routine
.label shift_mem_down_internal = tiny_nmi_handler + shift_mem_down_routine - tiny_nmi_handler_routine
#endif
#endif // CONFIG_MEMORY_MODEL_60K
+3 -11
View File
@@ -22,7 +22,7 @@ cmd_merge_got_params:
// Make sure VARTAB is correctly set
jsr calculate_VARTAB
jsr update_VARTAB_do_clr
// Perform loading - just for a different address
@@ -42,17 +42,9 @@ cmd_merge_got_params:
cmd_merge_no_error:
// Store last loaded address
// Relink loaded program, clear variables
stx VARTAB+0
sty VARTAB+1
// Clear the variables
jsr do_clr
// Now relink the loaded program, line links supplied are almost certainly wrong
jsr LINKPRG
jsr update_LINKPRG_VARTAB_do_clr
// XXX when number parsing is done, change to continue execution
+1 -2
View File
@@ -17,8 +17,7 @@ cmd_old:
tya
sta (TXTTAB),y
jsr LINKPRG
jsr calculate_VARTAB
jsr update_LINKPRG_VARTAB_do_clr
// Quit
-76
View File
@@ -1,76 +0,0 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// Shift the BASIC program down to cover the area of removed line
//
basic_shift_mem_down_and_relink:
// Destination is OLDTXT
lda OLDTXT+0
sta memmove__dst+0
lda OLDTXT+1
sta memmove__dst+1
// Source is OLDTXT + .X
clc
txa
adc OLDTXT+0
sta memmove__src+0
lda OLDTXT+1
adc #$00
sta memmove__src+1
// Size is distance from source (OLDTXT) to the end of BASIC text (VARTAB)
lda VARTAB+0
sec
sbc memmove__src+0
sta memmove__size+0
lda VARTAB+1
sbc memmove__src+1
sta memmove__size+1
// The copy routine is simplified, so that it is fast and (for memory model 60K)
// can fit in a small RAM area - therefore it requires to pre-set .Y, so that
// the copy ends when it reaches 0; so if copying one byte we want .Y = $FF
sec
lda #$00
sbc memmove__size+0
tay
sty __tokenise_work3
// Now we have to move down the memmove_src and memmove_dst pointers
// to compensate for .Y not being 0
sec
lda memmove__src+0
sbc __tokenise_work3
sta memmove__src+0
bcs !+
dec memmove__src+1
!:
sec
lda memmove__dst+0
sbc __tokenise_work3
sta memmove__dst+0
bcs !+
dec memmove__dst+1
!:
// Perform the copy XXX add more documentation inside the copy routine!
inc memmove__size+1
jsr shift_mem_down
// Now fix program linkage and calculate VARTAB
jsr LINKPRG
jmp calculate_VARTAB
-211
View File
@@ -1,211 +0,0 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
basic_shift_mem_up_and_relink:
// Shift memory up from OLDTXT
// X bytes.
// NOTE: Pointers need to be reduced by one, due to the way
// the copyroutine works, so we do that here.
// Work out end point of destination
txa
clc
adc VARTAB+0
sta memmove__dst+0
lda VARTAB+1
adc #0
sta memmove__dst+1
lda memmove__dst+0
sec
sbc #1
sta memmove__dst+0
lda memmove__dst+1
sbc #0
sta memmove__dst+1
// End point of source is just current end of BASIC text
lda VARTAB+0
sec
sbc #1
sta memmove__src+0
lda VARTAB+1
sbc #0
sta memmove__src+1
// Work out size of region to copy
lda VARTAB+0
sec
sbc OLDTXT+0
sta memmove__size+0
lda VARTAB+1
sbc OLDTXT+1
sta memmove__size+1
// jsr printf
// .text "TOP OF BASIC = $"
// .byte $f1,<VARTAB,>VARTAB
// .byte $f0,<VARTAB,>VARTAB
// .byte $0d
// .text "SHIFTING UP $"
// .byte $f1,<memmove__size,>memmove__size
// .byte $f0,<memmove__size,>memmove__size
// .text " BYTES FROM $"
// .byte $f1,<memmove__src,>memmove__src
// .byte $f0,<memmove__src,>memmove__src
// .text " TO $"
// .byte $f1,<memmove__dst,>memmove__dst
// .byte $f0,<memmove__dst,>memmove__dst
// .byte $0d,0
// To make life simple for the copy routine that lives in RAM,
// we have to adjust the end pointers down one page and set Y to the low
// byte of the copy size.
lda memmove__src+0
sec
sbc memmove__size+0
sta memmove__src+0
lda memmove__src+1
sbc #0
sta memmove__src+1
lda memmove__dst+0
sec
sbc memmove__size+0
sta memmove__dst+0
lda memmove__dst+1
sbc #0
sta memmove__dst+1
// Now make exit easy, by being able to check for zero on size high byte when done
inc memmove__size+1
// Then set Y to the number offset required
ldy memmove__size+0
iny
stx __tokenise_work3
// jsr printf
// .text "REVISED BOUNDS $"
// .byte $f1,<memmove__size,>memmove__size
// .byte $f0,<memmove__size,>memmove__size
// .text " BYTES FROM $"
// .byte $f1,<memmove__src,>memmove__src
// .byte $f0,<memmove__src,>memmove__src
// .text " TO $"
// .byte $f1,<memmove__dst,>memmove__dst
// .byte $f0,<memmove__dst,>memmove__dst
// .byte $0d,0
// Do the copy
jsr shift_mem_up
// Now fix the pointer to the next line
// First, we need to point the current BASIC line
// pointer to itself, so that we can add the shift
// to make it end up pointing to the next line
ldy #0
lda OLDTXT+0
#if CONFIG_MEMORY_MODEL_60K
ldx #<OLDTXT+0
jsr poke_under_roms
#else // CONFIG_MEMORY_MODEL_38K || CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
sta (OLDTXT),y
#endif
iny
lda OLDTXT+1
#if CONFIG_MEMORY_MODEL_60K
jsr poke_under_roms
#else // CONFIG_MEMORY_MODEL_38K
sta (OLDTXT),y
#endif
relink_up_next_line:
// XXX reuse code from cmd_old
// Advance pointer by tokenise_word3 bytes
ldy #0
#if CONFIG_MEMORY_MODEL_60K
ldx #<OLDTXT+0
jsr peek_under_roms
#elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
jsr peek_under_roms_via_OLDTXT
#else // CONFIG_MEMORY_MODEL_38K
lda (OLDTXT),y
#endif
sta memmove__dst+0
clc
adc __tokenise_work3
sta memmove__src+0
iny
php
#if CONFIG_MEMORY_MODEL_60K
jsr peek_under_roms
cmp #$00
#elif CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
jsr peek_under_roms_via_OLDTXT
#else // CONFIG_MEMORY_MODEL_38K
lda (OLDTXT),y
#endif
sta memmove__dst+1
plp
adc #0
sta memmove__src+1
// jsr printf
// .text "LINE ADDR = $"
// .byte $f1,<OLDTXT,>VARTAB
// .byte $f0,<OLDTXT,>VARTAB
// .text $d," BEFORE = $"
// .byte $f1,<memmove__dst,>memmove__dst
// .byte $f0,<memmove__dst,>memmove__dst
// .text ", AFTER = $"
// .byte $f1,<memmove__src,>memmove__src
// .byte $f0,<memmove__src,>memmove__src
// .byte $d
// .byte 0
// Write memmove__src back to current line pointer
ldy #0
lda memmove__src+0
#if CONFIG_MEMORY_MODEL_60K
ldx #<OLDTXT+0
jsr poke_under_roms
#else // CONFIG_MEMORY_MODEL_38K
sta (OLDTXT),y
#endif
iny
lda memmove__src+1
#if CONFIG_MEMORY_MODEL_60K
jsr poke_under_roms
#else // CONFIG_MEMORY_MODEL_38K
sta (OLDTXT),y
#endif
relink_up_loop:
// Now advance pointer to the next line,
lda memmove__src+0
sta OLDTXT+0
lda memmove__src+1
sta OLDTXT+1
// Have we run out of lines to patch?
jsr peek_line_pointer_null_check
bcs relink_up_next_line
rts
+4 -16
View File
@@ -68,23 +68,11 @@ delete_line:
// Length can now be safely assumed to be in the low
// byte only, i.e., stored in __tokenise_work3
lda __tokenise_work3
pha
tax
ldx __tokenise_work3
// Shuffle everything down
jsr basic_shift_mem_down_and_relink
jsr shift_txt_down
// Now decrease top of BASIC mem
pla
sta __tokenise_work3
lda VARTAB+0
sec
sbc __tokenise_work3
sta VARTAB+0
lda VARTAB+1
sbc #0
sta VARTAB+1
// Finish by fixing program linkage and calculating new
clc
rts
jmp update_LINKPRG_VARTAB_do_clr
+25 -38
View File
@@ -14,57 +14,29 @@
insert_line:
// ASSUMES find_line has been called to set the insert point.
// We need to insert space for the link link token, the line number,
// and the zero-terminated line itself. This means 2+2+1 plus length
// of tokenised string after the line number
// But first, remember where the pointer will be, so that we can
// put the line in there after.
// jsr printf
// .text "INSERTING LINE AT $"
// .byte $f1,<OLDTXT,>OLDTXT
// .byte $f0,<OLDTXT,>OLDTXT
// .byte $0d,0
lda OLDTXT+0
pha
lda OLDTXT+1
pha
// Get number of bytes in tokenised line after line number
lda __tokenise_work2
sec
sbc __tokenise_work1
// Add on the four bytes space we need
// Add on the five bytes space we need (2 bytes for linkage, 2 bytes for line number, 1 byte for terminator)
clc
adc #5
pha
adc #$05
tax
// Make the space
jsr basic_shift_mem_up_and_relink
jsr shift_txt_up
// Now increase top of BASIC mem
pla
clc
adc VARTAB+0
sta VARTAB+0
lda VARTAB+1
adc #0
sta VARTAB+1
// Get pointer back
pla
sta OLDTXT+1
pla
sta OLDTXT+0
// Write the line number
ldy #2
lda LINNUM+0
// Put dummy linkage, we will correct it later
ldy #$01
tya
#if CONFIG_MEMORY_MODEL_60K
ldx #<OLDTXT+0
@@ -73,6 +45,16 @@ insert_line:
sta (OLDTXT),y
#endif
// Put the line number
iny
lda LINNUM+0
#if CONFIG_MEMORY_MODEL_60K
jsr poke_under_roms
#else // CONFIG_MEMORY_MODEL_38K || CONFIG_MEMORY_MODEL_46K || CONFIG_MEMORY_MODEL_50K
sta (OLDTXT),y
#endif
iny
lda LINNUM+1
@@ -100,7 +82,12 @@ insert_line:
lda __tokenise_work1
cmp __tokenise_work2
bne !-
dec __tokenise_work2
clc
rts
// FALLTROUGH
update_LINKPRG_VARTAB_do_clr:
// Finish by fixing program linkage and calculating new VARTAB
jsr LINKPRG
jmp update_VARTAB_do_clr
+1 -1
View File
@@ -153,7 +153,7 @@ shell_process_line:
shell_add_delete_line:
// First make sure VARTAB is correct and clear all the variables
jsr calculate_VARTAB
jsr update_VARTAB_do_clr
// Check if line already present
jsr find_line
+43
View File
@@ -0,0 +1,43 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// Shift the BASIC program down to cover the area of removed line
//
shift_txt_down:
// First byte of destination is OLDTXT
lda OLDTXT+0
sta memmove__dst+0
lda OLDTXT+1
sta memmove__dst+1
// First byte of source is memmove__dst + .X
clc
txa
adc memmove__dst+0
sta memmove__src+0
lda memmove__dst+1
adc #$00
sta memmove__src+1
// Size is distance from source to the end of BASIC text (VARTAB)
lda VARTAB+0
sec
sbc memmove__src+0
sta memmove__size+0
lda VARTAB+1
sbc memmove__src+1
sta memmove__size+1
// Perform the copy
jmp shift_mem_down
+58
View File
@@ -0,0 +1,58 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// Shift the BASIC program up to make space for a new line
//
shift_txt_up:
// Last byte of source is VARTAB-1
#if !HAS_OPCODES_65CE02
sec
lda VARTAB+0
sbc #$01
sta memmove__src+0
lda VARTAB+1
sbc #$00
sta memmove__src+1
#else // HAS_OPCODES_65CE02
lda VARTAB+0
sta memmove__src+0
lda VARTAB+1
sta memmove__src+1
dew memmove__src
#endif
// Last byte of destination is memmove__src + .X
clc
txa
adc memmove__src+0
sta memmove__dst+0
lda memmove__src+1
adc #$00
sta memmove__dst+1
// Size is distance from OLDTXT to the end of BASIC text (VARTAB)
lda VARTAB+0
sec
sbc OLDTXT+0
sta memmove__size+0
lda VARTAB+1
sbc OLDTXT+1
sta memmove__size+1
// Perform the copy
jmp shift_mem_up
@@ -6,7 +6,7 @@
// Calculate the VARTAB value - to mark the end of BASIC program code. Also clears all variables.
//
calculate_VARTAB:
update_VARTAB_do_clr:
lda TXTTAB+0
sta OLDTXT+0
@@ -0,0 +1,36 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// Helper routine for memory copy. Moves down the memmove_src and memmove_dst pointers to compensate for .Y not being 0
//
shift_mem_adapt_pointers:
sty RESHO+4
// Adapt source pointer
sec
lda memmove__src+0
sbc RESHO+4
sta memmove__src+0
bcs !+
dec memmove__src+1
!:
// Adapt destination pointer
sec
lda memmove__dst+0
sbc RESHO+4
sta memmove__dst+0
bcs !+
dec memmove__dst+1
!:
// Adapt data size
inc memmove__size+1
rts
+59
View File
@@ -0,0 +1,59 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// Copies the memory down
//
// Input:
// - memmove__src - pointer to the first byte of source
// - memmove__dst - pointer to the first byte of destination
// - memmove__size - number of bytes to copy
//
// All the input variables, .A, and .Y register, are destroyed. Also uses RESHO+4 variable.
//
shift_mem_down:
// The copy routine is simplified, so that it is fast and (for memory model 60K)
// can fit in a small RAM area - therefore it requires to pre-set .Y, so that
// the copy ends when it reaches 0; so if copying one byte we want .Y = $FF
sec
lda #$00
sbc memmove__size+0
tay
// Now we have to move down the memmove_src and memmove_dst pointers to compensate for .Y not being 0
jsr shift_mem_adapt_pointers
#if CONFIG_MEMORY_MODEL_38K
shift_mem_down_internal:
// Move memmove__size bytes from memmove__src to memmove__dst, where memmove__dst > memmove__src
//
// This means we have to copy from the back end down.
// This routine assumes the pointers are already pointed to the end of the areas, and that .Y is correctly initialized
php
!:
lda (memmove__src),y
sta (memmove__dst),y
iny
bne !-
inc memmove__src+1
inc memmove__dst+1
dec memmove__size+1
bne !-
plp
rts
#else
jmp shift_mem_down_internal
#endif
-28
View File
@@ -1,28 +0,0 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
#if CONFIG_MEMORY_MODEL_38K
shift_mem_down:
// Move memmove__size bytes from memmove__src to memmove__dst, where memmove__dst > memmove__src
//
// This means we have to copy from the back end down.
// This routine assumes the pointers are already pointed to the end of the areas, and that .Y is correctly initialized
php
!:
lda (memmove__src),y
sta (memmove__dst),y
iny
bne !-
inc memmove__src+1
inc memmove__dst+1
dec memmove__size+1
bne !-
plp
rts
#endif
+56
View File
@@ -0,0 +1,56 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// Copies the memory up
//
// Input:
// - memmove__src - pointer to the last byte of source
// - memmove__dst - pointer to the last byte of destination
// - memmove__size - number of bytes to copy
//
// All the input variables, .A, and .Y register, are destroyed. Also uses RESHO+4 variable.
//
shift_mem_up:
// The copy routine is simplified, so that it is fast and (for memory model 60K)
// can fit in a small RAM area - therefore it requires to pre-set .Y, so that
// the copy ends when it reaches 0; so if copying one byte we want .Y = $01
ldy memmove__size+0
// Now we have to move down the memmove_src and memmove_dst pointers to compensate for .Y not being 0
jsr shift_mem_adapt_pointers
#if CONFIG_MEMORY_MODEL_38K
shift_mem_up_internal:
// Move memmove__size bytes from memmove__src to memmove__dst, where memmove__dst > memmove__src
//
// This means we have to copy from the back end down.
// This routine assumes the pointers are already pointed to the end of the areas, and that .Y is correctly initialized
php
!:
lda (memmove__src),y
sta (memmove__dst),y
dey
bne !-
dec memmove__src+1
dec memmove__dst+1
dec memmove__size+1
bne !-
plp
rts
#else
jmp shift_mem_up_internal
#endif
-28
View File
@@ -1,28 +0,0 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * BASIC_0 #TAKE
// #LAYOUT# * * #IGNORE
#if CONFIG_MEMORY_MODEL_38K
shift_mem_up:
// Move memmove__size bytes from memmove__src to memmove__dst, where memmove__dst > memmove__src
//
// This means we have to copy from the back end down.
// This routine assumes the pointers are already pointed to the end of the areas, and that .Y is correctly initialized
php
!:
lda (memmove__src),y
sta (memmove__dst),y
dey
bne !-
dec memmove__src+1
dec memmove__dst+1
dec memmove__size+1
bne !-
plp
rts
#endif
@@ -70,7 +70,7 @@ peek_under_roms_via_FAC1_PLUS_1:
shift_mem_up:
shift_mem_up_internal:
// Move memmove__size bytes from memmove__src to memmove__dst, where memmove__dst > memmove__src
//
@@ -96,13 +96,13 @@ shift_mem_up:
bne !-
#if HAS_OPCODES_65C02
bra shift_mem_finalize
bra shift_mem_internal_finalize
#else
jmp shift_mem_finalize
jmp shift_mem_internal_finalize
#endif
shift_mem_down:
shift_mem_down_internal:
// Move memmove__size bytes from memmove__src to memmove__dst, where memmove__dst > memmove__src
//
@@ -126,9 +126,10 @@ shift_mem_down:
inc memmove__dst+1
dec memmove__size+1
bne !-
// FALLTROUGH
shift_mem_finalize:
shift_mem_internal_finalize:
// Restore memory mapping and quit