; 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