diff options
Diffstat (limited to 'test')
| -rw-r--r-- | test/input-2.s | 412 | ||||
| -rw-r--r-- | test/input-3.s | 522 | 
2 files changed, 934 insertions, 0 deletions
| diff --git a/test/input-2.s b/test/input-2.s new file mode 100644 index 0000000..f5cb49e --- /dev/null +++ b/test/input-2.s @@ -0,0 +1,412 @@ +; 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 $2800 +cmd_buf: + +; Initalize some variables. +.org $0 +scr_row: +	.byte $0 +scr_col: +	.byte $0 +a: +	.byte $0 +b: +	.byte $0 +c: +	.byte $0 +d: +	.byte $0 +e: +	.byte $0 +string: +	.byte "Please, type something.\n" +string2: +	.byte "You typed, " +end: +	.byte $0 + +; String Pointer +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 #0 +clr_buf: +	cpy.w #$7FF +	beq start +	sta (ptr), y +	iny +	jmp clr_buf + +start: +	lda #0 +	sta $C000 +	tax		; Reset x. +	tay		; Reset y. +	jsl clr_cbuf +	jmp print + +clr_cbuf: +	cpy.w #$3FF +	beq clr_cbuf_end +	sta (cptr), y +	iny +	jmp clr_cbuf +clr_cbuf_end: +	ldy #0 +	rtl + +rset_a: +	lda #1 +read: +	lda $C000	; Get control register. +	beq rset_a	; Loop until we get a character. +	jmp getchar	; We got a key. +sleep: +	lda end +	bne spin	; Are we done with getting input? + +print: +	lda string, x	; Get character at offset x. +	beq rset_a	; Did we find a null terminator? +	sta $C001	; Print character. +	inx		; Increment offset. +	cmp #$A +	beq inc_row +	inc scr_col +	jmp print +inc_row: +	lda #0 +	sta scr_col +	lda #$42 +	sta c +	jsl isdown +	jmp print	; Keep printing more characters. + +getchar: +	lda $C002	; Get typed character. +	cmp #$1B +	beq esc +	cmp #$A +	beq nl		; Did the user type a newline? +	cmp #8 +	beq bs		; Did the user type a backspace? +	cmp #$7F +	beq bs		; Did the user type a backspace? +echo: +	sta a +	ldx scr_col +	cpx #79 +	bne echo_print +linewrap: +	inc scr_row +	ldx #0 +	stx scr_col +	lda scr_row +	jsl update_pos +echo_print: +	lda a +	sta $C001	; Echo typed character. +	inc scr_col	; Increment the cursor's x coordinate. +	sta (ptr), y	; Store typed character into the input buffer. +	iny +	jmp rset_a	; Start getting user input. + +esc: +	lda $C000	; Skip the '['. +	lda $C000	; Get the next character. +	beq read	; 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. +	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 rset_a	; Go back to getting user input. + +isup: +	lda scr_row	; Is the cursor at the top of the screen? +	beq isup_done	; Yes, so return. +	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. +isup_done: +	rtl		; End of isup. + +isdown: +	lda scr_row	; Start checking the y coordinate of the cursor. +	cmp #23		; Is the cursor at the bottom of the screen? +	beq isdown_done	; 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. +isdown_done: +	rtl		; End of isdown. + +isright: +	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_end	; Yes, so return. +	lda c		; No, so load the escape code back into the accumulator. +	cmp #$43	; Did the user press the right arrow key? +	beq right	; Yes, so move the cursor right. +isright_end: +	rtl		; End of isright. + +isleft: +	lda scr_col	; Is the cursor at the far left of the screen? +	beq isleft_done	; Yes, so return. +	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. +isleft_done: +	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_end +left: +	dec scr_col +	jsl update_pos +	lda #1 +	sta d +	jmp isleft_done + +update_pos: +	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. +	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. + +nl: +	lda #0 +	sta scr_col +	sta (ptr), y	; Store said terminator into the input buffer. +	lda #$42 +	sta c +	jsl isdown +	ldy.w #0	; Reset y, to print the result. +	jsl dabbed +	beq start +	ldy #0 +	jmp result + +back: +	sta $C001	; Print backspace. +	lda #0		; Put a null terminator, in place of the backspace. +	sta (ptr), y	; Place it into the input buffer. +	dey		; Decrement buffer offset. +	dec scr_col +	jmp read	; Get next character. + +bs: +	cpy #0		; Are we at the start of the buffer? +	beq rset_a	; We are, so do not store the backspace into the buffer. +	jmp back	; We are not, so add the backspace to the buffer. + +result: +	ldx scr_col +	cpx #79 +	bne result_print +linewrap2: +	inc scr_row +	ldx #$0 +	stx scr_col +	jsl update_pos +result_print: +	lda string2, y +	beq rset_y	; Reset y, if we hit the null terminator. +	sta $C001	; Print 'You have typed, ' +	inc scr_col	; Increment the cursor's x coordinate. +	iny		; Increment offset. +	jmp result	; Keep printing. + +rset_y: +	ldy.w #0	; Reset y. +	ldx.w #0	; Reset x. +	lda.w #0	; Reset a. +	jmp print_buf	; Print the input buffer. +dabbed: +	lda (ptr), y	; Get a character from the input buffer. +	beq dab_nend	; Are we done with printing the buffer? +	cmp (tptr), y +	bcs dab_nend +	beq chk_str +	bcc dab_nend +chk_str: +	iny +	cpy #3 +	bne dabbed +	ldy #0 +pnt_msg: +	ldx scr_col +	cpx #79 +	bne msg_pnt +linewrap3: +	inc scr_row +	ldx #0 +	stx scr_col +	jsl update_pos +msg_pnt: +	lda (mptr), y	; Get a character from the input buffer. +	beq dab_eqnd	; Are we done with printing the buffer? +	sta $C001	; Print said character. +	inc scr_col	; Increment the cursor's x coordinate. +	iny +	jmp pnt_msg	; Keep printing the buffer. +dab_nend: +	lda #1 +	jmp dab_end +dab_eqnd: +	lda #0 +	jmp dab_end +dab_end: +	rtl + + + +print_buf: +	ldx scr_col +	cpx #79 +	bne buf_print +linewrap4: +	inc scr_row +	ldx #0 +	stx scr_col +	jsl update_pos +buf_print: +	lda (ptr), y	; Get a character from the input buffer. +	beq cmd_clr	; Are we done with printing the buffer? +	sta $C001	; Print said character. +	inc scr_col	; Increment the cursor's x coordinate. +	iny +	jmp print_buf	; Keep printing the buffer. + +cmd_clr: +	lda #0 +	sta scr_col +	lda #$42 +	sta c +	jsl isdown +	jmp start + +scr_to_buf: +	tax +	mul #80 +	adc scr_col +	tay +	txa +	rtl + +spin: +	nop +	nop +	nop +	jmp spin + +.org $1000 +v +.org $1100 +v +.org $1200 +v +.org $8000 +v +.org $8100 +v +.org $8200 +v +.org $8300 +v +.org $FFC0 +.qword reset + +.org $FF50 +.qword spin +.qword spin +.qword spin +.qword spin +.qword spin +.qword spin +.qword spin +.org $FF50 +v +done + diff --git a/test/input-3.s b/test/input-3.s new file mode 100644 index 0000000..a05cb9d --- /dev/null +++ b/test/input-3.s @@ -0,0 +1,522 @@ +; 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: + +.org $200 +bitmask: +	.byte $0 +bitabl: +	.qword $0 +	.word $0 +bits: +	.byte $0 + +; Initalize some variables. +.org $0 +scr_row: +	.byte $0 +scr_col: +	.byte $0 +scr_lnst: +	.word $0 +scr_lncnt: +	.word $0 +scr_rowst: +	.byte $0 +a: +	.byte $0 +b: +	.byte $0 +c: +	.byte $0 +d: +	.byte $0 +e: +	.byte $0 +string: +	.byte "Please, type something.\n" +string2: +	.byte "You typed, " +end: +	.byte $0 + +; Pointers +ptr: +	.qword buffer +cptr: +	.qword cmd_buf +tptr: +	.qword tok +mptr: +	.qword msg +bmptr: +	.qword bitmask +btptr: +	.qword bitabl + +; Main program +.org $8000 +reset: +	cps +	ldx.w #$FFFF +	txs +	ldy #0 +	lda #0 +	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 +	lda #1 +	sta $C000 +	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. +sleep: +	lda end +	bne spin	; Are we done with getting input? + +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: +	phy #2 +	ldx scr_row +getbt1: +	jsl bitpos +	txy +	ldb (btptr), y +	ply #2 +	aba +	cmp #1 +	jmp bitout + +bitpos: +	stx bitmask +	txa +	and #7 +	tax +	lda bits, x +	pha #1 +	lda bitmask +	lsr #3 +	tax +	pla #1 +	rtl + +bitout: +	ldx bitmask +	rtl + +getchar: +	lda $C002	; Get typed character. +	pha #1 +	phy #2 +	cmp #10 +	beq cmd_cpy +getchar_pnt: +	ply #2 +	pla #1 +	jsl print_char +	lda a +	cmp #10 +	beq getchar_line +	jmp getchar_char +cmd_cpy: +	lda scr_row +	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 +	sta scr_lncnt +	jmp getchar_end +getchar_char: +	lda #$1 +getchar_end: +	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 #8 +	beq bs		; Did the user type a backspace? +	cmp #$7F +	beq bs		; Did the user type a backspace? +	sta a +	ldb scr_col +	cpb #79 +	beq linewrap +	jmp printc +linewrap: +	ldb #0 +	stb scr_col +	lda #$42 +	sta c +	jsl isdown +	ldb scr_row +	cpb #23 +	beq printc_end +printc: +	lda a +	inc scr_col	; Increment the cursor's x coordinate. +	inc scr_lncnt +	sta (ptr), y	; Store typed character into the input buffer. +	iny +	sta $C001	; Echo typed character. +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 +	lda #1 +	sta a +	jmp printc_end +nl_inc: +	lda #$42 +	sta c +	jsl isdown +	sty.w scr_lnst +	lda #10 +	sta a +	jmp printc_end + +clr_scr: +	lda #0 +	sta.w scr_lnst +	sta scr_rowst +	tay +	jsl clr_buf +	sta scr_col +	sta scr_row +	jsl update_pos +	lda #$C +	sta $C001 +	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. +	lda #$44 +	dec scr_col +	dec scr_lncnt +	jsl update_pos +	jmp printc_end	; Get next character. + +bs: +	lda scr_col	; Are we at the start of the buffer? +	beq printc_end +	jmp back	; We are not, so add the backspace to the buffer. + +esc: +	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 isup	; Check if the user pressed up. +	lda e +	bne esc_lnst +	lda d +	bne esc_end +	jsl isdown	; Check if the user pressed down. +	lda e +	bne esc_lnst +	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. +	jmp esc_end +esc_lnst: +	lda scr_row +	sta scr_rowst +	mul #80 +	sta.w scr_lnst +esc_end: +	lda #0 +	sta d +	jmp printc_end	; Go back to getting user input. + +isup: +	lda scr_row	; Is the cursor at the top of the screen? +	beq isup_done	; Yes, so return. +	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. +isup_done: +	rtl		; End of isup. + +isdown: +	lda scr_row	; Start checking the y coordinate of the cursor. +	cmp #23		; Is the cursor at the bottom of the screen? +	beq isdown_done	; 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 #$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. +isdown_done: +	rtl		; End of isdown. + +isright: +	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_end	; Yes, so return. +	lda c		; No, so load the escape code back into the accumulator. +	cmp #$43	; Did the user press the right arrow key? +	beq right	; Yes, so move the cursor right. +isright_end: +	rtl		; End of isright. + +isleft: +	lda scr_col	; Is the cursor at the far left of the screen? +	beq isleft_done	; Yes, so return. +	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. +isleft_done: +	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_end +left: +	dec scr_col +	jsl update_pos +	lda #1 +	sta d +	jmp isleft_done + +update_pos: +	lda scr_row +	mul #80 +	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. +	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. + +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 +	bcs dab_pend +	beq chk_str +	bcc 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 +.org $FF50 +done + | 
