Iceball (commodore 64 tune)

A tune made in assembler code

This tune was made on the Commodore 64 home computer somewhere in 1996. Although there were plenty of music editors to create music in by that time, I chose a very arcane way of doing things; by using assembler code.

The reason to do it like this is because I was after the specific sound of the excellent music routine by Laxity, and also to learn about how such a music routine works internally. To do this, I reversed engineered the binary data of one of Laxity’s tunes. The source code of the tune is below the video.

Source code

Here’s the source code for the tune, converted from Turbo Assembler (c64) to Kickassembler (cross-platform). The assembler code is the same, the only differences are the syntax of higher-level constructions like labels, constants and comments.

.pc =$0801 "Basic Upstart Program"
:BasicUpstart(player)
//---------------------------------------
//LAXITY 3x Player, re-assembled and
//                  modified by
//                  Youth/HeatWave
//Modifications:
//  - multiple song support
//  - track wrap around ($fd,<pos>)
//---------------------------------------
.var musicloc = $1000
.var musicstr = musicloc
//---------------------------------------

.var afd      = $fd
.var afe      = $fe
.var aff      = $ff

         .pc= musicloc-3

         jmp player
init:    jmp myinit
play:    jmp playhere
         jmp i155d
//---------------------------------------
         .text " music by heatwave "
         .text " player by laxity "
//---------------------------------------
myinit:  tay
         ldx speeds,y
         stx speed
         sty plus
         asl
         clc
.label plus     = *+1
         adc #0
         tay
         ldx #0
alf:     lda tplo,y
         sta f1563,x
         lda tphi,y
         sta f1566,x
         iny
         inx
         cpx #3
         bne alf
         jmp i1557
//---------------------------------------
playhere: lda #$1f
         sta $d418
         bit a1572
         bmi i1047
         bvs i1046
         ldx #$02
i1014:   lda #$01
         sta f157c,x
         lda #$00
         sta f15df,x
         sta f15ee,x
         sta f15e8,x
         sta f15c4,x
         sta f15a9,x
         sta f1588,x
         sta f15eb,x
         dex
         bpl i1014
         ldy #$14
i1035:   sta $d400,y
         dey
         bpl i1035
         lda a156f
         sta a1570
         lda #$80
         sta a1572
i1046:   rts
i1047:   ldx #$02
         dec a1570
         bpl i105d
         dec a157c
         dec a157d
         dec a157e
         lda a156f
         sta a1570
i105d:   lda #$00
         sta a1575
i1062:   lda f1569,x
         sta a1573
         lda f157c,x
         bpl i1070
         jmp i10fa
i1070:   bne i107e
         lda a1570
         beq i10b9
         cmp #$03
         bcs i107e
         jmp i1081
i107e:   jmp i1258
i1081:   lda f15e5,x
         bne i10b6
         lda a156f
         cmp #$03
         bcs i1092
         lda f15af,x
         beq i10a1
i1092:   lda a1570
         cmp #$02
         beq i10b1
         lda #$00
         sta f15a6,x
         jmp i1258
i10a1:   lda a1570
         bne i10b6
         ldy f1588,x
         lda f16b2,y
         and #$f0
         sta f15a6,x
i10b1:   lda #$fe
         sta f15a9,x
i10b6:   jmp i1258
i10b9:   lda f1563,x
         sta afd
         lda f1566,x
         sta afe
         ldy f15df,x
i10c6:   lda (afd),y
         bpl i10f0
         cmp #$ff
         bne i10d3
         ldy #$00
         jmp i10c6
i10d3:   cmp #$fe
         bne i10da
         jmp i155d
//---------------------------------------
i10da:   cmp #$fd     // added
         bne youf
         iny
         lda (afd),y
         tay
         jmp i10c6
//---------------------------------------
youf:    cmp #$c0
         bcs i10e7
         and #$1f
         sta f1585,x
         iny
         jmp i10c6
i10e7:   and #$1f
         sta f15eb,x
         iny
         jmp i10c6
i10f0:   sta f15e2,x
         tya
         sta f15df,x
         jmp i1258
i10fa:   lda #$00
         sta f15e8,x
         sta f15c4,x
         sta f1591,x
         cmp f15e5,x
         bne i111e
         sta f15ac,x
         sta f1576,x
         sta f1579,x
         sta f159a,x
         sta f1582,x
         lda #$09
         sta f15a3,x
i111e:   ldy f15e2,x
         lda f1859,y
         sta afd
         lda f1874,y
         sta afe
         ldy f15ee,x
         lda (afd),y
         sta aff
         and #$1f
         sta f157c,x
         sta f15af,x
         lda aff
         and #$20
         beq i1143
         inc f15e8,x
i1143:   lda aff
         and #$40
         beq i114c
         inc f15c4,x
