]> 4ch.mooo.com Git - 16.git/blobdiff - src/lib/vgmsnd/vgmSnd.c
16_ca needs huge amounts of work and I should remember what needs to be done soon...
[16.git] / src / lib / vgmsnd / vgmSnd.c
index d5e1cb2f2da100a5aef817e357f9959fc53a1597..2cfd8690c36a008a07cdd7df39d383de07a833f9 100755 (executable)
 \r
 typedef struct _vgm_file_header_base\r
 {\r
-       sdword fccVGM;                  // 00\r
-       sdword lngEOFOffset;    // 04\r
-       sdword lngVersion;              // 08\r
-       sdword lngSkip1[2];             // 0C\r
-       sdword lngGD3Offset;    // 14\r
-       sdword lngTotalSamples; // 18\r
-       sdword lngLoopOffset;   // 1C\r
-       sdword lngLoopSamples;  // 20\r
-       sdword lngRate;                 // 24\r
-       sdword lngSkip2[3];             // 28\r
-       sdword lngDataOffset;   // 34\r
-       sdword lngSkip3[2];             // 38\r
+       dword fccVGM;                   // 00\r
+       dword/*32*/ lngEOFOffset;       // 04\r
+       dword/*32*/ lngVersion;         // 08\r
+       dword/*32*/ lngSkip1[2];                // 0C\r
+       dword/*32*/ lngGD3Offset;       // 14\r
+       dword/*32*/ lngTotalSamples;    // 18\r
+       dword/*32*/ lngLoopOffset;      // 1C\r
+       dword/*32*/ lngLoopSamples;     // 20\r
+       dword/*32*/ lngRate;                    // 24\r
+       dword/*32*/ lngSkip2[3];                // 28\r
+       dword/*32*/ lngDataOffset;      // 34\r
+       dword/*32*/ lngSkip3[2];                // 38\r
 } VGM_BASE_HDR;\r
 \r
 #define PBMODE_MUSIC   0x00\r
 #define PBMODE_SFX             0x01\r
 typedef struct _vgm_playback\r
 {\r
-       byte pbMode;\r
-       byte vgmEnd;    // 00 - running, 01 - finished, FF - not loaded\r
-       sword/**/ curLoopCnt;\r
-       sdword vgmPos;\r
-       sdword vgmSmplPos;\r
-       sdword pbSmplPos;\r
+       UINT8 pbMode;\r
+       UINT8 vgmEnd;   // 00 - running, 01 - finished, FF - not loaded\r
+       UINT16 curLoopCnt;\r
+       dword/*32*/ vgmPos;\r
+       dword/*32*/ vgmSmplPos;\r
+       dword/*32*/ pbSmplPos;\r
        VGM_FILE* file;\r
 \r
        // oplChnMask:\r
        //      Music: mask of channels used/overridden by SFX\r
        //      SFX:   ID of channel used by SFX (all commands are forces to it)\r
-       sword/**/ oplChnMask;\r
-       byte* oplRegCache;\r
-       byte workRAM[0x04];\r
+       UINT16 oplChnMask;\r
+       UINT8* oplRegCache;\r
+       UINT8 workRAM[0x04];\r
 } VGM_PBK;\r
 \r
 \r
 \r
-INLINE sword/**/ ReadLE16(const byte* buffer)\r
+INLINE UINT16 ReadLE16(const UINT8* buffer)\r
 {\r
 #ifdef QUICK_READ\r
-       return *(sword/**/*)buffer;\r
+       return *(UINT16*)buffer;\r
 #else\r
        return (buffer[0x00] << 0) | (buffer[0x01] << 8);\r
 #endif\r
 }\r
 \r
