-
Notifications
You must be signed in to change notification settings - Fork 0
/
colour-selector-live.6502
167 lines (125 loc) · 2.84 KB
/
colour-selector-live.6502
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
; Colour selector - live updates
; (C)2020 Chris Tyler - Seneca College
; Licensed under the GPLv2+ - see LICENSE file
; ROM routine entry points
define SCINIT $ff81 ; initialize/clear screen
define CHRIN $ffcf ; input character from keyboard
define CHROUT $ffd2 ; output character to screen
define SCREEN $ffed ; get screen size
define PLOT $fff0 ; get/set cursor coordinates
; zeropage variables
define PRINT_PTR $00
define PRINT_PTR_H $01
define CURRENT $02
define SCRN_PTR $03
define SCRN_PTR_H $04
; constants
; --------------------------------------------------------
jsr SCINIT
jsr PRINT
dcb "B","l","a","c","k",$0d
dcb "W","h","i","t","e",$0d
dcb "R","e","d",$0d
dcb "C","y","a","n",$0d
dcb "P","u","r","p","l","e",$0d
dcb "G","r","e","e","n",$0d
dcb "B","l","u","e",$0d
dcb "Y","e","l","l","o","w",$0d
dcb "O","r","a","n","g","e",$0d
dcb "B","r","o","w","n",$0d
dcb "L","i","g","h","t",32,"r","e","d",$0d
dcb "D","a","r","k",32,"g","r","e","y",$0d
dcb "G","r","e","y",$0d
dcb "L","i","g","h","t",32,"g","r","e","e","n",$0d
dcb "L","i","g","h","t",32,"b","l","u","e",$0d
dcb "L","i","g","h","t",32,"g","r","e","y",$0d
dcb $0d
dcb "S","e","l","e","c","t",32,"a",32,"c","o","l","o","u","r",32
dcb "a","b","o","v","e",32,"t","o",32,"s","e","e",32,"i","t",32
dcb "o","n",32,"t","h","e",32,"b","i","t","m","a","p","p","e","d",32
dcb "d","i","s","p","l","a","y",".",$0d
dcb 00
lda #$00
get_colour: jsr SELECT
ldy #$00
sty SCRN_PTR
ldx #$02
stx SCRN_PTR_H
ldx #$04 ; number of pages to fill
draw: sta (SCRN_PTR),y
iny
bne draw
inc SCRN_PTR_H
dex
bne draw
jmp get_colour
; -----------------------------------------------------------
; SELECT :: select one line from the screen
SELECT: sta CURRENT
show_and_go: jsr HIGHLIGHT
getkey: jsr CHRIN
cmp #$80 ; cursor up
bne try_down
lda CURRENT
beq getkey
jsr HIGHLIGHT
dec CURRENT
jmp return
try_down: cmp #$82 ; cursor down
bne getkey
lda CURRENT
cmp #$0f
beq getkey
jsr HIGHLIGHT
inc CURRENT
return: lda CURRENT
rts
; --------------------------------------------------------
;
; Highlight :: highlight the CURRENT line on the display
HIGHLIGHT: ldy CURRENT
ldx #$00
clc
jsr PLOT
highlight_next: sec
jsr PLOT
eor #$80
jsr CHROUT
inx
cpx #20
bne highlight_next
rts
; --------------------------------------------------------
; Print a message
;
; Prints the message in memory immediately after the
; JSR PRINT. The message must be null-terminated and
; 255 characters maximum in length.
PRINT: pla
clc
adc #$01
sta PRINT_PTR
pla
sta PRINT_PTR_H
tya
pha
ldy #$00
print_next: lda (PRINT_PTR),y
beq print_done
jsr CHROUT
iny
jmp print_next
print_done: tya
clc
adc PRINT_PTR
sta PRINT_PTR
lda PRINT_PTR_H
adc #$00
sta PRINT_PTR_H
pla
tay
lda PRINT_PTR_H
pha
lda PRINT_PTR
pha
rts