xplx.asm revision 1.1 1 1.1 tsutsui ;
2 1.1 tsutsui ; Copyright (c) 2018 Yosuke Sugahara. All rights reserved.
3 1.1 tsutsui ;
4 1.1 tsutsui ; Redistribution and use in source and binary forms, with or without
5 1.1 tsutsui ; modification, are permitted provided that the following conditions
6 1.1 tsutsui ; are met:
7 1.1 tsutsui ; 1. Redistributions of source code must retain the above copyright
8 1.1 tsutsui ; notice, this list of conditions and the following disclaimer.
9 1.1 tsutsui ; 2. Redistributions in binary form must reproduce the above copyright
10 1.1 tsutsui ; notice, this list of conditions and the following disclaimer in the
11 1.1 tsutsui ; documentation and/or other materials provided with the distribution.
12 1.1 tsutsui ;
13 1.1 tsutsui ; THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14 1.1 tsutsui ; IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15 1.1 tsutsui ; OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16 1.1 tsutsui ; IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17 1.1 tsutsui ; INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
18 1.1 tsutsui ; BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19 1.1 tsutsui ; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
20 1.1 tsutsui ; AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
21 1.1 tsutsui ; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 1.1 tsutsui ; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
23 1.1 tsutsui ; SUCH DAMAGE.
24 1.1 tsutsui ;
25 1.1 tsutsui ;
26 1.1 tsutsui ; LUNA XP multiplexed device firmware
27 1.1 tsutsui ;
28 1.1 tsutsui ; used language:
29 1.1 tsutsui ; zasm 4.1
30 1.1 tsutsui ; http://k1.spdns.de/Develop/Projects/zasm
31 1.1 tsutsui ;
32 1.1 tsutsui ; XP memory map
33 1.1 tsutsui ;
34 1.1 tsutsui ; type : SH, PR, IN, NC
35 1.1 tsutsui ; SH: host shared memory, 64kB, PA 00000 - 0FFFF
36 1.1 tsutsui ; PR: private memory, 32kB, PA 28000-2FFFF
37 1.1 tsutsui ; IN: HD647180 internal 512 bytes memory
38 1.1 tsutsui ; NC: not connected (00 or FF or image readable, maybe)
39 1.1 tsutsui ;
40 1.1 tsutsui ; start end type desc
41 1.1 tsutsui ; 0000 00FF SH RESET/RST etc.
42 1.1 tsutsui ; 0100 01FF SH shared variables
43 1.1 tsutsui ; 0200 0FFF SH resident program
44 1.1 tsutsui ; 1000 7FFF SH PAM/PCM buffer 28K
45 1.1 tsutsui ; 8000 8FFF SH PSG buffer 4K
46 1.1 tsutsui ; 9000 9FFF SH LPR buffer 4K
47 1.1 tsutsui ; A000 DFFF SH FDC buffer 16K
48 1.1 tsutsui ; E000 EFFF PR program/stack
49 1.1 tsutsui ; F000 FDFF NC bus error (00 or FF)
50 1.1 tsutsui ; FE00 FFDF IN PAM player
51 1.1 tsutsui ; FFE0 FFFF IN interrupt vector
52 1.1 tsutsui ;
53 1.1 tsutsui ; shared variable area
54 1.1 tsutsui ; 0100 XPBUS
55 1.1 tsutsui ; 0110 TIME
56 1.1 tsutsui ; 0120 PAM
57 1.1 tsutsui ; 0130 PCM
58 1.1 tsutsui ; 0140 PSG
59 1.1 tsutsui ; 0150 SPK
60 1.1 tsutsui ; 0160 LPR
61 1.1 tsutsui ; 0170 FDC
62 1.1 tsutsui ; 0180 SIO0
63 1.1 tsutsui ; 0190 SIO1
64 1.1 tsutsui ; device ID = bit 7-4
65 1.1 tsutsui ;
66 1.1 tsutsui ; XP internal device usage
67 1.1 tsutsui ; PRT0 device dispatcher/TIME
68 1.1 tsutsui ; PRT1 PCM
69 1.1 tsutsui ; PT2 unused
70 1.1 tsutsui ; ASCI0 SIO0
71 1.1 tsutsui ; ASCI1 SIO1 ?
72 1.1 tsutsui ;
73 1.1 tsutsui ; READY-CMD-RESULT-RUN
74 1.1 tsutsui ; XP
75 1.1 tsutsui ; READY
76 1.1 tsutsui ; != 0
77 1.1 tsutsui ; 0
78 1.1 tsutsui ; CMD
79 1.1 tsutsui ;
80 1.1 tsutsui ; 0
81 1.1 tsutsui ; XP READY=0 CMD=0 XP 0
82 1.1 tsutsui ; RESULT
83 1.1 tsutsui ;
84 1.1 tsutsui ; RESULT=x READY=1
85 1.1 tsutsui ; 0
86 1.1 tsutsui ; RUN
87 1.1 tsutsui ; != 0
88 1.1 tsutsui ; 0
89 1.1 tsutsui ; RESULT=x RUN=0 READY=1
90 1.1 tsutsui ;
91 1.1 tsutsui ;
92 1.1 tsutsui ; READY
93 1.1 tsutsui ; CMD
94 1.1 tsutsui ; READY
95 1.1 tsutsui ; RUN
96 1.1 tsutsui ; CMD
97 1.1 tsutsui ;
98 1.1 tsutsui ; RESULT
99 1.1 tsutsui ; RUN
100 1.1 tsutsui ; READY
101 1.1 tsutsui ;
102 1.1 tsutsui ;
103 1.1 tsutsui ;
104 1.1 tsutsui ; while (READY == 0); //
105 1.1 tsutsui ; RESULT=0; //
106 1.1 tsutsui ; CMD=x; //
107 1.1 tsutsui ; while (RESULT == 0); //
108 1.1 tsutsui ; if (RESULT==ERROR) error(); //
109 1.1 tsutsui ;
110 1.1 tsutsui
111 1.1 tsutsui ;
112 1.1 tsutsui ; XPBUS
113 1.1 tsutsui ; +0.b READY
114 1.1 tsutsui ; +1.b CMD
115 1.1 tsutsui ; +2.b RESULT
116 1.1 tsutsui ; +3.b RUN
117 1.1 tsutsui ;
118 1.1 tsutsui ; +4.b STAT_RESET
119 1.1 tsutsui ; 0
120 1.1 tsutsui ; +1
121 1.1 tsutsui ; 1
122 1.1 tsutsui ; +5.3 align
123 1.1 tsutsui ; +8.w PRT0_TIMER
124 1.1 tsutsui ; ==256(1200Hz)
125 1.1 tsutsui ; +A.w INTR1_DEV
126 1.1 tsutsui ; bitmap of INTR1 device ID
127 1.1 tsutsui ; +C.w INTR5_DEV
128 1.1 tsutsui ; bitmap of INTR5 device ID
129 1.1 tsutsui ;
130 1.1 tsutsui ; TIME
131 1.1 tsutsui ; +0.b READY
132 1.1 tsutsui ; +1.b CMD
133 1.1 tsutsui ; +2.b RESULT
134 1.1 tsutsui ; +3.b RUN
135 1.1 tsutsui ;
136 1.1 tsutsui ; +4.w TIMECOUNTER
137 1.1 tsutsui ;
138 1.1 tsutsui ; PAM
139 1.1 tsutsui ; +0.b READY
140 1.1 tsutsui ; +1.b CMD
141 1.1 tsutsui ; +2.b RESULT
142 1.1 tsutsui ; +3.b RUN
143 1.1 tsutsui ;
144 1.1 tsutsui ; +4.b ENC
145 1.1 tsutsui ;
146 1.1 tsutsui ; +5.b REPT
147 1.1 tsutsui ; REPT
148 1.1 tsutsui ; +6.w CYCLE_CLK
149 1.1 tsutsui ;
150 1.1 tsutsui ;
151 1.1 tsutsui ; +8.b REPT_CLK
152 1.1 tsutsui ; 1 REPT
153 1.1 tsutsui ;
154 1.1 tsutsui ; +9.b REPT_MAX
155 1.1 tsutsui ; REPT
156 1.1 tsutsui ;
157 1.1 tsutsui ;
158 1.1 tsutsui ; +E.w STAT_PTR
159 1.1 tsutsui ;
160 1.1 tsutsui ; PCM
161 1.1 tsutsui ; +0.b READY
162 1.1 tsutsui ; +1.b CMD
163 1.1 tsutsui ; +2.b RESULT
164 1.1 tsutsui ; +3.b RUN
165 1.1 tsutsui ; +4.b ENC
166 1.1 tsutsui ; +6.w PRT1_TIMER
167 1.1 tsutsui ; PCM >=10(30.72kHz,200clk)
168 1.1 tsutsui ;
169 1.1 tsutsui ; +E.w STAT_PTR
170 1.1 tsutsui ;
171 1.1 tsutsui ; PSG
172 1.1 tsutsui ; +0.b READY
173 1.1 tsutsui ; +1.b CMD
174 1.1 tsutsui ; +2.b RESULT
175 1.1 tsutsui ; +3.b RUN
176 1.1 tsutsui ;
177 1.1 tsutsui ; SPK
178 1.1 tsutsui ; +0.b READY
179 1.1 tsutsui ; +1.b CMD
180 1.1 tsutsui ; +2.b RESULT
181 1.1 tsutsui ; +3.b RUN
182 1.1 tsutsui ;
183 1.1 tsutsui ; +4.b VOL
184 1.1 tsutsui ; PSG
185 1.1 tsutsui ; +6.w FREQ
186 1.1 tsutsui ; PSG FREQ
187 1.1 tsutsui ; +8.w TIME
188 1.1 tsutsui ; 1200Hz
189 1.1 tsutsui ; +A.w REMAIN
190 1.1 tsutsui ;
191 1.1 tsutsui ;
192 1.1 tsutsui ; LPR
193 1.1 tsutsui ; TBD.
194 1.1 tsutsui ; FDC
195 1.1 tsutsui ; TBD.
196 1.1 tsutsui ;
197 1.1 tsutsui ; SIO0
198 1.1 tsutsui ; +0.b READY
199 1.1 tsutsui ; +1.b CMD
200 1.1 tsutsui ; +2.b RESULT
201 1.1 tsutsui ; +3.b RUN
202 1.1 tsutsui ; ;
203 1.1 tsutsui ; ;
204 1.1 tsutsui ; +4.b TXCMD
205 1.1 tsutsui ; +5.b TXSTAT
206 1.1 tsutsui ; +6.b TX
207 1.1 tsutsui ; +A.b RXCMD
208 1.1 tsutsui ; +B.b RXSTAT
209 1.1 tsutsui ; +C.b RX
210 1.1 tsutsui ;
211 1.1 tsutsui ; SIO1
212 1.1 tsutsui ; +0.b READY
213 1.1 tsutsui ; +1.b CMD
214 1.1 tsutsui ; +2.b RESULT
215 1.1 tsutsui ; +3.b RUN
216 1.1 tsutsui ; ;
217 1.1 tsutsui ; ;
218 1.1 tsutsui ; +4.b TXCMD
219 1.1 tsutsui ; +5.b TXSTAT
220 1.1 tsutsui ; +6.b TX
221 1.1 tsutsui ; +A.b RXCMD
222 1.1 tsutsui ; +B.b RXSTAT
223 1.1 tsutsui ; +C.b RX
224 1.1 tsutsui
225 1.1 tsutsui .Z180
226 1.1 tsutsui
227 1.1 tsutsui ; ######## device ID
228 1.1 tsutsui
229 1.1 tsutsui #define DEVID_XPBUS 0
230 1.1 tsutsui #define DEVID_TIME 1
231 1.1 tsutsui #define DEVID_PAM 2
232 1.1 tsutsui #define DEVID_PCM 3
233 1.1 tsutsui #define DEVID_PSG 4
234 1.1 tsutsui #define DEVID_SPK 5
235 1.1 tsutsui #define DEVID_LPR 6
236 1.1 tsutsui #define DEVID_FDC 7
237 1.1 tsutsui #define DEVID_SIO0 8
238 1.1 tsutsui #define DEVID_SIO1 9
239 1.1 tsutsui ; ######## define
240 1.1 tsutsui
241 1.1 tsutsui #define PAM_CMD_START 1
242 1.1 tsutsui #define PAM_CMD_QUERY 2
243 1.1 tsutsui
244 1.1 tsutsui #define PAM_ENC_PAM2A 1
245 1.1 tsutsui #define PAM_ENC_PAM2B 2
246 1.1 tsutsui #define PAM_ENC_PAM3A 3
247 1.1 tsutsui #define PAM_ENC_PAM3B 4
248 1.1 tsutsui #define PAM_ENC_PAM1P 5
249 1.1 tsutsui
250 1.1 tsutsui #define PCM_CMD_START 1
251 1.1 tsutsui
252 1.1 tsutsui #define PCM_ENC_PCM1 1
253 1.1 tsutsui #define PCM_ENC_PCM2 2
254 1.1 tsutsui #define PCM_ENC_PCM3 3
255 1.1 tsutsui
256 1.1 tsutsui #define SPK_CMD_START 1
257 1.1 tsutsui #define SPK_CMD_STOP 2
258 1.1 tsutsui #define SPK_CMD_KEEP 3
259 1.1 tsutsui
260 1.1 tsutsui
261 1.1 tsutsui ; #### RESULT
262 1.1 tsutsui #define XPLX_R_OK 1
263 1.1 tsutsui #define XPLX_R_ERROR_PARAM 254
264 1.1 tsutsui #define XPLX_R_UNKNOWN_CMD 255
265 1.1 tsutsui
266 1.1 tsutsui
267 1.1 tsutsui ; ######## switch
268 1.1 tsutsui ; 0 = USE STAT_PTR for userland test mode
269 1.1 tsutsui ; 1 = USE HOSTINTR for kernel (normal)
270 1.1 tsutsui #define USE_INTR 1
271 1.1 tsutsui
272 1.1 tsutsui ; ######## constants
273 1.1 tsutsui ; xp to host level 1 interrupt port
274 1.1 tsutsui HOSTINTR1 .EQU 0B0H
275 1.1 tsutsui ; xp to host level 5 interrupt port
276 1.1 tsutsui HOSTINTR5 .EQU 0A0H
277 1.1 tsutsui
278 1.1 tsutsui ; PAM use HOSTINTR5
279 1.1 tsutsui PAM_HOSTINTR .EQU HOSTINTR5
280 1.1 tsutsui ; PCM use HOSTINTR5
281 1.1 tsutsui PCM_HOSTINTR .EQU HOSTINTR5
282 1.1 tsutsui
283 1.1 tsutsui ; I/O PORT
284 1.1 tsutsui TMDR0L .EQU 0CH
285 1.1 tsutsui TMDR0H .EQU 0DH
286 1.1 tsutsui RLDR0L .EQU 0EH
287 1.1 tsutsui RLDR0H .EQU 0FH
288 1.1 tsutsui TCR .EQU 10H
289 1.1 tsutsui TMDR1L .EQU 14H
290 1.1 tsutsui TMDR1H .EQU 15H
291 1.1 tsutsui RLDR1L .EQU 16H
292 1.1 tsutsui RLDR1H .EQU 17H
293 1.1 tsutsui
294 1.1 tsutsui PSG_ADR .EQU 83H ; PSG address (out)
295 1.1 tsutsui PSG_DAT .EQU 82H ; data output
296 1.1 tsutsui PSG_IN .EQU 83H ; data input (in)
297 1.1 tsutsui
298 1.1 tsutsui INITIAL_SP: .EQU 01000H
299 1.1 tsutsui PRIVATE_SP: .EQU 0F000H
300 1.1 tsutsui
301 1.1 tsutsui ; ######## macros
302 1.1 tsutsui
303 1.1 tsutsui ADD_HL_A: .MACRO
304 1.1 tsutsui ADD A,L
305 1.1 tsutsui LD L,A
306 1.1 tsutsui JR NC,$ + 3
307 1.1 tsutsui INC H
308 1.1 tsutsui .ENDM
309 1.1 tsutsui
310 1.1 tsutsui WAIT3 .MACRO
311 1.1 tsutsui NOP
312 1.1 tsutsui .ENDM
313 1.1 tsutsui
314 1.1 tsutsui WAIT4 .MACRO
315 1.1 tsutsui LD A,A
316 1.1 tsutsui .ENDM
317 1.1 tsutsui
318 1.1 tsutsui WAIT6 .MACRO
319 1.1 tsutsui NOP
320 1.1 tsutsui NOP
321 1.1 tsutsui .ENDM
322 1.1 tsutsui
323 1.1 tsutsui WAIT7 .MACRO
324 1.1 tsutsui LD A,A ; 4+3=7
325 1.1 tsutsui NOP
326 1.1 tsutsui .ENDM
327 1.1 tsutsui
328 1.1 tsutsui WAIT8 .MACRO
329 1.1 tsutsui LD A,A ; 4*2=8
330 1.1 tsutsui LD A,A
331 1.1 tsutsui .ENDM
332 1.1 tsutsui
333 1.1 tsutsui WAIT9 .MACRO
334 1.1 tsutsui NOP ; 3*3=9
335 1.1 tsutsui NOP
336 1.1 tsutsui NOP
337 1.1 tsutsui .ENDM
338 1.1 tsutsui
339 1.1 tsutsui WAIT10 .MACRO
340 1.1 tsutsui LD A,A ; 4+3*2=10
341 1.1 tsutsui NOP
342 1.1 tsutsui NOP
343 1.1 tsutsui .ENDM
344 1.1 tsutsui
345 1.1 tsutsui WAIT11 .MACRO
346 1.1 tsutsui LD A,A ; 4*2+3=11
347 1.1 tsutsui LD A,A
348 1.1 tsutsui NOP
349 1.1 tsutsui .ENDM
350 1.1 tsutsui
351 1.1 tsutsui WAIT12 .MACRO
352 1.1 tsutsui LD A,A ; 4*3=12
353 1.1 tsutsui LD A,A
354 1.1 tsutsui LD A,A
355 1.1 tsutsui .ENDM
356 1.1 tsutsui
357 1.1 tsutsui WAIT13 .MACRO
358 1.1 tsutsui LD A,A ; 4+3*3=13
359 1.1 tsutsui NOP
360 1.1 tsutsui NOP
361 1.1 tsutsui NOP
362 1.1 tsutsui .ENDM
363 1.1 tsutsui
364 1.1 tsutsui WAIT16 .MACRO
365 1.1 tsutsui LD A,A
366 1.1 tsutsui LD A,A
367 1.1 tsutsui LD A,A
368 1.1 tsutsui LD A,A
369 1.1 tsutsui .ENDM
370 1.1 tsutsui
371 1.1 tsutsui WAIT17 .MACRO
372 1.1 tsutsui LD A,A ; 4*2+3*3=17
373 1.1 tsutsui LD A,A
374 1.1 tsutsui NOP
375 1.1 tsutsui NOP
376 1.1 tsutsui NOP
377 1.1 tsutsui .ENDM
378 1.1 tsutsui
379 1.1 tsutsui WAIT19 .MACRO
380 1.1 tsutsui LD A,A ; 4*4+3=19
381 1.1 tsutsui LD A,A
382 1.1 tsutsui LD A,A
383 1.1 tsutsui LD A,A
384 1.1 tsutsui NOP
385 1.1 tsutsui .ENDM
386 1.1 tsutsui
387 1.1 tsutsui ; ######## RESET/RST
388 1.1 tsutsui .ORG 0000H
389 1.1 tsutsui RESET:
390 1.1 tsutsui JP ENTRY
391 1.1 tsutsui
392 1.1 tsutsui .ORG 0038H
393 1.1 tsutsui INT0:
394 1.1 tsutsui JP INTR_INT0
395 1.1 tsutsui
396 1.1 tsutsui .ORG 0066H
397 1.1 tsutsui NMI:
398 1.1 tsutsui RETN
399 1.1 tsutsui
400 1.1 tsutsui .ORG 0080H
401 1.1 tsutsui DEBUG0:: .DB 0
402 1.1 tsutsui DEBUG1:: .DB 0
403 1.1 tsutsui DEBUG2:: .DB 0
404 1.1 tsutsui DEBUG3:: .DB 0
405 1.1 tsutsui DEBUG4:: .DB 0
406 1.1 tsutsui DEBUG5:: .DB 0
407 1.1 tsutsui DEBUG6:: .DB 0
408 1.1 tsutsui DEBUG7:: .DB 0
409 1.1 tsutsui DEBUG8:: .DB 0
410 1.1 tsutsui DEBUG9:: .DB 0
411 1.1 tsutsui DEBUG10:: .DB 0
412 1.1 tsutsui
413 1.1 tsutsui .ORG 00FCH
414 1.1 tsutsui XPLX_MAGIC:: ; MAGIC
415 1.1 tsutsui .DB "XPLX"
416 1.1 tsutsui
417 1.1 tsutsui ; ######## shared variables
418 1.1 tsutsui ; XPBUS
419 1.1 tsutsui .ORG 0100H
420 1.1 tsutsui XPLX_VAR_BASE::
421 1.1 tsutsui XPBUS_READY::
422 1.1 tsutsui .DB 0
423 1.1 tsutsui XPBUS_CMD::
424 1.1 tsutsui .DB 0
425 1.1 tsutsui XPBUS_RESULT::
426 1.1 tsutsui .DB 0
427 1.1 tsutsui XPBUS_RUN::
428 1.1 tsutsui .DB 0
429 1.1 tsutsui
430 1.1 tsutsui XPBUS_STAT_RESET:: ; reset count
431 1.1 tsutsui .DB 0
432 1.1 tsutsui .DB 0,0,0 ; reserved
433 1.1 tsutsui
434 1.1 tsutsui XPBUS_PRT0_TIMER:: ; PRT0 TIMER TLDR (devices dispatch)
435 1.1 tsutsui .DW 256
436 1.1 tsutsui XPBUS_INTR1_DEV:: ; HOSTINTR1 device
437 1.1 tsutsui .DW 0
438 1.1 tsutsui XPBUS_INTR5_DEV:: ; HOSTINTR5 device
439 1.1 tsutsui .DW 0
440 1.1 tsutsui
441 1.1 tsutsui ; TIME
442 1.1 tsutsui .ORG 0110H
443 1.1 tsutsui TIME_READY::
444 1.1 tsutsui .DB 0
445 1.1 tsutsui TIME_CMD::
446 1.1 tsutsui .DB 0
447 1.1 tsutsui TIME_RESULT::
448 1.1 tsutsui .DB 0
449 1.1 tsutsui TIME_RUN::
450 1.1 tsutsui .DB 0
451 1.1 tsutsui TIME_TIMECOUNTER:: ; timecounter (TBD.)
452 1.1 tsutsui .DW 0
453 1.1 tsutsui
454 1.1 tsutsui ; PAM
455 1.1 tsutsui .ORG 0120H
456 1.1 tsutsui PAM_READY::
457 1.1 tsutsui .DB 0
458 1.1 tsutsui PAM_CMD::
459 1.1 tsutsui .DB 0
460 1.1 tsutsui PAM_RESULT::
461 1.1 tsutsui .DB 0
462 1.1 tsutsui PAM_RUN::
463 1.1 tsutsui .DB 0
464 1.1 tsutsui
465 1.1 tsutsui PAM_ENC::
466 1.1 tsutsui .DB 0
467 1.1 tsutsui PAM_REPT::
468 1.1 tsutsui .DB 0
469 1.1 tsutsui PAM_CYCLE_CLK::
470 1.1 tsutsui .DW 0
471 1.1 tsutsui PAM_REPT_CLK::
472 1.1 tsutsui .DB 0
473 1.1 tsutsui PAM_REPT_MAX::
474 1.1 tsutsui .DB 0
475 1.1 tsutsui
476 1.1 tsutsui .DB 0,0,0,0 ; reserved
477 1.1 tsutsui PAM_STAT_PTR::
478 1.1 tsutsui .DW 0
479 1.1 tsutsui
480 1.1 tsutsui ; PCM
481 1.1 tsutsui .ORG 0130H
482 1.1 tsutsui PCM_READY::
483 1.1 tsutsui .DB 0
484 1.1 tsutsui PCM_CMD::
485 1.1 tsutsui .DB 0
486 1.1 tsutsui PCM_RESULT::
487 1.1 tsutsui .DB 0
488 1.1 tsutsui PCM_RUN::
489 1.1 tsutsui .DB 0
490 1.1 tsutsui
491 1.1 tsutsui PCM_ENC::
492 1.1 tsutsui .DB 0
493 1.1 tsutsui .DB 0 ; reserved
494 1.1 tsutsui PCM_PRT1_TIMER:: ; PRT1 TIMER TLDR (PCM)
495 1.1 tsutsui .DW 0
496 1.1 tsutsui
497 1.1 tsutsui .DB 0,0,0,0,0,0 ; reserved
498 1.1 tsutsui PCM_STAT_PTR::
499 1.1 tsutsui .DW 0
500 1.1 tsutsui
501 1.1 tsutsui ; PSG
502 1.1 tsutsui .ORG 0140H
503 1.1 tsutsui PSG_READY::
504 1.1 tsutsui .DB 0
505 1.1 tsutsui PSG_CMD::
506 1.1 tsutsui .DB 0
507 1.1 tsutsui PSG_RESULT::
508 1.1 tsutsui .DB 0
509 1.1 tsutsui PSG_RUN::
510 1.1 tsutsui .DB 0
511 1.1 tsutsui
512 1.1 tsutsui ; SPK
513 1.1 tsutsui .ORG 0150H
514 1.1 tsutsui SPK_READY::
515 1.1 tsutsui .DB 0
516 1.1 tsutsui SPK_CMD::
517 1.1 tsutsui .DB 0
518 1.1 tsutsui SPK_RESULT::
519 1.1 tsutsui .DB 0
520 1.1 tsutsui SPK_RUN::
521 1.1 tsutsui .DB 0
522 1.1 tsutsui
523 1.1 tsutsui SPK_VOL::
524 1.1 tsutsui .DB 0
525 1.1 tsutsui .DB 0 ; reserved
526 1.1 tsutsui SPK_FREQ::
527 1.1 tsutsui .DW 0
528 1.1 tsutsui SPK_TIME::
529 1.1 tsutsui .DW 0
530 1.1 tsutsui SPK_REMAIN::
531 1.1 tsutsui .DW 0
532 1.1 tsutsui
533 1.1 tsutsui ; LPR
534 1.1 tsutsui .ORG 0160H
535 1.1 tsutsui LPR_READY::
536 1.1 tsutsui .DB 0
537 1.1 tsutsui LPR_CMD::
538 1.1 tsutsui .DB 0
539 1.1 tsutsui LPR_RESULT::
540 1.1 tsutsui .DB 0
541 1.1 tsutsui LPR_RUN::
542 1.1 tsutsui .DB 0
543 1.1 tsutsui ; TBD.
544 1.1 tsutsui
545 1.1 tsutsui LPR_CMD_START .EQU 1
546 1.1 tsutsui
547 1.1 tsutsui ; FDC
548 1.1 tsutsui .ORG 0170H
549 1.1 tsutsui FDC_READY::
550 1.1 tsutsui .DB 0
551 1.1 tsutsui FDC_CMD::
552 1.1 tsutsui .DB 0
553 1.1 tsutsui FDC_RESULT::
554 1.1 tsutsui .DB 0
555 1.1 tsutsui FDC_RUN::
556 1.1 tsutsui .DB 0
557 1.1 tsutsui ; TBD.
558 1.1 tsutsui
559 1.1 tsutsui FDC_CMD_START .EQU 1
560 1.1 tsutsui
561 1.1 tsutsui ; SIO0
562 1.1 tsutsui .ORG 0180H
563 1.1 tsutsui SIO0_READY::
564 1.1 tsutsui .DB 0
565 1.1 tsutsui SIO0_CMD::
566 1.1 tsutsui .DB 0
567 1.1 tsutsui SIO0_RESULT::
568 1.1 tsutsui .DB 0
569 1.1 tsutsui SIO0_RUN::
570 1.1 tsutsui .DB 0
571 1.1 tsutsui
572 1.1 tsutsui SIO0_TXCMD::
573 1.1 tsutsui .DB 0
574 1.1 tsutsui SIO0_TXSTAT::
575 1.1 tsutsui .DB 0
576 1.1 tsutsui SIO0_TX::
577 1.1 tsutsui .DB 0
578 1.1 tsutsui .DS 3
579 1.1 tsutsui SIO0_RXCMD::
580 1.1 tsutsui .DB 0
581 1.1 tsutsui SIO0_RXSTAT::
582 1.1 tsutsui .DB 0
583 1.1 tsutsui SIO0_RX::
584 1.1 tsutsui .DB 0
585 1.1 tsutsui
586 1.1 tsutsui ; SIO1
587 1.1 tsutsui .ORG 0190H
588 1.1 tsutsui SIO1_READY::
589 1.1 tsutsui .DB 0
590 1.1 tsutsui SIO1_CMD::
591 1.1 tsutsui .DB 0
592 1.1 tsutsui SIO1_RESULT::
593 1.1 tsutsui .DB 0
594 1.1 tsutsui SIO1_RUN::
595 1.1 tsutsui .DB 0
596 1.1 tsutsui
597 1.1 tsutsui SIO1_TXCMD::
598 1.1 tsutsui .DB 0
599 1.1 tsutsui SIO1_TXSTAT::
600 1.1 tsutsui .DB 0
601 1.1 tsutsui SIO1_TX::
602 1.1 tsutsui .DB 0
603 1.1 tsutsui .DS 3
604 1.1 tsutsui SIO1_RXCMD::
605 1.1 tsutsui .DB 0
606 1.1 tsutsui SIO1_RXSTAT::
607 1.1 tsutsui .DB 0
608 1.1 tsutsui SIO1_RX::
609 1.1 tsutsui .DB 0
610 1.1 tsutsui
611 1.1 tsutsui
612 1.1 tsutsui ; ######## Bootstrap program
613 1.1 tsutsui .ORG 0200H
614 1.1 tsutsui ENTRY:
615 1.1 tsutsui DI
616 1.1 tsutsui LD SP,INITIAL_SP
617 1.1 tsutsui
618 1.1 tsutsui ; inc reset count
619 1.1 tsutsui LD HL, XPBUS_STAT_RESET
620 1.1 tsutsui INC (HL)
621 1.1 tsutsui
622 1.1 tsutsui ; initial devices
623 1.1 tsutsui ; READY=0
624 1.1 tsutsui XOR A
625 1.1 tsutsui LD (XPBUS_READY),A
626 1.1 tsutsui LD (TIME_READY),A
627 1.1 tsutsui LD (PAM_READY),A
628 1.1 tsutsui LD (PCM_READY),A
629 1.1 tsutsui LD (PSG_READY),A
630 1.1 tsutsui LD (SPK_READY),A
631 1.1 tsutsui LD (LPR_READY),A
632 1.1 tsutsui LD (FDC_READY),A
633 1.1 tsutsui LD (SIO0_READY),A
634 1.1 tsutsui LD (SIO1_READY),A
635 1.1 tsutsui
636 1.1 tsutsui LD A,1
637 1.1 tsutsui LD (DEBUG0),A
638 1.1 tsutsui
639 1.1 tsutsui ; init XP internal devices
640 1.1 tsutsui ; internal I/O address = 00H - 3FH
641 1.1 tsutsui LD A,00H ; IOA7[7]=0 IOSTP[5]=0
642 1.1 tsutsui ICR .EQU 3FH
643 1.1 tsutsui OUT0 (ICR),A
644 1.1 tsutsui
645 1.1 tsutsui ; memory wait = 0
646 1.1 tsutsui ; I/O wait = 3
647 1.1 tsutsui ; no DMA
648 1.1 tsutsui LD A,20H ; MWI[76]=0 IWI[54]=2(3wait) DMS[32]=0 DIM[10]=0
649 1.1 tsutsui DCNTL .EQU 32H
650 1.1 tsutsui OUT0 (DCNTL),A
651 1.1 tsutsui ; disable refresh
652 1.1 tsutsui LD A,03H ; REFE[7]=0 REFW[6]=0 CYC[10]=3(80state)
653 1.1 tsutsui RCR .EQU 36H
654 1.1 tsutsui OUT0 (RCR),A
655 1.1 tsutsui
656 1.1 tsutsui LD A,2
657 1.1 tsutsui LD (DEBUG0),A
658 1.1 tsutsui
659 1.1 tsutsui ; prepare memory map
660 1.1 tsutsui ; MMU
661 1.1 tsutsui CBR .EQU 38H
662 1.1 tsutsui BBR .EQU 39H
663 1.1 tsutsui CBAR .EQU 3AH
664 1.1 tsutsui ; Common0: VA=0000H -> PA=00000H SH
665 1.1 tsutsui ; Bank : VA=E000H -> PA=28000H PR
666 1.1 tsutsui ; Common1: VA=F000H -> PA=FF000H IN
667 1.1 tsutsui LD A,0FEH
668 1.1 tsutsui OUT0 (CBAR),A
669 1.1 tsutsui LD A,0F0H
670 1.1 tsutsui OUT0 (CBR),A
671 1.1 tsutsui LD A,1AH
672 1.1 tsutsui OUT0 (BBR),A
673 1.1 tsutsui
674 1.1 tsutsui LD A,3
675 1.1 tsutsui LD (DEBUG0),A
676 1.1 tsutsui
677 1.1 tsutsui ; internal RAM addressing
678 1.1 tsutsui ; for no-wait access
679 1.1 tsutsui ; PA=FxxxxH
680 1.1 tsutsui ; PA=0xxxxH
681 1.1 tsutsui ;
682 1.1 tsutsui ; built-in RAM VA=FE00H PA=FFE00H
683 1.1 tsutsui LD A,0F0H
684 1.1 tsutsui RMCR .EQU 51H
685 1.1 tsutsui OUT0 (RMCR),A
686 1.1 tsutsui ; disable external interrupt
687 1.1 tsutsui ; TODO: if use "Host to XP" interrupt, change here
688 1.1 tsutsui LD A,00H ; TRAP[7]=0 ITE2[2]=0 ITE1[1]=0 ITE0[0]=0
689 1.1 tsutsui ITC .EQU 34H
690 1.1 tsutsui OUT0 (ITC),A
691 1.1 tsutsui ; Interrupt Vector Low = E
692 1.1 tsutsui ; I = FFH
693 1.1 tsutsui ; Interrupt Vector Address = FFE0H
694 1.1 tsutsui LD A,0E0H
695 1.1 tsutsui IL .EQU 33H
696 1.1 tsutsui OUT0 (IL),A
697 1.1 tsutsui LD A,0FFH
698 1.1 tsutsui LD I,A
699 1.1 tsutsui ; interrupt mode 1
700 1.1 tsutsui IM 1
701 1.1 tsutsui
702 1.1 tsutsui LD A,4
703 1.1 tsutsui LD (DEBUG0),A
704 1.1 tsutsui
705 1.1 tsutsui CALL INIT_PSG
706 1.1 tsutsui
707 1.1 tsutsui ; TODO
708 1.1 tsutsui ; INIT FDC
709 1.1 tsutsui ; INIT LPR
710 1.1 tsutsui ; INIT SIO
711 1.1 tsutsui
712 1.1 tsutsui ; INIT PRT0,1
713 1.1 tsutsui ; TIE1[5]=TIE0[4]=0
714 1.1 tsutsui ; TOC1[3]=TOC0[2]=0
715 1.1 tsutsui ; TDE1[1]=TDE0[0]=0
716 1.1 tsutsui LD A,00H
717 1.1 tsutsui OUT0 (TCR),A
718 1.1 tsutsui ; prepare PRT0
719 1.1 tsutsui LD HL,(XPBUS_PRT0_TIMER)
720 1.1 tsutsui OUT0 (RLDR0L),L
721 1.1 tsutsui OUT0 (TMDR0L),L
722 1.1 tsutsui OUT0 (RLDR0H),H
723 1.1 tsutsui OUT0 (TMDR0H),H
724 1.1 tsutsui ; TIE0, TID0 ON
725 1.1 tsutsui ; TIE0[4]=1 TDE0[0]=1
726 1.1 tsutsui LD A,11H
727 1.1 tsutsui OUT0 (TCR),A
728 1.1 tsutsui
729 1.1 tsutsui ; copy to private memory
730 1.1 tsutsui LD HL,PROG_ORG
731 1.1 tsutsui LD DE,PRIVATE_RAM
732 1.1 tsutsui LD BC,PROG_ORG_LEN
733 1.1 tsutsui LDIR
734 1.1 tsutsui ; interrupt vector copy to internal memory
735 1.1 tsutsui LD HL,VECTOR_ORG
736 1.1 tsutsui LD DE,VECTOR
737 1.1 tsutsui LD BC,VECTOR_ORG_LEN
738 1.1 tsutsui LDIR
739 1.1 tsutsui
740 1.1 tsutsui LD A,5
741 1.1 tsutsui LD (DEBUG0),A
742 1.1 tsutsui ; jump to XPBUS
743 1.1 tsutsui JP XPBUS
744 1.1 tsutsui
745 1.1 tsutsui ; initialize PSG registers
746 1.1 tsutsui ; break all regs
747 1.1 tsutsui INIT_PSG:
748 1.1 tsutsui ; init PSG
749 1.1 tsutsui ; PSG R0-R6 All 00H
750 1.1 tsutsui LD A,0
751 1.1 tsutsui LD B,7
752 1.1 tsutsui LD C,PSG_DAT
753 1.1 tsutsui LD D,0
754 1.1 tsutsui PSG_CLEAR_06:
755 1.1 tsutsui OUT (PSG_ADR),A
756 1.1 tsutsui OUT (C),D
757 1.1 tsutsui INC A
758 1.1 tsutsui DJNZ PSG_CLEAR_06
759 1.1 tsutsui ; PSG mixer
760 1.1 tsutsui ; tone = off, noise = off
761 1.1 tsutsui ; IOA, IOB = output
762 1.1 tsutsui LD A,7
763 1.1 tsutsui LD D,0FFH
764 1.1 tsutsui OUT (PSG_ADR),A
765 1.1 tsutsui OUT (C),D
766 1.1 tsutsui ; PSG volume and envelope
767 1.1 tsutsui ; PSG R8-R15 all 0
768 1.1 tsutsui LD A,8
769 1.1 tsutsui LD B,8
770 1.1 tsutsui LD D,0
771 1.1 tsutsui PSG_CLEAR_8F:
772 1.1 tsutsui OUT (PSG_ADR),A
773 1.1 tsutsui OUT (C),D
774 1.1 tsutsui INC A
775 1.1 tsutsui DJNZ PSG_CLEAR_8F
776 1.1 tsutsui ; TODO: PSG I/O Port
777 1.1 tsutsui RET
778 1.1 tsutsui
779 1.1 tsutsui ; ######## buffers
780 1.1 tsutsui .PHASE 1000H
781 1.1 tsutsui PAM_BUF::
782 1.1 tsutsui PCM_BUF::
783 1.1 tsutsui .DEPHASE
784 1.1 tsutsui .PHASE 08000H
785 1.1 tsutsui PAM_BUF_LEN:: .EQU $-PAM_BUF
786 1.1 tsutsui PCM_BUF_LEN:: .EQU $-PCM_BUF
787 1.1 tsutsui PSG_BUF::
788 1.1 tsutsui .DEPHASE
789 1.1 tsutsui .PHASE 09000H
790 1.1 tsutsui PSG_BUF_LEN:: .EQU $-PSG_BUF
791 1.1 tsutsui LPR_BUF::
792 1.1 tsutsui .DEPHASE
793 1.1 tsutsui .PHASE 0A000H
794 1.1 tsutsui LPR_BUF_LEN:: .EQU $-LPR_BUF
795 1.1 tsutsui FDC_BUF::
796 1.1 tsutsui .DEPHASE
797 1.1 tsutsui
798 1.1 tsutsui ; ######## private memory program
799 1.1 tsutsui .PHASE 0E000H
800 1.1 tsutsui FDC_BUF_LEN:: .EQU $-FDC_BUF
801 1.1 tsutsui
802 1.1 tsutsui PROG_ORG: .EQU $$
803 1.1 tsutsui PRIVATE_RAM:
804 1.1 tsutsui
805 1.1 tsutsui XPBUS:
806 1.1 tsutsui LD A,6
807 1.1 tsutsui LD (DEBUG0),A
808 1.1 tsutsui
809 1.1 tsutsui LD SP,PRIVATE_SP
810 1.1 tsutsui
811 1.1 tsutsui ; devices READY=1
812 1.1 tsutsui LD A,1
813 1.1 tsutsui LD (XPBUS_READY),A
814 1.1 tsutsui LD (TIME_READY),A
815 1.1 tsutsui LD (PAM_READY),A
816 1.1 tsutsui LD (PCM_READY),A
817 1.1 tsutsui LD (PSG_READY),A
818 1.1 tsutsui LD (SPK_READY),A
819 1.1 tsutsui LD (LPR_READY),A
820 1.1 tsutsui LD (FDC_READY),A
821 1.1 tsutsui LD (SIO0_READY),A
822 1.1 tsutsui LD (SIO1_READY),A
823 1.1 tsutsui
824 1.1 tsutsui ; wait for PRT0
825 1.1 tsutsui EI
826 1.1 tsutsui XPBUS_LOOP:
827 1.1 tsutsui HALT
828 1.1 tsutsui JR XPBUS_LOOP
829 1.1 tsutsui
830 1.1 tsutsui INTR_PRT0:
831 1.1 tsutsui ; #### Periodic devices
832 1.1 tsutsui ; 1200Hz
833 1.1 tsutsui ; DISPATCH
834 1.1 tsutsui ; o. A
835 1.1 tsutsui ; o. AF, HL
836 1.1 tsutsui ; o. EI
837 1.1 tsutsui ; o. EI
838 1.1 tsutsui ; o. PCM
839 1.1 tsutsui ; o. PAM 0.83 msec
840 1.1 tsutsui
841 1.1 tsutsui PUSH AF
842 1.1 tsutsui PUSH HL
843 1.1 tsutsui
844 1.1 tsutsui LD A,7
845 1.1 tsutsui LD (DEBUG0),A
846 1.1 tsutsui ; reset PRT0 interrupt
847 1.1 tsutsui IN0 F,(TCR)
848 1.1 tsutsui IN0 F,(TMDR0L)
849 1.1 tsutsui ; first EI, for PRT1
850 1.1 tsutsui EI
851 1.1 tsutsui
852 1.1 tsutsui TIMECOUNTER_INCR:
853 1.1 tsutsui ; timecounter
854 1.1 tsutsui LD HL,(TIME_TIMECOUNTER)
855 1.1 tsutsui INC HL
856 1.1 tsutsui LD (TIME_TIMECOUNTER),HL
857 1.1 tsutsui
858 1.1 tsutsui ; #### XPBUS devices dispatcher
859 1.1 tsutsui
860 1.1 tsutsui DEVICES_DISPATCH:
861 1.1 tsutsui LD A,(XPBUS_CMD)
862 1.1 tsutsui OR A
863 1.1 tsutsui CALL NZ,XPBUS_DISPATCH
864 1.1 tsutsui
865 1.1 tsutsui LD A,(PAM_CMD)
866 1.1 tsutsui OR A
867 1.1 tsutsui CALL NZ,PAM_DISPATCH
868 1.1 tsutsui
869 1.1 tsutsui LD A,(PCM_CMD)
870 1.1 tsutsui OR A
871 1.1 tsutsui CALL NZ,PCM_DISPATCH
872 1.1 tsutsui
873 1.1 tsutsui LD A,(PSG_CMD)
874 1.1 tsutsui OR A
875 1.1 tsutsui CALL NZ,PSG_DISPATCH
876 1.1 tsutsui
877 1.1 tsutsui LD A,(SPK_CMD)
878 1.1 tsutsui OR A
879 1.1 tsutsui CALL NZ,SPK_DISPATCH
880 1.1 tsutsui
881 1.1 tsutsui LD A,(LPR_CMD)
882 1.1 tsutsui OR A
883 1.1 tsutsui CALL NZ,LPR_DISPATCH
884 1.1 tsutsui
885 1.1 tsutsui LD A,(FDC_CMD)
886 1.1 tsutsui OR A
887 1.1 tsutsui CALL NZ,FDC_DISPATCH
888 1.1 tsutsui
889 1.1 tsutsui LD A,(SIO0_CMD)
890 1.1 tsutsui OR A
891 1.1 tsutsui CALL NZ,SIO0_DISPATCH
892 1.1 tsutsui
893 1.1 tsutsui LD A,(SIO1_CMD)
894 1.1 tsutsui OR A
895 1.1 tsutsui CALL NZ,SIO1_DISPATCH
896 1.1 tsutsui
897 1.1 tsutsui LD A,8
898 1.1 tsutsui LD (DEBUG0),A
899 1.1 tsutsui
900 1.1 tsutsui POP HL
901 1.1 tsutsui POP AF
902 1.1 tsutsui RETI
903 1.1 tsutsui
904 1.1 tsutsui ; #### XPBUS
905 1.1 tsutsui
906 1.1 tsutsui XPBUS_DISPATCH:
907 1.1 tsutsui ; not implemented
908 1.1 tsutsui XOR A
909 1.1 tsutsui LD (XPBUS_CMD),A
910 1.1 tsutsui LD A,XPLX_R_UNKNOWN_CMD
911 1.1 tsutsui LD (XPBUS_RESULT),A
912 1.1 tsutsui RET
913 1.1 tsutsui
914 1.1 tsutsui ; #### TIME
915 1.1 tsutsui
916 1.1 tsutsui TIME_DISPATCH:
917 1.1 tsutsui ; not implemented
918 1.1 tsutsui XOR A
919 1.1 tsutsui LD (TIME_CMD),A
920 1.1 tsutsui LD A,XPLX_R_UNKNOWN_CMD
921 1.1 tsutsui LD (TIME_RESULT),A
922 1.1 tsutsui RET
923 1.1 tsutsui
924 1.1 tsutsui ; #### PAM
925 1.1 tsutsui
926 1.1 tsutsui ; #### PCM driver core
927 1.1 tsutsui
928 1.1 tsutsui ; PCM
929 1.1 tsutsui ;
930 1.1 tsutsui
931 1.1 tsutsui ; #### PCM play start
932 1.1 tsutsui PCM_DISPATCH:
933 1.1 tsutsui CP PCM_CMD_START
934 1.1 tsutsui JR Z,PCM_START
935 1.1 tsutsui
936 1.1 tsutsui LD A,XPLX_R_UNKNOWN_CMD
937 1.1 tsutsui PCM_ERROR:
938 1.1 tsutsui LD (PCM_RESULT),A
939 1.1 tsutsui RET
940 1.1 tsutsui
941 1.1 tsutsui PCM_START:
942 1.1 tsutsui ; if READY==0 return
943 1.1 tsutsui LD A,(PCM_READY)
944 1.1 tsutsui OR A
945 1.1 tsutsui RET Z
946 1.1 tsutsui ; check ENC
947 1.1 tsutsui LD A,(PCM_ENC)
948 1.1 tsutsui DEC A
949 1.1 tsutsui JR Z,PCM_START_OK ; PCM1 = 1
950 1.1 tsutsui DEC A
951 1.1 tsutsui JR Z,PCM_START_OK ; PCM2 = 2
952 1.1 tsutsui DEC A
953 1.1 tsutsui JR Z,PCM_START_OK ; PCM3 = 3
954 1.1 tsutsui
955 1.1 tsutsui LD A,XPLX_R_ERROR_PARAM
956 1.1 tsutsui JR PCM_ERROR
957 1.1 tsutsui
958 1.1 tsutsui PCM_START_OK:
959 1.1 tsutsui ; A = 0
960 1.1 tsutsui LD (PCM_READY),A
961 1.1 tsutsui LD (PCM_CMD),A
962 1.1 tsutsui
963 1.1 tsutsui
964 1.1 tsutsui ; prepare vector
965 1.1 tsutsui DI
966 1.1 tsutsui ; set PRT1 vector
967 1.1 tsutsui LD HL,PCM_INTR
968 1.1 tsutsui LD (VEC_PRT1),HL
969 1.1 tsutsui ; prepare register
970 1.1 tsutsui EXX
971 1.1 tsutsui
972 1.1 tsutsui CALL INIT_PSG
973 1.1 tsutsui
974 1.1 tsutsui ; make interrupt handler
975 1.1 tsutsui LD A,(PCM_ENC)
976 1.1 tsutsui DEC A
977 1.1 tsutsui JR Z,PCM_SET_PCM1
978 1.1 tsutsui DEC A
979 1.1 tsutsui JR Z,PCM_SET_PCM2
980 1.1 tsutsui PCM_SET_PCM3:
981 1.1 tsutsui LD HL,PCM3
982 1.1 tsutsui JR PCM_SET
983 1.1 tsutsui PCM_SET_PCM2:
984 1.1 tsutsui LD HL,PCM2
985 1.1 tsutsui JR PCM_SET
986 1.1 tsutsui PCM_SET_PCM1:
987 1.1 tsutsui LD HL,PCM1
988 1.1 tsutsui PCM_SET:
989 1.1 tsutsui LD (PCM_INTR_JMP),HL
990 1.1 tsutsui
991 1.1 tsutsui LD HL,PCM_BUF
992 1.1 tsutsui LD BC,0800H + PSG_ADR
993 1.1 tsutsui LD DE,0709H
994 1.1 tsutsui
995 1.1 tsutsui EXX
996 1.1 tsutsui
997 1.1 tsutsui ; TIE1, TDE1 OFF
998 1.1 tsutsui IN0 A,(TCR)
999 1.1 tsutsui AND 0DDH ; TIE1[5]=0 TDE1[1]=0
1000 1.1 tsutsui OUT0 (TCR),A
1001 1.1 tsutsui ; prepare PRT1
1002 1.1 tsutsui LD HL,(PCM_PRT1_TIMER)
1003 1.1 tsutsui OUT0 (RLDR1L),L
1004 1.1 tsutsui OUT0 (RLDR1H),H
1005 1.1 tsutsui OUT0 (TMDR1L),L
1006 1.1 tsutsui OUT0 (TMDR1H),H
1007 1.1 tsutsui ; TIE1, TID1 ON
1008 1.1 tsutsui OR 22H ; TIE1[5]=1 TDE1[5]=1
1009 1.1 tsutsui OUT0 (TCR),A
1010 1.1 tsutsui
1011 1.1 tsutsui EI
1012 1.1 tsutsui
1013 1.1 tsutsui LD A,1
1014 1.1 tsutsui LD (PCM_RUN),A
1015 1.1 tsutsui
1016 1.1 tsutsui RET
1017 1.1 tsutsui
1018 1.1 tsutsui
1019 1.1 tsutsui
1020 1.1 tsutsui ; #### PCM interrupt handler
1021 1.1 tsutsui
1022 1.1 tsutsui PCM_INTR:
1023 1.1 tsutsui ; PRT1 interrupt
1024 1.1 tsutsui EX AF,AF
1025 1.1 tsutsui EXX
1026 1.1 tsutsui ; interrupt acknowledge
1027 1.1 tsutsui ; reset PRT1 Interrupt
1028 1.1 tsutsui IN0 F,(TCR)
1029 1.1 tsutsui IN0 F,(TMDR1L)
1030 1.1 tsutsui
1031 1.1 tsutsui ;
1032 1.1 tsutsui PCM_INTR_JMP: .EQU $+1
1033 1.1 tsutsui JP PCM1
1034 1.1 tsutsui
1035 1.1 tsutsui PCM_INTR_NEXT:
1036 1.1 tsutsui RLCA
1037 1.1 tsutsui JR C,PCM_RELOAD
1038 1.1 tsutsui ; inc ptr after reload check
1039 1.1 tsutsui INC HL
1040 1.1 tsutsui RLCA
1041 1.1 tsutsui JR C,PCM_STAT
1042 1.1 tsutsui RLCA
1043 1.1 tsutsui JR NC,PCM_NORMAL
1044 1.1 tsutsui
1045 1.1 tsutsui ; PCM RESET attention
1046 1.1 tsutsui ; in: HL = EXIT address
1047 1.1 tsutsui PCM_RESET:
1048 1.1 tsutsui ; PRT1 intr stop
1049 1.1 tsutsui IN0 A,(TCR)
1050 1.1 tsutsui ; TIE1,TDE1 OFF
1051 1.1 tsutsui AND 0DDH ; TIE1[5]=0 TDE1[1]=0
1052 1.1 tsutsui OUT0 (TCR),A
1053 1.1 tsutsui ; PLAY STOP
1054 1.1 tsutsui XOR A
1055 1.1 tsutsui LD (PCM_RUN),A
1056 1.1 tsutsui LD A,XPLX_R_OK
1057 1.1 tsutsui LD (PCM_RESULT),A
1058 1.1 tsutsui LD (PCM_READY),A
1059 1.1 tsutsui
1060 1.1 tsutsui JR PCM_EXIT
1061 1.1 tsutsui
1062 1.1 tsutsui ; PCM common code
1063 1.1 tsutsui
1064 1.1 tsutsui PCM_RELOAD:
1065 1.1 tsutsui LD HL,PCM_BUF
1066 1.1 tsutsui PCM_STAT:
1067 1.1 tsutsui #if USE_INTR
1068 1.1 tsutsui OUT (PCM_HOSTINTR),A
1069 1.1 tsutsui #else
1070 1.1 tsutsui LD (PCM_STAT_PTR),HL
1071 1.1 tsutsui #endif
1072 1.1 tsutsui PCM_NORMAL:
1073 1.1 tsutsui PCM_EXIT:
1074 1.1 tsutsui EXX
1075 1.1 tsutsui EX AF,AF
1076 1.1 tsutsui EI
1077 1.1 tsutsui RETI
1078 1.1 tsutsui
1079 1.1 tsutsui ; #### PCM core code
1080 1.1 tsutsui
1081 1.1 tsutsui PCM1:
1082 1.1 tsutsui ; PSG REG=8
1083 1.1 tsutsui OUT (C),B
1084 1.1 tsutsui ; read attention or CH0
1085 1.1 tsutsui LD A,(HL)
1086 1.1 tsutsui OUT (PSG_DAT),A
1087 1.1 tsutsui JP PCM_INTR_NEXT
1088 1.1 tsutsui
1089 1.1 tsutsui PCM2:
1090 1.1 tsutsui LD D,(HL)
1091 1.1 tsutsui INC HL
1092 1.1 tsutsui LD A,(HL)
1093 1.1 tsutsui
1094 1.1 tsutsui OUT (C),B
1095 1.1 tsutsui OUT0 (PSG_DAT),D
1096 1.1 tsutsui OUT (C),E
1097 1.1 tsutsui OUT (PSG_DAT),A
1098 1.1 tsutsui JP PCM_INTR_NEXT
1099 1.1 tsutsui
1100 1.1 tsutsui PCM3:
1101 1.1 tsutsui LD E,(HL)
1102 1.1 tsutsui INC HL
1103 1.1 tsutsui LD D,(HL)
1104 1.1 tsutsui INC HL
1105 1.1 tsutsui LD A,(HL)
1106 1.1 tsutsui
1107 1.1 tsutsui PUSH HL
1108 1.1 tsutsui LD HL,090AH
1109 1.1 tsutsui OUT (C),B
1110 1.1 tsutsui OUT0 (PSG_DAT),E
1111 1.1 tsutsui OUT (C),H
1112 1.1 tsutsui OUT0 (PSG_DAT),D
1113 1.1 tsutsui OUT (C),L
1114 1.1 tsutsui OUT (PSG_DAT),A
1115 1.1 tsutsui POP HL
1116 1.1 tsutsui JP PCM_INTR_NEXT
1117 1.1 tsutsui
1118 1.1 tsutsui ; #### SPK
1119 1.1 tsutsui SPK_DISPATCH:
1120 1.1 tsutsui CP SPK_CMD_START
1121 1.1 tsutsui JR Z,SPK_START
1122 1.1 tsutsui CP SPK_CMD_STOP
1123 1.1 tsutsui JR Z,SPK_STOP
1124 1.1 tsutsui CP SPK_CMD_KEEP
1125 1.1 tsutsui JR Z,SPK_KEEP
1126 1.1 tsutsui
1127 1.1 tsutsui LD A,XPLX_R_UNKNOWN_CMD
1128 1.1 tsutsui LD (SPK_RESULT),A
1129 1.1 tsutsui RET
1130 1.1 tsutsui
1131 1.1 tsutsui SPK_START:
1132 1.1 tsutsui LD A,(SPK_READY)
1133 1.1 tsutsui OR A
1134 1.1 tsutsui RET Z
1135 1.1 tsutsui
1136 1.1 tsutsui XOR A
1137 1.1 tsutsui LD (SPK_READY),A
1138 1.1 tsutsui ; next to CMD_KEEP
1139 1.1 tsutsui LD A,SPK_CMD_KEEP
1140 1.1 tsutsui LD (SPK_CMD),A
1141 1.1 tsutsui LD A,1
1142 1.1 tsutsui LD (SPK_RUN),A
1143 1.1 tsutsui
1144 1.1 tsutsui ; set REMAIN
1145 1.1 tsutsui LD HL,(SPK_TIME)
1146 1.1 tsutsui LD (SPK_REMAIN),HL
1147 1.1 tsutsui
1148 1.1 tsutsui DI
1149 1.1 tsutsui ; PSG CH3 FREQ
1150 1.1 tsutsui LD HL,(SPK_FREQ)
1151 1.1 tsutsui LD A,4
1152 1.1 tsutsui OUT0 (PSG_ADR),A
1153 1.1 tsutsui OUT0 (PSG_DAT),L
1154 1.1 tsutsui LD A,5
1155 1.1 tsutsui OUT0 (PSG_ADR),A
1156 1.1 tsutsui OUT0 (PSG_DAT),H
1157 1.1 tsutsui ; PSG CH3 VOL
1158 1.1 tsutsui LD A,10
1159 1.1 tsutsui OUT (PSG_ADR),A
1160 1.1 tsutsui LD A,(SPK_VOL)
1161 1.1 tsutsui OUT (PSG_DAT),A
1162 1.1 tsutsui ; save PSG R7
1163 1.1 tsutsui LD A,7
1164 1.1 tsutsui OUT0 (PSG_ADR),A
1165 1.1 tsutsui IN A,(PSG_IN)
1166 1.1 tsutsui LD (SPK_PSGR7),A
1167 1.1 tsutsui ; PSG CH3 TONE ON
1168 1.1 tsutsui AND 0FBH
1169 1.1 tsutsui OUT (PSG_DAT),A
1170 1.1 tsutsui
1171 1.1 tsutsui JR SPK_EXIT
1172 1.1 tsutsui
1173 1.1 tsutsui SPK_STOP:
1174 1.1 tsutsui LD A,(SPK_READY)
1175 1.1 tsutsui OR A
1176 1.1 tsutsui RET Z
1177 1.1 tsutsui
1178 1.1 tsutsui SPK_STOP_CORE:
1179 1.1 tsutsui XOR A
1180 1.1 tsutsui LD (SPK_READY),A
1181 1.1 tsutsui LD (SPK_CMD),A
1182 1.1 tsutsui
1183 1.1 tsutsui DI
1184 1.1 tsutsui ; restore PSG R7
1185 1.1 tsutsui LD A,7
1186 1.1 tsutsui OUT (PSG_ADR),A
1187 1.1 tsutsui LD A,(SPK_PSGR7)
1188 1.1 tsutsui OUT (PSG_DAT),A
1189 1.1 tsutsui ; PSG CH3 VOL=0
1190 1.1 tsutsui LD A,10
1191 1.1 tsutsui OUT (PSG_ADR),A
1192 1.1 tsutsui XOR A
1193 1.1 tsutsui OUT (PSG_DAT),A
1194 1.1 tsutsui
1195 1.1 tsutsui LD (SPK_RUN),A
1196 1.1 tsutsui
1197 1.1 tsutsui JR SPK_EXIT
1198 1.1 tsutsui
1199 1.1 tsutsui SPK_KEEP:
1200 1.1 tsutsui ; REMAIN == 0, then stop
1201 1.1 tsutsui LD HL,(SPK_REMAIN)
1202 1.1 tsutsui LD A,H
1203 1.1 tsutsui OR L
1204 1.1 tsutsui JR Z,SPK_STOP_CORE
1205 1.1 tsutsui
1206 1.1 tsutsui DEC HL
1207 1.1 tsutsui LD (SPK_REMAIN),HL
1208 1.1 tsutsui
1209 1.1 tsutsui SPK_EXIT:
1210 1.1 tsutsui EI
1211 1.1 tsutsui LD A,XPLX_R_OK
1212 1.1 tsutsui LD (SPK_RESULT),A
1213 1.1 tsutsui LD (SPK_READY),A
1214 1.1 tsutsui RET
1215 1.1 tsutsui
1216 1.1 tsutsui SPK_PSGR7:
1217 1.1 tsutsui .DB 0
1218 1.1 tsutsui
1219 1.1 tsutsui ; ######## PSG
1220 1.1 tsutsui PSG_DISPATCH:
1221 1.1 tsutsui ; not implemented
1222 1.1 tsutsui XOR A
1223 1.1 tsutsui LD (PSG_CMD),A
1224 1.1 tsutsui LD A,XPLX_R_UNKNOWN_CMD
1225 1.1 tsutsui LD (PSG_RESULT),A
1226 1.1 tsutsui RET
1227 1.1 tsutsui ; ######## LPR
1228 1.1 tsutsui LPR_DISPATCH:
1229 1.1 tsutsui ; not implemented
1230 1.1 tsutsui XOR A
1231 1.1 tsutsui LD (LPR_CMD),A
1232 1.1 tsutsui LD A,XPLX_R_UNKNOWN_CMD
1233 1.1 tsutsui LD (LPR_RESULT),A
1234 1.1 tsutsui RET
1235 1.1 tsutsui ; ######## FDC
1236 1.1 tsutsui FDC_DISPATCH:
1237 1.1 tsutsui ; not implemented
1238 1.1 tsutsui XOR A
1239 1.1 tsutsui LD (FDC_CMD),A
1240 1.1 tsutsui LD A,XPLX_R_UNKNOWN_CMD
1241 1.1 tsutsui LD (FDC_RESULT),A
1242 1.1 tsutsui RET
1243 1.1 tsutsui
1244 1.1 tsutsui ; ######## SIO
1245 1.1 tsutsui SIO0_DISPATCH:
1246 1.1 tsutsui ; not implemented
1247 1.1 tsutsui XOR A
1248 1.1 tsutsui LD (SIO0_CMD),A
1249 1.1 tsutsui LD A,XPLX_R_UNKNOWN_CMD
1250 1.1 tsutsui LD (SIO0_RESULT),A
1251 1.1 tsutsui RET
1252 1.1 tsutsui
1253 1.1 tsutsui SIO1_DISPATCH:
1254 1.1 tsutsui ; not implemented
1255 1.1 tsutsui XOR A
1256 1.1 tsutsui LD (SIO1_CMD),A
1257 1.1 tsutsui LD A,XPLX_R_UNKNOWN_CMD
1258 1.1 tsutsui LD (SIO1_RESULT),A
1259 1.1 tsutsui RET
1260 1.1 tsutsui
1261 1.1 tsutsui INTR_INT0:
1262 1.1 tsutsui INTR_ASCI0:
1263 1.1 tsutsui INTR_ASCI1:
1264 1.1 tsutsui ; TBD
1265 1.1 tsutsui EI
1266 1.1 tsutsui RETI
1267 1.1 tsutsui
1268 1.1 tsutsui ; #### PAM play start
1269 1.1 tsutsui
1270 1.1 tsutsui PAM_DISPATCH:
1271 1.1 tsutsui CP PAM_CMD_START
1272 1.1 tsutsui JR Z,PAM_START
1273 1.1 tsutsui CP PAM_CMD_QUERY
1274 1.1 tsutsui JR Z,PAM_QUERY
1275 1.1 tsutsui
1276 1.1 tsutsui XOR A
1277 1.1 tsutsui LD (PAM_CMD),A
1278 1.1 tsutsui LD A,XPLX_R_UNKNOWN_CMD
1279 1.1 tsutsui LD (PAM_RESULT),A
1280 1.1 tsutsui RET
1281 1.1 tsutsui
1282 1.1 tsutsui ; PAM ENC -> PAM Driver MAP address
1283 1.1 tsutsui ; OUT: HL = MAP address
1284 1.1 tsutsui ; if error, direct return to main routine
1285 1.1 tsutsui PAM_ENC_MAP:
1286 1.1 tsutsui LD A,(PAM_ENC)
1287 1.1 tsutsui OR A
1288 1.1 tsutsui JR Z,PAM_ERROR_ENC
1289 1.1 tsutsui DEC A
1290 1.1 tsutsui
1291 1.1 tsutsui CP PAM_DRIVER_MAP_LEN / 16 ; 16 bytes / entry
1292 1.1 tsutsui JP NC,PAM_ERROR_ENC
1293 1.1 tsutsui
1294 1.1 tsutsui ADD A,A ; A *= 16
1295 1.1 tsutsui ADD A,A
1296 1.1 tsutsui ADD A,A
1297 1.1 tsutsui ADD A,A
1298 1.1 tsutsui
1299 1.1 tsutsui LD HL,PAM_DRIVER_MAP
1300 1.1 tsutsui ADD_HL_A
1301 1.1 tsutsui RET
1302 1.1 tsutsui
1303 1.1 tsutsui PAM_ERROR_ENC:
1304 1.1 tsutsui POP HL ; discard caller PC
1305 1.1 tsutsui PAM_ERROR_PARAM:
1306 1.1 tsutsui LD A,XPLX_R_ERROR_PARAM
1307 1.1 tsutsui LD (PAM_RESULT),A
1308 1.1 tsutsui RET ; return to main
1309 1.1 tsutsui
1310 1.1 tsutsui PAM_QUERY:
1311 1.1 tsutsui CALL PAM_ENC_MAP ; get ENC to MAP
1312 1.1 tsutsui
1313 1.1 tsutsui LD A,(PAM_READY)
1314 1.1 tsutsui OR A
1315 1.1 tsutsui RET Z
1316 1.1 tsutsui
1317 1.1 tsutsui XOR A
1318 1.1 tsutsui LD (PAM_READY),A
1319 1.1 tsutsui LD (PAM_CMD),A
1320 1.1 tsutsui
1321 1.1 tsutsui PUSH BC
1322 1.1 tsutsui PUSH DE
1323 1.1 tsutsui
1324 1.1 tsutsui LD BC,12 ; MAP offset 12 = CYCLE_CLK
1325 1.1 tsutsui ADD HL,BC
1326 1.1 tsutsui
1327 1.1 tsutsui ; CYCLE_CLK, REPT_CLK, REPT_MAX
1328 1.1 tsutsui LD DE,PAM_CYCLE_CLK
1329 1.1 tsutsui LD BC,4
1330 1.1 tsutsui LDIR
1331 1.1 tsutsui
1332 1.1 tsutsui POP DE
1333 1.1 tsutsui POP BC
1334 1.1 tsutsui
1335 1.1 tsutsui LD A,XPLX_R_OK
1336 1.1 tsutsui LD (PAM_RESULT),A
1337 1.1 tsutsui LD (PAM_READY),A
1338 1.1 tsutsui RET
1339 1.1 tsutsui
1340 1.1 tsutsui
1341 1.1 tsutsui PAM_START:
1342 1.1 tsutsui CALL PAM_ENC_MAP ; get ENC to MAP
1343 1.1 tsutsui
1344 1.1 tsutsui LD A,15
1345 1.1 tsutsui ADD_HL_A ; HL points REPT_MAX
1346 1.1 tsutsui
1347 1.1 tsutsui LD A,(PAM_REPT)
1348 1.1 tsutsui CP (HL)
1349 1.1 tsutsui JR Z,PAM_START_OK ; == OK
1350 1.1 tsutsui JR C,PAM_START_OK ; < OK
1351 1.1 tsutsui JR PAM_ERROR_PARAM
1352 1.1 tsutsui
1353 1.1 tsutsui PAM_START_OK:
1354 1.1 tsutsui LD A,(PAM_READY)
1355 1.1 tsutsui OR A
1356 1.1 tsutsui RET Z
1357 1.1 tsutsui
1358 1.1 tsutsui XOR A
1359 1.1 tsutsui LD (PAM_READY),A
1360 1.1 tsutsui LD (PAM_CMD),A
1361 1.1 tsutsui
1362 1.1 tsutsui ; never normal return
1363 1.1 tsutsui ; PAM never EI
1364 1.1 tsutsui DI
1365 1.1 tsutsui CALL INIT_PSG
1366 1.1 tsutsui
1367 1.1 tsutsui CALL PAM_ENC_MAP ; re- get ENC to MAP
1368 1.1 tsutsui
1369 1.1 tsutsui ; copy to internal RAM
1370 1.1 tsutsui LD DE,PAM_DRIVER
1371 1.1 tsutsui
1372 1.1 tsutsui LD SP,HL ; SP = top of Map entry
1373 1.1 tsutsui POP HL ; HEAD
1374 1.1 tsutsui POP BC ; HEAD_LEN
1375 1.1 tsutsui LDIR
1376 1.1 tsutsui
1377 1.1 tsutsui LD A,(PAM_REPT)
1378 1.1 tsutsui INC A ; DEC is not change CY
1379 1.1 tsutsui
1380 1.1 tsutsui
1381 1.1 tsutsui PAM_REPT_LOOP:
1382 1.1 tsutsui POP HL ; REPT
1383 1.1 tsutsui POP BC ; REPT_LEN
1384 1.1 tsutsui
1385 1.1 tsutsui DEC A ; DEC is not change CY
1386 1.1 tsutsui JR Z,PAM_REPT_END
1387 1.1 tsutsui
1388 1.1 tsutsui LDIR
1389 1.1 tsutsui
1390 1.1 tsutsui DEC SP
1391 1.1 tsutsui DEC SP
1392 1.1 tsutsui DEC SP
1393 1.1 tsutsui DEC SP
1394 1.1 tsutsui JR PAM_REPT_LOOP
1395 1.1 tsutsui PAM_REPT_END:
1396 1.1 tsutsui
1397 1.1 tsutsui POP HL ; TAIL
1398 1.1 tsutsui POP BC ; TAIL_LEN
1399 1.1 tsutsui LDIR
1400 1.1 tsutsui
1401 1.1 tsutsui ; buffer pointer
1402 1.1 tsutsui LD HL,PAM_BUF
1403 1.1 tsutsui #if USE_INTR
1404 1.1 tsutsui #else
1405 1.1 tsutsui LD (PAM_STAT_PTR),HL
1406 1.1 tsutsui #endif
1407 1.1 tsutsui ; prefetch
1408 1.1 tsutsui LD SP,HL ; 4
1409 1.1 tsutsui POP DE
1410 1.1 tsutsui
1411 1.1 tsutsui ; I/O WAIT 3 -> 2
1412 1.1 tsutsui ; PSG address / write 300ns
1413 1.1 tsutsui ; 1.8432 clock 1 wait
1414 1.1 tsutsui ; 2 wait out 12 clock
1415 1.1 tsutsui ; POP 9+3=12 clock
1416 1.1 tsutsui ; 2 wait
1417 1.1 tsutsui ; PSG read 400ns 2 wait
1418 1.1 tsutsui ; HOSTINTR I/O out wait
1419 1.1 tsutsui ; HOSTINTR
1420 1.1 tsutsui ;
1421 1.1 tsutsui ;
1422 1.1 tsutsui LD A,10H ; IWI[54]=1(2wait)
1423 1.1 tsutsui OUT0 (DCNTL),A
1424 1.1 tsutsui
1425 1.1 tsutsui LD A,1
1426 1.1 tsutsui LD (PAM_RUN),A
1427 1.1 tsutsui
1428 1.1 tsutsui LD A,8
1429 1.1 tsutsui OUT (PSG_ADR),A
1430 1.1 tsutsui LD C,PSG_DAT
1431 1.1 tsutsui
1432 1.1 tsutsui JP PAM_DRIVER
1433 1.1 tsutsui
1434 1.1 tsutsui PAM_RESET:
1435 1.1 tsutsui ; XPBUS
1436 1.1 tsutsui LD SP,PRIVATE_SP
1437 1.1 tsutsui
1438 1.1 tsutsui ; I/O WAIT 2 -> 3
1439 1.1 tsutsui LD A,20H ; IWI[54]=2(3wait)
1440 1.1 tsutsui OUT0 (DCNTL),A
1441 1.1 tsutsui
1442 1.1 tsutsui CALL INIT_PSG
1443 1.1 tsutsui
1444 1.1 tsutsui XOR A
1445 1.1 tsutsui LD (PAM_RUN),A
1446 1.1 tsutsui
1447 1.1 tsutsui LD A,XPLX_R_OK
1448 1.1 tsutsui LD (PAM_RESULT),A
1449 1.1 tsutsui LD (PAM_READY),A
1450 1.1 tsutsui
1451 1.1 tsutsui JP XPBUS
1452 1.1 tsutsui
1453 1.1 tsutsui PAM_DRIVER_MAP:
1454 1.1 tsutsui ; 16 bytes / entry
1455 1.1 tsutsui DW PAM2A_HEAD_ORG
1456 1.1 tsutsui DW PAM2A_HEAD_LEN
1457 1.1 tsutsui DW PAM2A_REPT_ORG
1458 1.1 tsutsui DW PAM2A_REPT_LEN
1459 1.1 tsutsui DW PAM2A_TAIL_ORG
1460 1.1 tsutsui DW PAM2A_TAIL_LEN
1461 1.1 tsutsui DW 204 ;CYCLE_CLK
1462 1.1 tsutsui DB 36 ;REPT_CLK
1463 1.1 tsutsui DB 37 ;REPT_MAX
1464 1.1 tsutsui
1465 1.1 tsutsui DW PAM2B_HEAD_ORG
1466 1.1 tsutsui DW PAM2B_HEAD_LEN
1467 1.1 tsutsui DW PAM2B_REPT_ORG
1468 1.1 tsutsui DW PAM2B_REPT_LEN
1469 1.1 tsutsui DW PAM2B_TAIL_ORG
1470 1.1 tsutsui DW PAM2B_TAIL_LEN
1471 1.1 tsutsui DW 152 ;CYCLE_CLK
1472 1.1 tsutsui DB 24 ;REPT_CLK
1473 1.1 tsutsui DB 57 ;REPT_MAX
1474 1.1 tsutsui
1475 1.1 tsutsui DW PAM3A_HEAD_ORG
1476 1.1 tsutsui DW PAM3A_HEAD_LEN
1477 1.1 tsutsui DW PAM3A_REPT_ORG
1478 1.1 tsutsui DW PAM3A_REPT_LEN
1479 1.1 tsutsui DW PAM3A_TAIL_ORG
1480 1.1 tsutsui DW PAM3A_TAIL_LEN
1481 1.1 tsutsui DW 298 ;CYCLE_CLK
1482 1.1 tsutsui DB 51 ;REPT_CLK
1483 1.1 tsutsui DB 24 ;REPT_MAX
1484 1.1 tsutsui
1485 1.1 tsutsui DW PAM3B_HEAD_ORG
1486 1.1 tsutsui DW PAM3B_HEAD_LEN
1487 1.1 tsutsui DW PAM3B_REPT_ORG
1488 1.1 tsutsui DW PAM3B_REPT_LEN
1489 1.1 tsutsui DW PAM3B_TAIL_ORG
1490 1.1 tsutsui DW PAM3B_TAIL_LEN
1491 1.1 tsutsui DW 136 ;CYCLE_CLK
1492 1.1 tsutsui DB 36 ;REPT_CLK
1493 1.1 tsutsui DB 38 ;REPT_MAX
1494 1.1 tsutsui
1495 1.1 tsutsui
1496 1.1 tsutsui
1497 1.1 tsutsui PAM_DRIVER_MAP_LEN: .EQU $-PAM_DRIVER_MAP
1498 1.1 tsutsui
1499 1.1 tsutsui .DEPHASE
1500 1.1 tsutsui
1501 1.1 tsutsui
1502 1.1 tsutsui
1503 1.1 tsutsui ; ######## PAM drivers
1504 1.1 tsutsui .PHASE 0FE00H
1505 1.1 tsutsui ; all PAM drivers have same address=0FE00H
1506 1.1 tsutsui PAM_DRIVER:
1507 1.1 tsutsui .DEPHASE
1508 1.1 tsutsui
1509 1.1 tsutsui ; #### PAM2A
1510 1.1 tsutsui
1511 1.1 tsutsui .PHASE 0FE00H
1512 1.1 tsutsui PAM2A_HEAD_ORG: .EQU $$
1513 1.1 tsutsui PAM2A_HEAD:
1514 1.1 tsutsui PAM2A:
1515 1.1 tsutsui ; PAM2A
1516 1.1 tsutsui ; 12+0:12+12 = 1:2 PAM
1517 1.1 tsutsui ; PAM 36clk 170.667kHz
1518 1.1 tsutsui ; output PAM wave = normal 5 + antinoise 1
1519 1.1 tsutsui
1520 1.1 tsutsui ; 1 PAM cycle = 204 clk
1521 1.1 tsutsui
1522 1.1 tsutsui ; 6.144E6 / (204 + 36*n)
1523 1.1 tsutsui
1524 1.1 tsutsui ; sampling freqs:
1525 1.1 tsutsui ; 0: 30118
1526 1.1 tsutsui ; 37: 4000
1527 1.1 tsutsui
1528 1.1 tsutsui ; no STAT for first time
1529 1.1 tsutsui JP PAM2A_LOOP
1530 1.1 tsutsui
1531 1.1 tsutsui PAM2A_RELOAD:
1532 1.1 tsutsui OUT (C),E
1533 1.1 tsutsui OUT (C),D
1534 1.1 tsutsui LD SP,PAM_BUF ;9
1535 1.1 tsutsui WAIT3
1536 1.1 tsutsui
1537 1.1 tsutsui PAM2A_STAT:
1538 1.1 tsutsui #if USE_INTR
1539 1.1 tsutsui OUT (C),E
1540 1.1 tsutsui OUT (C),D
1541 1.1 tsutsui OUT (PAM_HOSTINTR),A ;10+2
1542 1.1 tsutsui #else
1543 1.1 tsutsui ; STAT_PTR
1544 1.1 tsutsui OUT (C),E
1545 1.1 tsutsui OUT (C),D
1546 1.1 tsutsui LD (PAM_STAT_PTR),SP ;19+3
1547 1.1 tsutsui #endif
1548 1.1 tsutsui
1549 1.1 tsutsui PAM2A_NORMAL:
1550 1.1 tsutsui OUT (C),E
1551 1.1 tsutsui OUT (C),D
1552 1.1 tsutsui ; prefetch
1553 1.1 tsutsui POP DE ;9+3
1554 1.1 tsutsui
1555 1.1 tsutsui OUT (C),L
1556 1.1 tsutsui OUT (C),H
1557 1.1 tsutsui ;
1558 1.1 tsutsui ; wait 12 PAM
1559 1.1 tsutsui ;
1560 1.1 tsutsui PAM2A_LOOP:
1561 1.1 tsutsui ; prefetched DE
1562 1.1 tsutsui OUT (C),E
1563 1.1 tsutsui OUT (C),D
1564 1.1 tsutsui ; HL = DE for save current sample
1565 1.1 tsutsui LD L,E ;4
1566 1.1 tsutsui LD H,D ;4
1567 1.1 tsutsui ; A = attention
1568 1.1 tsutsui LD A,E ;4
1569 1.1 tsutsui
1570 1.1 tsutsui PAM2A_HEAD_LEN: .EQU $-PAM2A_HEAD
1571 1.1 tsutsui
1572 1.1 tsutsui PAM2A_REPT_ORG: .EQU $$
1573 1.1 tsutsui PAM2A_REPT:
1574 1.1 tsutsui OUT (C),E
1575 1.1 tsutsui OUT (C),D
1576 1.1 tsutsui WAIT12
1577 1.1 tsutsui PAM2A_REPT_LEN: .EQU $-PAM2A_REPT
1578 1.1 tsutsui
1579 1.1 tsutsui PAM2A_TAIL_ORG: .EQU $$
1580 1.1 tsutsui PAM2A_TAIL:
1581 1.1 tsutsui ;
1582 1.1 tsutsui ; ""
1583 1.1 tsutsui ; ""
1584 1.1 tsutsui OUT (C),E
1585 1.1 tsutsui OUT (C),D
1586 1.1 tsutsui RLCA
1587 1.1 tsutsui ; attention bit
1588 1.1 tsutsui ; bit7=1, reload
1589 1.1 tsutsui ; must be JP
1590 1.1 tsutsui JP C,PAM2A_RELOAD ; jump=9 no=6
1591 1.1 tsutsui
1592 1.1 tsutsui WAIT3
1593 1.1 tsutsui OUT (C),E
1594 1.1 tsutsui OUT (C),D
1595 1.1 tsutsui RLCA ; 3
1596 1.1 tsutsui ; bit6=1, stat
1597 1.1 tsutsui ; must be JP
1598 1.1 tsutsui JP C,PAM2A_STAT ; jump=9 no=6
1599 1.1 tsutsui
1600 1.1 tsutsui WAIT3
1601 1.1 tsutsui OUT (C),E
1602 1.1 tsutsui OUT (C),D
1603 1.1 tsutsui RLCA ; 3
1604 1.1 tsutsui ; bit5=0, normal
1605 1.1 tsutsui ; must be JP
1606 1.1 tsutsui JP NC,PAM2A_NORMAL ; jump=9 no=6
1607 1.1 tsutsui ; attention=001, reset
1608 1.1 tsutsui JP PAM_RESET
1609 1.1 tsutsui PAM2A_TAIL_LEN: .EQU $-PAM2A_TAIL
1610 1.1 tsutsui
1611 1.1 tsutsui ; cycle
1612 1.1 tsutsui ; 5 * (12*3) + 12*2 = 204
1613 1.1 tsutsui
1614 1.1 tsutsui .DEPHASE
1615 1.1 tsutsui
1616 1.1 tsutsui ; #### PAM2B
1617 1.1 tsutsui
1618 1.1 tsutsui .PHASE 0FE00H
1619 1.1 tsutsui ; all PAM drivers have same address=0FE00H
1620 1.1 tsutsui PAM2B_HEAD_ORG: .EQU $$
1621 1.1 tsutsui PAM2B_HEAD:
1622 1.1 tsutsui PAM2B:
1623 1.1 tsutsui ; PAM2B
1624 1.1 tsutsui ; averaged 1:1 PAM
1625 1.1 tsutsui ; wait (4,7), (3,9), (9,12), (12,0)
1626 1.1 tsutsui ; phase wait 28:28
1627 1.1 tsutsui ; clk 35, 36, 45, 36
1628 1.1 tsutsui ; PAM 176, 171, 137, 171 kHz
1629 1.1 tsutsui ; output PAM wave = 4
1630 1.1 tsutsui
1631 1.1 tsutsui ; 1 PAM cycle = 152 clk
1632 1.1 tsutsui
1633 1.1 tsutsui ; 6.144E6 / (152 + 24*n)
1634 1.1 tsutsui
1635 1.1 tsutsui ; sampling freqs:
1636 1.1 tsutsui ; 0: 40421
1637 1.1 tsutsui ; 57: 4042
1638 1.1 tsutsui
1639 1.1 tsutsui ; no STAT for first time
1640 1.1 tsutsui JP PAM2B_LOOP
1641 1.1 tsutsui
1642 1.1 tsutsui PAM2B_RELOAD:
1643 1.1 tsutsui OUT (C),E
1644 1.1 tsutsui LD SP,PAM_BUF ;9
1645 1.1 tsutsui
1646 1.1 tsutsui PAM2B_STAT:
1647 1.1 tsutsui #if USE_INTR
1648 1.1 tsutsui OUT (C),D
1649 1.1 tsutsui OUT (PAM_HOSTINTR),A ;10+2
1650 1.1 tsutsui #else
1651 1.1 tsutsui ; STAT_PTR
1652 1.1 tsutsui OUT (C),D
1653 1.1 tsutsui LD (PAM_STAT_PTR),SP ;19+3
1654 1.1 tsutsui #endif
1655 1.1 tsutsui
1656 1.1 tsutsui PAM2B_NORMAL:
1657 1.1 tsutsui OUT (C),E
1658 1.1 tsutsui ; prefetch
1659 1.1 tsutsui POP DE ;9+3
1660 1.1 tsutsui OUT (C),B
1661 1.1 tsutsui PAM2B_LOOP:
1662 1.1 tsutsui ; prefetched DE
1663 1.1 tsutsui OUT (C),E
1664 1.1 tsutsui ; A = attention
1665 1.1 tsutsui LD A,E ;4
1666 1.1 tsutsui OUT (C),D
1667 1.1 tsutsui ; B = save D
1668 1.1 tsutsui LD B,D ;4
1669 1.1 tsutsui WAIT3
1670 1.1 tsutsui
1671 1.1 tsutsui PAM2B_HEAD_LEN: .EQU $-PAM2B_HEAD
1672 1.1 tsutsui
1673 1.1 tsutsui PAM2B_REPT_ORG: .EQU $$
1674 1.1 tsutsui PAM2B_REPT:
1675 1.1 tsutsui OUT (C),E
1676 1.1 tsutsui OUT (C),D
1677 1.1 tsutsui PAM2B_REPT_LEN: .EQU $-PAM2B_REPT
1678 1.1 tsutsui
1679 1.1 tsutsui PAM2B_TAIL_ORG: .EQU $$
1680 1.1 tsutsui PAM2B_TAIL:
1681 1.1 tsutsui ;
1682 1.1 tsutsui ; ""
1683 1.1 tsutsui ; ""
1684 1.1 tsutsui OUT (C),E
1685 1.1 tsutsui RLCA ;3
1686 1.1 tsutsui OUT (C),D
1687 1.1 tsutsui ; attention bit
1688 1.1 tsutsui ; bit7=1, reload
1689 1.1 tsutsui ; must be JP
1690 1.1 tsutsui JP C,PAM2B_RELOAD ; jump=9 no=6
1691 1.1 tsutsui
1692 1.1 tsutsui RLCA ; 3
1693 1.1 tsutsui OUT (C),E
1694 1.1 tsutsui ; bit6=1, stat
1695 1.1 tsutsui ; must be JP
1696 1.1 tsutsui JP C,PAM2B_STAT ; jump=9 no=6
1697 1.1 tsutsui
1698 1.1 tsutsui RLCA ; 3
1699 1.1 tsutsui OUT (C),D
1700 1.1 tsutsui WAIT3
1701 1.1 tsutsui ; bit5=0, normal
1702 1.1 tsutsui ; must be JP
1703 1.1 tsutsui JP NC,PAM2B_NORMAL ; jump=9 no=6
1704 1.1 tsutsui ; attention=001, reset
1705 1.1 tsutsui JP PAM_RESET
1706 1.1 tsutsui PAM2B_TAIL_LEN: .EQU $-PAM2B_TAIL
1707 1.1 tsutsui
1708 1.1 tsutsui ; cycle
1709 1.1 tsutsui ; 4 * 12*2 + (4+7 + 3+9 + 9+12 + 12+0) = 152
1710 1.1 tsutsui
1711 1.1 tsutsui .DEPHASE
1712 1.1 tsutsui
1713 1.1 tsutsui ; #### PAM3A
1714 1.1 tsutsui
1715 1.1 tsutsui .PHASE 0FE00H
1716 1.1 tsutsui PAM3A_HEAD_ORG: .EQU $$
1717 1.1 tsutsui PAM3A_HEAD:
1718 1.1 tsutsui PAM3A:
1719 1.1 tsutsui ; PAM3A
1720 1.1 tsutsui ; 12+0:12+3:12+12 = 4:5:8 PAM
1721 1.1 tsutsui ; PAM 51clk 120.471kHz
1722 1.1 tsutsui ; output PAM wave = normal 5 + antinoise 1
1723 1.1 tsutsui
1724 1.1 tsutsui ; 1 PAM cycle = 298 clk
1725 1.1 tsutsui
1726 1.1 tsutsui ; 6.144E6 / (298 + 51*n)
1727 1.1 tsutsui
1728 1.1 tsutsui ; sampling freqs:
1729 1.1 tsutsui ; 0: 20617
1730 1.1 tsutsui ; 24: 4037
1731 1.1 tsutsui
1732 1.1 tsutsui ; prefetch
1733 1.1 tsutsui POP AF
1734 1.1 tsutsui LD B,A
1735 1.1 tsutsui ; no STAT for first time
1736 1.1 tsutsui JP PAM3A_LOOP
1737 1.1 tsutsui
1738 1.1 tsutsui PAM3A_RELOAD:
1739 1.1 tsutsui OUT (C),L
1740 1.1 tsutsui OUT (C),H
1741 1.1 tsutsui WAIT3
1742 1.1 tsutsui OUT (C),B
1743 1.1 tsutsui LD SP,PAM_BUF ;9
1744 1.1 tsutsui WAIT3
1745 1.1 tsutsui
1746 1.1 tsutsui PAM3A_STAT:
1747 1.1 tsutsui #if USE_INTR
1748 1.1 tsutsui OUT (C),L
1749 1.1 tsutsui OUT (C),H
1750 1.1 tsutsui WAIT3
1751 1.1 tsutsui OUT (C),B
1752 1.1 tsutsui OUT (PAM_HOSTINTR),A ;10+2
1753 1.1 tsutsui #else
1754 1.1 tsutsui ; STAT_PTR
1755 1.1 tsutsui OUT (C),L
1756 1.1 tsutsui OUT (C),H
1757 1.1 tsutsui WAIT3
1758 1.1 tsutsui OUT (C),B
1759 1.1 tsutsui LD (PAM_STAT_PTR),SP ;19+3
1760 1.1 tsutsui #endif
1761 1.1 tsutsui
1762 1.1 tsutsui PAM3A_NORMAL:
1763 1.1 tsutsui OUT (C),L
1764 1.1 tsutsui OUT (C),H
1765 1.1 tsutsui WAIT3
1766 1.1 tsutsui OUT (C),B
1767 1.1 tsutsui ; prefetch
1768 1.1 tsutsui POP DE ;9+3
1769 1.1 tsutsui
1770 1.1 tsutsui OUT (C),L
1771 1.1 tsutsui OUT (C),H
1772 1.1 tsutsui WAIT3
1773 1.1 tsutsui OUT (C),B
1774 1.1 tsutsui ; prefetch
1775 1.1 tsutsui POP AF ;9+3
1776 1.1 tsutsui
1777 1.1 tsutsui OUT (C),L
1778 1.1 tsutsui OUT (C),H
1779 1.1 tsutsui WAIT3
1780 1.1 tsutsui OUT (C),B
1781 1.1 tsutsui ;
1782 1.1 tsutsui ; wait 12 PAM
1783 1.1 tsutsui ; 4clk
1784 1.1 tsutsui LD B,A ;4
1785 1.1 tsutsui PAM3A_LOOP:
1786 1.1 tsutsui ; prefetched DE, A=B
1787 1.1 tsutsui
1788 1.1 tsutsui PAM3A_HEAD_LEN: .EQU $-PAM3A_HEAD
1789 1.1 tsutsui
1790 1.1 tsutsui PAM3A_REPT_ORG: .EQU $$
1791 1.1 tsutsui PAM3A_REPT:
1792 1.1 tsutsui OUT (C),E
1793 1.1 tsutsui OUT (C),D
1794 1.1 tsutsui WAIT3
1795 1.1 tsutsui OUT (C),B
1796 1.1 tsutsui WAIT12
1797 1.1 tsutsui PAM3A_REPT_LEN: .EQU $-PAM3A_REPT
1798 1.1 tsutsui
1799 1.1 tsutsui PAM3A_TAIL_ORG: .EQU $$
1800 1.1 tsutsui PAM3A_TAIL:
1801 1.1 tsutsui ;
1802 1.1 tsutsui ; ""
1803 1.1 tsutsui ; ""
1804 1.1 tsutsui OUT (C),E
1805 1.1 tsutsui OUT (C),D
1806 1.1 tsutsui EX DE,HL ;3
1807 1.1 tsutsui OUT (C),B
1808 1.1 tsutsui RLCA
1809 1.1 tsutsui ; attention bit
1810 1.1 tsutsui ; bit7=1, reload
1811 1.1 tsutsui ; must be JP
1812 1.1 tsutsui JP C,PAM3A_RELOAD ; jump=9 no=6
1813 1.1 tsutsui
1814 1.1 tsutsui WAIT3
1815 1.1 tsutsui OUT (C),L
1816 1.1 tsutsui OUT (C),H
1817 1.1 tsutsui WAIT3
1818 1.1 tsutsui OUT (C),B
1819 1.1 tsutsui RLCA ; 3
1820 1.1 tsutsui ; bit6=1, stat
1821 1.1 tsutsui ; must be JP
1822 1.1 tsutsui JP C,PAM3A_STAT ; jump=9 no=6
1823 1.1 tsutsui
1824 1.1 tsutsui WAIT3
1825 1.1 tsutsui OUT (C),L
1826 1.1 tsutsui OUT (C),H
1827 1.1 tsutsui WAIT3
1828 1.1 tsutsui OUT (C),B
1829 1.1 tsutsui RLCA ; 3
1830 1.1 tsutsui ; bit5=0, normal
1831 1.1 tsutsui ; must be JP
1832 1.1 tsutsui JP NC,PAM3A_NORMAL ; jump=9 no=6
1833 1.1 tsutsui ; attention=001, reset
1834 1.1 tsutsui JP PAM_RESET
1835 1.1 tsutsui PAM3A_TAIL_LEN: .EQU $-PAM3A_TAIL
1836 1.1 tsutsui
1837 1.1 tsutsui ; cycle
1838 1.1 tsutsui ; 5 * (12*3+3+12) + (12*3+3+4) = 298
1839 1.1 tsutsui
1840 1.1 tsutsui .DEPHASE
1841 1.1 tsutsui
1842 1.1 tsutsui ; #### PAM3B
1843 1.1 tsutsui
1844 1.1 tsutsui .PHASE 0FE00H
1845 1.1 tsutsui PAM3B_HEAD_ORG: .EQU $$
1846 1.1 tsutsui PAM3B_HEAD:
1847 1.1 tsutsui PAM3B:
1848 1.1 tsutsui ; PAM3B
1849 1.1 tsutsui ; approx 1:1:1
1850 1.1 tsutsui ; wait (9,9,12), (12,12,10)
1851 1.1 tsutsui ; phase wait 21:21:22
1852 1.1 tsutsui ; clk 66, 70
1853 1.1 tsutsui ; PAM 93, 88 kHz
1854 1.1 tsutsui ; output PAM wave = 2
1855 1.1 tsutsui
1856 1.1 tsutsui ; 1 PAM cycle = 136 clk
1857 1.1 tsutsui
1858 1.1 tsutsui ; 6.144E6 / (136 + 36*n)
1859 1.1 tsutsui
1860 1.1 tsutsui ; sampling freqs:
1861 1.1 tsutsui ; 0: 45176
1862 1.1 tsutsui ; 38: 4085
1863 1.1 tsutsui
1864 1.1 tsutsui ; prefetch
1865 1.1 tsutsui POP AF
1866 1.1 tsutsui LD B,A
1867 1.1 tsutsui RLCA
1868 1.1 tsutsui ; no STAT for first time
1869 1.1 tsutsui JP PAM3B_LOOP
1870 1.1 tsutsui
1871 1.1 tsutsui PAM3B_RELOAD:
1872 1.1 tsutsui OUT (C),D
1873 1.1 tsutsui LD SP,PAM_BUF ;9
1874 1.1 tsutsui
1875 1.1 tsutsui PAM3B_STAT:
1876 1.1 tsutsui #if USE_INTR
1877 1.1 tsutsui OUT (C),B
1878 1.1 tsutsui OUT (PAM_HOSTINTR),A ;10+2
1879 1.1 tsutsui #else
1880 1.1 tsutsui ; STAT_PTR
1881 1.1 tsutsui OUT (C),B
1882 1.1 tsutsui LD (PAM_STAT_PTR),SP ;19+3
1883 1.1 tsutsui #endif
1884 1.1 tsutsui
1885 1.1 tsutsui PAM3B_NORMAL:
1886 1.1 tsutsui OUT (C),E
1887 1.1 tsutsui ; prefetch
1888 1.1 tsutsui POP HL ;9+3
1889 1.1 tsutsui
1890 1.1 tsutsui OUT (C),D
1891 1.1 tsutsui ; prefetch
1892 1.1 tsutsui POP AF ;9+3
1893 1.1 tsutsui
1894 1.1 tsutsui OUT (C),B
1895 1.1 tsutsui EX DE,HL ;3
1896 1.1 tsutsui LD B,A ;4
1897 1.1 tsutsui RLCA ;3
1898 1.1 tsutsui PAM3B_LOOP:
1899 1.1 tsutsui ; prefetched DE,B A=RLCA-ed flag
1900 1.1 tsutsui
1901 1.1 tsutsui PAM3B_HEAD_LEN: .EQU $-PAM3B_HEAD
1902 1.1 tsutsui
1903 1.1 tsutsui PAM3B_REPT_ORG: .EQU $$
1904 1.1 tsutsui PAM3B_REPT:
1905 1.1 tsutsui OUT (C),E
1906 1.1 tsutsui OUT (C),D
1907 1.1 tsutsui OUT (C),B
1908 1.1 tsutsui PAM3B_REPT_LEN: .EQU $-PAM3B_REPT
1909 1.1 tsutsui
1910 1.1 tsutsui PAM3B_TAIL_ORG: .EQU $$
1911 1.1 tsutsui PAM3B_TAIL:
1912 1.1 tsutsui ;
1913 1.1 tsutsui ; ""
1914 1.1 tsutsui ; ""
1915 1.1 tsutsui OUT (C),E
1916 1.1 tsutsui ; attention bit
1917 1.1 tsutsui ; bit7=1, reload
1918 1.1 tsutsui ; must be JP
1919 1.1 tsutsui JP C,PAM3B_RELOAD ; jump=9 no=6
1920 1.1 tsutsui
1921 1.1 tsutsui RLCA ; 3
1922 1.1 tsutsui OUT (C),D
1923 1.1 tsutsui ; bit6=1, stat
1924 1.1 tsutsui ; must be JP
1925 1.1 tsutsui JP C,PAM3B_STAT ; jump=9 no=6
1926 1.1 tsutsui
1927 1.1 tsutsui RLCA ; 3
1928 1.1 tsutsui OUT (C),B
1929 1.1 tsutsui WAIT3
1930 1.1 tsutsui ; bit5=0, normal
1931 1.1 tsutsui ; must be JP
1932 1.1 tsutsui JP NC,PAM3B_NORMAL ; jump=9 no=6
1933 1.1 tsutsui ; attention=001, reset
1934 1.1 tsutsui JP PAM_RESET
1935 1.1 tsutsui PAM3B_TAIL_LEN: .EQU $-PAM3B_TAIL
1936 1.1 tsutsui
1937 1.1 tsutsui
1938 1.1 tsutsui .DEPHASE
1939 1.1 tsutsui
1940 1.1 tsutsui ; #### PAM1P
1941 1.1 tsutsui
1942 1.1 tsutsui .PHASE 0FE00H
1943 1.1 tsutsui PAM1P_HEAD_ORG: .EQU $$
1944 1.1 tsutsui PAM1P_HEAD:
1945 1.1 tsutsui PAM1P:
1946 1.1 tsutsui ; PAM1P
1947 1.1 tsutsui ; PAM1P PCM
1948 1.1 tsutsui ; PAM
1949 1.1 tsutsui ; Polyphase PCM
1950 1.1 tsutsui
1951 1.1 tsutsui ; 1 cycle = 87 clk
1952 1.1 tsutsui ; 6.144E6 / (87 + 3*n)
1953 1.1 tsutsui
1954 1.1 tsutsui ; sampling freqs:
1955 1.1 tsutsui ; 0: 70621
1956 1.1 tsutsui ; 255: 7420
1957 1.1 tsutsui
1958 1.1 tsutsui LD HL,PAM_BUF ;9
1959 1.1 tsutsui
1960 1.1 tsutsui LD C,PSG_ADR
1961 1.1 tsutsui ; initial CH0
1962 1.1 tsutsui LD A,8
1963 1.1 tsutsui OUT (PSG_ADR),A
1964 1.1 tsutsui ; rotated next CH
1965 1.1 tsutsui LD B,9
1966 1.1 tsutsui LD DE,080AH
1967 1.1 tsutsui
1968 1.1 tsutsui ; no STAT for first time
1969 1.1 tsutsui JP PAM1P_LOOP
1970 1.1 tsutsui
1971 1.1 tsutsui PAM1P_RELOAD:
1972 1.1 tsutsui LD HL,PAM_BUF ;9
1973 1.1 tsutsui
1974 1.1 tsutsui PAM1P_STAT:
1975 1.1 tsutsui #if USE_INTR
1976 1.1 tsutsui OUT (PAM_HOSTINTR),A ;10+2
1977 1.1 tsutsui #else
1978 1.1 tsutsui ; STAT_PTR
1979 1.1 tsutsui LD (PAM_STAT_PTR),HL ;16+3
1980 1.1 tsutsui #endif
1981 1.1 tsutsui
1982 1.1 tsutsui PAM1P_NORMAL:
1983 1.1 tsutsui ; rotate B,E,D
1984 1.1 tsutsui LD A,B ;4
1985 1.1 tsutsui LD B,E ;4
1986 1.1 tsutsui LD E,D ;4
1987 1.1 tsutsui LD D,A ;4
1988 1.1 tsutsui OUT (C),B ;10+2
1989 1.1 tsutsui
1990 1.1 tsutsui PAM1P_LOOP:
1991 1.1 tsutsui
1992 1.1 tsutsui LD A,(HL) ;6+3
1993 1.1 tsutsui INC HL ;4
1994 1.1 tsutsui
1995 1.1 tsutsui OUT (PSG_DAT),A ;10+2
1996 1.1 tsutsui
1997 1.1 tsutsui PAM1P_HEAD_LEN: .EQU $-PAM1P_HEAD
1998 1.1 tsutsui
1999 1.1 tsutsui PAM1P_REPT_ORG: .EQU $$
2000 1.1 tsutsui PAM1P_REPT:
2001 1.1 tsutsui WAIT3
2002 1.1 tsutsui PAM1P_REPT_LEN: .EQU $-PAM1P_REPT
2003 1.1 tsutsui
2004 1.1 tsutsui PAM1P_TAIL_ORG: .EQU $$
2005 1.1 tsutsui PAM1P_TAIL:
2006 1.1 tsutsui ;
2007 1.1 tsutsui ; ""
2008 1.1 tsutsui ; ""
2009 1.1 tsutsui RLCA ;3
2010 1.1 tsutsui ; attention bit
2011 1.1 tsutsui ; bit7=1, reload
2012 1.1 tsutsui ; must be JP
2013 1.1 tsutsui JP C,PAM1P_RELOAD ; jump=9 no=6
2014 1.1 tsutsui
2015 1.1 tsutsui RLCA ; 3
2016 1.1 tsutsui ; bit6=1, stat
2017 1.1 tsutsui ; must be JP
2018 1.1 tsutsui JP C,PAM1P_STAT ; jump=9 no=6
2019 1.1 tsutsui
2020 1.1 tsutsui RLCA ; 3
2021 1.1 tsutsui WAIT3
2022 1.1 tsutsui ; bit5=0, normal
2023 1.1 tsutsui ; must be JP
2024 1.1 tsutsui JP NC,PAM1P_NORMAL ; jump=9 no=6
2025 1.1 tsutsui ; attention=001, reset
2026 1.1 tsutsui JP PAM_RESET
2027 1.1 tsutsui PAM1P_TAIL_LEN: .EQU $-PAM1P_TAIL
2028 1.1 tsutsui
2029 1.1 tsutsui ; cycle
2030 1.1 tsutsui ; 63 + 12 + 12 = 87
2031 1.1 tsutsui
2032 1.1 tsutsui .DEPHASE
2033 1.1 tsutsui
2034 1.1 tsutsui PROG_ORG_LEN: .EQU $$-PROG_ORG
2035 1.1 tsutsui
2036 1.1 tsutsui ; #### interrupt vector
2037 1.1 tsutsui .PHASE 0FFE0H
2038 1.1 tsutsui VECTOR_ORG: .EQU $$
2039 1.1 tsutsui VECTOR:
2040 1.1 tsutsui
2041 1.1 tsutsui VEC_INT1:
2042 1.1 tsutsui DW INTR_IGN
2043 1.1 tsutsui VEC_INT2:
2044 1.1 tsutsui DW INTR_IGN
2045 1.1 tsutsui VEC_PRT0:
2046 1.1 tsutsui DW INTR_PRT0
2047 1.1 tsutsui VEC_PRT1:
2048 1.1 tsutsui DW INTR_IGN
2049 1.1 tsutsui VEC_DMAC0:
2050 1.1 tsutsui DW INTR_IGN
2051 1.1 tsutsui VEC_DMAC1:
2052 1.1 tsutsui DW INTR_IGN
2053 1.1 tsutsui VEC_SIO:
2054 1.1 tsutsui DW INTR_IGN
2055 1.1 tsutsui VEC_ASCI0:
2056 1.1 tsutsui DW INTR_ASCI0
2057 1.1 tsutsui VEC_ASCI1:
2058 1.1 tsutsui DW INTR_ASCI1
2059 1.1 tsutsui VEC_PT2IN:
2060 1.1 tsutsui DW INTR_IGN
2061 1.1 tsutsui VEC_PT2OUT:
2062 1.1 tsutsui DW INTR_IGN
2063 1.1 tsutsui VEC_PT2OVF:
2064 1.1 tsutsui DW INTR_IGN
2065 1.1 tsutsui ;
2066 1.1 tsutsui ;
2067 1.1 tsutsui INTR_IGN:
2068 1.1 tsutsui EI
2069 1.1 tsutsui RETI
2070 1.1 tsutsui
2071 1.1 tsutsui VECTOR_ORG_LEN: .EQU $$-VECTOR_ORG
2072 1.1 tsutsui
2073 1.1 tsutsui .DEPHASE
2074 1.1 tsutsui XPLX_FIRMWARE_LEN:: .EQU $
2075