-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathtty.s
More file actions
166 lines (151 loc) · 2.42 KB
/
tty.s
File metadata and controls
166 lines (151 loc) · 2.42 KB
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
; tty.s: a simple line-oriented console
; uses `getch` for input, assumes 20x4 LCD for output
; zero page addresses
.dsect
.org $10
TTY_PUTS: reserve 1 ; pointer to the ASCIIZ to puts()
TTY_PUTS_HI: reserve 1 ; high byte of TTY_PUTS
TTY_CURRENT_LINE: reserve 1 ; pointer to TTY-internal buffer
TTY_CURRENT_LINE_HI: reserve 1 ; always TTY_BUF_HI
TTY_READLINE: reserve 1 ; pointer to TTY readline buffer
TTY_READLINE_HI: reserve 1
.dend
; 3-page is a TTY buffer
TTY_BUF_HI = $03 ; use Page 3 as TTY buffer
TTY_READBUF_HI = $04 ; use Page 4 as readline buffer
tty_reset:
pha
lda #TTY_BUF_HI
sta TTY_CURRENT_LINE_HI
sta TTY_PUTS_HI
stz TTY_CURRENT_LINE
stz TTY_PUTS
lda #TTY_READBUF_HI
sta TTY_READLINE_HI
stz TTY_READLINE
pla
jmp tty_return
readline:
pha
jsr tty_return
jsr spaceline
jsr tty_return
lda #'>'
jsr putchar
lda #' '
jsr putchar
stz TTY_READLINE
readline_loop:
jsr getch
cmp #'n'
beq readline_complete
sta (TTY_READLINE)
jsr putchar
inc TTY_READLINE
lda TTY_READLINE
ina ; #'>' these are the readline prompt
ina ; #' '
cmp #LCD_LINE_LENGTH
bne readline_loop
readline_complete:
lda #0
sta (TTY_READLINE)
jsr tty_scroll
pla
rts
.macro puts
pha
lda #<\1
sta TTY_PUTS
lda #>\1
sta TTY_PUTS_HI
jsr puts
pla
.endm
; Prints ASCIIZ string at (TTY_PUTS) to the console, followed by a newline
puts:
pha
phx
ldx #0
_puts_loop:
lda (TTY_PUTS)
beq _endl
jsr putchar
inc TTY_PUTS
inx
cpx #LCD_LINE_LENGTH
bne _puts_loop
_endl:
plx
pla
jmp tty_scroll
tty_scroll:
pha
lda #LCD_LINE1
jsr lcd_move
jsr copyline
lda #LCD_LINE0
jsr lcd_move
jsr pasteline
lda #LCD_LINE2
jsr lcd_move
jsr copyline
lda #LCD_LINE1
jsr lcd_move
jsr pasteline
lda #LCD_LINE3
jsr lcd_move
jsr copyline
lda #LCD_LINE2
jsr lcd_move
jsr pasteline
jsr tty_return
jsr spaceline
pla
jmp tty_return
tty_return:
pha
lda #LCD_LINE3
jsr lcd_move
pla
rts
copyline:
pha
phx
stz TTY_CURRENT_LINE
ldx #LCD_LINE_LENGTH
_copy1:
jsr lcd_read
sta (TTY_CURRENT_LINE)
inc TTY_CURRENT_LINE
dex
bne _copy1
plx
pla
rts
pasteline:
pha
phx
stz TTY_CURRENT_LINE
ldx #LCD_LINE_LENGTH
_paste1:
lda (TTY_CURRENT_LINE)
jsr putchar
inc TTY_CURRENT_LINE
dex
bne _paste1
plx
pla
rts
spaceline:
pha
phx
ldx #LCD_LINE_LENGTH
lda #' '
_space1:
jsr putchar
dex
bne _space1
plx
pla
rts