Skip to content

Instantly share code, notes, and snippets.

@davidgiven
Created April 26, 2025 23:31
Show Gist options
  • Save davidgiven/ca1631e072b894602437aebef4504526 to your computer and use it in GitHub Desktop.
Save davidgiven/ca1631e072b894602437aebef4504526 to your computer and use it in GitHub Desktop.
; Tim Follin's Startip 2 ported to the Commodore PET.
; The music is Follin's, the code is mine. My bits are CC0. Enjoy.
; Assemble with beebasm.
org &3ff
equw &401, _entry_string_end, 1
equb &9e, "1037", 0
._entry_string_end
equw 0
VIA_T1C_L = &e844
VIA_T1C_H = &e845
VIA_T1L_L = &e846
VIA_T1L_H = &e847
VIA_T2C_L = &e848
VIA_T2C_H = &e849
VIA_SR = &e84a
VIA_ACR = &e84b
VIA_PCR = &e84c
VIA_IFR = &e84d
MAX_PULSE_LEN = 16
TICKS_PER_VOL_STEP = 10
org 0
.ptr equw 0
.note_duration equw 0
.note_attack equb 0
.note_volume equb 0
.note_decay equb 0
.n1 equb 0
.n2 equb 0
.n3 equb 0
.pulse_length equb 0
.attack equb 0
.attack_flag equb 0
.duration equw 0
.etimer equb 0
.decay equb 0
org &40d
._entry
sei
lda #lo(music_data)
sta ptr+0
lda #hi(music_data)
sta ptr+1
.mainloop
ldy #0
lda (ptr), y
beq exit
cmp #&ff
bne not_envelope
.envelope
iny
lda (ptr), y
sta note_duration+0
iny
lda (ptr), y
sta note_duration+1
iny
lda (ptr), y
sta note_attack
iny
lda (ptr), y
sta note_decay
iny
lda (ptr), y
sta note_volume
clc
lda ptr+0
adc #6
sta ptr+0
lda ptr+1
adc #0
sta ptr+1
jmp mainloop
.not_envelope
lda note_attack
sta attack
lda #1
sta pulse_length
sta attack_flag
ldy #0
lda (ptr), y
sta n1
iny
lda (ptr), y
sta n2
iny
lda (ptr), y
sta n3
lda note_duration+0
sta duration+0
lda note_duration+1
sta duration+1
lda #1
sta etimer
jsr play_note
clc
lda ptr+0
adc #3
sta ptr+0
bcc mainloop
inc ptr+1
jmp mainloop
.exit
cli
rts
macro process_note var, offset
{
dec var ; 5
bne exit ; 2
lda #&ec
sta VIA_PCR
ldx pulse_length ; 3
.loop1
dex ; 2
bne loop1 ; 2
lda #&cc ; 2
sta VIA_PCR ; 3
sec ; 2
lda #MAX_PULSE_LEN ; 2
sbc pulse_length ; 3
tax ; 2
.loop2
dex ; 2
bne loop2 ; 2
ldy #offset ; 2
lda (ptr), y ; 5
sta var ; 3
.exit
}
endmacro
.play_note
{
process_note n1, 0
process_note n2, 1
process_note n3, 2
dec etimer
bne not_etimer
lda #TICKS_PER_VOL_STEP
sta etimer
lda attack_flag
bne attack_flag_is_set
dec decay ; 5
bne not_etimer ; 2
lda note_decay ; 3
sta decay ; 3
ldx pulse_length ; 3
dex ; 2
cpx note_volume ; 3
beq not_etimer ; 2
stx pulse_length
bne not_etimer ; pulse_length is never 0
.attack_flag_is_set
dec attack ; 5
bne not_etimer ; 2
lda note_attack ; 3
sta attack ; 3
ldx pulse_length ; 3
inx ; 2
stx pulse_length
cpx #MAX_PULSE_LEN-1
bne not_etimer
dec attack_flag
dec pulse_length
.not_etimer
sec
lda duration+0
sbc #1
sta duration+0
lda duration+1
sbc #0
sta duration+1
ora duration+0
beq exit
jmp play_note
.exit
rts
}
macro envelope len, attack, decay, volume
equb &ff
equw len * 2/3
equb attack+1, decay+1, volume
endmacro
macro note a, b, c
equb a/2
equb b/2
equb c/2
endmacro
.music_data
envelope 2400, 1, 0, 10
note &41, &52, &6d
note &3d, &52, &6d
note &41, &52, &6d
note &49, &52, &6d
envelope 38400, 0, -107, 1
note &57, &62, &83
envelope 38400, -7, -1, 15
note &57, &62, &83
envelope 2400, 3, 0, 10
note &53, &5d, &7c
note &46, &5d, &7c
note &3e, &5d, &7c
note &46, &5d, &7c
note &5d, &5d, &7c
note &63, &5d, &7c
note &5d, &53, &7c
note &63, &53, &7c
note &6e, &53, &7c
note &7c, &53, &7c
note &8c, &53, &7c
note &7c, &53, &7c
note &6f, &53, &7c
note &53, &53, &7c
envelope 2400, 3, 0, 10
note &64, &85, &c8
note &59, &85, &c8
note &54, &85, &c8
note &42, &84, &c7
note &54, &85, &c8
note &59, &85, &c8
note &64, &85, &c8
note &70, &86, &c8
note &4b, &96, &e1
note &54, &96, &e1
note &5f, &96, &e1
note &64, &96, &e1
note &71, &96, &e1
note &7f, &97, &e1
note &71, &96, &e1
note &64, &96, &e1
note &4e, &9d, &eb
note &58, &9d, &eb
note &4e, &9d, &eb
note &42, &9c, &ea
note &46, &9c, &eb
note &58, &9c, &eb
note &4e, &9d, &eb
note &58, &9d, &eb
note &4e, &9d, &eb
note &63, &9d, &eb
note &69, &9d, &eb
note &84, &9d, &eb
note &76, &9d, &eb
note &76, &9d, &eb
note &76, &9d, &eb
note &76, &9d, &eb
note &58, &63, &c7
note &58, &53, &c6
note &57, &41, &c5
note &57, &37, &c3
note &58, &63, &c7
note &58, &53, &c6
note &57, &41, &c5
note &57, &37, &c3
note &53, &63, &c7
note &53, &53, &c6
note &53, &41, &c5
note &53, &37, &c3
note &53, &63, &c7
note &53, &53, &c6
note &53, &41, &c5
note &53, &37, &c3
note &63, &63, &df
note &63, &5e, &df
note &63, &4a, &df
note &63, &3e, &df
note &63, &63, &df
note &63, &5e, &df
note &63, &4a, &df
note &63, &3e, &df
note &5d, &63, &df
note &5d, &5e, &df
note &5d, &4a, &df
note &5d, &3e, &df
note &5d, &63, &df
note &5d, &5e, &df
note &5d, &4a, &df
note &5d, &3e, &df
note &6f, &63, &c7
note &6f, &53, &c6
note &6f, &41, &c5
note &6f, &37, &c3
note &84, &63, &c7
note &84, &53, &c6
note &84, &41, &c5
note &84, &37, &c3
note &7d, &63, &df
note &7d, &5e, &df
note &7d, &4a, &df
note &7d, &3e, &df
note &94, &63, &df
note &94, &5e, &df
note &94, &4a, &df
note &94, &3e, &df
note &84, &63, &c7
note &84, &53, &c6
note &84, &41, &c5
note &84, &37, &c3
note &6f, &63, &c7
note &6f, &53, &c6
note &6f, &41, &c5
note &6f, &37, &c3
note &63, &63, &c7
note &63, &53, &c6
note &63, &41, &c5
note &63, &37, &c3
note &63, &63, &c7
note &63, &53, &c6
note &63, &41, &c5
note &63, &37, &c3
note &63, &63, &c7
note &5e, &53, &c6
note &63, &41, &c5
note &5e, &37, &c3
note &63, &63, &c7
note &5e, &53, &c6
note &63, &41, &c5
note &5e, &37, &c3
note &5d, &5d, &d2
note &75, &58, &d2
note &5c, &45, &cf
note &58, &3a, &d0
note &5d, &5d, &d2
note &75, &58, &d2
note &5c, &45, &cf
note &58, &3a, &d0
note &5d, &5d, &d2
note &75, &58, &d2
note &5c, &45, &cf
note &58, &3a, &d0
note &5c, &5c, &8b
note &75, &58, &8b
note &5c, &45, &8b
note &58, &3a, &8b
note &63, &63, &de
note &63, &5e, &de
note &63, &4a, &dd
note &62, &3e, &dc
note &63, &63, &de
note &63, &5e, &de
note &63, &4a, &6f
note &62, &3e, &dc
note &63, &63, &94
note &63, &5e, &f8
note &63, &4a, &94
note &62, &3e, &f8
note &63, &63, &f8
note &63, &5e, &f8
note &63, &4a, &f8
note &62, &3e, &f8
envelope 2400, 0, 0, 13
note &63, &63, &f8
note &63, &5e, &f8
note &63, &4a, &f8
note &62, &3e, &f8
note &63, &63, &f8
note &63, &5e, &f8
note &63, &4a, &f8
note &62, &3e, &f8
note &6f, &63, &f8
note &6f, &5e, &f8
note &6f, &4a, &f8
note &6f, &3e, &f8
note &6f, &63, &f8
note &6f, &5e, &f8
note &6f, &4a, &f8
note &6f, &3e, &f8
envelope 4800, 0, 0, 13
note &4a, &59, &de
note &53, &63, &dc
note &59, &6f, &de
note &53, &63, &dc
note &63, &7c, &f9
note &58, &6f, &f9
note &4a, &58, &f9
note &58, &6f, &f9
envelope 2400, 0, 0, 13
note &57, &68, &83
note &68, &68, &83
note &83, &68, &83
note &62, &68, &83
note &68, &68, &83
note &83, &68, &83
note &62, &6f, &94
note &6f, &6f, &94
note &94, &6f, &94
note &58, &6f, &94
note &6f, &6f, &94
note &94, &6f, &94
note &57, &68, &83
note &68, &68, &83
note &83, &68, &83
note &62, &68, &83
note &68, &68, &83
note &83, &68, &83
note &62, &6f, &94
note &6f, &6f, &94
note &94, &6f, &94
note &76, &6f, &94
note &6f, &6f, &94
note &94, &6f, &94
envelope 2400, 0, 29, 1
note &6f, &94, &de
note &6f, &94, &de
note &6f, &94, &de
note &6f, &94, &de
note &7d, &a6, &de
note &6f, &94, &de
note &7d, &a6, &de
note &6f, &94, &de
note &5d, &8c, &de
note &6f, &8c, &de
note &6f, &8c, &de
note &6f, &8c, &de
note &7d, &8c, &de
note &6f, &8c, &de
note &5d, &8c, &de
note &6f, &8c, &de
note &53, &7c, &de
note &63, &7c, &de
note &7c, &7c, &de
note &95, &7c, &de
note &7c, &7c, &de
note &63, &7c, &de
note &53, &7c, &de
note &5d, &7c, &de
note &63, &7c, &de
note &7c, &7c, &de
note &6f, &6f, &de
note &6f, &6f, &de
note &6f, &6f, &de
note &6f, &6f, &de
note &6f, &6f, &de
note &6f, &6f, &de
note &6f, &6f, &de
note &6f, &6f, &de
note &6f, &6f, &de
envelope 4800, 0, -1, 0
note &e0, &e1, &e2
note &e0, &e1, &e2
envelope 2400, 0, -1, 40
note &5d, &7c, &93
note &e0, &e1, &e2
note &e0, &e1, &e2
note &5d, &7c, &93
note &e0, &e1, &e2
note &e0, &e1, &e2
note &5d, &7c, &93
note &e0, &e1, &e2
envelope 9600, 0, -1, 30
note &62, &7c, &a5
envelope 2400, 0, -1, 2
note &3d, &7a, &b8
note &45, &6e, &b8
note &49, &7a, &b8
note &36, &6d, &a3
note &3d, &61, &a3
note &41, &6d, &a3
note &3d, &7a, &b8
note &45, &6e, &b8
note &49, &7a, &b8
note &36, &6d, &a3
note &3d, &61, &a3
note &41, &6d, &a3
envelope 4800, 0, -1, 40
note &e0, &e1, &e2
note &e0, &e1, &e2
envelope 2400, 0, -1, 30
note &5d, &7c, &93
note &e0, &e1, &e2
note &e0, &e1, &e2
note &5d, &7c, &93
note &e0, &e1, &e2
note &e0, &e1, &e2
note &5d, &7c, &93
note &e0, &e1, &e2
envelope 9600, 0, -1, 30
note &52, &6d, &82
envelope 2400, 0, -1, 2
note &3d, &7a, &b8
note &45, &6e, &b8
note &49, &7a, &b8
note &36, &6d, &a3
note &3d, &61, &a3
note &41, &6d, &a3
note &45, &8a, &cf
note &4e, &7c, &cf
note &53, &8b, &d0
note &3d, &7a, &b8
note &45, &6e, &b8
note &49, &7a, &b8
note &4e, &9c, &ea
note &58, &8c, &ea
note &5e, &9d, &eb
note &45, &8a, &cf
note &4e, &7c, &cf
note &53, &8b, &d0
note &3d, &7a, &b8
note &45, &6e, &b8
note &49, &7a, &b8
note &36, &6d, &a3
note &3d, &61, &a3
note &41, &6d, &a3
note &30, &60, &90
note &36, &56, &90
note &39, &60, &90
note &36, &56, &90
note &30, &60, &90
note &36, &56, &90
note &39, &60, &90
note &36, &56, &90
note &30, &60, &90
note &36, &56, &90
note &39, &60, &90
note &36, &56, &90
note &30, &60, &90
note &36, &56, &90
note &39, &60, &90
note &36, &56, &90
envelope 38400, -1, -129, 1
note &39, &60, &90
equb 0
._end
SAVE "p", &3ff, _end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment