From 9a706ecc52dc3c7490599af0a7a3d1c0570afbc3 Mon Sep 17 00:00:00 2001 From: "JASON-6700K\\jandersen" Date: Sat, 27 Jan 2024 12:36:34 -0500 Subject: [PATCH] rickjr: import the blockgen tool, so I can generate blocks.h headerfile --- bin/blockgen.exe | Bin 0 -> 20480 bytes bin/blockgen/source/bctypes.h | 48 ++++ bin/blockgen/source/blockgen.cpp | 68 ++++++ bin/blockgen/source/memstream.h | 164 +++++++++++++ bin/blockgen/source/symfile.cpp | 231 ++++++++++++++++++ bin/blockgen/source/symfile.h | 34 +++ bin/blockgen/vcxproj/blockgen.sln | 31 +++ bin/blockgen/vcxproj/blockgen.vcxproj | 141 +++++++++++ bin/blockgen/vcxproj/blockgen.vcxproj.filters | 26 ++ src/dat_spritesJR.c | 4 +- src/scr_credit.c | 13 +- src/system.c | 5 +- 12 files changed, 756 insertions(+), 9 deletions(-) create mode 100644 bin/blockgen.exe create mode 100644 bin/blockgen/source/bctypes.h create mode 100644 bin/blockgen/source/blockgen.cpp create mode 100644 bin/blockgen/source/memstream.h create mode 100644 bin/blockgen/source/symfile.cpp create mode 100644 bin/blockgen/source/symfile.h create mode 100644 bin/blockgen/vcxproj/blockgen.sln create mode 100644 bin/blockgen/vcxproj/blockgen.vcxproj create mode 100644 bin/blockgen/vcxproj/blockgen.vcxproj.filters diff --git a/bin/blockgen.exe b/bin/blockgen.exe new file mode 100644 index 0000000000000000000000000000000000000000..fd9556a697654f4a6670d9cbfb7294af1b4e88fd GIT binary patch literal 20480 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 Sb#?W3jdcP2$MZkH0{;z_dSr +#include + +#include "symfile.h" + +//------------------------------------------------------------------------------ +void helpText() +{ + printf("blockgen - v1.0\n"); + printf("--------------\n"); + printf("Convert mos-llvm elf file symboles into a C header file\n"); + printf("\nblock [options] \n"); + printf(" -v verbose\n\n"); + + exit(-1); +} + +//------------------------------------------------------------------------------ + +int main(int argc, char* argv[]) +{ + char* pInfilePath = nullptr; + bool bVerbose = false; + + for (int idx = 1; idx < argc; ++idx ) + { + char* arg = argv[ idx ]; + + if ('-' == arg[0]) + { + // Parse as an option + if ('v'==arg[1]) + { + bVerbose = true; + } + } + else if (nullptr == pInfilePath) + { + // Assume the first non-option is an input file path + pInfilePath = argv[ idx ]; + } + else + { + // Oh Crap, we have a non-option, but we don't know what to do with + // it + printf("ERROR: Invalid option, Arg %d = %s\n\n", idx, argv[ idx ]); + helpText(); + } + } + + if (pInfilePath) + { + // Load the .sym File + SYMFile *pSymFile = new SYMFile(std::string(pInfilePath)); + delete pSymFile; + } + else + { + helpText(); + } + + + return 0; +} + diff --git a/bin/blockgen/source/memstream.h b/bin/blockgen/source/memstream.h new file mode 100644 index 0000000..5adc146 --- /dev/null +++ b/bin/blockgen/source/memstream.h @@ -0,0 +1,164 @@ +// +// Jason's Memory Stream Helper thing +// Serialize a byte stream into real types +// +// Currently only support Little Endian +// + +#ifndef MEMSTREAM_H_ +#define MEMSTREAM_H_ + + +#include + +// Prototypes +void *memcpy(void *dest, const void *src, size_t n); + +class MemoryStream +{ +public: + MemoryStream(unsigned char* pStreamStart, size_t streamSize) + : m_pStreamStart( pStreamStart ) + , m_streamSize(streamSize) + , m_pStreamCurrent( pStreamStart ) + {} + + ~MemoryStream() + { + m_pStreamStart = nullptr; + m_streamSize = 0; + m_pStreamCurrent = nullptr; + } + + // Really Dumb Reader Template + template + T Read() + { + T result; + + memcpy(&result, m_pStreamCurrent, sizeof(T)); + m_pStreamCurrent += sizeof(T); + + return result; + } + + template + void Read(T& result) + { + memcpy(&result, m_pStreamCurrent, sizeof(result)); + m_pStreamCurrent += sizeof(result); + } + + void ReadBytes(u8* pDest, size_t numBytes) + { + memcpy(pDest, m_pStreamCurrent, numBytes); + m_pStreamCurrent += numBytes; + } + + std::string ReadPString() + { + std::string result; + + u8 length = *m_pStreamCurrent++; + + result.insert(0, (char*)m_pStreamCurrent, (size_t)length); + + m_pStreamCurrent += length; + + return result; + } + + std::string ReadLine() + { + unsigned char* pStreamEnd = m_pStreamStart + m_streamSize; + + std::string result; + + u8 *pEndOfLine = m_pStreamCurrent; + + while (pEndOfLine < pStreamEnd) + { + if ((0x0a != *pEndOfLine) && (0x0d != *pEndOfLine)) + { + pEndOfLine++; + } + else + { + break; + } + } + + size_t length = pEndOfLine - m_pStreamCurrent; + + if (length) + { + // Capture the line + result.insert(0, (char*)m_pStreamCurrent, (size_t)length); + m_pStreamCurrent += length; + } + + // Figure out if that loop broke out because we hit the end of the file + while (pEndOfLine < pStreamEnd) + { + if ((0x0a == *pEndOfLine) || (0x0d == *pEndOfLine)) + { + pEndOfLine++; + } + else + { + break; + } + } + + m_pStreamCurrent = pEndOfLine; + if (m_pStreamCurrent > pStreamEnd) + { + m_pStreamCurrent = pStreamEnd; + } + return result; + + } + + size_t SeekCurrent(int delta) + { + m_pStreamCurrent += delta; + return m_pStreamCurrent - m_pStreamStart; + } + + size_t SeekSet(size_t offset) + { + m_pStreamCurrent = m_pStreamStart + offset; + return m_pStreamCurrent - m_pStreamStart; + } + + unsigned char* GetPointer() { return m_pStreamCurrent; } + + size_t NumBytesAvailable() { + + unsigned char* pStreamEnd = m_pStreamStart + m_streamSize; + + if (pStreamEnd - m_pStreamCurrent >= 0) + { + return pStreamEnd - m_pStreamCurrent; + } + else + { + return 0; + } + } + + + +private: + + unsigned char* m_pStreamStart; + size_t m_streamSize; + + unsigned char* m_pStreamCurrent; + +}; + + +#endif // MEMSTREAM_H_ + + diff --git a/bin/blockgen/source/symfile.cpp b/bin/blockgen/source/symfile.cpp new file mode 100644 index 0000000..47a6625 --- /dev/null +++ b/bin/blockgen/source/symfile.cpp @@ -0,0 +1,231 @@ +// +// symfile.cpp +// +#include "symfile.h" +#include + +//------------------------------------------------------------------------------ +// Static Helpers + +static bool contains(char x, const char* pSeparators) +{ + while (*pSeparators) + { + if (x == *pSeparators) + { + return true; + } + pSeparators++; + } + + return false; +} + +static std::vector split(const std::string& s, const char* separators) +{ + std::vector output; + std::string::size_type prev_pos = 0, pos = 0; + + for (int index = 0; index < s.length(); ++index) + { + pos = index; + + // if the index is a separator + if (contains(s[index], separators)) + { + // if we've skipped a token, collect it + if (prev_pos != index) + { + output.push_back(s.substr(prev_pos, index-prev_pos)); + + // skip white space here + while (index < s.length()) + { + if (contains(s[index], separators)) + { + ++index; + } + else + { + prev_pos = index; + pos = index; + break; + } + } + } + else + { + prev_pos++; + } + } + } + + output.push_back(s.substr(prev_pos, pos-prev_pos+1)); // Last word + + return output; +} + +// make this string lowercase +static void tolower(std::string& s) +{ + for (int index = 0; index < s.length(); ++index) + { + s[index] = tolower( s[index] ); + } +} + +//------------------------------------------------------------------------------ +SYMFile::SYMFile( std::string filepath ) + : m_filepath( filepath ) +{ + FILE* pFile = nullptr; + errno_t err = fopen_s(&pFile, filepath.c_str(), "rb"); + + if (0==err) + { + fseek(pFile, 0, SEEK_END); + size_t length = ftell(pFile); + fseek(pFile, 0, SEEK_SET); + + printf("\n// SYMFile %s - %lld bytes\n", filepath.c_str(), length); + + printf("// Reading %s\n", filepath.c_str()); + + printf("//\n"); + printf("// This file generated by blockgen.exe\n"); + printf("//\n"); + printf("//\n"); + + u8* pData = new u8[ length ]; + + fread(pData, sizeof(u8), length / sizeof(u8), pFile); + + // Now we have a buffer, with the whole SYM File + // Read in the Sections + { + MemoryStream memStream(pData, length); + + while (memStream.NumBytesAvailable()) + { + std::string lineData = memStream.ReadLine(); + + // symbols are case sensitive + + // we care about the first 32 bit value in hex, and the last value on the line, the symbol + std::vector tokens = split(lineData, " \t"); + + if (tokens.size() >= 3) + { + if (IsHexAddress(tokens[0])) + { + // We're only interested in lines that start with a hex address + + std::string sym_name = tokens[ tokens.size() - 1 ]; + + u32 address = strtoul(tokens[0].c_str(), nullptr, 16); + + //printf("address = %08x\n", address); + + if (0 != (address >> 24)) + { + printf("#define %s_BLOCK %d\n", sym_name.c_str(), address>>24); + } + else if (0 != (address & 0xFF0000)) + { + printf("#define %s_high %d\n", sym_name.c_str(), (address>>16) & 0xFF); + printf("#define %s_BLOCK %d\n", sym_name.c_str(), ((address&0xFFFFFF) / 0x2000)); + } + + } + } + } + } + + delete[] pData; + + fclose(pFile); + + printf("\n// Read Completed\n"); + } + else + { + printf("// SYMFile could not open %s\n", filepath.c_str()); + printf("//\n"); + printf("Feed in a symbol dump file, and I will print out a header file\n"); + printf("Capture my output with a pipe.\n"); + printf("\nGenerate a .sym file like this:\n"); + printf("\nllvm-objdump --syms .elf > program.sym\n"); + } +} + +//------------------------------------------------------------------------------ + +SYMFile::~SYMFile() +{ +} + +//------------------------------------------------------------------------------ + +u32 SYMFile::GetAddress(std::string symbolName) +{ + u32 result_address = 0; + // If the address is in there, return it + // First remove trailing spaces from the sectionName + + const size_t strEnd = symbolName.find_last_not_of(" "); + + if (strEnd != std::string::npos) + { + if ((strEnd+1) != symbolName.length()) + { + symbolName.resize(strEnd+1); + } + } + + // Make sure not case sensitive + tolower(symbolName); + + for (int labelIndex = 0; labelIndex < m_symbols.size(); ++labelIndex) + { + if (symbolName == m_symbols[labelIndex]) + { + result_address = m_addresses[labelIndex]; + break; + } + } + + return result_address; +} + +//------------------------------------------------------------------------------ + +bool SYMFile::IsHexAddress(const std::string& address) +{ + if (8 == address.size()) + { + for (int idx = 0; idx < 8; ++idx) + { + if ((address[idx] >= '0')&&(address[idx] <= '9')) + { + continue; // this is good + } + else if ((address[idx] >= 'a')&&(address[idx] <= 'f')) + { + continue; // this is good + } + else if ((address[idx] >= 'A')&&(address[idx] <= 'F')) + { + continue; // this is good + } + else + { + return false; + } + } + + return true; + } + return false; +} + +//------------------------------------------------------------------------------ diff --git a/bin/blockgen/source/symfile.h b/bin/blockgen/source/symfile.h new file mode 100644 index 0000000..77cc341 --- /dev/null +++ b/bin/blockgen/source/symfile.h @@ -0,0 +1,34 @@ +// +// SYMFile Class +// + +#ifndef SYMFILE_H_ +#define SYMFILE_H_ + +#include +#include + +#include "bctypes.h" +#include "memstream.h" + +//------------------------------------------------------------------------------ + +class SYMFile +{ +public: + SYMFile( std::string filepath ); + ~SYMFile(); + + u32 GetAddress(std::string symbolName); + bool IsHexAddress(const std::string& address); + +private: + std::string m_filepath; + + std::vector m_symbols; + std::vector m_addresses; +}; + +#endif // SYMFILE_H_ + + diff --git a/bin/blockgen/vcxproj/blockgen.sln b/bin/blockgen/vcxproj/blockgen.sln new file mode 100644 index 0000000..ebbd3e4 --- /dev/null +++ b/bin/blockgen/vcxproj/blockgen.sln @@ -0,0 +1,31 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34309.116 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "blockgen", "blockgen.vcxproj", "{3E291D4B-EB9C-439B-8090-A0F1D0BD21EB}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3E291D4B-EB9C-439B-8090-A0F1D0BD21EB}.Debug|x64.ActiveCfg = Debug|x64 + {3E291D4B-EB9C-439B-8090-A0F1D0BD21EB}.Debug|x64.Build.0 = Debug|x64 + {3E291D4B-EB9C-439B-8090-A0F1D0BD21EB}.Debug|x86.ActiveCfg = Debug|Win32 + {3E291D4B-EB9C-439B-8090-A0F1D0BD21EB}.Debug|x86.Build.0 = Debug|Win32 + {3E291D4B-EB9C-439B-8090-A0F1D0BD21EB}.Release|x64.ActiveCfg = Release|x64 + {3E291D4B-EB9C-439B-8090-A0F1D0BD21EB}.Release|x64.Build.0 = Release|x64 + {3E291D4B-EB9C-439B-8090-A0F1D0BD21EB}.Release|x86.ActiveCfg = Release|Win32 + {3E291D4B-EB9C-439B-8090-A0F1D0BD21EB}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {43F6DB44-6241-4F87-B55D-35450E50405E} + EndGlobalSection +EndGlobal diff --git a/bin/blockgen/vcxproj/blockgen.vcxproj b/bin/blockgen/vcxproj/blockgen.vcxproj new file mode 100644 index 0000000..4eb2b85 --- /dev/null +++ b/bin/blockgen/vcxproj/blockgen.vcxproj @@ -0,0 +1,141 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 17.0 + Win32Proj + {3e291d4b-eb9c-439b-8090-a0f1d0bd21eb} + blockgen + 10.0 + + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + Application + true + v143 + Unicode + + + Application + false + v143 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + Level3 + true + WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + Level3 + true + _DEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + + + + + Level3 + true + true + true + NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + true + + + Console + true + true + true + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/bin/blockgen/vcxproj/blockgen.vcxproj.filters b/bin/blockgen/vcxproj/blockgen.vcxproj.filters new file mode 100644 index 0000000..96c4cfe --- /dev/null +++ b/bin/blockgen/vcxproj/blockgen.vcxproj.filters @@ -0,0 +1,26 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx + + + + + + Source Files + + + + + Source Files + + + Source Files + + + Source Files + + + \ No newline at end of file diff --git a/src/dat_spritesJR.c b/src/dat_spritesJR.c index 0a80709..2a2781c 100644 --- a/src/dat_spritesJR.c +++ b/src/dat_spritesJR.c @@ -41,7 +41,9 @@ extern __attribute__((aligned(16))) const char incbin_ ## name ## _start[]; \ extern const char incbin_ ## name ## _end[] -INCBIN(".binarydata.sprites", sprites_data_256, "data/sprites_data.256"); +INCBIN(".binarydata.splash", splash_256, "data/splash.256"); +INCBIN(".binarydata.tiles", tiles_256, "data/tiles_data.256"); +INCBIN(".binarydata.sprites", sprites_256, "data/sprites_data.256"); #endif /* GFXF256 */ diff --git a/src/scr_credit.c b/src/scr_credit.c index a4d8dd8..87bc625 100644 --- a/src/scr_credit.c +++ b/src/scr_credit.c @@ -13,16 +13,21 @@ segment "screen"; #endif extern char credits_lz4; +extern char incbin_sprites_256_start[]; +extern char incbin_tiles_256_start[]; +extern char incbin_splash_256_start[]; +extern char __block23_lma_high[]; -extern char incbin_sprites_data_256_start[]; CODE_BLOCK(8) void scr_credit() { #ifdef F256 //$$JGA TODO - fix this - *((char*)0x200) = (char)((long)(&incbin_sprites_data_256_start)); - *((char*)0x201) = (char)((long)(&incbin_sprites_data_256_start)>>8); - *((char*)0x202) = (char)((long)(&incbin_sprites_data_256_start)>>16); + *((char*)0x200) = (char)(((long)(&incbin_sprites_256_start))); + *((char*)0x201) = (char)(((long)(&incbin_sprites_256_start))>>8); +// *((char*)0x202) = (char)(((long)(&incbin_sprites_256_start_high))>>16); + *((char*)0x203) = scr_credit_BLOCK; +// *((char*)0x203) = (char)(((long)(__block23_lma_high))>>8); #endif #ifdef IIGS diff --git a/src/system.c b/src/system.c index 8cbbb96..b96127f 100644 --- a/src/system.c +++ b/src/system.c @@ -34,9 +34,6 @@ void puts(char* c_str) { } -void __putchar(char c) -{ -} #endif @@ -141,7 +138,7 @@ sys_sleep(int s) /* * Initialize system */ -void +CODE_BLOCK(8) void sys_init(int argc, char **argv) { sysarg_init(argc, argv);