From 3905085894af7601c6c590f051dc20ca3db08bd9 Mon Sep 17 00:00:00 2001 From: sparky4 Date: Sat, 12 Sep 2015 15:21:09 -0500 Subject: [PATCH] reverted it back to valley's version www modified: exmmtest.map modified: scroll.map modified: src/lib/vgmsnd/stdtype.h modified: src/lib/vgmsnd/vgmSnd.c modified: src/lib/vgmsnd/vgmSnd.h modified: vgmtest.exe --- exmmtest.map | 4 +- scroll.map | 4 +- src/lib/vgmsnd/stdtype.h | 4 +- src/lib/vgmsnd/vgmSnd.c | 164 +++++++++++++++++++-------------------- src/lib/vgmsnd/vgmSnd.h | 94 +++++++++++----------- vgmtest.exe | Bin 30570 -> 29754 bytes 6 files changed, 135 insertions(+), 135 deletions(-) diff --git a/exmmtest.map b/exmmtest.map index 436b9573..8b0da36c 100755 --- a/exmmtest.map +++ b/exmmtest.map @@ -1,6 +1,6 @@ Open Watcom Linker Version 1.9 Portions Copyright (c) 1985-2002 Sybase, Inc. All Rights Reserved. -Created on: 15/09/12 12:47:11 +Created on: 15/09/12 15:21:02 Executable Image: exmmtest.exe creating a DOS executable @@ -495,4 +495,4 @@ Module: /usr/watcom/lib286/dos/clibc.lib(clearenv.c) Stack size: 8000 (32768.) Memory size: 00011e70 (73328.) Entry point address: 0000:47f4 -Link time: 00:00.01 +Link time: 00:00.00 diff --git a/scroll.map b/scroll.map index 22f0e800..e800b3d1 100755 --- a/scroll.map +++ b/scroll.map @@ -1,6 +1,6 @@ Open Watcom Linker Version 1.9 Portions Copyright (c) 1985-2002 Sybase, Inc. All Rights Reserved. -Created on: 15/09/12 12:47:11 +Created on: 15/09/12 15:21:02 Executable Image: scroll.exe creating a DOS executable @@ -600,4 +600,4 @@ Module: /usr/watcom/lib286/dos/clibc.lib(hugeval.c) Stack size: 8000 (32768.) Memory size: 000164b0 (91312.) Entry point address: 0000:5fe4 -Link time: 00:00.02 +Link time: 00:00.01 diff --git a/src/lib/vgmsnd/stdtype.h b/src/lib/vgmsnd/stdtype.h index b0b55606..7672109d 100755 --- a/src/lib/vgmsnd/stdtype.h +++ b/src/lib/vgmsnd/stdtype.h @@ -9,8 +9,8 @@ typedef uint8_t UINT8; typedef int8_t INT8; typedef uint16_t UINT16; typedef int16_t INT16; -typedef uint32_t UINT32; -typedef int32_t INT32; +typedef signed long UINT32; +typedef unsigned long INT32; typedef uint64_t UINT64; typedef int64_t INT64; diff --git a/src/lib/vgmsnd/vgmSnd.c b/src/lib/vgmsnd/vgmSnd.c index d5e1cb2f..508f4609 100755 --- a/src/lib/vgmsnd/vgmSnd.c +++ b/src/lib/vgmsnd/vgmSnd.c @@ -21,55 +21,55 @@ typedef struct _vgm_file_header_base { - sdword fccVGM; // 00 - sdword lngEOFOffset; // 04 - sdword lngVersion; // 08 - sdword lngSkip1[2]; // 0C - sdword lngGD3Offset; // 14 - sdword lngTotalSamples; // 18 - sdword lngLoopOffset; // 1C - sdword lngLoopSamples; // 20 - sdword lngRate; // 24 - sdword lngSkip2[3]; // 28 - sdword lngDataOffset; // 34 - sdword lngSkip3[2]; // 38 + UINT32 fccVGM; // 00 + UINT32 lngEOFOffset; // 04 + UINT32 lngVersion; // 08 + UINT32 lngSkip1[2]; // 0C + UINT32 lngGD3Offset; // 14 + UINT32 lngTotalSamples; // 18 + UINT32 lngLoopOffset; // 1C + UINT32 lngLoopSamples; // 20 + UINT32 lngRate; // 24 + UINT32 lngSkip2[3]; // 28 + UINT32 lngDataOffset; // 34 + UINT32 lngSkip3[2]; // 38 } VGM_BASE_HDR; #define PBMODE_MUSIC 0x00 #define PBMODE_SFX 0x01 typedef struct _vgm_playback { - byte pbMode; - byte vgmEnd; // 00 - running, 01 - finished, FF - not loaded - sword/**/ curLoopCnt; - sdword vgmPos; - sdword vgmSmplPos; - sdword pbSmplPos; + UINT8 pbMode; + UINT8 vgmEnd; // 00 - running, 01 - finished, FF - not loaded + UINT16 curLoopCnt; + UINT32 vgmPos; + UINT32 vgmSmplPos; + UINT32 pbSmplPos; VGM_FILE* file; // oplChnMask: // Music: mask of channels used/overridden by SFX // SFX: ID of channel used by SFX (all commands are forces to it) - sword/**/ oplChnMask; - byte* oplRegCache; - byte workRAM[0x04]; + UINT16 oplChnMask; + UINT8* oplRegCache; + UINT8 workRAM[0x04]; } VGM_PBK; -INLINE sword/**/ ReadLE16(const byte* buffer) +INLINE UINT16 ReadLE16(const UINT8* buffer) { #ifdef QUICK_READ - return *(sword/**/*)buffer; + return *(UINT16*)buffer; #else return (buffer[0x00] << 0) | (buffer[0x01] << 8); #endif } -INLINE sdword ReadLE32(const byte* buffer) +INLINE UINT32 ReadLE32(const UINT8* buffer) { #ifdef QUICK_READ - return *(sword*)buffer; + return *(UINT32*)buffer; #else return (buffer[0x00] << 0) | (buffer[0x01] << 8) | (buffer[0x02] << 16) | (buffer[0x03] << 24); @@ -78,35 +78,35 @@ INLINE sdword ReadLE32(const byte* buffer) // Function Prototypes -//byte OpenVGMFile(const char* FileName, VGM_FILE* vgmFile); +//UINT8 OpenVGMFile(const char* FileName, VGM_FILE* vgmFile); //void FreeVGMFile(VGM_FILE* vgmFile); static boolean DoVgmLoop(VGM_PBK* vgmPlay); -static void UpdateVGM(VGM_PBK* vgmPlay, sword/**/ Samples); +static void UpdateVGM(VGM_PBK* vgmPlay, UINT16 Samples); //void InitEngine(void); //void DeinitEngine(void); -//byte PlayMusic(VGM_FILE* vgmFile); -//byte PlaySFX(VGM_FILE* vgmFile, byte sfxChnID); -//byte StopMusic(void); -//byte StopSFX(byte sfxChnID); // Note: sfxChnID == 0xFF -> stop all SFX -//byte PauseMusic(void); -//byte ResumeMusic(void); +//UINT8 PlayMusic(VGM_FILE* vgmFile); +//UINT8 PlaySFX(VGM_FILE* vgmFile, UINT8 sfxChnID); +//UINT8 StopMusic(void); +//UINT8 StopSFX(UINT8 sfxChnID); // Note: sfxChnID == 0xFF -> stop all SFX +//UINT8 PauseMusic(void); +//UINT8 ResumeMusic(void); static void StartPlayback(VGM_PBK* vgmPb); static void StopPlayback(VGM_PBK* vgmPb); -static void ym2413_write(VGM_PBK* vgmPb, byte reg, byte data); -static void ym3812_write(VGM_PBK* vgmPb, byte reg, byte data); -static void ym3512_write(VGM_PBK* vgmPb, byte reg, byte data); -static void ymf262_write(VGM_PBK* vgmPb, byte port, byte reg, byte data); +static void ym2413_write(VGM_PBK* vgmPb, UINT8 reg, UINT8 data); +static void ym3812_write(VGM_PBK* vgmPb, UINT8 reg, UINT8 data); +static void ym3512_write(VGM_PBK* vgmPb, UINT8 reg, UINT8 data); +static void ymf262_write(VGM_PBK* vgmPb, UINT8 port, UINT8 reg, UINT8 data); //void UpdateSoundEngine(void); // Functions that must be supplied by external library -extern void OPL2_Write(byte reg, byte data); -extern byte OPL2_ReadStatus(void); +extern void OPL2_Write(UINT8 reg, UINT8 data); +extern UINT8 OPL2_ReadStatus(void); @@ -119,32 +119,32 @@ extern byte OPL2_ReadStatus(void); static VGM_PBK vgmPbMusic; static VGM_PBK vgmPbSFX[SFX_CHN_COUNT]; -static byte oplRegs_Music[0x100]; -static byte oplRegs_SFX[SFX_CHN_COUNT][0x0D]; // 20 23 40 43 60 63 80 83 E0 E3 C0 A0 B0 +static UINT8 oplRegs_Music[0x100]; +static UINT8 oplRegs_SFX[SFX_CHN_COUNT][0x0D]; // 20 23 40 43 60 63 80 83 E0 E3 C0 A0 B0 -static const byte SFX_REGS[0x0D] = +static const UINT8 SFX_REGS[0x0D] = { 0x20, 0x23, 0x40, 0x43, 0x60, 0x63, 0x80, 0x83, 0xE0, 0xE3, 0xC0, 0xA0, 0xB0}; -static const byte SFX_REGS_REV[0x10] = // 20/30 -> 0, 40/50 -> 2, ... +static const UINT8 SFX_REGS_REV[0x10] = // 20/30 -> 0, 40/50 -> 2, ... { 0xFF, 0xFF, 0x00, 0x00, 0x02, 0x02, 0x04, 0x04, 0x06, 0x06, 0x0B, 0x0C, 0x0A, 0xFF, 0x08, 0x08}; -static const byte CHN_OPMASK[0x09] = +static const UINT8 CHN_OPMASK[0x09] = { 0x00, 0x01, 0x02, 0x08, 0x09, 0x0A, 0x10, 0x11, 0x12}; -static const byte CHN_OPMASK_REV[0x20] = +static const UINT8 CHN_OPMASK_REV[0x20] = { 0x00, 0x01, 0x02, 0x80, 0x81, 0x82, 0xFF, 0xFF, 0x03, 0x04, 0x05, 0x83, 0x84, 0x85, 0xFF, 0xFF, 0x06, 0x07, 0x08, 0x86, 0x87, 0x88, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; -byte OpenVGMFile(const char* FileName, VGM_FILE* vgmFile) +UINT8 OpenVGMFile(const char* FileName, VGM_FILE* vgmFile) { size_t hdrSize; size_t readEl; // 'elements' read from file size_t bytesToRead; VGM_BASE_HDR vgmBaseHdr; FILE* hFile; - sdword CurPos; + UINT32 CurPos; memset(vgmFile, 0x00, sizeof(VGM_FILE)); @@ -171,7 +171,7 @@ byte OpenVGMFile(const char* FileName, VGM_FILE* vgmFile) } vgmFile->dataLen = vgmBaseHdr.lngEOFOffset + 0x04; - vgmFile->data = (byte*)malloc(vgmFile->dataLen); + vgmFile->data = (UINT8*)malloc(vgmFile->dataLen); if (vgmFile->data == NULL) { fclose(hFile); @@ -206,7 +206,7 @@ byte OpenVGMFile(const char* FileName, VGM_FILE* vgmFile) CurPos = 0x40; hdrSize = sizeof(VGM_HEADER); if (hdrSize > CurPos) - memset((byte*)&vgmFile->header + CurPos, 0x00, hdrSize - CurPos); + memset((UINT8*)&vgmFile->header + CurPos, 0x00, hdrSize - CurPos); fclose(hFile); return 0x00; @@ -237,16 +237,16 @@ static boolean DoVgmLoop(VGM_PBK* vgmPlay) return true; } -static void UpdateVGM(VGM_PBK* vgmPlay, sword/**/ Samples) +static void UpdateVGM(VGM_PBK* vgmPlay, UINT16 Samples) { - const sdword vgmLen = vgmPlay->file->dataLen; - const byte* vgmData = vgmPlay->file->data; - const byte* VGMPnt; - sdword VGMPos; - sdword VGMSmplPos; - byte Command; - byte blockType; - sdword blockLen; + const UINT32 vgmLen = vgmPlay->file->dataLen; + const UINT8* vgmData = vgmPlay->file->data; + const UINT8* VGMPnt; + UINT32 VGMPos; + UINT32 VGMSmplPos; + UINT8 Command; + UINT8 blockType; + UINT32 blockLen; vgmPlay->pbSmplPos += Samples; VGMPos = vgmPlay->vgmPos; @@ -390,8 +390,8 @@ static void UpdateVGM(VGM_PBK* vgmPlay, sword/**/ Samples) void InitEngine(void) { - byte curSFX; - byte curReg; + UINT8 curSFX; + UINT8 curReg; memset(oplRegs_Music, 0x00, 0x100); memset(&vgmPbMusic, 0x00, sizeof(VGM_PBK)); @@ -429,7 +429,7 @@ void InitEngine(void) void DeinitEngine(void) { - byte curSFX; + UINT8 curSFX; StopPlayback(&vgmPbMusic); for (curSFX = 0; curSFX < SFX_CHN_COUNT; curSFX ++) @@ -441,7 +441,7 @@ void DeinitEngine(void) } -byte PlayMusic(VGM_FILE* vgmFile) +UINT8 PlayMusic(VGM_FILE* vgmFile) { VGM_PBK* vgmPb = &vgmPbMusic; @@ -455,7 +455,7 @@ byte PlayMusic(VGM_FILE* vgmFile) return 0x00; } -byte PlaySFX(VGM_FILE* vgmFile, byte sfxChnID) +UINT8 PlaySFX(VGM_FILE* vgmFile, UINT8 sfxChnID) { VGM_PBK* vgmPb; @@ -474,13 +474,13 @@ byte PlaySFX(VGM_FILE* vgmFile, byte sfxChnID) return 0x00; } -byte StopMusic(void) +UINT8 StopMusic(void) { StopPlayback(&vgmPbMusic); return 0x00; } -byte StopSFX(byte sfxChnID) +UINT8 StopSFX(UINT8 sfxChnID) { if (sfxChnID == 0xFF) { @@ -496,7 +496,7 @@ byte StopSFX(byte sfxChnID) return 0x00; } -byte PauseMusic(void) +UINT8 PauseMusic(void) { if (vgmPbMusic.vgmEnd == 0xFF) return 0xFF; // not playing @@ -511,7 +511,7 @@ byte PauseMusic(void) return 0x00; } -byte ResumeMusic(void) +UINT8 ResumeMusic(void) { if (vgmPbMusic.vgmEnd == 0xFF) return 0xFF; // not playing @@ -544,7 +544,7 @@ static void StartPlayback(VGM_PBK* vgmPb) if (vgmPb->pbMode == PBMODE_SFX) { - byte curReg; + UINT8 curReg; curReg = 0xB0 | vgmPb->oplChnMask; if (oplRegs_Music[curReg] & 0x20) @@ -563,8 +563,8 @@ static void StopPlayback(VGM_PBK* vgmPb) if (vgmPb->pbMode == PBMODE_MUSIC) { - byte curReg; - sword/**/ chnMask; + UINT8 curReg; + UINT16 chnMask; chnMask = 0x0001; for (curReg = 0xB0; curReg < 0xB9; curReg ++, chnMask <<= 1) @@ -588,9 +588,9 @@ static void StopPlayback(VGM_PBK* vgmPb) } else //if (vgmPb->pbMode == PBMODE_SFX) { - byte regID; - byte curReg; - byte opMask; + UINT8 regID; + UINT8 curReg; + UINT8 opMask; curReg = 0xB0 | vgmPb->oplChnMask; if (vgmPb->oplRegCache[0x0C] & 0x20) @@ -624,10 +624,10 @@ static void StopPlayback(VGM_PBK* vgmPb) -static void OPL_CachedWrite(VGM_PBK* vgmPb, byte reg, byte data) +static void OPL_CachedWrite(VGM_PBK* vgmPb, UINT8 reg, UINT8 data) { - byte regChn; - byte ramOfs; + UINT8 regChn; + UINT8 ramOfs; if (vgmPb->pbMode == PBMODE_MUSIC) { @@ -689,12 +689,12 @@ static void OPL_CachedWrite(VGM_PBK* vgmPb, byte reg, byte data) } -static void ym2413_write(VGM_PBK* vgmPb, byte reg, byte data) +static void ym2413_write(VGM_PBK* vgmPb, UINT8 reg, UINT8 data) { return; // unsupported for now } -static void ym3812_write(VGM_PBK* vgmPb, byte reg, byte data) +static void ym3812_write(VGM_PBK* vgmPb, UINT8 reg, UINT8 data) { if (reg == 0x01) { @@ -710,7 +710,7 @@ static void ym3812_write(VGM_PBK* vgmPb, byte reg, byte data) return; } -static void ym3512_write(VGM_PBK* vgmPb, byte reg, byte data) +static void ym3512_write(VGM_PBK* vgmPb, UINT8 reg, UINT8 data) { if ((reg & 0xE0) == 0xE0) { @@ -728,7 +728,7 @@ static void ym3512_write(VGM_PBK* vgmPb, byte reg, byte data) return; } -static void ymf262_write(VGM_PBK* vgmPb, byte port, byte reg, byte data) +static void ymf262_write(VGM_PBK* vgmPb, UINT8 port, UINT8 reg, UINT8 data) { return; // unsupported for now } @@ -737,8 +737,8 @@ static void ymf262_write(VGM_PBK* vgmPb, byte port, byte reg, byte data) void UpdateSoundEngine(void) { - byte tmrMask; - byte curSFX; + UINT8 tmrMask; + UINT8 curSFX; tmrMask = OPL2_ReadStatus(); if (! (tmrMask & 0x40)) diff --git a/src/lib/vgmsnd/vgmSnd.h b/src/lib/vgmsnd/vgmSnd.h index f48e2371..e351054c 100755 --- a/src/lib/vgmsnd/vgmSnd.h +++ b/src/lib/vgmsnd/vgmSnd.h @@ -6,75 +6,75 @@ extern "C" { #endif -//#include "src/lib/vgmsnd/stdtype.h" +#include "src/lib/vgmsnd/stdtype.h" #include "src/lib/16_head.h" typedef struct _vgm_file_header { - sdword fccVGM; - sdword lngEOFOffset; - sdword lngVersion; - sdword lngHzPSG; - sdword lngHzYM2413; - sdword lngGD3Offset; - sdword lngTotalSamples; - sdword lngLoopOffset; - sdword lngLoopSamples; - sdword lngRate; - byte bytPSGCfg[4]; - sdword lngHzYM2612; - sdword lngHzYM2151; - sdword lngDataOffset; - sdword lngHzSPCM; - sdword lngSPCMIntf; - sdword lngHzRF5C68; - sdword lngHzYM2203; - sdword lngHzYM2608; - sdword lngHzYM2610; - sdword lngHzYM3812; - sdword lngHzYM3526; - sdword lngHzY8950; - sdword lngHzYMF262; - sdword lngHzYMF278B; - sdword lngHzYMF271; - sdword lngHzYMZ280B; - sdword lngHzRF5C164; - sdword lngHzPWM; - sdword lngHzAY8910; - byte bytAYCfg[4]; - byte bytVolumeModifier; - byte bytReserved2; - char bytLoopBase; - byte bytLoopModifier; + UINT32 fccVGM; + UINT32 lngEOFOffset; + UINT32 lngVersion; + UINT32 lngHzPSG; + UINT32 lngHzYM2413; + UINT32 lngGD3Offset; + UINT32 lngTotalSamples; + UINT32 lngLoopOffset; + UINT32 lngLoopSamples; + UINT32 lngRate; + UINT8 bytPSGCfg[4]; + UINT32 lngHzYM2612; + UINT32 lngHzYM2151; + UINT32 lngDataOffset; + UINT32 lngHzSPCM; + UINT32 lngSPCMIntf; + UINT32 lngHzRF5C68; + UINT32 lngHzYM2203; + UINT32 lngHzYM2608; + UINT32 lngHzYM2610; + UINT32 lngHzYM3812; + UINT32 lngHzYM3526; + UINT32 lngHzY8950; + UINT32 lngHzYMF262; + UINT32 lngHzYMF278B; + UINT32 lngHzYMF271; + UINT32 lngHzYMZ280B; + UINT32 lngHzRF5C164; + UINT32 lngHzPWM; + UINT32 lngHzAY8910; + UINT8 bytAYCfg[4]; + UINT8 bytVolumeModifier; + UINT8 bytReserved2; + INT8 bytLoopBase; + UINT8 bytLoopModifier; } VGM_HEADER; typedef struct _vgm_file { - sdword dataLen; - byte* data; + UINT32 dataLen; + UINT8* data; VGM_HEADER header; } VGM_FILE; -byte OpenVGMFile(const char* FileName, VGM_FILE* vgmFile); +UINT8 OpenVGMFile(const char* FileName, VGM_FILE* vgmFile); void FreeVGMFile(VGM_FILE* vgmFile); void InitEngine(void); void DeinitEngine(void); -byte PlayMusic(VGM_FILE* vgmFile); -byte PlaySFX(VGM_FILE* vgmFile, byte sfxChnID); -byte StopMusic(void); -byte StopSFX(byte sfxChnID); -byte PauseMusic(void); -byte ResumeMusic(void); +UINT8 PlayMusic(VGM_FILE* vgmFile); +UINT8 PlaySFX(VGM_FILE* vgmFile, UINT8 sfxChnID); +UINT8 StopMusic(void); +UINT8 StopSFX(UINT8 sfxChnID); +UINT8 PauseMusic(void); +UINT8 ResumeMusic(void); void UpdateSoundEngine(void); // Functions that must be supplied by external library: -extern void OPL2_Write(byte reg, byte data); -extern byte OPL2_ReadStatus(void); +//extern void OPL2_Write(UINT8 reg, UINT8 data); +//extern UINT8 OPL2_ReadStatus(void); #ifdef __cplusplus diff --git a/vgmtest.exe b/vgmtest.exe index 4638ff72f245e687dc194f49abbd82e103d4ff31..073e1cbedc17b021a9247b51cd8b73dad220cd53 100755 GIT binary patch delta 8816 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 -- 2.39.2