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.2 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.2 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