Files
rc2014-sid/sid.4th
2025-11-12 20:59:06 +00:00

139 lines
4.0 KiB
Forth
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
\ PS2!   c c p-addr --   Data byte (A), high address byte (B), port address (C) - OUT to port with A and B registers set
: PC2! SWAP >< OR PC! ;
\ SID! c c -- Data value, register (0-31); bits 5,6 are for interrupt settings; bit 7 (/CS) is handled
: SID!
2DUP 128 OR 84 PC2!
2DUP 127 AND 84 PC2!
128 OR 84 PC2! ;
\ Voice 1
\ Reg 0,1 - frequency voice 1
: SID0/1:FREQ! DUP 255 AND 0 SID! >< 255 AND 1 SID! ;
\ Reg 2,3 - pulse wave duty cycle voice 2
: SID2/3:PWM! DUP 255 AND 2 SID! >< 15 AND 3 SID! ;
\ Reg 4 - control register voice 1
: SID4:GATEOFF 0 ;
: SID4:GATEON 1 ;
: SID4:SYNC3 2 OR ;
: SID4:RING3 4 OR ;
: SID4:TEST 8 OR ;
: SID4:TRI 16 OR ;
: SID4:SAW 32 OR ;
: SID4:PWM 64 OR ;
: SID4:NOISE 128 OR ;
: SID4! 4 SID! ;
\ Reg 5 - attack duration / decay duration voice 1
: SID5:ATK/DEC! 15 AND SWAP 4 LSHIFT OR 5 SID! ;
\ Reg 6 - sustain level / release duration voice 1
: SID6:SUS/REL! 15 AND SWAP 4 LSHIFT OR 6 SID! ;
\ Voice 2
\ Reg 7,8 - frequency voice 2
: SID7/8:FREQ! DUP 255 AND 7 SID! >< 15 AND 8 SID! ;
\ Reg 9,10 - pulse wave duty cycle voice 2
: SID9/10:PWM! DUP 255 AND 9 SID! >< 255 AND 10 SID! ;
\ Reg 10 - control register voice 2
: SID11:GATEOFF 0 ;
: SID11:GATEON 1 ;
: SID11:SYNC3 2 OR ;
: SID11:RING3 4 OR ;
: SID11:TEST 8 OR ;
: SID11:TRI 16 OR ;
: SID11:SAW 32 OR ;
: SID11:PULSE 64 OR ;
: SID11:NOISE 128 OR ;
: SID11! 11 SID! ;
\ Reg 12 - attack duration / decay duration voice 2
: SID12:ATK/DEC! 15 AND SWAP 4 LSHIFT OR 12 SID! ;
\ Reg 13 - sustain level / release duration voice 2
: SID13:SUS/REL! 15 AND SWAP 4 LSHIFT OR 13 SID! ;
\ Voice 3
\ Reg 14,15 - frequency voice 3
: SID14/15:FREQ! DUP 255 AND 14 SID! >< 15 AND 15 SID! ;
\ Reg 16,17 - pulse wave duty cycle voice 3
: SID16/17:PWM! DUP 255 AND 16 SID! >< 255 AND 17 SID! ;
\ Reg 18 - control register voice 18
: SID18:GATEOFF 0 ;
: SID18:GATEON 1 ;
: SID18:SYNC3 2 OR ;
: SID18:RING3 4 OR ;
: SID18:TEST 8 OR ;
: SID18:TRI 16 OR ;
: SID18:SAW 32 OR ;
: SID18:PWM 64 OR ;
: SID18:NOISE 128 OR ;
: SID18! 18 SID! ;
\ Reg 19 - attack duration / decay duration voice 3
: SID19:ATK/DEC! 15 AND SWAP 4 LSHIFT OR 19 SID! ;
\ Reg 20 - sustain level / release duration voice 3
: SID20:SUS/REL! 15 AND SWAP 4 LSHIFT OR 20 SID! ;
\ Filters
\ Reg 21/22 - filter cutoff frequency (0 - 2047 / 11 bits)
: SID21/22:CUT! DUP 7 AND 21 SID! 3 RSHIFT 255 AND 22 SID! ;
\ Reg 23 - filter resonance (0 - 15 / 4 bits) / ext, voice 3, voice 2, voice 1
: SID23:RES 15 AND 4 LSHIFT ;
: SID23:V1 1 OR ;
: SID23:V2 2 OR ;
: SID23:V3 4 OR ;
: SID23:EXT 8 OR ;
: SID23! 23 SID! ;
\ Reg 24 - filter mode and main volume control
: SID24:VOL 15 AND ;
: SID24:LOWPASS 16 OR ;
: SID24:BANDPASS 32 OR ;
: SID24:HIGHPASS 64 OR ;
: SID24:MUTEVOICE3 128 OR ;
: SID24! 24 SID! ;
\ SID:RST -- Put SID chip in known state
: SID:RST
20000 SID0/1:FREQ! SID4:GATEOFF SID4! 4 2 SID5:ATK/DEC! 15 9 SID6:SUS/REL! 2048 SID2/3:PWM!
20000 SID7/8:FREQ! SID11:GATEOFF SID11! 4 2 SID12:ATK/DEC! 10 9 SID13:SUS/REL! 2048 SID9/10:PWM!
20000 SID14/15:FREQ! SID18:GATEOFF SID18! 4 2 SID19:ATK/DEC! 10 9 SID20:SUS/REL! 2048 SID16/17:PWM!
1024 SID21/22:CUT! 10 SID23:RES SID23!
15 SID24:VOL SID24! ;
: STEP 100 0 DO LOOP ;
: DELAY 10000 0 DO LOOP ;
: SID:TEST:SIREN
SID4:GATEON SID4:TRI SID4!
10 0 DO 255 0 DO I 1 SID! LOOP LOOP
SID4:GATEOFF SID4:TRI SID4! ;
: SIDV1:TEST:NOTE
SID4:GATEON SID4:TRI SID4!
DELAY DELAY
SID4:GATEOFF SID4:TRI SID4! ;
: SIDV2:TEST:NOTE
SID11:GATEON SID11:SAW SID11!
DELAY DELAY
SID11:GATEOFF SID11:SAW SID11! ;
: SIDV3:TEST:NOTE
SID18:GATEON SID18:PWM SID18!
DELAY DELAY
SID18:GATEOFF SID18:PWM SID18! ;
: SID:TEST:MELODY
SIDV1:TEST:NOTE
SIDV2:TEST:NOTE
SIDV3:TEST:NOTE ;
: SID:TEST:FILTER
10 SID23:RES SID23:V1 SID23:V2 SID23:V3 SID23:EXT SID23!
SID18:GATEON SID18:PWM SID18!
2047 0 DO I SID21/22:CUT! 1 +LOOP
SID18:GATEOFF SID18:PWM SID18! ;
SID:RST
SID:TEST:MELODY
15 SID24:VOL SID24:LOWPASS SID24!
SID:TEST:FILTER
15 SID24:VOL SID24:BANDPASS SID24!
SID:TEST:FILTER
15 SID24:VOL SID24:HIGHPASS SID24!
SID:TEST:FILTER