-INLINE sdword ReadLE32(const byte* buffer)\r
+INLINE dword/*32*/ ReadLE32(const UINT8* buffer)\r
 {\r
 #ifdef QUICK_READ\r
-       return *(sword*)buffer;\r
+       return *(dword/*32*/*)buffer;\r
 #else\r
        return  (buffer[0x00] <<  0) | (buffer[0x01] <<  8) |\r
                        (buffer[0x02] << 16) | (buffer[0x03] << 24);\r
@@ -78,35 +78,35 @@ INLINE sdword ReadLE32(const byte* buffer)
 \r
 \r
 // Function Prototypes\r
-//byte OpenVGMFile(const char* FileName, VGM_FILE* vgmFile);\r
+//UINT8 OpenVGMFile(const char* FileName, VGM_FILE* vgmFile);\r
 //void FreeVGMFile(VGM_FILE* vgmFile);\r
 \r
 static boolean DoVgmLoop(VGM_PBK* vgmPlay);\r
-static void UpdateVGM(VGM_PBK* vgmPlay, sword/**/ Samples);\r
+static void UpdateVGM(VGM_PBK* vgmPlay, UINT16 Samples);\r
 \r
 //void InitEngine(void);\r
 //void DeinitEngine(void);\r
 \r
-//byte PlayMusic(VGM_FILE* vgmFile);\r
-//byte PlaySFX(VGM_FILE* vgmFile, byte sfxChnID);\r
-//byte StopMusic(void);\r
-//byte StopSFX(byte sfxChnID); // Note: sfxChnID == 0xFF -> stop all SFX\r
-//byte PauseMusic(void);\r
-//byte ResumeMusic(void);\r
+//UINT8 PlayMusic(VGM_FILE* vgmFile);\r
+//UINT8 PlaySFX(VGM_FILE* vgmFile, UINT8 sfxChnID);\r
+//UINT8 StopMusic(void);\r
+//UINT8 StopSFX(UINT8 sfxChnID);       // Note: sfxChnID == 0xFF -> stop all SFX\r
+//UINT8 PauseMusic(void);\r
+//UINT8 ResumeMusic(void);\r
 static void StartPlayback(VGM_PBK* vgmPb);\r
 static void StopPlayback(VGM_PBK* vgmPb);\r
 \r
-static void ym2413_write(VGM_PBK* vgmPb, byte reg, byte data);\r
-static void ym3812_write(VGM_PBK* vgmPb, byte reg, byte data);\r
-static void ym3512_write(VGM_PBK* vgmPb, byte reg, byte data);\r
-static void ymf262_write(VGM_PBK* vgmPb, byte port, byte reg, byte data);\r
+static void ym2413_write(VGM_PBK* vgmPb, UINT8 reg, UINT8 data);\r
+static void ym3812_write(VGM_PBK* vgmPb, UINT8 reg, UINT8 data);\r
+static void ym3512_write(VGM_PBK* vgmPb, UINT8 reg, UINT8 data);\r
+static void ymf262_write(VGM_PBK* vgmPb, UINT8 port, UINT8 reg, UINT8 data);\r
 \r
 //void UpdateSoundEngine(void);\r
 \r
 \r
 // Functions that must be supplied by external library\r
-extern void OPL2_Write(byte reg, byte data);\r
-extern byte OPL2_ReadStatus(void);\r
+extern void OPL2_Write(UINT8 reg, UINT8 data);\r
+extern UINT8 OPL2_ReadStatus(void);\r
 \r
 \r
 \r
@@ -119,32 +119,32 @@ extern byte OPL2_ReadStatus(void);
 static VGM_PBK vgmPbMusic;\r
 static VGM_PBK vgmPbSFX[SFX_CHN_COUNT];\r
 \r
-static byte oplRegs_Music[0x100];\r
-static byte oplRegs_SFX[SFX_CHN_COUNT][0x0D];  // 20 23 40 43 60 63 80 83 E0 E3 C0 A0 B0\r
+static UINT8 oplRegs_Music[0x100];\r
+static UINT8 oplRegs_SFX[SFX_CHN_COUNT][0x0D]; // 20 23 40 43 60 63 80 83 E0 E3 C0 A0 B0\r
 \r
-static const byte SFX_REGS[0x0D] =\r
+static const UINT8 SFX_REGS[0x0D] =\r
 {      0x20, 0x23, 0x40, 0x43, 0x60, 0x63, 0x80, 0x83,\r
        0xE0, 0xE3, 0xC0, 0xA0, 0xB0};\r
-static const byte SFX_REGS_REV[0x10] = // 20/30 -> 0, 40/50 -> 2, ...\r
+static const UINT8 SFX_REGS_REV[0x10] =        // 20/30 -> 0, 40/50 -> 2, ...\r
 {      0xFF, 0xFF, 0x00, 0x00, 0x02, 0x02, 0x04, 0x04,\r
        0x06, 0x06, 0x0B, 0x0C, 0x0A, 0xFF, 0x08, 0x08};\r
-static const byte CHN_OPMASK[0x09] =\r
+static const UINT8 CHN_OPMASK[0x09] =\r
 {      0x00, 0x01, 0x02, 0x08, 0x09, 0x0A, 0x10, 0x11, 0x12};\r
-static const byte CHN_OPMASK_REV[0x20] =\r
+static const UINT8 CHN_OPMASK_REV[0x20] =\r
 {      0x00, 0x01, 0x02, 0x80, 0x81, 0x82, 0xFF, 0xFF,\r
        0x03, 0x04, 0x05, 0x83, 0x84, 0x85, 0xFF, 0xFF,\r
        0x06, 0x07, 0x08, 0x86, 0x87, 0x88, 0xFF, 0xFF,\r
        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};\r
 \r
 \r
-byte OpenVGMFile(const char* FileName, VGM_FILE* vgmFile)\r
+UINT8 OpenVGMFile(const char* FileName, VGM_FILE* vgmFile, global_game_variables_t *gvar)\r
 {\r
        size_t hdrSize;\r
        size_t readEl;  // 'elements' read from file\r
        size_t bytesToRead;\r
        VGM_BASE_HDR vgmBaseHdr;\r
        FILE* hFile;\r
-       sdword CurPos;\r
+       dword/*32*/ CurPos;\r
 \r
        memset(vgmFile, 0x00, sizeof(VGM_FILE));\r
 \r
@@ -171,7 +171,9 @@ byte OpenVGMFile(const char* FileName, VGM_FILE* vgmFile)
        }\r
 \r
        vgmFile->dataLen = vgmBaseHdr.lngEOFOffset + 0x04;\r
-       vgmFile->data = (byte*)malloc(vgmFile->dataLen);\r
+       //vgmFile->data = (UINT8*)malloc(vgmFile->dataLen);\r
+       MM_GetPtr(MEMPTRCONV gvar->ca.audiosegs[0], vgmFile->dataLen, gvar);\r
+       vgmFile->data = (UINT8*)gvar->ca.audiosegs[0];\r
        if (vgmFile->data == NULL)\r
        {\r
                fclose(hFile);\r
@@ -206,18 +208,20 @@ byte OpenVGMFile(const char* FileName, VGM_FILE* vgmFile)
                CurPos = 0x40;\r
        hdrSize = sizeof(VGM_HEADER);\r
        if (hdrSize > CurPos)\r
-               memset((byte*)&vgmFile->header + CurPos, 0x00, hdrSize - CurPos);\r
+               memset((UINT8*)&vgmFile->header + CurPos, 0x00, hdrSize - CurPos);\r
 \r
        fclose(hFile);\r
        return 0x00;\r
 }\r
 \r
-void FreeVGMFile(VGM_FILE* vgmFile)\r
+void FreeVGMFile(VGM_FILE* vgmFile, global_game_variables_t *gvar)\r
 {\r
-       free(vgmFile->data);    vgmFile->data = NULL;\r
+       //if(vgmFile->data){ free(vgmFile->data);       vgmFile->data = NULL; }\r
+       MM_FreePtr(MEMPTRCONV gvar->ca.audiosegs[0], gvar);\r
+       if(vgmFile->data) free(vgmFile->data);\r
        vgmFile->dataLen = 0;\r
 \r
-       return;\r
+//     return;\r
 }\r
 \r
 \r
@@ -237,16 +241,16 @@ static boolean DoVgmLoop(VGM_PBK* vgmPlay)
        return true;\r
 }\r
 \r
