; Testing input. ; ; Writen in Sux assembly by ; mr b0nk 500 ; Initalize some variables. .org $1000 string: .byte "Please, type something.\n" string2: .byte "You typed, " end: .byte $0 ; Input buffer. .org $2000 buffer: ; Main program .org $0 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 #$0 ; Reset y. jmp print sleep: wai ; Sleep until we get a character. lda end bne spin ; Are we done with getting input? jmp sleep ; Loop until we get a newline. print: lda string, x ; Get character at offset x. beq sleep ; Did we find a null terminator? sta $C001 ; Print character. inx ; Increment offset. jmp print ; Keep printing more characters. irq_routine: lda $C002 ; Get typed character. cmp #$A beq nl ; Did the user type a newline? cmp #$8 beq bs ; Did the user type a backspace? echo: sta $C001 ; Echo typed character. sta buffer, y ; Store typed character into the input buffer. iny ; Increment buffer offset. return: rti ; End of interrupt routine. nl: sta $C001 lda #$0 ; Replace newline with a null terminator. sta buffer, y ; Store said terminator into the input buffer. ldy.w #$0 ; Reset y, to print the result. jmp result bs: cpy #$0 beq return ; Are we at the start of the buffer? jmp echo ; We are not, so add the backspace to the buffer. result: lda string2, y beq rset_y ; Reset y, if we hit the null terminator. sta $C001 ; Print 'You have typed, ' iny ; Increment offset. jmp result ; Keep printing. rset_y: ldy.w #$0 jmp print_buf ; Print the input buffer. print_buf: lda buffer, y ; Get a character from the input buffer. beq fin ; Are we done with printing the buffer? sta $C001 ; Print said character. iny jmp print_buf ; Keep printing the buffer. fin: lda #$A ; Load a newline. sta $C001 ; Print the newline. lda #$1 ; Tell the program that we are done. sta end ; We are done. 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 $0 ;viewmem ;q done