dos33fsprogs/sound_effects/sound.s
2020-07-31 16:16:20 -04:00

534 lines
6.3 KiB
ArmAsm

; Soft Switches
KEYPRESS= $C000
KEYRESET= $C010
SPEAKER= $C030
COUNTDOWN = $FF
sound_effects:
jsr water
; jsr whistle
; jsr boop
; jsr beep
; jsr boop
; jsr static
end:
lda KEYPRESS
bpl end
bit KEYRESET
jmp sound_effects
;===========================
; 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
; based on code from here
; http://eightbitsoundandfury.ld8.org/programming.html
; A,X,Y trashed
; duration also trashed
NOTE_C3 = 255
NOTE_CSHARP3 = 241
NOTE_D3 = 227
NOTE_DSHARP3 = 214
NOTE_E3 = 202
NOTE_F3 = 191
NOTE_FSHARP3 = 180
NOTE_G3 = 170
NOTE_GSHARP3 = 161
NOTE_A3 = 152
NOTE_ASHARP3 = 143
NOTE_B3 = 135
NOTE_C4 = 128
NOTE_CSHARP4 = 121
NOTE_D4 = 114
NOTE_DSHARP4 = 108
NOTE_E4 = 102
NOTE_F4 = 96
NOTE_FSHARP4 = 91
NOTE_G4 = 85
NOTE_GSHARP4 = 81
NOTE_A4 = 76
NOTE_ASHARP4 = 72
NOTE_B4 = 68
NOTE_C5 = 64
NOTE_CSHARP5 = 60
NOTE_D5 = 57
NOTE_DSHARP5 = 54
NOTE_E5 = 51
NOTE_F5 = 48
NOTE_FSHARP5 = 45
NOTE_G5 = 43
NOTE_GSHARP5 = 40
NOTE_A5 = 38
NOTE_ASHARP5 = 36
NOTE_B5 = 34
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