-static void UpdateVGM(VGM_PBK* vgmPlay, sword/**/ Samples)\r
+static void UpdateVGM(VGM_PBK* vgmPlay, UINT16 Samples)\r
 {\r
-       const sdword vgmLen = vgmPlay->file->dataLen;\r
-       const byte* vgmData = vgmPlay->file->data;\r
-       const byte* VGMPnt;\r
-       sdword VGMPos;\r
-       sdword VGMSmplPos;\r
-       byte Command;\r
-       byte blockType;\r
-       sdword blockLen;\r
+       const dword/*32*/ vgmLen = vgmPlay->file->dataLen;\r
+       const UINT8* vgmData = vgmPlay->file->data;\r
+       const UINT8* VGMPnt;\r
+       dword/*32*/ VGMPos;\r
+       dword/*32*/ VGMSmplPos;\r
+       UINT8 Command;\r
+       UINT8 blockType;\r
+       dword/*32*/ blockLen;\r
 \r
        vgmPlay->pbSmplPos += Samples;\r
        VGMPos = vgmPlay->vgmPos;\r
@@ -390,8 +394,8 @@ static void UpdateVGM(VGM_PBK* vgmPlay, sword/**/ Samples)
 \r
 void InitEngine(void)\r
 {\r
-       byte curSFX;\r
-       byte curReg;\r
+       UINT8 curSFX;\r
+       UINT8 curReg;\r
 \r
        memset(oplRegs_Music, 0x00, 0x100);\r
        memset(&vgmPbMusic, 0x00, sizeof(VGM_PBK));\r
@@ -429,7 +433,7 @@ void InitEngine(void)
 \r
 void DeinitEngine(void)\r
 {\r
-       byte curSFX;\r
+       UINT8 curSFX;\r
 \r
        StopPlayback(&vgmPbMusic);\r
        for (curSFX = 0; curSFX < SFX_CHN_COUNT; curSFX ++)\r
@@ -441,7 +445,7 @@ void DeinitEngine(void)
 }\r
 \r
 \r
-byte PlayMusic(VGM_FILE* vgmFile)\r
+UINT8 PlayMusic(VGM_FILE* vgmFile)\r
 {\r
        VGM_PBK* vgmPb = &vgmPbMusic;\r
 \r
@@ -455,7 +459,7 @@ byte PlayMusic(VGM_FILE* vgmFile)
        return 0x00;\r
 }\r
 \r
-byte PlaySFX(VGM_FILE* vgmFile, byte sfxChnID)\r
+UINT8 PlaySFX(VGM_FILE* vgmFile, UINT8 sfxChnID)\r
 {\r
        VGM_PBK* vgmPb;\r
 \r
@@ -474,13 +478,13 @@ byte PlaySFX(VGM_FILE* vgmFile, byte sfxChnID)
        return 0x00;\r
 }\r
 \r
-byte StopMusic(void)\r
+UINT8 StopMusic(void)\r
 {\r
        StopPlayback(&vgmPbMusic);\r
        return 0x00;\r
 }\r
 \r
-byte StopSFX(byte sfxChnID)\r
+UINT8 StopSFX(UINT8 sfxChnID)\r
 {\r
        if (sfxChnID == 0xFF)\r
        {\r
@@ -496,7 +500,7 @@ byte StopSFX(byte sfxChnID)
        return 0x00;\r
 }\r
 \r
-byte PauseMusic(void)\r
+UINT8 PauseMusic(void)\r
 {\r
        if (vgmPbMusic.vgmEnd == 0xFF)\r
                return 0xFF;    // not playing\r
@@ -511,7 +515,7 @@ byte PauseMusic(void)
        return 0x00;\r
 }\r
 \r
-byte ResumeMusic(void)\r
+UINT8 ResumeMusic(void)\r
 {\r
        if (vgmPbMusic.vgmEnd == 0xFF)\r
                return 0xFF;    // not playing\r
@@ -544,7 +548,7 @@ static void StartPlayback(VGM_PBK* vgmPb)
 \r
        if (vgmPb->pbMode == PBMODE_SFX)\r
        {\r
-               byte curReg;\r
+               UINT8 curReg;\r
 \r
                curReg = 0xB0 | vgmPb->oplChnMask;\r
                if (oplRegs_Music[curReg] & 0x20)\r
@@ -563,8 +567,8 @@ static void StopPlayback(VGM_PBK* vgmPb)
 \r
        if (vgmPb->pbMode == PBMODE_MUSIC)\r
        {\r
-               byte curReg;\r
-               sword/**/ chnMask;\r
+               UINT8 curReg;\r
+               UINT16 chnMask;\r
 \r
                chnMask = 0x0001;\r
                for (curReg = 0xB0; curReg < 0xB9; curReg ++, chnMask <<= 1)\r
@@ -588,9 +592,9 @@ static void StopPlayback(VGM_PBK* vgmPb)
        }\r
        else //if (vgmPb->pbMode == PBMODE_SFX)\r
        {\r
-               byte regID;\r
-               byte curReg;\r
-               byte opMask;\r
+               UINT8 regID;\r
+               UINT8 curReg;\r
+               UINT8 opMask;\r
 \r
                curReg = 0xB0 | vgmPb->oplChnMask;\r
                if (vgmPb->oplRegCache[0x0C] & 0x20)\r
@@ -624,10 +628,10 @@ static void StopPlayback(VGM_PBK* vgmPb)
 \r
 \r
 \r
-static void OPL_CachedWrite(VGM_PBK* vgmPb, byte reg, byte data)\r
+static void OPL_CachedWrite(VGM_PBK* vgmPb, UINT8 reg, UINT8 data)\r
 {\r
-       byte regChn;\r
-       byte ramOfs;\r
+       UINT8 regChn;\r
+       UINT8 ramOfs;\r
 \r
        if (vgmPb->pbMode == PBMODE_MUSIC)\r
        {\r
@@ -689,12 +693,12 @@ static void OPL_CachedWrite(VGM_PBK* vgmPb, byte reg, byte data)
 }\r
 \r
 \r
-static void ym2413_write(VGM_PBK* vgmPb, byte reg, byte data)\r
+static void ym2413_write(VGM_PBK* vgmPb, UINT8 reg, UINT8 data)\r
 {\r
        return; // unsupported for now\r
 }\r
 \r
-static void ym3812_write(VGM_PBK* vgmPb, byte reg, byte data)\r
+static void ym3812_write(VGM_PBK* vgmPb, UINT8 reg, UINT8 data)\r
 {\r
        if (reg == 0x01)\r
        {\r
@@ -710,7 +714,7 @@ static void ym3812_write(VGM_PBK* vgmPb, byte reg, byte data)
        return;\r
 }\r
 \r
-static void ym3512_write(VGM_PBK* vgmPb, byte reg, byte data)\r
+static void ym3512_write(VGM_PBK* vgmPb, UINT8 reg, UINT8 data)\r
 {\r
        if ((reg & 0xE0) == 0xE0)\r
        {\r
@@ -728,7 +732,7 @@ static void ym3512_write(VGM_PBK* vgmPb, byte reg, byte data)
        return;\r
 }\r
 \r
-static void ymf262_write(VGM_PBK* vgmPb, byte port, byte reg, byte data)\r
+static void ymf262_write(VGM_PBK* vgmPb, UINT8 port, UINT8 reg, UINT8 data)\r
 {\r
        return; // unsupported for now\r
 }\r
@@ -737,8 +741,8 @@ static void ymf262_write(VGM_PBK* vgmPb, byte port, byte reg, byte data)
 \r
 void UpdateSoundEngine(void)\r
 {\r
-       byte tmrMask;\r
-       byte curSFX;\r
+       UINT8 tmrMask;\r
+       UINT8 curSFX;\r
 \r
        tmrMask = OPL2_ReadStatus();\r
        if (! (tmrMask & 0x40))\r