summaryrefslogtreecommitdiff
path: root/SID.cs
diff options
context:
space:
mode:
authorIan C <ianc@noddybox.co.uk>2005-01-21 01:13:58 +0000
committerIan C <ianc@noddybox.co.uk>2005-01-21 01:13:58 +0000
commitf0a9af7158f2faf6359beef5602451b6a042a539 (patch)
treef9c0b00d2067777d9c7d8548f0d7b00a76a85e6d /SID.cs
parent88256e4aed5262e7c50f351264d5f163ffe8e7ef (diff)
Initial checkin
Diffstat (limited to 'SID.cs')
-rw-r--r--SID.cs140
1 files changed, 140 insertions, 0 deletions
diff --git a/SID.cs b/SID.cs
new file mode 100644
index 0000000..f6496ac
--- /dev/null
+++ b/SID.cs
@@ -0,0 +1,140 @@
+// SIDFX
+// Copyright (C) 2004 Ian Cowburn
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+//
+// $Id$
+//
+using System;
+using HardsidInterface;
+
+namespace SIDFX
+{
+ /// <summary>
+ /// Description of SID.
+ /// </summary>
+ public class SID
+ {
+ [Flags]
+ public enum ControlFlag
+ {
+ NOISE=128,
+ PULSE=64,
+ SAW=32,
+ TRIANGLE=16,
+ TEST=8,
+ RING=4,
+ SYNC=2,
+ GATE=1,
+ NONE=0
+ };
+
+ [Flags]
+ public enum FilterFlag
+ {
+ OFF3=128,
+ HP=64,
+ BP=32,
+ LP=16,
+ EXT=8,
+ V3=4,
+ V2=2,
+ V1=1,
+ NONE=0
+ };
+
+ public static void Volume(byte volume)
+ {
+ byte v=(byte)(Hardsid.Read(24)&0xf0u);
+
+ v|=volume;
+ Hardsid.Write(24,v);
+ }
+
+ public static void Frequency(byte voice, uint val)
+ {
+ byte r=(byte)(voice*7);
+ byte h=(byte)(val>>8);
+ byte l=(byte)(val&0xff);
+
+ Hardsid.Write(r,l);
+ Hardsid.Write(r+1u,h);
+ }
+
+ public static void PulseWidth(byte voice, uint val)
+ {
+ byte r=(byte)(voice*7);
+ byte h=(byte)(val>>8);
+ byte l=(byte)(val&0xff);
+
+ Hardsid.Write(r+2u,l);
+ Hardsid.Write(r+3u,h);
+ }
+
+ public static void ADSR(byte voice,
+ byte attack, byte decay,
+ byte sustain, byte release)
+ {
+ byte r=(byte)(voice*7);
+ byte ad=(byte)(((attack&0x0fu)<<4)|(decay&0x0fu));
+ byte sr=(byte)(((sustain&0x0fu)<<4)|(release&0x0fu));
+
+ Hardsid.Write(r+5u,ad);
+ Hardsid.Write(r+6u,sr);
+ }
+
+ public static void Control(byte voice, ControlFlag control)
+ {
+ byte r=(byte)(voice*7);
+
+ Hardsid.Write(r+4u,(uint)control);
+ }
+
+ public static void Cutoff(uint val)
+ {
+ byte h=(byte)(val>>3);
+ byte l=(byte)(val&0x7);
+
+ Hardsid.Write(21,l);
+ Hardsid.Write(22+1u,h);
+ }
+
+ public static void Resonance(byte val)
+ {
+ byte v=(byte)(Hardsid.Read(23)&0x0fu);
+
+ v|=(byte)((val&0x0fu)<<4);
+ Hardsid.Write(23,v);
+ }
+
+ public static void Filter(FilterFlag flags)
+ {
+ byte h=(byte)((uint)flags&0xf0u);
+ byte l=(byte)((uint)flags&0x0fu);
+
+ byte v=(byte)(Hardsid.Read(23)&0xf0u);
+
+ v|=l;
+ Hardsid.Write(23,v);
+
+ v=(byte)(Hardsid.Read(24)&0x0fu);
+
+ v|=h;
+ Hardsid.Write(24,v);
+ }
+
+ private SID() {}
+ }
+}