diff --git a/README.md b/README.md index 0551ded..dd2d984 100644 --- a/README.md +++ b/README.md @@ -165,6 +165,48 @@ Embedded data can be compressed during compile time and expanded at runtime usin Compression algorithms so far are LZ (lzo) and run length (rle). +### Embedding sprite and graphics data + +The #embed preprocessor can also import components from spritepad and charpad files (.spd version 5 and .ctm version 8). + +The component to extract (e.g. chars or tiles) is added as a further specifier. + + const char FloorChars[] = { + #embed ctm_chars lzo "floortiles.ctm" + }; + +Imports the character data and compresses it using lzo compression. + + const char CardsTiles[] = { + #embed ctm_tiles8 "cards.ctm" + }; + +Imports the tiles in 8 bit form and builds word constants + + const unsigned CardsTiles[] = { + #embed ctm_tiles16 word "cards.ctm" + }; + +Imports the tiles in 16 bit form and builds word constants + + const char CardsAttrib1[] = { + #embed ctm_attr1 "cards.ctm" + }; + + const char CardsAttrib2[] = { + #embed ctm_attr2 "cards.ctm" + }; + +Imports the attribute data + + const char SpriteData[] = { + #embed spd_sprites lzo "sprites.spd" + }; + + +Imports the sprite data and compresses it using lzo compression + + ### Console input and output The C64 does not use ASCII it uses a derivative called PETSCII. There are two fonts, one with uppercase and one with uppercase and lowercase characters. It also used CR (13) as line terminator instead of LF (10). The stdio and conio libaries can perform translations. diff --git a/oscar64/Compiler.cpp b/oscar64/Compiler.cpp index 4a852c7..d2eb35d 100644 --- a/oscar64/Compiler.cpp +++ b/oscar64/Compiler.cpp @@ -438,7 +438,7 @@ bool Compiler::BuildLZO(const char* targetPath) while (mErrors->mErrorCount == 0 && (cunit = mCompilationUnits->PendingUnit())) { - if (mPreprocessor->EmbedData("Compressing", cunit->mFileName, true, 0, 65536, SFM_BINARY_LZO)) + if (mPreprocessor->EmbedData("Compressing", cunit->mFileName, true, 0, 65536, SFM_BINARY_LZO, SFD_NONE)) { Scanner* scanner = new Scanner(mErrors, mPreprocessor); while (scanner->mToken == TK_INTEGER) diff --git a/oscar64/Ident.cpp b/oscar64/Ident.cpp index 23f16c2..daabd53 100644 --- a/oscar64/Ident.cpp +++ b/oscar64/Ident.cpp @@ -45,6 +45,13 @@ const Ident* Ident::Unique(const char* str) } +const Ident* Ident::Mangle(const char* str) const +{ + char buffer[100]; + strcpy_s(buffer, mString); + strcat_s(buffer, str); + return Unique(buffer); +} IdentDict::IdentDict(void) { diff --git a/oscar64/Ident.h b/oscar64/Ident.h index efa5db3..661c83c 100644 --- a/oscar64/Ident.h +++ b/oscar64/Ident.h @@ -9,6 +9,7 @@ public: unsigned int mHash; static const Ident* Unique(const char* str); + const Ident* Mangle(const char* str) const; protected: Ident(const char* str, unsigned int hash); }; diff --git a/oscar64/InterCode.cpp b/oscar64/InterCode.cpp index 2e8deff..e5cef5d 100644 --- a/oscar64/InterCode.cpp +++ b/oscar64/InterCode.cpp @@ -12847,7 +12847,7 @@ void InterCodeProcedure::Close(void) if (!mInterruptCalled && mEntryBlock->CheckStaticStack()) { mLinkerObject->mFlags |= LOBJF_STATIC_STACK; - mLinkerObject->mStackSection = mModule->mLinker->AddSection(mIdent, LST_STATIC_STACK); + mLinkerObject->mStackSection = mModule->mLinker->AddSection(mIdent->Mangle("@stack"), LST_STATIC_STACK); for (int i = 0; i < mLocalVars.Size(); i++) { @@ -12861,7 +12861,7 @@ void InterCodeProcedure::Close(void) } } - mSaveTempsLinkerObject = mModule->mLinker->AddObject(mLocation, mIdent, mLinkerObject->mStackSection, LOT_BSS); + mSaveTempsLinkerObject = mModule->mLinker->AddObject(mLocation, mIdent->Mangle("@stack"), mLinkerObject->mStackSection, LOT_BSS); ResetVisited(); mEntryBlock->CollectStaticStack(mLinkerObject, mLocalVars); diff --git a/oscar64/NativeCodeGenerator.cpp b/oscar64/NativeCodeGenerator.cpp index 6932611..5a692cf 100644 --- a/oscar64/NativeCodeGenerator.cpp +++ b/oscar64/NativeCodeGenerator.cpp @@ -111,14 +111,18 @@ void NativeRegisterDataSet::ResetY(void) } } -void NativeRegisterDataSet::ResetIndirect(void) +void NativeRegisterDataSet::ResetIndirect(int reg) { for (int i = 0; i < NUM_REGS; i++) { if (mRegs[i].mMode == NRDM_ABSOLUTE || mRegs[i].mMode == NRDM_ABSOLUTE_X || - mRegs[i].mMode == NRDM_ABSOLUTE_Y || - mRegs[i].mMode == NRDM_INDIRECT_Y ) + mRegs[i].mMode == NRDM_ABSOLUTE_Y) + { + if (reg != BC_REG_STACK || !mRegs[i].mLinkerObject) + mRegs[i].Reset(); + } + else if (mRegs[i].mMode == NRDM_INDIRECT_Y ) { mRegs[i].Reset(); } @@ -2334,7 +2338,7 @@ bool NativeCodeInstruction::ValueForwarding(NativeRegisterDataSet& data, AsmInsT data.mRegs[CPU_REG_X].Reset(); data.mRegs[CPU_REG_Y].Reset(); - data.ResetIndirect(); + data.ResetIndirect(0); for (int i = 0; i < 4; i++) { @@ -3181,7 +3185,7 @@ bool NativeCodeInstruction::ValueForwarding(NativeRegisterDataSet& data, AsmInsT } if (ChangesAddress()) - data.ResetIndirect(); + data.ResetIndirect(mAddress); } else if (mMode == ASMIM_ABSOLUTE) { @@ -6515,14 +6519,21 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc return dreg; } + int dreg = BC_REG_ACCU; + if (sins) LoadValueToReg(proc, sins, BC_REG_ACCU, nullptr, nullptr); + else if (ins->mSrc[index].mTemp == ins->mDst.mTemp) + dreg = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; else { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[index].mTemp])); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_TMP + proc->mTempOffset[ins->mSrc[index].mTemp] + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + int sreg = BC_REG_TMP + proc->mTempOffset[ins->mSrc[index].mTemp]; + dreg = BC_REG_TMP + proc->mTempOffset[ins->mDst.mTemp]; + + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, sreg + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1)); } switch (lmul) @@ -6531,87 +6542,87 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc case 1: if (ins->mDst.IsUByte()) { - ShiftRegisterLeftByte(proc, BC_REG_ACCU, lshift); + ShiftRegisterLeftByte(proc, dreg, lshift); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1)); } else - ShiftRegisterLeft(proc, BC_REG_ACCU, lshift); - return BC_REG_ACCU; + ShiftRegisterLeft(proc, dreg, lshift); + return dreg; case 3: if (ins->mSrc[index].IsUByte() && ins->mSrc[index].mRange.mMaxValue <= 85) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, dreg + 0)); mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, dreg + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 0)); } else { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, dreg + 0)); mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 4)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, dreg + 1)); mIns.Push(NativeCodeInstruction(ASMIT_ROL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 5)); mIns.Push(NativeCodeInstruction(ASMIT_CLC, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_WORK + 4)); - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, dreg + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_WORK + 5)); - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, dreg + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1)); } if (ins->mDst.IsUByte()) { - ShiftRegisterLeftByte(proc, BC_REG_ACCU, lshift); + ShiftRegisterLeftByte(proc, dreg, lshift); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1)); } else - ShiftRegisterLeft(proc, BC_REG_ACCU, lshift); - return BC_REG_ACCU; + ShiftRegisterLeft(proc, dreg, lshift); + return dreg; case 5: if (ins->mSrc[index].IsUByte() && ins->mSrc[index].mRange.mMaxValue <= 51) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, dreg + 0)); mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, dreg + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 0)); } else { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, dreg + 0)); mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 4)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, dreg + 1)); mIns.Push(NativeCodeInstruction(ASMIT_ROL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_ZERO_PAGE, BC_REG_WORK + 4)); mIns.Push(NativeCodeInstruction(ASMIT_ROL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 5)); mIns.Push(NativeCodeInstruction(ASMIT_CLC, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_WORK + 4)); - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, dreg + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_WORK + 5)); - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, dreg + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1)); } if (ins->mDst.IsUByte()) { - ShiftRegisterLeftByte(proc, BC_REG_ACCU, lshift); + ShiftRegisterLeftByte(proc, dreg, lshift); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1)); } else - ShiftRegisterLeft(proc, BC_REG_ACCU, lshift); - return BC_REG_ACCU; + ShiftRegisterLeft(proc, dreg, lshift); + return dreg; case 7: - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, dreg + 0)); mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 4)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, dreg + 1)); mIns.Push(NativeCodeInstruction(ASMIT_ROL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_ZERO_PAGE, BC_REG_WORK + 4)); mIns.Push(NativeCodeInstruction(ASMIT_ROL, ASMIM_IMPLIED)); @@ -6620,25 +6631,25 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 5)); mIns.Push(NativeCodeInstruction(ASMIT_SEC, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_WORK + 4)); - mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, dreg + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_WORK + 5)); - mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_SBC, ASMIM_ZERO_PAGE, dreg + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1)); if (ins->mDst.IsUByte()) { - ShiftRegisterLeftByte(proc, BC_REG_ACCU, lshift); + ShiftRegisterLeftByte(proc, dreg, lshift); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1)); } else - ShiftRegisterLeft(proc, BC_REG_ACCU, lshift); - return BC_REG_ACCU; + ShiftRegisterLeft(proc, dreg, lshift); + return dreg; case 9: - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, dreg + 0)); mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 4)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, dreg + 1)); mIns.Push(NativeCodeInstruction(ASMIT_ROL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_ZERO_PAGE, BC_REG_WORK + 4)); mIns.Push(NativeCodeInstruction(ASMIT_ROL, ASMIM_IMPLIED)); @@ -6647,34 +6658,34 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 5)); mIns.Push(NativeCodeInstruction(ASMIT_CLC, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_WORK + 4)); - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, dreg + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_WORK + 5)); - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, dreg + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1)); if (ins->mDst.IsUByte()) { - ShiftRegisterLeftByte(proc, BC_REG_ACCU, lshift); + ShiftRegisterLeftByte(proc, dreg, lshift); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1)); } else - ShiftRegisterLeft(proc, BC_REG_ACCU, lshift); - return BC_REG_ACCU; + ShiftRegisterLeft(proc, dreg, lshift); + return dreg; #if 1 case 25: - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, dreg + 0)); mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_TAX, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, dreg + 1)); mIns.Push(NativeCodeInstruction(ASMIT_ROL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_TAY, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_CLC, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_TXA, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, dreg + 0)); mIns.Push(NativeCodeInstruction(ASMIT_TAX, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_TYA, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, dreg + 1)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 0)); mIns.Push(NativeCodeInstruction(ASMIT_TXA, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); @@ -6684,13 +6695,13 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc mIns.Push(NativeCodeInstruction(ASMIT_ASL, ASMIM_IMPLIED)); mIns.Push(NativeCodeInstruction(ASMIT_ROL, ASMIM_ZERO_PAGE, BC_REG_WORK + 0)); mIns.Push(NativeCodeInstruction(ASMIT_CLC, ASMIM_IMPLIED)); - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, dreg + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_WORK + 0)); - mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); - ShiftRegisterLeft(proc, BC_REG_ACCU, lshift); - return BC_REG_ACCU; + mIns.Push(NativeCodeInstruction(ASMIT_ADC, ASMIM_ZERO_PAGE, dreg + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, dreg + 1)); + ShiftRegisterLeft(proc, dreg, lshift); + return dreg; #endif #endif default: @@ -6698,7 +6709,8 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc { if (ins->mSrc[index].IsUByte()) { - mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, BC_REG_ACCU)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, dreg)); + mIns.Push(NativeCodeInstruction(ASMIT_LDX, ASMIM_IMMEDIATE, mul & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STX, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDX, ASMIM_IMMEDIATE, mul >> 8)); @@ -6709,6 +6721,14 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc } else { + if (dreg != BC_REG_ACCU) + { + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, dreg)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, dreg + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + } + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, mul & 0xff)); mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 0)); mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, mul >> 8)); @@ -6720,6 +6740,14 @@ int NativeCodeBasicBlock::ShortMultiply(InterCodeProcedure* proc, NativeCodeProc } else { + if (dreg != BC_REG_ACCU) + { + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, dreg)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 0)); + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_ZERO_PAGE, dreg + 1)); + mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_ACCU + 1)); + } + mIns.Push(NativeCodeInstruction(ASMIT_LDA, ASMIM_IMMEDIATE, mul)); // mIns.Push(NativeCodeInstruction(ASMIT_STA, ASMIM_ZERO_PAGE, BC_REG_WORK + 0)); @@ -24566,6 +24594,7 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass mIns[i + 3].mMode = ASMIM_IMPLIED; progress = true; } +#if 1 else if ( mIns[i + 0].mType == ASMIT_TXA && mIns[i + 1].mType == ASMIT_CLC && @@ -24581,8 +24610,11 @@ bool NativeCodeBasicBlock::PeepHoleOptimizer(NativeCodeProcedure* proc, int pass mIns[i + 2].mMode = ASMIM_IMPLIED; mIns[i + 2].mLive |= LIVE_CPU_REG_X; if (mIns[i + 3].mLive & LIVE_CPU_REG_A) mIns[i + 3].mType = ASMIT_TXA; + else + mIns[i + 3].mType = ASMIT_NOP; progress = true; } +#endif else if ( mIns[i + 0].mType == ASMIT_TXA && mIns[i + 1].mType == ASMIT_SEC && @@ -27493,6 +27525,7 @@ void NativeCodeProcedure::Optimize(void) } #endif + #if 1 if (step == 4 || step == 5) { @@ -27544,7 +27577,7 @@ void NativeCodeProcedure::Optimize(void) continue; } } - + if (!changed && yregs[0] >= 0) { int j = 1; @@ -27560,7 +27593,7 @@ void NativeCodeProcedure::Optimize(void) changed = true; ymapped = true; continue; - } + } } #endif if (!changed) @@ -27631,6 +27664,7 @@ void NativeCodeProcedure::Optimize(void) changed = true; #endif + #if 1 ResetVisited(); if (mEntryBlock->ForwardZpXIndex(step >= 4)) @@ -27642,7 +27676,6 @@ void NativeCodeProcedure::Optimize(void) mEntryBlock->CheckBlocks(); #endif - if (step == 5) { ResetVisited(); diff --git a/oscar64/NativeCodeGenerator.h b/oscar64/NativeCodeGenerator.h index 1a16d81..966841d 100644 --- a/oscar64/NativeCodeGenerator.h +++ b/oscar64/NativeCodeGenerator.h @@ -45,7 +45,7 @@ struct NativeRegisterDataSet void ResetZeroPage(int addr); void ResetAbsolute(LinkerObject * linkerObject, int addr); - void ResetIndirect(void); + void ResetIndirect(int reg); void ResetX(void); void ResetY(void); void Intersect(const NativeRegisterDataSet& set); diff --git a/oscar64/Preprocessor.cpp b/oscar64/Preprocessor.cpp index 88743c1..664333e 100644 --- a/oscar64/Preprocessor.cpp +++ b/oscar64/Preprocessor.cpp @@ -32,7 +32,7 @@ bool SourceFile::ReadLineLZO(char* line) assert(mFill >= 0 && mFill - mPos < 384 && mPos <= mFill); int c; - while (mLimit && mFill < 384 && (c = fgetc(mFile)) >= 0) + while (mLimit && mFill < 384 && (c = ReadChar()) >= 0) { mLimit--; mBuffer[mFill++] = c; @@ -115,7 +115,7 @@ bool SourceFile::ReadLineRLE(char* line) assert(mFill >= 0 && mFill < 256); int c; - while (mLimit && mFill < 256 && (c = fgetc(mFile)) >= 0) + while (mLimit && mFill < 256 && (c = ReadChar()) >= 0) { mLimit--; mBuffer[mFill++] = c; @@ -234,6 +234,19 @@ bool SourceFile::ReadLineRLE(char* line) return false; } +int SourceFile::ReadChar(void) +{ + if (mMemData) + { + if (mMemPos < mMemSize) + return mMemData[mMemPos++]; + else + return -1; + } + else + return fgetc(mFile); +} + bool SourceFile::ReadLine(char* line) { if (mFile) @@ -249,7 +262,7 @@ bool SourceFile::ReadLine(char* line) { mLimit--; - int c = fgetc(mFile); + int c = ReadChar(); if (c >= 0) { sprintf_s(line, 1024, "0x%02x, ", c); @@ -257,6 +270,22 @@ bool SourceFile::ReadLine(char* line) } } break; + case SFM_BINARY_WORD: + if (mLimit >= 2) + { + mLimit -= 2; + + int c = ReadChar(); + if (c >= 0) + { + int d = ReadChar(); + if (d >= 0) + sprintf_s(line, 1024, "0x%04x, ", c + 256 * d); + return true; + } + } + break; + case SFM_BINARY_RLE: if (ReadLineRLE(line)) return true; @@ -274,15 +303,265 @@ bool SourceFile::ReadLine(char* line) return false; } -void SourceFile::Limit(int skip, int limit) +struct CTMHeader8 { - mLimit = limit; - if (mFile) - fseek(mFile, skip, SEEK_SET); + uint8 mID[3]; + uint8 mVersion[1]; + uint8 mDispMode; + uint8 mColorMethod; + uint8 mFlags; + uint8 mColors[7]; +}; + +#pragma pack(push, 1) +struct SPDHeader5 +{ + uint8 mID[3]; + uint8 mVersion[1]; + uint8 mFlags; + uint16 mNumSprites, mNumTiles; + uint8 mNumSpriteAnmis, mNumTileAnims; + uint8 mTileWidth, mTileHeight; + uint8 mColors[3]; + int16 mSpriteOverlayDist, mTileOverlayDist; +}; +#pragma pack(pop) + +void SourceFile::ReadSpritePad(SourceFileDecoder decoder) +{ + SPDHeader5 spdHeader; + + fread(&spdHeader, sizeof(SPDHeader5), 1, mFile); + + if (decoder == SFD_SPD_SPRITES) + { + mLimit = 64 * spdHeader.mNumSprites; + return; + } + + mLimit = 0; +} + +void SourceFile::ReadCharPad(SourceFileDecoder decoder) +{ + CTMHeader8 ctmHeader; + uint16 ctmMarker, numChars, numTiles; + char tileWidth, tileHeight; + + fread(&ctmHeader, sizeof(CTMHeader8), 1, mFile); + fread(&ctmMarker, 2, 1, mFile); + fread(&numChars, 2, 1, mFile); + numChars++; + + if (decoder == SFD_CTM_CHARS) + { + mLimit = 8 * numChars; + return; + } + + // Skip chars + fseek(mFile, 8 * numChars, SEEK_CUR); + + fread(&ctmMarker, 2, 1, mFile); + + if (ctmHeader.mColorMethod == 2 && (decoder == SFD_CTM_CHAR_ATTRIB_1 || decoder == SFD_CTM_CHAR_ATTRIB_2)) + { + mMemSize = numChars; + mLimit = mMemSize; + mMemPos = 0; + mMemData = new uint8[mMemSize]; + } + + if (ctmHeader.mColorMethod == 2 && decoder == SFD_CTM_CHAR_ATTRIB_1) + { + for (int i = 0; i < mMemSize; i++) + { + uint8 fd; + fread(&fd, 1, 1, mFile); + mMemData[i] = fd << 4; + } + } + else + { + // Skip material + fseek(mFile, 1 * numChars, SEEK_CUR); + } + + if (ctmHeader.mColorMethod == 2) + { + fread(&ctmMarker, 2, 1, mFile); + + if (decoder == SFD_CTM_CHAR_ATTRIB_1 || decoder == SFD_CTM_CHAR_ATTRIB_2) + { + if (ctmHeader.mDispMode == 4) + { + for (int i = 0; i < mMemSize; i++) + { + uint8 fd[3]; + fread(fd, 1, 3, mFile); + if (decoder == SFD_CTM_CHAR_ATTRIB_1) + mMemData[i] |= fd[0]; + else + mMemData[i] = (fd[2] << 4) | fd[1]; + } + } + else + { + for (int i = 0; i < mMemSize; i++) + { + uint8 fd[3]; + fread(fd, 1, 1, mFile); + mMemData[i] |= fd[0]; + } + } + + + return; + } + else + { + // Skip colors + if (ctmHeader.mDispMode == 3) + fseek(mFile, 2 * numChars, SEEK_CUR); + else if (ctmHeader.mDispMode == 4) + fseek(mFile, 3 * numChars, SEEK_CUR); + else + fseek(mFile, numChars, SEEK_CUR); + } + } + + if (ctmHeader.mFlags & 1) + { + fread(&ctmMarker, 2, 1, mFile); + + fread(&numTiles, 2, 1, mFile); + numTiles++; + + fread(&tileWidth, 1, 1, mFile); + fread(&tileHeight, 1, 1, mFile); + + if (decoder == SFD_CTM_TILES_16) + { + mLimit = 2 * numTiles * tileWidth * tileHeight; + return; + } + else if (decoder == SFD_CTM_TILES_8) + { + mMemSize = numTiles * tileWidth * tileHeight; + mLimit = mMemSize; + mMemPos = 0; + mMemData = new uint8[mMemSize]; + for (int i = 0; i < mMemSize; i++) + { + int16 d; + fread(&d, 2, 1, mFile); + mMemData[i] = d; + } + return; + } + else + fseek(mFile, 2 * numTiles * tileWidth * tileHeight, SEEK_CUR); + + fread(&ctmMarker, 2, 1, mFile); + + if (decoder == SFD_CTM_CHAR_ATTRIB_1 || decoder == SFD_CTM_CHAR_ATTRIB_2) + { + mMemSize = numTiles; + mLimit = mMemSize; + mMemPos = 0; + mMemData = new uint8[mMemSize]; + + for (int i = 0; i < mMemSize; i++) + { + uint8 fd[3]; + fread(&fd, 1, 1, mFile); + mMemData[i] = fd[0]; + } + + fread(&ctmMarker, 2, 1, mFile); + + for (int i = 0; i < mMemSize; i++) + { + uint8 fd[3]; + fread(&fd, 1, 1, mFile); + mMemData[i] |= fd[0] << 4; + } + + return; + } + else + { + // Skip material + fseek(mFile, 1 * numTiles, SEEK_CUR); + } + + // Skip tile names + fread(&ctmMarker, 2, 1, mFile); + for (int i = 0; i < numTiles; i++) + { + while (fgetc(mFile) > 0) + ; + } + } + + fread(&ctmMarker, 2, 1, mFile); + + int16 mapWidth, mapHeight; + fread(&mapWidth, 2, 1, mFile); + fread(&mapHeight, 2, 1, mFile); + + if (decoder == SFD_CTM_MAP_16) + { + mLimit = 2 * mapWidth * mapHeight; + return; + } + else if (decoder == SFD_CTM_MAP_8) + { + mMemSize = mapWidth * mapHeight; + mLimit = mMemSize; + mMemPos = 0; + mMemData = new uint8[mMemSize]; + for (int i = 0; i < mMemSize; i++) + { + int16 d; + fread(&d, 2, 1, mFile); + mMemData[i] = d; + } + return; + } + else + fseek(mFile, 2 * mapWidth * mapHeight, SEEK_CUR); + + mLimit = 0; +} + +void SourceFile::Limit(SourceFileDecoder decoder, int skip, int limit) +{ + switch (decoder) + { + case SFD_CTM_CHARS: + case SFD_CTM_CHAR_ATTRIB_1: + case SFD_CTM_CHAR_ATTRIB_2: + case SFD_CTM_TILES_8: + case SFD_CTM_TILES_16: + case SFD_CTM_MAP_8: + case SFD_CTM_MAP_16: + ReadCharPad(decoder); + break; + + case SFD_SPD_SPRITES: + ReadSpritePad(decoder); + break; + + default: + mLimit = limit; + if (mFile) + fseek(mFile, skip, SEEK_SET); + } } SourceFile::SourceFile(void) - : mFile(nullptr), mFileName{ 0 }, mStack(nullptr) + : mFile(nullptr), mFileName{ 0 }, mStack(nullptr), mMemData(nullptr) { } @@ -294,6 +573,11 @@ SourceFile::~SourceFile(void) fclose(mFile); mFile = nullptr; } + + if (mMemData) + { + delete[] mMemData; + } } bool SourceFile::Open(const char* name, const char* path, SourceFileMode mode) @@ -398,7 +682,7 @@ bool Preprocessor::NextLine(void) return false; } -bool Preprocessor::EmbedData(const char* reason, const char* name, bool local, int skip, int limit, SourceFileMode mode) +bool Preprocessor::EmbedData(const char* reason, const char* name, bool local, int skip, int limit, SourceFileMode mode, SourceFileDecoder decoder) { if (strlen(name) > 200) { @@ -443,7 +727,7 @@ bool Preprocessor::EmbedData(const char* reason, const char* name, bool local, i if (mCompilerOptions & COPT_VERBOSE) printf("%s \"%s\"\n", reason, source->mFileName); - source->Limit(skip, limit); + source->Limit(decoder, skip, limit); source->mUp = mSource; mSource = source; diff --git a/oscar64/Preprocessor.h b/oscar64/Preprocessor.h index 28fade1..19e1d54 100644 --- a/oscar64/Preprocessor.h +++ b/oscar64/Preprocessor.h @@ -18,9 +18,24 @@ enum SourceFileMode { SFM_TEXT, SFM_BINARY, + SFM_BINARY_WORD, SFM_BINARY_RLE, SFM_BINARY_LZO }; + +enum SourceFileDecoder +{ + SFD_NONE, + SFD_CTM_CHARS, + SFD_CTM_CHAR_ATTRIB_1, + SFD_CTM_CHAR_ATTRIB_2, + SFD_CTM_TILES_8, + SFD_CTM_TILES_16, + SFD_CTM_MAP_8, + SFD_CTM_MAP_16, + SFD_SPD_SPRITES +}; + class SourceFile { public: @@ -32,8 +47,9 @@ public: SourceFileMode mMode; int mLimit; - char mBuffer[512]; - int mFill, mPos; + uint8 mBuffer[512]; + int mFill, mPos, mMemPos, mMemSize; + uint8 * mMemData; bool ReadLine(char* line); @@ -46,7 +62,7 @@ public: bool Open(const char* name, const char * path, SourceFileMode mode = SFM_TEXT); void Close(void); - void Limit(int skip, int limit); + void Limit(SourceFileDecoder decoder, int skip, int limit); bool PushSource(void); bool PopSource(void); @@ -54,6 +70,10 @@ public: protected: FILE* mFile; + + void ReadCharPad(SourceFileDecoder decoder); + void ReadSpritePad(SourceFileDecoder decoder); + int ReadChar(void); }; class SourcePath @@ -90,7 +110,7 @@ public: bool PopSource(void); bool DropSource(void); - bool EmbedData(const char* reason, const char* name, bool local, int skip, int limit, SourceFileMode mode); + bool EmbedData(const char* reason, const char* name, bool local, int skip, int limit, SourceFileMode mode, SourceFileDecoder decoder); Preprocessor(Errors * errors); ~Preprocessor(void); diff --git a/oscar64/Scanner.cpp b/oscar64/Scanner.cpp index 9de3172..5c9050d 100644 --- a/oscar64/Scanner.cpp +++ b/oscar64/Scanner.cpp @@ -651,6 +651,7 @@ void Scanner::NextToken(void) { int limit = 65536, skip = 0; SourceFileMode mode = SFM_BINARY; + SourceFileDecoder decoder = SFD_NONE; NextRawToken(); if (mToken == TK_INTEGER) @@ -665,12 +666,30 @@ void Scanner::NextToken(void) } } - if (mToken == TK_IDENT) + while (mToken == TK_IDENT) { if (!strcmp(mTokenIdent->mString, "rle")) mode = SFM_BINARY_RLE; else if (!strcmp(mTokenIdent->mString, "lzo")) mode = SFM_BINARY_LZO; + else if (!strcmp(mTokenIdent->mString, "word")) + mode = SFM_BINARY_WORD; + else if (!strcmp(mTokenIdent->mString, "ctm_chars")) + decoder = SFD_CTM_CHARS; + else if (!strcmp(mTokenIdent->mString, "ctm_attr1")) + decoder = SFD_CTM_CHAR_ATTRIB_1; + else if (!strcmp(mTokenIdent->mString, "ctm_attr2")) + decoder = SFD_CTM_CHAR_ATTRIB_2; + else if (!strcmp(mTokenIdent->mString, "ctm_tiles8")) + decoder = SFD_CTM_TILES_8; + else if (!strcmp(mTokenIdent->mString, "ctm_tiles16")) + decoder = SFD_CTM_TILES_16; + else if (!strcmp(mTokenIdent->mString, "ctm_map8")) + decoder = SFD_CTM_MAP_8; + else if (!strcmp(mTokenIdent->mString, "ctm_map16")) + decoder = SFD_CTM_MAP_16; + else if (!strcmp(mTokenIdent->mString, "spd_sprites")) + decoder = SFD_SPD_SPRITES; else mErrors->Error(mLocation, EERR_FILE_NOT_FOUND, "Invalid embed compression mode", mTokenIdent); @@ -679,14 +698,14 @@ void Scanner::NextToken(void) if (mToken == TK_STRING) { - if (!mPreprocessor->EmbedData("Embedding", mTokenString, true, skip, limit, mode)) + if (!mPreprocessor->EmbedData("Embedding", mTokenString, true, skip, limit, mode, decoder)) mErrors->Error(mLocation, EERR_FILE_NOT_FOUND, "Could not open source file", mTokenString); } else if (mToken == TK_LESS_THAN) { mOffset--; StringToken('>', 'a'); - if (!mPreprocessor->EmbedData("Embedding", mTokenString, false, skip, limit, mode)) + if (!mPreprocessor->EmbedData("Embedding", mTokenString, false, skip, limit, mode, decoder)) mErrors->Error(mLocation, EERR_FILE_NOT_FOUND, "Could not open source file", mTokenString); } } diff --git a/oscar64/oscar64.cpp b/oscar64/oscar64.cpp index a523fc3..6c8223e 100644 --- a/oscar64/oscar64.cpp +++ b/oscar64/oscar64.cpp @@ -74,7 +74,7 @@ int main2(int argc, const char** argv) #else strcpy(strProductName, "oscar64"); - strcpy(strProductVersion, "1.7.150"); + strcpy(strProductVersion, "1.8.151"); #ifdef __APPLE__ uint32_t length = sizeof(basePath); diff --git a/oscar64/oscar64.rc b/oscar64/oscar64.rc index 0a7a351..e250104 100644 --- a/oscar64/oscar64.rc +++ b/oscar64/oscar64.rc @@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,7,150,0 - PRODUCTVERSION 1,7,150,0 + FILEVERSION 1,8,151,0 + PRODUCTVERSION 1,8,151,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -43,12 +43,12 @@ BEGIN BEGIN VALUE "CompanyName", "oscar64" VALUE "FileDescription", "oscar64 compiler" - VALUE "FileVersion", "1.7.150.0" + VALUE "FileVersion", "1.8.151.0" VALUE "InternalName", "oscar64.exe" VALUE "LegalCopyright", "Copyright (C) 2021" VALUE "OriginalFilename", "oscar64.exe" VALUE "ProductName", "oscar64" - VALUE "ProductVersion", "1.7.150.0" + VALUE "ProductVersion", "1.8.151.0" END END BLOCK "VarFileInfo" diff --git a/oscar64setup/oscar64setup.vdproj b/oscar64setup/oscar64setup.vdproj index e02615d..cc647f6 100644 --- a/oscar64setup/oscar64setup.vdproj +++ b/oscar64setup/oscar64setup.vdproj @@ -34,6 +34,12 @@ } "Entry" { + "MsmKey" = "8:_03D7013B0D39A89CEA9D267005ADCE39" + "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_04ABABC55200450383686DD782DD1548" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -154,6 +160,12 @@ } "Entry" { + "MsmKey" = "8:_2CA3A525072974368303677563606FFE" + "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_2D828D0247F144CDB0112B2AD4004C2C" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -214,6 +226,12 @@ } "Entry" { + "MsmKey" = "8:_3FA71395262A4AB4A1C2839FD6B91190" + "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_3FFD08277B804985BDF072C0C1877287" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -388,12 +406,24 @@ } "Entry" { + "MsmKey" = "8:_777CE896BB0B3C09C1B5FB6CB3BFE84F" + "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_79985361F09A43299E258E1A8E5ED934" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" } "Entry" { + "MsmKey" = "8:_7A40466D5E5D2D3FD71213A0C0AA5075" + "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_7A9E700FC438425580655F7C1BC07FD3" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -604,6 +634,12 @@ } "Entry" { + "MsmKey" = "8:_B2B920A649CF4027457BBAB004078A03" + "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_B2F1B217D45A434DBA8EC21095F4D717" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -784,6 +820,18 @@ } "Entry" { + "MsmKey" = "8:_DC9FDF52011EB7C47318682BA0B3F26F" + "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { + "MsmKey" = "8:_DE2BF7C92569053E7C3DCE88AB7E2566" + "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_DEADBEA270134B77800770802B21859C" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -844,6 +892,12 @@ } "Entry" { + "MsmKey" = "8:_EA3C0BCB01F2639DFA2E37EC8436E5F6" + "OwnerKey" = "8:_FB2E467BC172457785F4279BB0BFE8B6" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_ED872D39D58443D590B7C80604BC0FF4" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -1055,6 +1109,26 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_03D7013B0D39A89CEA9D267005ADCE39" + { + "SourcePath" = "8:VCRUNTIME140.dll" + "TargetName" = "8:VCRUNTIME140.dll" + "Tag" = "8:" + "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_04ABABC55200450383686DD782DD1548" { "SourcePath" = "8:..\\samples\\games\\lander.c" @@ -1455,6 +1529,26 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_2CA3A525072974368303677563606FFE" + { + "SourcePath" = "8:api-ms-win-crt-heap-l1-1-0.dll" + "TargetName" = "8:api-ms-win-crt-heap-l1-1-0.dll" + "Tag" = "8:" + "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_2D828D0247F144CDB0112B2AD4004C2C" { "SourcePath" = "8:..\\samples\\scrolling\\tunnel.c" @@ -1655,6 +1749,26 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3FA71395262A4AB4A1C2839FD6B91190" + { + "SourcePath" = "8:api-ms-win-crt-stdio-l1-1-0.dll" + "TargetName" = "8:api-ms-win-crt-stdio-l1-1-0.dll" + "Tag" = "8:" + "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3FFD08277B804985BDF072C0C1877287" { "SourcePath" = "8:..\\include\\assert.c" @@ -2235,6 +2349,26 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_777CE896BB0B3C09C1B5FB6CB3BFE84F" + { + "SourcePath" = "8:api-ms-win-crt-filesystem-l1-1-0.dll" + "TargetName" = "8:api-ms-win-crt-filesystem-l1-1-0.dll" + "Tag" = "8:" + "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_79985361F09A43299E258E1A8E5ED934" { "SourcePath" = "8:..\\include\\gfx\\mcbitmap.c" @@ -2255,6 +2389,26 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_7A40466D5E5D2D3FD71213A0C0AA5075" + { + "SourcePath" = "8:api-ms-win-crt-locale-l1-1-0.dll" + "TargetName" = "8:api-ms-win-crt-locale-l1-1-0.dll" + "Tag" = "8:" + "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_7A9E700FC438425580655F7C1BC07FD3" { "SourcePath" = "8:..\\samples\\rasterirq\\textcrawler.c" @@ -2955,6 +3109,26 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B2B920A649CF4027457BBAB004078A03" + { + "SourcePath" = "8:api-ms-win-crt-math-l1-1-0.dll" + "TargetName" = "8:api-ms-win-crt-math-l1-1-0.dll" + "Tag" = "8:" + "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_B2F1B217D45A434DBA8EC21095F4D717" { "SourcePath" = "8:..\\samples\\memmap\\charsetload.c" @@ -3555,6 +3729,46 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DC9FDF52011EB7C47318682BA0B3F26F" + { + "SourcePath" = "8:api-ms-win-crt-string-l1-1-0.dll" + "TargetName" = "8:api-ms-win-crt-string-l1-1-0.dll" + "Tag" = "8:" + "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DE2BF7C92569053E7C3DCE88AB7E2566" + { + "SourcePath" = "8:api-ms-win-crt-runtime-l1-1-0.dll" + "TargetName" = "8:api-ms-win-crt-runtime-l1-1-0.dll" + "Tag" = "8:" + "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DEADBEA270134B77800770802B21859C" { "SourcePath" = "8:..\\samples\\games\\connectfour.c" @@ -3755,6 +3969,26 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_EA3C0BCB01F2639DFA2E37EC8436E5F6" + { + "SourcePath" = "8:VERSION.dll" + "TargetName" = "8:VERSION.dll" + "Tag" = "8:" + "Folder" = "8:_607E75AF0E2A4CB9908C4C39DF8FE6E4" + "Condition" = "8:" + "Transitive" = "11:FALSE" + "Vital" = "11:TRUE" + "ReadOnly" = "11:FALSE" + "Hidden" = "11:FALSE" + "System" = "11:FALSE" + "Permanent" = "11:FALSE" + "SharedLegacy" = "11:FALSE" + "PackageAs" = "3:1" + "Register" = "3:1" + "Exclude" = "11:FALSE" + "IsDependency" = "11:TRUE" + "IsolateTo" = "8:" + } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_ED872D39D58443D590B7C80604BC0FF4" { "SourcePath" = "8:..\\samples\\kernalio\\fileread.c" @@ -4231,15 +4465,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:oscar64" - "ProductCode" = "8:{CC0139D2-24F8-4A28-B4B8-E9FA10C912BF}" - "PackageCode" = "8:{0F10381E-B5C0-4E70-B759-DEED3A7827B8}" + "ProductCode" = "8:{60655505-5C36-4E87-9F18-A96853C16275}" + "PackageCode" = "8:{030FE9E0-9DAD-4D51-BE92-E5CF0A3CE014}" "UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}" "AspNetVersion" = "8:2.0.50727.0" "RestartWWWService" = "11:FALSE" "RemovePreviousVersions" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE" "InstallAllUsers" = "11:FALSE" - "ProductVersion" = "8:1.7.150" + "ProductVersion" = "8:1.8.151" "Manufacturer" = "8:oscar64" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:"