NAM ROBOTRON SOUNDS VERSION 1.0 3-8-82 *COPYRIGHT WILLIAMS ELECTRONICS INC. 2084 *PROGRAMMERS: EUGENE P. JARVIS, SAM DICKER,RANDY PFEIFFER,JOHN KOTLARIK * PAUL G. DUSSAULT,CARY W. KOLKER,TIM MURPHY * AND A CAST OF THOUSANDS...... * NOGEN * *SYSTEM CONSTANTS * ROM EQU $F000 SOUND EQU $400 CKORG EQU $EF00 CHECKSUM PROG ORG ENDRAM EQU $7F VECTOR EQU $FFF8 RESET,INT VECTORS WVELEN EQU 72 BG1MAX EQU 29 MAX BACKGROUND INCREMENT HBLEN EQU 72 BG2MAX EQU 29 SP1SND EQU $0E SPINNER SOUND #1 CODE B2SND EQU $12 BONUS SOUND #2 CODE SP1MAX EQU 32 NIN EQU 5 FIF EQU 6 TAF EQU 34715!>1 NOTE TIMES TA EQU 36780!>1 TBF EQU 38967!>1 TB EQU 41284!>1 TC EQU 43739!>1 TCS EQU 46340!>1 TD EQU 49096!>1 TEF EQU 52015!>1 TE EQU 55108!>1 TF EQU 58385!>1 TFS EQU 61857!>1 TG EQU 65535!>1 * * * SCREAM EQUATES * ECHOS EQU 4 FREQ EQU 0 TIMER EQU 1 * *GLOBALS * ORG 0 BG1FLG RMB 1 BACKGROUND SOUND 1 BG2FLG RMB 1 BACKGROUND SOUND 2 SP1FLG RMB 1 SPINNER FLAG B2FLG RMB 1 BONUS #2 FLAG ORGFLG RMB 1 ORGAN FLAG HI RMB 1 RANDOM SEED LO RMB 1 RANDOM SEED XDECAY RMB 2 AMP0 RMB 1 * * *TEMPORARIES * TMPRAM EQU * TEMPORARY RAM TEMPX RMB 2 X TEMPS XPLAY RMB 2 XPTR RMB 2 TEMPA RMB 1 ACCA TEMP TEMPB RMB 1 LOCRAM EQU * * *GWAVE PARAMETERS * ORG LOCRAM GECHO RMB 1 ECHO FLAG GCCNT RMB 1 CYCLE COUNT GECDEC RMB 1 # OF DECAYS PER ECHO GDFINC RMB 1 DELTA FREQ INC GDCNT RMB 1 DELTA FREQ COUNT GWFRM RMB 2 WAVEFORM ADDRESS *TEMPORARY OR COMPUTED PARAMETERS PRDECA RMB 1 PRE-DECAY FACTOR GWFRQ RMB 2 FREQ TABLE ADDR FRQEND RMB 2 END ADDR FREQ TABLE WVEND RMB 2 WAVE END ADDR GPER RMB 1 PERIOD GECNT RMB 1 # OF ECHOES COUNTER FOFSET RMB 1 FREQUENCY OFFSET * *GWAVE TABLES * GWTAB RMB WVELEN WAVE TABLE * *VARIWAVE PARAMETERS * ORG LOCRAM LOPER RMB 1 LO PERIOD HIPER RMB 1 HIPERIOD LODT RMB 1 PERIOD DELTAS HIDT RMB 1 HIEN RMB 1 END PERIOD SWPDT RMB 2 SWEEP PERIOD LOMOD RMB 1 BASE FREQ MOD VAMP RMB 1 AMPLITUDE LOCNT RMB 1 PERIOD COUNTERS HICNT RMB 1 * SIREN AND BOMB RAM ORG LOCRAM TOP RMB 2 SWEEP RMB 2 SLOPE RMB 1 END2 RMB 2 TIME RMB 1 TABLE RMB 2 FREQZ RMB 1 * * KNOCKER RAM * ORG LOCRAM PERIOD RMB 1 AMP RMB 1 SNDTMP RMB 2 INDEX TMEP * * FLASH LOCAL RAM ORG LOCRAM FREQ1 RMB 1 FREQUENCY CONSTANT 1 FREQ2 RMB 1 FREQUENCY CONSTANT 2 FREQ3 RMB 1 FREQUENCY CONSTANT 3 FREQ4 RMB 1 FREQUENCY CONSTANT 4 DELTA1 RMB 1 DELTA AMPLITUDE 1 DELTA2 RMB 1 DELTA AMPLITUDE 2 DELTA3 RMB 1 DELTA AMPLITUDE 3 DELTA4 RMB 1 DELTA AMPLITUDE 4 FREQ1$ RMB 1 FREQUENCY COUNTER 1 FREQ2$ RMB 1 FREQUENCY COUNTER 2 FREQ3$ RMB 1 FREQUENCY COUNTER 3 FREQ4$ RMB 1 FREQUENCY COUNTER 4 CYCLE1 RMB 1 CYCLE CONSTANT 1 CYCLE2 RMB 1 CYCLE CONSTANT 2 CYCLE3 RMB 1 CYCLE CONSTANT 3 CYCLE4 RMB 1 CYCLE CONSTANT 4 DFREQ1 RMB 1 DELTA FREQUENCY 1 DFREQ2 RMB 1 DELTA FREQUENCY 2 DFREQ3 RMB 1 DELTA FREQUENCY 3 DFREQ4 RMB 1 DELTA FREQUENCY 4 EFREQ1 RMB 1 END FREQUENCY 1 EFREQ2 RMB 1 END FREQUENCY 2 EFREQ3 RMB 1 END FREQUENCY 3 EFREQ4 RMB 1 END FREQUENCY 4 CYCL1$ RMB 1 CYCLE COUNTER 1 CYCL2$ RMB 1 CYCLE COUNTER 2 CYCL3$ RMB 1 CYCLE COUNTER 3 CYCL4$ RMB 1 CYCLE COUNTER 4 SNDX1 RMB 1 RANDOM EQU LO SINGLE BYTE RANDOM ORG LOCRAM+1 FREQ$ RMB 1 START FREQUENCY C$FRQ RMB 1 CYCLES AT FREQUENCY D$FRQ RMB 1 DELTA FREQUENCY E$FRQ RMB 1 END FREQUENCY C$AMP RMB 1 CYCLES AT AMPLITUDE D$AMP RMB 1 DELTA AMPLITUDE C$AMP$ RMB 1 CYCLE COUNTER C$FRQ$ RMB 1 CYCLE COUNTER * *NOISE/CROWD ROAR ROUTINE PARAMETERS * ORG LOCRAM DECAY RMB 1 NAMP RMB 1 CYCNT RMB 1 NFRQ1 RMB 2 NFFLG RMB 1 LFREQ RMB 1 DFREQ RMB 1 GALPAM EQU * CYCNT2 RMB 1 NAMP2 RMB 1 DECAY2 RMB 1 NFFLG2 RMB 1 NFR2 RMB 1 GALCNT RMB 1 WHIS RMB 1 CROWD ROAR AMP WFRQ RMB 1 CROWD WHISTLE FREQ WCNT RMB 1 WHISTLE PASSCOUNTER PTRHI RMB 2 WHIS ADR PTR WFRQ2 RMB 1 WCNT2 RMB 1 CURVAL RMB 1 WHISTLING NOISE OUTPUT ATP RMB 1 INTERM NOISE VAL MINWIS RMB 1 MIN WHISTLE FREQ CY2 RMB 1 NOISE CYCLE COUNTER DFRQ RMB 1 WHISTLE FREQ CHANGE DFRQ2 RMB 1 INIT WHISTLE FREQ CHANGE NNOIS RMB 1 NEXT NOISE VALUE NFRQ RMB 1 NOISE FREQ NFRQ2 RMB 1 INIT NOISE FREQ RCNT2 RMB 1 * *FILTERED NOISE ROUTINE PARAMETERS * ORG LOCRAM FMAX RMB 1 MAXIMUM_FREQUENCY FHI RMB 1 FREQUENCY FLO RMB 1 LOFRQ RMB 1 SAMPC RMB 2 SAMPLE COUNT FDFLG RMB 1 FREQUENCY DECREMENT FLAG DSFLG RMB 1 DISTORTION FLAG * *SCREAM TABLES * ORG LOCRAM STABLE RMB 2*ECHOS SCREAM TABLE SRMEND EQU * * *ORGAN PARAMETERS * ORG LOCRAM DUR RMB 2 NOTE DURATION OSCIL RMB 1 OSCILLATORS RDELAY RMB 60 RAM DELAY LOAD * * CHECKSUM CALCULATOR & RELOCATOR * ORG CKORG CKSUM LDX #$FFFF INDEX TO END OF ROM CLRB ZERO CHECKSUM CKSUM1 ADCB 0,X ADD IN PROGRAM BYTE DEX TO NEXT BYTE CPX #$F000 DONE YET? BNE CKSUM1 NOPE... STAB 0,X SAVE CHECKSUM AT BEGINNING WAI TURN OFF LEDS FROM RMB 2 FOR POINTER TO RMB 2 FOR POINTER * * MAIN PROGRAM * ORG ROM FCB $76 CHECKSUM BYTE * FCC "(C)1982 WILLIAMS ELECTRONICS" * SETUP SEI SET INTERRUPT MASK LDS #ENDRAM INITIALIZE STACK POINTER LDX #SOUND INDEX TO PIA CLR 1,X ACCESS DDRA CLR 3,X ACCESS DDRB LDAA #$FF PA0-PA7 STAA 0,X SET SIDE A AS OUTPUTS CLR 2,X SET B SIDE AS INPUTS LDAA #$37 CB2 LOW, IRQ ALLOWED STAA 3,X PROGRAM B CONTROL REG LDAA #$3C CA2 SET INIT HIGH, NO IRQS STAA 1,X PROGRAM A SIDE STAA HI START RANDOM GENERATOR CLRA STAA B2FLG STAA BG1FLG STAA BG2FLG STAA SP1FLG STAA ORGFLG CLI CLEAR INTERRUPTS BRA * WAIT FOR INTERRUPT * * * THREE OSCILLATOR SOUND GENERATOR * PLAY STX XPLAY SAVE CURRENT INDEX LDX #DECAYZ SET TO MAXIMUM AMPLITUDE STX XDECAY AND SAVE LDAA #$80 LOAD ZERO AMPLITUDE PLAY1 LDAB FREQ4 CHECK WHITE NOISE COUNTER BPL PLAY3 NOT IN WHITE MODE LDAB RANDOM GET RANDOM NUMBER LSRB REDUCE IT LSRB LSRB INCB NOW NON-ZERO PLAY2 DECB TIME OUT COUNT BNE PLAY2 PLAY3 DEC FREQ1$ COUNT DOWN OSC. 1 BEQ PLAY7 DO AN UPDATE DEC FREQ2$ COUNT DOWN OSC. 2 BEQ PLAY8 DO AN UPDATE DEC FREQ3$ COUNT DOWN OSC. 3 BEQ PLAY9 DO AN UPDATE DEC FREQ4$ COUNT DOWN WHITE NOISE BNE PLAY1 DO THEM AGAIN LDAB FREQ4 CHECK WHITE NOISE CONSTANT BEQ PLAY1 FORGET IT ANDB #$7F STRIP FLAG BIT STAB FREQ4$ SAVE WHITE NOISE COUNT LDAB RANDOM GET CURRENT RANDOM ASLB DOUBLE ADDB RANDOM TRIPLE ADDB #$0B ADD IN 11 STAB RANDOM VOILA...NEW RANDOM NUMBER DEC CYCL4$ COUNT DOWN DECAY BNE PLAY6 DON'T DECAY LDAB CYCLE4 RELOAD COUNT STAB CYCL4$ AND SAVE LDX XDECAY GET DECAY JUMP POINTER DEX MOVE TO LESS AMPLITUDE CPX #RDECAY+1 DONE? BEQ PLAY12 YUP...BYE BYE STX XDECAY SAVE NEW POINTER PLAY6 LDAB RANDOM GET RANDOM AMPLITUDE BMI PLAY6A SKIP IF NEGATIVE ANDB DELTA4 REDUCE AMPLITUDE ANDB #$7F STRIP SIGN BIT BRA PLAY6B PLAY6A ANDB DELTA4 REDUCE AMPLITUDE ANDB #$7F REMOVE SIGN BIT NEGB NEGATE PLAY6B PSHA ABA ADD WHITE NOISE TAB PULA LDX XDECAY GET DECAY POINTER JSR 0,X OUTPUT NOISE BRA PLAY1 DO SOME MORE PLAY7 LDX #FREQ1 INDEX TO SET 1 BRA PLAY10 PLAY8 LDX #FREQ2 INDEX TO SET 2 BRA PLAY10 PLAY9 LDX #FREQ3 INDEX TO SET 3 PLAY10 TST 24,X CHECK CYCLES AT FREQUENCY BEQ PLAY11 ZERO, DON'T CHANGE DEC 24,X COUNT DOWN BNE PLAY11 NOT TIME TO CHANGE... LDAB 12,X LOAD CYCLES AT FREQUENCY STAB 24,X SAVE IN COUNTER LDAB 00,X GET CURRENT FRQUENCY ADDB 16,X ADD DELTA CMPB 20,X COMPARE TO END BEQ PLAY12 DONE... STAB 00,X SAVE NEW CURRENT FREQUENCY PLAY11 LDAB 0,X GET CURRENT FREQUENCY STAB 8,X SAVE IN FREQUENCY COUNTER ADDA 4,X ADD IN AMPLITUDE NEG 4,X NEGATE AMPLITUDE TAB SAVE DATA LDX XDECAY INDEX TO DECAY JSR 0,X OUTPUT SOUND JMP PLAY1 REPEAT PLAY12 LDX XPLAY RESTORE INDEX RTS * * ECHO AND DECAY ROUTINE * RDECAY LSRB LSRB LSRB LSRB LSRB LSRB LSRB LSRB DECAYZ STAB SOUND RTS * * 3 OSCILLATOR CALLING ROUTINES * THNDR LDX #VEC01 THUNDER SOUND THNDR1 LDAB #28 NEED TO TRANSFER JSR TRANS 28 BYTES FOR PLAY JSR PLAY NOW PLAY IT RTS SND2 LDX #VEC02 SOUND 2 BRA THNDR1 SND3 LDX #VEC03 SOUND 3 BRA THNDR1 SND4 LDX #VEC04 SOUND 4 BRA THNDR1 SND5 LDX #VEC05 SOUND 5 BRA THNDR1 SND16 LDX #VEC016 BRA THNDR1 SND17 LDX #VEC017 BRA THNDR1 * * * PROGRESSIVE PITCH BONUS COUNTDOWN * BONUS$ LDX #$0060 PROGRESSIVE SINGLE FREQUENCY LDAA 0,X GET CURRENT FREQUENCY SUBA #$02 NOW HIGHER STAA 0,X SAVE NEW FREQUENCY JSR MOVE SET UP FOR SING JMP SING PLAY IT * * DIVING PLANE SOUND * PLANE LDX #$0001 SET FOR SHORT HALF CYCLE STX FREQ1 SAVE VALUE LDX #$0380 SET FOR LONG HALF CYCLE STX FREQ3 SAVE VALUE PLANE1 CLR SOUND SEND OUT ZEROES LDX FREQ1 GET LOW HALF CYCLE DATA INX INCREASE HALF CYCLE STX FREQ1 SAVE NEW VALUE PLANE2 DEX COUNT DOWN BNE PLANE2 COM SOUND SEND OUT ONES LDX FREQ3 GET HIGH HALF CYCLE DATA PLANE3 DEX COUNT DOWN BNE PLANE3 BRA PLANE1 * * SIREN AIR RAID * ZIREN LDAA #$FF STAA TOP LDX #$FEC0 STX SWEEP LDAA #$20 LDX #$FFE0 BSR ZIREN0 LDAA #$1 LDX #$44 ZIREN0 STAA SLOPE STX END2 ZIREN1 LDX #$10 ZIREN2 BSR ZIRLOP LDAA TOP+1 ADDA SWEEP+1 STAA TOP+1 LDAA TOP ADCA SWEEP STAA TOP DEX BNE ZIREN2 LDAA SWEEP+1 ADDA SLOPE STAA SWEEP+1 BCC ZIREN5 INC SWEEP ZIREN5 LDX SWEEP CPX END2 BNE ZIREN1 RTS *FLAT TRIANGLE LOOP ZIRLOP CLRA ZIRLP1 STAA SOUND ADDA #$20 BCC ZIRLP1 BSR ZIRT LDAA #$E0 ZIRLP4 STAA SOUND SUBA #$20 BCC ZIRLP4 ZIRT LDAB TOP ZIRLP2 LDAA #$2 ZIRLP3 DECA BNE ZIRLP3 DECB BNE ZIRLP2 RTS * * THE BOMB OOOOOH NOOOOO! WHIST LDAA #$80 STAA FREQZ LDAA #SINTBL/$100 STAA TABLE WHIST0 LDAA #$80 STAA TEMPA WHIST1 LDAA #18 WHIST2 DECA BNE WHIST2 LDAA TIME ADDA FREQZ STAA TIME LSRA LSRA LSRA ADDA #SINTBL!.$FF STAA TABLE+1 LDX TABLE LDAA ,X STAA SOUND DEC TEMPA BNE WHIST1 DEC FREQZ LDAA FREQZ CMPA #$20 BNE WHIST0 RTS * SINE TABLE SINTBL FCB $80,$8C,$98,$A5,$B0,$BC,$C6,$D0 FCB $DA,$E2,$EA,$F0,$F5,$FA,$FD,$FE FCB $FF,$FE,$FD,$FA,$F5,$F0,$EA,$E2 FCB $DA,$D0,$C6,$BC,$B0,$A5,$98,$8C FCB $80,$73,$67,$5A,$4F,$43,$39,$2F FCB $25,$1D,$15,$0F,$0A,$05,$02,$01 FCB $00,$01,$02,$05,$0A,$0F,$15,$1D FCB $25,$2F,$39,$43,$4F,$5A,$67,$73 * * KNOCKER ROUTINE * KNOCK CLR SOUND+2 FULL BLAST LDX #KNKTAB STX SNDTMP SQLP LDX SNDTMP RESTORE X REG LDAA ,X GET PERIOD BEQ END END ON ZERO LDAB 1,X GET AMP ANDB #$F0 STAB AMP LDAB 1,X INX INX STX SNDTMP SAVE X STAA PERIOD ANDB #$F LP0 LDAA AMP STAA SOUND LDAA PERIOD LP1 LDX #5 DELAY LP11 DEX BNE LP11 DECA BNE LP1 CLR SOUND LDAA PERIOD LP2 LDX #5 DELAY LP22 DEX BNE LP22 DECA BNE LP2 DECB BNE LP0 BRA SQLP END LDAA #$80 OVERRIDE OFF STAA SOUND+2 RTS * * * KNOCKER PATTERN * KNKTAB FDB $01FC,$02FC,$03F8,$04F8,$06F8,$08F4,$0CF4 FDB $10F4,$20F2,$40F1,$60F1,$80F1,$A0F1,$C0F1,0 * * * FUNNY "ELECTRIC SOUND" * SUPPOSED TO GENERATE A PHASED OUTPUT AT * A CHANGING FREQUENCY. IT DOESN'T, AND * I'M NOT SURE EXACTLY WHAT IT DOES DO. * BEST LEAVE THIS ALONE. * BONUS DEC SNDX1 BRA SND1$ SND1 LDAB #$A0 STAB SNDX1 SND1$ LDAA #$04 STAA FREQ2 SND1$$ LDAA #$9F LDAB SNDX1 SND1A LDX #$01C0 SND1B DEX BEQ SND1E FCB $F7 "STAB" FDB FREQ1 STAA SOUND SND1C DEX BEQ SND1E DEC FREQ1 BNE SND1C DEX BEQ SND1E STAB FREQ1 COM SOUND SND1D DEX BEQ SND1E DEC FREQ1 BNE SND1D BRA SND1B SND1E SUBB FREQ2 CMPB #$10 BHI SND1A RTS START LDAB #$11 STAB SNDX1 LDAA #$FE STAA FREQ2 BRA SND1$$ * * SINGLE OSCILLATOR SOUND CALLS * PERK LDX #VEC01X BRA PERK$1 PERK1 JSR MOVE JSR SING RTS ATARI LDX #VEC02X BRA PERK1 SIREN LDAB #$FF STAB AMP0 SIREN1 LDX #VEC03X BSR PERK1 LDX #VEC04X BSR PERK1 DECB BNE SIREN1 RTS ORRRR LDX #VEC05X BRA PERK1 PERK$ LDX #VEC07X PERK$1 BSR PERK1 BSR ECHO BRA PERK$1 HSTD LDAA #$FF STAA AMP0 LDX #VEC08X BRA PERK$1 PERK$$ LDAA #$FF STAA AMP0 LDX #VEC06X BRA PERK$1 * * RANDOM SQUIRTS * SQRT LDAB #$30 SQRT1 LDX #VEC09X BSR MOVE SQRT2 LDAA RANDOM ASLA ADDA RANDOM ADDA #$0B STAA RANDOM LSRA LSRA ADDA #$0C STAA FREQ$ BSR SING DECB BNE SQRT2 RTS * * ECHO FUNCTION * ECHO LDAA AMP0 SUBA #$08 BPL ECHO1 STAA AMP0 RTS ECHO1 PULA PULA RTS * * MOVE PARAMETERS * MOVE LDAA 0,X STAA FREQ$ LDAA 1,X STAA C$FRQ LDAA 2,X STAA D$FRQ LDAA 3,X STAA E$FRQ LDAA 4,X STAA C$AMP LDAA 5,X STAA D$AMP RTS * * DELTA F, DELTA A ROUTINE * SING LDAA AMP0 GET STARTING AMPLITUDE SING$ PSHB SAVE B LDAB C$AMP GET CYCLES AT AMPLITUDE STAB C$AMP$ SAVE AS COUNTER LDAB C$FRQ GET CYCLES AT FREQUENCY STAB C$FRQ$ SAVE AS COUNTER SING1 COMA INVERT AMPLITUDE LDAB FREQ$ GET FREQUENCY COUNTER STAA SOUND OUTPUT TO D/A SING2 DECB BNE SING2 COMA INVERT AMPLITUDE LDAB FREQ$ GET FREQUENCY COUNTER BRA *+2 -I INX -I DEX -I--- SYNC, 20 CYCLES INX -I DEX -I STAA SOUND OUTPUT TO D/A SING3 DECB BNE SING3 DEC C$FRQ$ CHECK CYCLES AT FREQUENCY BEQ SING4 GO CHANGE FREQUENCY DEC C$AMP$ CHECK CYCLES AT AMPLITUDE BNE SING1 ALL OK, GO OUTPUT COMA INVERT AMPLITUDE LDAB C$AMP GET CYCLES AT AMPLITUDE STAA SOUND OUTPUT TO D/A STAB C$AMP$ SAVE AS COUNTER LDAB FREQ$ GET FREQUENCY COUNT ADDA D$AMP ADD AMPLITUDE DELTA BMI SING6 RETURN FROM SUBROUTINE NOP SYNC, 2 CYCLES BRA SING5 SING4 INX -I DEX -I--- SYNC, 10 CYCLES NOP -I COMA INVERT AMPLITUDE LDAB C$FRQ GET CYCLES AT FREQUENCY STAA SOUND OUTPUT TO D/A STAB C$FRQ$ SAVE AS COUNTER LDAB FREQ$ GET FREQUENCY COUNT SUBB D$FRQ SUBTRACT FREQUENCY DELTA CMPB E$FRQ COMPARE TO END FREQUENCY CMPB E$FRQ SYNC, 3 CYCLES BEQ SING6 RETURN FROM SUBROUTINE SING5 STAB FREQ$ SAVE FREQUENCY COUNT SUBB #$05 SYNC TO FREQUENCY COUNTDOWN BRA SING2 JUMP INTO COUNTDOWN LOOP SING6 PULB RESTORE B RTS * * SNDTBL FCB $DA,$FF,$DA,$80,$26,$01,$26,$80 FCB $07,$0A,$07,$00,$F9,$F6,$F9,$00 NOTTBL FCB $3A,$3E,$50,$46,$33,$2C,$27,$20 FCB $25,$1C,$1A,$17,$14,$11,$10,$33 WAVFRM FCB $08,$03,$02,$01,$02,$03,$04,$05 FCB $06,$0A,$1E,$32,$70,$00 VEC01 FDB $FFFF,$FF90,$FFFF,$FFFF,$FFFF FDB $FF90,$FFFF,$FFFF,$FFFF,$FFFF FDB $0000,$0000,$0000,$0000 VEC02 FDB $4801,$0000,$3F3F,$0000,$4801 FDB $0000,$0108,$0000,$8101,$0000 FDB $01FF,$0000,$0108,$0000 VEC03 FDB $0110,$0000,$3F3F,$0000,$0110 FDB $0000,$0505,$0000,$0101,$0000 FDB $31FF,$0000,$0505,$0000 VEC04 FDB $3000,$0000,$7F00,$0000,$3000 FDB $0000,$0100,$0000,$7F00,$0000 FDB $0200,$0000,$0100,$0000 VEC05 FDB $0400,$0004,$7F00,$007F,$0400 FDB $0004,$FF00,$00A0,$0000,$0000 FDB $0000,$0000,$FF00,$00A0 VEC06 FDB $0C68,$6800,$071F,$0F00,$0C80 FDB $8000,$FFFF,$FF00,$0000,$0000 FDB $0000,$0000,$FFFF,$FF00 VEC016 FDB $0104,$0000,$3F7F,$0000,$0104 FDB $0000,$05FF,$0000,$0100,$0000 FDB $4800,$0000,$05FF,$0000 VEC017 FDB $0280,$0030,$0A7F,$007F,$0280 FDB $0030,$C080,$0020,$0110,$0015 FDB $C010,$0000,$C080,$0000 VEC01X FDB $FF01,$02C3,$FF00 VEC02X FDB $0103,$FF80,$FF00 VEC03X FDB $2003,$FF50,$FF00 VEC04X FDB $5003,$0120,$FF00 VEC05X FDB $FE04,$0204,$FF00 VEC06X FDB $4803,$010C,$FF00 VEC07X FDB $4802,$010C,$FF00 VEC08X FDB $E001,$0210,$FF00 VEC09X FDB $50FF,$0000,$6080 VEC10X FDB $FF02,$0106,$FF00 * *VARI LOADER * VARILD TAB ASLA X2 ASLA X4 ASLA X8 ABA X9 LDX #LOCRAM STX XPTR SET XSFER LDX #VVECT JSR ADDX LDAB #9 GET COUNT VTRAN JMP TRANS * *VARIABLE DUTY CYCLE SQUARE WAVE ROUTINE * VARI LDAA VAMP STAA SOUND VAR0 LDAA LOPER STAA LOCNT LDAA HIPER STAA HICNT V0 LDX SWPDT V0LP LDAA LOCNT LO CYCLE COM SOUND V1 DEX BEQ VSWEEP DECA BNE V1 COM SOUND LDAA HICNT HI CYCLE V2 DEX BEQ VSWEEP DECA BNE V2 BRA V0LP LOOP BACK VSWEEP LDAA SOUND BMI VS1 COMA VS1 ADDA #0 STAA SOUND OUTPUT LDAA LOCNT ADDA LODT STAA LOCNT LDAA HICNT ADDA HIDT STAA HICNT CMPA HIEN BNE V0 LDAA LOMOD BEQ VARX ADDA LOPER STAA LOPER BNE VAR0 VARX RTS * *LAUNCH * LAUNCH LDAA #$FF STAA DFREQ LDAA #$60 LDAB #$FF BRA LITEN * *LIGHTNING * LITE LDAA #1 STAA DFREQ LDAB #3 BRA LITEN * *APPEAR * APPEAR LDAA #$FE STAA DFREQ LDAA #$C0 LDAB #$10 BRA LITEN * *LIGHTNING+APPEAR NOISE ROUTINE * LITEN STAA LFREQ LDAA #$FF HIGHEST AMP STAA SOUND STAB CYCNT LITE0 LDAB CYCNT LITE1 LDAA LO GET RANDOM LSRA LSRA LSRA EORA LO LSRA ROR HI ROR LO BCC LITE2 COM SOUND LITE2 LDAA LFREQ COUNT FREQ LITE3 DECA BNE LITE3 DECB COUNT CYCLES BNE LITE1 LDAA LFREQ ADDA DFREQ STAA LFREQ BNE LITE0 RTS * *TURBO * TURBO LDAA #$20 STAA CYCNT STAA NFFLG LDAA #$1 LDX #1 LDAB #$FF BRA MOISE * *WHITE NOISE ROUTINE *X=INIT PERIOD, ACCB=INIT AMP, ACCA DECAY RATE *CYCNT=CYCLE COUNT, NFFLG= FREQ DECAY FLAG * MOISE STAA DECAY MOISE0 STX NFRQ1 MOIS00 STAB NAMP LDAB CYCNT MOISE1 LDAA LO GET RANDOM BIT LSRA LSRA LSRA EORA LO LSRA ROR HI ROR LO LDAA #$0 BCC MOISE2 LDAA NAMP MOISE2 STAA SOUND LDX NFRQ1 INCREASING DELAY MOISE3 DEX BNE MOISE3 DECB FINISH CYCLE COUNT? BNE MOISE1 NO LDAB NAMP DECAY AMP SUBB DECAY BEQ MSEND LDX NFRQ1 INC FREQ INX LDAA NFFLG DECAY FREQ? BEQ MOIS00 NO BRA MOISE0 MSEND RTS * * *CROWD ROAR CDR LDX #WS1 1ST WHISTLE PARAMS STX PTRHI JSR WISLD LDX #$A500 SEED STX HI LDX #CR1 1ST CROWD ROAR NOISE PARAMS JSR NOISLD JSR NINIT LDX #CR2 JSR NOISLD JMP NINIT2 *WHISTLE PARAMS WS1 FCB $90,$10,2,$14,$40 FCB $B4,$40,$FF,$14,$30 FCB $D0,$32,$2,$10,$60 FCB $EE,$20,2,8,$54 FCB $E9,$54,$FF,$20,$28 FCB $C0,$30,2,$14,$58 FCB $AC,$20,$2,$8,$58 FCB $A6,$58,$FF,$18,$22 FCB 0 CR1 FCB $30,$10,$FC,0,1 CR2 FCB $30,$FC,1,0,1 * * *WHITE NOISE ROUTINE *NFRQ=INIT PERIOD, NAMP=INIT AMP, DECAY AMPLITUDE RATE *CYCNT=CYCLE COUNT, NFFLG= FREQ DECAY FLAG *NFFLG=0 NO FREQ CHANGE;=POS DECAY;=MINUS INC FREQ *NOISE LOAD PROG-ENTER WITH XREG POINTING TO DATA * NOISLD LDAA X STAA CY2 LDAA 1,X STAA NAMP LDAA 2,X STAA DECAY LDAA 3,X STAA NFFLG LDAA 4,X STAA NFRQ2 NEND RTS * *LOAD NOISE AND GO * NOISLG BSR NOISLD * *NOISE INIT * NOIN BSR NSUB CY2&NFRQ2 TO CYCNT&NFRQ * *NOISE LOOP * NO1 BSR RNT FREQ CHECK LDAA NFRQ FREQ REINITED? CMPA NFRQ2 BNE NO1 IF NOT KEEEP DELAYING ROLB RESTORE MAX AMPLITUDE TO NOISE STAB SOUND OUTPUT TO DAC BSR NOISE1 PREPARE NEXT RAND NO BSR NOISE2 BSR RNA AMPLITUDE &CYCL3 COUNT CECK TST NAMP SEE IF DONE BEQ NEND RTS IF FINISHED TST CYCNT SEE IF NEXT FREQ BNE NO1 IF NOT GO FREQ DELAY LOOP TST NFFLG SEE IF SWEEP MODE BEQ NO1 IF NO SWEEP GO DELAY BMI NO3 SWEEP DOWN INC NFRQ2 BRA NO1 NO3 DEC NFRQ2 DEC NFRQ BRA NO1 NSUB CLR CYCNT LDAA NFRQ2 STAA NFRQ NOISE FREQ CLR NNOIS RTS * 23 CYCLES FOR EACH SUBROUTINE PLUS CALLING OVERHEAD * * NOISE1 LDAA LO GET RANDOM BIT LSRA LSRA LSRA EORA LO STAA ATP INTERMED RAND NO INX ANDA #$7 FOR 3 BIT RANDOM NO * RTS * NOISE2 LDAA ATP LSRA ROR HI ROR LO LDAA #$0 BCC NOISE3 LDAA NAMP NOISE3 STAA NNOIS NEXT NOISE VALUE * RTS * RNT LDAA NFRQ2 NOISE FREQ DEC NFRQ BEQ NW0 INX DEX TEQ BRA NNW1 NW0 STAA NFRQ REINIT FREQ LDAB NNOIS SAVE NEXT NOISE VAL IN B REG LSRB HALF AMPLITUDE INC CYCNT NOISE CYCLE COUNT AT NAMP * NNW1 RTS * RNA LDAA CY2 NOISE AMPL CHANGE CMPA CYCNT BEQ NW2 INX DEX BRA NW3 TEQ NW2 CLR CYCNT LDAA NAMP SUBA DECAY STAA NAMP * NW3 RTS * * NOISE WITH WHISTLE MAIN LOOP NINIT CLR WFRQ CLR DFRQ LDAA #$E CYCLE OFFSET FOR WHISTLE STAA WCNT CLR CURVAL CLR WHISTLE VALUES NINIT2 BSR NSUB CLR CYCNT AND INIT FREQ WIN BSR NOISE1 JSR TRIDR BSR NOISE2 JSR TRIDR BSR RNT BSR TRIDR BSR RNA BSR TRIDR BSR TRICNT BSR TRIDR BSR TRIFRQ BSR TRIDR BSR NNW BRA WIN * TRICNT LDAA WCNT2 #CYCLES AT WHISTLE FREQ DEC WCNT BEQ NW4 FCB $B6 LDAA EXTENDED FDB NAMP BNE NW5 TEQ BRA NSEND END NOISE NW4 STAA WCNT LDAA WFRQ ADDA DFRQ STAA WFRQ * NW5 RTS * TRIFRQ LDAA WFRQ WHISTLE END TEST CMPA MINWIS BEQ NW6 INX TEQ LDAA NAMP END TEST BNE NW7 TEQ BRA PEND END NOISE NW6 CLR WFRQ TURN OFF WHISTLE CLR DFRQ CLR CURVAL LDX PTRHI SET UP FOR NEXT WHISTLE WISLD LDAA X STAA WHIS BEQ NW7 LDAA 1,X STAA WFRQ2 LDAA 2,X STAA DFRQ2 LDAA 3,X STAA WCNT2 LDAA 4,X STAA MINWIS LDAA #5 JSR ADDX STX PTRHI * NW7 RTS PEND PULA PULA STACK ADJ RTS * NNW LDAA WHIS WHISTLE INIT BEQ NW8 ALREADY INITED CMPA NAMP BNE NW9 BRA WINIT GO INIT WHISTLE NW8 INX DEX TEQ NW9 RTS WINIT CLR WHIS LDAA WFRQ2 STAA WFRQ LDAA DFRQ2 STAA DFRQ RTS ****************** TRIDR LDAA CURVAL ADDA WFRQ STAA CURVAL BPL GO COMA GO ABA STAA SOUND NSEND RTS * * *BACKGROUND 1 ROUTINE * BG1 LDAB #1 STAB BG1FLG LDX #BG1TB BRA FNLOAD * *THRUST * THRUST LDX #THTB BRA FNLOAD * *CANNON * CANNON LDX #CANTB BRA FNLOAD * FNTAB EQU * BG1TB FCB 0,0,0,$01,0,00 THTB FCB 0,0,0,3,00,00 CANTB FCB 1,0,1,$FF,3,$E8 DEFENDER SND #$17 HBMBTB FCB 1,1,1,$40,$10,00 RAIN FCB 1,$80,1,$40,$FF * HBOMB LDX #HBMBTB * *LOADER * FNLOAD LDAA ,X STAA DSFLG DISTORTION FLAG LDAA 1,X STAA LOFRQ LDAA 2,X FREQ DECAY FLAG LDAB 3,X INIT MAX FREQ LDX 4,X SAMPLE COUNT * *FILTERED NOISE ROUTINE *X=SAMPLE COUNT, ACCB=INITIAL MAX FREQ *ACCA=FREQ DECAY FLAG ,DSFLG=DISTORTION FLAG * FNOISE STAA FDFLG STAB FMAX STX SAMPC CLR FLO FNOIS0 LDX SAMPC LDAA SOUND FNOIS1 TAB NEXT RANDOM NUMBER LSRB LSRB LSRB EORB LO LSRB ROR HI ROR LO LDAB FMAX SET FREQ TST DSFLG BEQ FNOIS2 ANDB HI DISTORT FREQUENCY ADDB LOFRQ LO FREQ MIN FNOIS2 STAB FHI LDAB FLO CMPA LO BHI FNOIS4 FNOIS3 DEX SLOPE UP BEQ FNOIS6 STAA SOUND ADDB FLO ADCA FHI BCS FNOIS5 CMPA LO BLS FNOIS3 BRA FNOIS5 FNOIS4 DEX SLOPE DOWN BEQ FNOIS6 STAA SOUND SUBB FLO SBCA FHI BCS FNOIS5 CMPA LO BHI FNOIS4 FNOIS5 LDAA LO STAA SOUND BRA FNOIS1 FNOIS6 LDAB FDFLG BEQ FNOIS1 LDAA FMAX DECAY MAX FREQ LDAB FLO LSRA RORB LSRA RORB LSRA RORB COMA NEGB SBCA #-1 ADDB FLO ADCA FMAX STAB FLO STAA FMAX BNE FNOIS0 CMPB #7 BNE FNOIS0 RTS * *RADIO * RADIO LDAA #RADSND/$100 SOUND TABLE STAA XPTR LDX #100 STARTING FREQ STX TEMPX RADIO1 ADDB TEMPX+1 ADD FREQ TO TIMER LDAA TEMPA ADCA TEMPX STAA TEMPA LDX TEMPX BCS RADIO2 BRA *+2 EQUALIZE TIME BRA RADIO3 RADIO2 INX CARRY?, RAISE FREQ BEQ RADIO4 DONE? RADIO3 STX TEMPX ANDA #$F SET POINTER ADDA #RADSND!.$FF STAA XPTR+1 LDX XPTR LDAA ,X STAA SOUND PLAY SOUND BRA RADIO1 RADIO4 RTS * *HYPER * HYPER CLRA STAA SOUND STAA TEMPA ZERO PHASE HYPER1 CLRA ZERO TIME COUNTER HYPER2 CMPA TEMPA BNE HYPER3 COM SOUND PHASE EDGE?, COMPLEMENT SOUND HYPER3 LDAB #18 DELAY HYPER4 DECB BNE HYPER4 INCA ADVANCE TIME COUNTER BPL HYPER2 COM SOUND CYCLE DONE?, CYCLE EDGE INC TEMPA NEXT PHASE BPL HYPER1 DONE? RTS * *SCREAM * SCREAM LDX #STABLE ZERO FREQS AND TIMES SCREM1 CLR ,X INX CPX #SRMEND BNE SCREM1 LDAA #$40 START FIRST ECHO STAA STABLE+FREQ SCREM2 LDX #STABLE INITIALIZE COUNTER LDAA #$80 INITIALIZE AMPLITUDE STAA TEMPA CLRB ZERO OUTPUT BUFFER SCREM3 LDAA TIMER,X ADD FREQ TO TIMER ADDA FREQ,X STAA TIMER,X BPL SCREM4 ADD AMPLITUDE IF MINUS ADDB TEMPA SCREM4 LSR TEMPA DECAY AMPLITUDE INX NEXT ECHO INX CPX #SRMEND LAST ECHO? BNE SCREM3 STAB SOUND OUTPUT SOUND INC TEMPB ADVANCE TIMER BNE SCREM2 LDX #STABLE LOWER NON-ZERO FREQUENCIES CLRB ALL ZERO NOT FLAG SCREM5 LDAA FREQ,X BEQ SCREM7 CMPA #$37 BNE SCREM6 LDAB #$41 START NEXT ECHO STAB FREQ+2,X SCREM6 DEC FREQ,X INCB SET FLAG SCREM7 INX INX CPX #SRMEND BNE SCREM5 TSTB DONE? BNE SCREM2 RTS * *ORGAN TUNE * ORGANT DEC ORGFLG MINUS ORGAN FLAG RTS ORGNT1 BSR ORGASM JMP IRQ3 ORGASM CLR ORGFLG STAA TEMPA TUNE NUMBER LDX #ORGTAB ORGNT2 LDAA ,X TUNE TABLE LENGTH BEQ ORGNT5 INVALID TUNE DEC TEMPA BEQ ORGNT3 INCA JSR ADDX BRA ORGNT2 ORGNT3 INX STX XPTR NOTE POINTER JSR ADDX STX XPLAY TUNE END LDX XPTR ORGNT4 LDAA ,X TUNE LOOP STAA OSCIL LDAA 1,X LDX 2,X STX DUR BSR ORGANL LDX XPTR INX INX INX INX STX XPTR CPX XPLAY BNE ORGNT4 ORGNT5 RTS * *ORGAN NOTE *4 BYTES(MODE,OSCILLATOR MASK HI+1,LO+1,NOTE#) ORGANN RTS * *ORGAN LOADER *OSCIL=OSCILLATOR MASK, ACCA=DELAY, DUR=DURATION * ORGANL LDX #RDELAY SUBA #2 LDLP BLS LD1 CMPA #3 BEQ LD2 LDAB #1 NOP STAB ,X INX SUBA #2 BRA LDLP LD2 LDAB #$91 CMPA 0 STAB ,X CLR 1,X INX INX LD1 LDAB #$7E JMP START2 STAB ,X LDAB #ORGAN1!>8 MSB STAB 1,X LDAB #ORGAN1!.$FF LSB STAB 2,X * *ORGAN ROUTINE *DUR=DURATION, OSCILLATOR MASK * ORGAN LDX DUR ORGAN1 CLRA FCB $F6 LOAD B EXTND TEMPB FDB TEMPB INCB STAB TEMPB ANDB OSCIL MASK OSCILLATORS LSRB ADCA #0 LSRB ADCA #0 LSRB ADCA #0 LSRB ADCA #0 LSRB ADCA #0 LSRB ADCA #0 LSRB ADCA #0 ABA ASLA ASLA ASLA ASLA ASLA STAA SOUND DEX BEQ ORGAN2 NOTE OVER? JMP RDELAY ORGAN2 RTS * *PARAMETER TRANSFER * TRANS PSHA TRANS1 LDAA 0,X STX XPLAY LDX XPTR STAA 0,X INX STX XPTR LDX XPLAY INX DECB BNE TRANS1 PULA RTS * *BACKGROUND END ROUTINE * BGEND CLRA STAA BG1FLG STAA BG2FLG RTS * *BACKGROUND SOUND #2 INCREMENT * BG2INC CLR BG1FLG KILL BG1 LDAA BG2FLG ACTIVATE BG2 ANDA #$7F REMOVE OVERRIDE CMPA #BG2MAX BNE BG2I0 CLRA BG2I0 INCA STAA BG2FLG RTS * *BACKGROUND 2 ROUTINE * BG2 LDAA #(TRBV-SVTAB)/7 GET SOUND# JSR GWLD LDAA BG2FLG ASLA ASLA COMA JSR GEND60 BG2LP INC GDCNT JSR GEND61 BRA BG2LP * * * * *SPINNER #1 SOUND * SP1 LDAA #(CABSHK-VVECT)/9 JSR VARILD LDAB SP1FLG CMPB #SP1MAX-1 BNE SP1A CLRB SP1A INCB STAB SP1FLG LDAA #SP1MAX SBA CLRB SP11 CMPA #20 BLS SP12 ADDB #14 DECA BRA SP11 SP12 ADDB #5 DECA BNE SP12 STAB LOPER SP1LP JSR VARI DO IT BRA SP1LP * *LASER BALL BONUS #2 * BON2 LDAA B2FLG BNE BON21 INC B2FLG LDAA #(BONV-SVTAB)/7 BSR GWLD BRA GWAVE BON21 JMP GEND50 * *GWAVE LOADER * GWLD TAB MULKT BY 7 ASLB ABA ABA ABA LDX #SVTAB SOUND VECTOR TABLE JSR ADDX LDAA ,X TAB ANDA #$F STAA GCCNT GET CYCLE COUNT LSRB LSRB LSRB LSRB STAB GECHO GET #ECHOS LDAA 1,X TAB LSRB LSRB LSRB LSRB STAB GECDEC ANDA #$F WAVE # STAA TEMPA SAVE STX TEMPX SAVE INDEX LDX #GWVTAB CALC WAVEFORM ADDR GWLD2 DEC TEMPA WAVE FORM # BMI GWLD3 FINIS LDAA ,X INCA JSR ADDX BRA GWLD2 GWLD3 STX GWFRM JSR WVTRAN XSFER WAVE TO RAM LDX TEMPX RESTORE INDEX LDAA 2,X GET PREDECAY STAA PRDECA JSR WVDECA DECAY IT LDX TEMPX LDAA 3,X GET FREQ INC STAA GDFINC LDAA 4,X GET DELTA FREQ COUNT STAA GDCNT LDAA 5,X GET PATTERN COUNT TAB SAVE LDAA 6,X PATTERN OFFSET LDX #GFRTAB JSR ADDX TBA GET PATTERN LENGTH STX GWFRQ FREQ TABLE ADDR CLR FOFSET JSR ADDX STX FRQEND RTS * *GWAVE ROUTINE *ACCA= FREQ PATTERN LENGTH, X= FREQ PAT ADDR * GWAVE LDAA GECHO STAA GECNT GWT4 LDX GWFRQ STX XPLAY GPLAY LDX XPLAY GET NEW PERIOD LDAA ,X ADDA FOFSET STAA GPER CPX FRQEND BEQ GEND FINISH ON ZERO LDAB GCCNT CYCLE COUNT INX STX XPLAY GOUT LDX #GWTAB SETUP WAVEFORM POINTER GOUTLP LDAA GPER GPRLP DECA WAIT FOR PERIOD BNE GPRLP LDAA ,X OUTPUT SOUND STAA SOUND GPR1 INX CPX WVEND END OF WAVE? BNE GOUTLP DECB BEQ GPLAY INX DEX INX DEX INX DEX INX DEX NOP NOP BRA GOUT SYNC 36 GEND LDAA GECDEC BSR WVDECA GEND40 DEC GECNT ECHO ON? BNE GWT4 YES LDAA B2FLG STOP BONUS BNE GEND1 GEND50 LDAA GDFINC CONTINUE FOR FREQ MOD SOUNDS BEQ GEND1 NO DEC GDCNT DELTA FREQ OVER? BEQ GEND1 YES... ADDA FOFSET UPDATE FREQ OFFSET GEND60 STAA FOFSET GEND61 LDX GWFRQ GET INDEX CLRB START FOUND FLAG INIT CLEAR GW0 LDAA FOFSET INC OR DEC? TST GDFINC BMI GW1 DEC ADDA ,X INC BCS GW2 CARRY=OVERFLOW BRA GW2A GW1 ADDA ,X DEC BEQ GW2 OVERFLOW ON EQ BCS GW2A OVERFLOW IF CARRY CLEAR GW2 TSTB FOUND START YET? BEQ GW2B NO BRA GW3 YES, THIS IS THE END GW2A TSTB BNE GW2B ALREADY FOUND START STX GWFRQ FOUND START INCB GW2B INX CPX FRQEND BNE GW0 NOT OVER YET TSTB FOUND START? BNE GW3 YES RTS ALL OVER GW3 STX FRQEND LDAA GECDEC RE:XSFER WAVE? BEQ GEND0 NO BSR WVTRAN XSFER WAVE LDAA PRDECA BSR WVDECA GEND0 JMP GWAVE GEND1 RTS TERMINATE * *WAVE TRANSFER ROUTINE * WVTRAN LDX #GWTAB STX XPTR LDX GWFRM LDAB ,X GET WAVE LENGTH INX JSR TRANS LDX XPTR STX WVEND GET END ADDR RTS * *WAVE DECAY ROUTINE/ DECAY AMOUNT IN ACCA(1/16 PER DECAY) * WVDECA TSTA BEQ WVDCX NO DECAY LDX GWFRM ROM WAVE INDEX STX XPLAY LDX #GWTAB STAA TEMPB DECAY FACTOR WVDLP STX XPTR LDX XPLAY LDAB TEMPB STAB TEMPA DECAY FACTOR TEMP LDAB 1,X OFFSET FOR WAVE LENGTH LSRB LSRB LSRB LSRB CALC 1/16TH INX STX XPLAY LDX XPTR LDAA ,X WVDLP1 SBA DECAY DEC TEMPA BNE WVDLP1 STAA ,X INX CPX WVEND END OF WAVE? BNE WVDLP NO WVDCX RTS * * INTERRUPT PROCESSING * IRQ LDS #ENDRAM RE-INITIALIZE STACK LDAA SOUND+2 GET INPUT TRIGGER LDX #DECAYZ RANDY'S BRAIN DAMAGE STX XDECAY LDX #FREQ1 STX XPTR LDAB #$AF STAB AMP0 CLI NOW ALLOW IRQS COMA INVERT INPUT ANDA #$3F MASK GARB LDAB ORGFLG BEQ IRQ00 JSR ORGNT1 ORGAN TUNE IRQ00 CLRB CMPA #SP1SND BEQ IRQ00A STAB SP1FLG IRQ00A CMPA #B2SND BEQ IRQ000 STAB B2FLG IRQ000 TSTA BEQ IRQ3 INVALID INPUT DECA REMOVE OFFSET CMPA #$1F BLT IRQ001 CMPA #$3D BGT IRQ00C CMPA #$2A BHI IRQ00B SUBA #$10 BRA IRQ002 IRQ00C SUBA #$39 BRA IRQ21 IRQ00B SUBA #$1C BRA IRQ2 IRQ001 CMPA #$0C BHI IRQ10 IRQ002 JSR GWLD GWAVE SOUNDS JSR GWAVE BRA IRQ3 IRQ10 CMPA #$1B SPECIAL SOUND? BHI IRQ20 VARI SOUND SUBA #$D SUB OFFSET IRQ2 ASLA DOUBLE FOR ADDRESSING LDX #JMPTBL INDEX TO JUMP TABLE BSR ADDX GET CORRECT INDEX LDX 0,X GET ADDRESS TO INDEX JSR 0,X PERFORM IT BRA IRQ3 IRQ20 SUBA #$1C IRQ21 JSR VARILD JSR VARI IRQ3 LDAA BG1FLG BGROUND ACTIVE? ORAA BG2FLG BEQ * NOPE CLRA STAA B2FLG KILL BONUSES LDAA BG1FLG BEQ IRQXX JMP BG1 IRQXX JMP BG2 * * ADD A TO INDEX REGISTER * ADDX STX XPLAY ADDA XPLAY+1 STAA XPLAY+1 BCC ADDX1 INC XPLAY ADDX1 LDX XPLAY RTS * * DIAGNOSTIC PROCESSING HERE * NMI SEI LDS #ENDRAM RESET THE STACK LDX #$FFFF CLRB NMI1 ADCB 0,X DEX CPX #$F000 BNE NMI1 CMPB 0,X BEQ NMI2 WAI NMI2 JSR HBOMB LDAA #2 JSR ORGASM LDAA #1 JSR ORGASM BRA NMI KEEP LOOPING * *SPECIAL ROUTINE JUMP TABLE * JMPTBL FDB SP1,BG1,BG2INC,LITE FDB BON2,BGEND,TURBO,APPEAR FDB THRUST,CANNON,RADIO,HYPER FDB SCREAM,ORGANT,ORGANN * JMPTB1 FDB SND2,SND5,THNDR,HSTD,ATARI FDB SIREN,ORRRR,PERK$$,SQRT,START FDB PLANE,SND16,SND17,LAUNCH,CDR FDB KNOCK,ZIREN,WHIST,HBOMB * *VARI VECTORS * VVECT EQU * SAW FCB $40,$01,$00,$10,$E1,$00,$80,$FF,$FF FOSHIT FCB $28,$01,$00,$08,$81,$02,$00,$FF,$FF QUASAR FCB $28,$81,$00,$FC,$01,$02,$00,$FC,$FF CABSHK FCB $FF,$01,$00,$18,$41,$04,$80,$00,$FF CSCALE FCB $00,$FF,$08,$FF,$68,$04,$80,$00,$FF MOSQTO FCB $28,$81,$00,$FC,$01,$02,$00,$FC,$FF VARBG1 FCB $60,$01,$57,$08,$E1,$02,$00,$FE,$80 * *RADIO SOUND WAVEFORM * RADSND FCB $8C,$5B,$B6,$40,$BF,$49,$A4,$73 FCB $73,$A4,$49,$BF,$40,$B6,$5B,$8C * * NOTE DEFINITIONS AND ALL THAT JAZZ * AF1 EQU $F847 A1 EQU $F83F BF1 EQU $F837 B1 EQU $F830 C1 EQU $F829 CS1 EQU $F823 D1 EQU $F81D EF1 EQU $F817 E1 EQU $F812 F1 EQU $F80D FS1 EQU $F808 G2 EQU $F804 AF2 EQU $7C47 A2 EQU $7C3F BF2 EQU $7C37 B2 EQU $7C30 C2 EQU $7C29 CS2 EQU $7C23 D2 EQU $7C1D EF2 EQU $7C17 E2 EQU $7C12 F2 EQU $7C0D FS2 EQU $7C08 G3 EQU $7C04 AF3 EQU $3E47 A3 EQU $3E3F BF3 EQU $3E37 B3 EQU $3E30 C3 EQU $3E29 CS3 EQU $3E23 D3 EQU $3E1D EF3 EQU $3E17 E3 EQU $3E12 F3 EQU $3E0D FS3 EQU $3E08 G4 EQU $3E04 AF4 EQU $1F47 A4 EQU $1F3F BF4 EQU $1F37 B4 EQU $1F30 C4 EQU $1F29 CS4 EQU $1F23 D4 EQU $1F1D EF4 EQU $1F17 E4 EQU $1F12 F4 EQU $1F0D FS4 EQU $1F08 RS EQU $0004 TR EQU TG * *ORGAN TUNE TABLE *OSCILLATOR MASK(1),DELAY(1),DURATION(2) * ORGTAB EQU * FCB NINTH-FIFTH-1 FIFTH EQU * FDB G2,TG/FIF/4 FDB RS,TR/FIF/4 FDB G2,TG/FIF/4 FDB RS,TR/FIF/4 FDB G2,TG/FIF/4 FDB RS,TR/FIF/4 FDB EF1,TEF/FIF/2*7 FCB TUNEND-NINTH NINTH EQU * FDB D4,TD/NIN/4 FDB RS,TR/NIN/4 FDB D3,TD/NIN/4 FDB RS,TR/NIN/4*5 FDB A3,TA/NIN/4 FDB RS,TR/NIN/4 FDB A2,TA/NIN/4 FDB RS,TR/NIN/4*5 FDB D2,TD/NIN/4 FDB RS,TR/NIN/4 FDB D1,TD/NIN/4 FDB RS,TR/NIN/4 FDB A2,TA/NIN/4 FDB RS,TR/NIN/4 FDB A1,TA/NIN/4 FDB RS,TR/NIN/4*7 FDB A2,TA/NIN/4 FDB D2,TD/NIN/4 FDB E2,TE/NIN/4 FDB F2,TF/NIN/4 FDB E2,TE/NIN/4 FDB F2,TF/NIN/4 FDB G3,TG/NIN/4 FDB F2,TF/NIN/4 FDB E2,TE/NIN/4 FDB D2,TD/NIN/4 FDB BF3,TBF/NIN/4 FDB A3,TA/NIN/4 FDB G3,TG/NIN/4 FDB F2,TF/NIN/4 FDB E2,TE/NIN/4 FDB D2,TD/NIN/4 FDB CS2,TCS/NIN/4 FDB D2,TD/NIN/4 FDB E2,TE/NIN/4 FDB D3,TD/NIN/4 FDB RS,TR/NIN/4 FDB D2,TD/NIN/4 FDB RS,TR/NIN/4 FDB A3,TA/NIN/4 FDB RS,TR/NIN/4 FDB A2,TA/NIN/4 FDB RS,TR/NIN/4*5 FDB D1,TD/NIN/2*5 TUNEND FCB 0 LAST TUNE * *ORGAN NOTE TABLE *SCALE AF A BF B C CS NOTTAB FCB $47,$3F,$37,$30,$29,$23 * D EF E F FS G FCB $1D,$17,$12,$0D,$08,$04 * *WAVE TABLE *1ST BYTE= WAVELENGTH * GWVTAB EQU * GS2 FCB 8,127,217,255,217,127,36,0,36 GSSQ2 FCB 8,0,64,128,0,255,0,128,64 GS1 FCB 16,127,176,217,245,255,245,217,176 FCB 127,78,36,9,0,9,36,78 GS12 FCB 16,127,197,236,231,191,141,109,106 FCB 127,148,146,113,64,23,18,57 GSQ22 FCB 16,$FF,$FF,$FF,$FF,0,0,0,0 FCB $FF,$FF,$FF,$FF,0,0,0,0 GS72 FCB 72,138,149,160,171,181,191,200,209 FCB 218,225,232,238,243,247,251,253,254,255 FCB 254,253,251,247,243,238,232,225,218 FCB 209,200,191,181,171,160,149,138,127 FCB 117,106,95,84,74,64,55,46,37,30,23,17,12 FCB 8,4,2,1,0 FCB 1,2,4,8,12,17,23,30,37,46,55,64,74,84 FCB 95,106,117,127 GS1.7 FCB 16,89,123,152,172,179,172,152,123 FCB 89,55,25,6,0,6,25,55 ***************************************************** GSQ2 FCB 8,$FF,$FF,$FF,$FF,$00,$00,$00,$00 GS1234 FCB 16,118,255,184,208,157,230,106,130 FCB 118,234,129,134,78,156,50,99 MW1 FCB 16,0,$F4,0,$E8,0,$DC,0,$E2 FCB 0,$DC,0,$E8,0,$F4,0,0 HBPAT2 FCB 72,69,75,80,86,91,96,100,105 FCB 109,113,116,119,122,124,126,127,127,128 FCB 127,127,126,124,122,119,116,113,109 FCB 105,100,96,91,86,80,75,69,64 FCB 59,53,48,42,37,32,28,23,19,15,12,9,6 FCB 4,2,1,1,0 FCB 1,1,2,4,6,9,12,15,19,23,28,32,37,42 FCB 48,53,59,64 * *GWAVE SOUND VECTOR TABLE *VECTOR FORMAT *BYTE 0: GECHO,GCCNT *BYTE 1: GECDEC,WAVE# *BYTE 2: PREDECAY FACTOR *BYTE 3: GDFINC *BYTE 4: VARIABLE FREQ COUNT *BYTE 5: FREQ PATTERN LENGTH *BYTE 6: FREQ PATTERN OFFSET * SVTAB EQU * HBDV FCB $81,$24,0,0,0,22,HBDSND-GFRTAB 1 STDV FCB $12,$05,$1A,$FF,0,39,STDSND-GFRTAB 2 DP1V FCB $11,$05,$11,1,15,1,SWPAT-GFRTAB 3 XBV FCB $11,$31,0,1,0,13,SPNSND-GFRTAB 4 BBSV FCB $F4,$12,$0,0,0,20,BBSND-GFRTAB 5 HBEV FCB $41,$45,0,0,0,15,HBESND-GFRTAB 6 PROTV FCB $21,$35,$11,$FF,0,13,SPNSND-GFRTAB 7 SPNRV FCB $15,$00,0,$FD,0,1,SPNR-GFRTAB 8 CLDWNV FCB $31,$11,0,1,0,3,COOLDN-GFRTAB 9 SV3 FCB $01,$15,1,1,1,1,BBSND-GFRTAB 10 ED10 FCB $F6,$53,3,0,2,6,ED10FP-GFRTAB 11 ED12 FCB $6A,$10,2,0,2,6,ED13FP-GFRTAB 12 ED17 FCB $1F,$12,0,$FF,$10,4,SPNR-GFRTAB 13 BONV FCB $31,$11,0,$FF,0,13,BONSND-GFRTAB TRBV FCB $12,$06,$0,$FF,1,9,TRBPAT-GFRTAB **************************************************** HUNV FCB $14,$17,$00,$00,$00,14,HBTSND-GFRTAB SPD FCB $F4,$11,$00,$00,$00,14,HBTSND-GFRTAB SPNV FCB $21,$30,$00,$01,$00,13,SPNSND-GFRTAB STRT FCB $13,$10,$00,$FF,$00,09,YUKSND-GFRTAB SP1V FCB $F4,$18,$00,$00,$00,18,SP2SND-GFRTAB SSPV FCB $82,$22,$00,$00,$00,24,SSPSND-GFRTAB BMPV FCB $F2,$19,$00,$00,$00,22,BWSSND-GFRTAB WIRDV FCB $21,$30,$00,$FF,$00,27,$0D GDYUKV FCB $F1,$19,$00,$00,$00,14,YUKSND-GFRTAB BK8 FCB $31,$19,$00,$01,$00,03,COOLDN-GFRTAB SF10 FCB $41,$02,$D0,$00,$00,39,STDSND-GFRTAB BIL30 FCB $03,$15,$11,$FF,$00,13,SPNSND-GFRTAB *GWAVE FREQ PATTERN TABLE * GFRTAB EQU * *BONUS SOUND BONSND FCB $A0,$98,$90,$88,$80,$78,$70,$68 FCB $60,$58,$50,$44,$40 *HUNDRED POINT SOUND HBTSND FCB 1,1,2,2,4,4,8,8,$10,$10,$30,$60,$C0,$E0 *SPINNER SOUND SPNSND FCB 1,1,2,2,3,4,5,6,7,8,9,$A,$C *TURBINE START UP TRBPAT FCB $80,$7C,$78,$74,$70,$74,$78,$7C,$80 *HEARTBEAT DISTORTO HBDSND FCB 1,1,2,2,4,4,8,8,$10,$20,$28 FCB $30,$38,$40,$48,$50,$60,$70,$80,$A0,$B0,$C0 *SWEEP PATTERN SWPAT EQU * *BIGBEN SOUNDS BBSND FCB 8,64,8,64,8,64,8,64,8,64 FCB 8,64,8,64,8,64,8,64,8,64 *HEARTBEAT ECHO HBESND FCB 1,2,4,8,9,$A,$B,$C,$E,$F,$10 FCB $12,$14,$16 *SPINNER SOUND "DRIP" SPNR FCB $40 *COOL DOWNER COOLDN FCB $10,8,1 *START DISTORTO SOUND STDSND FCB 1,1,1,1,2,2,3,3,4,4,5,6,8,$A,$C,$10 FCB $14,$18,$20,$30,$40,$50,$40,$30 FCB $20,$10,$C,$A,8,7,6,5,4,3,2,2,1,1,1 *ED'S SOUND 10 ED10FP FCB 7,8,9,$A,$C,8 *ED'S SOUND 13 ED13FP FCB $17,$18,$19,$1A,$1B,$1C FCB 0,0,0,0 FILLER **************************************************** YUKSND FCB $8,$80,$10,$78,$18,$70,$20,$60,$28,$58,$30 FCB $50,$40,$48,$00 SP2SND FCB $01,$08,$10,$01,$08,$10,$01,$08,$10 FCB $01,$08,$10,$01,$08,$10,$01,$08,$10,$00 SSPSND FCB $10,$20,$40,$10,$20,$40,$10,$20,$40,$10,$20,$40 FCB $10,$20,$40,$10,$20,$40,$10,$20,$40,$10,$20,$40,$00 BWSSND FCB $01,$40,$02,$42,$3,$43,$4,$44,$5,$45,$6,$46,$7,$47 FCB $8,$48,$9,$49,$A,$4A,$B,$4B,$00 * * VECTORS HERE * ORG VECTOR IRQV FDB IRQ SWIV FDB SETUP NMIV FDB NMI RESETV FDB SETUP END CKSUM