1068 lines
24 KiB
NASM
1068 lines
24 KiB
NASM
; ----------------------------
|
|
; MZ800-monitor PSG handlar
|
|
; FI:MON-PSG ver 001 7.26.84
|
|
; ----------------------------
|
|
;
|
|
INCLD MACRO
|
|
;
|
|
SYS: EQU 1 ;0 MZ-1500 1 PLE
|
|
;
|
|
NMAX: EQU 83 ;/ÙÄs max
|
|
PSGA: EQU F2H
|
|
PSG3: EQU 3F2H
|
|
PSG9: EQU 9F2H
|
|
;
|
|
IF SYS
|
|
MUSCH: EQU 6
|
|
MAXCH: EQU 8
|
|
PSGALL: EQU E9H
|
|
PSGOFF: EQU 4E9H
|
|
ENDIF
|
|
;
|
|
IF SYS-1
|
|
MUSCH: EQU 3
|
|
MAXCH: EQU 4
|
|
PSGALL: EQU F2H
|
|
PSGOFF: EQU 4F2H
|
|
ENDIF
|
|
;----------------------------------
|
|
;
|
|
; INTM (music interrupt mode )
|
|
;0 no operation
|
|
;1 music or noise
|
|
;2 sound n.time
|
|
;
|
|
;----------------------------------
|
|
;
|
|
INTM: ENT
|
|
DEFB 0
|
|
SBUSY: DEFB 0 ;music or noise only
|
|
INTC: DEFB 0
|
|
;----------------------------------
|
|
;
|
|
; sound out current tabel
|
|
;
|
|
;
|
|
;----------------------------------
|
|
; tone 1a
|
|
;
|
|
STBL: DEFB 80H ;frequency (l)
|
|
DEFB 00H ;frequency (h)
|
|
DEFB 9FH ;attenation
|
|
; tone 2a
|
|
DEFB A0H ;frequency (l)
|
|
DEFB 00H ;frequency (h)
|
|
DEFB BFH ;attenation
|
|
; tone 3a
|
|
DEFB C0H ;frequency (l)
|
|
DEFB 00H ;frequency (h)
|
|
STN0: DEFB DFH ;attenation
|
|
;
|
|
|
|
IF SYS
|
|
; tone 1b
|
|
;
|
|
DEFB 80H ;frequency (l)
|
|
DEFB 00H ;frequency (h)
|
|
DEFB 9FH ;attenation
|
|
; tone 2b
|
|
DEFB A0H ;frequency (l)
|
|
DEFB 00H ;frequency (h)
|
|
DEFB BFH ;attenation
|
|
; tone 3b
|
|
DEFB C0H ;frequency (l)
|
|
DEFB 00H ;frequency (h)
|
|
STN1: DEFB DFH ;attenation
|
|
ENDIF
|
|
SKP H
|
|
|
|
;----------------------------------
|
|
;
|
|
; play table
|
|
;
|
|
;----------------------------------
|
|
PTBL: DEFB 00H ;ch no.
|
|
DEFB 00H ;atc0
|
|
DEFB 00H ;atc1
|
|
DEFB 00H ;emva(l)
|
|
DEFB 00H ;emva(h)
|
|
DEFB 00H ;att
|
|
DEFB 00H ;length0
|
|
DEFB 00H ;tempo0
|
|
DEFB 00H ;length1
|
|
DEFB 00H ;tempo1
|
|
DEFB 00H ;qbuf(l)
|
|
DEFB 00H ;qbuf(h)
|
|
DEFB 00H ;emvp
|
|
DEFB 00H ;status
|
|
DEFB 00H ;vol
|
|
DEFB 00H ;reserve
|
|
DEFB 01H ;ch no.
|
|
DEFS 15 ;ch1
|
|
DEFB 02H ;ch no.
|
|
DEFS 15 ;ch2
|
|
DEFB 03H ;ch no.
|
|
DEFS 15 ;noise1
|
|
;
|
|
IF SYS
|
|
DEFB 04H ;ch no.
|
|
DEFS 15 ;ch3
|
|
DEFB 05H ;ch no.
|
|
DEFS 15 ;ch4
|
|
DEFB 06H ;ch no.
|
|
DEFS 15 ;ch5
|
|
DEFB 07H ;ch no.
|
|
DEFS 15 ;noise2
|
|
ENDIF
|
|
;----------------------------------
|
|
;
|
|
;
|
|
; ontyo tabel
|
|
;
|
|
;----------------------------------
|
|
LTBL: DEFB 1 ;0
|
|
DEFB 2 ;1
|
|
DEFB 3 ;2
|
|
DEFB 4 ;3
|
|
DEFB 6 ;4
|
|
DEFB 8 ;5
|
|
DEFB 12 ;6
|
|
DEFB 16 ;7
|
|
DEFB 24 ;8
|
|
DEFB 32 ;9
|
|
;----------------------------------
|
|
;
|
|
;
|
|
; tempo tabel
|
|
;
|
|
;----------------------------------
|
|
|
|
DEFB 23 ;1 64
|
|
DEFB 20 ;2 74
|
|
DEFB 17 ;3 90
|
|
DEFB 13 ;4 114
|
|
DEFB 10 ;5 152
|
|
DEFB 7 ;6 222
|
|
DEFB 3 ;7 450
|
|
SKP H
|
|
|
|
;----------------------------------
|
|
; emvelop pattern tabel
|
|
;
|
|
; ATT ÀÙÛÛÙ code
|
|
;
|
|
; 0 3
|
|
; -1 4
|
|
; +1 5
|
|
; r 0
|
|
; max 1
|
|
; min 2
|
|
;----------------------------------
|
|
ETBL: DEFB 00H ;emvp 0
|
|
DEFB 05H
|
|
DEFB 03H
|
|
DEFB 03H ;dummy
|
|
;
|
|
DEFB 0FH ;emvp 1
|
|
DEFB 04H
|
|
DEFB 01H
|
|
DEFB 03H ;dummy
|
|
;
|
|
DEFB 00H ;emvp 2
|
|
DEFB 05H
|
|
DEFB 02H
|
|
DEFB 00H
|
|
;
|
|
DEFB 0FH ;emvp 3
|
|
DEFB 04H
|
|
DEFB 01H
|
|
DEFB 00H
|
|
;
|
|
DEFB 00H ;emvp 4
|
|
DEFB 05H
|
|
DEFB 02H
|
|
DEFB 03H
|
|
;
|
|
DEFB 0FH ;emvp 5
|
|
DEFB 04H
|
|
DEFB 03H
|
|
DEFB 03H ;dummy
|
|
;
|
|
DEFB 00H ;emvp 6
|
|
DEFB 05H
|
|
DEFB 04H
|
|
DEFB 00H
|
|
;
|
|
DEFB 0FH ;emvp 7
|
|
DEFB 04H
|
|
DEFB 05H
|
|
DEFB 00H
|
|
;
|
|
DEFB 00H ;emvp 8
|
|
DEFB 03H
|
|
DEFB 03H
|
|
DEFB 00H
|
|
SKP H
|
|
|
|
;----------------------------------
|
|
;
|
|
; frequency tabel
|
|
;
|
|
;----------------------------------
|
|
NTBL: DEFW 3F00H ; A
|
|
DEFW 3B07H ; A#
|
|
DEFW 3802H ; B
|
|
;
|
|
; octave 1
|
|
;
|
|
DEFW 340FH ; C
|
|
DEFW 3200H ; C#
|
|
DEFW 2F03H ; D
|
|
DEFW 2C09H ; D#
|
|
DEFW 2A01H ; E
|
|
DEFW 270BH ; F
|
|
DEFW 2507H ; F#
|
|
DEFW 2306H ; G
|
|
DEFW 2106H ; G#
|
|
DEFW 1F08H ; A
|
|
DEFW 1D0CH ; A#
|
|
DEFW 1C01H ; B
|
|
;
|
|
; octave 2
|
|
;
|
|
DEFW 1A08H ; C
|
|
DEFW 1900H ; C#
|
|
DEFW 1709H ; D
|
|
DEFW 1604H ; D#
|
|
DEFW 1500H ; E
|
|
DEFW 130DH ; F
|
|
DEFW 120CH ; F#
|
|
DEFW 110BH ; G
|
|
DEFW 100BH ; G#
|
|
DEFW 0F0CH ; A
|
|
DEFW 0E0EH ; A#
|
|
DEFW 0E00H ; B
|
|
;
|
|
; octave 3
|
|
;
|
|
DEFW 0D04H ; C
|
|
DEFW 0C08H ; C#
|
|
DEFW 0B0DH ; D
|
|
DEFW 0B02H ; D#
|
|
DEFW 0A08H ; E
|
|
DEFW 090FH ; F
|
|
DEFW 0906H ; F#
|
|
DEFW 080DH ; G
|
|
DEFW 0805H ; G#
|
|
DEFW 070EH ; A
|
|
DEFW 0707H ; A#
|
|
DEFW 0700H ; B
|
|
;
|
|
; octave 4
|
|
;
|
|
DEFW 060AH ; C
|
|
DEFW 0604H ; C#
|
|
DEFW 050EH ; D
|
|
DEFW 0509H ; D#
|
|
|
|
DEFW 0504H ; E
|
|
DEFW 040FH ; F
|
|
DEFW 040BH ; F#
|
|
DEFW 0407H ; G
|
|
DEFW 0403H ; G#
|
|
DEFW 030FH ; A
|
|
DEFW 030BH ; A#
|
|
DEFW 0308H ; B
|
|
;
|
|
; octave 5
|
|
;
|
|
DEFW 0305H ; C
|
|
DEFW 0302H ; C#
|
|
DEFW 020FH ; D
|
|
DEFW 020DH ; D#
|
|
DEFW 020AH ; E
|
|
DEFW 0208H ; F
|
|
DEFW 0205H ; F#
|
|
DEFW 0203H ; G
|
|
DEFW 0201H ; G#
|
|
DEFW 010FH ; A
|
|
DEFW 010EH ; A#
|
|
DEFW 010CH ; B
|
|
;
|
|
; octave 6
|
|
;
|
|
DEFW 010AH ; C
|
|
DEFW 0109H ; C#
|
|
DEFW 0108H ; D
|
|
DEFW 0106H ; D#
|
|
DEFW 0105H ; E
|
|
DEFW 0104H ; F
|
|
DEFW 0103H ; F#
|
|
DEFW 0102H ; G
|
|
DEFW 0101H ; G#
|
|
DEFW 0100H ; A
|
|
DEFW 000FH ; A#
|
|
DEFW 000EH ; B
|
|
;
|
|
;
|
|
;
|
|
MSTBL: DEFW BF9FH
|
|
DEFW FFDFH
|
|
;
|
|
;
|
|
;
|
|
TSOUT: DEFB 80H ;ch 0
|
|
DEFB 00H
|
|
DEFB 90H ;att
|
|
TSOUTC: DEFB 00H ;counter(l)
|
|
DEFB 00H ;counter(h)
|
|
SKP H
|
|
|
|
;----------------------------------
|
|
;
|
|
;
|
|
; Music interrupt routine
|
|
;
|
|
;
|
|
;----------------------------------
|
|
PSGINT: ENT
|
|
PUSH IY
|
|
CALL INT0
|
|
POP IY
|
|
EI
|
|
RETI
|
|
;
|
|
INT0: CALL PUSHRA
|
|
CALL MSTART ;8253 intialize
|
|
;
|
|
LD A,(INTM)
|
|
OR A
|
|
JP Z,MSTOP0
|
|
DEC A
|
|
JP NZ,SDINT ;skip if sound out
|
|
;
|
|
LD BC,PSG9 ;psg data out
|
|
LD HL,STBL
|
|
OTIR
|
|
;
|
|
IF SYS
|
|
LD B,9
|
|
INC C
|
|
OTIR
|
|
ENDIF
|
|
;
|
|
LD B,8
|
|
LD A,(SBUSY)
|
|
OR A
|
|
JP Z,MSTOP0 ;channel all close
|
|
LD C,A
|
|
INT1: DEC B
|
|
RET M
|
|
RLC C
|
|
JR NC,INT1
|
|
PUSH BC
|
|
LD A,B
|
|
CALL INTER
|
|
BIT 0,(IY+13)
|
|
CALL Z,NINT
|
|
CALL MINT
|
|
POP BC
|
|
JR INT1
|
|
SKP H
|
|
|
|
;----------------------------------
|
|
;
|
|
; Emvelop control
|
|
;
|
|
;----------------------------------
|
|
NINT: DEC (HL) ;HL=chx act0
|
|
RET NZ
|
|
INC HL ;new couter set
|
|
LD A,(HL) ;load atc1
|
|
DEC HL
|
|
LD (HL),A ;save atc0
|
|
INC HL
|
|
INC HL
|
|
LD E,(HL) ;HL=enva
|
|
INC HL
|
|
LD D,(HL) ;HL=enva+1
|
|
EX DE,HL
|
|
NINT1: LD A,(HL) ;env ÀÙÛÛÙ data
|
|
OR A ;data check 0
|
|
JR NZ,NINT2 ;noskip if repeat
|
|
DEC HL
|
|
DEC HL
|
|
JR NINT1
|
|
;
|
|
;
|
|
NINT2: EX DE,HL ;de=curent emva
|
|
INC HL
|
|
DEC A
|
|
JR Z,NINT3 ;skip if max Acc=1
|
|
DEC A
|
|
JR Z,NINT5 ;skip if min Acc=2
|
|
DEC A
|
|
RET Z ;ÀÙÛÛÙ 0 Acc=3
|
|
;
|
|
DEC A ;Acc=4
|
|
LD A,(HL) ;att data
|
|
JR Z,NINT4 ;skip if dec att
|
|
INC A ;Acc=5
|
|
CP 15 ;max
|
|
JR Z,NINT7
|
|
JR C,NINT7
|
|
NINT3: LD A,15 ;maximam
|
|
JR NINT6
|
|
NINT4: DEC A ;dec att
|
|
JP M,NINT5
|
|
LD C,(IY+14) ;vol minimum
|
|
CP C
|
|
JR NC,NINT7
|
|
NINT5: LD A,(IY+14) ;minimum
|
|
NINT6: INC DE ;de=next curent emva
|
|
NINT7: LD (HL),A ;new att data
|
|
DEC HL
|
|
LD (HL),D
|
|
DEC HL
|
|
LD (HL),E
|
|
;
|
|
ATTSET: AND 0FH
|
|
LD B,A ;acc=att data
|
|
ATTS1: LD A,(IX+2) ;stbl att
|
|
AND F0H
|
|
|
|
OR B
|
|
LD (IX+2),A ;stbl att
|
|
RET
|
|
SKP H
|
|
|
|
;----------------------------------
|
|
;
|
|
; new data interpret routine
|
|
;
|
|
;----------------------------------
|
|
;
|
|
MINT: DEC (IY+6) ;length0
|
|
RET NZ
|
|
DEC (IY+7) ;tempo0
|
|
LD A,(IY+8) ;length1
|
|
LD (IY+6),A ;length counter preset
|
|
RET NZ
|
|
LD A,(IY+9) ;tempo1
|
|
LD (IY+7),A ;tempo counter preset
|
|
LD E,(IY+10) ;que addr(l)
|
|
LD D,(IY+11) ;que addr(h)
|
|
;
|
|
;
|
|
MINT1: LD A,(DE)
|
|
INC DE
|
|
CP FFH
|
|
JR Z,MINT2
|
|
CP A0H
|
|
JR Z,MINT3
|
|
CP 90H
|
|
JR NC,MINT4
|
|
CP 80H
|
|
JR NC,MINT5
|
|
CP 60H
|
|
JR NC,MINT6
|
|
SUB 9
|
|
LD (IY+10),E ;que addr (l)
|
|
LD (IY+11),D ;que addr (h)
|
|
SET 0,(IY+13) ;rflag set
|
|
JR C,MINT7
|
|
RES 0,(IY+13) ;rflag reset
|
|
CALL SETNO ;Nn
|
|
MINT7: LD A,(IY+2) ;att
|
|
LD (IY+1),A
|
|
LD A,(IY+8) ;length
|
|
LD (IY+6),A
|
|
LD A,(IY+9) ;tempo
|
|
LD (IY+7),A
|
|
BIT 0,(IY+13)
|
|
JR NZ,MEND
|
|
;
|
|
;
|
|
LD A,(IY+12) ;emv pattern
|
|
LD BC,ETBL
|
|
ADD A,A ;*2
|
|
ADD A,A ;*4
|
|
LD H,0
|
|
LD L,A
|
|
ADD HL,BC ;HL=ETBL+4*A
|
|
LD A,(HL)
|
|
OR A
|
|
JR NZ,MINT71
|
|
LD A,(IY+14) ;vol minimum
|
|
MINT71: LD (IY+5),A ;att
|
|
CALL ATTSET
|
|
|
|
INC HL
|
|
LD (IY+3),L ;emva (l)
|
|
LD (IY+4),H ;emva (h)
|
|
RET
|
|
;
|
|
;
|
|
;
|
|
MINT3: LD A,(DE) ;Mn
|
|
INC DE
|
|
LD (IY+2),A ;atc1
|
|
MINT11: JR MINT1
|
|
;
|
|
MINT2: CALL BRESET ;channel reset
|
|
MEND: LD A,0FH
|
|
JP ATTSET
|
|
;
|
|
;
|
|
MINT4: SUB 90H ;Sn
|
|
LD (IY+12),A ;curent emv no.
|
|
JR MINT11
|
|
;
|
|
;
|
|
MINT5: SUB 80H ;Vn
|
|
CPL
|
|
AND 0FH
|
|
LD (IY+14),A ;vol minimum
|
|
JR MINT11
|
|
;
|
|
;
|
|
; tempo & length
|
|
;
|
|
;
|
|
MINT6: SUB 60H ;Tn,Ln
|
|
LD B,0
|
|
LD C,A
|
|
LD HL,LTBL
|
|
ADD HL,BC
|
|
CP 0AH
|
|
LD A,(HL)
|
|
JR NC,MINT61
|
|
LD (IY+8),A ;length1
|
|
JR MINT11
|
|
MINT61: LD (IY+9),A ;tempo1
|
|
JR MINT11
|
|
SKP H
|
|
|
|
;--------------------------------
|
|
;
|
|
;
|
|
; onpu set
|
|
;
|
|
; acc = onpu map data
|
|
; ix = set mout tbladdr
|
|
;--------------------------------
|
|
;
|
|
SETNO: ADD A,A ;*2
|
|
LD HL,NTBL
|
|
LD B,0
|
|
LD C,A
|
|
ADD HL,BC
|
|
LD B,(HL)
|
|
LD A,(IX+0)
|
|
AND F0H
|
|
OR B
|
|
LD (IX+0),A
|
|
INC HL
|
|
LD A,(HL)
|
|
LD (IX+1),A
|
|
RET
|
|
;----------------------------------
|
|
;
|
|
; SOUND=(reg,data)
|
|
;
|
|
; ent A.... reg+80H
|
|
; DE... data
|
|
;
|
|
;
|
|
; SOUND n,time
|
|
;
|
|
; ent A.... n
|
|
; DE... time
|
|
;
|
|
;----------------------------------
|
|
;
|
|
MSOUND: ENT
|
|
OR A
|
|
JP P,SOUT
|
|
AND 0FH
|
|
LD C,PSGA ;psg-a
|
|
;
|
|
IF SYS
|
|
;
|
|
CP 8
|
|
JR C,+5
|
|
SUB 8
|
|
INC C ;C=psg sel, A=reg#.
|
|
;
|
|
ENDIF
|
|
;
|
|
ADD A,A
|
|
ADD A,A
|
|
ADD A,A
|
|
ADD A,A
|
|
OR 80H
|
|
LD B,A ;B = 1rrr0000
|
|
;
|
|
|
|
BIT 4,A
|
|
JR NZ,MSND.A ;att
|
|
CP E0H
|
|
JR Z,MSND.N ;noise ctrl
|
|
LD A,D ;freq
|
|
CP 04H
|
|
JR NC,MER3
|
|
LD A,E
|
|
AND 0FH
|
|
OR B ;1rrrffff
|
|
OUT (C),A
|
|
LD A,D
|
|
LD B,4
|
|
RL E
|
|
RLA
|
|
DJNZ -3
|
|
OUT (C),A ;0fffffff
|
|
RET
|
|
;
|
|
MSND.N: BIT 3,E
|
|
JR NZ,MER3
|
|
MSND.A: LD A,E
|
|
AND F0H
|
|
OR D
|
|
JR NZ,MER3
|
|
LD A,E
|
|
OR B
|
|
OUT (C),A ;1rrrcccc
|
|
RET
|
|
;
|
|
MER3: JP ER03
|
|
;
|
|
;--------------------------------
|
|
;
|
|
; sout
|
|
;
|
|
;--------------------------------
|
|
;
|
|
SDINT: LD HL,(TSOUTC)
|
|
DEC HL
|
|
LD (TSOUTC),HL
|
|
LD A,L
|
|
OR H
|
|
RET NZ
|
|
JP MSTOP0
|
|
;
|
|
;
|
|
; SOUND n,l
|
|
;
|
|
;
|
|
SOUT: ENT
|
|
LD C,A
|
|
LD A,D
|
|
OR E
|
|
RET Z
|
|
LD A,C
|
|
;
|
|
LD IX,TSOUT
|
|
CP NMAX+1
|
|
RET NC
|
|
|
|
SUB 9
|
|
PUSH AF
|
|
LD A,90H
|
|
JR NC,SOUT1
|
|
LD A,9FH
|
|
SOUT1: LD (IX+2),A ;TSOUT att
|
|
CALL MWAIT0
|
|
POP AF
|
|
CALL NC,SETNO ;skip if not rest
|
|
DI
|
|
LD A,2
|
|
LD (INTM),A
|
|
LD (TSOUTC),DE
|
|
LD HL,TSOUT
|
|
LD BC,PSG3 ;psg-a out
|
|
OTIR
|
|
CALL MSTART
|
|
EI
|
|
RET
|
|
;
|
|
;--------------------------------
|
|
;
|
|
; Interpret point set
|
|
;
|
|
;
|
|
; in Acc=channel
|
|
;
|
|
; exit ix:stbl
|
|
; iy:ptbl
|
|
; hl:ptbl+1
|
|
;
|
|
;----------------------------------
|
|
INTER: PUSH BC
|
|
PUSH AF
|
|
CP 3
|
|
JR C,INTER1
|
|
DEC A
|
|
;
|
|
IF SYS
|
|
CP 6
|
|
JR NZ,INTER1
|
|
DEC A
|
|
ENDIF
|
|
;
|
|
INTER1: LD HL,STBL
|
|
LD B,A
|
|
ADD A,A ;*2
|
|
ADD A,B ;*3
|
|
LD C,A
|
|
LD B,0
|
|
ADD HL,BC
|
|
PUSH HL
|
|
POP IX
|
|
;
|
|
POP AF
|
|
ADD A,A ;*2
|
|
ADD A,A ;*4
|
|
ADD A,A ;*8
|
|
ADD A,A ;*16
|
|
LD HL,PTBL
|
|
|
|
LD B,0
|
|
LD C,A
|
|
ADD HL,BC
|
|
PUSH HL
|
|
POP IY
|
|
INC HL
|
|
POP BC
|
|
RET
|
|
SKP H
|
|
|
|
;--------------------------------
|
|
;
|
|
; play,noise
|
|
;
|
|
;--------------------------------
|
|
;
|
|
;
|
|
PLAY: ENT
|
|
CP FFH
|
|
JR NZ,PLY0
|
|
LD A,MAXCH-1
|
|
PLYALL: PUSH AF
|
|
PUSH DE
|
|
CALL PLY0
|
|
POP DE
|
|
POP AF
|
|
DEC A
|
|
JP M,PSGON
|
|
JR PLYALL
|
|
;
|
|
PLY0: PUSH AF
|
|
LD HL,STN0
|
|
IF SYS
|
|
CP 4
|
|
JR C,PLY00
|
|
LD HL,STN1
|
|
ENDIF
|
|
;
|
|
PLY00: CP 3
|
|
JR Z,PLY1
|
|
;
|
|
IF SYS
|
|
CP 7
|
|
JR Z,PLY1
|
|
ENDIF
|
|
;
|
|
LD A,DFH
|
|
JR PLY2
|
|
;
|
|
PLY1: LD A,E7H ;noise channel out
|
|
OUT (PSGALL),A
|
|
LD A,FFH
|
|
PLY2: LD (HL),A ;STN0 or STN1
|
|
DI
|
|
LD A,1
|
|
LD (INTM),A
|
|
POP AF
|
|
CALL INTER
|
|
CALL BSET
|
|
CALL MINT1
|
|
EI
|
|
RET
|
|
;
|
|
;
|
|
PSGON: ENT
|
|
DI
|
|
LD A,(INTM)
|
|
OR A
|
|
CALL NZ,MSTART
|
|
EI
|
|
|
|
RET
|
|
;
|
|
BRESET: LD B,86H
|
|
JR BSET0
|
|
;
|
|
BSET: LD B,C6H
|
|
BSET0: LD HL,SBUSY
|
|
LD A,(IY+0)
|
|
OR A
|
|
RLCA
|
|
RLCA
|
|
RLCA ;00xxx000
|
|
OR B ;10xxx110 or 11xxx110
|
|
LD (BSET1),A
|
|
DEFB CBH ;SET n,(HL) or reset
|
|
BSET1: DEFB 0
|
|
RET
|
|
SKP H
|
|
|
|
;----------------------------------
|
|
;
|
|
; sft+break or error or music stop
|
|
;
|
|
;----------------------------------
|
|
;
|
|
MLDSP: ENT
|
|
MSTOP: CALL PUSHR
|
|
;
|
|
MSTOP0: XOR A
|
|
LD (INTM),A
|
|
LD (SBUSY),A
|
|
;
|
|
LD BC,PSGOFF
|
|
LD HL,MSTBL
|
|
OTIR
|
|
LD B,MUSCH
|
|
LD HL,STBL+2
|
|
MSTOP1: LD A,(HL)
|
|
AND F0H
|
|
OR 0FH
|
|
LD (HL),A
|
|
INC HL
|
|
INC HL
|
|
INC HL
|
|
DJNZ MSTOP1
|
|
LD A,3
|
|
OUT (FCH),A ;pio disenable
|
|
XOR A
|
|
IF SYS-1
|
|
RET ;8253 gate no effect
|
|
ENDIF
|
|
;
|
|
IF SYS
|
|
LD HL,E008H ;mz-700 compatible mode
|
|
JP LDHLA ;8253 gate disable
|
|
ENDIF
|
|
;
|
|
;----------------------------------
|
|
;
|
|
; music wait
|
|
;
|
|
;----------------------------------
|
|
;
|
|
MWAIT: ENT
|
|
;
|
|
MWAIT0: LD A,(INTM)
|
|
OR A
|
|
RET Z
|
|
MWAIT1: SVC .BREAK
|
|
RST 3
|
|
DEFB .BREAK
|
|
ENDM
|
|
JR NZ,MWAIT
|
|
JP BREAKZ
|
|
SKP H
|
|
|
|
;----------------------------------
|
|
; SVC .MCTRL ; music control
|
|
; B=0: init
|
|
; B=1: psgon
|
|
; B=2: stop
|
|
; B=3: wait
|
|
;----------------------------------
|
|
;
|
|
MCTRL: ENT
|
|
DEC B
|
|
JP Z,PSGON
|
|
DEC B
|
|
JR Z,MSTOP ;1
|
|
DEC B
|
|
JR Z,MWAIT0 ;2
|
|
;----------------------------------
|
|
;
|
|
; PSG power on init
|
|
;
|
|
;
|
|
;----------------------------------
|
|
PSGPWR: ENT
|
|
CALL MSTOP
|
|
LD BC,5FCH
|
|
LD HL,PIOTBL
|
|
OTIR
|
|
LD DE,MUINID
|
|
LD A,FFH
|
|
JP PLAY
|
|
;
|
|
;
|
|
IF SYS
|
|
PIOTBL: DEFB FCH ;Vector
|
|
DEFB FFH ;mode 3 (bit mode)
|
|
DEFB 3FH ;I/O
|
|
DEFB 37H ;interrupt control
|
|
DEFB EFH ;interrupt mask
|
|
;
|
|
;
|
|
MSTART: OUT (E3H),A
|
|
LD A,30H
|
|
LD HL,E007H
|
|
LD (HL),A ;8253 control
|
|
LD BC,22A5H ;10ms =22F6H
|
|
LD L,4 ;HL=E004H
|
|
LD (HL),C ;8253 time const
|
|
LD (HL),B
|
|
DEC HL ;HL=E003H
|
|
LD (HL),4 ;8253 int disable
|
|
LD (HL),0 ;8253 music disable
|
|
LD A,01H
|
|
LD L,8 ;HL=E008H
|
|
LD (HL),A ;8253 gate enable
|
|
LD A,83H
|
|
OUT (FCH),A ;pio int enable
|
|
OUT (E1H),A
|
|
RET
|
|
ENDIF
|
|
;
|
|
IF SYS-1
|
|
|
|
MSTART:
|
|
LD HL,PIOTBL
|
|
LD BC,5FCH
|
|
OTIR
|
|
LD HL,CTCTBL
|
|
LD B,6
|
|
JP IOOUT
|
|
;
|
|
;
|
|
PIOTBL: DEFB FCH ;Vector
|
|
DEFB FFH ;mode 3 (bit mode)
|
|
DEFB 3FH ;I/O
|
|
DEFB 17H ;interrupt control
|
|
DEFB EFH ;interrupt mask
|
|
;
|
|
CTCTBL: DEFW D730H
|
|
DEFW D4B0H ;10 ms =2B4CH
|
|
DEFW D42AH
|
|
DEFW D304H
|
|
DEFW D300H
|
|
DEFW FC83H
|
|
ENDIF
|
|
;
|
|
MUINID: DEFB 65H ;L5
|
|
DEFB 6DH ;T4
|
|
DEFB 98H ;S8
|
|
DEFW FFA0H ;M255
|
|
DEFB FFH ;END
|
|
IF SYS
|
|
;----------------------------------
|
|
;
|
|
;
|
|
; BELL (BEEP) use 8253
|
|
;----------------------------------
|
|
CTRLG: ENT
|
|
CALL PUSHR
|
|
LD (CTRLG9+1),SP
|
|
SVC .DI
|
|
LD SP,IBUFE
|
|
OUT (E4H),A ;K/C mapping
|
|
CALL 02BEH ;ROM MLDSP
|
|
LD A,1
|
|
LD DE,E003H
|
|
LD (DE),A ;8253 music gate on
|
|
LD HL,03F9H
|
|
CALL 02AEH ;ROM MLDST+3
|
|
LD BC,18H
|
|
EX (SP),HL ;wait
|
|
DJNZ -1
|
|
DEC C
|
|
JR NZ,-4
|
|
CALL 02BEH ;ROM MLDSP
|
|
XOR A
|
|
LD (DE),A ;8253 music gate off
|
|
OUT (E0H),A ;K/C mapping
|
|
OUT (E1H),A
|
|
SVC .EI
|
|
CTRLG9: LD SP,0 ;xxx
|
|
RET
|
|
ENDIF
|
|
|
|
;
|
|
IF SYS-1
|
|
;
|
|
CTRLG: ENT
|
|
CALL PUSHR
|
|
SVC .DI
|
|
RST 3
|
|
DEFB .DI
|
|
ENDM
|
|
LD HL,BEEP0
|
|
LD B,4
|
|
CALL IOOUT
|
|
LD BC,18H
|
|
EX (SP),HL
|
|
DJNZ -1
|
|
DEC C
|
|
JR NZ,-4
|
|
LD HL,BEEP1
|
|
LD B,2
|
|
CALL IOOUT
|
|
SVC .EI
|
|
RST 3
|
|
DEFB .EI
|
|
ENDM
|
|
RET
|
|
;
|
|
;
|
|
BEEP0:
|
|
DEFW D736H
|
|
DEFW D301H
|
|
DEFW D4F9H
|
|
DEFW D403H
|
|
;
|
|
BEEP1:
|
|
DEFW D736H
|
|
DEFW D300H
|
|
;--------------------------------
|
|
;
|
|
; tempo set
|
|
; acc=1-7
|
|
;--------------------------------
|
|
?TEMP: ENT
|
|
CALL PUSHRA
|
|
LD DE,TEMPOW
|
|
AND 0FH
|
|
ADD A,69H
|
|
LD (DE),A
|
|
LD B,3
|
|
SVC .MCTRL ;MWAIT
|
|
RST 3
|
|
DEFB .MCTRL
|
|
ENDM
|
|
LD A,FFH ;Channel all
|
|
SVC .PLAY
|
|
RST 3
|
|
DEFB .PLAY
|
|
ENDM
|
|
LD B,1
|
|
SVC .MCTRL ;PSGON
|
|
RST 3
|
|
|
|
DEFB .MCTRL
|
|
ENDM
|
|
RET
|
|
;
|
|
TEMPOW: DEFS 1
|
|
DEFB FFH
|
|
;
|
|
ENDIF
|
|
END
|