i114c:   lda aff
         and #$80
         beq i1192
         iny
         lda (afd),y
         cmp #$80
         bcs i1164
         and #$1f
         asl
         asl
         asl
         sta f1588,x
         jmp i1192
i1164:   sta aff
         cmp #$c0
         bcc i117b
         and #$1f
         asl
         asl
         asl
         sta f1588,x
         iny
         lda (afd),y
         sta f1594,x
         jmp i1192
i117b:   and #$1f
         sta f158e,x
         inc f1591,x
         lda aff
         and #$20
         beq i118c
         inc f1591,x
i118c:   iny
         lda (afd),y
         sta f158b,x
i1192:   iny
         lda (afd),y
         sta f157f,x
         iny
         tya
         sta f15ee,x
         lda (afd),y
         cmp #$ff
         bne i11b5
         dec f15eb,x
         bpl i11b0
         inc f15df,x
         lda #$00
         sta f15eb,x
i11b0:   lda #$00
         sta f15ee,x
i11b5:   lda f157f,x
         beq i11d8
         lda #$ff
         sta f15a9,x
         lda f157f,x
         bmi i11c8
         clc
         adc f1585,x
i11c8:   cmp f1582,x
         beq i1204
         sta f1582,x
         lda #$ff
         sta f15b8,x
         jmp i11e2
i11d8:   lda #$fe
         sta f15a9,x
         lda f15e5,x
         bne i1204
i11e2:   ldy f1588,x
         lda f16b3,y
         and #$0f
         sta f15d3,x
         inc f15d3,x
         lsr
         adc #$00
         sta f15b2,x
         lda #$00
         sta f15b5,x
         sta f15d0,x
         sta f15d9,x
         sta f15dc,x
i1204:   lda f15e5,x
         beq i1211
         lda #$02
         sta f15e5,x
         jmp i1258
i1211:   ldy f1588,x
         lda f16b2,y
         sta f15a6,x
         lda f16b5,y
         pha
         and #$0f
         sta f15a0,x
         pla
         and #$f0
         sta f159d,x
         lda f16b6,y
         sta f1597,x
         lda f16b4,y
         sta f15d6,x
         lda f16b7,y
         and #$40
         beq i1255
         lda f15c7,x
         bne i1255
         lda #$00
         sta f15c1,x
         lda f16b8,y
         sta f15be,x
         asl
         asl
         tay
         lda f1841,y
         sta a1574
i1255:   jmp i1498
i1258:   lda f1597,x
         beq i12a2
         asl
         asl
         tay
         lda f1829,y
         bmi i127a
         lda f159d,x
         clc
         adc f182a,y
         sta f159d,x
         lda f15a0,x
         adc #$00
         sta f15a0,x
         jmp i128c
i127a:   lda f159d,x
         sec
         sbc f182a,y
         sta f159d,x
         lda f15a0,x
         sbc #$00
         sta f15a0,x
i128c:   inc f159a,x
         lda f159a,x
         cmp f182b,y
         bcc i12a2
         lda #$00
         sta f159a,x
         lda f182c,y
         sta f1597,x
i12a2:   lda f15e5,x
         cmp #$02
         beq i12ef
         lda f1588,x
         clc
         adc f15ac,x
         tay
         inc f15ac,x
         lda f15ac,x
         cmp #$08
         bcc i12be
         dec f15ac,x
i12be:   lda f1721,y
         sta f15a3,x
         lda f1791,y
         sta f15bb,x
         bmi i12d3
         lda f1582,x
         clc
         adc f1791,y
i12d3:   asl
         tay
         lda f15bb,x
         cmp f15b8,x
         beq i12ef
         sta f15b8,x
         lda f15f1,y
         sta f1576,x
         lda f15f2,y
         sta f1579,x
         jmp i1498
i12ef:   ldy f1588,x
         lda f16b7,y
         and #$1f
         cmp #$1f
         beq i1311
         and #$10
         bne i1314
         lda f1582,x
         beq i130e
         lda f1591,x
         bne i1317
         lda f15b8,x
         beq i131d
i130e:   jmp i1498
i1311:   jmp i1478
i1314:   jmp i13ed
i1317:   jmp i1445
i131a:   jmp i13ea
i131d:   ldy f1588,x
         lda f16b3,y
         and #$0f
         beq i131a
         lda f16b7,y
         and #$80
         bne i1338
         lda f16b7,y
         and #$0f
         cmp f15af,x
         bcs i131a
i1338:   dec f15d6,x
         lda f15d6,x
         cmp #$ff
         bne i131a
         inc f15d6,x
         lda f1582,x
         asl
         tay
         sec
         lda f15f3,y
         sbc f15f1,y
         sta f15ca,x
         lda f15f4,y
         sbc f15f2,y
         sta f15cd,x
         ldy f1588,x
         lda f16b3,y
         lsr
         lsr
         lsr
         lsr
         beq i1374
         tay
         dey
