001: This is the routine that plays a SFX;
002: This routine is used for the in game sound fx (like shooting) <<<<<<<<<<<<
003:
004: In SCC-BLAFFER I use ONLY channel 3 for PSG (drums) channel 1 and 2 are unused.
005: What do I need to change in the routine below to let it leave channel 3 untouched ?
006:
007: ;+----- Set all PSG regs.-----+ ;SEE (Sound Effects Editor)
008: SETPSG:
009: LD IX,PSGREG
010: LD E,0 ;Start reg.0
011: INC HL ;[skip event byte]
012:
013: ;
014:
015: LD B,3 ;First 6 reg. [sound frequency]
016: STPS.0: PUSH BC
017: LD C,(HL) ;reg. $00, $02 or $04 -> Fine tune : A,B & C channels
018: INC HL
019: LD B,(HL) ;reg. $01, $03 or $05 -> Coarse tune : A,B & C channels
020: BIT 7,(HL) ;check and handle Tuning
021: CALL NZ,TUNWUP
022: BIT 6,(HL)
023: CALL NZ,TUNWDW
024: INC HL
025: LD A,C
026: CALL WRTPSG
027: LD A,B
028: AND $0F
029: CALL WRTPSG
030: POP BC
031: DJNZ STPS.0
032:
033: LD A,(HL) ;reg. $06 [Rustle frequency] -> Noise channel ?
034: INC HL
035: BIT 7,A
036: CALL NZ,TUN_UP
037: BIT 6,A
038: CALL NZ,TUN_DW
039: AND $1F
040: CALL WRTPSG
041:
042: LD A,(HL) ;reg. $07 [set channel ON/OFF] ->Mixer :/EN noise /EN A /EN B /EN C
043: AND $3F
044: OR $80 ;set bit 7 is necessary to write the PSG!! ---> pour SSG/YM2610 : idem ??? pas sur !
045: INC HL
046: CALL WRTPSG
047:
048: LD B,3 ;reg. $08-$0A [Volume Channels A,B & C]
049: STPS.1: PUSH BC
050: LD A,(HL)
051: INC HL
052: BIT 5,A
053: JP NZ,STPS.2 ;Volume pattern is set.
054: LD C,A
055: AND $0F
056: BIT 7,C
057: CALL NZ,TUN_UP
058: BIT 6,C
059: CALL NZ,VOL_DW
060: CALL FIXVOL ; Volume est param�trable !!
061: STPS.2: AND $1F
062: CALL WRTPSG
063: POP BC
064: DJNZ STPS.1
065:
066: LD B,3 ; reg $0B-$0D [volume effect] ->Volume envelope period fine tune/coarse tune & Volume envelop shape
067: STPS_2: LD A,(HL)
068: INC HL
069: CALL WRTPSG
070: DJNZ STPS_2
071: RET
072:
073:
074: ; Tuning
075: ;- byte
076: TUN_UP: ADD A,(IX) ; Up
077: RET
078: TUN_DW: SUB (IX) ; Down
079: NEG
080: RET
081: ;- word
082: TUNWUP: PUSH HL
083: LD L,(IX)
084: LD H,(IX+1)
085: ADD HL,BC
086: PUSH HL
087: POP BC
088: POP HL
089: RET
090: TUNWDW: PUSH HL
091: LD L,(IX)
092: LD H,(IX+1)
093: XOR A
094: SBC HL,BC
095: PUSH HL
096: POP BC
097: POP HL
098: RET
099:
100: ; Volume Down
101: VOL_DW: AND $0F
102: LD B,A
103: LD A,(IX+0)
104: SUB B
105: RET NC
106: XOR A
107: RET
108:
109:
110: ; Make relative volume (depending on "SEEVOL"
111: ; In: A, volume
112: ; Out: A, new volume [seevol - (15-volume)]
113: FIXVOL: AND $0F
114: LD B,A
115: LD A,15
116: SUB B
117: LD C,A
118: LD A,(SEEVOL)
119: AND $0F
120: SUB C
121: RET NC
122: XOR A
123: RET
124:
125:
126: ; Write PSG (not ROM-BIOS compatible!)
127: ; In: A, data
128: ; E, port
129: ; IX, PSG store table
130: ; Out: E+1
131: ; IX+1
132: WRTPSG: LD (IX),A
133: INC IX
134: PUSH AF
135: LD A,E
136: OUT ($A0),A ; pour MSX /port $A0(write) register Write port -> A modifier NEOGEO :OUT ($4),A
137: INC E
138: POP AF
139: OUT ($A1),A ; pour MSX /port $A1(write) Value Write port -> A modifier NEOGEO :OUT ($5),A
140: RET
141:
142:
143: ;+----------------------------< Work Area >------------------------------------+
144: ; reg. 0 1 2 3 4 5 6 7 8 9 A B C D
145: PSGREG: DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; - PSG port store buffer -