123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459 |
- * 1015 180684
- *
- *
- ** TUNES.S **
- ** ASTEROIDS FOR THE ATARI 3600 **
- ** THIS FILE CONTAINS THE SOUND DRIVER. **
- .ORG CODE+$2000
- ***** TUNE DATA *****
- * TUNTAB: THE ACTUAL VALUE INFO. THIS TABLE SHOULD BEGIN ON A PAGE BOUNADARY
- TUNTAB:
- * CONSTANT VALUES (RE-USED CONSTANTS WITH THE 'PLAY FOREVER' BIT SET)
- TCONST00:
- .DC.B $40
- TCONST01:
- .DC.B $41
- TCONST02:
- .DC.B $42
- TCONST04:
- .DC.B $44
- TCONST06:
- .DC.B $46
- TCONST08:
- .DC.B $48
- TCNTDOWN:
- .DC.B $0A,$09,$08,$07,$06,$05,$04,$03,$02,$01,$FF
- ;00 - VICTOR REZ OUT
- TVICTORC:
- .DC.B $4D
- TVICTORF:
- .DC.B $03,$02,$01,$02,$03,$20
- TVICTORV:
- .DC.B $98,$FE,(TS1V+1)&255
- ;01 - HYPERSPACE
- THYPERC:
- .DC.B $0D,$24
- THYPERF:
- .DC.B $1F,$1D,$1B,$1A,$18,$17,$15,$14,$13,$12,$11,$10,$0F,$0E,$0D,$2C
- THYPERV:
- .DC.B $86,$0A,$85,$08,$06,$90,$04,$02,$FF
- ;02 - TWINKLE
- TTWINKC EQU TCONST04
- TTWINKF:
- .DC.B $06,$04,$01,$05,$02,$03,$01,$06,$04,$05,$02,$03,$04,$01,$03,$25
- TTWINKV:
- .DC.B $45
- ;03 - BUZZ
- TBUZZC EQU TCONST08
- TBUZZF EQU TCONST00
- TBUZZV:
- .DC.B $01,$01,$02,$03,$04,$06,$08,$08,$0C,$0F,$0F,$FF
- ;04 - XTRA
- TXTRAC EQU TCONST04
- TXTRAF:
- .DC.B $86,$1F,$18,$1F,$95,$14,$FF
- TXTRAV:
- .DC.B $08,$00,$08,$00,$08,$00,$FE,(TCNTDOWN+1)&255
- ;05 - SHIPE
- TSHIPEC EQU TCONST08
- TSHIPEF:
- .DC.B $5F
- TSHIPEV EQU TCNTDOWN
- ;06 - UFOSE
- TUFOSEC EQU TCONST08
- TUFOSEF:
- .DC.B $88,$03,$49
- TUFOSEV:
- .DC.B $09,$07,$09,$07,$FE,(TCNTDOWN+5)&255
- ;07 - UFOLE
- TUFOLEC EQU TCONST08
- TUFOLEF:
- .DC.B $8A,$09,$43
- TUFOLEV EQU TUFOSEV
- ;08 - UFOS
- TUFOSC:
- .DC.B $07,$23
- TUFOSF EQU TCONST00
- TUFOSV EQU TCONST04
- ;09 - UFOL
- TUFOLC:
- .DC.B $0F,$03,$07,$23
- TUFOLF EQU TCONST02
- TUFOLV EQU TCONST04
- ;0A - ROCKSE
- TROCKSEC EQU TCONST08
- TROCKSEF:
- .DC.B $4B
- TROCKSEV EQU (TCNTDOWN+2) & 255
- ;0B - ROCKME
- TROCKMEC EQU TCONST08
- TROCKMEF:
- .DC.B $51
- TROCKMEV EQU (TCNTDOWN+2) & 255
- ;0C - ROCKLE
- TROCKLEC EQU TCONST08
- TROCKLEF:
- .DC.B $5A
- TROCKLEV EQU (TCNTDOWN+1) & 255
- ;0D - USHOT
- TUSHOTC EQU TCONST04
- TUSHOTF:
- .DC.B $03,$0F,$12,$13,$13,$14,$14,$15,$16,$16,$17,$FF
- TUSHOTV:
- .DC.B $03,$05,$07,$84,$06,$05,$04,$82,$03,$02,$01
- ;0E - SHOT
- TSHOTC EQU TCONST04
- TSHOTF:
- .DC.B $0C,$0D,$0E,$0F,$10,$11,$12,$13,$14,$15,$16
- .DC.B $17,$18,$19,$1A,$1B,$1C,$1D,$1E,$1F,$FF
- TSHOTV:
- .DC.B $82,$FE,(TCNTDOWN+1) & 255
- ;0F - BEATL
- TBEATLC EQU TCONST06
- TBEATLF:
- .DC.B $53
- TBEATLV:
- .DC.B $09,$FF
- ;10 - BEATH
- TBEATHC EQU TCONST06
- TBEATHF:
- .DC.B $54
- TBEATHV EQU TBEATLV
- ;11 - THRUST
- TTHRUSTC EQU TCONST06
- TTHRUSTF:
- .DC.B $10,$0E,$0D,$0E,$0C,$0E,$0F,$2E
- TTHRUSTV EQU TCONST04
- ;12 - S1
- TS1C EQU TCONST04
- TS1F:
- .DC.B $10,$13,$0C,$08,$05,$03,$02,$21
- TS1V:
- .DC.B $A0,$07,$05,$03,$01,$FF
- ;13 - S2
- TS2C EQU TCONST04
- TS2F:
- .DC.B $07,$21
- TS2V:
- .DC.B $01,$02,$03,$04,$05,$06,$07,$08,$FE,(TCNTDOWN+2)&255
- ;14 - S3
- TS3C EQU TCONST04
- TS3F:
- .DC.B $09,$05,$07,$2A
- TS3V:
- .DC.B $8C,$07,$00,$05,$00,$03,$00,$01,$FF
- ;15 - S4
- TS4C EQU TCONST04
- TS4F:
- .DC.B $1A,$12,$2D
- TS4V:
- .DC.B $9B,$FE,(TS1V+1)&255
- ;16 - S5
- TS5C EQU TCONST01
- TS5F EQU TCONST00
- TS5V:
- .DC.B $04,$00,$04,$00,$04,$00,$8A,$00,$04,$00,$04
- .DC.B $00,$04,$00,$85,$04,$00,$04,$00,$04,$FF
- ;17 - S6
- TS6C EQU TCONST01
- TS6F:
- .DC.B $04,$06,$26
- TS6V:
- .DC.B $92,$01,$02,$03,$FE,(TCNTDOWN+6)&255
- *
- * TIINDEX: TABLE OF INITIAL INDICES AND DURATIONS
- TIINDEX:
- .DC.B TVICTORC&255,TVICTORF&255,TVICTORV&255,3 ;SOUND 0 - VICTOR REZOUT
- .DC.B THYPERC&255,THYPERF&255,THYPERV&255,1 ;SOUND 1 - HYPERSPACE
- .DC.B TTWINKC&255,TTWINKF&255,TTWINKV&255,2 ;SOUND 2 - TWINKLE
- .DC.B TBUZZC&255,TBUZZF&255,TBUZZV&255,3 ;SOUND 3 - BUZZ
- .DC.B TXTRAC&255,TXTRAF&255,TXTRAV&255,3 ;SOUND 4 - XTRA MAN
- .DC.B TSHIPEC&255,TSHIPEF&255,TSHIPEV&255,9 ;SOUND 5 - SHIP EXP
- .DC.B TUFOSEC&255,TUFOSEF&255,TUFOSEV&255,3 ;SOUND 6 - MR. BILL EXP
- .DC.B TUFOLEC&255,TUFOLEF&255,TUFOLEV&255,4 ;SOUND 7 - SLUGGO EXP
- .DC.B TUFOSC&255,TUFOSF&255,TUFOSV&255,3 ;SOUND 8 - MR. BILL
- .DC.B TUFOLC&255,TUFOLF&255,TUFOLV&255,5 ;SOUND 9 - SLUGGO
- .DC.B TROCKSEC&255,TROCKSEF&255,TROCKSEV&255,4 ;SOUND A - SMALL ROCK EX
- .DC.B TROCKMEC&255,TROCKMEF&255,TROCKMEV&255,6 ;SOUND B - MED. ROCK EX
- .DC.B TROCKLEC&255,TROCKLEF&255,TROCKLEV&255,8 ;SOUND C - LARGE ROCK EX
- .DC.B TUSHOTC&255,TUSHOTF&255,TUSHOTV&255,2 ;SOUND D - UFO SHOT
- .DC.B TSHOTC&255,TSHOTF&255,TSHOTV&255,1 ;SOUND E - HERO SHOT
- .DC.B TBEATLC&255,TBEATLF&255,TBEATLV&255,6 ;SOUND F - LO HEART BEAT
- .DC.B TBEATHC&255,TBEATHF&255,TBEATHV&255,6 ;SOUND 10 - HI HEART BEA
- .DC.B TTHRUSTC&255,TTHRUSTF&255,TTHRUSTV&255,2 ;SOUND 11 - SHIP THRUST
- .DC.B TS1C&255,TS1F&255,TS1V&255,4 ;SOUND 12 - SPACE SOUND1
- .DC.B TS2C&255,TS2F&255,TS2V&255,8 ;SOUND 13 - SPACE SOUND2
- .DC.B TS3C&255,TS3F&255,TS3V&255,3 ;SOUND 14 - SPACE SOUND3
- .DC.B TS4C&255,TS4F&255,TS4V&255,9 ;SOUND 15 - SPACE SOUND4
- .DC.B TS5C&255,TS5F&255,TS5V&255,5 ;SOUND 16 - SPACE SOUND5
- .DC.B TS6C&255,TS6F&255,TS6V&255,6 ;SOUND 17 - SPACE SOUND6
- *
- ***** ACTUAL ROUTINES FOR TUNE DRIVER *****
- * DOTUNE2: PLAY TUNE IN AC ONLY IF IT IS NOT ALREADY PLAYING
- DOTUNE2:
- LDX #1 ;SEE IF THIS TUNE IS ALREADY PLAYING
- TFINDLOP:
- CMP TUNNUM,X
- BEQ TALREADY ;ALREADY PLAYING, DON'T PLAY AGAIN
- DEX
- BPL TFINDLOP
- JSR DOTUNE ;NOT YET PLAYING, START UP HIS THEME
- TALREADY:
- RTS
- * DOTUNE1: PLAY TUNE IN AC, KILLING THE TUNE IF IT IS ALREADY PLAYING
- DOTUNE1:
- PHA
- JSR KILLTUNE
- PLA
- ; JMP DOTUNE ;FALL THROUGH ...
- * DOTUNE: PLAY TUNE IN AC IF POSSIBLE
- DOTUNE:
- LDX #1 ;FIND A FREE CHANNEL
- TUNFRELP:
- LDY TUNNUM,X
- BMI TUNIN ;FF = FREE
- DEX
- BPL TUNFRELP
- ;NONE FREE
- CMP #$10 ;LOW PRI. SOUNDS NEVER BUMP ANYTHING
- BCS TUNRTS
- LDX #1 ;FIND A LOWER PRIORITY CHANNEL
- TUNPRILP:
- CMP TUNNUM,X
- BCC TUNIN ;FOUND LOWER PRIORITY: BUMP IT
- DEX
- BPL TUNPRILP
- ;SORRY CHARLIE...
- TUNRTS:
- RTS
- * TUNIN: INSTALL THE TUNE IN AC INTO CHANNEL IN X
- TUNIN:
- STA TUNNUM,X
- ASL ;FIND ROW IN INITIALIZATION TABLE
- ASL ;(THERE ARE FOUR ENTRIES PER ROW)
- TAY
- TUNINLOP:
- LDA TIINDEX,Y ;COPY IN TUNE INITIAL INDICES
- STA TINDEX,X
- INY
- INX
- INX ;SKIP OVER THE OTHER CHANNEL
- CPX #6 ;2 CHANNELS * 3 ELEMENTS PER CHANNEL
- BCC TUNINLOP
- LDA TIINDEX,Y ;COPY IN DURATION
- TDURINLP:
- DEX
- DEX
- BMI TUNRTS
- STA TDURTAB,X
- STA TDURCNT,X
- BPL TDURINLP ;BPL = JMP
- * CLEARTUN: KILL ALL TUNES, WHEREVER THEY LIE
- CLEARTUN:
- LDX #1
- CLRLOOP:
- JSR TOVER
- DEX
- BPL CLRLOOP ;FALL THRU INIT HUMP
- INITHUMP:
- LDA #$20 ;INITIALIZE BACKGROUND HEATBEAT COUNTER
- STA BEATVAL
- ; STA BCOUNTER ;LET IT RIDE...
- LDA #$90
- STA BEATRATE
- RTS
- * KILLTUNE: KILLS *ONE INSTANCE OF* TUNE IN AC, IF POSSIBLE
- KILLTUNE:
- LDX #1 ;FIND IT
- KILLLOOP:
- CMP TUNNUM,X
- BEQ TOVER
- DEX
- BPL KILLLOOP
- RTS
- * TOVER: END THE TUNE IN COMPONENT X. THIS IS BOTH CALLED AS A SUBROUTINE AND
- * BRANCHED INTO.
- TOVER:
- TXA
- AND #$01 ;LOW BIT IS CHANNEL NUMBER
- TAX
- LDY #$FF ;FF = NO TUNE
- STY TUNNUM,X
- INY
- STY AUDV0,X ;TURN OFF SOUND
- RTS
- * TUNER: CALLED ONCE PER FRAME, PLAYS THE TUNES.
- TUNER:
- LDA GAMSTATE ;PLAY TUNES ONLY IN GAMEPLAY STATE
- CMP #PLAYST
- BNE TUNRTS
- LDA STATUS+25 ;MAKE SURE UFO THEME IS PLAYING, IF ON
- BMI TNOUFO
- AND #$0F
- CLC
- ADC #4
- JSR DOTUNE2 ;PLAY HIS THEME, IF NOT ALREADY PLAYING
- TNOUFO:
- LDX #1 ;START WITH CHANNEL 1
- TCHX:
- TXA ;PUSH CHANNEL NUMBER
- PHA
- LDA TUNNUM,X
- BMI TNOTUNE ;FF = NO TUNE PLAYING
- JSR TLOOP
- TNOTUNE:
- PLA ;RESTORE CHANNEL NUMBER
- TAX
- DEX
- BPL TCHX
- RTS
- * TLOOP: LOOP THROUGH EACH OF THE THREE COMPONENTS OF CHANNEL X SIGNAL
- TLOOP:
- LDY TINDEX,X
- LDA TUNTAB,Y
- CMP #$FF
- BEQ TOVER
- CMP #$FE
- BEQ TBRANCH
- CMP #$FD
- BEQ TCHAIN
- CMP #$80 ;BIT 7 = SET DURATION ONLY
- BCS TSETDUR
- ;TNORM: NORMAL NOTE
- AND #$1F
- STA AUDC0,X ;GO POUND SAND IN YOUR ASS
- DEC TDURCNT,X ;DURATION UP YET?
- BNE TNEXT ;NOPE
- LDA TDURTAB,X ;YUP. REPRIME DURATION COUNTER
- STA TDURCNT,X
- LDA TUNTAB,Y ;CHECK FOR SPECIAL BITS
- CMP #$40 ;BIT 6 = HOLD FOREVER (TILL TUNE END)
- BCS TNEXT ;-> SIMPLY DON'T BUMP POINTER.
- CMP #$20 ;BIT 5 = RESTART THIS COMPONENT
- BCS TRESTART
- INC TINDEX,X ;BUMP POINTER TO NEXT 'NOTE'
- TNEXT:
- INX ;GO ON TO NEXT COMPONENT OF THIS
- INX ;CHANNEL (SKIP OVER OTHER CHANNEL)
- CPX #6 ;2 CHANNELS * 3 COMPONENTS PER CHANNEL
- BCC TLOOP
- RTS
- * TSETDUR: SET DURATION OF COMPONENT IN X TO VALUE IN AC.
- TSETDUR:
- AND #$7F ;LOW 7 BITS = NEW DURATION
- STA TDURTAB,X
- STA TDURCNT,X
- INC TINDEX,X ;BUMP POINTER
- JMP TLOOP ;AND CONTINUE
- * TBRANCH: $FE,ADDR = BRANCH INTO RANDOM ADDR FOR THIS COMPONENT
- TBRANCH:
- INY ;FETCH NEXT BYTE (NEW ADDRESS)
- LDA TUNTAB,Y
- STA TINDEX,X ;MASH IT INTO INDEX
- JMP TLOOP
- * TCHAIN: $FD,TUNNUM = CHAIN TO NEW TUNE. NOTE: THIS MEANS *ALL* COMPONENTS
- TCHAIN:
- INY ;FETCH NEXT BYTE (TUNNUM)
- LDA TUNTAB,Y
- PHA
- JSR TOVER ;END THIS TUNE
- PLA
- JMP DOTUNE ;JMP = JSR,RTS
- * TRESTART: RESTART THIS COMPONENT OF TUNE
- TRESTART:
- TXA
- AND #$01 ;LOW BIT IS CHANNEL NUMBER
- TAY
- LDA TUNNUM,Y ;GET ITS TUNE NUMBER
- ASL ;FIND ROW IN INITIAL INDEX TABLE
- ASL ;(FOUR ENTRIES PER ROW)
- STA TTEMP
- TXA ;GET COMPONENT INDEX
- LSR ;BITS 2-1 ARE COMPONENT NUMBER
- CLC
- ADC TTEMP ;ADD ROW INDEX TO POSITION WITHIN ROW
- TAY
- LDA TIINDEX,Y ;FETCH INITIAL INDEX
- STA TINDEX,X ;POUND IT IN
- JMP TNEXT ;AND DO THE NEXT COMPONENT
- * ROUTINE TO PLAY THE BUMM, BUMM SOUND OF THE BACKGROUND HEART BEAT
- * START OUT AT A SLOW RATE AND INCREASE SLOWLY
- BACKSNDS:
- * FIRST ADD RANDOM SPACE SOUNDS
- LDA FRMCNT ;CHECK ONLY OCCASIONALLY
- AND #$06
- BNE UPRATE
- JSR NEWRAND ;GET RANDOM VALUE
- CMP #$06 ;DO ONLY OCCASIONALLY
- BCS UPRATE ;HAVE ONLY 6 RANDOM SPACE SOUNDS
- CLC ;ADD TO BASE
- ADC #$12
- JSR DOTUNE
- * THEN UPDATE RATE
- UPRATE:
- INC BEATRATE ;INCREASE RATE
- BNE OLDRATE
- NEWRATE:
- LDA #$90 ;RESET BEATRATE
- STA BEATRATE
- DEC BEATVAL ;INCREASE RATE BY
- LDA BEATVAL ; DECREMENTING BEATVAL
- CMP #5 ;DON'T LET GO BELOW 10
- BCS OLDRATE
- LDA #5
- STA BEATVAL
- * CHECK IF TIME FOR A BEAT
- OLDRATE:
- DEC BCOUNTER ;COUNTER COUNTS DOWN FROM
- ; BEATVAL TO 0.
- BPL DONEBEAT ;IS IT TIME FOR NEW BEAT?
- THISTIME:
- LDA BEATVAL ;YES, RESET COUNTER
- STA BCOUNTER
- LDA WHICHBT
- EOR #$01 ;TOGGLE TO OTHER TUNE
- STA WHICHBT
- CLC
- ADC #$0F ;ADD OFFSET TO TUNE
- JSR DOTUNE ;PLAY IT
- DONEBEAT:
- RTS
|