File: SFX PSG routine.txt - Tab length: 1 2 4 8 - Lines: on off - No wrap: on off

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 -