trog/TROGSND.ASM

460 lines
13 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 "TROGMACS.LIB"
.FILE 'TROGSND.ASM'
.TITLE 'GSP SOUND PROCESSOR VER. 3.0 2/9/90'
.WIDTH 132
.OPTION B,D,L,T
.MNOLIST
**************************************************************************
* *
* COPYRIGHT (C) 1990 MIDWAY MANUFACTURING COMPANY, *
* MANUFACTURERS OF BALLY/MIDWAY AMUSEMENT GAMES. *
* ALL RIGHTS RESERVED. *
* *
**************************************************************************
.INCLUDE "MPROCEQU.ASM" ;MPROC equates
.INCLUDE "GSPINC.ASM" ;GSP assembler equates
.INCLUDE "SYSINC.ASM" ;Zunit system equates
.INCLUDE "TROGEQU.ASM" ;AAH TROG
.TEXT
*
*SOUND PROCESSOR MAKES SOUNDS FOR N-CHANNELS (CURRENTLY 4):
*
* CHANNEL #0 CVSD SOUNDS
* CHANNEL #1 DAC A
* CHANNEL #2 DAC B
* CHANNEL #3 MUSIC
*
*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 = 1111IENNPPPPPPPP; I=1=NON-INTERRUPTABLE, E=1=NON-INT BY EQUAL
*NN=CHANNEL #(0-3);
*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
NCHAN EQU 4 ;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 0FE00H ;THIS IS THE ^RESET BIT
MUSICBIT EQU 0FD00H ;THIS IS THE YAMAHA SIDE STROBE
SOUNDBIT EQU 0FD00H ;THIS IS THE SOUND SIDE STROBE
*THESE STROBE EQUATES ARE FOR THE NARC SOUND CARD
***RESETBIT EQU 0FB00H ;THIS IS THE ^RESET BIT
***MUSICBIT EQU 0FD00H ;THIS IS THE YAMAHA SIDE STROBE
***SOUNDBIT EQU 0FE00H ;THIS IS THE SOUND SIDE STROBE
.BSS SNDSTR,NCHAN*SNDSIZ ;RESERVE STORAGE AREA
.BSS SNDEND,0 ;END OF SOUND PROCESSOR RAM
**************************************************************************
* *
* 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:
PULL 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 = 1111IENNPPPPPPPP; I=1=NON-INTERRUPTABLE, E=1=NON-INT BY EQUAL
*NN=CHANNEL #(0-3);
*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 22,A5
SRL 30,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
SNDUPX: RETS
*
*HARDWARE SOUND CALL
*A3=SOUND CODE B0-B7
*A5=SOUND CHANNEL #
*
SNDSND:
MMTM SP,A0,A3
MOVI 8,A0 ;SLOW DOWN FOR GRANNER & C0.
DSJS A0,$
SLL 24,A3
SRL 24,A3 ;STRIP OFF BITS
CMPI MUSICHAN,A5
JRNE SNDSND1
ADDI MUSICBIT,A3 ;PULL MUSIC SECTION INTERRUPT
JRUC SNDSND2
SNDSND1
ADDI SOUNDBIT,A3 ;PULL SOUND SECTION INTERRUPT
SNDSND2
MOVE A3,@SOUND ;HIT SOUND
MOVI 8,A0
DSJS A0,$ ;SLOW IT DOWN A BIT
ORI 0FF00h,A3 ;PUT OUT 1'S
MOVE A3,@SOUND
MMFM SP,A0,A3
RETS
*
*RESET SOUND BOARD, FULL RESET, CHECKSUM DINGS AND ALL
*
SNDRES:
MMTM SP,A0
MOVI RESETBIT,A0 ;HIT RESET BIT
MOVE A0,@SOUND
MOVI 100,A0 ;WAIT FOR IT TO CATCH
DSJS A0,$
MOVI 0FFFFh,A0 ;LET IT GO
MOVE A0,@SOUND
MMFM SP,A0
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
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 >F2FF|>800,>01,>807E,0 ;TURN JUST MUSIC OFF
MUSITOFF .WORD >F2FF|>800,>01,>8040,0 ;MUSIC TRANSITION OFF
YAMOFF .WORD >F3FF|>800,>01,>807F,0 ;YAMAHA EFFECT OFF
VOLUME0 .WORD >F3FE,>1,>402F,>806F,0
VOLUME1 .WORD >F3FE,>1,>402E,>806E,0
VOLUME2 .WORD >F3FE,>1,>402D,>806D,0
VOLUME3 .WORD >F3FE,>1,>402C,>806C,0
VOLUME4 .WORD >F3FE,>1,>402B,>806B,0
VOLUME5 .WORD >F3FE,>1,>402A,>806A,0
VOLUME6 .WORD >F3FE,>1,>4029,>8069,0
VOLUME7 .WORD >F3FE,>1,>4028,>8068,0
VOLUME8 .WORD >F3FE,>1,>4027,>8067,0
VOLUME9 .WORD >F3FE,>1,>4026,>8066,0
VOLUMEA .WORD >F3FE,>1,>4025,>8065,0
VOLUMEB .WORD >F3FE,>1,>4024,>8064,0
VOLUMEC .WORD >F3FE,>1,>4023,>8063,0
VOLUMED .WORD >F3FE,>1,>4022,>8062,0
VOLUMEE .WORD >F3FE,>1,>4021,>8061,0
VOLUMEF .WORD >F3FE,>1,>4020,>8060,0
TEMPO_UP
.WORD >F2FE,>1,>8080,0
TEMPO_DOWN
.WORD >F2FE,>1,>8081,0
.END