oscar64/include/c64/sid.h

108 lines
2.5 KiB
C

#ifndef C64_SID_H
#define C64_SID_H
#include "types.h"
#define SID_ATK_2 0x00
#define SID_ATK_8 0x10
#define SID_ATK_16 0x20
#define SID_ATK_24 0x30
#define SID_ATK_38 0x40
#define SID_ATK_56 0x50
#define SID_ATK_68 0x60
#define SID_ATK_80 0x70
#define SID_ATK_100 0x80
#define SID_ATK_250 0x90
#define SID_ATK_500 0xa0
#define SID_ATK_800 0xb0
#define SID_ATK_1000 0xc0
#define SID_ATK_3000 0xd0
#define SID_ATK_5000 0xe0
#define SID_ATK_8000 0xf0
#define SID_DKY_6 0x00
#define SID_DKY_24 0x01
#define SID_DKY_48 0x02
#define SID_DKY_72 0x03
#define SID_DKY_114 0x04
#define SID_DKY_168 0x05
#define SID_DKY_204 0x06
#define SID_DKY_240 0x07
#define SID_DKY_300 0x08
#define SID_DKY_750 0x09
#define SID_DKY_1500 0x0a
#define SID_DKY_2400 0x0b
#define SID_DKY_3000 0x0c
#define SID_DKY_9000 0x0d
#define SID_DKY_15000 0x0e
#define SID_DKY_24000 0x0f
#define SID_CTRL_GATE 0x01
#define SID_CTRL_SYNC 0x02
#define SID_CTRL_RING 0x04
#define SID_CTRL_TEST 0x08
#define SID_CTRL_TRI 0x10
#define SID_CTRL_SAW 0x20
#define SID_CTRL_RECT 0x40
#define SID_CTRL_NOISE 0x80
#define SID_FILTER_1 0x01
#define SID_FILTER_2 0x02
#define SID_FILTER_3 0x04
#define SID_FILTER_X 0x08
#define SID_FMODE_LP 0x10
#define SID_FMODE_BP 0x20
#define SID_FMODE_HP 0x40
#define SID_FMODE_3_OFF 0x80
#define SID_CLOCK_PAL 985248
#define SID_CLOCK_NTSC 1022727
#define SID_CLKSCALE_PAL 1115974UL
#define SID_CLKSCALE_NTSC 1075078UL
#define SID_FREQ_PAL(f) ((unsigned)(((unsigned long)(f) * SID_CLKSCALE_PAL) >> 16))
#define SID_FREQ_NTSC(f) ((unsigned)(((unsigned long)(f) * SID_CLKSCALE_NTSC) >> 16))
struct SID
{
struct Voice
{
volatile unsigned freq;
volatile unsigned pwm;
volatile byte ctrl;
volatile byte attdec;
volatile byte susrel;
} voices[3];
volatile unsigned ffreq;
volatile byte resfilt;
volatile byte fmodevol;
volatile byte potx;
volatile byte poty;
volatile byte random;
volatile byte env3;
};
#define NOTE_C(o) (16744U >> (10 - (o)))
#define NOTE_CS(o) (17740U >> (10 - (o)))
#define NOTE_D(o) (18794U >> (10 - (o)))
#define NOTE_DS(o) (19912U >> (10 - (o)))
#define NOTE_E(o) (21096U >> (10 - (o)))
#define NOTE_F(o) (22351U >> (10 - (o)))
#define NOTE_FS(o) (23680U >> (10 - (o)))
#define NOTE_G(o) (25087U >> (10 - (o)))
#define NOTE_GS(o) (26580U >> (10 - (o)))
#define NOTE_A(o) (28160U >> (10 - (o)))
#define NOTE_AS(o) (29834U >> (10 - (o)))
#define NOTE_B(o) (31068U >> (10 - (o)))
// reference to the SID chip
#define sid (*((struct SID *)0xd400))
#pragma compile("sid.c")
#endif