i136b:   lsr f15cd,x
         ror f15ca,x
         dey
         bpl i136b
i1374:   lda f15ca,x
         clc
         adc f15d9,x
         sta f15ca,x
         lda f15cd,x
         adc f15dc,x
         sta f15cd,x
         lda f15d0,x
         bmi i13a2
         lda f1576,x
         clc
         adc f15ca,x
         sta f1576,x
         lda f1579,x
         adc f15cd,x
         sta f1579,x
         jmp i13b5
i13a2:   lda f1576,x
         sec
         sbc f15ca,x
         sta f1576,x
         lda f1579,x
         sbc f15cd,x
         sta f1579,x
i13b5:   inc f15b2,x
         lda f15b2,x
         cmp f15d3,x
         bcc i13ea
         lda f15d0,x
         eor #$80
         sta f15d0,x
         lda #$00
         sta f15b2,x
         ldy f1588,x
         lda f16b7,y
         and #$80
         beq i13ea
         lda f16b7,y
         asl
         asl
         asl
         asl
         clc
         adc f15d9,x
         sta f15d9,x
         bcc i13ea
         inc f15dc,x
i13ea:   jmp i1498
i13ed:   lda f15b5,x
i13f0:   clc
         adc f1594,x
         tay
         lda f1801,y
         beq i1420
         cmp #$ff
         bne i1406
         lda #$00
         sta f15b5,x
         jmp i13f0
i1406:   clc
         adc f1582,x
         asl
         tay
         lda f15f1,y
         pha
         lda f15f2,y
         ldy a1573
         sta $d401,y
         pla
         sta $d400,y
         dec a1571
i1420:   ldy f1588,x
         inc f15d0,x
         lda f16b7,y
         and #$0f
         cmp f15d0,x
         bcs i143d
         lda #$00
         sta f15d0,x
         inc f15b5,x
         lda a1571
         bpl i1440
i143d:   jmp i1498
i1440:   lda f1591,x
         beq i143d
i1445:   lda f1591,x
         cmp #$01
         bne i1462
         lda f1576,x
         clc
         adc f158b,x
         sta f1576,x
         lda f1579,x
         adc f158e,x
         sta f1579,x
         jmp i1498
i1462:   lda f1576,x
         sec
         sbc f158b,x
         sta f1576,x
         lda f1579,x
         sbc f158e,x
         sta f1579,x
         jmp i1498
i1478:   lda f1576,x
         sec
         sbc f16b3,y
         sta f1576,x
         lda f1579,x
         sbc f16b4,y
         bcc i1490
         sta f1579,x
         jmp i1498
i1490:   lda #$00
         sta f1576,x
         sta f1579,x
i1498:   ldy f1588,x
         lda f16b7,y
         and #$40
         beq i14f6
         lda a1575
         ora f156c,x
         sta a1575
         lda f15be,x
         asl
         asl
         tay
         lda f1842,y
         bmi i14c6
         and #$7f
         sta aff
         lda a1574
         clc
         adc aff
         sta a1574
         jmp i14d3
i14c6:   and #$7f
         sta aff
         lda a1574
         sec
         sbc aff
         sta a1574
i14d3:   inc f15c1,x
         lda f15c1,x
         cmp f1843,y
         bcc i14f6
         lda #$00
         sta f15c1,x
         lda f1844,y
         sta f15be,x
         asl
         asl
         tay
         lda f1841,y
         cmp #$ff
         beq i14f6
         sta a1574
i14f6:   ldy a1573
         lda a1571
         bmi i150a
         lda f1576,x
         sta $d400,y
         lda f1579,x
         sta $d401,y
i150a:   lda f159d,x
         sta $d402,y
         lda f15a6,x
         sta $d406,y
         lda f15a0,x
         sta $d403,y
         ldy f1588,x
         lda f16b1,y
         ldy a1573
         sta $d405,y
         lda f15a3,x
         and f15a9,x
         sta $d404,y
         lda f15e8,x
         sta f15e5,x
         lda f15c4,x
         sta f15c7,x
         lda #$00
         sta a1571
         dex
         bmi i1548
         jmp i1062
i1548:   lda a1574
         sta $d416
         lda a1575
         ora #$f0
         sta $d417
         rts
i1557:   lda #$00
         sta a1572
         rts
i155d:   lda #$40
         sta a1572
         rts
//---------------------------------------
//          TRACK POINTERS
//---------------------------------------
f1563:   .byte <t00,<t01,<t02

f1566:   .byte >t00,>t01,>t02

