NAM JOUST SOUND ROM STARTED 06/15/1982 SUBTTL *COPYRIGHT WILLIAMS ELECTRONICS INC. 1982 *PROGRAMMERS: EUGENE P. JARVIS, SAM DICKER,RANDY PFEIFFER,JOHN KOTLARIK * PAUL G. DUSSAULT,CARY W. KOLKER,TIM MURPHY * AND A CAST OF THOUSANDS...... * * *SYSTEM CONSTANTS * ROM EQU $F000 SOUND SET $400 CKORG EQU $EF00 CHECKSUM PROG ORG ENDRAM SET $7F VECTOR EQU $FFF8 RESET,INT VECTORS WVELEN EQU 72 * * SCREAM EQUATES * ECHOS EQU 4 FREQ EQU 0 TIMER EQU 1 * *GLOBALS * ORG 0 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 * BOMB RAM ORG LOCRAM 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 * * *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 * * * *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 * 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 RMB 2 FOR POINTER * * MAIN PROGRAM * ORG ROM FCB $74 CHECKSUM BYTE * * 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 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 SND4 LDX #VEC04 SOUND 4 BRA THNDR1 SND5 LDX #VEC05 SOUND 5 BRA THNDR1 * * * * 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 * * * SINGLE OSCILLATOR SOUND CALLS * PERK1 JSR MOVE JSR SING RTS ATARI LDX #VEC02X BRA PERK1 PERK$1 BSR PERK1 BSR ECHO 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 * *TURBO * TURBO LDX #TRBO JMP NOISLG TRBO FCB $10,$FF,1,1,1 *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 GALMD FCB $10,$F0,$F0,1,$30 * *MAIN GALLOP LOOP * MGAW LDX #GALMD BSR NOISLD GLP BSR GP1 BSR GP1 LDAA #$28 STAA NFRQ2 COM NFFLG BSR NOIN COM NFFLG LDAA #$1E BSR DELAY BRA GLP GP1 LDAA #$30 STAA NFRQ2 BSR NOIN LDAA #2 BSR DELAY RTS DELAY TAB LDX #$400 DLP1 TBA DLP DECA BNE DLP DEX CPX #0 BNE DLP1 LDAA #$F0 STAA NAMP RTS * *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 * * *LIGHTNING * LITE LDAA #1 STAA DFREQ LDAB #3 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 * * *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 * * *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 * * *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 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 TSTA BEQ IRQ3 DECA CMPA #$12+2 BHI 1$ JSR GWLD JSR GWAVE BRA IRQ3 * 1$ CMPA #$1D+2 BHI 3$ SUBA #$13+2 LDX #JMPTBL ASLA JSR ADDX LDX ,X JSR ,X BRA IRQ3 3$ CMPA #$20+2 BHI 4$ SUBA #$1E+2 NOISE REQUEST JSR JKNOIS BRA IRQ3 4$ CMPA #$24+2 BHI IRQ3 SUBA #$21+2 JSR WALSH IRQ3 BRA * * * 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 KNOCK BRA NMI KEEP LOOPING * *SPECIAL ROUTINE JUMP TABLE * JMPTBL FDB LITE $14 FDB SND4,SND5,THNDR,ATARI 15,16,17,18 FDB PERK$$,SQRT 19,1A FDB KNOCK,WHIST 1B,1C FDB SETUP,WINGDN 1D,1E * *VARI VECTORS * VVECT EQU * * NONE AS OF YET * * *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 SIN3.SR FCB 36 WAVE C FCB $7F,$B0,$D6,$E8,$E3,$C9,$A3,$7B,$5E,$54,$5E,$7B FCB $A3,$C9,$E3,$E8,$D6,$B0,$7F,$4C,$26,$14,$19,$33 FCB $5A,$81,$9E,$A8,$9E,$81,$5A,$33,$19,$14,$26,$4C * *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 * DP1V FCB $11,$05,$11,1,15,1,SWPAT-GFRTAB 1 PROTV FCB $21,$35,$11,$FF,0,13,SPNSND-GFRTAB 2 SPNRV FCB $15,$00,0,$FD,0,1,SPNR-GFRTAB 3 CLDWNV FCB $31,$11,0,1,0,3,COOLDN-GFRTAB 4 ED10 FCB $F6,$53,3,0,2,6,ED10FP-GFRTAB 5 HUNV FCB $14,$17,$00,$00,$00,14,HBTSND-GFRTAB 6 STRT FCB $13,$10,$00,$FF,$00,09,YUKSND-GFRTAB 7 BMPV FCB $F2,$19,$00,$00,$00,22,BWSSND-GFRTAB 8 SF10 FCB $41,$02,$D0,$00,$00,39,STDSND-GFRTAB 9 SV0 FCB $52,$36,$00,$00,$00,$10,HBDSND-GFRTAB A SV1 FCB $73,$29,$03,$00,$00,$10,GVA1-GFRTAB B SV2 FCB $11,$40,$03,$ED,$09,$09,TRBPAT-GFRTAB C SVA FCB $16,$82,$03,$0E,$01,$0E,GV27-GFRTAB D SVB FCB $11,$29,$00,$F0,$05,$08,GVB1-GFRTAB E SVF FCB $63,$26,$06,$00,$00,$10,GVA1-GFRTAB F FCB $21,$25,$00,$03,$0A,03,COOLDN-GFRTAB 10 FCB $43,$0A,$00,$04,$02,13,SPNSND-GFRTAB 11 ED17 FCB $1F,$12,$00,$FF,$10,04,SPNR-GFRTAB 12 CYNEW FCB $11,$10,$00,$0A,$00,01,YUKSND-GFRTAB 13 WIRDV FCB $21,$30,$00,$FF,$00,27,HBTSND-GFRTAB 14 WIRDV2 FCB $22,$21,$00,$FE,$00,27,HBTSND-GFRTAB 15 *GWAVE FREQ PATTERN TABLE * GFRTAB EQU * *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 *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 GV27 FCB $0C YUKSND FCB $8,$80,$10,$78,$18,$70,$20,$60,$28,$58,$30 FCB $50,$40,$48,$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 GVA1 FCB $14,$18,$20,$30,$40,$50,$40,$30 FCB $20,$10,$0C,$0A,$08,$07,$06,$05 GVB1 FCB $CC,$BB,$60,$10,$EE,$AA,$50,$00 * AND THE EVER POPULAR COPYRIGHT MESSAGE FCC "(C)1982 WILLIAMS ELECTRONICS" * NAM WALSH FUNCTION SOUND MACHINE V2 * T. MURPHY 11/10/81 MINPER EQU 25 6*25 = 150 MICROSECS IS MIN SAMPLE PERIOD SOUND SET $400 WORG ORG 0 RMB 8 GLOBALS FCMDPT RMB 2 PTR TO CURRENT FILTER COMMAND (USER INITIALIZED) PCMDPT RMB 2 SAME FOR PITCH PROGRAM SMPPER RMB 2 HI BYTE * 6 IS SAMPLE DELAY HRMTBL RMB 2 PTR TO HARMONIC FN VALUE TABLE WAVSRT RMB 16 WAVEFORM PERVEL RMB 2 ADDED TO SMPPER EACH WAVE (PITCH CONTROL) GLBPRO RMB 1 GLOBAL PERIOD OFFSET TMPPER RMB 1 = SMPPER + GLBPRO PERACM RMB 1 USED TO CALCULATE SMALL PITCH ADJUSTS PWVCNT EQU * #OF WAVES TO PLAY BEFORE NEXT PITCH CMD (P PROGRAM) PSTK RMB 2 TOP OF PITCH RETURN/COUNT STACK PWAVPT RMB 2 PTR TO CURRENT SAMPLE BEING PLAYED PCMD RMB 1 CURRENT PITCH CMD PTEMP RMB 2 FVECT RMB 3 JUMP TO CURRENT FILTER STATE (FILTER PGM CONTROL) FCNT EQU * MISC CTR, WAVE DELAY IF <0 FSTK RMB 2 TOP OF FILTER RETURN/COUNT STACK HAPTR RMB 2 PTR TO AMPLITUDE OF CURRENT HARMONIC FWVPTR RMB 2 PTS TO WAVE PT BEING ALTERED (FILTER GUTS) HAMP RMB 1 CURRENT HARMONIC AMPLITUDE FMSK RMB 1 BIT MASK SELECTS HARMONIC FN VALUE * NEXT 3 MUST BE IN ORDER FNHI RMB 1 HOLDS CURRENT HARMONIC FN VALUES AS BITS FNLO RMB 1 ALSO USED AS TEMPORARIES FCMD RMB 1 CURRENT INSTRUCTION BEING EXECUTED FBTM EQU *-3 FILTER STACK GROWS UP ORG 95 PBTM EQU * PITCH STACK GROWS DOWN RMB 1 ADD2HA FOR CONST WAVE ADD2HA RMB 8 ADD ADD2HA(8-I)*HARM(I) TO WAVE CNAMP RMB 1 CURRENT AMP OF CONST FUNCTION CURHA RMB 8 CURHA(8-I) = ENDRAM SET 127 ORG WORG SUBTTL WAVE PLAYER AND PITCH MODIFICATION * PLAY A SAMPLE, REMAINING DELAY IN B. TOTAL DELAY = MIN (60,B*6) MICS. NTHRVC SUBB #13 LOOP DELAY IS 78 CYCLES PSHB JSR FVECT (62) PULB NXTSMP CMPB #20 CALL HERE BHI NTHRVC MODIFY WAVE IF WE HAVE ENOUGH TIME NOP LDAA PERACM ADDA PERVEL+1 STAA PERACM ADCB #-10 MINIMUM DELAY + FRACTION DECB WASTE SMALL TIME BPL *-1 LDAA PWAVPT+1 PT TO NEXT BYTE OF 16 BYTE WAVE INCA ANDA #15 ORAA #WAVSRT ! WAVSRT MUST BE DIVISIBLE BY 16 ! STAA PWAVPT+1 LDX PWAVPT LDAB ,X STAB SOUND ANDA #15 0 IFF RESTARTING WAVE RTS * PLAYS WAVE AND ALTERS PITCH ACCORDING TO PITCH CMDS. * SMPPER IS INITIAL PITCH, PCMDPT IS START PITCH PROGRAM, * FCMDPT IS START WAVE MODIFIER (FILTER) PROGRAM. WSM CLRA LDX #WAVSRT LDAB #CURHA+8-WAVSRT 1$ STAA ,X INX DECB BNE 1$ LDAB #PBTM STAB PSTK+1 LDAB #FBTM STAB FSTK+1 LDAB #126 STAB FVECT LDX #NXTFCM STX FVECT+1 LDAB SMPPER STAB TMPPER PPLPE1 SUBB #3 PPLPE2 JSR NXTSMP INX PPLP LDAB TMPPER SUBB #2 LOOP DELAY IS 18-6 = 12 JSR NTHRVC BNE PPLP ESCAPE ON WAVE BOUNDARY LDAB PERVEL 7 (ALL TIMES ARE SINCE RTS FROM LAST NXTSMP) LDAA PERVEL+1 ADDA SMPPER+1 UPDATE SAMPLE RATE ONCE EACH WAVE PLAY ADCB SMPPER STAA SMPPER+1 STAB SMPPER 24 ADDB GLBPRO LDAA #MINPER AVOID SYNC ERRORS BY LIMITING PITCH. CBA MAX. PITCH ALLOWS AT LEAST 1 FILTER BCC *+3 CALL PER SAMPLE. FCB 129 TAB STAB TMPPER 41 NOP SUBB #9 JSR NXTSMP 54 LDAA FCNT COUNT WAVE PLAYS FOR FILTER TAB (ONLY IF <0) ASLA ADCB #0 STAB FCNT 13 LDAB TMPPER SUBB #5 LDAA PWVCNT BPL PAWAKE INC PWVCNT UPDATE DELAY COUNT IF <0 NOP BRA PPLPE1 37 PAWAKE DECB ELSE WE ARE ALIVE JSR NXTSMP 36 LDX PCMDPT LDAA ,X BPL PPLP1 MOST CMDS ARE >0 CMPA #128 BEQ STOPR 19 EXCEPT FOR END = 128 INCA STAA PWVCNT OR A NEGATIVE NUMBER -N INX WHICH WAITS N WAVE PLAYS FCB -1,0,PCMDPT BEFORE FETCHING THE NEXT COMMAND PPLP35 LDAB TMPPER SUBB #6 JMP PPLPE1 43 PPLP1 INX LDAB ,X GET NEXT CMD STRING BYTE ON STACK PSHB INX STX PCMDPT 35 STAA PCMD ANDA #$70 LSRA LSRA LSRA CLRB ADDA #PCMDJT!.255 ADCB #PCMDJT/256 STAA PTEMP+1 STAB PTEMP 61 LDAB TMPPER LDAB TMPPER SUBB #13 JSR NXTSMP 78 CLRB LDX PTEMP EXECUTE CMD LDX ,X JMP ,X 16 * PITCH COMMAND ROUTINES. UNLESS OTHERWISE STATED, N IS A SIGNED 8 BIT * NUMBER = BYTE FOLLOWING OPCODE. * LDP N IS SMPPER := N, ADP N IS SMPPER := SMPPER + N LDPR LDAA PCMD BIT 0 = 1 FOR LOAD ASRA SBCB #0 ANDB SMPPER PULA SBA ADDA SMPPER STAA SMPPER 39 INX LDPRE LDAB TMPPER SUBB #10 JMP PPLPE2 51 * LDO N IS GLBPRO := N, ADO N IS GLBPRO := GLBPRO + N LDOR LDAA PCMD BIT 0 = 1 FOR LOAD ASRA SBCB #0 ANDB GLBPRO PULA SBA ADDA GLBPRO STAA GLBPRO BRA LDPRE * ESC EXECUTES MACHINE LANGUAGE IMMEDIATELY FOLLOWING ESCR PULA LDX PCMDPT DEX JMP ,X 32 * STOP EITHER REPEATS A CALL, RETURNS FROM A CALL, OR ENDS SOUND. STOPR LDAA PSTK+1 CMPA #PBTM BMI *+3 28 RTS LDAB TMPPER SUBB #7 JSR NXTSMP 42 LDX PSTK DEC 2,X BMI PRET 15 DONE LDX ,X ELSE REPEAT LDAA ,X PSHA INX STX PCMDPT 39 FCB -10,0,TMPPER SUBB #9 JSR NXTSMP 54 BRA PTORE1 PRET LDX ,X INX STX PCMDPT LDAA PSTK+1 ADDA #3 STAA PSTK+1 LDAB TMPPER SUBB #7 NOP JMP PPLPE1 49 * LDV N IS PERVEL := N, ADV N IS PERVEL := PERVEL + N * IN THIS CASE N IS A 12 BIT NUMBER, THE UPPER 4 BITS OF WHICH * ARE LO 4 BITS OF THE OPCODE BYTE. ADVR INX BRA *+6 LDVR STAB PERVEL CLEAR PERVEL FOR LOAD STAB PERVEL+1 24 LDAB PCMD ANDB #15 SIGN EXTEND ADDB #-8 EORB #-8 34 PULA ADDA PERVEL+1 ADCB PERVEL STAA PERVEL+1 STAB PERVEL 52 FCB -10,0,TMPPER SUBB #9 JMP PPLPE1 61 * DO R,N CALLS RTN AT *+N R TIMES. PDOR LDAA PSTK+1 SUBA #3 STAA PSTK+1 25 LDX PSTK LDAA PCMDPT+1 STACK ENTRY PTS TO DISPLACEMENT LDAB PCMDPT ADDA #-1 ADCB #-1 STAB ,X STAA 1,X 53 LDAB PCMD LO OPCODE BITS ARE REPEAT CNT ANDB #15 STAB 2,X 64 LDAB TMPPER SUBB #12 JSR NXTSMP 78 INX SYNC W/NEXT RTN PTORE1 INX INX CLRB NOP * TO N SETS LOC TO BE *+N. PTOR PULA 20 ASRA ROLA SBCB #0 ADDA PCMDPT+1 ADCB PCMDPT STAA PCMDPT+1 FCB -9,0,PCMDPT 41 LDAB TMPPER SUBB #7 JMP PPLPE1 49 PCMDJT FDB LDPR,LDOR,LDVR,ADVR,LDPR,ESCR,PDOR,PTOR * 0 1 2 3 4 5 6 7 FCMDJT FDB ADHR,LDTR,ETBR,HIDR,FINR,ZTBR,FDOR,FTOR SUBTTL WAVE MODIFICATION * FENDR OVERLAY GETS RETURN ADDR FROM STACK. FRTURN LDX FSTK LDX 3,X INX NEXT INSTR IS AFTER DISPLACEMENT BYTE STX FCMDPT 19 JSR FCMDNX 41 INX RTS * REPEAT CALL. FDOAGN LDX ,X PT TO DISPLACEMENT BYTE STX FCMDPT 35 LDX #FTOR JUMP RTN IS NEXT STX FVECT+1 NOP RTS 50 * FIN DOES REPEAT CALL, RETURN TO CALLER, STOP RTN DEPENDING ON STACK. FINR LDAA FSTK+1 CMPA #FBTM BLS ALLDON 9 LAST END STATEMENT LDX FSTK DEC 2,X NO, CHECK TOP OF STACK BPL FDOAGN 24 STILL REPEATING SUBA #3 STAA FSTK+1 LDX #FRTURN ELSE RETURN STX FVECT+1 38 TST ,X RTS ALLDON LDX #WAST50 STX FVECT+1 NOP 19 BRA WAST27 WAST50 INX INX NOP WAST40 BSR WAST5 WAST27 BSR WAST5 WAST14 TST ,X WAST7 NOP WAST5 RTS * CALL WITH REPEAT. REPEAT CNT 0(=1) TO 15 (=16) IS LO 4 BITS OF OPCODE. * NEXT BYTE IS DISPLACEMENT AS IN GO INSTRUCTION. THE CTR AND RETURN * ADDRESS ARE SAVED ON A STACK. FDOR LDX FSTK LDAA FCMDPT SAVE ADDR OF DISPLACEMENT BYTE STAA 3,X LDAA FCMDPT+1 STAA 4,X LDAA FCMD ANDA #15 STAA 5,X 33 INX LDX #1$ STX FVECT+1 RTS 50 * OVERLAY FOR CALL RTN. 1$ LDAA FSTK+1 ADDA #3 STAA FSTK+1 LDX #FTOR STX FVECT+1 17 GET READY TO JUMP NOP BRA WAST27 * GET NEXT FILTER COMMAND NXTFCM TST FCNT BNE WAST40 IN A DELAY LDX FCMDPT LDAA ,X INX STX FCMDPT STAA FCMD BPL 1$ 36 STAA FCNT NEGATIVE CMD IS NEG OF WAVE DELAY LDAA ,X RTS 50 1$ LDX #EXFCMD POSITIVE IS FROM TABLE FCB -1,0,FVECT+1 RTS 50 EXFCMD CLRB LDAA FCMD ANDA #$70 B4 - B7 IS INSTRUCTION LSRA LSRA LSRA ADDA #FCMDJT!.255 ADCB #FCMDJT/256 STAB FNHI STAA FNLO 25 LDX FNHI LDX ,X STX FVECT+1 STX FVECT+1 RTS 50 * SET UP FOR REPEATED TABLE ADD. ETBR LDAA FCMD ANDA #15 INCA INCA STAA FCNT BRA FHA1 17 * LOOK FOR A NONZERO HARMONIC CHANGE AND PERFORM IT. IF ENTIRE TABLE * IS ZERO WE HAVE FINISHED THE LAST COMMAND AND PICK UP THE NEXT ONE. FINDHA INC HAPTR+1 LDX HAPTR CPX #CNAMP END TABLE? BEQ FHA1 17 LDAA ,X NO, LOOK AT CURRENT ENTRY LDX #ADDINI STAA HAMP BEQ *+5 JMP *+6 LDX #FINDHA LOOK AGAIN IF 0 STX FVECT+1 SET FOR ADD IF <>0 INX RTS FHA1 LDAA #ADD2HA-2 RESTART TABLE FCB $B7,0,HAPTR+1 LDX #FINDHA MAYBE REPEAT DEC FCNT BEQ *+5 JMP *+6 FCMDNX LDX #NXTFCM 40 STX FVECT+1 RTS * RELATIVE JUMP. FTOR LDX FCMDPT CLRB LDAA ,X INCA DISPLACEMENT IS FROM NEXT INSTRUCTION ASRA ROLA SBCB #0 ADDA FCMDPT+1 ADCB FCMDPT STAA FCMDPT+1 STAB FCMDPT BRA FCMDNX 37 * SET UP FOR ADD OF HAMP * HARMONIC TO WAVE. ADDINI LDAA HAPTR+1 SUBA #ADD2HA-1 ASLA CLRB ADDA HRMTBL+1 GET PTR TO HARMONIC IN FNHI, FNLO ADCB HRMTBL STAB FNHI STAA FNLO 23 LDAA #128 STAA FMSK LDX #2$ STX FVECT+1 37 LDX #WAVSRT STX FWVPTR RTS 2$ LDX FNHI GET HARMONIC FN TO FNHI,FNLO LDX ,X STX FNHI LDX #ADDLP STX FVECT+1 23 LDX HAPTR LDAA 9,X ADDA HAMP STAA 9,X 41 RECORD CHANGE INX RTS * ADD HAMP * HARMONIC FN TO WAVEFORM. ADDLP LDAA FMSK MSK PTS TO CURRENT HARMONIC VALUE BEQ 1$ NEED NEW MASK AFTER 8 SAMPLES LSR FMSK LDX FWVPTR LDAB ,X ANDA FNHI ADD/SUBTRACT HAMP FROM SAMPLE ON BNE 2$ 29 SIGN OF HARMONIC. FCB -5,0,HAMP STAB ,X INC FWVPTR+1 RTS 50 2$ FCB -16,0,HAMP STAB ,X INC FWVPTR+1 RTS 1$ LDAB FWVPTR+1 CMPB #WAVSRT+16 BEQ 3$ 16 DONE LDAB FNLO STAB FNHI ELSE SET FOR NEXT 8 SAMPLES LDAB #128 FCB -9,0,FMSK BRA 16$ 34 3$ LDX #NXTFCM RETURN TO THE RIGHT PLACE LDAB FCNT BNE *+5 FCNT <>0 MEANS IN TABLE LOOP JMP *+6 FCNT = 0 MEANS EXECUTING COMMANDS LDX #FINDHA STX FVECT+1 34 16$ TST ,X INX RTS * ADH H,N LDH H,N USE SAME RTN ADHR LDHR LDAA FCMD ANDA #7 HARMONIC # ADDA #ADD2HA STAA HAPTR+1 LDX FCMDPT LDAA ,X INX STX FCMDPT STAA HAMP 33 SAVE VALUE LDX #1$ STX FVECT+1 INX RTS 1$ LDX HAPTR CLRB LDAA FCMD ADDA #-8 CARRY IF LD SBCB #0 ANDB 9,X LD NEW = SUB OLD + ADD NEW NEGB ADDB HAMP ADHRE STAB HAMP 27 LDX #ADDINI STX FVECT+1 INX INX NOP RTS * HARMONIC INCREMENT OR DECREMENT HIDR LDAB FCMD LSRB ANDB #7 ORAB #ADD2HA ! ADD2HA MUST BE DIVISIBLE BY 8 ! STAB HAPTR+1 PT TO THIS HARMONIC LDAB #-1 CARRY IF INCREMENT (BIT 0 OF FCMD = 1) ADCB #0 ADCB #0 BRA ADHRE 23 * CLEAR ADD2HA OR ALTER 0TH AMPLITUDE. ZTBR LDAA FCMD LO BIT 0 IF ZT ASRA BCS ADCR LDX #0 STX ADD2HA STX ADD2HA+2 STX ADD2HA+4 STX ADD2HA+6 32 INX ATBRE LDX #NXTFCM FCB -1,0,FVECT+1 ATBRE1 RTS ADCR BITA #2 BNE ESC1 15 BIT 2 FCMD =1 FOR ESCAPE LDAB #ADD2HA-1 STAB HAPTR+1 21 LDX #ADCRO ADCRE STX FVECT+1 JMP WAST14 ESC1 FCB -2,0,FCMDPT BRA ADCRE 24 ADCRO CLRB LDAA FCMD ADDA #-82 CARRY IF LDH SBCB #0 ANDB CNAMP LDX FCMDPT LDAA ,X INX STX FCMDPT 30 SBA STAA HAMP LDX #ADDINI FCB -1,0,FVECT+1 RTS * CHANGE SOME ADD2HA ENTRIES. LDTR LDAB #ADD2HA ASSUME FIRST ENTRY IS H #8 STAB HAPTR+1 LDX FCMDPT LDAB ,X EACH BIT INDICATES PRESENCE OF ENTRY STAB FNHI INX STX FCMDPT 28 LDAB FCMD LO BIT 1 IF ENTRY FOR 0 IS PRESENT LSRB BCC 5$ LDX #6$ STX FVECT+1 RTS 4$ CLRB LDAA FNLO LO BIT 0 IF REPLACE, 1 IF ADD TO CURRENT ASRA SBCB #0 LDX HAPTR ANDB ,X ABA STAA ,X 26 INC HAPTR+1 PT TO NEXT GUY LDAA ,X 5$ LDX #1$ STX FVECT+1 RTS 1$ ASL FNHI BCS 2$ BEQ 3$ NO MORE IF 0 INC HAPTR+1 JMP WAST27 3$ JSR FCMDNX 36 TST ,X NOP RTS 6$ DEC HAPTR+1 SET FOR 0TH ENTRY INX 2$ LDAA ,X LDX FCMDPT LDAA ,X INX STX FCMDPT 33 STAA FNLO LDX #4$ STX FVECT+1 RTS * FILTER TIMING * COMMAND # OF FILTER CALLS TO EXECUTE * LDH, ADH 24 * LDT, ADT 3+(2*N) (N = # OF ENTRIES ALTERED) * ZT 3 * DT R 3+(R*{ 9+(22*NZH)}) WHERE * R IS # OF TABLE REPEATS * NZH IS # OF NONZERO ADD2HA ENTRIES * IH, DH 23 * FIN 4 ( SAME FOR REPEAT AND RETURN) * DO 5 * TO 3 * WAIT N 1+ (N* WAVE PERIOD) NLIST * MACROS FOR PITCH AND FILTER COMMANDS MAKE DULL READING. C MACRO "C LIST * "C NLIST ENDM LBL MACRO "L,"C LIST "L EQU * "C NLIST ENDM ESC MACRO LIST FCB $55 ESC NLIST ENDM WAIT MACRO "N LIST FCB -"N WAIT "N NLIST ENDM DO MACRO "R,"A LIST FCB 95+"R,"A-*-2 DO "R,"A NLIST ENDM TO MACRO "A LIST FCB 112,"A-*-2 TO "A NLIST ENDM * PITCH COMMANDS LDP MACRO "N LIST FCB 1,"N LDP "N NLIST ENDM ADP MACRO "N LIST FCB 0,"N ADP "N NLIST ENDM LDV MACRO "N ZQ0 SET $2000+("N!.$FFF) LIST FDB ZQ0 LDV "N NLIST ENDM ADV MACRO "N ZQ0 SET $3000+("N!.$FFF) LIST FDB ZQ0 ADV "N NLIST ENDM LDO MACRO "N LIST FCB 17,"N LDO "N NLIST ENDM ADO MACRO "N LIST FCB 16,"N ADO "N NLIST ENDM STOP MACRO LIST FCB 128 STOP NLIST ENDM NOT MACRO "N LIST FCB "N NOT "N NLIST ENDM * FILTER COMMANDS FIN MACRO LIST FCB 64 FIN NLIST ENDM ADH MACRO "H,"N IFE "H LIST FCB 81,"N ADH 0,"N NLIST ELSE LIST FCB 8-"H,"N ADH "H,"N NLIST ENDIF ENDM LDH MACRO "H,"N IFE "H LIST FCB 83,"N LDH 0,"N NLIST ELSE LIST FCB 16-"H,"N LDH "H,"N NLIST ENDIF ENDM DT MACRO "R IFB <"R> LIST FCB 32 DT NLIST ELSE LIST FCB 31+"R DT "R NLIST ENDIF ENDM IH MACRO "H LIST FCB 65-"H-"H IH "H NLIST ENDM DH MACRO "H LIST FCB 64-"H-"H DH "H NLIST ENDM ZT MACRO LIST FCB 80 ZT NLIST ENDM LT MACRO "C,"0,"1,"2,"3,"4,"5,"6,"7,"8 ZQ1 SET 16 ZQ2 SET 0 IRPC %I,012345678 ZB%I SET 0 ENDR LTA 0,"0 LTA 1,"1 LTA 2,"2 LTA 3,"3 LTA 4,"4 LTA 5,"5 LTA 6,"6 LTA 7,"7 LTA 8,"8 LIST FCB ZQ1,ZQ2 LT <"0>,<"1>,<"2>,<"3>,<"4>,<"5>,<"6>,<"7>,<"8> NLIST LT"C ENDM LTA MACRO "I,"H,"A,"P ZQ3 SET 0 IFNB <"P> ZQ3 SET 1 ENDIF IFNB <"H> IFE "H ZQ1 SET 17 ELSE ZQ2 SET ZQ2!+(2!^("H-1)) ENDIF ZB"I SET "A+"A+ZQ3 ENDIF ENDM LT0 MACRO LIST FCB ZB0 NLIST ENDM LT1 MACRO LIST FCB ZB0,ZB1 NLIST ENDM LT2 MACRO LIST FCB ZB0,ZB1,ZB2 NLIST ENDM LT3 MACRO LIST FCB ZB0,ZB1,ZB2 FCB ZB3 NLIST ENDM LT4 MACRO LIST FCB ZB0,ZB1,ZB2 FCB ZB3,ZB4 NLIST ENDM LT5 MACRO LIST FCB ZB0,ZB1,ZB2 FCB ZB3,ZB4,ZB5 NLIST ENDM LT6 MACRO LIST FCB ZB0,ZB1,ZB2 FCB ZB3,ZB4,ZB5 FCB ZB6 NLIST ENDM LT7 MACRO LIST FCB ZB0,ZB1,ZB2 FCB ZB3,ZB4,ZB5 FCB ZB6,ZB7 NLIST ENDM LT8 MACRO LIST FCB ZB0,ZB1,ZB2 FCB ZB3,ZB4,ZB5 FCB ZB6,ZB7,ZB8 NLIST ENDM LIST NCLIST SUBTTL SOUND PROGRAMS * OPCODES ( ! SEPERATES NYBBLES SPACES SEPERATE BYTES) * COMMON * WAIT N -N ( 1<= N<= 127) * DO R,RTN $6!(R-1) RTN - NEXT LOC * TO RTN $70 RTN - NEXT LOC * ESC $55 * FREQUENCY CONTROL * STOP $80 * LDP N $01 N * ADP N $00 N * LDV N $2!(N&$F00) N&255 * ADV N $3!(N&$F00) N&255 * LDO N $11 N * ADO N $10 N * WAVE CONTROL * FIN $40 * ZT $50 * ADH 0,N $51 N * LDH 0,N $53 N * ( IN WHAT FOLLOWS 1<=H<=8 HHH = 8-H, A 3 BIT NUMBER) * ADH H,N $0!0HHH * LDH H,N $0!1HHH * IH H $3!HHH1 * DH H $3!HHH0 * DT R $2!(R-1) * LT A0,...,A8 $1!000C 8765!4321 B0,...,B8 * WHERE C=1 IF ENTRY 0 IS ALTERED * N=1 IF ENTRY N IS ALTERED (N=1,...,8) * BN=AN+AN+P WHERE P=1 IF AN IS TO BE ADDED TO ENTRY N * P=0 IF AN REPLACES ENTRY N * BN IS PRESENT ONLY IF ENTRY N IS TO BE ALTERED * HARMONIC FUNCTIONS. EACH BIT POSITION CORRESPONDS TO A WAVEFORM * POSITION. IF THE BIT = 0, THE VALUE IS +1 IF THE BIT = 1, THE * VALUE IS -1. * THE HARMONICS ARE TREATED IN ORDER OF DECREASING AVERAGE FREQUENCY. ODDTBL FDB %0000000000000000 0 CONSTANT IS WEIRDO FOR NOW FDB %0101010101010101 8 FDB %1010101001010101 7 FDB %0101101001011010 6 FDB %1001011001101001 5 FDB %0110011001100110 4 FDB %1100110000110011 3 FDB %0011110000111100 2 FDB %0000111111110000 1 * WAVE PROGRAMS NLIST LBL SCREMW, LT 7,<8,1>,<7,1>,<6,1>,<5,1>,<4,1>,<3,1>,<2,1>,<1,1> DT 16 DT 16 ZT LT 0,<8,-1> DT 16 LT 0,<7,-1> DT 16 LT 1,<8,0>,<6,-1> DT 16 LT 1,<7,0>,<5,-1> DT 16 LT 1,<6,0>,<4,-1> DT 16 LT 1,<5,0>,<3,-1> DT 16 LT 1,<4,0>,<2,-1> DT 16 LT 1,<3,0>,<1,-1> DT 16 LT 0,<2,0> DT 16 LT 0,<1,0> DT 16 TO SCREMW LBL PPLD ADP 1 ADP -1 ADP -1 ADP 1 STOP LBL SCREMP NOT 60 LDV -512 WAIT 16 LDV 0 WAIT 100 LBL SCRMA LDV 80 DO 13,PPLD LDV 64 DO 4,PPLD STOP LBL SCDNP NOT 28 TO SCRMA LBL SKIDW LDH 3,32 LDH 4,48 FIN LBL PPVA ADP 2 WAIT 1 ADP -2 WAIT 2 STOP LBL SKIDP NOT 48 DO 4,PPVB LBL PPVC LDV -32 DO 8,PPVA STOP LBL PPVB ADV 2 WAIT 2 ADP -2 WAIT 2 ADP 2 WAIT 2 ADP -2 WAIT 2 ADP 2 WAIT 2 ADP -2 WAIT 2 ADP 6 WAIT 3 ADV -256 WAIT 5 ADV 256 ADP 2 STOP LBL SKIDEP NOT 49 LDV 6 DO 1,PPVB TO PPVC LIST JNOIST FCB 13,64,-16,-1,18 $1F WING UP FCB 8,168,24,1,8 20 CLIP FCB 4,168,24,1,16 21 CLOP FCB 4,32,-8,-1,32 1E WING DOWN PART 1 FCB 16,-16,16,1,1 " " 2 WINGDN LDAA #3 BSR JKNOIS LDAA #4 JKNOIS LDX #$D939 GOOD SEED STX HI TAB ASLA ASLA ABA LDX #JNOIST JSR ADDX JMP NOISLG WALSHT FDB SCREMW,SCREMP $22 PTERODACTYL SCREAM FDB SCREMW,SCDNP 23 END OF ABOVE FDB SKIDW,SKIDP 24 OSTRICH STOP FDB SKIDW,SKIDEP 25 END SKID FOR SHORT ONES WALSH CLRB STAB SMPPER+1 ASLA ASLA ADDA #WALSHT!.255 ADCB #WALSHT/256 STAB PCMDPT STAA PCMDPT+1 LDX PCMDPT LDX X STX FCMDPT LDX PCMDPT LDX 2,X LDAB X STAB SMPPER INX STX PCMDPT LDX #ODDTBL STX HRMTBL JMP WSM * * VECTORS HERE * ORG VECTOR IRQV FDB IRQ SWIV FDB SETUP NMIV FDB NMI RESETV FDB SETUP END CKSUM