.MLIB "T2MACS.LIB" .FILE 'T2SND.ASM' .TITLE "<<< TERMINATOR 2 ---- SOUND PROCESSOR >>>" .WIDTH 132 .OPTION B,D,L,T .MNOLIST ************************************************************************** * * * COPYRIGHT (C) 1991 WILLIAMS ELECTRONICS GAMES, INC. * * ALL RIGHTS RESERVED. * * * ************************************************************************** .INCLUDE "T2.H" ;Game equates .TEXT * *SOUND PROCESSOR MAKES SOUNDS FOR N-CHANNELS (CURRENTLY 6): * * CHANNEL #0 OKI CHANNEL 3 * CHANNEL #1 OKI CHANNEL 4 * CHANNEL #2 YAMAHA SOUNDS * CHANNEL #3 MUSIC * CHANNEL #4 OKI CHANNEL 1 (PLAYER 1) * CHANNEL #5 OKI CHANNEL 2 (PLAYER 2) * *THE ROUTINE "SNDRES" MUST BE CALLED TO INITAILIZE SOUND BOARD *ALSO SCRATCHPAD RAM MUST BE INITIALIZED TO ZERO *THE ROUTINE "SNDPRC" MUST BE CALLED EVERY 16MSEC. IN THE MAIN PROGRAM LOOP *(THE SAME PLACE WHERE "PRCDSP" IS NORMALLY CALLED) *MAKING A SOUND: * *SOUND TABLE FORMAT * *SOUND DESCRIPTION: * .WORD PRIORITY, TIME, SOUND CODE, (PRIORITY), (TIME), (SOUND CODE), 0 * *SOUND ENDS IN 0000. *PRIORITY WORD = 1111INNNPPPPPPPP; I=1=NON-INTERRUPTABLE *NNN=CHANNEL #(0-7); *PP=PRIORITY (00-FF), FF=HIGHEST. *TIME WORD =TTTT (0000-7FFF X 16MS). *SOUND WORD =8SSS SSS=SOUND CODE(000-FFF). *SOUND WORD =4SSS SSS=SOUND CODE (ZERO TIME SOUND CODE) *EXAMPLE 1: * * MOVI SND1,A0 ;LOAD ABSOLUTE ADDRESS OF SND1 IN A0 * CALLA ONESND ;MAKE ONE SND1 * *SND1: .WORD >F0FF,>0100,>8088,0 * *SND1 IS FOR CHANNEL=0, PRIORITY=FF (HIGHEST), TIME = 100H X 16MSEC. *SOUND CODE = 88H *SND1 WILL MAKE ONE SOUND 88H, AND NOT ALLOW IT TO BE INTERRUPTED *FOR 100H X 16MSEC., EXCEPT BY A SOUND OF EQUAL OR GREATER PRIORITY ON *CHANNEL 0 * * MOVI SND2,A0 ;LOAD SND2 ADDRESS * MOVK 3,A1 ;REPEAT IT 3 TIMES * CALLA SNDLD ;GO DO IT *SND2: .WORD >F311,>0020,>8044,>8044,0 * *SND2 IS ON CHANNEL 3, PRIORITY 11H. IT WILL MAKE ONE SOUND 44H, WAIT *20H X 16 MSEC., THEN MAKE ANOTHER SOUND 44H, WHICH CANNOT BE INTERRUPTED *FOR 20H X 16 MSEC., EXCEPT BY A SOUND OF EQUAL OR GREATER PRIORITY ON *CHANNEL 3 * *SINCE A1 IS LOADED WITH A REPEAT COUNT OF 3, THIS PROCESS WILL BE REPEATED *THREE TIMES. THE END RESULT WILL BE 6 SOUND 44H SEPERATED BY 20H X 16MSEC. * *NOTE: THE CHANNEL SPECIFIED BY "MUSICHAN" WILL CAUSE THE MUSIC SECTION OF * THE SOUND BOARD TO BE STROBED. * SNDPRI .SET 0 ;PRIORITY (00=LOWEST, FF=HIGHEST) SNDTIM .SET 010h ;TIMER 000-7FFF SNDTMR .SET 020h ;TIMER COUNTDOWN SNDST .SET 030h ;ADDRESS OF SOUND TABLE START SNDPTR .SET 050h ;POINTER TO SOUND TABLE DATA SNDREP .SET 070h ;REPEAT COUNT OF SOUND *NOTE: IF YOU CHANGE SNDSIZ, MAKE SURE ANY CODE THAT USES IT AS A DIVISOR * PERFORMS THE CORRECT OP. CURRENTLY IT IS A POWER OF 2 SO SRL IS USED. SNDSIZ .SET 080h SL_CHANNEL .EQU 21 ;SHIFTS REQUIRED TO ISOLATE CHANNEL NUMBER SR_CHANNEL .EQU 29 NCHAN EQU 6 ;DECLARE NUMBER OF ALLOWED CHANNELS MUSICHAN EQU 3 ;THIS CHANNEL IS FOR THE TUNES *THESE STROBE EQUATES ARE FOR THE PINBALL SOUND CARD RESETBIT EQU 0100H ;THIS IS THE SOUND RESET BIT SOUNDBIT EQU 0200H ;THIS IS THE SOUND BOARD STROBE EXTENDED_CODE .EQU 7AH ;SEND THIS TO INDICATE EXTENDED SOUND CALL .BSS SNDSTR,NCHAN*SNDSIZ ;RESERVE STORAGE AREA .BSS SNDEND,0 ;END OF SOUND PROCESSOR RAM ************************************************************************** * * * A_SOUND - ANIM FUNC TO MAKE A SOUND CALL * * A8 = PTR TO OBJECT * * *A8(AnimFrm),L = PTR TO SOUND SCRIPT * * NOTE: ANIM FUNCS DO NOT PUSH REGISTERS! * * * ************************************************************************** A_SOUND CALLA GETAFARG_LONG CALLR ONESND RETS ************************************************************************** * * * CLRSNDDB - CLEAR THE SOUND PROCESSOR DATA BASE * * * ************************************************************************** CLRSNDDB MMTM SP,A0,A1 MOVI SNDSTR,A1 CLR A0 CLRSDBL MOVE A0,*A1+,W CMPI SNDEND,A1 JRLO CLRSDBL MMFM SP,A0,A1 RETS ************************************************************************** * * * ONESND - MAKE ONE SOUND * * A0 = PTR TO SOUND SCRIPT (0 = NO SOUND, JUST RETURN) * * RETURNS: * * A0 = SAME * * * ************************************************************************** ONESND: PUSH A1 MOVE A0,A0 ;DID HE CALL WITH A NULL? JRZ ONESND_X ;BR = YES .IF DEBUG MOVE A0,A1 SLL 28,A1 SRL 28,A1 JRNZ $ .ENDIF MOVK 1,A1 CALLR SNDLD ONESND_X: PULLQ A1 RETS * *SOUND LOADER *A0=SOUND ADDRESS, A1=REPEAT COUNT *SOUND DESCRIPTION= PRIORITY,TIME,SOUND CODE,(PRIORITY),(TIME),(SOUND CODE),0 *SOUND ENDS IN ZERO *PRIORITY WORD = 1111INNNPPPPPPPP; I=1=NON-INTERRUPTABLE *NNN=CHANNEL #(0-7); *PP=PRIORITY (00-FF), FF=HIGHEST. *TIME WORD =TTTT (0000-7FFF X 16MS). *SOUND WORD =8SSS SSS=SOUND CODE(000-FFF). *SOUND WORD =4SSS SSS=SOUND CODE (ZERO TIME SOUND CODE) SNDLD: MMTM SP,A0,A1,A2,A3,A4,A5 MOVE @SOUNDSUP,A4,W JRNZ SNDLDX ;SOMEBODY SAYS NO! MOVE *A0,A5 ;GET PRIORITY BYTE MOVE A5,A2 MOVI SNDSIZ,A3 SLL SL_CHANNEL,A5 SRL SR_CHANNEL,A5 ;EXTRACT CHANNEL BITS MPYU A5,A3 ADDI SNDSTR,A3 ;CALC RAM CHANNEL ADDRESS MOVE *A3(SNDPRI),A4 ;GET CURRENT PRIORITY BTST 11,A4 ;CURRENT SOUND NON-INTERRUPTABLE ? JRNE SNDLDX ;YES, CAN NEW SOUND MOVE A2,A5 ;EXTRACT PRIORITY SLL 24,A5 SRL 24,A5 SLL 24,A4 SRL 24,A4 CMP A5,A4 ;NEW ONE GREATER OR EQUAL? JRHI SNDLDX ;OLD ONE IS GREATER, FORGET NEW SOUND **** JRLO SNDLD1 ;NEW ONE IS GREATER, DO IT **** MOVE *A3(SNDPRI),A4 ;INTERRUPTABLE BY EQUAL? **** BTST 10,A4 **** JRNE SNDLDX ;NON-INTERRUPTABLE BY EQUAL, CAN NEW GUY ****SNDLD1: MOVE A0,A4 MOVE A3,A0 ;CHANNEL RAM ADDRESS MOVE A4,*A0(SNDPTR),L ;SETUP SOUND DATA POINTER (ROM) MOVE A4,*A0(SNDST),L ;SETUP SOUND START POINTER MOVE A1,*A0(SNDREP) ;REPEAT COUNT CALLR SNDUPD ;START SOUND GOING SNDLDX: MMFM SP,A0,A1,A2,A3,A4,A5 RETS * *SOUND PROCESSOR CALLED EVERY 16 MSEC. * SNDPRC: MOVI SNDSTR,A0 MOVK NCHAN,A1 SNDLP0: MOVE *A0(SNDTMR),A2 ;CHECK TIMER JREQ SNDPLP ;EQUAL, INACTIVE CHANNEL DEC A2 MOVE A2,*A0(SNDTMR) ;DEC TIME JRNE SNDPLP ;NO TIMEOUT CALLR SNDUPD ;UPDATE SOUND SNDPLP: ADDI SNDSIZ,A0 DSJS A1,SNDLP0 RETS * *UPDATE SOUND *A0=POINTER TO SOUND CHANNEL RAM * SNDUPD: SNDUP0: MOVE *A0(SNDPTR),A2,L ;GET POINTER TO ROM TABLE SNDUP1: MOVE *A2+,A3 ;GET NEXT ROM TABLE ENTRY JREQ SNDUP5 ;END OF SOUND *CHECK FOR PRIORITY CMPI ->1000,A3 JRLO SNDUP2 ;NOT PRIORITY CHANGE MOVE A3,*A0(SNDPRI) ;UPDATE PRIORITY JRUC SNDUP1 ;GO GET NEXT ONE *CHECK FOR SOUND CODE SNDUP2: CMPI 4000H,A3 JRLO SNDUP3 CMPI ->8000,A3 JRHS SNDUP2A MOVE A0,A5 SUBI SNDSTR,A5 SRL 7,A5 ;DIVIDE BY 128 CALLR SNDSND ;SEND SOUND CODE JRUC SNDUP1 ;GET THE NEXT ONE BOYS SNDUP2A: MOVE A0,A5 SUBI SNDSTR,A5 SRL 7,A5 ;DIVIDE BY 128 ************************************************************************** * * * MOVI SNDSIZ,A6 ;IF SNDSIZ IS NOT A POWER OF 2, * * DIVU A6,A5 ;USE DIVIDE TO CALCULATE SOUND CHANNEL # * * * ************************************************************************** CALLR SNDSND ;SEND SOUND CODE MOVE *A0(SNDTIM),*A0(SNDTMR) MOVE A2,*A0(SNDPTR),L ;STORE POINTER RETS *TIMER VALUE X 16MSEC. SNDUP3: MOVE A3,*A0(SNDTIM) MOVE A3,*A0(SNDTMR) JRUC SNDUP1 ;SET TIMER VALUE, AND GO GET NEXT *CHECK FOR REPEATERS SNDUP5: MOVE *A0(SNDREP),A3 ;CHECK REPEAT COUNT DEC A3 MOVE A3,*A0(SNDREP) JREQ SNDUP6 ;ALL OVER MOVE *A0(SNDST),*A0(SNDPTR) JRUC SNDUP0 ;START SOUND OVER *SOUND IS OVER CLEAR THE CHANNEL SNDUP6: CLR A2 MOVE A2,*A0(SNDPRI) ;CLEAR SOUND PRIORITY MOVE A2,*A0(SNDST),L ;CLEAR SOUND PTR SNDUPX: RETS ************************************************************************** * * * SNDSND - RAW HARDWARE SOUND CALL * * A3=SOUND CODE B0-B7 * * A5=SOUND CHANNEL # * * RETURNS: * * NOTHING * * NOTE: TRASHES A14 * * * ************************************************************************** SNDSND: MMTM SP,A0,A3 SLL 20,A3 SRL 20,A3 ;STRIP OFF BITS CMPI 100H,A3 ;IS THIS AN EXTENDED SOUND CALL? JRLO SNDSND_BASE ;BR = NO MOVE A3,A0 MOVI EXTENDED_CODE,A3 ;SEND THE EXTENDED FEATURE CALLR SNDSND MOVE A0,A3 SLL 24,A3 SRL 24,A3 SNDSND_BASE GETST A14 DINT MOVE @SOUND_COPY,A0,W SRL 8,A0 SLL 8,A0 ADD A3,A0 ANDNI SOUNDBIT,A0 MOVE A0,@SOUND_COPY,W MOVE A0,@SOUND,W ;HIT SOUND PUTST A14 MOVI 8,A0 DSJS A0,$ ;SLOW IT DOWN A BIT GETST A14 DINT MOVE @SOUND_COPY,A0,W ORI SOUNDBIT|RESETBIT,A0 MOVE A0,@SOUND_COPY,W MOVE A0,@SOUND,W ;HIT SOUND PUTST A14 MOVI 390,A0 ;MAX FIRQ DELAY ON SOUND BOARD IS 180 micros DSJS A0,$ MMFM SP,A0,A3 RETS ************************************************************************** * * * SNDRES - FULL SOUND BOARD RESET, SOUND CHECKSUMS ARE REPORTED. * * * * NOTE: TRASHES A14 * * * ************************************************************************** SNDRES: PUSH A0 GETST A14 DINT MOVE @SOUND_COPY,A0,W ANDNI RESETBIT,A0 MOVE A0,@SOUND_COPY,W MOVE A0,@SOUND,W PUTST A14 MOVI 100,A0 ;WAIT FOR IT TO CATCH DSJS A0,$ GETST A14 DINT MOVE @SOUND_COPY,A0,W ORI RESETBIT|SOUNDBIT,A0 MOVE A0,@SOUND_COPY,W MOVE A0,@SOUND,W PUTST A14 PULLQ A0 RETS ************************************************************************** * * * IS_SOUND - CHECK SOUND DATA BASE TO SEE IF THE GIVEN SOUND SCRIPT * * IS CURRENTLY BEING PROCESSED. (I.E. ANOTHER SOUND * * HAS OR HAS NOT TAKEN OVER.) * * A0 = PTR TO SOUND SCRIPT * * RETURNS * * Z = SAME SCRIPT * * NZ = SCRIPT NO LONGER ACTIVE * * * ************************************************************************** IS_SOUND PUSH A3 MOVE *A0,A14,W ;GET CHANNEL/PRIORITY WORD MOVI SNDSIZ,A3 SLL SL_CHANNEL,A14 SRL SR_CHANNEL,A14 ;EXTRACT CHANNEL BITS MPYU A14,A3 ADDI SNDSTR,A3 ;GET THE CORRECT RAM CHANNEL ADDRESS MOVE *A3(SNDST),A14,L CMP A0,A14 ;SAME SCRIPT ACTIVE? PULL A3 RETS ************************************************************************** * * * CKSNDPRI - CHECK SOUND CHANNEL FOR EXISTANCE OF A GIVEN SOUND PRIORITY * * A0 = CHANNEL # * * A1 = SOUND PRIORITY * * RETURNS: * * CARRY CLEAR = PRIORITY NOT ACTIVE * * CARRY SET = PRIORITY ACTIVE * * * ************************************************************************** CKSNDPRI MMTM SP,A0,A2 MOVI SNDSTR,A2 SLL 7,A0 ;CHANNEL x 128 ADD A2,A0 ;OFFSET TO CORRECT CHANNEL AREA MOVB *A0,A0 CMP A0,A1 JRNE CKSPRI1 ;BR = PRIORITY NOT ACTIVE SETC MMFM SP,A0,A2 RETS CKSPRI1 CLRC MMFM SP,A0,A2 RETS ************************************************************************** * * * QSNDRST - QUIET SOUND RESET, NO DIAGNOSTIC DONGERS * * * ************************************************************************** QSNDRST MMTM SP,A3,A5 CALLR SNDRES ;RESET THE BOARD MOVI 100,A0 DSJS A0,$ ;NEED 30 mics BEFORE SENDING CODE CLR A3 CLR A5 CALLR SNDSND ;PEND ON DIG SIDE MOVK MUSICHAN,A5 CALLR SNDSND ;PEND ON YAMAHA SIDE MMFM SP,A3,A5 RETS ************************************************************************** * * * FADE_UP - PROCESS TO FADE THE SOUND UP * * A11 = FADE RATE * * * ************************************************************************** FADE_UP: MOVI FADE_UP_TAB,A8 JRUC FADER ************************************************************************** * * * FADE_DOWN - PROCESS TO FADE THE SOUND UP * * A11 = FADE RATE * * * ************************************************************************** FADE_DOWN: MOVI FADE_DOWN_TAB,A8 JRUC FADER FADER: MOVI FADEPID,A0 CLR A1 NOT A1 CALLA KILALL ;WASTE ANY OTHER FADERS FADE_LP: MOVE *A8+,A0,L JRZ FADE_DONE CALLR ONESND SLOOPR A11,FADE_LP FADE_DONE: DIE FADE_UP_TAB: .LONG VOLUME0 .LONG VOLUME1 .LONG VOLUME2 .LONG VOLUME3 .LONG VOLUME4 .LONG VOLUME5 .LONG VOLUME6 .LONG VOLUME7 .LONG VOLUME8 .LONG VOLUME9 .LONG VOLUMEA .LONG VOLUMEB .LONG VOLUMEC .LONG VOLUMED .LONG VOLUMEE .LONG VOLUMEF .LONG 0 FADE_DOWN_TAB: .LONG VOLUMEF .LONG VOLUMEE .LONG VOLUMED .LONG VOLUMEC .LONG VOLUMEB .LONG VOLUMEA .LONG VOLUME9 .LONG VOLUME8 .LONG VOLUME7 .LONG VOLUME6 .LONG VOLUME5 .LONG VOLUME4 .LONG VOLUME3 .LONG VOLUME2 .LONG VOLUME1 .LONG VOLUME0 .LONG 0 ************************************************************************** * * * POPULAR SOUND CALLS * * * ************************************************************************** * *HIGH PRIORITY OFF CODES, NOTHING SHOULD BEAT THESE CVSDOFF .WORD >F0FF|>800,>01,>8000,0 ;CVSD BACKGROUND LOOP OFF CVSDFOFF .WORD >F0FF|>800,>01,>8000,0 ;CVSD FOREGROUND LOOP OFF SOUNDOFF .WORD >F0FF|>800,>01,>8000,0 ;TURN SOUND SIDE OFF ALLOFF .WORD >F3FF|>800,>01,>8000,0 ;MUSIC AND EFFECTS OFF MUSICOFF .WORD >F3FF|>800,>01,>807E,0 ;TURN JUST MUSIC OFF MUSITOFF .WORD >F3FF|>800,>01,>8040,0 ;MUSIC TRANSITION OFF YAMOFF .WORD >F2FF|>800,>01,>807F,0 ;YAMAHA EFFECT OFF VOLUME0 .WORD >F3FE,>1,>802F,0 VOLUME1 .WORD >F3FE,>1,>802E,0 VOLUME2 .WORD >F3FE,>1,>802D,0 VOLUME3 .WORD >F3FE,>1,>802C,0 VOLUME4 .WORD >F3FE,>1,>802B,0 VOLUME5 .WORD >F3FE,>1,>802A,0 VOLUME6 .WORD >F3FE,>1,>8029,0 VOLUME7 .WORD >F3FE,>1,>8028,0 VOLUME8 .WORD >F3FE,>1,>8027,0 VOLUME9 .WORD >F3FE,>1,>8026,0 VOLUMEA .WORD >F3FE,>1,>8025,0 VOLUMEB .WORD >F3FE,>1,>8024,0 VOLUMEC .WORD >F3FE,>1,>8023,0 VOLUMED .WORD >F3FE,>1,>8022,0 VOLUMEE .WORD >F3FE,>1,>8021,0 VOLUMEF .WORD >F3FE,>1,>8020,0 TEMPO_UP .WORD >F2FE,>1,>8080,0 TEMPO_DOWN .WORD >F2FE,>1,>8081,0 .END