;64'ER MUSIC PLAYER V.1.0 ;ALL CODING AND DESIGN BY THE SYNDROM ;--------------------------------------- ;--------------------------------------- ;EDITOR VERSION ;--------------------------------------- *= $1000 JMP INIT JMP PLAY JMP PLAY2 ;--------------------------------------- HARDVAL .BYTE $0F ;(XY: X=8->KEEP AD ; X=0-> AD=Y) FILTYP .BYTE $00 FILCON .BYTE $00 FILTLO .BYTE $00 FILTHI .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 NOFI .BYTE $00 FILFREQL .BYTE $00 FILFREQH .BYTE $00 FCONT .BYTE $00 FILCONF .BYTE $00 FILTADDL .BYTE $00 FILTADDH .BYTE $00 FILTFRM .BYTE $00 FILPOS .BYTE $00 FRQF .BYTE $00 .TEXT "-PLAYER & MUSIC BY THE " .TEXT "SYNDROM!-" FLO .BYTE $00 FHI .BYTE $00 WSPEED .BYTE $00,0 .BYTE $00,0 ;--------------------------------------- DUR .BYTE $00 DURAT .BYTE $00 SND .BYTE $00 AD .BYTE $00 SR .BYTE $00 ON .BYTE $00 VDIR .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 FILCONT .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 GLL .BYTE $00 .BYTE $00,0,0,0,0,0,0 ; -"- .BYTE $00,0,0,0,0,0,0 ; -"- GLH .BYTE $00 GLTO .BYTE $00 GLFROM .BYTE $00 GLDEL .BYTE $00 GLDEH .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 ; -"- SNDN .BYTE $00 EFFHI .BYTE $00 EFFLO .BYTE $00 PCONT .BYTE $00 WVSPEED .BYTE $00 HARDON .BYTE $00 NOTEV .BYTE $00 .BYTE $00,0,0,0,0,0,0 ; -"- .BYTE $00,0,0,0,0,0,0 ; -"- WVSPEED1 .BYTE $00 VSPEED1 .BYTE $00 VADDL1 .BYTE $00 VADDH1 .BYTE $00 VILO .BYTE $00 VIHI .BYTE $00 VIFIRST .BYTE $00 .BYTE $00,0,0,0,0,0,0 ; -"- .BYTE $00,0,0,0,0,0,0 ; -"- FILCONT1 .BYTE $FE WAVEXPOS .BYTE $00 XWVSPEED .BYTE $00 .BYTE $00 .BYTE $00 .BYTE $00 .BYTE $00 .BYTE $FD,0,0,0,0,0,0 ; -"- .BYTE $FB,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 #0 INITCL2 STA FILTYP,X INX CPX #FRQF-FILTYP BNE INITCL2 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 #$80 ;X0,X7,XE FOR FVOICE STA FILCON 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 PHA LSR A LSR A LSR A LSR A STA WSPEED PLA AND #$0F STA WSPEED+1 LDA #3 STA SPEED1 LDA TRAKK+1,Y AND #$0F STA VOLUME LDA #1 STA FILCONT ASL A STA FILCONT+7 ASL A STA FILCONT+14 LDA #$FE STA FILCONT1 LDA #$FD STA FILCONT1+7 LDA #$FB STA FILCONT1+14 LDA #0 STA FILCONF STA WSPEEDC+1 RTS ;--------------------------------------- PLAY LDA $F8 ;SAVE USED PHA ;ZEROPAGE TO STACK LDA $F9 PHA DEC SPEED1 ;MAIN-SPEED-CONTROL BPL NEW1 WSPEEDC LDA #0 EOR #1 STA WSPEEDC+1 TAX LDA WSPEED,X STA 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 FILCONF 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 #$FF ;END BNE COM1 INY LDA ($F8),Y STA TRPOS,X TAY JMP READ+3 COM1 CMP #$FE ;STOP BNE COM2 LDA #0 STA ON,X LDA #1 STA CUT,X RTS 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 ; PHA LDA #0 STA GLL,X STA GLH,X STA GLIDEL,X STA GLIDEH,X STA VSPEED,X STA VILO,X STA VIHI,X PLA JMP NOTE NNOTE CMP #$FF ;END BNE SCOM1 INC TRPOS,X LDA #0 STA SECPOS,X LDA SWITCH,X ;NO CUT IF SWITCH BNE NOWRAP ;IS ACTIVE LDA #$FF STA WVSPEED1,X LDA #$00 STA WAVE,X NOWRAP JMP NEW3 SCOM1 CMP #$F9 BCS SCOM1A JMP SCOM7 SCOM1A 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 STA SNDN,X LDA #0 STA WAVEXPOS,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 NOFX 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 AND #$3F ;SUPERCOMMANDS TAY LDA COMMTAB1,Y STA EFFHI,X LDA COMMTAB2,Y STA EFFLO,X LDA COMMTAB,Y ASL A TAY LDA COMMTAB3,Y STA JUMP+1 LDA COMMTAB3+1,Y STA JUMP+2 JUMP 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 SWITCH,X BNE SWON LDA CONT,X BNE SWON LDA #0 STA CUT,X 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 SVOL,X BEQ SS1 LDA SRTAB,Y AND #$0F ORA SVOL,X BNE SS2 SS1 LDA SRTAB,Y;NEW NOTE = MAX. SS2 STA SR,X ;RASTERTIME STA $D406,X LDA ADTAB,Y;SETS THE NEW STA AD,X ;ADSR-SETTINGS STA $D405,X;= BEGINNING OF A JMP NOCONTI SS LDA CONT,X BEQ NOCONTI SWON JSR PLAY3 JSR SID JMP NOCONT NOCONTI LDA WAVEXPOS,X BNE SUPWAV LDA WAVPTAB,Y SUPWAV 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 $D401,X STA NOTEOK,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 WAVEXPOS,X BEQ SLOW2 LDA XWVSPEED,X JMP SLOW1 SLOW2 LDA EFFTAB,Y AND #$0F SLOW1 STA WVSPEED,X STA WVSPEED1,X INC WAVEPOS,X LDA PCONT,X BNE FILLL LDA #0 STA NOPU,X ;--------------------------------------- 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 CPX FILCON BNE NOCONT LDA FCONT BNE NOCONT LDA #0 STA NOFI STA FILTFRM LDA FILPTAB,Y TAY CLC ADC #1 STA FILPOS LDA FRQF BEQ FILLT LDY FLO STY FILTLO TYA AND #7 STA FILFREQL LDA FHI STA FILTHI JMP FILLT2 FILLT LDA FILTTAB1,Y STA FILTHI PHA LDA FILTTAB2,Y STA FILTLO TAY AND #7 STA FILFREQL PLA FILLT2 LSR A ROR FILTLO LSR A ROR FILTLO LSR A ROR FILTLO LDA FILTLO STA FILFREQH STY FILTLO 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 ;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 #$FC BNE SWI1 INY LDA ($F8),Y STA SNDN,X DEY LDA #$FC SWI1 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 #$04 BCS NICHTS CMP #$01 BEQ FRAME1 ;FRAME 2+1 FRAME2 LDA HARDON,X BEQ NICHTS JSR PLAY3 LDA SR,X AND #$F0 STA $D406,X LDA HARDVAL BPL HRSETT LDA AD,X HRSETT STA $D405,X LDA WAVE,X AND #$FE STA $D404,X LDA #$00 STA ANDOR,X RTS NOSPEED0 CMP #1 BNE SP2 SPP LDA SPEED1 BEQ SP1 LDA DURAT,X CMP #1 BEQ FRAME2 JMP NICHTS SP1 LDA DURAT,X CMP #3 BCS NICHTS CMP #1 BEQ FRAME1 JMP FRAME2 SP2 LDA DURAT,X CMP #$01 BNE NICHTS LDA SPEED1 BEQ FRAME1 CMP #3 BCC FRAME2 NICHTS JSR PLAY3 JMP SID FRAME1 LDA HARDON,X BEQ NICHTS LDY SNDN,X ;THIS FRAME LDA SRTAB,Y;NEW NOTE = MAX. STA SR,X ;RASTERTIME STA $D406,X LDA ADTAB,Y;SETS THE NEW STA AD,X ;ADSR-SETTINGS STA $D405,X;= BEGINNING OF A LDA #$09 STA $D404,X STA WAVE,X INC HARDON,X RTS ;--------------------------------------- ; ADSR-ROUTINES ;--------------------------------------- PLAY2 LDX #$00 JSR PLAY3D JSR SID2 LDX #7 JSR PLAY3D JSR SID2 LDX #14 JSR PLAY3D JMP SID2 ;--------------------------------------- PLAY3 ;--------------------------------------- ;WAVE-FREQ-TABLE-HANDLING ;--------------------------------------- LDA CUT,X BEQ TON RTS TON ;--------------------------------------- ;FILTERROUTINE ;--------------------------------------- CPX FILCON BNE GLIDE LDA NOFI BNE GLIDE LDA FILPOS TAY LDA FILTFRM BNE NONEWF NOCHMALF LDA FILTTAB1,Y CMP #$90 ;CHECK LOOP BNE FP1 LDA FILTTAB2,Y STA FILPOS TAY JMP NOCHMALF FP1 CMP #$91 ;CHECK STOP BNE FP2 LDA #1 STA NOFI BNE GLIDE FP2 STA FILTADDH ;COUNT VALUES LDA FILTTAB2,Y STA FILTADDL LDA FILTTAB2+1,Y STA FILTFRM TYA CLC ADC #2 STA FILPOS NONEWF LDA FILTLO CLC ADC FILTADDL STA FILTLO TAY AND #7 STA FILFREQL LDA FILTHI ADC FILTADDH STA FILTHI DEC FILTFRM LSR A ROR FILTLO LSR A ROR FILTLO LSR A ROR FILTLO LDA FILTLO STA FILFREQH STY FILTLO ;--------------------------------------- ;VIB/SLIDE/ETC. ;--------------------------------------- GLIDE LDA GLL,X BNE GLY ;CHECK IF GLIDE LDA GLH,X ;ACTIVE BNE GLY JMP NOGLI GLY LDA #0 STA VSPEED,X STA VILO,X ;ADD VALUES STA VIHI,X ;DISABLE VIBR. CLC LDA GLIDEL,X ADC GLL,X STA GLIDEL,X LDA GLIDEH,X ADC GLH,X STA GLIDEH,X LDA GLH,X BMI GLUP1 LDY NOTEOK,X ;REACHED LDA FRQLO,Y ;DESTINATION CLC ;FREQUENCE? ADC GLIDEL,X ;(UPGLIDE) PHA LDA FRQHI,Y ADC GLIDEH,X CMP GLDEH,X BCC GLUP2 BNE GLUPEN1 GLUP4 PLA CMP GLDEL,X BCC NOGLI GLUPEN LDA #0 ;STOP GLIDE STA GLIDEL,X STA GLIDEH,X STA GLL,X STA GLH,X LDA GLTO,X STA NOTEV,X STA NOTEOK,X JMP NOGLI GLUP1 LDY NOTEOK,X LDA FRQLO,Y ;CHECK DESTIN. CLC ;FOR DOWNGLIDE ADC GLIDEL,X PHA LDA FRQHI,Y ADC GLIDEH,X CMP GLDEH,X BCC GLUPEN1 BNE GLUP2 PLA CMP GLDEL,X BCS NOGLI BCC GLUPEN GLUPEN1 PLA JMP GLUPEN GLUP2 PLA ;--------------------------------------- ;VIBRATO ;--------------------------------------- NOGLI LDA VSPEED,X BEQ NOVIB AND #1 BNE NVIB INC VIFIRST,X NVIB LDA VDIR,X ;CHECK DIRECT. BNE VIDO ;VIB. UP LDA VIFIRST,X BNE VI1 INC VIFIRST,X ;HALFVALUE? LDA VADDL1,X CLC ADC VILO,X STA VILO,X ;ADD HALF LDA VADDH1,X ADC VIHI,X STA VIHI,X JMP VI2 VI1 LDA VADDL,X ;ADD FULL CLC ADC VILO,X STA VILO,X LDA VADDH,X ADC VIHI,X STA VIHI,X VI2 INC VSPEED1,X LDA VSPEED1,X ;DIR.TURN? CMP VSPEED,X BNE VI3 VI4 LDA #1 EOR VDIR,X STA VDIR,X VI3 JMP NOVIB VIDO LDA VILO,X ;VIB. DOWN SEC SBC VADDL,X STA VILO,X ;SBC FULL LDA VIHI,X SBC VADDH,X STA VIHI,X DEC VSPEED1,X BEQ VI4 JMP NOVIB PLAY3D LDA CUT,X BEQ NOVIB RTS NOVIB ;--------------------------------------- ;WAVE/FILT/PULSE ;--------------------------------------- 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 LDA WAVE,X AND #$40 BNE NOCHNICH LDA #1 STA NOPU,X NOCHNICH ;--------------------------------------- ;PULSROUTINE ;--------------------------------------- LDA NOPU,X BNE FILLI 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 BNE PP2 LDA #1 STA NOPU,X BNE 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 FILLI ;--------------------------------------- ;WRITING THE ÓÉÄ-REGISTERS ;--------------------------------------- LDY NOTEOK,X LDA DRUM,X BEQ NORM TYA STA $D401,X LDA #0 STA $D400,X RTS NORM CLC LDA VILO,X ADC GLIDEL,X STA HELP LDA VIHI,X ADC GLIDEH,X STA HELP+1 LDA FRQLO,Y CLC ADC HELP STA HELP LDA HELP+1 ADC FRQHI,Y STA HELP+1 LDA HELP CLC ADC FINE,X STA $D400,X LDA HELP+1 ADC #0 STA $D401,X FIP RTS SID LDA SR,X STA $D406,X LDA AD,X ;REGISTERS STA $D405,X SID2 LDA HARDON,X CMP #2 BEQ WITER 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 WITER RTS HELP .BYTE $00,$00 ;--------------------------------------- ;Ô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 SUSA ;--------------------------------------- CONTP LDA #1 EOR PCONT,X STA PCONT,X JMP NOFX ;--------------------------------------- SUST LDA EFFLO,X STA SR,X JMP NOFX ;--------------------------------------- ADR LDA EFFLO,X STA AD,X JMP NOFX ;--------------------------------------- VOL LDA EFFLO,X ASL A ASL A ASL A ASL A STA SVOL,X JMP NOFX ;--------------------------------------- GLD LDY SECPOS,X INY LDA #0 STA GLIDEL,X STA GLIDEH,X LDA ($F8),Y PHA CMP #$60 BCC GL1 SEC SBC #$60 GL1 CLC ADC TRPOSE,X STA GLFROM,X INY GLSL LDA ($F8),Y CMP #$60 BCC GL2 SEC SBC #$60 GL2 CLC ADC TRPOSE,X STA GLTO,X PHA TAY LDA FRQLO,Y STA GLDEL,X LDA FRQHI,Y STA GLDEH,X PLA CMP GLFROM,X BEQ GL4 BCS GLUP LDA EFFLO,X EOR #$FF CLC ADC #$01 STA GLL,X LDA EFFHI,X EOR #$FF ADC #0 STA GLH,X LDA #0 BEQ GL3 GLUP LDA EFFLO,X STA GLL,X LDA EFFHI,X STA GLH,X GL3 PLA INC SECPOS,X INC SECPOS,X JMP NOTE GL4 LDA #0 STA GLL,X BEQ GL3 ;--------------------------------------- SLD LDY SECPOS,X INY LDA #0 STA GLIDEL,X STA GLIDEH,X LDA #1 STA CONT,X LDA NOTEV,X STA GLFROM,X SEC SBC TRPOSE,X PHA DEC SECPOS,X LDA #0 BEQ GLSL ;--------------------------------------- VIBR LDA EFFLO,X STA VADDL,X STA VADDL1,X LDA EFFHI,X AND #$0F STA VADDH,X LSR A STA VADDH1,X ROR VADDL1,X LDA EFFHI,X LSR A LSR A LSR A LSR A STA VSPEED,X LSR A STA VSPEED1,X LDA #0 STA VILO,X STA VIHI,X STA VIFIRST,X STA VDIR,X JMP NOFX ;--------------------------------------- FLT LDA EFFLO,X TAY AND #$F0 BEQ FLTVO STA FILTYP TYA ASL A ASL A ASL A ASL A STA RESONANCE LDA FILCON AND #$7F STA FILCON LDA FILCONT,X ORA FILCONF STA FILCONF JMP NOFX FLTVO LDA FILCONF AND FILCONT1,X STA FILCONF BNE FLTVO1 LDA FILCON ORA #$80 STA FILCON FLTVO1 JMP NOFX ;--------------------------------------- CONTF LDA #1 EOR FCONT STA FCONT JMP NOFX ;--------------------------------------- FRQ LDA EFFLO,X ORA EFFHI,X BEQ FRQ2 STA FRQF LDA EFFLO,X STA FLO LDA EFFHI,X AND #7 STA FHI JMP NOFX FRQ2 LDA #0 STA FRQF JMP NOFX ;--------------------------------------- ARP LDA EFFLO,X STA WAVEXPOS,X LDA EFFHI,X AND #$0F STA XWVSPEED,X JMP NOFX ;--------------------------------------- FNE LDA EFFLO,X STA FINE,X JMP NOFX SEND ;--------------------------------------- ;--------------------------------------- ;SUPERCOMMANDS ;--------------------------------------- ;00 - NOTHING ;01 - CONT. PULSE (NO PULSE RESTART) ;02 - SRR.XX ;03 - ADR.XX ;04 - VOL.XX ;05 - GLD.XXXX ;06 - SLD.XXXX ;07 - VIB.XXXX ;08 - FLT.XY X=TYPE,Y=RESONANCE ;09 - CONT. FILT (NO FILTER RESTART) ;0A - FRQ.XXX ;0B - ARP.YXX Y=NEW SPEED X=NEW POINT ;--------------------------------------- COMMTAB = $3D40 COMMTAB1 = $3D80 COMMTAB2 = $3DC0 *= $0F80 COMMTAB3 .WORD NOFX,CONTP,SUST,ADR,VOL .WORD GLD,SLD,VIBR,FLT,CONTF .WORD FRQ,ARP,FNE,SEND *= $0FE0 .WORD TRPOS,WSPEED,SUSA ;--------------------------------------- TRAKK = $3E00 ;--------------------------------------- SECLO = $3F00 SECHI = $3F80 ;--------------------------------------- ;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 ;--------------------------------------- ;--------------------------------------- ;COMMANDS $FD.XX DUR XX ;$FC.XX SND XX ;$FE CONT(---) ;$FB GATE ;$FA SWITCH ;$F9 CUT ;--------------------------------------- ;--------------------------------------- ;INSTRUMENT DATA ;--------------------------------------- ADTAB = $4000 SRTAB = $4100 WAVPTAB = $4200 PULPTAB = $4300 FILPTAB = $4400 EFFTAB = $4500 WAVETAB = $4600 FREQTAB = $4700 PULSTAB1 = $4800 PULSTAB2 = $4900 FILTTAB1 = $4A00 FILTTAB2 = $4B00 ;---------------------------------------