//---------------------------------------
//            VARIABLES
//---------------------------------------
f1569:   .byte $00,$07,$0e
f156c:   .byte $01,$02,$04
speed:
a156f:   .byte $02
a1570:   .byte $00
a1571:   .byte $00
a1572:   .byte $00
a1573:   .byte $00
a1574:   .byte $00
a1575:   .byte $00
f1576:   .byte $00,$00,$00
f1579:   .byte $00,$00,$00
a157c:
f157c:   .byte $00
a157d:   .byte $00
a157e:   .byte $00
f157f:   .byte $00,$00,$00
f1582:   .byte $00,$00,$00
f1585:   .byte $00,$00,$00
f1588:   .byte $00,$00,$00
f158b:   .byte $00,$00,$00
f158e:   .byte $00,$00,$00
f1591:   .byte $00,$00,$00
f1594:   .byte $00,$00,$00
f1597:   .byte $00,$00,$00
f159a:   .byte $00,$00,$00
f159d:   .byte $00,$00,$00
f15a0:   .byte $00,$00,$00
f15a3:   .byte $00,$00,$00
f15a6:   .byte $00,$00,$00
f15a9:   .byte $00,$00,$00
f15ac:   .byte $00,$00,$00
f15af:   .byte $00,$00,$00
f15b2:   .byte $00,$00,$00
f15b5:   .byte $00,$00,$00
f15b8:   .byte $00,$00,$00
f15bb:   .byte $00,$00,$00
f15be:   .byte $00,$00,$00
f15c1:   .byte $00,$00,$00
f15c4:   .byte $00,$00,$00
f15c7:   .byte $00,$00,$00
f15ca:   .byte $00,$00,$00
f15cd:   .byte $00,$00,$00
f15d0:   .byte $00,$00,$00
f15d3:   .byte $00,$00,$00
f15d6:   .byte $00,$00,$00
f15d9:   .byte $00,$00,$00
f15dc:   .byte $00,$00,$00
f15df:   .byte $00,$00,$00
f15e2:   .byte $00,$00,$00
f15e5:   .byte $00,$00,$00
f15e8:   .byte $00,$00,$00
f15eb:   .byte $00,$00,$00
f15ee:   .byte $00,$00,$00
//---------------------------------------
//    FREQ.TABLES (do not change!)
//---------------------------------------
f15f1:   .byte $16
f15f2:   .byte $01
f15f3:   .byte $27
f15f4:   .byte $01,$38,$01,$4b
         .byte $01,$5f,$01,$73
         .byte $01,$8a,$01,$a1
         .byte $01,$ba,$01,$d4
         .byte $01,$f0,$01,$0e
         .byte $02,$2d,$02,$4e
         .byte $02,$71,$02,$96
         .byte $02,$bd,$02,$e7
         .byte $02,$13,$03,$42
         .byte $03,$74,$03,$a9
         .byte $03,$e0,$03,$1b
         .byte $04,$5a,$04,$9b
         .byte $04,$e2,$04,$2c
         .byte $05,$7b,$05,$ce
         .byte $05,$27,$06,$85
         .byte $06,$e8,$06,$51
         .byte $07,$c1,$07,$37
         .byte $08,$b4,$08,$37
         .byte $09,$c4,$09,$57
         .byte $0a,$f5,$0a,$9c
         .byte $0b,$4e,$0c,$09
         .byte $0d,$d0,$0d,$a3
         .byte $0e,$82,$0f,$6e
         .byte $10,$68,$11,$6e
         .byte $12,$88,$13,$af
         .byte $14,$eb,$15,$39
         .byte $17,$9c,$18,$13
         .byte $1a,$a1,$1b,$46
         .byte $1d,$04,$1f,$dc
         .byte $20,$d0,$22,$dc
         .byte $24,$10,$27,$5e
         .byte $29,$d6,$2b,$72
         .byte $2e,$38,$31,$26
         .byte $34,$42,$37,$8c
         .byte $3a,$08,$3e,$b8
         .byte $41,$a0,$45,$b8
         .byte $49,$20,$4e,$bc
         .byte $52,$ac,$57,$e4
         .byte $5c,$70,$62,$4c
         .byte $68,$84,$6e,$18
         .byte $75,$10,$7c,$70
         .byte $83,$40,$8b,$70
         .byte $93,$40,$9c,$78
         .byte $a5,$58,$af,$c8
         .byte $b9,$e0,$c4,$98
         .byte $d0,$08,$dd,$30
         .byte $ea,$20,$f8,$2e
         .byte $fd

f16b1:           // at/dec
.label f16b2    = *+1  // sus/rel
.label f16b3    = *+2  // vibrato
.label f16b4    = *+3  // vibrato
.label f16b5    = *+4  // pulse
.label f16b6    = *+5  // pulse pointer
.label f16b7    = *+6  // fil on/arp on/arp spd
.label f16b8    = *+7  // filter nr

//---------------------------------------
//         SOUNDS: PARAMETERS
//---------------------------------------
//00
         .byte $00,$00,$00,$00
         .byte $00,$00,$00,$00
