diff options
Diffstat (limited to 'test/input.s')
-rw-r--r-- | test/input.s | 230 |
1 files changed, 162 insertions, 68 deletions
diff --git a/test/input.s b/test/input.s index 95b4077..169372f 100644 --- a/test/input.s +++ b/test/input.s @@ -6,23 +6,27 @@ ; Initalize some variables. .org $1000 -string: - .byte "Please, type something.\n" -string2: - .byte "You typed, " -end: - .byte $0 scr_row: - .word $0 + .byte $0 scr_col: - .word $0 + .byte $0 a: .word $0 b: .word $0 +c: + .word $0 +d: + .word $0 +string: + .byte "Please, type something.\n" +string2: + .byte "You typed, " +end: + .byte $0 ; Input buffer. -.org $2000 +.org $0000 buffer: ; Main program @@ -42,7 +46,7 @@ clr_buf: start: ldx.w #$0 ; Reset x. - ldy #$0 ; Reset y. + ldy.w #$0 ; Reset y. jmp print rset_a: @@ -66,6 +70,14 @@ print: 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: + inc scr_row + lda #$0 + sta scr_col jmp print ; Keep printing more characters. getchar: @@ -79,98 +91,157 @@ getchar: 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 + jsr update_pos +echo_print: + lda a sta $C001 ; Echo typed character. + inc scr_col ; Increment the cursor's x coordinate. sta buffer, y ; Store typed character into the input buffer. - iny ; Increment buffer offset. - jmp rset_a ; We are not, so add the backspace to the buffer. + iny ; Increment the buffer offset. + 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 read 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. - cmp #$41 ; Did the user press the up arrow? + sta c ; Store the escape code, until we need it. + jsr isup ; Check if the user pressed up. + lda d + cmp #$0 + bne esc_end + jsr isdown ; Check if the user pressed down. + lda d + cmp #$0 + bne esc_end + lda #$0 + jsr isleft ; Check if the user pressed left. + lda d + cmp #$0 + bne esc_end + jsr 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. - cmp #$42 ; Did the user press the down arrow? +isup_done: + rts ; End of isup. + +isdown: + lda scr_row ; Start checking the y coordinate of the cursor. + cmp #$17 ; 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. - cmp #$43 ; Did the user press the right arrow? +isdown_done: + rts ; End of isdown. + +isright: + lda scr_col ; Start checking the x coordinate of the cursor. + cmp #$4F ; 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. - cmp #$44 ; Did the user press the left arrow? +isright_end: + rts ; 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: + rts ; End of isleft. + up: - lda scr_row - beq rset_a dec scr_row jsr update_pos - lda #$1B - sta $C001 - lda #$5B - sta $C001 - lda #$41 - sta $C001 - jmp rset_a + lda #$1 + sta d + jmp isup_done down: inc scr_row jsr update_pos - lda #$1B - sta $C001 - lda #$5B - sta $C001 - lda #$42 - sta $C001 - jmp rset_a + lda #$1 + sta d + jmp isdown_done right: - lda scr_col - cmp #$50 - beq rset_a inc scr_col jsr update_pos - lda #$1B - sta $C001 - lda #$5B - sta $C001 - lda #$43 - sta $C001 - jmp rset_a + jmp isright_end left: - lda scr_col - beq rset_a dec scr_col jsr update_pos - lda #$1B - sta $C001 - lda #$5B - sta $C001 - lda #$44 - sta $C001 - jmp rset_a + lda #$1 + sta d + jmp isleft_done update_pos: - lda #$1B - sta $C001 - lda #$5B - sta $C001 - lda scr_row - jsr uint_to_bcd - jmp spin + lda #$1B ; Print an escape character + sta $C001 ; to the screen. + lda #$5B ; Print '[' + sta $C001 ; to the screen, and start the escape sequence. + jsr getrow ; Start printing the row number to the screen. + jsr getcol ; Start printing the column number to the screen. + lda #$48 ; Print 'H' + sta $C001 ; to the screen. + rts ; End of update_pos. +getrow: + lda scr_row ; Get the cursor's y coordinate. + div #$A ; 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. + rts ; End of getrow. +getcol: + lda #$3B ; Print ';' + sta $C001 ; to the screen. + lda scr_col ; Get the cursor's x coordinate. + div #$A ; 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. + rts ; End of getrow. uint_to_bcd: - div #$A - lsl #$4 - sta a - tba - sta b - lda a - ora b - rts + div #$A ; Divide A by 10. + lsl #$4 ; Shift the result left by 4 bits. + sta a ; Store the result for later. + tba ; Get the remainder. + sta b ; Store the remainder for later. + lda a ; Get the result. + ora b ; Or the result, with the remainder. + rts ; We've converted the value to BCD, so return. nl: lda #$A sta $C001 inc scr_row - jsr update_pos lda #$0 ; Replace newline with a null terminator. sta buffer, y ; Store said terminator into the input buffer. + sta scr_col ldy.w #$0 ; Reset y, to print the result. jmp result @@ -179,6 +250,7 @@ back: lda #$0 ; Put a null terminator, in place of the backspace. sta buffer, y ; Place it into the input buffer. dey ; Decrement buffer offset. + dec scr_col jmp read ; Get next character. bs: @@ -187,9 +259,19 @@ bs: jmp back ; We are not, so add the backspace to the buffer. result: + ldx scr_col + cpx #$79 + bne result_print +linewrap: + inc scr_row + ldx #$0 + stx scr_col + jsr 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. @@ -199,9 +281,19 @@ rset_y: jmp print_buf ; Print the input buffer. print_buf: + ldx scr_col + cpx #$79 + bne buf_print +linewrap: + inc scr_row + ldx #$0 + stx scr_col + jsr update_pos +buf_print: lda buffer, y ; Get a character from the input buffer. beq spin ; 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. @@ -229,6 +321,8 @@ spin: viewmem .org $8100 viewmem +.org $8200 +viewmem ;q done |