summaryrefslogtreecommitdiff
path: root/programs
diff options
context:
space:
mode:
authormrb0nk500 <b0nk@b0nk.xyz>2020-02-20 18:18:50 -0500
committermrb0nk500 <b0nk@b0nk.xyz>2020-02-20 18:18:50 -0500
commit34b9bda535d475dd80fd70481fb7ba525b8c58bd (patch)
tree432202e64d1c943f46c0b2fee7402586e06d969b /programs
parent63d5046ecabd5fd1524d3c4bc4590176c3b8a4eb (diff)
Finished SuBAsm's screen editor.
Which I am now calling, SuBEditor.
Diffstat (limited to 'programs')
-rw-r--r--programs/forg.s17
-rw-r--r--programs/hex-to-bcd.s7
-rw-r--r--programs/pos-check.s12
-rw-r--r--programs/scr-to-buf.s7
-rw-r--r--programs/subeditor.s900
5 files changed, 900 insertions, 43 deletions
diff --git a/programs/forg.s b/programs/forg.s
deleted file mode 100644
index 3e6aea1..0000000
--- a/programs/forg.s
+++ /dev/null
@@ -1,17 +0,0 @@
-forg:
- iny ; Increment offset.
- lda buf, y
- jsr iswhite
- bcs forg ; Reset y, if we hit the null terminator.
- cmp #$2E ; Is this character a '.'?
- bne forg_exit ; No, so return.
- sty org ; Yes, so store the origin.
-forg_end:
- iny ; Increment offset.
- lda buf, y
- jsr istoken
- bcs forg_end
- dey
- sty scr_col
-forg_exit:
- rts ; End of forg.
diff --git a/programs/hex-to-bcd.s b/programs/hex-to-bcd.s
deleted file mode 100644
index 53a3ff2..0000000
--- a/programs/hex-to-bcd.s
+++ /dev/null
@@ -1,7 +0,0 @@
-hex_to_bcd:
- pla #1 ; Get argument.
- div #10 ; Divide A by 10.
- lsl #4 ; Shift the result left by 4 bits.
- oab ; Or the result, with the remainder.
- pha #1 ; Push the packed BCD result to the stack.
- rts ; Return the result.
diff --git a/programs/pos-check.s b/programs/pos-check.s
deleted file mode 100644
index 315147b..0000000
--- a/programs/pos-check.s
+++ /dev/null
@@ -1,12 +0,0 @@
-cmd_clr:
- lda scr_row
- cmp #23
- beq cmd_vwrap
- inc scr_row
- jmp cmd_clr_end
-cmd_vwrap:
- jsl rset_row
-cmd_clr_end:
- jsl update_pos
- lda #0
- rtl
diff --git a/programs/scr-to-buf.s b/programs/scr-to-buf.s
deleted file mode 100644
index 1787dc3..0000000
--- a/programs/scr-to-buf.s
+++ /dev/null
@@ -1,7 +0,0 @@
-scr_to_buf:
- tax
- mul #80
- adc scr_col
- tay
- txa
- rtl
diff --git a/programs/subeditor.s b/programs/subeditor.s
new file mode 100644
index 0000000..159dc1f
--- /dev/null
+++ b/programs/subeditor.s
@@ -0,0 +1,900 @@
+; SuBEditor.
+;
+; Writen in Sux assembly by
+; mr b0nk 500 <b0nk@b0nk.xyz>
+
+; Instruction mnemonics,
+; and opcodes.
+.org $1000
+tok:
+ .byte "dab"
+msg:
+ .byte "oof, you divided a, and b on me.\n"
+
+; Input buffer.
+.org $2000
+buffer:
+
+.org $4000
+cmd_buf:
+
+
+; Initalize some variables.
+.org $0
+scr_row:
+ .byte $0
+scr_col:
+ .byte $0
+scr_trow:
+ .byte $0
+scr_tcol:
+ .byte $0
+scr_ptr:
+ .word $0
+a:
+ .byte $0
+b:
+ .byte $0
+c:
+ .byte $0
+d:
+ .byte $0
+e:
+ .byte $0
+f:
+ .byte $0
+string:
+ .byte "Please, type something.\n"
+string2:
+ .byte "You typed, "
+end:
+ .byte $0
+bits:
+ .byte $80
+ .byte $40
+ .byte $20
+ .byte $10
+ .byte $08
+ .byte $04
+ .byte $02
+ .byte $01
+bitmask:
+ .byte $0
+bitabl:
+ .qword $0
+ .qword $0
+scr_str:
+.byte $0
+scr_end:
+.byte $0
+wrapped:
+.byte $0
+
+; Pointers
+ptr:
+ .qword buffer
+cptr:
+ .qword cmd_buf
+tptr:
+ .qword tok
+mptr:
+ .qword msg
+
+; Main program
+.org $8000
+reset:
+ cps
+ ldx.w #$FFFF
+ txs
+ ldy #0
+ lda #23
+ sta scr_end
+ lda #0
+ sta scr_str
+ ldx #8
+ sta.q bitabl
+ sta.q bitabl, x
+ tax
+ jsl clr_buf
+ jmp start
+clr_buf:
+ lda #0
+ cpy.w #$1FFF
+ beq clr_buf_end
+ sta (ptr), y
+ iny
+ jmp clr_buf
+clr_buf_end:
+ ldy.w #0
+ rtl
+
+start:
+ lda #0
+ tax
+ sta $C000
+ phy #2
+ ldy.w #0
+ jsl clr_cbuf
+ ply #2
+ jmp print
+
+clr_cbuf:
+ cpy.w #$3FF
+ beq clr_cbuf_end
+ sta (cptr), y
+ iny
+ jmp clr_cbuf
+clr_cbuf_end:
+ rtl
+
+pull_y:
+ ply #2
+rset_a:
+ lda #0
+ sta $C000
+ inc
+read:
+ lda $C000 ; Get control register.
+ beq rset_a ; Loop until we get a character.
+ jsl getchar ; We got a key.
+ beq parse ; We got a newline, so start parsing the line.
+ jmp rset_a ; We didn't get a newline, so keep getting more characters.
+
+print:
+ phy #2
+ txy
+ lda string, y ; Get character at offset x.
+ beq pull_y ; Did we find a null terminator?
+ ply #2
+ inx
+ jsl print_char
+ jmp print
+
+getbit:
+ clc
+ lda scr_str
+ bne getbt0
+ ldx scr_row
+ jmp getbt1
+getbt0:
+ lda scr_row
+ adc scr_str
+ tax
+getbt1:
+ jsl bitpos
+ ldb bitabl, x
+ aba
+ cmp #1
+ jmp bitout
+
+;putbit:
+; ldx scr_row
+;putbt1:
+; bcc setbit
+
+
+clrbit:
+ jsl bitpos
+ xor #$FF
+ ldb bitabl, x
+ aba
+bitsav:
+ sta bitabl, x
+bitout:
+ ldx bitmask
+ rtl
+
+setbit:
+ jsl bitpos
+ ldb bitabl, x
+ oab
+ jmp bitsav
+
+bitpos:
+ stx bitmask
+ txa
+ and #7
+ tax
+ lda bits, x
+ pha #1
+ lda bitmask
+ lsr #3
+ tax
+ pla #1
+ rtl
+
+
+getchar:
+ lda $C002 ; Get typed character.
+ ldb #0
+ stb e
+ pha #1
+ phy #2
+ cmp #10
+ beq cmd_cpy
+getchar_pnt:
+ ply #2
+ pla #1
+ ldb e
+ bne reset_row
+getchar_pnt1:
+ jsl print_char
+ lda a
+ cmp #10
+ beq getchar_line
+ jmp getchar_char
+reset_row:
+ ldb e
+ stb scr_row
+ jmp getchar_pnt1
+
+
+cmd_cpy:
+ ldb scr_row
+ stb e
+ jsl findst
+ clc
+ lda scr_row
+ adc scr_str
+ mul #80
+ tay
+ ldx.w #$0
+cmd_cpy_strt:
+ lda (ptr), y
+ beq getchar_pnt
+ phy #2
+ txy
+ sta (cptr), y
+ inx
+ ply #2
+ iny
+ jmp cmd_cpy_strt
+getchar_line:
+ lda #0
+ jmp getchar_end
+getchar_char:
+ lda #1
+getchar_end:
+ rtl
+
+findst:
+ jsl getbit
+ bcc findst_done
+ dec scr_row
+ bpo findst
+ inc scr_row
+findst_done:
+ rtl
+
+parse:
+ lda #0
+ tax
+ jsl dabbed
+ beq start
+ lda #0
+ tax
+ jmp result
+
+print_char:
+ sta a
+ cmp #$1B
+ beq esc
+ cmp #$A
+ beq nl ; Did the user type a newline?
+ cmp #$C
+ beq clr_scr
+ cmp #19
+ beq en_step
+ cmp #18
+ beq dis_step
+ cmp #8
+ beq bs ; Did the user type a backspace?
+ cmp #$7F
+ beq bs ; Did the user type a backspace?
+ sta a
+printc:
+ lda a
+ sta (ptr), y ; Store typed character into the input buffer.
+ inc scr_col ; Increment the cursor's x coordinate.
+ iny
+printc_2:
+ ldb #1
+ stb f
+ ldb scr_col
+ cpb #80
+ bcs printc_4
+printc_3:
+ sta $C001 ; Echo typed character.
+ ldb f
+ beq printc_wrap
+ jmp printc_end
+printc_4:
+ ldb scr_row
+ cpb #23
+ bcs printc_scrl
+printc_5:
+ ldb #0
+ stb f
+ jmp printc_3
+printc_scrl:
+ sta $C001 ; Echo typed character.
+ clc
+ lda #1
+ sta wrapped
+ jsl scrl_down
+printc_wrap:
+ ldb #0
+ stb scr_col
+ ldb scr_row
+ cpb #23
+ bcs printc_wrap2
+printc_wrap1:
+ inc scr_row
+printc_wrap2:
+ phx #2
+ clc
+ lda scr_row
+ adc scr_str
+ tax
+ jsl setbit
+ plx #2
+ jsl update_pos
+printc_end:
+ rtl
+
+nl:
+ lda #0
+ sta (ptr), y ; Store said terminator into the input buffer.
+ sta scr_col
+ lda scr_row
+ cmp #23
+ bne nl_inc
+ jsl scrl_down
+ lda #10
+ sta a
+ jmp printc_end
+nl_inc:
+ inc scr_row
+ jsl update_pos
+ lda #10
+ sta a
+ jmp printc_end
+
+clr_scr:
+ lda #23
+ sta scr_end
+ lda #0
+ sta scr_str
+ ldx #8
+ sta.q bitabl
+ sta.q bitabl, x
+ tay
+ jsl clr_buf
+ sta scr_col
+ sta scr_row
+ jsl update_pos
+ lda #$C
+ sta $C001
+ jmp printc_end
+
+en_step:
+ lda $C010
+ beq step_en
+ jmp stp_end
+step_en:
+ lda #1
+ sta $C010
+ jmp stp_end
+
+dis_step:
+ lda $C010
+ bne step_dis
+ jmp stp_end
+step_dis:
+ lda #0
+ sta $C010
+stp_end:
+ jmp printc_end
+
+back:
+ lda #$7F
+ sta $C001
+ dey ; Decrement buffer offset.
+ lda #0 ; Put a null terminator, in place of the backspace.
+ sta (ptr), y ; Place it into the input buffer.
+ dec scr_col
+ jsl update_pos
+ jmp printc_end ; Get next character.
+
+bs:
+ lda scr_col ; Are we at the start of the buffer?
+ beq back_wrap
+ jmp back ; We are not, so add the backspace to the buffer.
+back_wrap:
+ jsl getbit
+ bcs back_wrap1
+ jmp printc_end
+back_wrap1:
+ lda scr_row
+ beq back_wrap2
+ jmp backwrp
+back_wrap2:
+ lda scr_str
+ bne back_scrl
+ jmp printc_end
+back_scrl:
+ clc
+ jsl scrl_up
+ inc scr_row
+backwrp:
+ clc
+ lda scr_row
+ adc scr_str
+ tax
+backwrp2:
+ dec scr_row
+ jsl clrbit
+ ldb #80
+ stb scr_col
+ jsl update_pos
+ jmp back
+
+esc:
+ lda $C000 ; Skip the '['.
+ lda $C002
+ cmp #$1B
+ beq shftesc
+ lda $C000 ; Get 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.
+ sta c ; Store the escape code, until we need it.
+ lda #0
+ sta d
+ jsl isup ; Check if the user pressed up.
+ lda d
+ bne esc_end
+ jsl isdown ; Check if the user pressed down.
+ lda d
+ bne esc_end
+ lda #0
+ jsl isleft ; Check if the user pressed left.
+ lda d
+ bne esc_end
+ jsl isright ; Check if the user pressed right.
+esc_end:
+ lda #0
+ sta d
+ jmp printc_end ; Go back to getting user input.
+
+shftesc:
+ lda $C000 ; Skip the '['.
+ lda $C000 ; Get 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.
+ sta c ; Store the escape code, until we need it.
+ lda #0
+ sta d
+ jsl isshftup ; Check if the user pressed shift+up.
+ lda d
+ bne shftesc_end
+ jsl isshftdown ; Check if the user pressed shift+down.
+shftesc_end:
+ lda #0
+ sta d
+ jmp printc_end ; Go back to getting user input.
+
+isup:
+ lda c ; No, so load the escape code back into the accumulator.
+ cmp #$41 ; Did the user press the up arrow key?
+ bne isup_done ; Yes, so return.
+ lda #1
+ sta d
+ lda scr_row ; Is the cursor at the top of the screen?
+ beq isup_scrl ; Yes, so return.
+isup_2:
+ lda c ; No, so load the escape code back into the accumulator.
+ cmp #$41 ; Did the user press the up arrow key?
+ beq up ; Yes, so move the cursor up.
+ jmp isup_done
+isup_scrl:
+ lda scr_str
+ beq isup_done
+ jsl scrl_up
+isup_done:
+ rtl ; End of isup.
+
+isdown:
+ lda c ; No, so load the escape code back into the accumulator.
+ cmp #$42 ; Did the user press the down arrow key?
+ bne isdown_done
+ lda scr_row ; Start checking the y coordinate of the cursor.
+ cmp #23 ; Is the cursor at the bottom of the screen?
+ beq isdown_scrl ; Yes, so return.
+ lda c ; No, so load the escape code back into the accumulator.
+ cmp #$42 ; Did the user press the down arrow key?
+ beq down ; Yes, so move the cursor down.
+ jmp isdown_done
+isdown_scrl:
+ lda scr_row
+ sta scr_trow
+ lda scr_col
+ sta scr_tcol
+ jsl scrl_down
+ lda scr_trow
+ sta scr_row
+ lda scr_tcol
+ sta scr_col
+isdown_done:
+ rtl ; End of isdown.
+
+isright:
+ lda c ; No, so load the escape code back into the accumulator.
+ cmp #$43 ; Did the user press the right arrow key?
+ bne isright_done
+ lda scr_col ; Start checking the x coordinate of the cursor.
+ cmp #79 ; 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:
+ inc scr_row
+ jsl getbit
+ bcs wrap_inc
+ dec scr_row
+ jmp isright_done
+isright_scrl:
+ lda scr_str
+ beq isright_end
+ lda #1
+ sta wrapped
+ jsl scrl_down
+ dec scr_row
+ jmp isright_end
+wrap_inc:
+ lda #0
+ sta scr_col
+ lda scr_row
+ cmp #23
+ bcs isright_scrl
+isright_end:
+ jsl update_pos
+isright_done:
+ lda #0
+ sta wrapped
+ rtl ; End of isright.
+
+isleft:
+ lda c
+ cmp #$43
+ beq isleft_done
+ lda scr_col ; Is the cursor at the far left of the screen?
+ beq isleft_wrp ; Yes, so start checking if this is a wrapped line.
+ lda c ; No, so load the escape code back into the accumulator.
+ cmp #$44 ; Did the user press the left arrow key?
+ beq left ; Yes, so move the cursor left.
+ jmp isleft_done
+isleft_wrp:
+ jsl getbit
+ bcs wrap_dec
+ jmp isleft_done
+wrap_dec:
+ lda scr_row
+ beq wrap_dec1
+ lda #1
+ sta wrapped
+ dec scr_row
+wrap_dec1:
+ lda #79
+ sta scr_col
+ lda #1
+ sta d
+ lda scr_row
+ beq isleft_scrl
+ jmp isleft_end
+isleft_scrl:
+ lda wrapped
+ bne isleft_end
+ lda scr_str
+ beq isleft_done
+ jsl scrl_up
+ jmp isleft_done
+isleft_end:
+ jsl update_pos
+isleft_done:
+ lda #0
+ sta wrapped
+ rtl ; End of isleft.
+
+up:
+ dec scr_row
+ jsl update_pos
+ lda #1
+ sta d
+ jmp isup_done
+down:
+ inc scr_row
+ jsl update_pos
+ lda #1
+ sta d
+ jmp isdown_done
+right:
+ inc scr_col
+ jsl update_pos
+ jmp isright_done
+left:
+ dec scr_col
+ jsl update_pos
+ lda #1
+ sta d
+ jmp isleft_done
+
+isshftup:
+ lda c ; Load the escape code back into the accumulator.
+ cmp #$41 ; Did the user press the up arrow key?
+ bne isshftup_done
+ lda #1
+ sta d
+ lda scr_str
+ beq isshftup_done
+ jmp shftup
+isshftup_done:
+ rtl
+
+isshftdown:
+ lda c ; Load the escape code back into the accumulator.
+ cmp #$42 ; Did the user press the down arrow key?
+ bne isshftdown_done
+ lda #1
+ sta d
+ lda scr_end
+ cmp #71
+ bcs isshftdown_done
+ jmp shftdown
+isshftdown_done:
+ rtl
+
+shftup:
+ jsl scrl_up
+ lda #1
+ sta d
+ jmp isshftup_done
+
+shftdown:
+ jsl scrl_down
+ lda #1
+ sta d
+ jmp isshftdown_done
+
+update_pos:
+ ldb #1
+ stb f
+ clc
+ lda scr_row
+ adc scr_str
+ clc
+ mul #80
+ clc
+ adc scr_col
+ tay
+ lda #$1B ; Print an escape character
+ sta $C001 ; to the screen.
+ lda #$5B ; Print '['
+ sta $C001 ; 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.
+ 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.
+ tba ; Get the remainder.
+ adc #$30 ; Convert it to ascii, and
+ sta $C001 ; print to the screen.
+ rtl ; End of getrow.
+
+getcol:
+ lda #$3B ; Print ';'
+ sta $C001 ; 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.
+ tba ; Get the remainder.
+ clc
+ adc #$30 ; Convert it to ascii, and
+ sta $C001 ; print to the screen.
+ rtl ; End of getrow.
+
+scrl_down:
+
+ inc scr_str
+ inc scr_end
+ lda #$1B ; Print an escape character
+ sta $C001 ; to the screen.
+ lda #$5B ; Print '['
+ sta $C001 ; to the screen, and start the escape sequence.
+ lda #$54 ; Print 'T'
+ sta $C001 ; to the screen, and end the escape sequence.
+ lda wrapped
+ beq scrldn_save
+scrldn1:
+ jsl rdrw_row
+ lda wrapped
+ beq scrldn_load
+ jmp scrldn_end
+scrldn_save:
+ lda scr_row
+ pha #1
+ lda scr_col
+ pha #1
+ jmp scrldn1
+scrldn_load:
+ pla #1
+ sta scr_col
+ pla #1
+ sta scr_row
+ jsl update_pos
+scrldn_end:
+ lda #0
+ sta wrapped
+scrldn_done:
+ rtl
+
+scrl_up:
+ dec scr_str
+ dec scr_end
+ lda #$1B ; Print an escape character
+ sta $C001 ; to the screen.
+ lda #$5B ; Print '['
+ sta $C001 ; to the screen, and start the escape sequence.
+ lda #$53 ; Print 'S'
+ sta $C001 ; to the screen, and end the escape sequence.
+ lda scr_row
+ pha #1
+ lda scr_col
+ pha #1
+ lda #0
+ sta scr_row
+ jsl rdrw_row
+ pla #1
+ sta scr_col
+ pla #1
+ sta scr_row
+ jsl update_pos
+scrlup_done:
+ rtl
+
+rdrw_row:
+ lda #0
+ sta scr_col
+ jsl update_pos
+rdrow_st:
+ lda (ptr), y
+ beq rdrow_inc
+ sta $C001
+rdrow_inc:
+ inc scr_col
+ lda (ptr), y
+ beq rdrow_skip
+ iny
+rdrow_inc1:
+ lda scr_col
+ cmp #80
+ bcs rdrow_end
+ jmp rdrow_st
+rdrow_skip:
+ jsl update_pos
+ jmp rdrow_inc1
+rdrow_end:
+ lda #0
+ sta scr_col
+ jsl update_pos
+rdrow_done:
+ rtl
+
+
+;rdrw_scr:
+; lda #$C
+; sta $C001
+; lda scr_col
+; sta scr_tcol
+; lda scr_row
+; sta scr_trow
+; lda #0
+; sta scr_col
+; sta scr_row
+; phy #2
+; jsl update_pos
+; ply #2
+; ldx scr_ptr
+; phy #2
+; txy
+; lda (ptr), y
+; sta $C001
+; ply #2
+; rtl
+
+result:
+ phy #2
+ txy
+ lda string2, y
+ beq rset_y ; Reset y, if we hit the null terminator.
+ ply #2
+ jsl print_char ; Print 'You have typed, '
+ inx
+ jmp result ; Keep printing.
+
+rset_y:
+ ply #2
+ lda #0 ; Reset a.
+ tax ; Reset y.
+ jmp print_buf ; Print the input buffer.
+
+dabbed:
+ phy #2
+ txy
+ lda (cptr), y ; Get a character from the input buffer.
+ beq dab_pend ; Are we done with printing the buffer?
+ cmp (tptr), y
+ bcc dab_pend
+ beq chk_str
+ bcs dab_pend
+chk_str:
+ ply #2
+ inx
+ cpx #3
+ bne dabbed
+ ldx #0
+pnt_msg:
+ phy #2
+ txy
+ lda (mptr), y ; Get a character from the input buffer.
+ beq dab_peqnd ; Are we done with printing the buffer?
+ ply #2
+ jsl print_char
+ inx
+ jmp pnt_msg ; Keep printing the buffer.
+dab_pend:
+ ply #2
+ lda #1
+ jmp dab_end
+dab_peqnd:
+ ply #2
+ lda #0
+ jmp dab_end
+dab_end:
+ rtl
+
+print_buf:
+ phy #2
+ txy
+ lda (cptr), y ; Get a character from the input buffer.
+ beq cmd_clr ; Are we done with printing the buffer?
+ ply #2
+ jsl print_char
+ inx
+ jmp print_buf ; Keep printing the buffer.
+
+cmd_clr:
+ ply #2
+ lda #10
+ jsl print_char
+ jmp start
+
+.org $FFC0
+.qword reset
+
+.org $FF50
+.qword spin
+.qword spin
+.qword spin
+.qword spin
+.qword spin
+.qword spin
+.qword spin
+done
+