//01 base
         .byte $05,$a5,$00,$00
         .byte $08,$00,$00,$00
//02 hihat
         .byte $00,$53,$00,$00
         .byte $08,$00,$00,$00
//03 snare1
         .byte $05,$85,$00,$00
         .byte $08,$00,$00,$00
//04 arp
         .byte $01,$55,$00,$00
         .byte $0b,$03,$10,$00
//05 bass mello
         .byte $00,$78,$33,$10
         .byte $08,$01,$40,$01
//06 bass knierp
         .byte $01,$78,$33,$00
         .byte $01,$01,$40,$02
//07 bass down
         .byte $01,$78,$33,$00
         .byte $01,$01,$40,$02
//08 solo1
         .byte $01,$3f,$34,$06
         .byte $08,$02,$00,$00
//09 solo1-chord
         .byte $01,$4f,$00,$00
         .byte $03,$02,$10,$00
//0a arp
         .byte $01,$35,$00,$00
         .byte $08,$00,$11,$00
//0b basssweep
         .byte $01,$78,$33,$00
         .byte $02,$01,$40,$03

f1721:
//---------------------------------------
//         SOUNDS: WAVE
//---------------------------------------
//00
         .byte $00,$00,$00,$00
         .byte $00,$00,$00,$00
//01
         .byte $41,$11,$11,$11
         .byte $10,$10,$10,$10
//02
         .byte $11,$80,$00,$00
         .byte $00,$00,$00,$00
//03
         .byte $81,$40,$80,$80
         .byte $00,$00,$00,$00
//04
         .byte $41,$41,$41,$40
         .byte $40,$11,$11,$11
//05
         .byte $41,$41,$41,$41
         .byte $41,$41,$41,$40
//06
         .byte $41,$41,$41,$41
         .byte $41,$41,$41,$20
//07
         .byte $41,$41,$41,$41
         .byte $41,$41,$41,$41
//08
         .byte $41,$41,$41,$41
         .byte $41,$41,$41,$41
//09
         .byte $41,$41,$41,$41
         .byte $41,$41,$41,$41
//0a
         .byte $41,$41,$41,$21
         .byte $21,$21,$21,$21
//0b
         .byte $41,$41,$41,$41
         .byte $41,$41,$41,$41
f1791:
//---------------------------------------
//         SOUNDS: PITCH
//---------------------------------------
//00
         .byte $00,$00,$00,$00
         .byte $00,$00,$00,$00
//01
         .byte $01,$00,$76,$78
         .byte $74,$70,$6c,$68
//02
         .byte $00,$d5,$00,$00
         .byte $00,$00,$00,$00
//03
         .byte $c8,$00,$d8,$d8
         .byte $00,$00,$00,$00
//04
         .byte $00,$00,$00,$00
         .byte $00,$00,$00,$00
//05
         .byte $00,$00,$00,$00
         .byte $00,$00,$00,$00
//06
         .byte $01,$00,$00,$00
         .byte $00,$00,$00,$00
//07
         .byte $0d,$0c,$0a,$08
         .byte $06,$04,$02,$00
//08
         .byte $02,$01,$00,$00
         .byte $00,$00,$00,$00
//09
         .byte $00,$00,$00,$00
         .byte $00,$00,$00,$00
//0a
         .byte $00,$00,$00,$00
         .byte $00,$00,$00,$00
//0b
         .byte $00,$00,$00,$00
         .byte $00,$00,$00,$00
//---------------------------------------
//             ARPEGGIOS
//---------------------------------------
f1801:   .byte $07,$05,$03,$00,$ff //00
         .byte $09,$05,$03,$00,$ff //05
         .byte $0a,$05,$03,$00,$ff //0a
//---------------------------------------
//            PULSETABLES
//---------------------------------------
f1829:           //pulse
.label f182a    = *+1  //add
.label f182b    = *+2  //time
.label f182c    = *+3  //next

         .byte $00,$00,$00,$00 //00
         .byte $00,$0f,$00,$01 //01
         .byte $00,$60,$20,$03 //02
         .byte $80,$60,$20,$02 //03
//---------------------------------------
//              FILTERS
//---------------------------------------
f1841:          // filter
.label f1842    = *+1 // add
.label f1843    = *+2 // time
.label f1844    = *+3 // next

         .byte $ff,$00,$00,$00 //00
         .byte $d8,$8c,$44,$00 //01
         .byte $c2,$88,$44,$00 //02
         .byte $00,$02,$60,$04 //03
         .byte $ff,$82,$60,$03 //04
//---------------------------------------
//        BLOCK POINTERS
//---------------------------------------
f1859:   .byte <b00,<b01,<b02,<b03
         .byte <b04,<b05,<b06,<b07
         .byte <b08,<b09,<b0a,<b0b
         .byte <b0c,<b0d,<b0e,<b0f

