Home | History | Annotate | Line # | Download | only in xplx
      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