forked from len0rd/rockbox
codec: sid: split cRSID header into a public and a private header
Needed to compile cRSID as a proper library. Change-Id: I276967f46037bd65db1ff38985a781183fc26a00
This commit is contained in:
parent
e8135fea5a
commit
15c0f0576e
4 changed files with 176 additions and 165 deletions
|
@ -3,6 +3,7 @@
|
|||
|
||||
|
||||
#include "../libcRSID.h"
|
||||
#include "libcRSIDc64.h"
|
||||
|
||||
#include "MEM.c"
|
||||
#include "CPU.c"
|
||||
|
|
172
lib/rbcodec/codecs/cRSID/C64/libcRSIDc64.h
Normal file
172
lib/rbcodec/codecs/cRSID/C64/libcRSIDc64.h
Normal file
|
@ -0,0 +1,172 @@
|
|||
// cRSID lightweight RealSID (integer-only) library-header (with API-calls) by Hermit (Mihaly Horvath)
|
||||
|
||||
#ifndef LIBCRSIDC64_HEADER
|
||||
#define LIBCRSIDC64_HEADER //used to prevent double inclusion of this header-file
|
||||
|
||||
typedef struct cRSID_CPUinstance cRSID_CPUinstance;
|
||||
typedef struct cRSID_SIDinstance cRSID_SIDinstance;
|
||||
typedef struct cRSID_CIAinstance cRSID_CIAinstance;
|
||||
typedef struct cRSID_VICinstance cRSID_VICinstance;
|
||||
|
||||
|
||||
//Internal functions
|
||||
|
||||
// C64/C64.c
|
||||
cRSID_C64instance* cRSID_createC64 (cRSID_C64instance* C64, unsigned short samplerate);
|
||||
void cRSID_setC64 (cRSID_C64instance* C64); //configure hardware (SIDs) for SID-tune
|
||||
void cRSID_initC64 (cRSID_C64instance* C64); //hard-reset
|
||||
int cRSID_emulateC64 (cRSID_C64instance* C64);
|
||||
static inline short cRSID_playPSIDdigi (cRSID_C64instance* C64);
|
||||
// C64/MEM.c
|
||||
static inline unsigned char* cRSID_getMemReadPtr (register unsigned short address); //for global cSID_C64 fast-access
|
||||
static inline unsigned char* cRSID_getMemReadPtrC64 (cRSID_C64instance* C64, register unsigned short address); //maybe slower
|
||||
static inline unsigned char* cRSID_getMemWritePtr (register unsigned short address); //for global cSID_C64 fast-access
|
||||
static inline unsigned char* cRSID_getMemWritePtrC64 (cRSID_C64instance* C64, register unsigned short address); //maybe slower
|
||||
static inline unsigned char cRSID_readMem (register unsigned short address); //for global cSID_C64 fast-access
|
||||
static inline unsigned char cRSID_readMemC64 (cRSID_C64instance* C64, register unsigned short address); //maybe slower
|
||||
static inline void cRSID_writeMem (register unsigned short address, register unsigned char data); //for global cSID_C64 fast-access
|
||||
static inline void cRSID_writeMemC64 (cRSID_C64instance* C64, register unsigned short address, register unsigned char data); //maybe slower
|
||||
void cRSID_setROMcontent (cRSID_C64instance* C64); //KERNAL, BASIC
|
||||
void cRSID_initMem (cRSID_C64instance* C64);
|
||||
// C64/CPU.c
|
||||
void cRSID_initCPU (cRSID_CPUinstance* CPU, unsigned short mempos);
|
||||
unsigned char cRSID_emulateCPU (void); //direct instances inside for hopefully faster operation
|
||||
static inline char cRSID_handleCPUinterrupts (cRSID_CPUinstance* CPU);
|
||||
// C64/SID.c
|
||||
void cRSID_createSIDchip (cRSID_C64instance* C64, cRSID_SIDinstance* SID, unsigned short model, unsigned short baseaddress);
|
||||
void cRSID_initSIDchip (cRSID_SIDinstance* SID);
|
||||
void cRSID_emulateADSRs (cRSID_SIDinstance *SID, char cycles);
|
||||
int cRSID_emulateWaves (cRSID_SIDinstance* SID);
|
||||
// C64/CIA.c
|
||||
void cRSID_createCIAchip (cRSID_C64instance* C64, cRSID_CIAinstance* CIA, unsigned short baseaddress);
|
||||
void cRSID_initCIAchip (cRSID_CIAinstance* CIA);
|
||||
static inline char cRSID_emulateCIA (cRSID_CIAinstance* CIA, char cycles);
|
||||
static inline void cRSID_writeCIAIRQmask (cRSID_CIAinstance* CIA, unsigned char value);
|
||||
static inline void cRSID_acknowledgeCIAIRQ (cRSID_CIAinstance* CIA);
|
||||
// C64/VIC.c
|
||||
void cRSID_createVICchip (cRSID_C64instance* C64, cRSID_VICinstance* VIC, unsigned short baseaddress);
|
||||
void cRSID_initVICchip (cRSID_VICinstance* VIC);
|
||||
static inline char cRSID_emulateVIC (cRSID_VICinstance* VIC, char cycles);
|
||||
static inline void cRSID_acknowledgeVICrasterIRQ (cRSID_VICinstance* VIC);
|
||||
|
||||
// host/file.c
|
||||
#ifdef CRSID_PLATFORM_PC
|
||||
int cRSID_loadSIDfile (unsigned char* SIDfileData, char* filename, int maxlen); //load SID-file to a memory location (and return size)
|
||||
#endif
|
||||
// host/audio.c
|
||||
#ifdef CRSID_PLATFORM_PC
|
||||
void* cRSID_initSound (cRSID_C64instance* C64, unsigned short samplerate, unsigned short buflen);
|
||||
void cRSID_startSound (void);
|
||||
void cRSID_stopSound (void);
|
||||
void cRSID_closeSound (void);
|
||||
void cRSID_generateSound (cRSID_C64instance* C64, unsigned char* buf, unsigned short len);
|
||||
#endif
|
||||
|
||||
|
||||
struct cRSID_CPUinstance {
|
||||
cRSID_C64instance* C64; //reference to the containing C64
|
||||
unsigned int PC;
|
||||
short int A, SP;
|
||||
unsigned char X, Y, ST; //STATUS-flags: N V - B D I Z C
|
||||
unsigned char PrevNMI; //used for NMI leading edge detection
|
||||
};
|
||||
|
||||
|
||||
struct cRSID_SIDinstance {
|
||||
//SID-chip data:
|
||||
cRSID_C64instance* C64; //reference to the containing C64
|
||||
unsigned short ChipModel; //values: 8580 / 6581
|
||||
unsigned short BaseAddress; //SID-baseaddress location in C64-memory (IO)
|
||||
unsigned char* BasePtr; //SID-baseaddress location in host's memory
|
||||
//ADSR-related:
|
||||
unsigned char ADSRstate[15];
|
||||
unsigned short RateCounter[15];
|
||||
unsigned char EnvelopeCounter[15];
|
||||
unsigned char ExponentCounter[15];
|
||||
//Wave-related:
|
||||
int PhaseAccu[15]; //28bit precision instead of 24bit
|
||||
int PrevPhaseAccu[15]; //(integerized ClockRatio fractionals, WebSID has similar solution)
|
||||
unsigned char SyncSourceMSBrise;
|
||||
unsigned int RingSourceMSB;
|
||||
unsigned int NoiseLFSR[15];
|
||||
unsigned int PrevWavGenOut[15];
|
||||
unsigned char PrevWavData[15];
|
||||
//Filter-related:
|
||||
int PrevLowPass;
|
||||
int PrevBandPass;
|
||||
//Output-stage:
|
||||
signed int PrevVolume; //lowpass-filtered version of Volume-band register
|
||||
};
|
||||
|
||||
|
||||
struct cRSID_CIAinstance {
|
||||
cRSID_C64instance* C64; //reference to the containing C64
|
||||
char ChipModel; //old or new CIA? (have 1 cycle difference in cases)
|
||||
unsigned short BaseAddress; //CIA-baseaddress location in C64-memory (IO)
|
||||
unsigned char* BasePtrWR; //CIA-baseaddress location in host's memory for writing
|
||||
unsigned char* BasePtrRD; //CIA-baseaddress location in host's memory for reading
|
||||
};
|
||||
|
||||
|
||||
struct cRSID_VICinstance {
|
||||
cRSID_C64instance* C64; //reference to the containing C64
|
||||
char ChipModel; //(timing differences between models?)
|
||||
unsigned short BaseAddress; //VIC-baseaddress location in C64-memory (IO)
|
||||
unsigned char* BasePtrWR; //VIC-baseaddress location in host's memory for writing
|
||||
unsigned char* BasePtrRD; //VIC-baseaddress location in host's memory for reading
|
||||
unsigned short RasterLines;
|
||||
unsigned char RasterRowCycles;
|
||||
unsigned char RowCycleCnt;
|
||||
};
|
||||
|
||||
|
||||
struct cRSID_C64instance {
|
||||
//platform-related:
|
||||
unsigned short SampleRate;
|
||||
//C64-machine related:
|
||||
unsigned char VideoStandard; //0:NTSC, 1:PAL (based on the SID-header field)
|
||||
unsigned int CPUfrequency;
|
||||
unsigned short SampleClockRatio; //ratio of CPU-clock and samplerate
|
||||
//SID-file related:
|
||||
union {
|
||||
cRSID_SIDheader* SIDheader;
|
||||
char* SIDfileData;
|
||||
};
|
||||
unsigned short Attenuation;
|
||||
char RealSIDmode;
|
||||
char PSIDdigiMode;
|
||||
unsigned char SubTune;
|
||||
unsigned short LoadAddress;
|
||||
unsigned short InitAddress;
|
||||
unsigned short PlayAddress;
|
||||
unsigned short EndAddress;
|
||||
char TimerSource; //for current subtune, 0:VIC, 1:CIA (as in SID-header)
|
||||
//PSID-playback related:
|
||||
//char CIAisSet; //for dynamic CIA setting from player-routine (RealSID substitution)
|
||||
int FrameCycles;
|
||||
int FrameCycleCnt; //this is a substitution in PSID-mode for CIA/VIC counters
|
||||
short PrevRasterLine;
|
||||
short SampleCycleCnt;
|
||||
short TenthSecondCnt;
|
||||
char Finished;
|
||||
char Returned;
|
||||
unsigned char IRQ; //collected IRQ line from devices
|
||||
unsigned char NMI; //collected NMI line from devices
|
||||
|
||||
//Hardware-elements:
|
||||
cRSID_CPUinstance CPU;
|
||||
cRSID_SIDinstance SID[CRSID_SIDCOUNT_MAX+1];
|
||||
cRSID_CIAinstance CIA[CRSID_CIACOUNT+1];
|
||||
cRSID_VICinstance VIC;
|
||||
//Overlapping system memories, which one is read/written in an address region depends on CPU-port bankselect-bits)
|
||||
//Address $00 and $01 - data-direction and data-register of port built into CPU (used as bank-selection) (overriding RAM on C64)
|
||||
unsigned char RAMbank[0x10100]; //$0000..$FFFF RAM (and RAM under IO/ROM/CPUport)
|
||||
unsigned char IObankWR[0x10100]; //$D000..$DFFF IO-RAM (registers) to write (VIC/SID/CIA/ColorRAM/IOexpansion)
|
||||
unsigned char IObankRD[0x10100]; //$D000..$DFFF IO-RAM (registers) to read from (VIC/SID/CIA/ColorRAM/IOexpansion)
|
||||
unsigned char ROMbanks[0x10100]; //$1000..$1FFF/$9000..$9FFF (CHARGEN), $A000..$BFFF (BASIC), $E000..$FFFF (KERNAL)
|
||||
};
|
||||
|
||||
cRSID_C64instance cRSID_C64; //the only global object (for faster & simpler access than with struct-pointers, in some places)
|
||||
|
||||
|
||||
#endif //LIBCRSIDC64_HEADER
|
|
@ -52,7 +52,7 @@ void cRSID_generateSound(cRSID_C64instance* C64instance, unsigned char *buf, uns
|
|||
#endif
|
||||
|
||||
|
||||
static inline signed short cRSID_generateSample (cRSID_C64instance* C64) { //call this from custom buffer-filler
|
||||
signed short cRSID_generateSample (cRSID_C64instance* C64) { //call this from custom buffer-filler
|
||||
static int Output;
|
||||
Output=cRSID_emulateC64(C64);
|
||||
if (C64->PSIDdigiMode) Output += cRSID_playPSIDdigi(C64);
|
||||
|
|
|
@ -10,13 +10,9 @@ enum cRSID_StatusCodes { CRSID_STATUS_OK=0, CRSID_ERROR_INIT=-1, CRSID_ERROR_
|
|||
|
||||
typedef struct cRSID_SIDheader cRSID_SIDheader;
|
||||
typedef struct cRSID_C64instance cRSID_C64instance;
|
||||
typedef struct cRSID_CPUinstance cRSID_CPUinstance;
|
||||
typedef struct cRSID_SIDinstance cRSID_SIDinstance;
|
||||
typedef struct cRSID_CIAinstance cRSID_CIAinstance;
|
||||
typedef struct cRSID_VICinstance cRSID_VICinstance;
|
||||
|
||||
|
||||
cRSID_C64instance cRSID_C64; //the only global object (for faster & simpler access than with struct-pointers, in some places)
|
||||
extern cRSID_C64instance cRSID_C64; //the only global object (for faster & simpler access than with struct-pointers, in some places)
|
||||
|
||||
|
||||
// Main API functions (mainly in libcRSID.c)
|
||||
|
@ -30,61 +26,7 @@ void cRSID_close (void); //close sound etc.
|
|||
#endif
|
||||
cRSID_SIDheader* cRSID_processSIDfile (cRSID_C64instance* C64, unsigned char* filedata, int filesize); //in host/file.c, copy SID-data to C64 memory
|
||||
void cRSID_initSIDtune (cRSID_C64instance* C64, cRSID_SIDheader* SIDheader, char subtune); //init tune/subtune
|
||||
static inline signed short cRSID_generateSample (cRSID_C64instance* C64); //in host/audio.c, calculate a single sample
|
||||
|
||||
|
||||
//Internal functions
|
||||
|
||||
// C64/C64.c
|
||||
cRSID_C64instance* cRSID_createC64 (cRSID_C64instance* C64, unsigned short samplerate);
|
||||
void cRSID_setC64 (cRSID_C64instance* C64); //configure hardware (SIDs) for SID-tune
|
||||
void cRSID_initC64 (cRSID_C64instance* C64); //hard-reset
|
||||
int cRSID_emulateC64 (cRSID_C64instance* C64);
|
||||
static inline short cRSID_playPSIDdigi (cRSID_C64instance* C64);
|
||||
// C64/MEM.c
|
||||
static inline unsigned char* cRSID_getMemReadPtr (register unsigned short address); //for global cSID_C64 fast-access
|
||||
static inline unsigned char* cRSID_getMemReadPtrC64 (cRSID_C64instance* C64, register unsigned short address); //maybe slower
|
||||
static inline unsigned char* cRSID_getMemWritePtr (register unsigned short address); //for global cSID_C64 fast-access
|
||||
static inline unsigned char* cRSID_getMemWritePtrC64 (cRSID_C64instance* C64, register unsigned short address); //maybe slower
|
||||
static inline unsigned char cRSID_readMem (register unsigned short address); //for global cSID_C64 fast-access
|
||||
static inline unsigned char cRSID_readMemC64 (cRSID_C64instance* C64, register unsigned short address); //maybe slower
|
||||
static inline void cRSID_writeMem (register unsigned short address, register unsigned char data); //for global cSID_C64 fast-access
|
||||
static inline void cRSID_writeMemC64 (cRSID_C64instance* C64, register unsigned short address, register unsigned char data); //maybe slower
|
||||
void cRSID_setROMcontent (cRSID_C64instance* C64); //KERNAL, BASIC
|
||||
void cRSID_initMem (cRSID_C64instance* C64);
|
||||
// C64/CPU.c
|
||||
void cRSID_initCPU (cRSID_CPUinstance* CPU, unsigned short mempos);
|
||||
unsigned char cRSID_emulateCPU (void); //direct instances inside for hopefully faster operation
|
||||
static inline char cRSID_handleCPUinterrupts (cRSID_CPUinstance* CPU);
|
||||
// C64/SID.c
|
||||
void cRSID_createSIDchip (cRSID_C64instance* C64, cRSID_SIDinstance* SID, unsigned short model, unsigned short baseaddress);
|
||||
void cRSID_initSIDchip (cRSID_SIDinstance* SID);
|
||||
void cRSID_emulateADSRs (cRSID_SIDinstance *SID, char cycles);
|
||||
int cRSID_emulateWaves (cRSID_SIDinstance* SID);
|
||||
// C64/CIA.c
|
||||
void cRSID_createCIAchip (cRSID_C64instance* C64, cRSID_CIAinstance* CIA, unsigned short baseaddress);
|
||||
void cRSID_initCIAchip (cRSID_CIAinstance* CIA);
|
||||
static inline char cRSID_emulateCIA (cRSID_CIAinstance* CIA, char cycles);
|
||||
static inline void cRSID_writeCIAIRQmask (cRSID_CIAinstance* CIA, unsigned char value);
|
||||
static inline void cRSID_acknowledgeCIAIRQ (cRSID_CIAinstance* CIA);
|
||||
// C64/VIC.c
|
||||
void cRSID_createVICchip (cRSID_C64instance* C64, cRSID_VICinstance* VIC, unsigned short baseaddress);
|
||||
void cRSID_initVICchip (cRSID_VICinstance* VIC);
|
||||
static inline char cRSID_emulateVIC (cRSID_VICinstance* VIC, char cycles);
|
||||
static inline void cRSID_acknowledgeVICrasterIRQ (cRSID_VICinstance* VIC);
|
||||
|
||||
// host/file.c
|
||||
#ifdef CRSID_PLATFORM_PC
|
||||
int cRSID_loadSIDfile (unsigned char* SIDfileData, char* filename, int maxlen); //load SID-file to a memory location (and return size)
|
||||
#endif
|
||||
// host/audio.c
|
||||
#ifdef CRSID_PLATFORM_PC
|
||||
void* cRSID_initSound (cRSID_C64instance* C64, unsigned short samplerate, unsigned short buflen);
|
||||
void cRSID_startSound (void);
|
||||
void cRSID_stopSound (void);
|
||||
void cRSID_closeSound (void);
|
||||
void cRSID_generateSound (cRSID_C64instance* C64, unsigned char* buf, unsigned short len);
|
||||
#endif
|
||||
signed short cRSID_generateSample (cRSID_C64instance* C64); //in host/audio.c, calculate a single sample
|
||||
|
||||
|
||||
struct cRSID_SIDheader { //Offset: default/info:
|
||||
|
@ -114,108 +56,4 @@ struct cRSID_SIDheader { //Offset: default/info:
|
|||
}; //music-program follows right after the header
|
||||
|
||||
|
||||
struct cRSID_CPUinstance {
|
||||
cRSID_C64instance* C64; //reference to the containing C64
|
||||
unsigned int PC;
|
||||
short int A, SP;
|
||||
unsigned char X, Y, ST; //STATUS-flags: N V - B D I Z C
|
||||
unsigned char PrevNMI; //used for NMI leading edge detection
|
||||
};
|
||||
|
||||
|
||||
struct cRSID_SIDinstance {
|
||||
//SID-chip data:
|
||||
cRSID_C64instance* C64; //reference to the containing C64
|
||||
unsigned short ChipModel; //values: 8580 / 6581
|
||||
unsigned short BaseAddress; //SID-baseaddress location in C64-memory (IO)
|
||||
unsigned char* BasePtr; //SID-baseaddress location in host's memory
|
||||
//ADSR-related:
|
||||
unsigned char ADSRstate[15];
|
||||
unsigned short RateCounter[15];
|
||||
unsigned char EnvelopeCounter[15];
|
||||
unsigned char ExponentCounter[15];
|
||||
//Wave-related:
|
||||
int PhaseAccu[15]; //28bit precision instead of 24bit
|
||||
int PrevPhaseAccu[15]; //(integerized ClockRatio fractionals, WebSID has similar solution)
|
||||
unsigned char SyncSourceMSBrise;
|
||||
unsigned int RingSourceMSB;
|
||||
unsigned int NoiseLFSR[15];
|
||||
unsigned int PrevWavGenOut[15];
|
||||
unsigned char PrevWavData[15];
|
||||
//Filter-related:
|
||||
int PrevLowPass;
|
||||
int PrevBandPass;
|
||||
//Output-stage:
|
||||
signed int PrevVolume; //lowpass-filtered version of Volume-band register
|
||||
};
|
||||
|
||||
|
||||
struct cRSID_CIAinstance {
|
||||
cRSID_C64instance* C64; //reference to the containing C64
|
||||
char ChipModel; //old or new CIA? (have 1 cycle difference in cases)
|
||||
unsigned short BaseAddress; //CIA-baseaddress location in C64-memory (IO)
|
||||
unsigned char* BasePtrWR; //CIA-baseaddress location in host's memory for writing
|
||||
unsigned char* BasePtrRD; //CIA-baseaddress location in host's memory for reading
|
||||
};
|
||||
|
||||
|
||||
struct cRSID_VICinstance {
|
||||
cRSID_C64instance* C64; //reference to the containing C64
|
||||
char ChipModel; //(timing differences between models?)
|
||||
unsigned short BaseAddress; //VIC-baseaddress location in C64-memory (IO)
|
||||
unsigned char* BasePtrWR; //VIC-baseaddress location in host's memory for writing
|
||||
unsigned char* BasePtrRD; //VIC-baseaddress location in host's memory for reading
|
||||
unsigned short RasterLines;
|
||||
unsigned char RasterRowCycles;
|
||||
unsigned char RowCycleCnt;
|
||||
};
|
||||
|
||||
|
||||
struct cRSID_C64instance {
|
||||
//platform-related:
|
||||
unsigned short SampleRate;
|
||||
//C64-machine related:
|
||||
unsigned char VideoStandard; //0:NTSC, 1:PAL (based on the SID-header field)
|
||||
unsigned int CPUfrequency;
|
||||
unsigned short SampleClockRatio; //ratio of CPU-clock and samplerate
|
||||
//SID-file related:
|
||||
union {
|
||||
cRSID_SIDheader* SIDheader;
|
||||
char* SIDfileData;
|
||||
};
|
||||
unsigned short Attenuation;
|
||||
char RealSIDmode;
|
||||
char PSIDdigiMode;
|
||||
unsigned char SubTune;
|
||||
unsigned short LoadAddress;
|
||||
unsigned short InitAddress;
|
||||
unsigned short PlayAddress;
|
||||
unsigned short EndAddress;
|
||||
char TimerSource; //for current subtune, 0:VIC, 1:CIA (as in SID-header)
|
||||
//PSID-playback related:
|
||||
//char CIAisSet; //for dynamic CIA setting from player-routine (RealSID substitution)
|
||||
int FrameCycles;
|
||||
int FrameCycleCnt; //this is a substitution in PSID-mode for CIA/VIC counters
|
||||
short PrevRasterLine;
|
||||
short SampleCycleCnt;
|
||||
short TenthSecondCnt;
|
||||
char Finished;
|
||||
char Returned;
|
||||
unsigned char IRQ; //collected IRQ line from devices
|
||||
unsigned char NMI; //collected NMI line from devices
|
||||
|
||||
//Hardware-elements:
|
||||
cRSID_CPUinstance CPU;
|
||||
cRSID_SIDinstance SID[CRSID_SIDCOUNT_MAX+1];
|
||||
cRSID_CIAinstance CIA[CRSID_CIACOUNT+1];
|
||||
cRSID_VICinstance VIC;
|
||||
//Overlapping system memories, which one is read/written in an address region depends on CPU-port bankselect-bits)
|
||||
//Address $00 and $01 - data-direction and data-register of port built into CPU (used as bank-selection) (overriding RAM on C64)
|
||||
unsigned char RAMbank[0x10100]; //$0000..$FFFF RAM (and RAM under IO/ROM/CPUport)
|
||||
unsigned char IObankWR[0x10100]; //$D000..$DFFF IO-RAM (registers) to write (VIC/SID/CIA/ColorRAM/IOexpansion)
|
||||
unsigned char IObankRD[0x10100]; //$D000..$DFFF IO-RAM (registers) to read from (VIC/SID/CIA/ColorRAM/IOexpansion)
|
||||
unsigned char ROMbanks[0x10100]; //$1000..$1FFF/$9000..$9FFF (CHARGEN), $A000..$BFFF (BASIC), $E000..$FFFF (KERNAL)
|
||||
};
|
||||
|
||||
|
||||
#endif //LIBCRSID_HEADER
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue