;64'ER MUSIC PLAYER V.08 ;ALL CODING AND DESIGN BY THE SYNDROM ;--------------------------------------- *= $0F00 SEI LDA #$00 JSR INIT RT LDA #$42 CMP $D012 BNE RT INC $D020 JSR PLAY DEC $D020 LDA $DC01 AND #$10 BNE RT JMP $9000 ;--------------------------------------- *= $1000 JMP INIT JMP PLAY JMP PLAY2 ;--------------------------------------- FILTYP .BYTE $00 FILCON .BYTE $00 FILFREQL .BYTE $00 FILFREQH .BYTE $00 VOLUME .BYTE $00 RESONANCE .BYTE $00 SPEED .BYTE $00 SPEED1 .BYTE $00 MULTI .BYTE $00 IDENTIFY .BYTE $00 FADE .BYTE $00 FADETIME .BYTE $00 FILTRS .BYTE $00 HARDVAL .BYTE $0F ;(XY: X=8->KEEP AD .BYTE $00 ; X=0-> AD=Y) .BYTE $00,0,0,0 ;YET EMPTY .BYTE $00,0,0,0 .TEXT "-PLAYER & MUSIC BY THE " .TEXT "SYNDROM!-" ;--------------------------------------- DUR .BYTE $00 DURAT .BYTE $00 SND .BYTE $00 AD .BYTE $00 SR .BYTE $00 ON .BYTE $00 VOFIL .BYTE $00 .BYTE $00,0,0,0,0,0,0 ;7 BYTES .BYTE $00,0,0,0,0,0,0 ;7 BYTES TRPOS .BYTE $00 TRACKL .BYTE $00 TRACKH .BYTE $00 SECPOS .BYTE $00 WAVE .BYTE $00 FILPOS .BYTE $00 PUPOS .BYTE $00 .BYTE $00,0,0,0,0,0,0 ; -"- .BYTE $00,0,0,0,0,0,0 ; -"- ANDOR .BYTE $00 CONT .BYTE $00 TRPOSE .BYTE $00 FINE .BYTE $00 WAVEPOS .BYTE $00 SWITCH .BYTE $00 NOPU .BYTE $00 .BYTE $00,0,0,0,0,0,0 ; -"- .BYTE $00,0,0,0,0,0,0 ; -"- VSPEED .BYTE $00 VADDL .BYTE $00 VADDH .BYTE $00 SVOL .BYTE $00 GLIDEH .BYTE $00 GLIDEL .BYTE $00 GLFROM .BYTE $00 .BYTE $00,0,0,0,0,0,0 ; -"- .BYTE $00,0,0,0,0,0,0 ; -"- GLTO .BYTE $00 WVSPEED .BYTE $00 HARDON .BYTE $00 NOTEV .BYTE $00 WVSPEED1 .BYTE $00 NOTEOK .BYTE $00 DRUM .BYTE $00 .BYTE $00,0,0,0,0,0,0 ; -"- .BYTE $00,0,0,0,0,0,0 ; -"- PULSLO .BYTE $00 PULSHI .BYTE $00 PULSFRM .BYTE $00 PULSADDL .BYTE $00 PULSADDH .BYTE $00 SWITCH2 .BYTE $00 CUT .BYTE $00 .BYTE $00,0,0,0,0,0,0 ; -"- .BYTE $00,0,0,0,0,0,0 ; -"- MARK .BYTE $00 ;--------------------------------------- INIT ASL A ASL A ASL A TAY LDX #$00 TXA INITCL STA DUR,X ;CLEAR DATA INX CPX #MARK-DUR BNE INITCL LDX #$00 ;PREPARE POINTERS TRFILL LDA TRAKK,Y STA TRACKL,X LDA TRAKK+1,Y STA TRACKH,X LDA #9 ;RESET VOICES STA $D404,X STA ON,X LDA #0 STA AD,X STA SR,X LDA #$02 ;STARTVALUES STA DURAT,X LDA #$FF STA WVSPEED1,X LDA #1 STA HARDON,X STA ANDOR,X INY INY TXA CLC ADC #7 ;0-7-14-LOOP TAX CPX #21 BNE TRFILL LDA TRAKK,Y STA SPEED CLC ADC #1 STA SPEED1 LDA TRAKK+1,Y STA VOLUME RTS ;--------------------------------------- PLAY LDA $F8 ;SAVE USED PHA ;ZEROPAGE TO STACK LDA $F9 PHA DEC SPEED1 ;MAIN-SPEED-CONTROL BPL NEW1 LDA SPEED STA SPEED1 NEW1 LDX #0 JSR VOICE LDX #7 JSR VOICE LDX #14 JSR VOICE LDA FADE ;VOLUME-FADE BEQ NOFADE ;ACTIVE ? DEC FADETIME LDA FADETIME BNE NOFADE FTIME LDA #0 ;DIRECT CODE STA FADETIME ;ACCESSED LDA VOLUME CLC ADC FADE STA VOLUME CMP #$FF ;LOWER STOP BEQ FADESTOP CMP #$10 BNE NOFADE ;UPPER STOP LDA #$0F STA VOLUME BNE NOFADE FADESTOP LDA #0 STA FADE STA VOLUME NOFADE LDA VOLUME ;PERMANENT ORA FILTYP ;CONTROLS STA $D418 LDA FILCON ORA RESONANCE STA $D417 LDA FILFREQL STA $D415 LDA FILFREQH STA $D416 PLA ;REWRITE ZERO- STA $F9 ;PAGE PLA STA $F8 RTS ;--------------------------------------- VOICE LDA ON,X ;VOICE ACTIVE? BNE VOION RTS VOION LDA SPEED1 ;NEW DURATION- CMP SPEED ;FRAME ? BEQ NEW ; JMP VOICE3;HR-CHECK FOR LOW ;SPEEDS NECESSARY NEW DEC DURAT,X ;NEW COMMAND- BEQ NEW3 ;FRAME ? JMP VOICE3 ;--------------------------------------- ;TRACK-CONTROL-ROUTINES ;--------------------------------------- ;COMMANDS ;$FF XX LOOP XX ;$FE STOP VOICE ;$FD XX TRANSPOSE +XX ;$FC XX TRANSPOSE -XX ;$FB XX FADEIN XX ;$FA XX FADEOUT XX ;$EX VOLUME X ;--------------------------------------- NEW3 LDA TRACKL,X ;SET POINTERS STA $F8 LDA TRACKH,X STA $F9 ;--------------------------------------- ;CHECK TRACK-COMMANDS ;--------------------------------------- READ LDY TRPOS,X LDA ($F8),Y BPL NOCOM ;SECTOR OR COMMAND? CMP #$FE ;STOP BNE COM1 LDA #0 STA ON,X RTS COM1 CMP #$FF ;END BNE COM2 INY LDA ($F8),Y STA TRPOS,X TAY JMP READ+3 COM2 CMP #$FD ;TR+XX BNE COM3 INY LDA ($F8),Y DAZU STA TRPOSE,X INY TYA STA TRPOS,X JMP READ+3 COM3 CMP #$FC ;TR-XX BNE COM4 INY LDA ($F8),Y EOR #$FF CLC ADC #$01 JMP DAZU COM4 CMP #$FB ;FD+XX BNE COM5 INY LDA ($F8),Y STA FADETIME STA FTIME+1 LDA #1 STA FADE JMP DAZU+3 COM5 CMP #$FA ;FD-XX BNE COM6 INY LDA ($F8),Y STA FADETIME STA FTIME+1 LDA #$FF STA FADE JMP DAZU+3 COM6 CMP #$E0 BCC COM7 CMP #$F0 ;MVL.X BCS COM7 AND #$0F STA VOLUME INC TRPOS,X COM7 JMP READ ;--------------------------------------- ;ÓECTOR-CONTROL ;COMMANDS $FD.XX DUR XX ;$FC.XX SND XX ;$FE CONT(---) ;$FB GATE ;$FA SWITCH ;$F9 CUT ;--------------------------------------- NOCOM TAY ;SET POINTERS LDA SECLO,Y STA $F8 LDA SECHI,Y STA $F9 READ3 LDY SECPOS,X LDA ($F8),Y ;COMMAND OR CMP #$C0 ;NOTE ? BCS NNOTE ; JMP NOTE NNOTE CMP #$FF ;END BNE SCOM1 INC TRPOS,X LDA SWITCH,X ;NO CUT IF SWITCH BNE NOWRAP ;IS ACTIVE LDA #$00 STA WAVE,X LDA #$FF STA WVSPEED1,X NOWRAP LDA #0 STA SECPOS,X JMP NEW3 SCOM1 CMP #$FE ;--- BNE SCOM2 NOTE3 INY TYA STA SECPOS,X LDA #1 STA CONT,X JMP NOTE2 SCOM2 CMP #$FD ;DUR.XX BNE SCOM3 INY LDA ($F8),Y STA DUR,X STA DURAT,X DAZU4 INY TYA STA SECPOS,X JMP READ3+3 SCOM3 CMP #$FC ;SND.XX BNE SCOM4 INY LDA ($F8),Y STA SND,X JMP DAZU4 SCOM4 CMP #$FB ;GATE BNE SCOM5 LDA #1 EOR ANDOR,X STA ANDOR,X JMP NOTE3 SCOM5 CMP #$FA ;SWITCH BNE SCOM6 LDA #1 EOR SWITCH,X STA SWITCH,X INC SECPOS,X JMP READ3 SCOM6 CMP #$F9 ;CUT BNE SCOM7 LDA DUR,X STA DURAT,X LDA #8 ;RESETS VOICE STA $D404,X ;+ VOICE ROUTINES STA WAVE,X ;TO SAVE RASTERTIME LDA #$00 STA $D405,X STA $D406,X STA AD,X STA SR,X LDA #$FF STA WVSPEED1,X LDA #1 STA CUT,X INC SECPOS,X JMP HRCHECK SCOM7 ;PUT FUTURE COMMANDS ;HERE JMP READ3 NOTE CMP #$60 ;COUNT NOTEVALUE BCC NORMAL SEC SBC #$60 NORMAL CLC ADC TRPOSE,X STA NOTEV,X ;NEW NOTE STA NOTEOK,X INC SECPOS,X NOTE2 LDA DUR,X ;PREVIOUS NOTE STA DURAT,X LDA #0 STA CUT,X LDA SWITCH,X BNE SWON LDA CONT,X BNE SWON LDA #1 STA ANDOR,X LDY SND,X ;THIS FRAME LDA ADTAB,Y;SETS THE NEW STA AD,X ;ADSR-SETTINGS STA $D405,X;= BEGINNING OF A LDA SRTAB,Y;NEW NOTE = MAX. STA SR,X ;RASTERTIME STA $D406,X LDA CONT,X BEQ NOCONTI SWON JSR PLAY3 JMP NOCONT NOCONTI LDA WAVPTAB,Y STA WAVEPOS,X TYA PHA LDY WAVEPOS,X ;SETS WAVE LDA WAVETAB,Y ;(FIRST ROW) PHA AND #$F7 STA WAVE,X STA $D404,X ;CHECK FOR PLA ;DRUM-MODE AND #$08 STA DRUM,X BEQ NODRUM2 LDA FREQTAB,Y STA NOTEOK,X TAY LDA FRQHI,Y STA $D401,X LDA #0 STA $D400,X JMP NONON NODRUM2 LDA FREQTAB,Y CLC ADC NOTEV,X STA NOTEOK,X TAY LDA FRQLO,Y CLC ADC FINE,X STA $D400,X LDA FRQHI,Y ADC #0 STA $D401,X NONON PLA TAY LDA EFFTAB,Y AND #$0F STA WVSPEED,X STA WVSPEED1,X INC WAVEPOS,X LDA NOPU,X BNE FILLL ;--------------------------------------- LDA PULPTAB,Y ;PULSE-ROUTINE TAY ;INIT CLC ADC #1 STA PUPOS,X LDA PULSTAB1,Y STA PULSHI,X STA $D403,X LDA PULSTAB2,Y STA PULSLO,X STA $D402,X LDA #0 STA PULSFRM,X LDY SND,X FILLL LDA FILPTAB,Y STA FILPOS,X NOCONT LDA #0 STA CONT,X LDA HARDON,X BEQ HRCHECK LDA #1 STA ANDOR,X HRCHECK LDY SECPOS,X ;CHECKING NEXT HRCHECK2 LDA ($F8),Y ;SECTORDATA FOR CMP #$FF ;HARDRESTART ON BNE NOEND ;OR OFF BEQ ONYES ;USER CAN MANIPULATE NOEND CMP #$60 ;THIS (ONYES/ONNO) BCC ONYES ;(NEW SECTOR HR) CMP #$C0 BCC ONNO CMP #$FE BEQ ONNO CMP #$FB BEQ ONNO CMP #$F9 BEQ ONNO CMP #$FA BNE SWI LDA #1 EOR SWITCH,X STA SWITCH2,X JMP PLUS1 SWI CMP #$FC BCC PLUS1 INY PLUS1 INY BNE HRCHECK2 ONNO LDA #0 BEQ HRSET ONYES LDA #1 HRSET STA HARDON,X LDA SWITCH2,X BEQ OND LDA #0 STA HARDON,X OND RTS ;--------------------------------------- ;HARD-RESTART-ROUTINE ;--------------------------------------- VOICE3 LDA SPEED BNE NOSPEED0 LDA DURAT,X CMP #$03 BCS NICHTS ;FRAME 2+1 FRAME2 LDA HARDON,X BEQ NICHTS JSR PLAY3 LDA WAVE,X AND #$FE STA $D404,X LDA HARDVAL BPL HRSETT LDA AD,X HRSETT STA $D405,X LDA SR,X AND #$F0 STA $D406,X RTS NOSPEED0 LDA SPEED1 CMP #2 BCS NICHTS LDA DURAT,X CMP #1 BNE NICHTS JMP FRAME2 NICHTS JMP PLAY3 ;--------------------------------------- ; ADSR-ROUTINES ;--------------------------------------- PLAY2 LDX #$00 JSR PLAY3 LDX #7 JSR PLAY3 LDX #14 ;--------------------------------------- PLAY3 ;--------------------------------------- ;WAVE-FREQ-TABLE-HANDLING ;--------------------------------------- WAVROUT LDA CUT,X BEQ TON RTS TON LDA WVSPEED1,X ;NEW ROW ? CMP #$FF BEQ NOCHNICH DEC WVSPEED1,X BPL NOCHNICH LDA WVSPEED,X STA WVSPEED1,X NEWREAD LDY WAVEPOS,X INC WAVEPOS,X LDA WAVETAB,Y CMP #$91 ;CHECK STOP BEQ SCHLUSS CMP #$90 ;CHECK LOOP BNE NEXTSTEP LDA FREQTAB,Y STA WAVEPOS,X JMP NEWREAD NEXTSTEP PHA AND #$F7 ;CHECK DRUMMODE STA WAVE,X PLA AND #$08 STA DRUM,X BEQ NODRUM LDA FREQTAB,Y STA NOTEOK,X JMP NOCHNICH NODRUM LDA FREQTAB,Y CLC ADC NOTEV,X STA NOTEOK,X JMP NOCHNICH SCHLUSS LDA #$FF ;STOP MARK STA WVSPEED1,X NOCHNICH ;--------------------------------------- ;PULSROUTINE ;--------------------------------------- LDA PUPOS,X TAY LDA PULSFRM,X ;NEW ROW? BNE NONEWSET NOCHMAL LDA PULSTAB1,Y CMP #$90 ;CHECK LOOP BNE PP1 LDA PULSTAB2,Y STA PUPOS,X TAY JMP NOCHMAL PP1 CMP #$91 ;CHECK STOP BEQ FILLI PP2 STA PULSADDH,X ;COUNT VALUES LDA PULSTAB2,Y STA PULSADDL,X LDA PULSTAB2+1,Y STA PULSFRM,X TYA CLC ADC #2 STA PUPOS,X NONEWSET LDA PULSLO,X CLC ;SET VALUES ADC PULSADDL,X STA PULSLO,X STA $D402,X LDA PULSHI,X ADC PULSADDH,X STA PULSHI,X STA $D403,X DEC PULSFRM,X ;--------------------------------------- ;ÆILTERROUTINE ;--------------------------------------- FILLI ;STILL TO CODE ; ;--------------------------------------- ;WRITING THE ÓÉÄ-REGISTERS ;--------------------------------------- LDA WAVE,X TAY ;IF GATEBIT OFF BY AND #1 ;TABLE, DISABLE BEQ NOGAT ;GATE COMMAND TYA AND #$FE ORA ANDOR,X TAY NOGAT TYA STA $D404,X ;WRITE REMAINING LDA AD,X ;REGISTERS STA $D405,X LDA SR,X STA $D406,X LDY NOTEOK,X LDA DRUM,X BEQ NORM TYA STA $D401,X LDA #0 STA $D400,X BEQ WITER NORM LDA FRQLO,Y CLC ADC FINE,X STA $D400,X LDA FRQHI,Y ADC #0 STA $D401,X WITER RTS ;--------------------------------------- ;ÔABLES ;--------------------------------------- FRQLO .BYTE $0C,$1C,$2D,$3E,$47,$66 .BYTE $7B,$91,$A9,$C3,$DD,$FA .BYTE $18,$38,$5A,$7D,$A3,$CC .BYTE $F6,$23,$53,$86,$BB,$F4 .BYTE $30,$70,$B4,$FB,$47,$98 .BYTE $ED,$47,$A7,$0C,$77,$E9 .BYTE $61,$E1,$68,$F7,$8F,$30 .BYTE $DA,$8F,$4E,$18,$EF,$D2 .BYTE $C3,$C3,$D1,$EF,$1F,$60 .BYTE $B5,$1E,$9C,$31,$DF,$A5 .BYTE $87,$86,$A2,$DF,$3E,$C1 .BYTE $6B,$3C,$39,$63,$BE,$4B .BYTE $0F,$0C,$45,$BF,$7D,$83 .BYTE $D6,$79,$73,$C7,$7C,$97 .BYTE $1E,$18,$8B,$7E,$FA,$06 .BYTE $AC,$F3,$E6,$8F,$F8,$FC ;--------------------------------------- FRQHI .BYTE $01,$01,$01,$01,$01,$01 .BYTE $01,$01,$01,$01,$01,$01 .BYTE $02,$02,$02,$02,$02,$02 .BYTE $02,$03,$03,$03,$03,$03 .BYTE $04,$04,$04,$04,$05,$05 .BYTE $05,$06,$06,$07,$07,$07 .BYTE $08,$08,$09,$09,$0A,$0B .BYTE $0B,$0C,$0D,$0E,$0E,$0F .BYTE $10,$11,$12,$13,$15,$16 .BYTE $17,$19,$1A,$1C,$1D,$1F .BYTE $21,$23,$25,$27,$2A,$2C .BYTE $2F,$32,$35,$38,$3B,$3F .BYTE $43,$47,$4B,$4F,$54,$59 .BYTE $5E,$64,$6A,$70,$77,$7E .BYTE $86,$8E,$96,$9F,$A8,$B3 .BYTE $BD,$C8,$D4,$E1,$EE,$FD ;--------------------------------------- TRAKK .WORD TR1,TR2,TR3 .BYTE $00;SPEED .BYTE $0F;VOLUME ;--------------------------------------- SECLO .BYTE S00,>S01,>S02 ;--------------------------------------- ;COMMANDS ;$FF XX LOOP XX ;$FE STOP VOICE ;$FD XX TRANSPOSE +XX ;$FC XX TRANSPOSE -XX ;$FB XX FADEIN XX ;$FA XX FADEOUT XX ;$EX VOLUME X ;--------------------------------------- TR1 .BYTE $FA,$0D,0,0,$FA,0,0,0 .BYTE $FC,$04 .BYTE $FB,$0D,0,0,0,0 .BYTE $FC,$00 .BYTE $FF,$00 TR2 .BYTE $01,$FF,$00 TR3 .BYTE $02,$FF,$00 ;--------------------------------------- ;COMMANDS $FD.XX DUR XX ;$FC.XX SND XX ;$FE CONT(---) ;$FB GATE ;$FA SWITCH ;$F9 CUT ;--------------------------------------- S00 .BYTE $FD,$05 .BYTE $FC,$00 .BYTE $10,$FE,$FE,$10,$FE,$1A .BYTE $1C,$FE,$1C,$10,$F9,$17 .BYTE $FF S01 .BYTE $FD,$05,$FC,$01 .BYTE $00,$FE,$00,$00,$FE,$00 .BYTE $FC,$02 .BYTE $00,$FE,$00,$00,$FE,$00 .BYTE $FF S02 .BYTE $FD,$05,$FC,$03 .BYTE $34,$FE,$FE,$FE,$FE,$34 .BYTE $FB,$FE,$34,$34,$F9,$34 .BYTE $FF ;--------------------------------------- ;INSTRUMENT DATA ;--------------------------------------- ADTAB .BYTE $02,$00,$02,$00 SRTAB .BYTE $AA,$F8,$84,$59 WAVPTAB .BYTE $00,$04,$0B,$12 PULPTAB .BYTE $00,$06,$08,$00 FILPTAB .BYTE $00,$00,$00,$00 EFFTAB .BYTE $00,$00,$00,$01;XY ;X= ;Y=WVSPEED WAVETAB .BYTE $41 .BYTE $89,$41,$91 .BYTE $09 .BYTE $89,$19,$19,$19,$18,$91 .BYTE $09 .BYTE $89,$48,$88,$48,$88,$91 .BYTE $21,$21,$21,$90 FREQTAB .BYTE $00 .BYTE $DD,$00,$00 .BYTE $00 .BYTE $DD,$0A,$07,$04,$02,$00 .BYTE $00 .BYTE $DD,$0D,$3C,$0A,$3C,$00 .BYTE $00,$03,$07,$12 PULSTAB1 .BYTE $03,$00,$00,$FF,$00,$90 .BYTE $00,$91 .BYTE $08,$91 PULSTAB2 .BYTE $F0,$20,$20,$E0,$20,$01 .BYTE $00,$00 .BYTE $00,$00 ;--------------------------------------- ;NOT USED YET ;--------------------------------------- COMMTAB .BYTE $00 ;COMMAND COMMTAB1 .BYTE $00 ;VALUE COMMTAB2 .BYTE $00 ;VALUE ;---------------------------------------