base:microtracker_v1.0
no way to compare when less than two revisions
Differences
This shows you the differences between two versions of the page.
— | base:microtracker_v1.0 [2015-04-17 04:32] (current) – created - external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Microtracker V1.0 ====== | ||
+ | By The Syndrom | ||
+ | |||
+ | I coded this player when Crossbow made an incredible demopart using almost every rasterline (some multiplexer) and we talked about being able to have 'full featured' | ||
+ | |||
+ | As I lost my original sourcedisks, | ||
+ | |||
+ | < | ||
+ | |||
+ | / | ||
+ | |||
+ | .pc =$0801 "Basic Upstart Program" | ||
+ | .var startup=$0900 | ||
+ | |||
+ | : | ||
+ | |||
+ | // | ||
+ | // | ||
+ | // | ||
+ | // | ||
+ | // | ||
+ | .pc = startup "Main Program" | ||
+ | |||
+ | lda #$00 | ||
+ | sta $d020 | ||
+ | sta $d021 | ||
+ | lda #$00 | ||
+ | jsr musicinit // | ||
+ | jsr $e544 | ||
+ | sei | ||
+ | lda #<irq1 | ||
+ | sta $0314 | ||
+ | lda #>irq1 | ||
+ | sta $0315 | ||
+ | asl $d019 | ||
+ | lda #$7b | ||
+ | sta $dc0d | ||
+ | lda #$81 | ||
+ | sta $d01a | ||
+ | lda #$1b | ||
+ | sta $d011 | ||
+ | lda #$80 | ||
+ | sta $d012 | ||
+ | cli | ||
+ | this: jmp this | ||
+ | // | ||
+ | irq1: | ||
+ | asl $d019 | ||
+ | : | ||
+ | lda $d012 | ||
+ | sta timer | ||
+ | jsr musicplay // play music | ||
+ | lda $d012 | ||
+ | sec | ||
+ | sbc timer | ||
+ | clc | ||
+ | adc #$30 | ||
+ | cmp $0400 | ||
+ | bcc notbigger | ||
+ | sta $0400 | ||
+ | notbigger: | ||
+ | pla | ||
+ | tay | ||
+ | pla | ||
+ | tax | ||
+ | pla | ||
+ | rti | ||
+ | |||
+ | timer: .byte $00 | ||
+ | |||
+ | .macro SetBorderColor(color) { | ||
+ | lda #color | ||
+ | sta $d020 | ||
+ | } | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | .pc = $1000 | ||
+ | musicinit: | ||
+ | musicplay: | ||
+ | |||
+ | .var hardrestartcounter=3 | ||
+ | |||
+ | hardrestartindex: | ||
+ | .byte 0, | ||
+ | |||
+ | .text " | ||
+ | |||
+ | |||
+ | // | ||
+ | //uses $30-$47 by default - if you have to split, insert new calculation inbetween (i=$xx) | ||
+ | |||
+ | |||
+ | .var i =$30 | ||
+ | .var voice1pointer=i | ||
+ | .var voice2pointer=[i=i+2] | ||
+ | .var voice3pointer=[i=i+2] | ||
+ | .var sound1pointer=[i=i+2] | ||
+ | .var sound2pointer=[i=i+2] | ||
+ | .var sound3pointer=[i=i+2] | ||
+ | .var duration1=[i=i+2] | ||
+ | .var duration2=[i=i+1] | ||
+ | .var duration3=[i=i+1] | ||
+ | .var sound1index=[i=i+1] | ||
+ | .var note3=[i=i+1] | ||
+ | .var sound2index=[i=i+1] | ||
+ | .var note2=[i=i+1] | ||
+ | .var sound3index=[i=i+1] | ||
+ | .var pulsecontrol=[i=i+1] | ||
+ | .var vibratopointer=[i=i+1] | ||
+ | .var vibratoindex=[i=i+2] | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | init: ldy # | ||
+ | lda #$00 | ||
+ | loop1: sta $d400,y | ||
+ | dey | ||
+ | bpl loop1 | ||
+ | ldy #$0e | ||
+ | ldx #$02 | ||
+ | loop2: lda pulseinit, | ||
+ | sta $d403,y | ||
+ | lda waveinit,x | ||
+ | sta $d404, | ||
+ | lda #$00 | ||
+ | sta $d405, | ||
+ | lda #$01 | ||
+ | sta duration1,x | ||
+ | lda voiceinit,x | ||
+ | sta voice1pointer, | ||
+ | lda voiceinit+3, | ||
+ | sta voice1pointer+3, | ||
+ | lda sidvalues,x | ||
+ | sta $d416,x | ||
+ | tya | ||
+ | sec | ||
+ | sbc #$07 | ||
+ | tay | ||
+ | dex | ||
+ | bpl loop2 | ||
+ | rts | ||
+ | pulseinit: | ||
+ | .byte $08,$03,$03 | ||
+ | waveinit: | ||
+ | .byte $08,$08,$08 | ||
+ | voiceinit: | ||
+ | .word voice1 | ||
+ | .word voice2 | ||
+ | .word voice3 | ||
+ | voiceloop: | ||
+ | .word voice1loop | ||
+ | .word voice2loop | ||
+ | .word voice3loop | ||
+ | |||
+ | sidvalues: | ||
+ | .byte $00,$f4,$1f | ||
+ | |||
+ | play: ldx #$00 | ||
+ | dec duration1 | ||
+ | beq branch1 | ||
+ | lda duration1 | ||
+ | cmp # | ||
+ | bcs branch2 | ||
+ | stx $d405 | ||
+ | stx $d406 | ||
+ | stx $d404 | ||
+ | jmp branch1109 | ||
+ | |||
+ | branch1: | ||
+ | lda (voice1pointer), | ||
+ | sta sound1pointer | ||
+ | iny | ||
+ | lda (voice1pointer), | ||
+ | beq restartmusic | ||
+ | sta sound1pointer+1 | ||
+ | iny | ||
+ | lda (voice1pointer), | ||
+ | sta duration1 | ||
+ | lda voice1pointer | ||
+ | clc | ||
+ | adc #$03 | ||
+ | sta voice1pointer | ||
+ | lda voice1pointer+1 | ||
+ | adc #$00 | ||
+ | sta voice1pointer+1 | ||
+ | ldy #$00 | ||
+ | lda (sound1pointer), | ||
+ | sta $d406 | ||
+ | sty $d405 | ||
+ | iny | ||
+ | sty $d404 | ||
+ | sty sound1index | ||
+ | jmp branch1109 | ||
+ | |||
+ | restartmusic: | ||
+ | loop3: lda voiceloop,x | ||
+ | sta voice1pointer, | ||
+ | lda voiceloop+3, | ||
+ | sta voice1pointer+3, | ||
+ | lda #$01 | ||
+ | sta duration1,x | ||
+ | dex | ||
+ | bpl loop3 | ||
+ | lda #$08 | ||
+ | sta $d404 | ||
+ | sta $d40b | ||
+ | sta $d412 | ||
+ | rts | ||
+ | |||
+ | branch2:/ | ||
+ | lda (sound1pointer), | ||
+ | beq branch1109 | ||
+ | sta $d401 | ||
+ | iny | ||
+ | lda (sound1pointer), | ||
+ | sta $d404 | ||
+ | iny | ||
+ | sty sound1index | ||
+ | branch1109: | ||
+ | beq branch111c | ||
+ | lda duration3 | ||
+ | cmp # | ||
+ | bcs branch1151 | ||
+ | stx $d405 | ||
+ | stx $d406 | ||
+ | stx $d404 | ||
+ | jmp branch1185 | ||
+ | branch111c: | ||
+ | lda (voice3pointer), | ||
+ | sta sound3pointer | ||
+ | iny | ||
+ | lda (voice3pointer), | ||
+ | sta sound3pointer+1 | ||
+ | iny | ||
+ | lda (voice3pointer), | ||
+ | sta duration3 | ||
+ | iny | ||
+ | lda (voice3pointer), | ||
+ | sta note3 | ||
+ | lda voice3pointer | ||
+ | clc | ||
+ | adc #$04 | ||
+ | sta voice3pointer | ||
+ | lda voice3pointer+1 | ||
+ | adc #$00 | ||
+ | sta voice3pointer+1 | ||
+ | ldy #$00 | ||
+ | lda (sound3pointer), | ||
+ | sta $d414 //sr | ||
+ | sty $d413 //ad | ||
+ | iny | ||
+ | sty $d412 // | ||
+ | sty sound3index | ||
+ | jmp branch1185 | ||
+ | |||
+ | branch1151: | ||
+ | lda (sound3pointer), | ||
+ | beq branch115e | ||
+ | cmp #$ff | ||
+ | bne branch1166 | ||
+ | jmp branch1185 | ||
+ | branch115e: | ||
+ | lda (sound3pointer), | ||
+ | sta sound3index | ||
+ | tay | ||
+ | lda (sound3pointer), | ||
+ | branch1166: | ||
+ | iny | ||
+ | lda (sound3pointer), | ||
+ | sta $d412 // | ||
+ | iny | ||
+ | lda (sound3pointer), | ||
+ | iny | ||
+ | sty sound3index | ||
+ | clc | ||
+ | adc note3 | ||
+ | tay | ||
+ | lda freqhi,y | ||
+ | sta $d40f | ||
+ | lda freqlo,y | ||
+ | sta $d40e | ||
+ | branch1185: | ||
+ | beq branch1196 | ||
+ | lda duration2 | ||
+ | cmp # | ||
+ | bcs branch11da | ||
+ | stx $d405 | ||
+ | stx $d406 | ||
+ | stx $d404 | ||
+ | rts | ||
+ | branch1196: | ||
+ | lda (voice2pointer), | ||
+ | sta sound2pointer | ||
+ | iny | ||
+ | lda (voice2pointer), | ||
+ | sta sound2pointer+1 | ||
+ | iny | ||
+ | lda (voice2pointer), | ||
+ | sta duration2 | ||
+ | iny | ||
+ | lda (voice2pointer), | ||
+ | sta note2 | ||
+ | lda voice2pointer | ||
+ | clc | ||
+ | adc #$04 | ||
+ | sta voice2pointer | ||
+ | lda voice2pointer+1 | ||
+ | adc #$00 | ||
+ | sta voice2pointer+1 | ||
+ | ldy #$00 | ||
+ | sty vibratoindex | ||
+ | lda (sound2pointer), | ||
+ | sta $d40d //sr | ||
+ | sty $d40c //ad | ||
+ | iny | ||
+ | sty $d40b // | ||
+ | lda (sound2pointer), | ||
+ | sta pulsecontrol | ||
+ | iny | ||
+ | lda (sound2pointer), | ||
+ | sta vibratopointer | ||
+ | iny | ||
+ | lda (sound2pointer), | ||
+ | sta vibratopointer+1 | ||
+ | iny | ||
+ | sty sound2index | ||
+ | rts | ||
+ | branch11da: | ||
+ | lda (sound2pointer), | ||
+ | beq branch11e5 | ||
+ | cmp #$ff | ||
+ | bne branch11ed | ||
+ | rts | ||
+ | branch11e5: | ||
+ | lda(sound2pointer), | ||
+ | sta sound2index | ||
+ | tay | ||
+ | lda (sound2pointer), | ||
+ | |||
+ | |||
+ | branch11ed: | ||
+ | lda pulsecontrol | ||
+ | beq branch1200 | ||
+ | iny | ||
+ | lda (sound2pointer), | ||
+ | sta $d409 // | ||
+ | iny | ||
+ | lda (sound2pointer), | ||
+ | sta $d40a // | ||
+ | branch1200: | ||
+ | lda (sound2pointer), | ||
+ | iny | ||
+ | sty sound2index | ||
+ | clc | ||
+ | adc note2 | ||
+ | tax | ||
+ | lda freqlo,x | ||
+ | ldy vibratoindex | ||
+ | iny | ||
+ | clc | ||
+ | adc (vibratopointer), | ||
+ | sta $d407 | ||
+ | dey | ||
+ | lda freqhi,x | ||
+ | adc (vibratopointer), | ||
+ | sta $d408 | ||
+ | iny | ||
+ | iny | ||
+ | lda (vibratopointer), | ||
+ | cmp #$80 | ||
+ | beq branch122a | ||
+ | sty vibratoindex | ||
+ | rts | ||
+ | branch122a: | ||
+ | lda (vibratopointer), | ||
+ | sta vibratoindex | ||
+ | rts | ||
+ | branch1230: | ||
+ | lda freqhi,x | ||
+ | sta $d408 | ||
+ | rts | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | freqlo: | ||
+ | .byte $0c, | ||
+ | .byte $a9, | ||
+ | .byte $a3, | ||
+ | .byte $30, | ||
+ | .byte $a7, | ||
+ | .byte $8f, | ||
+ | .byte $c3, | ||
+ | .byte $9c, | ||
+ | .byte $3e, | ||
+ | .byte $0f, | ||
+ | .byte $73, | ||
+ | .byte $fa, | ||
+ | |||
+ | freqhi: | ||
+ | .byte $01, | ||
+ | .byte $01, | ||
+ | .byte $02, | ||
+ | .byte $04, | ||
+ | .byte $06, | ||
+ | .byte $0a, | ||
+ | .byte $10, | ||
+ | .byte $1a, | ||
+ | .byte $2a, | ||
+ | .byte $43, | ||
+ | .byte $6a, | ||
+ | .byte $a8, | ||
+ | |||
+ | // | ||
+ | //sounddata | ||
+ | //format voice1 (Drumtrack): | ||
+ | //.byte SR Value | ||
+ | //.byte Freqhi,wave | ||
+ | //.byte Freqhi,wave - if freqhi=0 -> end of sound | ||
+ | |||
+ | basedrum: | ||
+ | .byte $f7, | ||
+ | |||
+ | snare: | ||
+ | .byte $f9, | ||
+ | |||
+ | hihat: | ||
+ | .byte $84, | ||
+ | |||
+ | |||
+ | // | ||
+ | //format voice2 (vibratotrack): | ||
+ | //first frame | ||
+ | //.byte SR Value | ||
+ | //.byte pulsecontrol | ||
+ | //.word vibratooffset | ||
+ | //following frames | ||
+ | //.byte wave =$0 -> next byte is loopindex, =$FF -> end | ||
+ | //.byte noteoffset | ||
+ | //if pulse = on | ||
+ | //.byte wave, | ||
+ | |||
+ | silence02: | ||
+ | .byte $00,$00 .word novibrato | ||
+ | .byte $08,$00,$ff | ||
+ | |||
+ | |||
+ | chord: | ||
+ | .byte $6a,$01 .word novibrato | ||
+ | .byte $41, | ||
+ | .byte $41, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $00,$0c | ||
+ | |||
+ | chord1: | ||
+ | .byte $6a,$01 .word novibrato | ||
+ | .byte $41, | ||
+ | .byte $41, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $00,$0c | ||
+ | |||
+ | chord2: | ||
+ | .byte $6a,$01 .word novibrato | ||
+ | .byte $41, | ||
+ | .byte $41, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $40, | ||
+ | .byte $00,$0c | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | // | ||
+ | //format voice3 (filtertrack): | ||
+ | //first frame | ||
+ | //.byte SR Value | ||
+ | //following frames | ||
+ | //.byte Filterhigh, | ||
+ | //note: if filterhigh=$00, | ||
+ | |||
+ | silence03: | ||
+ | .byte $00 | ||
+ | .byte $fe,$08,$00 | ||
+ | .byte $ff | ||
+ | |||
+ | filterbass: | ||
+ | .byte $b9 | ||
+ | .byte $f0,$41,$00 | ||
+ | .byte $a0,$41,$00 | ||
+ | .byte $50,$41,$00 | ||
+ | .byte $20,$41,$00 | ||
+ | .byte $18,$41,$01 | ||
+ | .byte $14,$41,$00 | ||
+ | .byte $10,$41,$00 | ||
+ | .byte $0c,$40,$ff | ||
+ | .byte $08,$40,$00 | ||
+ | .byte $ff | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | // | ||
+ | // | ||
+ | //.byte addvalue-high, | ||
+ | |||
+ | novibrato: | ||
+ | .byte $00, | ||
+ | |||
+ | |||
+ | |||
+ | // | ||
+ | //musicdata | ||
+ | |||
+ | voice1: | ||
+ | voice1loop: | ||
+ | |||
+ | //format .word soundoffset, | ||
+ | |||
+ | |||
+ | //simple rythm | ||
+ | // | ||
+ | .word basedrum .byte $0c | ||
+ | .word hihat .byte $06 | ||
+ | .word hihat .byte $06 | ||
+ | .word snare .byte $0c | ||
+ | .word hihat .byte $06 | ||
+ | .word hihat .byte $06 | ||
+ | |||
+ | //simple rythm | ||
+ | // | ||
+ | .word basedrum .byte $0c | ||
+ | .word hihat .byte $06 | ||
+ | .word hihat .byte $06 | ||
+ | .word snare .byte $0c | ||
+ | .word hihat .byte $06 | ||
+ | .word hihat .byte $06 | ||
+ | |||
+ | //simple rythm | ||
+ | // | ||
+ | .word basedrum .byte $0c | ||
+ | .word hihat .byte $06 | ||
+ | .word hihat .byte $06 | ||
+ | .word snare .byte $0c | ||
+ | .word hihat .byte $06 | ||
+ | .word hihat .byte $06 | ||
+ | |||
+ | //simple rythm+doublesnare | ||
+ | // | ||
+ | .word basedrum .byte $0c | ||
+ | .word hihat .byte $06 | ||
+ | .word hihat .byte $06 | ||
+ | .word snare .byte $06 | ||
+ | .word snare .byte $06 | ||
+ | .word hihat .byte $06 | ||
+ | .word snare .byte $06 | ||
+ | |||
+ | |||
+ | .word $0000 | ||
+ | // | ||
+ | voice2: | ||
+ | voice2loop: | ||
+ | |||
+ | //format .word soundoffset, | ||
+ | |||
+ | |||
+ | .word silence02 .byte $0c,$00 | ||
+ | .word chord .byte $24,$34 | ||
+ | |||
+ | .word chord1 .byte $30,$34 | ||
+ | |||
+ | .word silence02 .byte $0c,$00 | ||
+ | .word chord .byte $24,$2d | ||
+ | |||
+ | .word chord2 .byte $30,$2d | ||
+ | |||
+ | |||
+ | // | ||
+ | voice3: | ||
+ | voice3loop: | ||
+ | |||
+ | //format .word soundoffset, | ||
+ | |||
+ | .word filterbass .byte $12,$1c | ||
+ | .word filterbass .byte $12,$1c | ||
+ | .word filterbass .byte $0c,$1a | ||
+ | |||
+ | .word filterbass .byte $12,$17 | ||
+ | .word silence03 .byte $1e,$00 | ||
+ | |||
+ | .word filterbass .byte $12,$15 | ||
+ | .word filterbass .byte $12,$15 | ||
+ | .word filterbass .byte $0c,$17 | ||
+ | |||
+ | .word filterbass .byte $12,$10 | ||
+ | .word silence03 .byte $1e,$00 | ||
+ | |||
+ | |||
+ | </ |
base/microtracker_v1.0.txt · Last modified: 2015-04-17 04:32 by 127.0.0.1