summaryrefslogtreecommitdiff
path: root/test/input.s
blob: b699ddab4836c846e052098cce5b4efe64f6ad01 (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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
; 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 $8000
reset:
	cps
	ldx.w #$FFFF
	txs
	ldy #$0
clr_buf:
	lda #$0
	cpy.w #$400
	beq start
	sta buffer, y
	iny
	jmp clr_buf

start:
	ldx.w #$0	; Reset x.
	ldy #$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:
	nop		; Sleep until we get a character.
	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.
	jmp print	; Keep printing more characters.

getchar:
	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.
	nop
	jmp rset_a	; We are not, so add the backspace to the buffer.

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.
	jmp sleep


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
;.org $100
;viewmem
;q
done