1
|
1 org $6000
|
0
|
2 SubHeaderStart
|
3
|
3 dc.b 'MAIN ', 0
|
2
|
4 align 4
|
0
|
5 dc.l 0
|
2
|
6 dc.l End-SubHeaderStart
|
0
|
7 dc.l EntryPoints-SubHeaderStart
|
3
|
8 dc.l 0
|
0
|
9 EntryPoints
|
2
|
10 dc.w Main-EntryPoints
|
3
|
11 ; dc.w Main-EntryPoints
|
|
12 ; dc.w Int2Handler-EntryPoints
|
2
|
13 dc.w 0
|
|
14 Main
|
3
|
15 andi.b #$FA,$FF8003 ;set 2Mbit mode
|
|
16
|
|
17 lea Packet(pc),a5
|
|
18 jsr ReadCD
|
|
19
|
|
20 move.l $80A2,(a5)
|
|
21 move.l (a5),d0
|
|
22 move.l $80AA,d0
|
|
23 lsr.l #8,d0
|
|
24 lsr.l #3,d0
|
|
25 move.l d0,4(a5)
|
|
26 move.l #$8000,8(a5)
|
|
27 jsr ReadCD
|
|
28
|
|
29 move.b #0,$FF800F
|
|
30
|
|
31
|
|
32 Wait:
|
|
33 tst.b $FF800E
|
|
34 bne Wait
|
|
35 move.b #1,$FF800F
|
|
36 Wait2:
|
|
37 tst.b $FF800E
|
|
38 beq Wait2
|
|
39
|
|
40 moveq #0,d0
|
|
41 move.b $FF800E,d0
|
|
42 cmpi.b #8,d0
|
|
43 bgt Wait
|
|
44 add.w d0,d0
|
|
45 add.w d0,d0
|
|
46 jmp FuncTable(pc,d0)
|
|
47 FuncTable:
|
|
48 bra.w Wait ;0x0
|
|
49 bra.w FileList ;0x1
|
|
50 bra.w FileByNumber ;0x2
|
|
51 bra.w FileByNameSimple ;0x3
|
|
52 bra.w FileByNameExtended ;0x4
|
|
53 bra.w SetExtended ;0x5
|
|
54 bra.w Jump ;0x6
|
|
55 bra.w JumpSub ;0x7
|
|
56 bra.w PlayRAW ;0x8
|
|
57
|
|
58
|
|
59
|
|
60 FileList:
|
|
61
|
|
62 move.l #$8000,a0
|
|
63 move.l #$80000,a1
|
|
64 NextFile:
|
|
65 moveq #0,d0
|
|
66 move.b (a0),d0 ;get record length
|
|
67 beq EndList
|
|
68 move.l 6(a0),$20(a1) ;file location
|
|
69 move.l $E(a0),$24(a1) ;file length
|
|
70 moveq #0,d1
|
|
71 move.b $20(a0),d1 ;file name length
|
|
72 subi.w #1,d1
|
|
73 beq Terminate ;skip copy if length = 0
|
|
74 lea $21(a0),a2
|
|
75 movea.l a1,a4
|
|
76 CopyName:
|
|
77 move.b (a2)+,(a4)+ ;copy filename to new table
|
|
78 dbra d1,CopyName
|
|
79 Terminate:
|
|
80 move.b #0,(a4)
|
|
81
|
|
82 adda.l d0,a0
|
|
83 add.l #$28,a1
|
|
84 bra NextFile
|
|
85
|
|
86 EndList:
|
|
87 move.b #$FF,(a1)
|
|
88 ori.b #1,$FF8003
|
|
89 move.b #0,$FF800F
|
|
90 bra Wait
|
|
91
|
|
92
|
|
93
|
|
94
|
|
95
|
|
96 FileByNumber:
|
|
97 lea Packet(pc),a5
|
|
98 move.l $FF8010,(a5)
|
|
99 move.l $FF8014,d0
|
|
100 move.l $FF8018,8(a5)
|
|
101 File:
|
|
102 move.l d0,$FF8020
|
|
103 move.l d0,d1
|
|
104 lsr.l #8,d1
|
|
105 lsr.l #3,d1
|
|
106 andi.l #$7FF,d0
|
|
107 beq SectorAligned
|
|
108 addq #1,d1
|
|
109
|
|
110 SectorAligned:
|
|
111 move.l d1,4(a5)
|
|
112
|
|
113 bsr ReadCD
|
|
114
|
|
115 move.l $8000,d7
|
|
116
|
|
117 ori.b #1,$FF8003
|
|
118
|
|
119 move.b #0,$FF800F
|
1
|
120
|
3
|
121 bra Wait
|
|
122
|
|
123
|
|
124
|
|
125
|
|
126 FileByNameSimple:
|
|
127 lea Packet(pc),a5
|
|
128 move.l #$80000,8(a5)
|
|
129 move.l #$40000,4(a5)
|
|
130 move.l #0,(BeginOffset)
|
|
131
|
|
132 FileByNameExtended:
|
|
133 move.l #$FF8010,a0
|
|
134 bsr FindFile
|
|
135 bcc FileNotFound
|
|
136
|
|
137 lsl.l #8,d1
|
|
138 lsl.l #3,d1
|
|
139 add.l (BeginOffset),d1
|
|
140 sub.l (BeginOffset),d0
|
|
141 lsr.l #8,d1
|
|
142 lsr.l #3,d1
|
|
143
|
|
144 lea Packet(pc),a5
|
|
145
|
|
146 move.l 4(a5),d3
|
|
147 cmp.l d0,d3
|
|
148 bgt TooBig ;File is either smaller than requested length or size of WordRAM
|
|
149
|
|
150 move.l d3,d0
|
|
151 TooBig:
|
|
152
|
|
153 move.l d1,(a5)
|
|
154 bra File
|
|
155
|
|
156 FileNotFound:
|
|
157 ori.b #1,$FF8003
|
|
158 move.b #$FF,$FF800F
|
|
159 bra Wait
|
|
160
|
|
161
|
|
162
|
|
163
|
|
164 SetExtended:
|
|
165 lea Packet(pc),a5
|
|
166 move.l $FF8010,8(a5)
|
|
167 move.l $FF8014,4(a5)
|
|
168 move.l $FF8018,(BeginOffset)
|
|
169
|
|
170 move.b #0,$FF800F
|
|
171 bra Wait
|
|
172
|
|
173
|
|
174
|
|
175 Jump:
|
|
176 move.l $FF8010,a0
|
|
177 jmp (a0)
|
|
178
|
|
179 JumpSub:
|
|
180 move.l $FF8010,a0
|
|
181 jsr (a0)
|
|
182
|
|
183 move.b #0,$FF800F
|
|
184 bra Wait
|
|
185
|
|
186 PlayRAW:
|
|
187
|
|
188
|
|
189 move.l $FF8010,a0 ;get start address
|
|
190 move.w $FF8014,d2 ;get playback frequency
|
|
191
|
|
192
|
|
193 move.w #$F,d6
|
|
194 move.b #$FF,d1
|
|
195
|
|
196
|
|
197 BankLoop:
|
|
198
|
|
199 addq #1,d1 ;increment bank
|
|
200 move.b d1,$FF000F ;turn off sound production,and set waveform memory bank
|
|
201 move.l #$FF2001,a1
|
|
202 move.w #$FFF,d7
|
|
203
|
|
204 MoveIt:
|
|
205 move.b (a0)+,d0
|
|
206 move.b d0,(a1)
|
|
207 addq #2,a1
|
|
208 cmp.b #$FF,d0
|
|
209 dbeq d7,MoveIt
|
|
210
|
|
211 dbeq d6,BankLoop
|
|
212
|
|
213 move.b #$40,$FF000F ;set control to channel 0
|
|
214
|
|
215 move.b #$FF,$FF0001 ;set volume
|
|
216
|
|
217 move.b #$FF,$FF0003 ;set Pan
|
|
218
|
|
219 move.b #$00,$FF0005 ;set FDL (Playback frequency low order byte)
|
|
220
|
|
221 move.b #$08,$FF0007 ;set FDH (Playback frequency high order byte)
|
|
222
|
|
223 move.b #$00,$FF0009 ;LSL (Loop Start Address low order byte)
|
|
224
|
|
225 move.b #$00,$FF000B ;LSH (Loop Start Address high order byte)
|
|
226
|
|
227 move.b #$00,$FF000D ;ST (Start address high order byte,low order byte is always equal to 0)
|
|
228
|
|
229 move.b #$FE,$FF0011 ;turn on channel 0
|
|
230
|
|
231 move.b #$80,$FF000F ;start sound playback
|
|
232
|
|
233 move.b #0,$FF800F
|
|
234
|
|
235 bra Wait
|
|
236
|
|
237
|
|
238
|
|
239 FindFile:
|
|
240 move.l #$8000,a2
|
|
241
|
|
242 NextName:
|
|
243 moveq #0,d3
|
|
244 move.b (a2),d3
|
|
245 beq NotFound
|
|
246
|
|
247 lea $21(a2),a3
|
|
248 move.l a0,a1
|
|
249 Compare:
|
|
250 tst.b (a1)
|
|
251 beq Found
|
|
252 cmp.b (a1)+,(a3)+
|
|
253 beq Compare
|
|
254
|
|
255 add.l d3,a2
|
|
256 bra NextName
|
|
257
|
|
258 NotFound:
|
|
259 move #0,CCR
|
|
260 rts
|
|
261
|
|
262 Found:
|
|
263 move.l $E(a2),d0
|
|
264 move.l 6(a2),d1
|
|
265 move #1,CCR
|
|
266 rts
|
|
267
|
|
268
|
|
269
|
|
270
|
|
271 ReadCD:
|
|
272 movea.l a5,a0
|
|
273 move.w #$89,d0 ;init CD controller
|
|
274 jsr $5f22
|
|
275 move.w #$20,d0 ;start read operation
|
|
276 jsr $5f22
|
|
277
|
|
278 Check:
|
|
279 move.w #$8A,d0 ;check for data
|
|
280 jsr $5f22
|
|
281 bcs Check
|
|
282
|
|
283 Check2:
|
|
284 move.w #$8B,d0
|
|
285 jsr $5f22
|
|
286 bcc Check2
|
|
287
|
|
288 Check3:
|
|
289 move.w #$8C,d0
|
|
290 movea.l 8(a5),a0
|
|
291 lea $C(a5),a1
|
|
292 jsr $5f22
|
|
293 bcc Check3
|
|
294
|
|
295 move.w #$8D,d0
|
|
296 jsr $5f22
|
|
297
|
|
298 addi.l #$800,8(a5)
|
|
299 addq.l #1,(a5)
|
|
300 subq.l #1,4(a5)
|
|
301 bne Check
|
|
302 rts
|
1
|
303 Int2Handler
|
|
304 rte
|
2
|
305
|
3
|
306 BeginOffset:
|
|
307 dc.l $0
|
|
308 Packet:
|
|
309 dc.l $10, 1, $8000, ExtraJunk, 0
|
|
310 ExtraJunk:
|
|
311 dc.b 0
|
|
312
|
2
|
313 End
|