some KidVid refactoring

This commit is contained in:
Thomas Jentzsch 2022-09-02 08:18:55 +02:00
parent 74c0613147
commit d0fad1091a
2 changed files with 72 additions and 107 deletions

View File

@ -29,9 +29,9 @@ KidVid::KidVid(Jack jack, const Event& event, const System& system,
{
// Right now, there are only two games that use the KidVid
if(romMd5 == "ee6665683ebdb539e89ba620981cb0f6")
myGame = KVBBEARS; // Berenstain Bears
myGame = BBears; // Berenstain Bears
else if(romMd5 == "a204cd4fb1944c86e800120706512a64")
myGame = KVSMURFS; // Smurfs Save the Day
myGame = Smurfs; // Smurfs Save the Day
else
myEnabled = false;
}
@ -39,7 +39,7 @@ KidVid::KidVid(Jack jack, const Event& event, const System& system,
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KidVid::~KidVid()
{
closeSampleFile();
closeSampleFiles();
}
@ -68,75 +68,55 @@ void KidVid::update()
if(myEvent.get(Event::ConsoleReset))
{
myTape = 0; // rewind Kid Vid tape
closeSampleFile();
closeSampleFiles();
}
if(!myTape)
{
if(myEvent.get(Event::RightKeyboard1))
{
myTape = 2;
myIdx = myGame == KVBBEARS ? KVBLOCKBITS : 0;
myBlockIdx = KVBLOCKBITS;
myBlock = 0;
openSampleFile();
//cerr << "myTape = " << myTape << endl;
}
else if(myEvent.get(Event::RightKeyboard2))
{
myTape = 3;
myIdx = myGame == KVBBEARS ? KVBLOCKBITS : 0;
myBlockIdx = KVBLOCKBITS;
myBlock = 0;
openSampleFile();
//cerr << "myTape = " << myTape << endl;
}
else if(myEvent.get(Event::RightKeyboard3))
myTape = myGame == BBears ? 4 : 1; // Berenstain Bears or Smurfs Save The Day?
if(myTape)
{
if(myGame == KVBBEARS) /* Berenstain Bears ? */
{
myTape = 4;
myIdx = KVBLOCKBITS;
//cerr << "myTape = " << myTape << endl;
}
else /* no, Smurf Save The Day */
{
myTape = 1;
myIdx = 0;
//cerr << "myTape = " << myTape << endl;
}
myBlockIdx = KVBLOCKBITS;
//cerr << "myTape = " << myTape << endl;0
myIdx = myGame == BBears ? BlockBits : 0;
myBlockIdx = BlockBits;
myBlock = 0;
openSampleFile();
openSampleFiles();
}
}
// Is the tape running?
if(myTape != 0 && getPin(DigitalPin::One) && !myTapeBusy)
if(myTape && getPin(DigitalPin::One) && !myTapeBusy)
{
setPin(DigitalPin::Four, (ourKVData[myIdx >> 3] << (myIdx & 0x07)) & 0x80);
setPin(DigitalPin::Four, (ourData[myIdx >> 3] << (myIdx & 0x07)) & 0x80);
// increase to next bit
++myIdx;
--myBlockIdx;
// increase to next block (byte)
if(myBlockIdx == 0)
if(!myBlockIdx)
{
if(myBlock == 0)
myIdx = ((myTape * 6) + 12 - KVBLOCKS) * 8; //KVData00-KVData=12
if(!myBlock)
myIdx = ((myTape * 6) + 12 - Blocks) * 8; //KVData00-KVData=12
else
{
if(myGame == KVSMURFS)
if(myGame == Smurfs)
{
if(myBlock >= ourKVBlocks[myTape - 1])
if(myBlock >= ourBlocks[myTape - 1])
myIdx = 42 * 8; //KVData80-KVData=42
else
{
myIdx = 36 * 8;//KVPause-KVData=36
//cerr << endl << "Auto ";
setNextSong();
}
}
else
{
if(myBlock >= ourKVBlocks[myTape + 2 - 1])
if(myBlock >= ourBlocks[myTape + 2 - 1])
myIdx = 42 * 8; //KVData80-KVData=42
else
{
@ -146,7 +126,7 @@ void KidVid::update()
}
}
++myBlock;
myBlockIdx = KVBLOCKBITS;
myBlockIdx = BlockBits;
}
}
// emulate playing the songs (but MUCH faster!)
@ -156,61 +136,57 @@ void KidVid::update()
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void KidVid::openSampleFile()
void KidVid::openSampleFiles()
{
#ifdef KID_TAPE
static const char* const kvNameTable[6] = {
"kvs3.wav", "kvs1.wav", "kvs2.wav", "kvb3.wav", "kvb1.wav", "kvb2.wav"
static constexpr char* const fileNames[6] = {
"kvs3.wav", "kvs1.wav", "kvs2.wav",
"kvb3.wav", "kvb1.wav", "kvb2.wav"
};
static uInt32 StartSong[6] = {
44+38, 0, 44, 44+38+42+62+80, 44+38+42, 44+38+42+62
static constexpr uInt32 startSong[6] = {
44 + 38,
0,
44,
44 + 38 + 42 + 62 + 80,
44 + 38 + 42,
44 + 38 + 42 + 62
};
if(!myEnabled)
return;
if(!myFileOpened)
if(!myFilesOpened)
{
int i = myGame == KVSMURFS ? 0 : 3;
i += myTape - 1;
if(myTape == 4) i -= 3;
int i = myGame == Smurfs ? myTape - 1 : myTape + 2;
if(myTape == 4) i = 3;
mySampleFile = fopen((myBaseDir + kvNameTable[i]).c_str(), "rb");
mySampleFile = fopen((myBaseDir + fileNames[i]).c_str(), "rb");
if(mySampleFile != nullptr)
{
cerr << "opened file: " << kvNameTable[i] << endl;
cerr << "opened file: " << fileNames[i] << endl;
mySharedSampleFile = fopen((myBaseDir + "kvshared.wav").c_str(), "rb");
if(mySharedSampleFile == nullptr)
{
fclose(mySampleFile);
myFileOpened = false;
}
else
{
cerr << "opened file: " << "kvshared.wav" << endl;
fseek(mySampleFile, 45, SEEK_SET);
myFileOpened = true;
myFilesOpened = true;
}
}
else
myFileOpened = false;
mySongCounter = 0;
myTapeBusy = false;
myFilePointer = StartSong[i];
myFilePointer = startSong[i];
}
#endif
myTapeBusy = false;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void KidVid::closeSampleFile()
void KidVid::closeSampleFiles()
{
#ifdef KID_TAPE
if(myFileOpened)
if(myFilesOpened)
{
fclose(mySampleFile);
fclose(mySharedSampleFile);
myFileOpened = false;
myFilesOpened = false;
}
#endif
}
@ -219,19 +195,16 @@ void KidVid::closeSampleFile()
void KidVid::setNextSong()
{
#ifdef KID_TAPE
if(myFileOpened)
if(myFilesOpened)
{
cerr << endl << std::dec << mySongCounter << ", " << myFilePointer << endl;
//cerr << endl << std::dec << mySongCounter << ", " << myFilePointer << endl;
myBeep = (ourSongPositions[myFilePointer] & 0x80) == 0;
const uInt8 temp = ourSongPositions[myFilePointer] & 0x7f;
mySharedData = (temp < 10);
mySongCounter = ourSongStart[temp+1] - ourSongStart[temp];
if(mySharedData)
fseek(mySharedSampleFile, ourSongStart[temp], SEEK_SET);
else
fseek(mySampleFile, ourSongStart[temp], SEEK_SET);
fseek(mySharedData ? mySharedSampleFile : mySampleFile, ourSongStart[temp], SEEK_SET);
++myFilePointer;
myTapeBusy = true;
@ -248,7 +221,7 @@ void KidVid::setNextSong()
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void KidVid::getNextSampleByte()
{
static int oddeven = 0;
static bool oddeven = false;
if(mySongCounter == 0)
{
@ -258,22 +231,14 @@ void KidVid::getNextSampleByte()
}
else
{
oddeven = oddeven^1;
if(oddeven & 1)
oddeven = !oddeven;
if(oddeven)
{
mySongCounter--;
myTapeBusy = (mySongCounter > 262 * 48) || !myBeep;
#ifdef KID_TAPE
if(myFileOpened)
{
if(mySharedData)
mySampleByte = getc(mySharedSampleFile);
else
mySampleByte = getc(mySampleFile);
}
else
mySampleByte = 0x80;
mySampleByte = myFilesOpened ? getc(mySharedData ? mySharedSampleFile : mySampleFile) : 0x80;
#endif
if(!myBeep && (mySongCounter == 0))
@ -283,13 +248,13 @@ void KidVid::getNextSampleByte()
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
const std::array<uInt8, KidVid::KVBLOCKS> KidVid::ourKVBlocks = {
const std::array<uInt8, KidVid::Blocks> KidVid::ourBlocks = {
2+40, 2+21, 2+35, /* Smurfs tapes 3, 1, 2 */
42+60, 42+78, 42+60 /* BBears tapes 1, 2, 3 (40 extra blocks for intro) */
};
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
const std::array<uInt8, KidVid::KVBLOCKBITS> KidVid::ourKVData = {
const std::array<uInt8, KidVid::BlockBits> KidVid::ourData = {
/* KVData44 */
0x7b, // 0111 1011b ; (1)0
0x1e, // 0001 1110b ; 1
@ -356,7 +321,7 @@ const std::array<uInt8, KidVid::KVBLOCKBITS> KidVid::ourKVData = {
};
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
const std::array<uInt8, KidVid::SONG_POS_SIZE> KidVid::ourSongPositions = {
const std::array<uInt8, KidVid::SongPosSize> KidVid::ourSongPositions = {
/* kvs1 44 */
11, 12+0x80, 13+0x80, 14, 15+0x80, 16, 8+0x80, 17, 18+0x80, 19, 20+0x80,
21, 8+0x80, 22, 15+0x80, 23, 18+0x80, 14, 20+0x80, 16, 18+0x80,
@ -392,7 +357,7 @@ const std::array<uInt8, KidVid::SONG_POS_SIZE> KidVid::ourSongPositions = {
};
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
const std::array<uInt32, KidVid::SONG_START_SIZE> KidVid::ourSongStart = {
const std::array<uInt32, KidVid::SongStartSize> KidVid::ourSongStart = {
/* kvshared */
44, /* Welcome + intro Berenstain Bears */
980829, /* boulders in the road */

View File

@ -77,8 +77,8 @@ class KidVid : public Controller
private:
// Open/close a WAV sample file
void openSampleFile();
void closeSampleFile();
void openSampleFiles();
void closeSampleFiles();
// Jump to next song in the sequence
void setNextSong();
@ -89,12 +89,12 @@ class KidVid : public Controller
private:
static constexpr uInt32
KVSMURFS = 0x44,
KVBBEARS = 0x48,
KVBLOCKS = 6, // number of bytes / block
KVBLOCKBITS = KVBLOCKS*8, // number of bits / block
SONG_POS_SIZE = 44+38+42+62+80+62,
SONG_START_SIZE = 104
Smurfs = 0x44,
BBears = 0x48,
Blocks = 6, // number of bytes / block
BlockBits = Blocks*8, // number of bits / block
SongPosSize = 44+38+42+62+80+62,
SongStartSize = 104
;
// Whether the KidVid device is enabled (only for games that it
@ -106,7 +106,7 @@ class KidVid : public Controller
// The file handles for the WAV files
FILE *mySampleFile{nullptr}, *mySharedSampleFile{nullptr};
// Indicates if sample files have been successfully opened
bool myFileOpened{false};
bool myFilesOpened{false};
uInt32 myFilePointer{0};
bool mySharedData{false};
@ -122,11 +122,11 @@ class KidVid : public Controller
uInt32 myIdx{0}, myBlock{0}, myBlockIdx{0};
// Number of blocks and data on tape
static const std::array<uInt8, KVBLOCKS> ourKVBlocks;
static const std::array<uInt8, KVBLOCKBITS> ourKVData;
static const std::array<uInt8, Blocks> ourBlocks;
static const std::array<uInt8, BlockBits> ourData;
static const std::array<uInt8, SONG_POS_SIZE> ourSongPositions;
static const std::array<uInt32, SONG_START_SIZE> ourSongStart;
static const std::array<uInt8, SongPosSize> ourSongPositions;
static const std::array<uInt32, SongStartSize> ourSongStart;
private:
// Following constructors and assignment operators not supported