mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-10 05:32:40 -05:00
Plain import of the library parts first. Adaptions to Rockbox will follow. A *lot* of kudos go to Mihaly Horvath for creating this library from his already lightweight cSID-light, mainly for Rockbox. Besides a lot of other things, he made his algorithms integer-only and significantly improved the C64 emulation, so finally RSIDs could be played as well as PSIDs. TinySID was nice for what it is, but this is a quantum leap in SID playback quality for Rockbox. Check for example: https://hvsc.csdb.dk/MUSICIANS/P/Page_Jason/Eighth.sid https://hvsc.csdb.dk/MUSICIANS/J/Jeff/Blowing.sid Change-Id: I353e12fbfd7cd8696b834616e55743e7b844a73e
60 lines
1.9 KiB
C
60 lines
1.9 KiB
C
|
|
|
|
#ifdef CRSID_PLATFORM_PC
|
|
|
|
int cRSID_loadSIDfile (unsigned char* SIDfileData, char* filename, int maxlen) {
|
|
static signed short Data;
|
|
static signed int SizeCnt;
|
|
static FILE *SIDfile;
|
|
|
|
if ( (SIDfile=fopen(filename,"rb")) == NULL ) return CRSID_ERROR_LOAD;
|
|
|
|
SizeCnt=0;
|
|
|
|
while ( (Data=fgetc(SIDfile)) != EOF ) {
|
|
if (SizeCnt >= maxlen) return CRSID_ERROR_LOAD;
|
|
SIDfileData[SizeCnt] = Data; SizeCnt++;
|
|
}
|
|
|
|
fclose(SIDfile);
|
|
return SizeCnt;
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
cRSID_SIDheader* cRSID_processSIDfile(cRSID_C64instance* C64, unsigned char* filedata, int filesize) {
|
|
int i;
|
|
unsigned short SIDdataOffset;
|
|
cRSID_SIDheader* SIDheader;
|
|
static const char MagicStringPSID[]="PSID";
|
|
//static const char MagicStringRSID[]="RSID";
|
|
|
|
C64->SIDheader = SIDheader = (cRSID_SIDheader*) filedata;
|
|
|
|
for (i=0x0000; i < 0xA000; ++i) C64->RAMbank[i]=0; //fresh start (maybe some bugged SIDs want 0 at certain RAM-locations)
|
|
for (i=0xC000; i < 0xD000; ++i) C64->RAMbank[i]=0;
|
|
|
|
if ( SIDheader->MagicString[0] != 'P' && SIDheader->MagicString[0] != 'R' ) return NULL;
|
|
for (i=1; i < (int)(sizeof(MagicStringPSID)-1); ++i) { if (SIDheader->MagicString[i] != MagicStringPSID[i]) return NULL; }
|
|
C64->RealSIDmode = ( SIDheader->MagicString[0] == 'R' );
|
|
|
|
if (SIDheader->LoadAddressH==0 && SIDheader->LoadAddressH==0) { //load-address taken from first 2 bytes of the C64 PRG
|
|
C64->LoadAddress = (filedata[SIDheader->HeaderSize+1]<<8) + (filedata[SIDheader->HeaderSize+0]);
|
|
SIDdataOffset = SIDheader->HeaderSize+2;
|
|
}
|
|
else { //load-adress taken from SID-header
|
|
C64->LoadAddress = (SIDheader->LoadAddressH<<8) + (SIDheader->LoadAddressL);
|
|
SIDdataOffset = SIDheader->HeaderSize;
|
|
}
|
|
|
|
for (i=SIDdataOffset; i<filesize; ++i) C64->RAMbank [ C64->LoadAddress + (i-SIDdataOffset) ] = filedata[i];
|
|
|
|
i = C64->LoadAddress + (filesize-SIDdataOffset);
|
|
C64->EndAddress = (i<0x10000) ? i : 0xFFFF;
|
|
|
|
C64->PSIDdigiMode = ( !C64->RealSIDmode && (SIDheader->ModelFormatStandard & 2) );
|
|
|
|
return C64->SIDheader;
|
|
}
|
|
|