$DAST=1 $DTHST=0 .NLIST CND .IF NE,$DAST .TITLE DASOUN - DELUXE ASTEROIDS SOUNDS .IFF .TITLE DASOUN - DEATH STAR SOUNDS .ENDC .REPT 0 ***************************************** * *POKEY SOUND SYSTEM CONTROL * * *PROGRAMMER:SHEPPERD *DELUXE ASTEROIDS/DEATH STAR DISKS 53,B42 *PROJECT 29803 *THIS ROUTINE COPIED FROM TRAP; *WHICH WAS COPIED FROM ALIENS *WHICH WAS COPIED FROM MISSILE COMMAND; *WHICH WAS COPIED FROM TUBE CHASE. THANKS OWEN. * *THIS THING EATS UP ABOUT 1/2 K OF ROM AND *32 BYTES OF RAM * *HARDWARE: A CORECTLY INSTALLED POKEY * *DESCRIPTION: THIS CONTAINS 2 ROUTINES: * 1) THE FIRST ROUTINE STARTS A SOUND. * IT MAY BE CALLED ANYTIME, BUT CERTAIN * PRIORITY RULES ON SOUNDS APPLY (SEE ROUTINE) * 2) THE SECOND MUST BE CALLED ONCE EVERY 16 MSEC * (OR 1 FRAME). THIS ROUTINE CONTINUES A SOUND. * IT ALSO SHUTS THINGS UP WHEN DONE. * ****************************************** * *PROGRAMMER: RICH ADAM * ****************************************** .ENDR .PAGE .RADIX 16 .ASECT .INCLUDE DSTDEC ;<<<<<<<<<<<<<<<<<<<<< .INCLUDE PG0123 ;<<<<<<<<<<<<<<<<<<<<<< .PAGE .SBTTL SOUND DESCRIPTION ;THE FOLLOWING MUST BE DEFINED SOME WHERE IN YOUR RAM ALLOCATION ;SOUND ROUTINE VARIABLES .ENABL AMA .RADIX 16. ;POINT: .BLKB 8 ;POINTER OFFSET INTO DATA TABLES(IF 0, CHANNEL NOT ACTIVE) ;CURRENT: .BLKB 8 ;OUTPUT VALUE ;FRAMES: .BLKB 8 ;FRAMES UNTIL NEXT CHANGE ;COUNT: .BLKB 8 ;COUNT OF TOTAL CHANGES ;MCOUNT: .BLKB ;MCRO COUNTER ;EACH TABLE ENTRY IS 4 BYTES DESCRIBING A SEQUENCE, CONSISTING OF: STVAL =1 ;VALUE TO START SEQUENCE FRCNT =0 ;# OF FRAMES BEFORE ANY CHANGE CHANGE =2 ;AMOUNT OF CHANGE NUMBER =3 ;TOTAL NUMBER OF CHANGES IN THIS SEQUENCE AUDF1 =POKEY AUDCTL =POKEY+8 .PAGE .SBTTL OFFSET MACROS FOR SOUND ROUTINES .MACRO OFFSET,LABEL SND.'LABEL==.-PNTRS+7 .IRPC X,<01234567> .IF DF,LABEL''X .BYTE LABEL''X-SOUND .IFF .BYTE 0 .ENDC .ENDR .ENDM ; ;THE ABOVE MACRO GENERATES THE OFFSETS FROM THE 'SOUND' BASE ADDRESS ;FOR A CHANNEL OF DATA. ;IF LESS THAN 4 CHANNELS ARE USED, THE REMAINING POINTERS ARE SET TO 0 ;A 0 VALUE POINTER INDICATES AN IDLE CHANNEL. ; ;EX: SOUND: .BYTE 0 ; ; CH1: .BYTE 0,45,0,1 ; CH2: .BYTE 0,45,0,2,3,7,9,1 ; ;BY CALLING 'OFFSET CH' , THE FOLLOWING WILL BE PLACED IN LINE ; .BYTE CH1-SOUND ; .BYTE CH2-SOUND ; .BYTE 0,0,0,0 ; .PAGE .SBTTL SOUND TABLES ; ;TABLES OF OFFSET POINTER FOR SOUNDS. (8 BYTES PER SOUND NUMBER) .IF NE,DEVSYS .ASECT .=5800 .IFF .CSECT DASOUN .ENDC .LIST MEB .NLIST BYT PNTRS: OFFSET T1 ;THUMP1 OFFSET T2 ;THUMP2 OFFSET LS ;LITTLE SAUCER OFFSET SF ;SAUCER FIRE OFFSET PF ;SHIP FIRE OFFSET EL ;XTRA LIFE OFFSET BS ;BIG SAUCER OFFSET DI ;DIAMOND ZAPPED. OFFSET BL ;SHIP BACK TO LIFE OFFSET HT ;ON THE HIGH SCORE TABLE OFFSET S ;SHIELDS OFFSET DS ;DEATH STAR APPEARANCE .IF NE,DEVSYS OFFSET NU OFFSET NU .ENDC .MACRO STB FCNT,START,CHNG,TOT .BYTE FCNT,START,CHNG,TOT .ENDM STB .MACRO REP N .IF NB, .IIF NE,N&-128.,.ERROR N ;TOO BIG .BYTE N .IFF .BYTE 1 .ENDC .ENDM .MACRO SEND .BYTE 0 .ENDM .MACRO MEND .BYTE 0,0 .ENDM .PAGE ;DATA STRUCTURE: ;A CHANNEL CONSISTS OF A SERIES OF BYTES. THE VERY FIRST ;BYTE IS A 'MACRO COUNT' NUMBER FROM 0-127. 0=END OF ;LIST, 1-127. IS THE NUMBER OF TIMES TO REPEAT THE FOLLOWING STRING(S) ;4 SOUND CONTROL BYTES FOLLOW THE COUNT. THE MEANING AND ;OFFSETS ARE: ; OFFSET MEANING ; 0 # OF FRAMES BEFORE NEXT CHANGE ; 1 STARTING VALUE OF SOUND (FREQ OR VOLUME) ; 2 AMOUNT BY WHICH TO CHANGE THE VALUE ; 3 TOTAL NUMBER OF CHANGES. ; ;AFTER THE WORK INDICATED BY THE ABOVE DESCRIBED 4 BYTES IN DONE, ;CONTROL IS PASSED TO THE NEXT 4 BYTES IN SEQUENCE. IF ;BYTE 0 OF THIS NEW GROUP IS NOT 0 THEN THE 4 BYTES ;ARE INTERPRETED AS DESCRIBED ABOVE. IF BYTE 0 IS 0 THEN ;IT MARKS AN END TO THE 'MACRO SEQUENCE', THE 'MACRO COUNT' IS ;DECREMENTED AND IF NOT 0 REPEATS THE SEQUENCE(S), WHEN THE ;'MACRO COUNT' IS EXHAUSTED THE 0 BYTE IS SKIPPED AND THE NEXT ;BYTE IS AGAIN INTERRPRETED AS A 'MACRO COUNT'. ;4 MACRO'S HAVE BEEN DEFINED TO ASSIST IN THE CREATION ;OF THE SOUND TABLE. THE SYNTAX FOR THESE ARE: ;REP N ;STB FCOUNT,SVAL,CHANG,TOTAL ;SEND ;MEND ; ;WHERE: N='MACRO COUNT' ; FCOUNT=# OF FRAMES BEFORE NEXT CHANGE ; SVAL=STARTING VALUE ; CHANG=AMOUNT TO CHANGE VALUE ; TOTAL=TOTAL # OF CHANGES ;I.E. ;CH0: REP 100. ;REPEAT THE FOLLOWING SEQUENCE 100 TIMES ; STB 1,4,1,10 ;START @ 4;EVERY INTERRUPT ADD 1, 10 TIMES ; STB 1,14,-1,10 ;START @ 14;EVERY INTERRUPT ADD -1,10 TIMES ; MEND ;END OF MACRO ;CH1: REP ;(REP DEFAULTS COUNT TO 1) ; STB 20,A8,0,1 ; ; MEND ;END OF SOUND GROUP .PAGE .SBTTL SOUND TABLES SOUND: .BYTE 0 ;MUST BE FIRST T16: REP STB 4,0E0,3,5 ;THUMP1 FREQ MEND T17: REP STB 4,0A8,-1,5 ;THUMP1 VOLUME MEND T26: REP STB 4,0D0,3,5 ;THUMP2 FREQ MEND T27=T17 ;THUMP2 VOLUME LS4: REP 127. ;LITTLE SAUCER FREQ SEQUENCE STB 1,4,1,10 STB 1,14,-1,10 MEND LS5: REP 127. ;LITTLE SUACER VOLUME SEQUENCE STB 20,0A2,0,1 MEND BS4: REP 127. ;BIG SUACER FREQ SEQUENCE STB 1,10,1,20 MEND BS5=LS5 SF2: REP STB 2,0C,1,18 ;SAUCER FIRE FREQUENCEY MEND SF3: REP STB 10,0A4,-1,3 ;SAUCER FIRE VOLUME MEND PF0: REP STB 1,4,1,40 ;PLAYER FIRE FREQ MEND PF1: REP STB 10,0A4,-1,4 ;PLAYER FIRE VOL. MEND EL6: REP STB 0F0,6,0,2 ;EXTRA LIFE FREQ MEND EL7: REP 0F ;EXTRA LIFE VOL STB 10,0A8,0,1 STB 10,0A0,0,1 MEND DI2: REP STB 2,50,1,70 ;DIAMOND SOUND FREQ MEND DI3: REP 7 STB 10,0A8,0,1 ;DIAMOND SOUND VOL STB 10,0A0,0,1 MEND BL4: REP 12. ;BACK TO LIFE SEQUENCES STB 2,0A,1,3 STB 4,0C,-1,2 MEND BL5: REP STB 18,0A0,1,5 STB 18,0A5,-1,5 MEND BL6: REP 24. STB 2,0A,1,2 STB 2,0B,0,2 MEND BL7=BL5 HT0: REP 10 ;ON THE HIGH SCORE TABLE STB 0C,21,0,1 STB 0C,18,0,1 SEND REP STB 2,20,10,0FF STB 4,30,2,30 MEND HT1: REP STB 30,21,1,8 SEND REP STB 80,84,1,4 STB 30,85,-1,4 MEND HT6=HT0 HT7: REP 4 STB 18,0A5,-1,4 STB 18,0A1,1,4 MEND DS6: REP 10 ;DEATH STAR APPEARANCE STB 0C,49,0,1 STB 0C,30,0,1 MEND DS7: REP 2 STB 0C0,0A4,0,1 MEND S0: REP ;SHIELDS STB 1,0F0,1,0F STB 1,0FF,-1,0F MEND S1: REP STB 1F,0A2,0,1 MEND .PAGE .SBTTL SOUND STARTER .CSECT DASOUN ;AT ENTRY: ;(Y)=SOUND NUMBER *8+7 ;A,Y USED (X PRESERVED) .ENABL LSB SNDOFF::BIT 1$ ;SEV (1$=RTS=60) CLC ; (THIS MAKES IT EASY LATER) BCC 4$ ;(ALWAYS) SNDPON::SEC ;TURN ON SOUND WITH PRIORITY BCS SNDOO ;(ALWAYS) SNDON:: CLC ;TURN ON SOUND ; BCC SNDOO ;(ALWAYS) SNDOO:: LDA NPLAYR ;ATTRACT MODE? BEQ SNDOFF ;YEP. TURN SOUNDS OFF INSTEAD CLV ;BE SURE THE V FLAG IS OFF 4$: TXA ;SAVE X PHA LDX #7 ;LOOP COUNTER 3$: BCC 5$ ;GO TURN IT ON LDA X,POINT ;CHANNEL BUSY? BNE 6$ ;YEP. LEAVE IT ALONE THEN 5$: LDA Y,PNTRS ;GET OFFSET BEQ 6$ ;NONE. LEAVE CHANNEL BVC 7$ ;NOT TO TURN OFF SOUND LDA #0 ;TURN SOUND OFF 7$: PHA ;NMI'S ARE RUNNING SO WE HAVE TO DO THE TURN ON LDA #0 ; IN A SPECIFIC ORDER. FIRST WE TURN OFF ANY STA X,POINT ; SOUNDS BY ZAPPING POINT. THEN WE SET 'MCOUNT' LDA #80 ; TO '80' TO SIGNAL CSOUND TO START A SOUND. STA X,MCOUNT ; 'MCOUNT' IS NOT DISTURBED UNLESS POINT IS PLA ; NOT ZERO. LASTLY WE SET POINT TO THE STA X,POINT ; REQUIRED OFFSET. CSOUND TAKES OVER ; FROM HERE 6$: DEY ;COUNT DEX ;COUNT BPL 3$ ;CONTINUE PLA ;RESTORE X AND EXIT TAX 1$: RTS .DSABL LSB .PAGE .SBTTL SOUND ROUTINE ; ;CONTINUES A PREVIOUSLY STARTED SOUND ; TO BE CALLED 4 TIMES PER FRAME. ;AT ENTRY: ;NO REQUIREMENTS ; ;AT EXIT: ;A,X,Y USED CSOUND:: LDX #7 ;8 ITEMS 4$: LDY X,POINT ;ANY SOUND? BEQ 6$ ;NO LDA X,MCOUNT ;ARE WE TO START ONE? BMI 11$ ;YES. GO START IT DEC X,FRAMES ;COUNT DOWN TIMER BNE 1$ ;CONTINUE DEC X,COUNT ;COUNT DOWN TOTAL COUNTER BEQ 2$ ;DONE LDA X,CURRENT ;CHANGE SOUND CLC ADC Y,SOUND+CHANGE ;BY ADDING CHANGE CODE JMP 5$ 2$: INY ;Y=Y+4 INY INY INY 7$: STY X,POINT LDA Y,SOUND+NUMBER STA X,COUNT ;RESET TOTAL COUNTER LDA Y,SOUND+STVAL 5$: STA X,CURRENT ;RESET VALUE LDA Y,SOUND+FRCNT STA X,FRAMES ;RESET TIMER BNE 1$ ;CONTINUE LDY X,MPNTR ;SET UP Y IN CASE OF RESTART DEC X,MCOUNT ;MACRO COUNT BNE 7$ ;RESTART LDY X,POINT INY ;SKIP OVER TERM BNE 11$ ;(ALWAYS) 10$: TAY ;THIS MAKES AN EASY EXIT 8$: STY X,POINT ;ZAP THE POINTER 6$: STY X,CURRENT ;ZAP SOUND TOO 1$: LDA X,CURRENT ;GET SOUND STA X,AUDF1 ;WRITE TO POKEY DEX ;COUNT BPL 4$ RTS ;EXIT (FALL THUR TO IDCYC) .PAGE 11$: LDA Y,SOUND ;GET COUNT BEQ 10$ ;END 9$: STA X,MCOUNT INY ;SKIP UP TO SOUND STY X,MPNTR ;SAVE POINTER BNE 7$ ;(ALWAYS) .SBTTL POKEY INITIALISE ROUTINE .CSECT ST1 ; ; ENTER THIS ROUTINE AT START OF GAME TO INITIALISE THE POKEY ; AND CLEAR THE TABLES INISOU::LDA I,0 LDX #7 1$: STA X,POINT DEX BPL 1$ STA AUDCTL RTS .END