//====================================================================================== //taken from https://codebase64.org/doku.php?id=magazines:chacking5#rob_hubbard_s_musicdisassembled_commented_and_explained //====================================================================================== // //How to use the sourcecode: //************************* // // jsr music+0 to initialize the music number in the accumulator // jsr music+3 to play the music // jsr music+6 to stop the music and quieten SID // // The music is supposed to run at 50Hz, or 50 times per second. Therefore //PAL users can run the music routine off the IRQ like this: // // lda #$00 // init music number 0 // jsr music+0 // sei // install the irq and a raster compare // lda #irq // sta $314 // stx $315 // lda #$1b // sta $d011 // lda #$01 // sta $d01a // lda #$7f // sta $dc0d // cli //loop: // jmp loop // endless loop (music is now playing off interrupt :-) // //irq: // lda #$01 // sta $d019 // lda #$3c // sta $d012 // // inc $d020 // play music, and show a raster for the time it takes // jsr music+3 // dec $d020 // // lda #$14 // sta $d018 // jmp $ea31 // ====================================================================================== //rob hubbard //monty on the run music driver //this player was used (with small mods) //for his first approx 30 musix *=$8000 ////// lda #$00 // init music number 0 jsr music+0 sei // install the irq and a raster compare lda #irq sta $314 stx $315 lda #$1b sta $d011 lda #$01 sta $d01a lda #$7f sta $dc0d cli loop: jmp loop // endless loop (music is now playing off interrupt :-) irq: lda #$01 sta $d019 lda #$3c sta $d012 inc $d020 // play music, and show a raster for the time it takes jsr music+3 dec $d020 lda #$14 sta $d018 jmp $ea31 ////// music: jmp initmusic jmp playmusic jmp musicoff //==================================== //init music initmusic: lda #$00 //music num ldy #$00 asl sta tempstore asl clc adc tempstore //now music num*6 tax !: lda songs,x //copy ptrs to this sta currtrkhi,y //music's tracks to inx //current tracks iny cpy #$06 bne !- lda #$00 //clear control regs sta $d404 sta $d40b sta $d412 sta $d417 lda #$0f //full volume sta $d418 lda #$40 //flag init music sta mstatus rts //==================================== //music off musicoff: lda #$c0 //flag music off sta mstatus rts //==================================== //play music playmusic: inc counter bit mstatus //test music status bmi moff //$80 and $c0 is off bvc contplay //$40 init, else play //========== //init the song (mstatus $40) lda #$00 //init counter sta counter ldx #3-1 !: sta posoffset,x //init pos offsets sta patoffset,x //init pat offsets sta lengthleft,x //get note right away sta notenum,x dex bpl !- sta mstatus //signal music play jmp contplay //========== //music is off (mstatus $80 or $c0) moff: bvc !+ //if mstatus $c0 then lda #$00 sta $d404 //kill voice 1,2,3 sta $d40b //control registers sta $d412 lda #$0f //full volume still sta $d418 lda #$80 //flag no need to kill sta mstatus //sound next time !: jmp musicend //end //========== //music is playing (mstatus otherwise) contplay: ldx #3-1 //number of chanels dec speed //check the speed bpl mainloop lda resetspd //reset speed if needed sta speed mainloop: lda regoffsets,x //save offset to regs sta tmpregofst //for this channel tay //check whether a new note is needed lda speed //if speed not reset cmp resetspd //then skip notework beq checknewnote jmp vibrato checknewnote: lda currtrkhi,x //put base addr.w of sta $02 //this track in $2 lda currtrklo,x sta $03 dec lengthleft,x //check whether a new bmi getnewnote //note is needed jmp soundwork //no new note needed //========== //notework //a new note is needed. get the pattern //number/cc from this position getnewnote: ldy posoffset,x //get the data from lda ($02),y //the current position cmp #$ff //pos $ff restarts beq restart cmp #$fe //pos $fe stops music bne getnotedata //on all channels jmp musicend //cc of $ff restarts this track from the //first position restart: lda #$00 //get note immediately sta lengthleft,x //and reset pat,pos sta posoffset,x sta patoffset,x jmp getnewnote //get the note data from this pattern getnotedata: tay lda patptl,y //put base addr.w of sta $04 //the pattern in $4 lda patpth,y sta $05 lda #$00 //default no portamento sta portaval,x ldy patoffset,x //get offset into ptn lda #$ff //default no append sta appendfl //1st byte is the length of the note 0-31 //bit5 signals no release (see sndwork) //bit6 signals appended note //bit7 signals a new instrument // or portamento coming up lda ($04),y //get length of note sta savelnthcc,x sta templnthcc and #$1f sta lengthleft,x bit templnthcc //test for append bvs appendnote inc patoffset,x //pt to next data lda templnthcc //2nd byte needed? bpl getpitch //2nd byte needed as 1st byte negative //2nd byte is the instrument number(+ve) //or portamento speed(-ve) iny lda ($04),y //get instr/portamento bpl !+ sta portaval,x //save portamento val jmp double_plus !: sta instrnr,x //save instr nr double_plus: inc patoffset,x //3rd byte is the pitch of the note //get the 'base frequency' here getpitch: iny lda ($04),y //get pitch of note sta notenum,x asl //pitch*2 tay lda frequenzlo,y //save the appropriate sta tempfreq //base frequency lda frequenzhi,y ldy tmpregofst sta $d401,y sta savefreqhi,x lda tempfreq sta $d400,y sta savefreqlo,x jmp !+ appendnote: dec appendfl //clever eh? //fetch all the initial values from the //instrument data structure !: ldy tmpregofst lda instrnr,x //instr num stx tempstore asl //instr num*8 asl asl tax lda instr+2,x //get control reg val sta tempctrl lda instr+2,x and appendfl //implement append sta $d404,y lda instr+0,x //get pulse width lo sta $d402,y lda instr+1,x //get pulse width hi sta $d403,y lda instr+3,x //get attack/decay sta $d405,y lda instr+4,x //get sustain/release sta $d406,y ldx tempstore //save control reg val lda tempctrl sta voicectrl,x //4th byte checks for the end of pattern //if eop found, inc the position and //reset patoffset for new pattern inc patoffset,x //preview 4th byte ldy patoffset,x lda ($04),y cmp #$ff //check for eop bne !+ lda #$00 //end of pat reached sta patoffset,x //inc position for inc posoffset,x //the next time !: jmp loopcont //========== //soundwork //the instrument and effects processing //routine when no new note was needed soundwork: //release routine //set off a release when the length of //the note is exceeded //bit4 of the 1st note-byte can specify //for no release ldy tmpregofst lda savelnthcc,x //check for no release and #$20 //specified bne vibrato lda lengthleft,x //check for length of bne vibrato //exceeded lda voicectrl,x //length exceeded so and #$fe //start the release sta $d404,y //and kill adsr lda #$00 sta $d405,y sta $d406,y //vibrato routine //(does alot of work) vibrato: lda instrnr,x //instr num asl asl asl //instr num*8 tay sty instnumby8 //save instr num*8 lda instr+7,y //get instr fx byte sta instrfx lda instr+6,y //get pulse speed sta pulsevalue lda instr+5,y //get vibrato depth sta vibrdepth beq pulsework //check for no vibrato lda counter //this is clever!! and #7 //the counter's turned cmp #4 //into an oscillating bcc !+ //value (01233210) eor #7 !: sta oscilatval lda notenum,x //get base note asl //note*2 tay //get diff btw note sec //and note+1 frequency lda frequenzlo+2,y sbc frequenzlo,y sta tmpvdiflo lda frequenzhi+2,y sbc frequenzhi,y !: lsr //divide difference by ror tmpvdiflo //2 for each vibrdepth dec vibrdepth bpl !- sta tmpvdifhi lda frequenzlo,y //save note frequency sta tmpvfrqlo lda frequenzhi,y sta tmpvfrqhi lda savelnthcc,x //no vibrato if note and #$1f //length less than 8 cmp #8 bcc line_457 ldy oscilatval !: dey //depending on the osc bmi line_457 //value, add the vibr clc //freq that many times lda tmpvfrqlo //to the base freq adc tmpvdiflo sta tmpvfrqlo lda tmpvfrqhi adc tmpvdifhi sta tmpvfrqhi jmp !- line_457: ldy tmpregofst //save the final lda tmpvfrqlo //frequencies sta $d400,y lda tmpvfrqhi sta $d401,y //pulse-width timbre routine //depending on the control/speed byte in //the instrument datastructure, the pulse //width is of course inc/decremented to //produce timbre //strangely the delay value is also the //size of the inc/decrements pulsework: lda pulsevalue //check for pulsework beq portamento //needed this instr ldy instnumby8 and #$1f dec pulsedelay,x //pulsedelay-1 bpl portamento sta pulsedelay,x //reset pulsedelay lda pulsevalue //restrict pulse speed and #$e0 //from $00-$1f sta pulsespeed lda pulsedir,x //pulsedir 0 is up and bne pulsedown //1 is down lda pulsespeed //pulse width up clc adc instr+0,y //add the pulsespeed pha //to the pulse width lda instr+1,y adc #$00 and #$0f pha cmp #$0e //go pulsedown when bne dumpulse //the pulse value inc pulsedir,x //reaches max ($0exx) jmp dumpulse pulsedown: sec //pulse width down lda instr+0,y sbc pulsespeed //sub the pulsespeed pha //from the pulse width lda instr+1,y sbc #$00 and #$0f pha cmp #$08 //go pulseup when bne dumpulse //the pulse value dec pulsedir,x //reaches min ($08xx) dumpulse: stx tempstore //dump pulse width to ldx tmpregofst //chip and back into pla //the instr data str sta instr+1,y sta $d403,x pla sta instr+0,y sta $d402,x ldx tempstore //portamento routine //portamento comes from the second byte //if it's a negative value portamento: ldy tmpregofst lda portaval,x //check for portamento beq drums //none and #$7e //toad unwanted bits sta tempstore lda portaval,x //bit0 signals up/down and #$01 beq portup sec //portamento down lda savefreqlo,x //sub portaval from sbc tempstore //current frequency sta savefreqlo,x sta $d400,y lda savefreqhi,x sbc #$00 //(word arithmetic) sta savefreqhi,x sta $d401,y jmp drums portup: clc //portamento up lda savefreqlo,x //add portval to adc tempstore //current frequency sta savefreqlo,x sta $d400,y lda savefreqhi,x adc #$00 sta savefreqhi,x sta $d401,y //bit0 instrfx are the drum routines //the actual drum timbre depends on the //crtl register value for the instrument: //ctrlreg 0 is always noise //ctrlreg x is noise for 1st vbl and x //from then on //see that the drum is made by rapid hi //to low frequency slide with fast attack //and decay drums: lda instrfx //check if drums and #$01 //needed this instr beq skydive lda savefreqhi,x //don't bother if freq beq skydive //can't go any lower lda lengthleft,x //or if the note has beq skydive //finished lda savelnthcc,x //check if this is the and #$1f //first vbl for this sec //instrument-note sbc #$01 cmp lengthleft,x ldy tmpregofst bcc firstime lda savefreqhi,x //not the first time dec savefreqhi,x //so dec freqhi for sta $d401,y //drum sound lda voicectrl,x //if ctrlreg is 0 then and #$fe //noise is used always bne dumpctrl firstime: lda savefreqhi,x //noise is used for sta $d401,y //the first vbl also lda #$80 //(set noise) dumpctrl: sta $d404,y //bit1 instrfx is the skydive //a long portamento-down from the note //to zerofreq skydive: lda instrfx //check if skydive and #$02 //needed this instr beq octarp lda counter //every 2nd vbl and #$01 beq octarp lda savefreqhi,x //check if skydive beq octarp //already complete dec savefreqhi,x //decr and save the ldy tmpregofst //high byte freq sta $d401,y //bit2 instrfx is an octave arpeggio //pretty tame huh? octarp: lda instrfx //check if arpt needed and #$04 beq loopcont lda counter //only 2 arpt values and #$01 beq !+ lda notenum,x //odd, note+12 clc adc #$0c jmp line_666 !: lda notenum,x //even, note line_666: asl //dump the corresponding tay //frequencies lda frequenzlo,y sta tempfreq lda frequenzhi,y ldy tmpregofst sta $d401,y lda tempfreq sta $d400,y //========== //end of dbf loop loopcont: dex //dbf mainloop bmi musicend jmp mainloop musicend: rts //==================================== //frequenz data //==================================== frequenzlo: .byte $16 frequenzhi: .byte $01 .byte $27,$01,$38,$01,$4b,$01 .byte $5f,$01,$73,$01,$8a,$01,$a1,$01 .byte $ba,$01,$d4,$01,$f0,$01,$0e,$02 .byte $2d,$02,$4e,$02,$71,$02,$96,$02 .byte $bd,$02,$e7,$02,$13,$03,$42,$03 .byte $74,$03,$a9,$03,$e0,$03,$1b,$04 .byte $5a,$04,$9b,$04,$e2,$04,$2c,$05 .byte $7b,$05,$ce,$05,$27,$06,$85,$06 .byte $e8,$06,$51,$07,$c1,$07,$37,$08 .byte $b4,$08,$37,$09,$c4,$09,$57,$0a .byte $f5,$0a,$9c,$0b,$4e,$0c,$09,$0d .byte $d0,$0d,$a3,$0e,$82,$0f,$6e,$10 .byte $68,$11,$6e,$12,$88,$13,$af,$14 .byte $eb,$15,$39,$17,$9c,$18,$13,$1a .byte $a1,$1b,$46,$1d,$04,$1f,$dc,$20 .byte $d0,$22,$dc,$24,$10,$27,$5e,$29 .byte $d6,$2b,$72,$2e,$38,$31,$26,$34 .byte $42,$37,$8c,$3a,$08,$3e,$b8,$41 .byte $a0,$45,$b8,$49,$20,$4e,$bc,$52 .byte $ac,$57,$e4,$5c,$70,$62,$4c,$68 .byte $84,$6e,$18,$75,$10,$7c,$70,$83 .byte $40,$8b,$70,$93,$40,$9c,$78,$a5 .byte $58,$af,$c8,$b9,$e0,$c4,$98,$d0 .byte $08,$dd,$30,$ea,$20,$f8,$2e,$fd regoffsets: .byte $00,$07,$0e tmpregofst: .byte $00 posoffset: .byte $00,$00,$00 patoffset: .byte $00,$00,$00 lengthleft: .byte $00,$00,$00 savelnthcc: .byte $00,$00,$00 voicectrl: .byte $00,$00,$00 notenum: .byte $00,$00,$00 instrnr: .byte $00,$00,$00 appendfl: .byte $00 templnthcc: .byte $00 tempfreq: .byte $00 tempstore: .byte $00 tempctrl: .byte $00 vibrdepth: .byte $00 pulsevalue: .byte $00 tmpvdiflo: .byte $00 tmpvdifhi: .byte $00 tmpvfrqlo: .byte $00 tmpvfrqhi: .byte $00 oscilatval: .byte $00 pulsedelay: .byte $00,$00,$00 pulsedir: .byte $00,$00,$00 speed: .byte $00 resetspd: .byte $01 instnumby8: .byte $00 mstatus: .byte $c0 savefreqhi: .byte $00,$00,$00 savefreqlo: .byte $00,$00,$00 portaval: .byte $00,$00,$00 instrfx: .byte $00 pulsespeed: .byte $00 counter: .byte $00 currtrkhi: .byte $00,$00,$00 currtrklo: .byte $00,$00,$00 //==================================== //monty on the run main theme //==================================== songs: .byte montymaintr1 .byte >montymaintr2 .byte >montymaintr3 //==================================== //pointers to the patterns //low pointers patptl: .byte ptn00 .byte >ptn01 .byte >ptn02 .byte >ptn03 .byte >ptn04 .byte >ptn05 .byte >ptn06 .byte >ptn07 .byte >ptn08 .byte >ptn09 .byte >ptn0a .byte >ptn0b .byte >ptn0c .byte >ptn0d .byte >ptn0e .byte >ptn0f .byte >ptn10 .byte >ptn11 .byte >ptn12 .byte >ptn13 .byte >ptn14 .byte >ptn15 .byte >ptn16 .byte >ptn17 .byte >ptn18 .byte >ptn19 .byte >ptn1a .byte >ptn1b .byte >ptn1c .byte >ptn1d .byte >ptn1e .byte >ptn1f .byte >ptn20 .byte >ptn21 .byte >ptn22 .byte >ptn23 .byte >ptn24 .byte >ptn25 .byte >ptn26 .byte >ptn27 .byte >ptn28 .byte >ptn29 .byte >ptn2a .byte >ptn2b .byte >ptn2c .byte >ptn2d .byte 0 .byte >ptn2f .byte >ptn30 .byte >ptn31 .byte >ptn32 .byte >ptn33 .byte >ptn34 .byte >ptn35 .byte >ptn36 .byte >ptn37 .byte >ptn38 .byte >ptn39 .byte >ptn3a .byte >ptn3b //==================================== //tracks //==================================== //track1 montymaintr1: .byte $11,$14,$17,$1a,$00,$27,$00,$28 .byte $03,$05,$00,$27,$00,$28,$03,$05 .byte $07,$3a,$14,$17,$00,$27,$00,$28 .byte $2f,$30,$31,$31,$32,$33,$33,$34 .byte $34,$34,$34,$34,$34,$34,$34,$35 .byte $35,$35,$35,$35,$35,$36,$12,$37 .byte $38,$09,$2a,$09,$2b,$09,$0a,$09 .byte $2a,$09,$2b,$09,$0a,$0d,$0d,$0f .byte $ff //track2 montymaintr2: .byte $12,$15,$18,$1b,$2d,$39,$39 .byte $39,$39,$39,$39,$2c,$39,$39,$39 .byte $39,$39,$39,$2c,$39,$39,$39,$01 .byte $01,$29,$29,$2c,$15,$18,$39,$39 .byte $39,$39,$39,$39,$39,$39,$39,$39 .byte $39,$39,$39,$39,$39,$39,$39,$39 .byte $39,$39,$39,$39,$39,$39,$39,$39 .byte $39,$39,$39,$39,$39,$01,$01,$01 .byte $29,$39,$39,$39,$01,$01,$01,$29 .byte $39,$39,$39,$39,$ff //track3 montymaintr3: .byte $13,$16,$19 .byte $1c,$02,$02,$1d,$1e,$02,$02,$1d .byte $1f,$04,$04,$20,$20,$06,$02,$02 .byte $1d,$1e,$02,$02,$1d,$1f,$04,$04 .byte $20,$20,$06,$08,$08,$08,$08,$21 .byte $21,$21,$21,$22,$22,$22,$23,$22 .byte $24,$25,$3b,$26,$26,$26,$26,$26 .byte $26,$26,$26,$26,$26,$26,$26,$26 .byte $26,$26,$26,$02,$02,$1d,$1e,$02 .byte $02,$1d,$1f,$2f,$2f,$2f,$2f,$2f .byte $2f,$2f,$2f,$2f,$2f,$2f,$2f,$2f .byte $0b,$0b,$1d,$1d,$0b,$0b,$1d,$0b .byte $0b,$0b,$0c,$0c,$1d,$1d,$1d,$10 .byte $0b,$0b,$1d,$1d,$0b,$0b,$1d,$0b .byte $0b,$0b,$0c,$0c,$1d,$1d,$1d,$10 .byte $0b,$1d,$0b,$1d,$0b,$1d,$0b,$1d .byte $0b,$0c,$1d,$0b,$0c,$23,$0b,$0b .byte $ff //==================================== //patterns //==================================== ptn00: .byte $83,$00,$37,$01,$3e,$01,$3e,$03 .byte $3d,$03,$3e,$03,$43,$03,$3e,$03 .byte $3d,$03,$3e,$03,$37,$01,$3e,$01 .byte $3e,$03,$3d,$03,$3e,$03,$43,$03 .byte $42,$03,$43,$03,$45,$03,$46,$01 .byte $48,$01,$46,$03,$45,$03,$43,$03 .byte $4b,$01,$4d,$01,$4b,$03,$4a,$03 .byte $48,$ff ptn27: .byte $1f,$4a,$ff ptn28: .byte $03,$46,$01,$48,$01,$46,$03,$45 .byte $03,$4a,$0f,$43,$ff ptn03: .byte $bf,$06 .byte $48,$07,$48,$01,$4b,$01,$4a,$01 .byte $4b,$01,$4a,$03,$4b,$03,$4d,$03 .byte $4b,$03,$4a,$3f,$48,$07,$48,$01 .byte $4b,$01,$4a,$01,$4b,$01,$4a,$03 .byte $4b,$03,$4d,$03,$4b,$03,$48,$3f .byte $4c,$07,$4c,$01,$4f,$01,$4e,$01 .byte $4f,$01,$4e,$03,$4f,$03,$51,$03 .byte $4f,$03,$4e,$3f,$4c,$07,$4c,$01 .byte $4f,$01,$4e,$01,$4f,$01,$4e,$03 .byte $4f,$03,$51,$03,$4f,$03,$4c,$ff ptn05: .byte $83,$04,$26,$03,$29,$03,$28,$03 .byte $29,$03,$26,$03,$35,$03,$34,$03 .byte $32,$03,$2d,$03,$30,$03,$2f,$03 .byte $30,$03,$2d,$03,$3c,$03,$3b,$03 .byte $39,$03,$30,$03,$33,$03,$32,$03 .byte $33,$03,$30,$03,$3f,$03,$3e,$03 .byte $3c,$03,$46,$03,$45,$03,$43,$03 .byte $3a,$03,$39,$03,$37,$03,$2e,$03 .byte $2d,$03,$26,$03,$29,$03,$28,$03 .byte $29,$03,$26,$03,$35,$03,$34,$03 .byte $32,$03,$2d,$03,$30,$03,$2f,$03 .byte $30,$03,$2d,$03,$3c,$03,$3b,$03 .byte $39,$03,$30,$03,$33,$03,$32,$03 .byte $33,$03,$30,$03,$3f,$03,$3e,$03 .byte $3c,$03,$34,$03,$37,$03,$36,$03 .byte $37,$03,$34,$03,$37,$03,$3a,$03 .byte $3d ptn3a: .byte $03,$3e,$07,$3e,$07,$3f,$07 .byte $3e,$03,$3c,$07,$3e,$57,$ff ptn07: .byte $8b .byte $00,$3a,$01,$3a,$01,$3c,$03,$3d .byte $03,$3f,$03,$3d,$03,$3c,$0b,$3a .byte $03,$39,$07,$3a,$81,$06,$4b,$01 .byte $4d,$01,$4e,$01,$4d,$01,$4e,$01 .byte $4d,$05,$4b,$81,$00,$3a,$01,$3c .byte $01,$3d,$03,$3f,$03,$3d,$03,$3c .byte $03,$3a,$03,$39,$1b,$3a,$0b,$3b .byte $01,$3b,$01,$3d,$03,$3e,$03,$40 .byte $03,$3e,$03,$3d,$0b,$3b,$03,$3a .byte $07,$3b,$81,$06,$4c,$01,$4e,$01 .byte $4f,$01,$4e,$01,$4f,$01,$4e,$05 .byte $4c,$81,$00,$3b,$01,$3d,$01,$3e .byte $03,$40,$03,$3e,$03,$3d,$03,$3b .byte $03,$3a,$1b,$3b,$8b,$05,$35,$03 .byte $33,$07,$32,$03,$30,$03,$2f,$0b .byte $30,$03,$32,$0f,$30,$0b,$35,$03 .byte $33,$07,$32,$03,$30,$03,$2f,$1f .byte $30,$8b,$00,$3c,$01,$3c,$01,$3e .byte $03,$3f,$03,$41,$03,$3f,$03,$3e .byte $0b,$3d,$01,$3d,$01,$3f,$03,$40 .byte $03,$42,$03,$40,$03,$3f,$03,$3e .byte $01,$3e,$01,$40,$03,$41,$03,$40 .byte $03,$3e,$03,$3d,$03,$3e,$03,$3c .byte $03,$3a,$01,$3a,$01,$3c,$03,$3d .byte $03,$3c,$03,$3a,$03,$39,$03,$3a .byte $03,$3c,$ff ptn09: .byte $83,$00,$32,$01,$35,$01,$34,$03 .byte $32,$03,$35,$03,$34,$03,$32,$03 .byte $35,$01,$34,$01,$32,$03,$32,$03 .byte $3a,$03,$39,$03,$3a,$03,$32,$03 .byte $3a,$03,$39,$03,$3a,$ff ptn2a: .byte $03,$34,$01,$37,$01,$35,$03,$34 .byte $03,$37,$03,$35,$03,$34,$03,$37 .byte $01,$35,$01,$34,$03,$34,$03,$3a .byte $03,$39,$03,$3a,$03,$34,$03,$3a .byte $03,$39,$03,$3a,$ff ptn2b: .byte $03,$39,$03,$38,$03,$39,$03,$3a .byte $03,$39,$03,$37,$03,$35,$03,$34 .byte $03,$35,$03,$34,$03,$35,$03,$37 .byte $03,$35,$03,$34,$03,$32,$03,$31 .byte $ff ptn0a: .byte $03 .byte $37,$01,$3a,$01,$39,$03,$37,$03 .byte $3a,$03,$39,$03,$37,$03,$3a,$01 .byte $39,$01,$37,$03,$37,$03,$3e,$03 .byte $3d,$03,$3e,$03,$37,$03,$3e,$03 .byte $3d,$03,$3e,$03,$3d,$01,$40,$01 .byte $3e,$03,$3d,$03,$40,$01,$3e,$01 .byte $3d,$03,$40,$03,$3e,$03,$40,$03 .byte $40,$01,$43,$01,$41,$03,$40,$03 .byte $43,$01,$41,$01,$40,$03,$43,$03 .byte $41,$03,$43,$03,$43,$01,$46,$01 .byte $45,$03,$43,$03,$46,$01,$45,$01 .byte $43,$03,$46,$03,$45,$03,$43,$01 .byte $48,$01,$49,$01,$48,$01,$46,$01 .byte $45,$01,$46,$01,$45,$01,$43,$01 .byte $41,$01,$43,$01,$41,$01,$40,$01 .byte $3d,$01,$39,$01,$3b,$01,$3d,$ff ptn0d: .byte $01,$3e,$01,$39,$01,$35,$01,$39 .byte $01,$3e,$01,$39,$01,$35,$01,$39 .byte $03,$3e,$01,$41,$01,$40,$03,$40 .byte $01,$3d,$01,$3e,$01,$40,$01,$3d .byte $01,$39,$01,$3d,$01,$40,$01,$3d .byte $01,$39,$01,$3d,$03,$40,$01,$43 .byte $01,$41,$03,$41,$01,$3e,$01,$40 .byte $01,$41,$01,$3e,$01,$39,$01,$3e .byte $01,$41,$01,$3e,$01,$39,$01,$3e .byte $03,$41,$01,$45,$01,$43,$03,$43 .byte $01,$40,$01,$41,$01,$43,$01,$40 .byte $01,$3d,$01,$40,$01,$43,$01,$40 .byte $01,$3d,$01,$40,$01,$46,$01,$43 .byte $01,$45,$01,$46,$01,$44,$01,$43 .byte $01,$40,$01,$3d,$ff ptn0f: .byte $01,$3e,$01 .byte $39,$01,$35,$01,$39,$01,$3e,$01 .byte $39,$01,$35,$01,$39,$01,$3e,$01 .byte $39,$01,$35,$01,$39,$01,$3e,$01 .byte $39,$01,$35,$01,$39,$01,$3e,$01 .byte $3a,$01,$37,$01,$3a,$01,$3e,$01 .byte $3a,$01,$37,$01,$3a,$01,$3e,$01 .byte $3a,$01,$37,$01,$3a,$01,$3e,$01 .byte $3a,$01,$37,$01,$3a,$01,$40,$01 .byte $3d,$01,$39,$01,$3d,$01,$40,$01 .byte $3d,$01,$39,$01,$3d,$01,$40,$01 .byte $3d,$01,$39,$01,$3d,$01,$40,$01 .byte $3d,$01,$39,$01,$3d,$01,$41,$01 .byte $3e,$01,$39,$01,$3e,$01,$41,$01 .byte $3e,$01,$39,$01,$3e,$01,$41,$01 .byte $3e,$01,$39,$01,$3e,$01,$41,$01 .byte $3e,$01,$39,$01,$3e,$01,$43,$01 .byte $3e,$01,$3a,$01,$3e,$01,$43,$01 .byte $3e,$01,$3a,$01,$3e,$01,$43,$01 .byte $3e,$01,$3a,$01,$3e,$01,$43,$01 .byte $3e,$01,$3a,$01,$3e,$01,$43,$01 .byte $3f,$01,$3c,$01,$3f,$01,$43,$01 .byte $3f,$01,$3c,$01,$3f,$01,$43,$01 .byte $3f,$01,$3c,$01,$3f,$01,$43,$01 .byte $3f,$01,$3c,$01,$3f,$01,$45,$01 .byte $42,$01,$3c,$01,$42,$01,$45,$01 .byte $42,$01,$3c,$01,$42,$01,$48,$01 .byte $45,$01,$42,$01,$45,$01,$4b,$01 .byte $48,$01,$45,$01,$48,$01,$4b,$01 .byte $4a,$01,$48,$01,$4a,$01,$4b,$01 .byte $4a,$01,$48,$01,$4a,$01,$4b,$01 .byte $4a,$01,$48,$01,$4a,$01,$4c,$01 .byte $4e,$03,$4f,$ff ptn11: .byte $bf,$06,$56,$1f,$57,$1f,$56,$1f .byte $5b,$1f,$56,$1f,$57,$1f,$56,$1f .byte $4f,$ff ptn12: .byte $bf,$0c,$68,$7f,$7f,$7f,$7f,$7f .byte $7f,$7f,$ff ptn13: .byte $bf,$08,$13,$3f,$13,$3f,$13,$3f .byte $13,$3f,$13,$3f,$13,$3f,$13,$1f .byte $13,$ff ptn14: .byte $97,$09,$2e,$03,$2e,$1b,$32,$03 .byte $32,$1b,$31,$03,$31,$1f,$34,$43 .byte $17,$32,$03,$32,$1b,$35,$03,$35 .byte $1b,$34,$03,$34,$0f,$37,$8f,$0a .byte $37,$43,$ff ptn15: .byte $97,$09,$2b,$03,$2b,$1b,$2e,$03 .byte $2e,$1b,$2d,$03,$2d,$1f,$30,$43 .byte $17,$2e,$03,$2e,$1b,$32,$03,$32 .byte $1b,$31,$03,$31,$0f,$34,$8f,$0a .byte $34,$43,$ff ptn16: .byte $0f,$1f,$0f,$1f,$0f,$1f,$0f,$1f .byte $0f,$1f,$0f,$1f,$0f,$1f,$0f,$1f .byte $0f,$1f,$0f,$1f,$0f,$1f,$0f,$1f .byte $0f,$1f,$0f,$1f,$0f,$1f,$0f,$1f .byte $ff ptn17: .byte $97,$09,$33,$03,$33,$1b,$37,$03 .byte $37,$1b,$36,$03,$36,$1f,$39,$43 .byte $17,$37,$03,$37,$1b,$3a,$03,$3a .byte $1b,$39,$03,$39,$2f,$3c,$21,$3c .byte $21,$3d,$21,$3e,$21,$3f,$21,$40 .byte $21,$41,$21,$42,$21,$43,$21,$44 .byte $01,$45,$ff ptn18: .byte $97,$09,$30,$03,$30,$1b,$33,$03 .byte $33,$1b,$32,$03,$32,$1f,$36,$43 .byte $17,$33,$03,$33,$1b,$37,$03,$37 .byte $1b,$36,$03,$36,$2f,$39,$21,$39 .byte $21,$3a,$21,$3b,$21,$3c,$21,$3d .byte $21,$3e,$21,$3f,$21,$40,$21,$41 .byte $01,$42,$ff ptn19: .byte $0f,$1a,$0f,$1a,$0f,$1a,$0f,$1a .byte $0f,$1a,$0f,$1a,$0f,$1a,$0f,$1a .byte $0f,$1a,$0f,$1a,$0f,$1a,$0f,$1a .byte $0f,$1a,$0f,$1a,$0f,$1a,$0f,$1a .byte $ff ptn1a: .byte $1f,$46,$bf,$0a,$46,$7f,$7f,$ff ptn1b: .byte $1f,$43,$bf,$0a,$43,$7f,$ff ptn1c: .byte $83,$02,$13,$03,$13,$03,$1e,$03 .byte $1f,$03,$13,$03,$13,$03,$1e,$03 .byte $1f,$03,$13,$03,$13,$03,$1e,$03 .byte $1f,$03,$13,$03,$13,$03,$1e,$03 .byte $1f,$03,$13,$03,$13,$03,$1e,$03 .byte $1f,$03,$13,$03,$13,$03,$1e,$03 .byte $1f,$03,$13,$03,$13,$03,$1e,$03 .byte $1f,$03,$13,$03,$13,$03,$1e,$03 .byte $1f,$ff ptn29: .byte $8f,$0b,$38,$4f,$ff ptn2c: .byte $83,$0e,$32,$07,$32,$07,$2f,$07 .byte $2f,$03,$2b,$87,$0b,$46,$83,$0e .byte $2c,$03,$2c,$8f,$0b,$32,$ff ptn2d: .byte $43,$83,$0e,$32,$03,$32,$03,$2f .byte $03,$2f,$03,$2c,$87,$0b,$38,$ff ptn39: .byte $83,$01 .byte $43,$01,$4f,$01,$5b,$87,$03,$2f .byte $83,$01,$43,$01,$4f,$01,$5b,$87 .byte $03,$2f,$83,$01,$43,$01,$4f,$01 .byte $5b,$87,$03,$2f,$83,$01,$43,$01 .byte $4f,$01,$5b,$87,$03,$2f,$83,$01 .byte $43,$01,$4f,$01,$5b,$87,$03,$2f .byte $83,$01,$43,$01,$4f,$01,$5b,$87 .byte $03,$2f ptn01: .byte $83,$01,$43,$01,$4f,$01,$5b,$87 .byte $03,$2f,$83,$01,$43,$01,$4f,$01 .byte $5b,$87,$03,$2f,$ff ptn02: .byte $83,$02,$13,$03,$13,$03,$1f,$03 .byte $1f,$03,$13,$03,$13,$03,$1f,$03 .byte $1f,$ff ptn1d: .byte $03,$15,$03,$15,$03,$1f,$03,$21 .byte $03,$15,$03,$15,$03,$1f,$03,$21 .byte $ff ptn1e: .byte $03,$1a,$03,$1a,$03,$1c,$03,$1c .byte $03,$1d,$03,$1d,$03,$1e,$03,$1e .byte $ff ptn1f: .byte $03,$1a,$03,$1a,$03,$24,$03,$26 .byte $03,$13,$03,$13,$07,$1f,$ff ptn04: .byte $03,$18,$03,$18,$03,$24,$03,$24 .byte $03,$18,$03,$18,$03,$24,$03,$24 .byte $03,$20,$03,$20,$03,$2c,$03,$2c .byte $03,$20,$03,$20,$03,$2c,$03,$2c .byte $ff ptn20: .byte $03,$19,$03,$19,$03 .byte $25,$03,$25,$03,$19,$03,$19,$03 .byte $25,$03,$25,$03,$21,$03,$21,$03 .byte $2d,$03,$2d,$03,$21,$03,$21,$03 .byte $2d,$03,$2d,$ff ptn06: .byte $03,$1a,$03,$1a .byte $03,$26,$03,$26,$03,$1a,$03,$1a .byte $03,$26,$03,$26,$03,$15,$03,$15 .byte $03,$21,$03,$21,$03,$15,$03,$15 .byte $03,$21,$03,$21,$03,$18,$03,$18 .byte $03,$24,$03,$24,$03,$18,$03,$18 .byte $03,$24,$03,$24,$03,$1f,$03,$1f .byte $03,$2b,$03,$2b,$03,$1f,$03,$1f .byte $03,$2b,$03,$2b,$03,$1a,$03,$1a .byte $03,$26,$03,$26,$03,$1a,$03,$1a .byte $03,$26,$03,$26,$03,$15,$03,$15 .byte $03,$21,$03,$21,$03,$15,$03,$15 .byte $03,$21,$03,$21,$03,$18,$03,$18 .byte $03,$24,$03,$24,$03,$18,$03,$18 .byte $03,$24,$03,$24,$03,$1c,$03,$1c .byte $03,$28,$03,$28,$03,$1c,$03,$1c .byte $03,$28,$03,$28 ptn3b: .byte $83,$04,$36,$07 .byte $36,$07,$37,$07,$36,$03,$33,$07 .byte $32,$57,$ff ptn08: .byte $83,$02,$1b,$03,$1b,$03,$27,$03 .byte $27,$03,$1b,$03,$1b,$03,$27,$03 .byte $27,$ff ptn21: .byte $03,$1c,$03,$1c,$03,$28,$03,$28 .byte $03,$1c,$03,$1c,$03,$28,$03,$28 .byte $ff ptn22: .byte $03,$1d,$03,$1d,$03,$29,$03,$29 .byte $03,$1d,$03,$1d,$03,$29,$03,$29 .byte $ff ptn23: .byte $03,$18,$03,$18,$03,$24,$03,$24 .byte $03,$18,$03,$18,$03,$24,$03,$24 .byte $ff ptn24: .byte $03,$1e,$03,$1e,$03,$2a,$03,$2a .byte $03,$1e,$03,$1e,$03,$2a,$03,$2a .byte $ff ptn25: .byte $83,$05,$26,$01,$4a,$01,$34,$03 .byte $29,$03,$4c,$03,$4a,$03,$31,$03 .byte $4a,$03,$24,$03,$22,$01,$46,$01 .byte $30,$03,$25,$03,$48,$03,$46,$03 .byte $2d,$03,$46,$03,$24,$ff ptn0b: .byte $83,$02,$1a,$03,$1a,$03,$26,$03 .byte $26,$03,$1a,$03,$1a,$03,$26,$03 .byte $26,$ff ptn0c: .byte $03,$13,$03,$13,$03,$1d,$03,$1f .byte $03,$13,$03,$13,$03,$1d,$03,$1f .byte $ff ptn26: .byte $87,$02,$1a,$87,$03,$2f,$83,$02 .byte $26,$03,$26,$87,$03,$2f,$ff ptn10: .byte $07,$1a,$4f,$47,$ff ptn0e: .byte $03,$1f,$03,$1f,$03,$24,$03,$26 .byte $07,$13,$47,$ff ptn30: .byte $bf,$0f,$32,$0f,$32,$8f,$90,$30 .byte $3f,$32,$13,$32,$03,$32,$03,$35 .byte $03,$37,$3f,$37,$0f,$37,$8f,$90 .byte $30,$3f,$32,$13,$32,$03,$2d,$03 .byte $30,$03,$32,$ff ptn31: .byte $0f,$32 .byte $af,$90,$35,$0f,$37,$a7,$99,$37 .byte $07,$35,$3f,$32,$13,$32,$03,$32 .byte $a3,$e8,$35,$03,$37,$0f,$35,$af .byte $90,$37,$0f,$37,$a7,$99,$37,$07 .byte $35,$3f,$32,$13,$32,$03,$2d,$a3 .byte $e8,$30,$03,$32,$ff ptn32: .byte $07,$32,$03 .byte $39,$13,$3c,$a7,$9a,$37,$a7,$9b .byte $38,$07,$37,$03,$35,$03,$32,$03 .byte $39,$1b,$3c,$a7,$9a,$37,$a7,$9b .byte $38,$07,$37,$03,$35,$03,$32,$03 .byte $39,$03,$3c,$03,$3e,$03,$3c,$07 .byte $3e,$03,$3c,$03,$39,$a7,$9a,$37 .byte $a7,$9b,$38,$07,$37,$03,$35,$03 .byte $32,$af,$90,$3c,$1f,$3e,$43,$03 .byte $3e,$03,$3c,$03,$3e,$ff ptn33: .byte $03,$3e .byte $03,$3e,$a3,$e8,$3c,$03,$3e,$03 .byte $3e,$03,$3e,$a3,$e8,$3c,$03,$3e .byte $03,$3e,$03,$3e,$a3,$e8,$3c,$03 .byte $3e,$03,$3e,$03,$3e,$a3,$e8,$3c .byte $03,$3e,$af,$91,$43,$1f,$41,$43 .byte $03,$3e,$03,$41,$03,$43,$03,$43 .byte $03,$43,$a3,$e8,$41,$03,$43,$03 .byte $43,$03,$43,$a3,$e8,$41,$03,$43 .byte $03,$45,$03,$48,$a3,$fd,$45,$03 .byte $44,$01,$43,$01,$41,$03,$3e,$03 .byte $3c,$03,$3e,$2f,$3e,$bf,$98,$3e .byte $43,$03,$3e,$03,$3c,$03,$3e,$ff ptn34: .byte $03,$4a,$03,$4a,$a3,$f8,$48,$03 .byte $4a,$03,$4a,$03,$4a,$a3,$f8,$48 .byte $03,$4a,$ff ptn35: .byte $01,$51,$01,$54,$01 .byte $51,$01,$54,$01,$51,$01,$54,$01 .byte $51,$01,$54,$01,$51,$01,$54,$01 .byte $51,$01,$54,$01,$51,$01,$54,$01 .byte $51,$01,$54,$ff ptn36: .byte $01,$50,$01,$4f .byte $01,$4d,$01,$4a,$01,$4f,$01,$4d .byte $01,$4a,$01,$48,$01,$4a,$01,$48 .byte $01,$45,$01,$43,$01,$44,$01,$43 .byte $01,$41,$01,$3e,$01,$43,$01,$41 .byte $01,$3e,$01,$3c,$01,$3e,$01,$3c .byte $01,$39,$01,$37,$01,$38,$01,$37 .byte $01,$35,$01,$32,$01,$37,$01,$35 .byte $01,$32,$01,$30,$ff ptn37: .byte $5f,$5f,$5f .byte $47,$83,$0e,$32,$07,$32,$07,$2f .byte $03,$2f,$07,$2f,$97,$0b,$3a,$5f .byte $5f,$47,$8b,$0e,$32,$03,$32,$03 .byte $2f,$03,$2f,$47,$97,$0b,$3a,$5f .byte $5f,$47,$83,$0e,$2f,$0b,$2f,$03 .byte $2f,$03,$2f,$87,$0b,$30,$17,$3a .byte $5f,$8b,$0e,$32,$0b,$32,$0b,$2f .byte $0b,$2f,$07,$2c,$07,$2c,$ff ptn38: .byte $87 .byte $0b,$34,$17,$3a,$5f,$5f,$84,$0e .byte $32,$04,$32,$05,$32,$04,$2f,$04 .byte $2f,$05,$2f,$47,$97,$0b,$3a,$5f .byte $5f,$84,$0e,$32,$04,$32,$05,$32 .byte $04,$2f,$04,$2f,$05,$2f,$ff ptn2f: .byte $03,$1a,$03,$1a,$03 .byte $24,$03,$26,$03,$1a,$03,$1a,$03 .byte $18,$03,$19,$03,$1a,$03,$1a,$03 .byte $24,$03,$26,$03,$1a,$03,$1a,$03 .byte $18,$03,$19,$03,$18,$03,$18,$03 .byte $22,$03,$24,$03,$18,$03,$18,$03 .byte $16,$03,$17,$03,$18,$03,$18,$03 .byte $22,$03,$24,$03,$18,$03,$18,$03 .byte $16,$03,$17,$03,$13,$03,$13,$03 .byte $1d,$03,$1f,$03,$13,$03,$13,$03 .byte $1d,$03,$1e,$03,$13,$03,$13,$03 .byte $1d,$03,$1f,$03,$13,$03,$13,$03 .byte $1d,$03,$1e,$03,$1a,$03,$1a,$03 .byte $24,$03,$26,$03,$1a,$03,$1a,$03 .byte $18,$03,$19,$03,$1a,$03,$1a,$03 .byte $24,$03,$26,$03,$1a,$03,$1a,$03 .byte $18,$03,$19,$ff //==================================== //instruments //==================================== instr: .byte $80,$09,$41,$48,$60,$03,$81,$00 .byte $00,$08,$81,$02,$08,$00,$00,$01 .byte $a0,$02,$41,$09,$80,$00,$00,$00 .byte $00,$02,$81,$09,$09,$00,$00,$05 .byte $00,$08,$41,$08,$50,$02,$00,$04 .byte $00,$01,$41,$3f,$c0,$02,$00,$00 .byte $00,$08,$41,$04,$40,$02,$00,$00 .byte $00,$08,$41,$09,$00,$02,$00,$00 .byte $00,$09,$41,$09,$70,$02,$5f,$04 .byte $00,$09,$41,$4a,$69,$02,$81,$00 .byte $00,$09,$41,$40,$6f,$00,$81,$02 .byte $80,$07,$81,$0a,$0a,$00,$00,$01 .byte $00,$09,$41,$3f,$ff,$01,$e7,$02 .byte $00,$08,$41,$90,$f0,$01,$e8,$02 .byte $00,$08,$41,$06,$0a,$00,$00,$01 .byte $00,$09,$41,$19,$70,$02,$a8,$00 .byte $00,$02,$41,$09,$90,$02,$00,$00 .byte $00,$00,$11,$0a,$fa,$00,$00,$05 .byte $00,$08,$41,$37,$40,$02,$00,$00 .byte $00,$08,$11,$07,$70,$02,$00,$00