further work on release tool
This commit is contained in:
1 parent
41264c9300
commit
ae4b6acc55
3 files changed
+161
-25
No files matched your search
@@ -19,6 +19,8 @@ rom_revision_basic:
|
|||||||
|
|
||||||
rom_revision_basic_string:
|
rom_revision_basic_string:
|
||||||
|
|
||||||
|
// $BF55
|
||||||
|
|
||||||
.text "(DEVEL SNAPSHOT)" // actual ROM revision string; up to 16 characters
|
.text "(DEVEL SNAPSHOT)" // actual ROM revision string; up to 16 characters
|
||||||
.byte $00 // marks the end of string
|
.byte $00 // marks the end of string
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ rom_revision_kernal:
|
|||||||
|
|
||||||
rom_revision_kernal_string:
|
rom_revision_kernal_string:
|
||||||
|
|
||||||
|
// $E4BC
|
||||||
|
|
||||||
.text "(DEVEL SNAPSHOT)" // actual ROM revision string; up to 16 characters
|
.text "(DEVEL SNAPSHOT)" // actual ROM revision string; up to 16 characters
|
||||||
.byte $00 // marks the end of string
|
.byte $00 // marks the end of string
|
||||||
|
|
||||||
|
|||||||
+157
-25
@@ -6,10 +6,21 @@
|
|||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <cstring>
|
||||||
|
#include <fstream>
|
||||||
|
#include <ios>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
const std::vector<uint8_t> STR_MEGABAS = { 0x4D, 0x45, 0x47, 0x41, 0x42, 0x41, 0x53, 0x32 };
|
||||||
|
const std::vector<uint8_t> STR_OR = { 0x4F, 0x52 };
|
||||||
|
const std::vector<uint8_t> STR_SNAPSHOT = { 0x28, 0x44, 0x45, 0x56, 0x45, 0x4C, 0x20, 0x53,
|
||||||
|
0x4E, 0x41, 0x50, 0x53, 0x48, 0x4F, 0x54, 0x29,
|
||||||
|
0x00 };
|
||||||
|
|
||||||
//
|
//
|
||||||
// Command and enviroment line settings
|
// Command and enviroment line settings
|
||||||
@@ -21,6 +32,7 @@ std::string CMD_outDir = "./bin";
|
|||||||
std::list<std::string> CMD_fileList;
|
std::list<std::string> CMD_fileList;
|
||||||
|
|
||||||
std::string ENV_developerId;
|
std::string ENV_developerId;
|
||||||
|
std::string ENV_timeString;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Common helper functions
|
// Common helper functions
|
||||||
@@ -33,6 +45,44 @@ void printUsage()
|
|||||||
" <file list>" << "\n\n";
|
" <file list>" << "\n\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Class definitions
|
||||||
|
//
|
||||||
|
|
||||||
|
enum class ROMType
|
||||||
|
{
|
||||||
|
ROM_UNKNOWN,
|
||||||
|
ROM_BASIC,
|
||||||
|
ROM_KERNAL
|
||||||
|
};
|
||||||
|
|
||||||
|
class ROMFile
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
ROMFile(const std::string &baseFileName);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
void readSrcFile();
|
||||||
|
void readDstFile();
|
||||||
|
|
||||||
|
void recognizeFiles();
|
||||||
|
|
||||||
|
std::string baseFileName;
|
||||||
|
|
||||||
|
std::vector<uint8_t> srcFileContent;
|
||||||
|
std::vector<uint8_t> dstFileContent;
|
||||||
|
|
||||||
|
ROMType romType;
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// Global variables
|
||||||
|
//
|
||||||
|
|
||||||
|
std::list<ROMFile> GLOBAL_ROMFiles;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Top-level functions
|
// Top-level functions
|
||||||
//
|
//
|
||||||
@@ -63,7 +113,7 @@ void parseCommandLine(int argc, char **argv)
|
|||||||
if (CMD_fileList.empty()) { printUsage(); ERROR("empty file list"); }
|
if (CMD_fileList.empty()) { printUsage(); ERROR("empty file list"); }
|
||||||
}
|
}
|
||||||
|
|
||||||
void getEnvironmentSettings()
|
void getDeveloperId()
|
||||||
{
|
{
|
||||||
const char* id = getenv("OPEN_ROMS_DEVELOPER_ID");
|
const char* id = getenv("OPEN_ROMS_DEVELOPER_ID");
|
||||||
|
|
||||||
@@ -90,16 +140,35 @@ void getEnvironmentSettings()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void getDate()
|
||||||
|
{
|
||||||
|
time_t t = time(NULL);
|
||||||
|
struct tm tm = *localtime(&t);
|
||||||
|
|
||||||
|
const std::string year = std::to_string(tm.tm_year % 100);
|
||||||
|
const std::string month = std::to_string(tm.tm_mon + 1);
|
||||||
|
const std::string day = std::to_string(tm.tm_mday);
|
||||||
|
|
||||||
|
const std::string zero = "0";
|
||||||
|
|
||||||
|
|
||||||
|
ENV_timeString = (year.size() == 2 ? year : zero + year) +
|
||||||
|
(month.size() == 2 ? month : zero + month) +
|
||||||
|
(day.size() == 2 ? day : zero + day);
|
||||||
|
|
||||||
|
if (ENV_timeString.size() != 6) ERROR("could not retrieve date");
|
||||||
|
}
|
||||||
|
|
||||||
void printBanner()
|
void printBanner()
|
||||||
{
|
{
|
||||||
printBannerLineTop();
|
printBannerLineTop();
|
||||||
std::cout << "// Preparing ROM set release by '" << ENV_developerId << "'\n";
|
std::cout << "// Preparing ROM set release " << ENV_timeString << "-" << ENV_developerId << "\n";
|
||||||
printBannerLineBottom();
|
printBannerLineBottom();
|
||||||
}
|
}
|
||||||
|
|
||||||
void readFiles()
|
void readFiles()
|
||||||
{
|
{
|
||||||
// XXX
|
for (auto &fileName : CMD_fileList) GLOBAL_ROMFiles.push_back(ROMFile(fileName));
|
||||||
}
|
}
|
||||||
|
|
||||||
void embedVersionString()
|
void embedVersionString()
|
||||||
@@ -112,24 +181,6 @@ void writeFiles()
|
|||||||
// XXX
|
// XXX
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// Class definitions
|
|
||||||
//
|
|
||||||
|
|
||||||
class ROMFile
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
ROMFile(const std::string &baseFileName);
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
std::string baseFileName;
|
|
||||||
|
|
||||||
std::vector<uint8_t> srcFile;
|
|
||||||
std::vector<uint8_t> dstFile;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Main function
|
// Main function
|
||||||
//
|
//
|
||||||
@@ -137,7 +188,8 @@ private:
|
|||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
parseCommandLine(argc, argv);
|
parseCommandLine(argc, argv);
|
||||||
getEnvironmentSettings();
|
getDeveloperId();
|
||||||
|
getDate();
|
||||||
|
|
||||||
printBanner();
|
printBanner();
|
||||||
|
|
||||||
@@ -145,17 +197,97 @@ int main(int argc, char **argv)
|
|||||||
embedVersionString();
|
embedVersionString();
|
||||||
writeFiles();
|
writeFiles();
|
||||||
|
|
||||||
ERROR("This tool is not finished yet");
|
std::cout << "\n\nXXX This tool is not finished yet\n\n";
|
||||||
|
|
||||||
return 0;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Class 'ROMFile'
|
// Class 'ROMFile'
|
||||||
//
|
//
|
||||||
|
|
||||||
ROMFile::ROMFile(const std::string &baseFileName)
|
ROMFile::ROMFile(const std::string &baseFileName) :
|
||||||
|
baseFileName(baseFileName),
|
||||||
|
romType(ROMType::ROM_UNKNOWN)
|
||||||
{
|
{
|
||||||
|
readSrcFile();
|
||||||
|
readDstFile();
|
||||||
|
|
||||||
|
recognizeFiles();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ROMFile::readSrcFile()
|
||||||
|
{
|
||||||
|
// Read the source file
|
||||||
|
|
||||||
|
const std::string srcFileNamePath = CMD_inDir + DIR_SEPARATOR + baseFileName;
|
||||||
|
|
||||||
|
std::ifstream srcFile;
|
||||||
|
srcFile.open(srcFileNamePath, std::ios::in | std::ios::binary | std::ios::ate);
|
||||||
|
|
||||||
|
if (!srcFile.good()) ERROR(std::string("unable to open ROM file '") + srcFileNamePath + "'");
|
||||||
|
|
||||||
|
auto srcSize = srcFile.tellg();
|
||||||
|
if (srcSize != 8192) ERROR(std::string("incorrect size of ROM file '") + srcFileNamePath + "'");
|
||||||
|
|
||||||
|
srcFileContent.resize(8192);
|
||||||
|
srcFile.seekg (0, srcFile.beg);
|
||||||
|
srcFile.read((char *) srcFileContent.data(), srcFileContent.size());
|
||||||
|
|
||||||
|
if (!srcFile.good()) ERROR(std::string("unable to read ROM file '") + srcFileNamePath + "'");
|
||||||
|
srcFile.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ROMFile::readDstFile()
|
||||||
|
{
|
||||||
|
// Read the destination file (if exists and it's size matches)
|
||||||
|
|
||||||
|
const std::string dstFileNamePath = CMD_outDir + DIR_SEPARATOR + baseFileName;
|
||||||
|
|
||||||
|
std::ifstream dstFile;
|
||||||
|
dstFile.open(dstFileNamePath, std::ios::in | std::ios::binary | std::ios::ate);
|
||||||
|
|
||||||
|
bool continueReading = dstFile.good();
|
||||||
|
|
||||||
|
if (continueReading && dstFile.tellg() != 8192) continueReading = false;
|
||||||
|
|
||||||
|
if (continueReading)
|
||||||
|
{
|
||||||
|
dstFileContent.resize(8192);
|
||||||
|
dstFile.seekg (0, dstFile.beg);
|
||||||
|
dstFile.read((char *) dstFileContent.data(), dstFileContent.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!dstFile.good()) dstFileContent.resize(0);
|
||||||
|
dstFile.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ROMFile::recognizeFiles()
|
||||||
|
{
|
||||||
|
// Recognize source file type
|
||||||
|
|
||||||
|
std::cout << baseFileName << " ";
|
||||||
|
|
||||||
|
if ((memcmp(&srcFileContent[0x0004], STR_MEGABAS.data(), STR_MEGABAS.size()) == 0) &&
|
||||||
|
(memcmp(&srcFileContent[0x1F52], STR_OR.data(), STR_OR.size()) == 0) &&
|
||||||
|
(memcmp(&srcFileContent[0x1F55], STR_SNAPSHOT.data(), STR_SNAPSHOT.size()) == 0))
|
||||||
|
{
|
||||||
|
romType = ROMType::ROM_BASIC;
|
||||||
|
}
|
||||||
|
else if (srcFileContent[0x1F80] == 0xF0 &&
|
||||||
|
(memcmp(&srcFileContent[0x04B9], STR_OR.data(), STR_OR.size()) == 0) &&
|
||||||
|
(memcmp(&srcFileContent[0x04BC], STR_SNAPSHOT.data(), STR_SNAPSHOT.size()) == 0))
|
||||||
|
{
|
||||||
|
romType = ROMType::ROM_KERNAL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ERROR(std::string("'") + CMD_inDir + DIR_SEPARATOR + baseFileName +
|
||||||
|
"' is not a supported unversioned Open ROMs image");
|
||||||
|
}
|
||||||
|
|
||||||
// XXX
|
// XXX
|
||||||
|
|
||||||
|
std::cout << baseFileName << " ";
|
||||||
|
std::cout << "\n";
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user