summaryrefslogtreecommitdiff
path: root/programs
diff options
context:
space:
mode:
authormrb0nk500 <b0nk@b0nk.xyz>2020-04-17 22:07:14 -0400
committermrb0nk500 <b0nk@b0nk.xyz>2020-04-17 22:07:14 -0400
commit0a7a2a7a8f95730811117bd2aa904f1843f65071 (patch)
tree24d62bbdba0df124c7fe8af781312af993236ebb /programs
parentc5150ee31f07208422f1435de9b35a0d0168cbb5 (diff)
Made both the assembly language monitor, and the
emulator smaller, and faster. I am also starting to make SuBEditor's source code more readable.
Diffstat (limited to 'programs')
-rw-r--r--programs/subeditor.s290
1 files changed, 156 insertions, 134 deletions
diff --git a/programs/subeditor.s b/programs/subeditor.s
index 5e6ce08..fddc729 100644
--- a/programs/subeditor.s
+++ b/programs/subeditor.s
@@ -3,6 +3,16 @@
; Writen in Sux assembly by
; mr b0nk 500 <b0nk@b0nk.xyz>
+; I/O constants.
+status = $C000 ; Keyboard status.
+scr = $C001 ; Character that is to be printed.
+kbd = $C002 ; Character from the Keyboard.
+step = $C010 ; Enables clock stepping, when set.
+
+; Screen constants.
+maxrow = 23 ; Screen's row count.
+maxcol = 79 ; Screen's column count.
+
.org $A000
; String Literals/Constants.
tok:
@@ -72,27 +82,29 @@ bitabl:
.qword 0
.qword 0
scr_str:
- .byte $0
+ .byte 0
scr_end:
- .byte $0
+ .byte 0
wrapped:
- .byte $0
+ .byte 0
; Pointers
ptr:
- .qword $0
+ .qword 0
ptr2:
- .qword $0
+ .qword 0
ptr3:
- .qword $0
+ .qword 0
ptr4:
- .qword $0
+ .qword 0
ptr5:
- .qword $0
+ .qword 0
ptr6:
- .qword $0
+ .qword 0
scr_ptr3:
- .word $0
+ .word 0
+g:
+ .byte 0
; Main program
.org $8000
@@ -101,8 +113,9 @@ reset:
ldx.w #$FFFF ; Reset the stack pointer.
txs ;
ldy #0 ; Reset the Y register.
+ sty end ;
tyx ; Reset the X register.
- lda #23 ; Set the end of the screen back to 23.
+ lda #maxrow ; Set the end of the screen to the screen's max row count.
sta scr_end ;
lda.w #buffer ; Place the address for the screen buffer
sta.q ptr5 ; into one of the pointers.
@@ -112,6 +125,7 @@ reset:
sta scr_str ; Set the start of the screen back to zero.
sta.q bitabl ; Reset the first half of the linewrap table.
sta.q bitabl+8 ; Reset the second half of the linewrap table.
+ inc end ;
jsl clr_buf ; Clear the screen buffer.
jmp start ; Goto the start of the main program.
clr_buf:
@@ -143,8 +157,7 @@ clr_buf_end:
start:
lda #0 ; TODO: Update this for the Super VIA.
- sta end ;
- sta $C000 ; Clear the controll register of the I/O adapter.
+ sta status ; Clear the controll register of the I/O adapter.
tax ; Reset X.
phy #2 ; Save the cursor index for later.
tay ; Reset the cursor index.
@@ -153,14 +166,15 @@ start:
lda.w #string ; Print the startup message.
jsl print_str ;
lda.w zero ; Reset the Accumulator.
+ sta end ;
jmp read ; Start reading the keyboard.
clr_cbuf:
phb #1 ; Start of callee preservation.
ldb #0 ; Reset the B register.
- lda.w #cmd_buf+8;
- sta.q ptr4 ;
- tba ;
+ lda.w #cmd_buf+8; Place the address of the command buffer, plus eight
+ sta.q ptr4 ; into the fourth pointer.
+ tba ; Set the Accumulator back to zero.
clr_cbuf_st:
cpy.w #$3FF ; Did we clear all of the command buffer?
bcs clr_cbuf_nd ; Yes, so we're done.
@@ -182,7 +196,10 @@ clr_cbuf_nd:
rtl ; End of clr_cbuf.
read:
- lda $C000 ; Did we get a key?
+ lda #0 ; Reset the Accumulator.
+ sta end ; Disable the dummy flag.
+ inc end ; Enable the dummy flag.
+ lda status ; Did we get a key?
beq read ; No, so try again.
jsl getchar ; Yes, and was it a newline?
beq parse ; Yes, so start parsing the line.
@@ -194,17 +211,16 @@ print_str:
tba ; Clear the Accumulator.
inb ; Enable replace mode.
stb b ;
-pntstr_st:
+pntstr_lp:
phy #2 ; Save the cursor index.
txy ; Copy the string index into Y.
- lda (ptr), y ; Are we at the end of the string?
- beq pntstr_end ; Yes, so we're done.
- ply #2 ; No, so get the cursor index back.
- inx ; Increment the string index.
+ lda (ptr), y ; Are we at the end of the string?
+ ply #2 ; Get the cursor index back.
+ beq pntstr_end ; Yes, so we're done.
+ inx ; No, so increment the string index.
jsl print_char ; Print the character.
- jmp pntstr_st ; Keep looping.
+ jmp pntstr_lp ; Keep looping.
pntstr_end:
- ply #2 ; Get the cursor index back.
ldb #0 ; Enable insert mode.
stb b ;
rtl ; End of print_str.
@@ -265,67 +281,80 @@ bitpos:
rtl ; End of bitpos.
getchar:
- lda $C002 ; Get typed character.
- ldb #0 ;
- stb e ;
- stb b ;
- pha #1 ;
- phy #2 ;
- cmp #10 ;
- beq cmd_cpy ;
+ lda kbd ; Get the character that was typed from the keyboard.
+ ldb #0 ; Reset the B register.
+ stb e ; Set the temporary row position to zero, in case we get a newline.
+ stb b ; Enable insert mode.
+ pha #1 ; Save the character.
+ phy #2 ; Save the cursor index.
+ cmp #10 ; Was the character that was typed, a newline?
+ beq cmd_cpy ; Yes, so start copying the line to the command buffer.
getchar_pnt:
- ply #2 ;
- pla #1 ;
- ldb e ;
- bne reset_row ;
+ ply #2 ; Get back the cursor index.
+ pla #1 ; Get back the character.
+ ldb e ; Is the temporary row position non zero?
+ bne reset_row ; Yes, so reset the row positon.
getchar_pt1:
- jsl print_char ;
- lda a ;
- cmp #10 ;
- beq getchar_ln ;
- jmp getchar_chr ;
+ jsl print_char ; No, so print the character.
+ lda a ; Get the return value.
+ cmp #10 ; Is the return value, a newline?
+ beq getchar_ln ; Yes, so return 0.
+ jmp getchar_chr ; No, so return 1.
reset_row:
- ldb e ;
- cpb #23 ;
- beq reset_row2 ;
- bcs reset_row1 ;
- jmp reset_row2 ;
+ ldb e ; Get the temporary row position.
+ cpb #maxrow ; Is temporary row position, at, or above the bottom of the screen?
+ beq reset_row2 ; Yes, so leave it as is.
+ bcs reset_row1 ; No, so set it to the bottom of the screen.
+ jmp reset_row2 ; Yes, so leave it as is.
reset_row1:
- ldb #23 ;
+ ldb #maxrow ; Set the row position to the bottom of the screen.
reset_row2:
- stb scr_row ;
- jmp getchar_pt1 ;
-
+ stb scr_row ; Set the row position.
+ jmp getchar_pt1 ; Print the character.
cmd_cpy:
- lda scr_row ;
- sta scr_trow ;
- jsl findend ;
- sta scr_row ;
- sta e ;
- jsl findst ;
- clc ;
- lda scr_row ;
- adc scr_str ;
- mul #80 ;
- tay ;
- ldx.w #$0 ;
-cmd_cpy_st:
- lda (ptr5), y ;
- beq getchar_pnt ;
- phy #2 ;
- txy ;
- sta (ptr6), y ;
- inx ;
- ply #2 ;
- iny ;
- jmp cmd_cpy_st ;
+ lda scr_row ; Get the row position.
+ sta scr_trow ; Save it for later.
+ jsl findend ; Find the end of the line.
+ sta scr_row ; Set the row position to the end of the line.
+ sta e ; Save it into the temporary row posiition.
+ jsl findst ; Find the start of the line.
+ clc ; Clear the carry flag.
+ lda scr_row ; Get the row position.
+ adc scr_str ; Add it with the screen's starting row.
+ mul #maxcol+1 ; Multiply it with the width of the screen, plus one.
+ tay ; Place it into the index.
+ ldx.w #0 ; Reset the X register.
+cmd_cpy_lp:
+ ldb #0 ; Reset the B register.
+ lda.q (ptr5), y ; Get eight bytes from the current line.
+cmd_cpy_lp1:
+ phy #2 ; Save the screen index.
+ txy ; Get the command buffer index.
+ sta (ptr6), y ; Copy one byte from the screen buffer, to the command buffer.
+ inx ; Increment the command buffer index.
+ ply #2 ; Get back the screen index.
+ iny ; Increment the screen index.
+ inb ; Increment the byte count.
+ lsr #8 ; Shift in the next byte.
+ stb g ; Save the byte count.
+ tab ; Save the string buffer.
+ and #$FF ; Is this byte of the buffer, a null terminator?
+ beq cmd_cpy_nd ; Yes, so we're done.
+ tba ; No so get back the string buffer.
+ ldb g ; Get back the byte count.
+ cpb #7 ; Did we shift in eight bytes?
+ beq cmd_cpy_lp ; Yes, so get eight more bytes.
+ jmp cmd_cpy_lp1 ; No, so keep shifting in more bytes.
+cmd_cpy_nd:
+ tab ; The B register is zero, so clear the Accumulator.
+ jmp getchar_pnt ; Go back to printing the character.
getchar_ln:
- lda #0 ;
- jmp getchar_end ;
+ lda #0 ; Return zero.
+ jmp getchar_end ; We are done.
getchar_chr:
- lda #1 ;
+ lda #1 ; Return one.
getchar_end:
- rtl ;
+ rtl ; End of get char.
findst:
lda #0 ;
@@ -358,7 +387,7 @@ fndend_done:
findend:
jsl fndend ;
lda.w scr_ptr3 ;
- div #80 ;
+ div #maxcol+1 ;
rtl ;
parse:
@@ -374,7 +403,7 @@ print_char:
sta a ;
cmp #$1B ;
beq esc ;
- cmp #$A ;
+ cmp #10 ;
beq nl ; Did the user type a newline?
cmp #$C ;
beq clr_scr ;
@@ -444,32 +473,33 @@ printc_2:
ldb #1 ;
stb f ;
ldb scr_col ;
- cpb #80 ;
+ cpb #maxcol+1 ;
bcs printc_4 ;
printc_3:
- sta $C001 ; Echo typed character.
+ sta scr ; Echo typed character.
ldb f ;
beq printc_wrap ;
jmp printc_end ;
printc_4:
ldb scr_row ;
- cpb #23 ;
+ cpb #maxrow ;
bcs printc_scrl ;
printc_5:
ldb #0 ;
stb f ;
jmp printc_3 ;
printc_scrl:
- sta $C001 ; Echo typed character.
+ sta scr ; Echo typed character.
clc ;
lda #1 ;
sta wrapped ;
jsl scrl_down ;
+ jmp printc_wrap ;
printc_wrap:
- ldb #0 ;
+ ldb #0
stb scr_col ;
ldb scr_row ;
- cpb #23 ;
+ cpb #maxrow ;
bcs printc_wrp2 ;
printc_wrap1:
inc scr_row ;
@@ -493,7 +523,7 @@ nl:
nl1:
sta scr_col ;
lda scr_row ;
- cmp #23 ;
+ cmp #maxrow ;
bcc nl_inc ;
jsl scrl_down ;
lda #10 ;
@@ -507,7 +537,7 @@ nl_inc:
jmp printc_end ;
clr_scr:
- lda #23 ;
+ lda #maxrow ;
sta scr_end ;
lda #0 ;
sta scr_str ;
@@ -521,25 +551,25 @@ clr_scr:
sta scr_row ;
jsl update_pos ;
lda #$C ;
- sta $C001 ;
+ sta scr ;
jmp printc_end ;
en_step:
- lda $C010 ;
+ lda step ;
beq step_en ;
jmp printc_end ;
step_en:
lda #1 ;
- sta $C010 ;
+ sta step ;
jmp printc_end ;
dis_step:
- lda $C010 ;
+ lda step ;
bne step_dis ;
jmp printc_end ;
step_dis:
lda #0 ;
- sta $C010 ;
+ sta step ;
jmp printc_end ;
back:
@@ -566,7 +596,7 @@ back1:
stb d ;
jsl shftln ; Shift line back by one character.
lda #$7F ; Print a backspace to the screen.
- sta $C001 ;
+ sta scr ;
lda e ;
beq back3 ;
back2:
@@ -617,7 +647,7 @@ backwrp:
backwrp2:
dec scr_row ; Move up by one row.
; jsl clrbit ; Clear the wrap bit for this row.
- ldb #80 ; Move the cursor to the absolute right of the screen.
+ ldb #maxcol+1 ; Move the cursor to the absolute right of the screen.
stb scr_col ;
jsl update_pos ; Update the cursor's position.
jmp back ; Delete the previous character.
@@ -691,9 +721,9 @@ shftln_nd1:
shftln_end1:
jsl findend ; Find the ending line.
cpb #0 ; Is the remainder zero?
- beq shftln_nd01 ; Yes, so check if the ending line is greater than the starting line.
+ beq shftln_nd2 ; Yes, so check if the ending line is greater than the starting line.
jmp shftln_end2 ; No, so we're done.
-shftln_nd01:
+shftln_nd2:
cmp scr_row ; Is the ending line greater than the starting line?
beq shftln_end2 ; No, so we're done.
bcs shftln_wrp1 ; Yes, so clear the wrap bit.
@@ -701,13 +731,13 @@ shftln_end2:
rtl ; End of shftln.
esc:
- lda $C000 ; Get the next character.
- lda $C002 ;
+ lda status ; Get the next character.
+ lda kbd ;
cmp #$1B ; Is this character an escape character?
beq shftesc ; Yes, so check the other set of escape routines.
- lda $C000 ; No, so wait for the next character.
+ lda status ; No, so wait for the next character.
beq printc_end ; We have an error, so discard it, and go back to getting user input.
- lda $C002 ; Get the escape code.
+ lda kbd ; Get the escape code.
sta c ; Store the escape code, until we need it.
lda #0 ; Set the D pseudo register to zero.
sta d ;
@@ -728,10 +758,11 @@ esc_end:
jmp printc_end ; We are done.
shftesc:
- lda $C000 ; Skip the '['.
- lda $C000 ; Get the next character.
+ lda status ; Skip the '['.
+ lda kbd ;
+ lda status ; Wait for the next character.
beq printc_end ; We have an error, so discard it, and go back to getting user input.
- lda $C002 ; Get the escape code.
+ lda kbd ; Get the escape code.
sta c ; Store the escape code, until we need it.
lda #0 ; Use the D pseudo register as a skip flag.
sta d ;
@@ -769,7 +800,7 @@ isdown:
cmp #$42 ; Did the user press the down arrow key?
bne isdown_done ; No, so we're done.
lda scr_row ; Yes, so start checking the y coordinate of the cursor.
- cmp #23 ; Is the cursor at the bottom of the screen?
+ cmp #maxrow ; Is the cursor at the bottom of the screen?
beq isdown_scrl ; Yes, so scroll down.
lda c ; No, so load the escape code back into the accumulator.
cmp #$42 ; Did the user press the down arrow key?
@@ -795,7 +826,7 @@ isright:
cmp #$43 ; Did the user press the right arrow key?
bne isright_dne ; No, so we're done.
lda scr_col ; Yes, so start checking the x coordinate of the cursor.
- cmp #79 ; Is the cursor at the far right of the screen?
+ cmp #maxcol ; Is the cursor at the far right of the screen?
beq isright_wrp ; Yes, so check if this is a wrapped line.
jmp right ; No, so move the cursor right, like normal.
isright_wrp:
@@ -815,7 +846,7 @@ wrap_inc:
lda #0 ; Set the cursor to the far left of the screen.
sta scr_col ;
lda scr_row ; Get the current row number.
- cmp #23 ; Are we at the bottom of the screen?
+ cmp #maxrow ; Are we at the bottom of the screen?
beq isright_nd2 ; No, so we're done.
bcs isright_scr ; Yes, so check if we are scrolling down.
jmp isright_nd2 ; No, so we're done.
@@ -849,7 +880,7 @@ wrap_dec:
sta wrapped ;
dec scr_row ; Move the cursor up one line.
wrap_dec1:
- lda #79 ; Move the Cursor to the far right of the screen.
+ lda #maxcol ; Move the Cursor to the far right of the screen.
sta scr_col ;
lda #1 ; Tell the escape routine that we were successful.
sta d ;
@@ -937,58 +968,52 @@ update_pos:
lda scr_row ; Add the cursor's line number,
adc scr_str ; with the starting line number to get the absolute line number.
tay ; Place it in the Y regster for now.
- clc ; Clear the carry flag.
- lsl #6 ; Multiply the absolute line number by 64.
- tab ; Use it as a second operand.
- tya ; Place the absolute line number back into the Accumulator
- lsl #4 ; Multiply the absolute line number by 16.
- aab ; Add both the Accumulator, and the B register together, to multiply the line number by 80.
- clc ; Clear the carry flag.
+ mul #maxcol+1 ; Multiply the line number by the screen's max column count, plus 1.
adc scr_col ; Add the cursor's column number to get the screen index.
tay ; Place the index into the Y register.
lda #$1B ; Print an escape character
- sta $C001 ; to the screen.
+ sta scr ; to the screen.
lda #$5B ; Print '['
- sta $C001 ; to the screen, and start the escape sequence.
+ sta scr ; to the screen, and start the escape sequence.
jsl getrow ; Start printing the row number to the screen.
jsl getcol ; Start printing the column number to the screen.
lda #$48 ; Print 'H'
- sta $C001 ; to the screen.
+ sta scr ; to the screen.
rtl ; End of update_pos.
getrow:
lda scr_row ; Get the cursor's y coordinate.
div #10 ; Divide A by 10.
adc #$30 ; Convert it to ascii, and
- sta $C001 ; print to the screen.
+ sta scr ; print to the screen.
tba ; Get the remainder.
adc #$30 ; Convert it to ascii, and
- sta $C001 ; print to the screen.
+ sta scr ; print to the screen.
rtl ; End of getrow.
getcol:
lda #$3B ; Print ';'
- sta $C001 ; to the screen.
+ sta scr ; to the screen.
lda scr_col ; Get the cursor's x coordinate.
div #10 ; Divide A by 10.
clc
adc #$30 ; Convert it to ascii, and
- sta $C001 ; print to the screen.
+ sta scr ; print to the screen.
tba ; Get the remainder.
clc
adc #$30 ; Convert it to ascii, and
- sta $C001 ; print to the screen.
+ sta scr ; print to the screen.
rtl ; End of getrow.
scrl_down:
inc scr_str ; Increment the starting line of the screen.
inc scr_end ; Increment the ending line of the screen.
lda #$1B ; Print an escape character
- sta $C001 ; to the screen.
+ sta scr ; to the screen.
lda #$5B ; Print '['
- sta $C001 ; to the screen, and start the escape sequence.
+ sta scr ; to the screen, and start the escape sequence.
lda #$54 ; Print 'T'
- sta $C001 ; to the screen, and end the escape sequence.
+ sta scr ; to the screen, and end the escape sequence.
lda scr_row ; Get the cursor's line number.
pha #1 ; Save it in the stack.
lda wrapped ; Was the wrapped flag set?
@@ -1018,11 +1043,11 @@ scrl_up:
dec scr_str ;
dec scr_end ;
lda #$1B ; Print an escape character
- sta $C001 ; to the screen.
+ sta scr ; to the screen.
lda #$5B ; Print '['
- sta $C001 ; to the screen, and start the escape sequence.
+ sta scr ; to the screen, and start the escape sequence.
lda #$53 ; Print 'S'
- sta $C001 ; to the screen, and end the escape sequence.
+ sta scr ; to the screen, and end the escape sequence.
lda scr_row ;
pha #1 ;
lda scr_col ;
@@ -1045,7 +1070,7 @@ rdrw_row:
rdrow_st:
lda (ptr5), y ;
beq rdrow_inc ;
- sta $C001 ;
+ sta scr ;
rdrow_inc:
inc scr_col ;
lda (ptr5), y ;
@@ -1054,12 +1079,12 @@ rdrow_inc1:
iny ;
rdrow_inc2:
lda scr_col ;
- cmp #80 ;
+ cmp #maxcol+1 ;
bcs rdrow_end ;
jmp rdrow_st ;
rdrow_skip:
lda #$20 ;
- sta $C001 ; to the screen.
+ sta scr ; to the screen.
jmp rdrow_inc1 ;
rdrow_end:
lda #0 ;
@@ -1080,7 +1105,7 @@ rset_x:
dabbed:
ldb #0 ;
lda.w #tok ;
- sta.q ptr2 ;
+ sta.q ptr2 ;i
tba ;
dab_st:
phy #2 ;
@@ -1124,7 +1149,6 @@ cmd_clr:
rdrw_ln:
lda scr_row ;
pha #1 ;
- inc end ;
lda f ;
sta scr_row ;
lda scr_col ;
@@ -1149,13 +1173,11 @@ rdrwln_done:
lda #0 ;
sta e ;
sta f ;
- dec end ;
rtl ;
.org $FFC0
.qword reset
-
a
done