f1874:   .byte >b00,>b01,>b02,>b03
         .byte >b04,>b05,>b06,>b07
         .byte >b08,>b09,>b0a,>b0b
         .byte >b0c,>b0d,>b0e,>b0f
//---------------------------------------
//              TRACKS
//---------------------------------------
.var songnr   = 0

speeds:  .byte 2

tplo:    .byte <t00,<t01,<t02
tphi:    .byte >t00,>t01,>t02

t00:
         .byte $89,$0d
         .byte $89,$02,$03
         .byte $84,$02,$89,$04
         .byte $89,$02,$03
         .byte $84,$02,$89,$07
         .byte $89,$02,$03
         .byte $84,$02,$89,$04
         .byte $89,$02,$03
         .byte $84,$02,$89,$07

         .byte $8b,$02,$03
         .byte $86,$02,$8b,$04
         .byte $8b,$02,$03
         .byte $86,$02,$8b,$07
         .byte $fd,$02
t01:
         .byte $89,$0e
         .byte $89,$01,$05
         .byte $89,$01,$08
         .byte $89,$01,$05
         .byte $89,$01,$08

         .byte $8b,$01,$05
         .byte $8b,$01,$08
         .byte $fd,$02
t02:
         .byte $89,$0f
         .byte $89,$00,$00
         .byte $89,$09,$06
         .byte $8b,$0b,$8b,$0c
         .byte $fd,$02
//---------------------------------------
//           BLOCKS
//---------------------------------------
//        .byte dur, ..., note

// dur + $20 = legato
// dur + $80 = sound [nr]

// note + $80 = glide [spd]

// sound + $c0 = arpeggio [pointer]

//---------------------------------------
b00: // empty

         .byte $1f,$00
         .byte $1f,$00
b0f:     .byte $1f,$00
         .byte $1f,$00
         .byte $ff
//---------------------------------------
b01: // drum+arp 1
         .byte $81,$01,$ae
         .byte $83,$c4,$00,$30
         .byte $01,$30
         .byte $81,$03,$ae //*
         .byte $81,$02,$ae
         .byte $81,$01,$ae
         .byte $81,$01,$ae
         .byte $83,$c4,$05,$30
         .byte $81,$01,$ae
         .byte $81,$c4,$05,$30
         .byte $81,$03,$ae //*
         .byte $81,$02,$ae
         .byte $83,$c4,$0a,$30

         .byte $81,$01,$ae
         .byte $81,$02,$ae
         .byte $81,$c4,$0a,$30
         .byte $81,$01,$ae
         .byte $81,$03,$ae //*
         .byte $81,$c4,$0a,$30
         .byte $81,$01,$ae
         .byte $81,$01,$ae
         .byte $85,$c4,$05,$30
         .byte $81,$02,$ae
         .byte $81,$03,$ae
         .byte $81,$02,$ae
         .byte $01,$ae
         .byte $81,$03,$ae
         .byte $ff
//---------------------------------------
b02: // bassline1
         .byte $85,$06,$0c
         .byte $01,$0c
         .byte $81,$05,$0c
         .byte $01,$0f
         .byte $01,$0c
         .byte $81,$05,$10
         .byte $81,$06,$11
         .byte $81,$05,$12
         .byte $81,$06,$13
         .byte $01,$16
         .byte $01,$00
         .byte $01,$18
         .byte $83,$05,$0b
         .byte $ff
//---------------------------------------
b03: // bassline 2
         .byte $83,$06,$0c
         .byte $01,$00
         .byte $01,$06
         .byte $a1,$05,$0f
         .byte $01,$0c
         .byte $81,$06,$16
         .byte $01,$18
         .byte $81,$05,$0a
         .byte $01,$12
         .byte $01,$11
         .byte $a0,$06,$0c
         .byte $02,$0f
         .byte $01,$0a
         .byte $21,$16
         .byte $01,$18
         .byte $ff
//---------------------------------------
b04: //bassline 3
         .byte $83,$06,$0c
         .byte $01,$00
         .byte $01,$0c
         .byte $a1,$05,$12
         .byte $01,$13
         .byte $a0,$06,$16
         .byte $00,$18
         .byte $01,$1f
         .byte $01,$11
         .byte $01,$00
         .byte $20,$1a
         .byte $00,$1b
         .byte $03,$18
         .byte $01,$13
         .byte $81,$05,$16
         .byte $81,$06,$18
         .byte $ff
