total-carnage/T2SND.ASM

541 lines
15 KiB
NASM
Raw Permalink Blame History

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

.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