From 01e6a54bfa71fd6b159146f30c405ca045e5fbdd Mon Sep 17 00:00:00 2001 From: sparky4 Date: Sat, 12 Sep 2015 12:47:41 -0500 Subject: [PATCH] VICTORY IS MINE!!!! WWWW modified: exmmtest.map modified: scroll.map modified: src/lib/vgmsnd/common.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/common.h | 2 +- src/lib/vgmsnd/vgmSnd.c | 162 ++++++++++++++++++++-------------------- src/lib/vgmsnd/vgmSnd.h | 92 +++++++++++------------ vgmtest.exe | Bin 30256 -> 30528 bytes 6 files changed, 132 insertions(+), 132 deletions(-) diff --git a/exmmtest.map b/exmmtest.map index 4378b0f2..436b9573 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 03:14:20 +Created on: 15/09/12 12:47:11 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.02 +Link time: 00:00.01 diff --git a/scroll.map b/scroll.map index 4158d71c..22f0e800 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 03:14:21 +Created on: 15/09/12 12:47:11 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.03 +Link time: 00:00.02 diff --git a/src/lib/vgmsnd/common.h b/src/lib/vgmsnd/common.h index a25a046d..db4a26db 100755 --- a/src/lib/vgmsnd/common.h +++ b/src/lib/vgmsnd/common.h @@ -1,7 +1,7 @@ #ifndef __COMMON_H__ #define __COMMON_H__ -#include "src/lib/vgmsnd/stdtype.h" +//#include "src/lib/vgmsnd/stdtype.h" //#include "src/lib/16_head.h" //#include "src/lib/vgmsnd/stdbool.h" diff --git a/src/lib/vgmsnd/vgmSnd.c b/src/lib/vgmsnd/vgmSnd.c index d501edd0..d5e1cb2f 100755 --- a/src/lib/vgmsnd/vgmSnd.c +++ b/src/lib/vgmsnd/vgmSnd.c @@ -22,54 +22,54 @@ typedef struct _vgm_file_header_base { sdword 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 + 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 } VGM_BASE_HDR; #define PBMODE_MUSIC 0x00 #define PBMODE_SFX 0x01 typedef struct _vgm_playback { - UINT8 pbMode; - UINT8 vgmEnd; // 00 - running, 01 - finished, FF - not loaded - UINT16 curLoopCnt; - UINT32 vgmPos; - UINT32 vgmSmplPos; - UINT32 pbSmplPos; + byte pbMode; + byte vgmEnd; // 00 - running, 01 - finished, FF - not loaded + sword/**/ curLoopCnt; + sdword vgmPos; + sdword vgmSmplPos; + sdword 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) - UINT16 oplChnMask; - UINT8* oplRegCache; - UINT8 workRAM[0x04]; + sword/**/ oplChnMask; + byte* oplRegCache; + byte workRAM[0x04]; } VGM_PBK; -INLINE UINT16 ReadLE16(const UINT8* buffer) +INLINE sword/**/ ReadLE16(const byte* buffer) { #ifdef QUICK_READ - return *(UINT16*)buffer; + return *(sword/**/*)buffer; #else return (buffer[0x00] << 0) | (buffer[0x01] << 8); #endif } -INLINE UINT32 ReadLE32(const UINT8* buffer) +INLINE sdword ReadLE32(const byte* buffer) { #ifdef QUICK_READ - return *(UINT32*)buffer; + return *(sword*)buffer; #else return (buffer[0x00] << 0) | (buffer[0x01] << 8) | (buffer[0x02] << 16) | (buffer[0x03] << 24); @@ -78,35 +78,35 @@ INLINE UINT32 ReadLE32(const UINT8* buffer) // Function Prototypes -//UINT8 OpenVGMFile(const char* FileName, VGM_FILE* vgmFile); +//byte OpenVGMFile(const char* FileName, VGM_FILE* vgmFile); //void FreeVGMFile(VGM_FILE* vgmFile); static boolean DoVgmLoop(VGM_PBK* vgmPlay); -static void UpdateVGM(VGM_PBK* vgmPlay, UINT16 Samples); +static void UpdateVGM(VGM_PBK* vgmPlay, sword/**/ Samples); //void InitEngine(void); //void DeinitEngine(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); +//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); static void StartPlayback(VGM_PBK* vgmPb); static void StopPlayback(VGM_PBK* vgmPb); -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); +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); //void UpdateSoundEngine(void); // Functions that must be supplied by external library -extern void OPL2_Write(UINT8 reg, UINT8 data); -extern UINT8 OPL2_ReadStatus(void); +extern void OPL2_Write(byte reg, byte data); +extern byte OPL2_ReadStatus(void); @@ -119,32 +119,32 @@ extern UINT8 OPL2_ReadStatus(void); static VGM_PBK vgmPbMusic; static VGM_PBK vgmPbSFX[SFX_CHN_COUNT]; -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 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 const UINT8 SFX_REGS[0x0D] = +static const byte SFX_REGS[0x0D] = { 0x20, 0x23, 0x40, 0x43, 0x60, 0x63, 0x80, 0x83, 0xE0, 0xE3, 0xC0, 0xA0, 0xB0}; -static const UINT8 SFX_REGS_REV[0x10] = // 20/30 -> 0, 40/50 -> 2, ... +static const byte 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 UINT8 CHN_OPMASK[0x09] = +static const byte CHN_OPMASK[0x09] = { 0x00, 0x01, 0x02, 0x08, 0x09, 0x0A, 0x10, 0x11, 0x12}; -static const UINT8 CHN_OPMASK_REV[0x20] = +static const byte 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}; -UINT8 OpenVGMFile(const char* FileName, VGM_FILE* vgmFile) +byte 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; - UINT32 CurPos; + sdword CurPos; memset(vgmFile, 0x00, sizeof(VGM_FILE)); @@ -171,7 +171,7 @@ UINT8 OpenVGMFile(const char* FileName, VGM_FILE* vgmFile) } vgmFile->dataLen = vgmBaseHdr.lngEOFOffset + 0x04; - vgmFile->data = (UINT8*)malloc(vgmFile->dataLen); + vgmFile->data = (byte*)malloc(vgmFile->dataLen); if (vgmFile->data == NULL) { fclose(hFile); @@ -206,7 +206,7 @@ UINT8 OpenVGMFile(const char* FileName, VGM_FILE* vgmFile) CurPos = 0x40; hdrSize = sizeof(VGM_HEADER); if (hdrSize > CurPos) - memset((UINT8*)&vgmFile->header + CurPos, 0x00, hdrSize - CurPos); + memset((byte*)&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, UINT16 Samples) +static void UpdateVGM(VGM_PBK* vgmPlay, sword/**/ Samples) { - 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; + 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; vgmPlay->pbSmplPos += Samples; VGMPos = vgmPlay->vgmPos; @@ -390,8 +390,8 @@ static void UpdateVGM(VGM_PBK* vgmPlay, UINT16 Samples) void InitEngine(void) { - UINT8 curSFX; - UINT8 curReg; + byte curSFX; + byte curReg; memset(oplRegs_Music, 0x00, 0x100); memset(&vgmPbMusic, 0x00, sizeof(VGM_PBK)); @@ -429,7 +429,7 @@ void InitEngine(void) void DeinitEngine(void) { - UINT8 curSFX; + byte curSFX; StopPlayback(&vgmPbMusic); for (curSFX = 0; curSFX < SFX_CHN_COUNT; curSFX ++) @@ -441,7 +441,7 @@ void DeinitEngine(void) } -UINT8 PlayMusic(VGM_FILE* vgmFile) +byte PlayMusic(VGM_FILE* vgmFile) { VGM_PBK* vgmPb = &vgmPbMusic; @@ -455,7 +455,7 @@ UINT8 PlayMusic(VGM_FILE* vgmFile) return 0x00; } -UINT8 PlaySFX(VGM_FILE* vgmFile, UINT8 sfxChnID) +byte PlaySFX(VGM_FILE* vgmFile, byte sfxChnID) { VGM_PBK* vgmPb; @@ -474,13 +474,13 @@ UINT8 PlaySFX(VGM_FILE* vgmFile, UINT8 sfxChnID) return 0x00; } -UINT8 StopMusic(void) +byte StopMusic(void) { StopPlayback(&vgmPbMusic); return 0x00; } -UINT8 StopSFX(UINT8 sfxChnID) +byte StopSFX(byte sfxChnID) { if (sfxChnID == 0xFF) { @@ -496,7 +496,7 @@ UINT8 StopSFX(UINT8 sfxChnID) return 0x00; } -UINT8 PauseMusic(void) +byte PauseMusic(void) { if (vgmPbMusic.vgmEnd == 0xFF) return 0xFF; // not playing @@ -511,7 +511,7 @@ UINT8 PauseMusic(void) return 0x00; } -UINT8 ResumeMusic(void) +byte 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) { - UINT8 curReg; + byte 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) { - UINT8 curReg; - UINT16 chnMask; + byte curReg; + sword/**/ 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) { - UINT8 regID; - UINT8 curReg; - UINT8 opMask; + byte regID; + byte curReg; + byte 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, UINT8 reg, UINT8 data) +static void OPL_CachedWrite(VGM_PBK* vgmPb, byte reg, byte data) { - UINT8 regChn; - UINT8 ramOfs; + byte regChn; + byte ramOfs; if (vgmPb->pbMode == PBMODE_MUSIC) { @@ -689,12 +689,12 @@ static void OPL_CachedWrite(VGM_PBK* vgmPb, UINT8 reg, UINT8 data) } -static void ym2413_write(VGM_PBK* vgmPb, UINT8 reg, UINT8 data) +static void ym2413_write(VGM_PBK* vgmPb, byte reg, byte data) { return; // unsupported for now } -static void ym3812_write(VGM_PBK* vgmPb, UINT8 reg, UINT8 data) +static void ym3812_write(VGM_PBK* vgmPb, byte reg, byte data) { if (reg == 0x01) { @@ -710,7 +710,7 @@ static void ym3812_write(VGM_PBK* vgmPb, UINT8 reg, UINT8 data) return; } -static void ym3512_write(VGM_PBK* vgmPb, UINT8 reg, UINT8 data) +static void ym3512_write(VGM_PBK* vgmPb, byte reg, byte data) { if ((reg & 0xE0) == 0xE0) { @@ -728,7 +728,7 @@ static void ym3512_write(VGM_PBK* vgmPb, UINT8 reg, UINT8 data) return; } -static void ymf262_write(VGM_PBK* vgmPb, UINT8 port, UINT8 reg, UINT8 data) +static void ymf262_write(VGM_PBK* vgmPb, byte port, byte reg, byte data) { return; // unsupported for now } @@ -737,8 +737,8 @@ static void ymf262_write(VGM_PBK* vgmPb, UINT8 port, UINT8 reg, UINT8 data) void UpdateSoundEngine(void) { - UINT8 tmrMask; - UINT8 curSFX; + byte tmrMask; + byte curSFX; tmrMask = OPL2_ReadStatus(); if (! (tmrMask & 0x40)) diff --git a/src/lib/vgmsnd/vgmSnd.h b/src/lib/vgmsnd/vgmSnd.h index 0a886bc8..f48e2371 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; - 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; + 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; } VGM_HEADER; typedef struct _vgm_file { - UINT32 dataLen; - UINT8* data; + sdword dataLen; + byte* data; VGM_HEADER header; } VGM_FILE; -UINT8 OpenVGMFile(const char* FileName, VGM_FILE* vgmFile); +byte OpenVGMFile(const char* FileName, VGM_FILE* vgmFile); void FreeVGMFile(VGM_FILE* vgmFile); void InitEngine(void); void DeinitEngine(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); +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); void UpdateSoundEngine(void); // Functions that must be supplied by external library: -extern void OPL2_Write(UINT8 reg, UINT8 data); -extern UINT8 OPL2_ReadStatus(void); +extern void OPL2_Write(byte reg, byte data); +extern byte OPL2_ReadStatus(void); #ifdef __cplusplus diff --git a/vgmtest.exe b/vgmtest.exe index 0bd222da541545abf223a37d0126ac61338c694d..cec5f8c7d7746591ea3c87edc4ae00c17efb80a9 100755 GIT binary patch delta 9322 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 q$X3-maz7okc-~`FnPW> zE%xVWHtc!yo?7e75kDefp+tFYsUA)Ri*7THPCr$IIFmii70Nrj*Hrd78M{M_n? zF)3}PyD;#_mS_5l0@-3&$5#k_`LC8QMnBAo$w+6c5Pj9KVupANZN+R3%N`}EZZ+e? z)S;_oXjZ*KjDmh#F%jvt730H1nW8nz*)DjC?+})w9@SD-euE0;rqiZqNiyf;KSH z?iD zeHNI(=U@}~0=xm<0zZKt!EtbFo8Ld1|EI$LT6S(&*h&1J2I9<|1tYWY3!Z=9!T<6u zYX5&~@c&%j{Kw80qXQj?0w?en>_%_}PQn1}pyXR~x90NOOjBUGZKg;~ wm?6vnbB%2jjh5Om73s_~v&Ebt{O>Fzw){ac)rfT{dWQIXpAKp0Z~27$Cu*Bh1ONa4 delta 9113 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