summaryrefslogtreecommitdiffstats
path: root/lib/rbcodec/codecs/cRSID/host/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rbcodec/codecs/cRSID/host/file.c')
-rw-r--r--lib/rbcodec/codecs/cRSID/host/file.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/lib/rbcodec/codecs/cRSID/host/file.c b/lib/rbcodec/codecs/cRSID/host/file.c
new file mode 100644
index 0000000000..c87f37ebb4
--- /dev/null
+++ b/lib/rbcodec/codecs/cRSID/host/file.c
@@ -0,0 +1,60 @@
+
+
+#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;
+}
+