; Testing input. ; ; Writen in Sux assembly by ; mr b0nk 500 ; Initalize some variables. .org $1000 scr_row: .byte $0 scr_col: .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 $0000 buffer: ; Main program .org $8000 reset: cps ldx.w #$FFFF txs ldy #$0 clr_buf: lda #$0 cpy.w #$1000 beq start sta buffer, y iny jmp clr_buf start: ldx.w #$0 ; Reset x. ldy.w #$0 ; Reset y. jmp print rset_a: lda #$10 delay: beq read dec jmp delay sleep: lda end bne spin ; Are we done with getting input? read: lda $C000 ; Get control register. beq rset_a ; Loop until we get a character. lda #$0 sta $C000 jmp getchar ; We got a key. 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: inc scr_row lda #$0 sta scr_col 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 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 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 go back to getting user input. lda $C002 ; Get the escape code. 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. 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. 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. 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: dec scr_row jsr update_pos lda #$1 sta d jmp isup_done down: inc scr_row jsr update_pos lda #$1 sta d jmp isdown_done right: inc scr_col jsr update_pos jmp isright_end left: dec scr_col jsr 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. 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 ; 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 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 back: sta $C001 ; Print backspace. 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: 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 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. rset_y: ldy.w #$0 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. spin: nop nop nop jmp spin .org $FFC0 .qword reset .org $FF50 .qword spin .qword spin .qword spin .qword spin .qword spin .qword spin .qword spin .org $FFA0 .qword irq_routine .org $8000 viewmem .org $8100 viewmem .org $8200 viewmem ;q done