summaryrefslogtreecommitdiff
path: root/test/input-3.s
diff options
context:
space:
mode:
Diffstat (limited to 'test/input-3.s')
-rw-r--r--test/input-3.s900
1 files changed, 0 insertions, 900 deletions
diff --git a/test/input-3.s b/test/input-3.s
deleted file mode 100644
index 35547a7..0000000
--- a/test/input-3.s
+++ /dev/null
@@ -1,900 +0,0 @@
-; Testing input.
-;
-; 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
-