-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDiscoLights.asm
143 lines (130 loc) · 3.58 KB
/
DiscoLights.asm
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
;Small demostration program to display coloured screen segments
;based on the inputs received from a cassette loading program file
;First published in Your Computer September 1984
;Rom routine locations amended from Dragon version.
ORG $6000
SETDP 0
INPUT0 FCB $43
INPUT1 FCB 0
INPUT2 FCB 0
START JSR $A7CA ;Turn Motor On
JSR $A99D ;Audio On
LDB #$80
JSR $A92A ;Clear screen to character in "B" register
MAINLP JSR $A749 ;Input one byte from cassette to Register A
;Calculate input value
STA INPUT0
LDA #$1F
STA INPUT1
LDA #$08
STA INPUT2
LDB INPUT0
CLRA
LP2 ASLB
ROLA
CMPA INPUT1
BCS LP1
SUBA INPUT1
INCB
LP1 DEC INPUT2
BNE LP2
;based on value branch to set appropriate screen segment
CMPA #$01
BEQ CHK1
CMPA #$02
BEQ CHK2
CMPA #$03
BEQ CHK3
CMPA #$04
BEQ CHK4
CMPA #$05
BEQ CHK5
CMPA #$06
BEQ CHK6
CMPA #$07
LBEQ CHK7
CMPA #$08
LBEQ CHK8
BRA MAINLP
CHK1 LDA $0400 ;Get character currently displayed in 1st segment
CMPA #$8F ;is segment already drawn?
BEQ CHK1A ;Yes - jump to clear
LDB #$8F ;No - set to colour
BRA CHK1B
CHK1A LDB #$80 ;set blank character
CHK1B LDX #$0400 ;set start position
LBSR SHOW ;draw screen
BRA MAINLP ;start again
CHK2 LDA $040B
CMPA #$9F
BEQ CHK2A
LDB #$9F
BRA CHK2B
CHK2A LDB #$80
CHK2B LDX #$040B
LBSR SHOW
BRA MAINLP
CHK3 LDA $0416
CMPA #$AF
BEQ CHK3A
LDB #$AF
BRA CHK3B
CHK3A LDB #$80
CHK3B LDX #$0416
BSR SHOW
LBRA MAINLP
CHK4 LDA $04A0
CMPA #$BF
BEQ CHK4A
LDB #$BF
BRA CHK4B
CHK4A LDB #$80
CHK4B LDX #$04A0
BSR SHOW
LBRA MAINLP
CHK5 LDA $04B6
CMPA #$CF
BEQ CHK5A
LDB #$CF
BRA CHK5B
CHK5A LDB #$80
CHK5B LDX #$04B6
BSR SHOW
LBRA MAINLP
CHK6 LDA $0540
CMPA #$DF
BEQ CHK6A
LDB #$DF
BRA CHK6B
CHK6A LDB #$80
CHK6B LDX #$0540
BSR SHOW
LBRA MAINLP
CHK7 LDA $054B
CMPA #$EF
BEQ CHK7A
LDB #$EF
BRA CHK7B
CHK7A LDB #$80
CHK7B LDX #$054B
BSR SHOW
LBRA MAINLP
CHK8 LDA $0556
CMPA #$FF
BEQ CHK8A
LDB #$FF
BRA CHK8B
CHK8A LDB #$80
CHK8B LDX #$0556
BSR SHOW
LBRA MAINLP
SHOW TFR B,A
LDB #$05 ;depth of segment
SHOW2 LDY #$000A ;width of segment
SHOW1 STA ,X+ ;draw chacter to screen
LEAY -1,Y ;reduce width counter
BNE SHOW1 ;still more columns to draw?
LEAX 22,X ;go down to next row
DECB ;reduce row counter
BNE SHOW2 ;still more rows to draw?
RTS ;Return