summaryrefslogtreecommitdiff
path: root/test/input.s
blob: 9e5ef69e31068b1a9d7794d662e2d792a8417395 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
; Testing input.
;
; Writen in Sux assembly by
; mr b0nk 500 <b0nk@b0nk.xyz>


; 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