diff --git a/sound_effects/Makefile b/sound_effects/Makefile new file mode 100644 index 00000000..90950f0c --- /dev/null +++ b/sound_effects/Makefile @@ -0,0 +1,32 @@ +include ../Makefile.inc + +DOS33 = ../dos33fs-utils/dos33 +PNG_TO_40x96 = ../gr-utils/png_to_40x96 +PNG_TO_40x48D = ../gr-utils/png_to_40x48d +PNG2RLE = ../gr-utils/png2rle +B2D = ../bmp2dhr/b2d + +all: sound.dsk + +sound.dsk: HELLO SOUND + cp empty.dsk sound.dsk + $(DOS33) -y sound.dsk SAVE A HELLO + $(DOS33) -y sound.dsk BSAVE -a 0x1000 SOUND + +SOUND: sound.o + ld65 -o SOUND sound.o -C ../linker_scripts/apple2_1000.inc + +sound.o: sound.s + ca65 -o sound.o sound.s -l sound.lst + +### + +HELLO: hello.bas + ../asoft_basic-utils/tokenize_asoft < hello.bas > HELLO + +#### + +clean: + rm -f *~ *.o *.lst HELLO SOUND + + diff --git a/sound_effects/empty.dsk b/sound_effects/empty.dsk new file mode 100644 index 00000000..b34eb519 Binary files /dev/null and b/sound_effects/empty.dsk differ diff --git a/sound_effects/hello.bas b/sound_effects/hello.bas new file mode 100644 index 00000000..460efca8 --- /dev/null +++ b/sound_effects/hello.bas @@ -0,0 +1,3 @@ +5 HOME +100 PRINT "SOME SOUNDS" +120 PRINT CHR$(4);"CATALOG" diff --git a/sound_effects/sound.dsk b/sound_effects/sound.dsk new file mode 100644 index 00000000..8c9e4d9e Binary files /dev/null and b/sound_effects/sound.dsk differ diff --git a/sound_effects/sound.s b/sound_effects/sound.s new file mode 100644 index 00000000..a1ac0b4e --- /dev/null +++ b/sound_effects/sound.s @@ -0,0 +1,533 @@ + +; 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 +