From 63d5046ecabd5fd1524d3c4bc4590176c3b8a4eb Mon Sep 17 00:00:00 2001 From: mrb0nk500 Date: Thu, 23 Jan 2020 13:55:00 -0500 Subject: Start optimizing the emulator. I also added a new input testing program called input-3.s, which contains a mostly working editor. --- test/input-2.s | 412 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 412 insertions(+) create mode 100644 test/input-2.s (limited to 'test/input-2.s') 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 + +; 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 + -- cgit v1.2.3-13-gbd6f