//---------------------------------------
b05: //drum + arp 2
         .byte $81,$01,$ae
         .byte $83,$c4,$05,$32
         .byte $01,$32
         .byte $81,$03,$ae //*
         .byte $81,$02,$ae
         .byte $81,$01,$ae
         .byte $01,$ae
         .byte $83,$c4,$0a,$32
         .byte $81,$01,$ae
         .byte $81,$c4,$0a,$32
         .byte $81,$03,$ae //*
         .byte $81,$02,$ae
         .byte $81,$c4,$05,$2b
         .byte $01,$2b

         .byte $81,$01,$ae
         .byte $81,$02,$ae
         .byte $81,$c4,$05,$30
         .byte $81,$01,$ae
         .byte $81,$03,$ae //*
         .byte $81,$c4,$0a,$30
         .byte $81,$01,$ae
         .byte $01,$ae
         .byte $85,$c4,$05,$30
         .byte $81,$02,$ae
         .byte $81,$03,$ae
         .byte $81,$02,$ae
         .byte $01,$02
         .byte $81,$01,$ae
         .byte $ff
//---------------------------------------
b06:   // solo a2
         .byte $07,$00
         .byte $85,$0a,$30
         .byte $01,$30
         .byte $07,$00
         .byte $a0,$08,$33
         .byte $04,$35

         .byte $01,$33
         .byte $01,$00
         .byte $20,$35
         .byte $02,$37
         .byte $01,$00
         .byte $03,$35
         .byte $01,$33
         .byte $01,$30
         .byte $05,$00

         .byte $83,$0a,$30

         .byte $81,$08,$30
         .byte $21,$33
         .byte $01,$35

         .byte $21,$36
         .byte $01,$35
         .byte $01,$37
         .byte $21,$36
         .byte $01,$35
         .byte $01,$3a
         .byte $21,$37
         .byte $01,$3a
         .byte $21,$3c
         .byte $01,$3f
         .byte $01,$3e
         .byte $01,$3c
         .byte $01,0
         .byte $21,$3a
         .byte $01,$3b
         .byte $20,$3f
         .byte $22,$3c
         .byte $20,$3a
         .byte $20,$37
         .byte $20,$36
         .byte $20,$35
         .byte $20,$33
         .byte $20,$32
         .byte $01,$30
         .byte $07,$00
         .byte $83,$0a,$30
         .byte $01,$00
         .byte $03,$30
         .byte $01,$00
         .byte $01,$30
         .byte $ff
//---------------------------------------
b07: // break bass
         .byte $83,$06,$0c
         .byte $01,$00
         .byte $01,$0c
         .byte $21,$16
         .byte $03,$18
         .byte $81,$05,$0c
         .byte $05,$00
         .byte $83,$07,$07
         .byte $81,$06,$0a
         .byte $83,$07,$0c
         .byte $ff
//---------------------------------------
b08: // break drum
         .byte $81,$01,$ae
         .byte $83,$c4,$05,$32
         .byte $01,$32
         .byte $81,$03,$ae //*
         .byte $81,$02,$ae
         .byte $81,$01,$ae
         .byte $01,$ae
         .byte $83,$c4,$0a,$32
         .byte $81,$01,$ae
         .byte $81,$c4,$0a,$32
         .byte $81,$03,$ae //*
         .byte $81,$02,$ae
         .byte $81,$c4,$05,$2b
         .byte $01,$2b

         .byte $81,$01,$ae
         .byte $81,$02,$ae
         .byte $81,$c4,$05,$30
         .byte $81,$01,$ae
         .byte $81,$03,$ae //*
         .byte $81,$c4,$05,$30
         .byte $85,$01,$ae
         .byte $81,$03,$ae
         .byte $81,$02,$ae
         .byte $81,$01,$ae
         .byte $81,$03,$ae
         .byte $81,$02,$ae
         .byte $01,$ae
         .byte $81,$03,$ae
         .byte $ff
//---------------------------------------
b09: // solo a1
         .byte $07,$00
         .byte $85,$0a,$30
         .byte $01,$30
         .byte $07,$00
         .byte $a0,$08,$33
         .byte $04,$35

         .byte $01,$33
         .byte $01,$00
         .byte $20,$2e
         .byte $02,$30
         .byte $01,$00
         .byte $21,$2e
         .byte $01,$30
         .byte $01,$00
         .byte $01,$30
         .byte $05,$00

         .byte $83,$0a,$30

         .byte $81,$08,$30
         .byte $21,$33
         .byte $01,$35

         .byte $21,$36
         .byte $01,$35
         .byte $01,$33
         .byte $21,$36
         .byte $01,$35
         .byte $01,$33
         .byte $21,$35
         .byte $01,$36
         .byte $21,$37
         .byte $01,$35
         .byte $01,$33
         .byte $01,$37
         .byte $01,0
         .byte $21,$2b
         .byte $01,$2e
         .byte $20,$2e
         .byte $02,$30

         .byte $1d,$00
         .byte $ff
