base:sound_fx_player
no way to compare when less than two revisions
Differences
This shows you the differences between two versions of the page.
— | base:sound_fx_player [2015-04-17 04:33] (current) – created - external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Sound Fx Player ====== | ||
+ | |||
+ | By Malcolm Bamber | ||
+ | |||
+ | Sourcecode available here: {{: | ||
+ | |||
+ | < | ||
+ | ; PLAYSOUND FX | ||
+ | ; MALCOLM BAMBER | ||
+ | ; CODE IN C64ASM | ||
+ | * = $0800 | ||
+ | .byte $00, | ||
+ | |||
+ | * = 16500 | ||
+ | |||
+ | sid = $D400 | ||
+ | raster = 50 | ||
+ | lda #$0f | ||
+ | sta $d418 ; Select Filter Mode and Volume | ||
+ | |||
+ | lda #1 | ||
+ | sta 649 ; disable keyboard buffering | ||
+ | |||
+ | lda #0 | ||
+ | sta 204 ; turn cursor on during a GET | ||
+ | |||
+ | lda #127 | ||
+ | sta 650 ; no keys repeat | ||
+ | jsr soundinterrupts | ||
+ | |||
+ | |||
+ | mainloop | ||
+ | ; PRESS A NUMBER FROM 0 TO 3 and 9 to quit | ||
+ | _wait | ||
+ | jsr $ffe4 ; GETIN Get a byte from channel A=0 if buffer empty | ||
+ | beq _wait | ||
+ | eor #$30 ; convert key numbet to a real number | ||
+ | cmp #9 | ||
+ | beq _brk | ||
+ | cmp #4 ; number you press must be less than 4 | ||
+ | bcs _clearbuffer | ||
+ | sta effect | ||
+ | _clearbuffer | ||
+ | lda #0 | ||
+ | sta 198 ; clear keyboard buffer | ||
+ | jmp _wait ; wait for next key | ||
+ | _brk | ||
+ | rts | ||
+ | |||
+ | soundinterrupts | ||
+ | SEI | ||
+ | LDA #$01 | ||
+ | STA $D01A ; VIC Interrupt Mask Register (IMR) | ||
+ | LDA #< | ||
+ | LDX #> | ||
+ | STA $0314 ; irq address | ||
+ | STX $0315 ; irq address | ||
+ | LDY # | ||
+ | STY $D012 ; Raster Position | ||
+ | LDA #$7F | ||
+ | STA $DC0D ; CIA Interrupt Control Register | ||
+ | LDA $DC0D ; CIA Interrupt Control Register | ||
+ | CLI | ||
+ | rts | ||
+ | |||
+ | intsoundcode | ||
+ | ldy #0 | ||
+ | lda effect | ||
+ | cmp #128 ; 128 MEANS NO NEW EFFECT NUMBER WAS ASK FOR | ||
+ | beq _playsounds ; PLAY SOUNDS | ||
+ | jmp _resetsound ; RESET SOUND DATA | ||
+ | ; PLAY SOUNDS | ||
+ | _playsounds | ||
+ | ldy #0 | ||
+ | _loop | ||
+ | lda voicearray, | ||
+ | cmp #128 ; 128 MEANS NO | ||
+ | beq _nextvoice | ||
+ | jmp _continuesound | ||
+ | _nextvoice | ||
+ | iny ; SET Y TO NEXT SOUND VIOCE | ||
+ | iny | ||
+ | iny | ||
+ | iny | ||
+ | iny | ||
+ | iny | ||
+ | iny | ||
+ | cpy #21 ; HAVE WE DONE ALL FOUR VOICES | ||
+ | beq _irqjmp | ||
+ | jmp _loop ; NO | ||
+ | |||
+ | _irqjmp | ||
+ | lda #$ff ; QUIT OUT AND WAIT | ||
+ | sta $D019 ; VIC Interrupt Request Register (IRR) | ||
+ | jmp $ea31 ; quit out | ||
+ | |||
+ | ; OVER WRITE SOUND DATA FROM ARRAY TO SID CHIP | ||
+ | _resetsound | ||
+ | inc $d020 ; LET YOU KNOW THAT SOUND IS WORKING | ||
+ | tax ; COPY EFFECT NUMBER | ||
+ | lda ivoice, | ||
+ | tay ; STORE VOICE NUMBER IN Y | ||
+ | |||
+ | ; RUN FROM HERE IS SOUND IS NOT PLAYING YET | ||
+ | lda voicearray, | ||
+ | cmp #128 | ||
+ | beq _miss2 | ||
+ | |||
+ | ; CHECK IF WE CAN OVER WRITE A SOUND THAT IS ALLREADY PLAYING | ||
+ | lda iwrite, | ||
+ | cmp #1 ; IF ONE THEN WE MUST WAIT FOR SOUND TO STOP | ||
+ | beq _playsounds | ||
+ | |||
+ | _miss2 | ||
+ | lda ivoice, | ||
+ | sta voicearray+1, | ||
+ | |||
+ | lda istep, | ||
+ | sta voicearray+2, | ||
+ | |||
+ | lda istep+1, | ||
+ | sta voicearray+3, | ||
+ | |||
+ | lda istepway, | ||
+ | sta voicearray+4, | ||
+ | |||
+ | lda icount, | ||
+ | sta voicearray+5, | ||
+ | |||
+ | lda ifrq, | ||
+ | sta sid,y ; WRITE TO SID CHIP | ||
+ | |||
+ | lda ifrq+1, | ||
+ | sta sid+1, | ||
+ | |||
+ | lda ipulse, | ||
+ | sta sid+2, | ||
+ | |||
+ | lda ipulse+1, | ||
+ | sta sid+3, | ||
+ | |||
+ | lda iatdk, | ||
+ | sta sid+5, | ||
+ | |||
+ | lda isurl, | ||
+ | sta sid+6, | ||
+ | |||
+ | ; SET FILTER MODE | ||
+ | lda ifilterl | ||
+ | sta sid+21 | ||
+ | |||
+ | lda ifilterh | ||
+ | sta sid+22 | ||
+ | |||
+ | lda ifiltercon | ||
+ | sta sid+23 | ||
+ | |||
+ | clc | ||
+ | lda ifiltermode | ||
+ | adc #15 | ||
+ | sta sid+24 | ||
+ | |||
+ | lda icreg, | ||
+ | sta sid+4, | ||
+ | lda #0 | ||
+ | sta voicearray, | ||
+ | lda #128 | ||
+ | sta effect | ||
+ | jmp _playsounds | ||
+ | |||
+ | ; CONTINUE WITH SOUND FX | ||
+ | _continuesound | ||
+ | lda voicearray+5, | ||
+ | cmp #0 ; SHOULD SOUND STOP | ||
+ | bne _minusone | ||
+ | lda #0 | ||
+ | sta sid+4, | ||
+ | lda #128 | ||
+ | sta voicearray, | ||
+ | jmp _nextvoice | ||
+ | |||
+ | _minusone | ||
+ | sec ; REMOVE ONE FROM VOICEARRAY+5 | ||
+ | lda voicearray+5, | ||
+ | sbc #1 | ||
+ | sta voicearray+5, | ||
+ | |||
+ | lda voicearray+2, | ||
+ | cmp #0 ; IS IT ZERO | ||
+ | bne _stepit | ||
+ | jmp _nextvoice | ||
+ | |||
+ | _stepit | ||
+ | ; CHANGE FREQ VALUE OF SOUND | ||
+ | lda voicearray+4, | ||
+ | cmp #1 ; ARE WE ADDING THE STEP FREQUENCY VALUE | ||
+ | bne _subit | ||
+ | clc | ||
+ | lda sid,y ; GET CURRENT LOW BYTE FREQUENCY VALUE WE ARE USING | ||
+ | adc voicearray+2, | ||
+ | sta sid,y ; WRITE NEW LOW BYTE FREQUENCY BACK TO SID | ||
+ | lda sid+1, | ||
+ | adc voicearray+3, | ||
+ | sta sid+1, | ||
+ | jmp _nextvoice | ||
+ | |||
+ | _subit | ||
+ | sec | ||
+ | lda sid,y ; GET CURRENT LOW BYTE FREQUENCY VALUE WE ARE USING | ||
+ | sbc voicearray+2, | ||
+ | sta sid,y ; WRITE NEW LOW BYTE FREQUENCY BACK TO SID | ||
+ | lda sid+1, | ||
+ | sbc voicearray+3, | ||
+ | sta sid+1, | ||
+ | jmp _nextvoice | ||
+ | |||
+ | |||
+ | effect | ||
+ | .byte 128 ; WERE FX NUMBER IS WRITEN TO | ||
+ | |||
+ | ; VOICE 1 | ||
+ | voicearray | ||
+ | .byte 128 ; 0 128 MEANING NO SOUND FX IS BEING USED | ||
+ | .byte 0 ; 1 VOICE NUMBER BEING USED | ||
+ | .byte 0 ; 2 LOW BYTE FREQUENCY VALUE | ||
+ | .byte 0 ; 3 HIGH BYTE FREQUENCY VALUE | ||
+ | .byte 0 ; 4 ARE WE ADDING A STEP FREQUENCY VALUE | ||
+ | .byte 0 ; 5 HOW LONG SOUND WILL PLAY FOR | ||
+ | .byte 0 ; 6 FREE | ||
+ | ; VOICE 2 | ||
+ | .byte 128 ; 0 128 MEANING NO SOUND FX IS BEING USED | ||
+ | .byte 0 ; 1 VOICE NUMBER BEING USED | ||
+ | .byte 0 ; 2 LOW BYTE FREQUENCY VALUE | ||
+ | .byte 0 ; 3 HIGH BYTE FREQUENCY VALUE | ||
+ | .byte 0 ; 4 ARE WE ADDING A STEP FREQUENCY VALUE | ||
+ | .byte 0 ; 5 HOW LONG SOUND WILL PLAY FOR | ||
+ | .byte 0 ; 6 FREE | ||
+ | |||
+ | ; VOICE 3 | ||
+ | .byte 128 ; 0 128 MEANING NO SOUND FX IS BEING USED | ||
+ | .byte 0 ; 1 VOICE NUMBER BEING USED | ||
+ | .byte 0 ; 2 LOW BYTE FREQUENCY VALUE | ||
+ | .byte 0 ; 3 HIGH BYTE FREQUENCY VALUE | ||
+ | .byte 0 ; 4 ARE WE ADDING A STEP FREQUENCY VALUE | ||
+ | .byte 0 ; 5 HOW LONG SOUND WILL PLAY FOR | ||
+ | .byte 0 ; 6 FREE | ||
+ | |||
+ | ; WHICH VOICE | ||
+ | ; VOICE 1 0 | ||
+ | ; VOICE 2 7 | ||
+ | ; VOICE 3 14 | ||
+ | ivoice | ||
+ | .byte 0 ; PLAYERS GUN SHOT | ||
+ | .byte 7 ; ENEMY SHOOT AT PLAYER | ||
+ | .byte 14 ; EXPLOSION | ||
+ | .byte 0 | ||
+ | |||
+ | ; HOW LONG SOUND WILL PLAY FOR | ||
+ | icount | ||
+ | .byte 25 | ||
+ | .byte 25 | ||
+ | .byte 100 | ||
+ | .byte 25 | ||
+ | | ||
+ | |||
+ | ; START NOTE FREQUENCY RANGE (268 to 64814 ) | ||
+ | ifrq | ||
+ | .word 6000 | ||
+ | .word 9000 | ||
+ | .word 6000 | ||
+ | .word 9000 | ||
+ | | ||
+ | ; PULSE NOTE FREQUENCY | ||
+ | ; $D402 IS THE LOW BYTE OF THE PULSE WIDTH (LPW = 0 THROUGH 255). | ||
+ | ; $D403 IS THE HIGH 4 BITS (HPW = 0 THROUGH 15). | ||
+ | ipulse | ||
+ | .word 3000 | ||
+ | .word 0 | ||
+ | .word 0 | ||
+ | .word 0 | ||
+ | | ||
+ | ; UP SCALE OR DOWN SCALE | ||
+ | istep | ||
+ | .word 0 | ||
+ | .word 0 | ||
+ | .word 1000 | ||
+ | .word 0 | ||
+ | | ||
+ | ; PLUS=1 OR MINUS=2 | ||
+ | istepway | ||
+ | .byte 0 | ||
+ | .byte 0 | ||
+ | .byte 2 | ||
+ | .byte 0 | ||
+ | |||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | ; | ||
+ | |||
+ | ; ATTACK / DECAY CYCLE CONTROL | ||
+ | ; Bits 7-4 Select ATTACK Cycle Duration: 0-15 | ||
+ | ; Bits 3-0 Select DECAY Cycle Duration: 0-15 | ||
+ | iatdk | ||
+ | .byte $06 | ||
+ | .byte $7f | ||
+ | .byte $bf | ||
+ | .byte $7f | ||
+ | |||
+ | ; SUSTAIN / RELEASE CYCLE CONTROL | ||
+ | ; Bits 7-4 Select Sustain Cycle Duration: 0-15 | ||
+ | ; Bits 3-0 Select Release Cycle Duration: 0-15 | ||
+ | isurl | ||
+ | .byte $10 | ||
+ | .byte $f9 | ||
+ | .byte $31 | ||
+ | .byte $f3 | ||
+ | | ||
+ | ; WAVEFORM/ | ||
+ | ; BIT 7 SELECT RANDOM NOISE WAVEFORM, 1 = ON | ||
+ | ; BIT 6 SELECT PULSE WAVEFORM, 1 = ON | ||
+ | ; BIT 5 SELECT SAWTOOTH WAVEFORM, 1 = ON | ||
+ | ; BIT 4 SELECT TRIANGLE WAVEFORM, 1 = ON | ||
+ | ; BIT 3 TEST BIT: 1 = DISABLE OSCILLATOR | ||
+ | ; BIT 2 RING MODULATE OSC. 1 WITH OSC. 3 OUTPUT, 1 = ON | ||
+ | ; BIT 1 SYNCHRONIZE OSC. 1 WITH OSC. 3 FREQUENCY, 1 = ON | ||
+ | ; BIT 0 GATE BIT: 1 = START ATT/ | ||
+ | ; TRIANGLE ON 17 OFF 16 | ||
+ | ; SAWTOOTH ON 33 OFF 32 | ||
+ | ; PULSE ON 65 OFF 64 | ||
+ | ; NOISE WAVEFORM ON 129 OFF 128 | ||
+ | icreg | ||
+ | .byte 65 | ||
+ | .byte 33 | ||
+ | .byte 129 | ||
+ | .byte 17 | ||
+ | |||
+ | |||
+ | ; | ||
+ | ifilterl | ||
+ | .byte 0 | ||
+ | .byte 0 | ||
+ | .byte 0 | ||
+ | .byte 0 | ||
+ | |||
+ | ; | ||
+ | ifilterh | ||
+ | .byte 0 | ||
+ | .byte 0 | ||
+ | .byte 100 | ||
+ | .byte 0 | ||
+ | |||
+ | ; FILTERCON 7-4 | ||
+ | ; $D417 FILTER RESONANCE CONTROL / VOICE INPUT CONTROL | ||
+ | ; 7-4 SELECT FILTER RESONANCE: 0-15 | ||
+ | ; 3 FILTER EXTERNAL INPUT: 1 = YES, 0 = NO | ||
+ | ; 2 FILTER VOICE 3 OUTPUT: 1 = YES, 0 = NO | ||
+ | ; 1 FILTER VOICE 2 OUTPUT: 1 = YES, 0 = NO | ||
+ | ; 0 FILTER VOICE 1 OUTPUT: 1 = YES, 0 = NO | ||
+ | ifiltercon | ||
+ | .byte 0 | ||
+ | .byte 0 | ||
+ | .byte %1100 0010 | ||
+ | .byte 0 | ||
+ | |||
+ | ; FILTERMODE | ||
+ | ; $D418 SELECT FILTER MODE AND VOLUME | ||
+ | ; 7 CUT-OFF VOICE 3 OUTPUT: 1 = OFF, 0 = ON | ||
+ | ; 6 SELECT FILTER HIGH-PASS MODE: 1 = ON | ||
+ | ; 5 SELECT FILTER BAND-PASS MODE: 1 = ON | ||
+ | ; 4 SELECT FILTER LOW-PASS MODE: 1 = ON | ||
+ | ; 3-0 SELECT OUTPUT VOLUME: 0-15 | ||
+ | |||
+ | ifiltermode | ||
+ | .byte 0 | ||
+ | .byte 0 | ||
+ | .byte %0010 0000 | ||
+ | .byte 0 | ||
+ | |||
+ | ; OVER WRITE SOUND VALUES WITH NEW SOUND VALUES 0=rewrite 1=not to rewrite | ||
+ | iwrite | ||
+ | .byte 1 | ||
+ | .byte 1 | ||
+ | .byte 0 | ||
+ | .byte 1 | ||
+ | </ | ||
base/sound_fx_player.txt · Last modified: 2015-04-17 04:33 by 127.0.0.1