dos33fsprogs/music/sound_effects/sound.s

508 lines
5.9 KiB
ArmAsm

; Soft Switches
KEYPRESS= $C000
KEYRESET= $C010
SPEAKER= $C030
COUNTDOWN = $FF
sound_effects:
jsr water
jsr wait_until_keypress
jsr whistle
jsr wait_until_keypress
jsr boop
jsr wait_until_keypress
jsr beep
jsr wait_until_keypress
jsr boop
jsr wait_until_keypress
jsr static
jsr wait_until_keypress
end:
jsr sound_effects
wait_until_keypress:
lda KEYPRESS
bpl wait_until_keypress
bit KEYRESET
rts
;===========================
; STATIC
;===========================
static:
lda #$00
sta $1a
ldx $C057 ; hires
ldx $c052 ; mixclr
ldx $c054 ; txtpage1
ldx $c050 ; txtclr
l310:
lda #$20
sta $1b
lda #$d0
sta $1d
l318:
lda ($1c),Y
eor $1e
sta $1c
sta ($1a),Y
adc $1c
bvs label1
ldx $C030 ; speaker
label1:
iny
bne l318
inc $1d
ldx $c030 ; speaker
inc $1b
lda $1b
cmp #$40
bcc l318
inc $1E
jmp l310
;===========================
; water
;===========================
water:
ldx #0
water_loop:
lda $d000,X
and #$70
sta speaker_frequency
lda $e000,X
and #$1
clc
adc #$2
sta speaker_duration
txa
pha
jsr speaker_tone
pla
tax
inx
cpx #180
bcc water_loop
rts
;===========================
; chasm
;===========================
chasm:
ldx #0
chasm_loop:
lda $d000,X
and #$f0
sta speaker_frequency
lda $e000,X
and #$3
clc
adc #$2
sta speaker_duration
txa
pha
jsr speaker_tone
pla
tax
inx
cpx #180
bcc chasm_loop
rts
;===========================
; video games
;===========================
video_gams:
ldx #0
vg_loop:
lda $d000,X
sta speaker_frequency
lda $e000,X
and #$3
clc
adc #$5
sta speaker_duration
txa
pha
jsr speaker_tone
pla
tax
inx
cpx #180
bcc vg_loop
rts
;===========================
; WHISTLE
;===========================
whistle:
ldx #150
whistle_loop_up:
stx speaker_frequency
lda #10
sta speaker_duration
txa
pha
jsr speaker_tone
pla
tax
inx
cpx #180
bcc whistle_loop_up
whistle_loop_down:
stx speaker_frequency
lda #10
sta speaker_duration
txa
pha
jsr speaker_tone
pla
tax
dex
cpx #150
bcs whistle_loop_down
rts
;===========================
; WHISTLE2
;===========================
whistle2:
ldx #200
whistle2_loop:
stx speaker_frequency
lda #5
sta speaker_duration
txa
pha
jsr speaker_tone
pla
tax
dex
dex
dex
dex
cpx #100
bcs whistle2_loop
rts
;===========================
; WHISTLE 1
;===========================
whistle1:
ldx #10
whistle1_loop:
stx speaker_frequency
lda #10
sta speaker_duration
txa
pha
jsr speaker_tone
pla
tax
inx
inx
inx
inx
inx
cpx #200
bcc whistle1_loop
rts
;===========================
; BEEP
;===========================
beep:
; BEEP
; repeat 34 times
lda #34
sta COUNTDOWN
tone1_loop:
jsr play_304
jsr play_369
jsr play_32c
dec COUNTDOWN
bne tone1_loop
rts
;===========================
; BOOP
;===========================
boop:
; BOOP
; repeat 34 times
lda #34
sta COUNTDOWN
tone2_loop:
jsr play_4be
jsr play_4e6
dec COUNTDOWN
bne tone2_loop
rts
play_4be: ; 4be = 1214
; 1214
; -6 jsr
; -6 rts
;============
; 1202
; Try X=239 Y=1 cycles=1202
ldy #1 ; 2
loop1: ldx #239 ; 2
loop2: dex ; 2
bne loop2 ; 2nt/3
dey ; 2
bne loop1 ; 2nt/3
lda SPEAKER ; click speaker
rts
play_4e6: ; 1254
; 1254
; -6 jsr
; -6 rts
;============
; 1232
; Try X=245 Y=1 cycles=1232
ldy #1 ; 2
loopA: ldx #245 ; 2
loopB: dex ; 2
bne loopB ; 2nt/3
dey ; 2
bne loopA ; 2nt/3
lda SPEAKER ; click speaker
rts
play_304: ; 772
; 772
; -6 jsr
; -6 rts
;============
; 760
; Try X=1 Y=69 cycles=760
ldy #69 ; 2
loopC: ldx #1 ; 2
loopD: dex ; 2
bne loopD ; 2nt/3
dey ; 2
bne loopC ; 2nt/3
lda SPEAKER ; click speaker
rts
play_369: ; 873
; 873
; -6 jsr
; -6 rts
;============
; 861
; Try X=16 Y=10 cycles=861
ldy #10 ; 2
loopE: ldx #16 ; 2
loopF: dex ; 2
bne loopF ; 2nt/3
dey ; 2
bne loopE ; 2nt/3
lda SPEAKER ; click speaker
rts
play_32c: ; 812
; 812
; -6 jsr
; -6 rts
;============
; 800
; Try X=158 Y=1 cycles=797 R3
lda COUNTDOWN ; nop3
ldy #11 ; 2
loopG: ldx #158 ; 2
loopH: dex ; 2
bne loopH ; 2nt/3
dey ; 2
bne loopG ; 2nt/3
lda SPEAKER ; click speaker
rts
; From http://6502org.wikidot.com/software-delay
; 25+A cycles (including JSR), 19 bytes (excluding JSR)
;
; The branches must not cross page boundaries!
;
; Cycles Accumulator Carry flag
; 0 1 2 3 4 5 6 (hex) 0 1 2 3 4 5 6
; jsr delay_a ; 6 6 6 6 6 6 6 00 01 02 03 04 05 06
dly0: sbc #7
delay_a:cmp #7 ; 2 2 2 2 2 2 2 00 01 02 03 04 05 06 0 0 0 0 0 0 0
bcs dly0 ; 2 2 2 2 2 2 2 00 01 02 03 04 05 06 0 0 0 0 0 0 0
lsr ; 2 2 2 2 2 2 2 00 00 01 01 02 02 03 0 1 0 1 0 1 0
bcs dly1 ; 2 3 2 3 2 3 2 00 00 01 01 02 02 03 0 1 0 1 0 1 0
dly1: beq dly2 ; 3 3 2 2 2 2 2 00 00 01 01 02 02 03 0 1 0 1 0 1 0
lsr ; 2 2 2 2 2 00 00 01 01 01 1 1 0 0 1
beq dly3 ; 3 3 2 2 2 00 00 01 01 01 1 1 0 0 1
bcc dly3 ; 3 3 2 01 01 01 0 0 1
dly2: bne dly3 ; 2 2 3 00 00 01 0 1 0
dly3: rts ; 6 6 6 6 6 6 6 00 00 00 00 01 01 01 0 1 1 1 0 0 1
;
; Total cycles: 25 26 27 28 29 30 31
; redbook sound by Paul Lutus
; see music/redbook_sound
; A,X,Y trashed
; duration also trashed
speaker_tone:
lda $C030 ; click speaker
speaker_loop:
dey ; y never set?
bne slabel1 ; duration roughly 256*?
dec speaker_duration ; (Duration)
beq done_tone
slabel1:
dex
bne speaker_loop
ldx speaker_frequency ; (Frequency)
jmp speaker_tone
done_tone:
rts
speaker_duration:
.byte $00
speaker_frequency:
.byte $00