//---------------------------------------
b0a:  // solo
         .byte $07,$00
         .byte $83,$08,$36
         .byte $01,$35
         .byte $01,$00//33
         .byte $21,$30
         .byte $01,$33
         .byte $01,$35
         .byte $01,$33
         .byte $01,$00
         .byte $21,$2e
         .byte $01,$30
         .byte $01,$00
         .byte $83,$0a,$30
         .byte $81,$08,$0c
         .byte $20,$37
         .byte $20,$3a
         .byte $03,$3c
         .byte $01,$00
         .byte $01,$00
         .byte $01,$3a
         .byte $01,$37
         .byte $21,$36
         .byte $21,$37
         .byte $21,$36
         .byte $21,$35
         .byte $01,$00
         .byte $03,$37
         .byte $09,$00
         .byte $83,$0a,$30
         .byte $01,$00

         .byte $81,$08,$3a
         .byte $01,$37
         .byte $21,$36
         .byte $21,$37
         .byte $21,$36
         .byte $21,$35
         .byte $01,$00
         .byte $03,$30
         .byte $1b,$00
         .byte $ff
//---------------------------------------
b0b:
         .byte $03,$00
         .byte $83,$0a,$30
         .byte $a0,$08,$35
         .byte $06,$37
         .byte $05,$30
         .byte $01,$2e
         .byte $03,$00
         .byte $01,$30
         .byte $01,$33
         .byte $01,$35
         .byte $01,$00
         .byte $20,$35
         .byte $02,$37
         .byte $01,$35
         .byte $01,$33
         .byte $01,$00
         .byte $20,$35
         .byte $02,$37
         .byte $09,$00
         .byte $20,$37
         .byte $20,$3a
         .byte $01,$3b

         .byte $21,$3f
         .byte $21,$3e
         .byte $01,$3c
         .byte $21,$3f
         .byte $21,$3e
         .byte $01,$3c
         .byte $21,$3f
         .byte $01,$35
         .byte $21,$37
         .byte $21,$3a
         .byte $01,$3c
         .byte $20,$35
         .byte $20,$36
         .byte $21,$35
         .byte $21,$33
         .byte $01,$30
         .byte $03,$00
         .byte $20,$2c
         .byte $00,$2e
         .byte $21,$30
         .byte $01,$33
         .byte $21,$36
         .byte $01,$35
         .byte $01,$33
         .byte $21,$36
         .byte $21,$35
         .byte $01,$33

         .byte $21,$2e
         .byte $20,$30
         .byte $20,$2e
         .byte $03,$30
         .byte $01,$2b
         .byte $01,$00
         .byte $ff
//---------------------------------------
b0c:
         .byte $83,$08,$30
         .byte $83,$0a,$30
         .byte $a0,$08,$30
         .byte $06,$33
         .byte $05,$35
         .byte $01,$37
         .byte $03,$00
         .byte $21,$3f
         .byte $01,$3a
         .byte $01,$3c
         .byte $01,$00
         .byte $20,$3a
         .byte $00,$3c
         .byte $01,$00
         .byte $20,$3a
         .byte $20,$3c
         .byte $01,$3a
         .byte $01,$37
         .byte $21,$36
         .byte $21,$35
         .byte $01,$33
         .byte $01,$30
         .byte $20,$35
         .byte $04,$33
         .byte $01,$30
         .byte $01,$00

         .byte $20,$33
         .byte $02,$35
         .byte $20,$35
         .byte $00,$37
         .byte $01,$00
         .byte $83,$0a,$30
         .byte $81,$08,$35
         .byte $21,$36
         .byte $01,$37
         .byte $01,$00
         .byte $01,$3a
         .byte $21,$3b
         .byte $21,$3c
         .byte $21,$3b
         .byte $01,$3a
         .byte $20,$3a
         .byte $06,$3c
         .byte $0b,$00
         .byte $83,$0a,$30
         .byte $01,$00
         .byte $03,$30
         .byte $01,$00
         .byte $01,$30
         .byte $ff
//---------------------------------------
b0d:
         .byte $bf,$0b,$0c
         .byte $15,$0c
         .byte $83,$07,$07
         .byte $81,$06,$0a
         .byte $83,$07,$0c

         .byte $ff
//---------------------------------------
b0e:
         .byte $1f,$00
         .byte $0b,$00
         .byte $81,$01,$ae
         .byte $03,$ae
         .byte $81,$03,$ae
         .byte $81,$02,$ae
         .byte $81,$01,$ae
         .byte $81,$03,$ae
         .byte $81,$02,$ae
         .byte $01,$ae
         .byte $81,$03,$ae

         .byte $ff
//---------------------------------------
player:
//---------------------------------------
         sei
p0:      lda #songnr
         jsr init
p2:      lda #$62
p1:      cmp $d012
         bne p1
         inc $d020
         jsr play
         dec $d020
         lda $dc01
         and #2
         bne p3
         jsr play
         jsr play
         jsr play
         jsr play
p3:      lda $dc01
         and #$80
         bne p4
         jmp p0
p4:      lda $dc01
         and #4
         bne p2
         jmp $9000