Files
TZFS/asm/mz-xz009/MON-PSG.ASM

1068 lines
24 KiB
NASM
Vendored

; ----------------------------
; 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