diff --git a/oscar64/Compiler.cpp b/oscar64/Compiler.cpp index 5391a31..ccd4bc0 100644 --- a/oscar64/Compiler.cpp +++ b/oscar64/Compiler.cpp @@ -197,9 +197,15 @@ bool Compiler::GenerateCode(void) { Declaration* dec = mCompilationUnits->mReferenced[i]; if (dec->mType == DT_CONST_FUNCTION) - mInterCodeGenerator->TranslateProcedure(mInterCodeModule, dec->mValue, dec); + { + if (!dec->mLinkerObject) + mInterCodeGenerator->TranslateProcedure(mInterCodeModule, dec->mValue, dec); + } else - mInterCodeGenerator->InitGlobalVariable(mInterCodeModule, dec); + { + if (!dec->mLinkerObject) + mInterCodeGenerator->InitGlobalVariable(mInterCodeModule, dec); + } } if (mErrors->mErrorCount != 0) diff --git a/oscar64/Disassembler.cpp b/oscar64/Disassembler.cpp index 71b431b..cdf8766 100644 --- a/oscar64/Disassembler.cpp +++ b/oscar64/Disassembler.cpp @@ -59,7 +59,7 @@ const char* ByteCodeDisassembler::AddrName(int addr, char* buffer, Linker* linke return buffer; } -void ByteCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker* linker) +void ByteCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int bank, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker* linker) { fprintf(file, "--------------------------------------------------------------------\n"); if (proc && proc->mIdent) @@ -77,6 +77,9 @@ void ByteCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int star { ByteCode bc = ByteCode(memory[start + i] / 2); + if (bank) + fprintf(file, "%02x:", bank); + fprintf(file, "%04x:\t", start + i); i++; @@ -603,7 +606,7 @@ NativeCodeDisassembler::~NativeCodeDisassembler(void) } -void NativeCodeDisassembler::DumpMemory(FILE* file, const uint8* memory, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker* linker, LinkerObject * lobj) +void NativeCodeDisassembler::DumpMemory(FILE* file, const uint8* memory, int bank, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker* linker, LinkerObject * lobj) { fprintf(file, "--------------------------------------------------------------------\n"); if (proc && proc->mIdent) @@ -615,6 +618,9 @@ void NativeCodeDisassembler::DumpMemory(FILE* file, const uint8* memory, int sta if (lobj->mSection->mType == LST_BSS) { + if (bank) + fprintf(file, "%02x:", bank); + fprintf(file, "%04x : __ __ __ BSS\t%d\n", start, size); } else @@ -626,6 +632,9 @@ void NativeCodeDisassembler::DumpMemory(FILE* file, const uint8* memory, int sta if (ip + n > start + size) n = start + size - ip; + if (bank) + fprintf(file, "%02x:", bank); + fprintf(file, "%04x : __ __ __ BYT", ip); for (int i = 0; i < n; i++) @@ -648,7 +657,7 @@ void NativeCodeDisassembler::DumpMemory(FILE* file, const uint8* memory, int sta } } -void NativeCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int start, int size, InterCodeProcedure* proc, const Ident * ident, Linker* linker) +void NativeCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int bank, int start, int size, InterCodeProcedure* proc, const Ident * ident, Linker* linker) { fprintf(file, "--------------------------------------------------------------------\n"); if (proc && proc->mIdent) @@ -666,6 +675,9 @@ void NativeCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int st AsmInsData d = DecInsData[opcode]; int addr = 0; + if (bank) + fprintf(file, "%02x:", bank); + switch (d.mMode) { case ASMIM_IMPLIED: diff --git a/oscar64/Disassembler.h b/oscar64/Disassembler.h index 460a5c4..2721a91 100644 --- a/oscar64/Disassembler.h +++ b/oscar64/Disassembler.h @@ -15,7 +15,7 @@ public: ByteCodeDisassembler(void); ~ByteCodeDisassembler(void); - void Disassemble(FILE* file, const uint8* memory, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker * linker); + void Disassemble(FILE* file, const uint8* memory, int bank, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker * linker); protected: const char* TempName(uint8 tmp, char* buffer, InterCodeProcedure* proc); const char* AddrName(int addr, char* buffer, Linker* linker); @@ -27,8 +27,8 @@ public: NativeCodeDisassembler(void); ~NativeCodeDisassembler(void); - void Disassemble(FILE* file, const uint8* memory, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker* linker); - void DumpMemory(FILE* file, const uint8* memory, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker* linker, LinkerObject * lobj); + void Disassemble(FILE* file, const uint8* memory, int bank, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker* linker); + void DumpMemory(FILE* file, const uint8* memory, int bank, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker* linker, LinkerObject * lobj); protected: const char* TempName(uint8 tmp, char* buffer, InterCodeProcedure* proc); const char* AddrName(int addr, char* buffer, Linker* linker); diff --git a/oscar64/GlobalAnalyzer.cpp b/oscar64/GlobalAnalyzer.cpp index beb7857..de4e52a 100644 --- a/oscar64/GlobalAnalyzer.cpp +++ b/oscar64/GlobalAnalyzer.cpp @@ -40,14 +40,14 @@ void GlobalAnalyzer::DumpCallGraph(void) for (int j = 0; j < decs.Size(); j++) { if (decs[j]->mType == DT_CONST_FUNCTION) - printf("CALL %s[%d, %08x] -> %d -> %s[%d, %08x]\n", from->mIdent->mString, from->mComplexity, from->mFlags, calls[j], decs[j]->mIdent->mString, decs[j]->mComplexity, decs[j]->mFlags); + printf("CALL %s[%d, %08llx] -> %d -> %s[%d, %08llx]\n", from->mIdent->mString, from->mComplexity, from->mFlags, calls[j], decs[j]->mIdent->mString, decs[j]->mComplexity, decs[j]->mFlags); else - printf("CALL %s[%d, %08x] -> %d\n", from->mIdent->mString, from->mComplexity, from->mFlags, calls[j]); + printf("CALL %s[%d, %08llx] -> %d\n", from->mIdent->mString, from->mComplexity, from->mFlags, calls[j]); } } else { - printf("LEAF %d -> %s[%d, %08x]\n", from->mCallers.Size(), from->mIdent->mString, from->mComplexity, from->mFlags ); + printf("LEAF %d -> %s[%d, %08llx]\n", from->mCallers.Size(), from->mIdent->mString, from->mComplexity, from->mFlags ); } } } diff --git a/oscar64/Linker.cpp b/oscar64/Linker.cpp index 2209ea2..51608ff 100644 --- a/oscar64/Linker.cpp +++ b/oscar64/Linker.cpp @@ -68,7 +68,7 @@ LinkerRegion* Linker::AddRegion(const Ident* region, int start, int end) lrgn->mEnd = end; lrgn->mUsed = 0; lrgn->mNonzero = 0; - lrgn->mCartridge = -1; + lrgn->mCartridgeBanks = 0; lrgn->mFlags = 0; mRegions.Push(lrgn); return lrgn; @@ -346,10 +346,16 @@ void Linker::Link(void) { if (!obj->mRegion) mErrors->Error(obj->mLocation, ERRR_INSUFFICIENT_MEMORY, "Could not place object", obj->mIdent->mString); - else if (obj->mRegion->mCartridge >= 0) + else if (obj->mRegion->mCartridgeBanks != 0) { - mCartridgeBankUsed[obj->mRegion->mCartridge] = true; - memcpy(mCartridge[obj->mRegion->mCartridge] + obj->mAddress - 0x8000, obj->mData, obj->mSize); + for (int i = 0; i < 64; i++) + { + if (obj->mRegion->mCartridgeBanks & (1ULL << i)) + { + mCartridgeBankUsed[i] = true; + memcpy(mCartridge[i] + obj->mAddress - 0x8000, obj->mData, obj->mSize); + } + } } else { @@ -371,22 +377,42 @@ void Linker::Link(void) int raddr = robj->mRefAddress + ref->mRefOffset; uint8* dp; - if (obj->mRegion->mCartridge < 0) - dp = mMemory + obj->mAddress + ref->mOffset; + if (obj->mRegion->mCartridgeBanks) + { + for (int i = 0; i < 64; i++) + { + if (obj->mRegion->mCartridgeBanks & (1ULL << i)) + { + dp = mCartridge[i] + obj->mAddress - 0x8000 + ref->mOffset; + + if (ref->mFlags & LREF_LOWBYTE) + { + *dp++ = raddr & 0xff; + } + if (ref->mFlags & LREF_HIGHBYTE) + { + *dp++ = (raddr >> 8) & 0xff; + } + if (ref->mFlags & LREF_TEMPORARY) + *dp += obj->mTemporaries[ref->mRefOffset]; + } + } + } else - dp = mCartridge[obj->mRegion->mCartridge] + obj->mAddress - 0x8000 + ref->mOffset; - - - if (ref->mFlags & LREF_LOWBYTE) { - *dp++ = raddr & 0xff; + dp = mMemory + obj->mAddress + ref->mOffset; + + if (ref->mFlags & LREF_LOWBYTE) + { + *dp++ = raddr & 0xff; + } + if (ref->mFlags & LREF_HIGHBYTE) + { + *dp++ = (raddr >> 8) & 0xff; + } + if (ref->mFlags & LREF_TEMPORARY) + *dp += obj->mTemporaries[ref->mRefOffset]; } - if (ref->mFlags & LREF_HIGHBYTE) - { - *dp++ = (raddr >> 8) & 0xff; - } - if (ref->mFlags & LREF_TEMPORARY) - *dp += obj->mTemporaries[ref->mRefOffset]; } } } @@ -636,19 +662,30 @@ bool Linker::WriteAsmFile(const char* filename) switch (obj->mType) { case LOT_BYTE_CODE: - mByteCodeDisassembler.Disassemble(file, mMemory, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this); + mByteCodeDisassembler.Disassemble(file, mMemory, 0, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this); break; case LOT_NATIVE_CODE: - if (obj->mRegion->mCartridge < 0) - mNativeDisassembler.Disassemble(file, mMemory, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this); + if (obj->mRegion->mCartridgeBanks) + { + int i = 0; + while (!(obj->mRegion->mCartridgeBanks & (1ULL << i))) + i++; + mNativeDisassembler.Disassemble(file, mCartridge[i] - 0x8000, i, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this); + } else - mNativeDisassembler.Disassemble(file, mCartridge[obj->mRegion->mCartridge] - 0x8000, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this); + mNativeDisassembler.Disassemble(file, mMemory, 0, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this); break; case LOT_DATA: - if (obj->mRegion->mCartridge < 0) - mNativeDisassembler.DumpMemory(file, mMemory, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this, obj); + if (obj->mRegion->mCartridgeBanks) + { + int i = 0; + while (!(obj->mRegion->mCartridgeBanks & (1ULL << i))) + i++; + mNativeDisassembler.DumpMemory(file, mCartridge[i] - 0x8000, i, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this, obj); + } else - mNativeDisassembler.DumpMemory(file, mCartridge[obj->mRegion->mCartridge] - 0x8000, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this, obj); + mNativeDisassembler.DumpMemory(file, mMemory, 0, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this, obj); + break; } } } diff --git a/oscar64/Linker.h b/oscar64/Linker.h index 19d8bc6..efbf3f8 100644 --- a/oscar64/Linker.h +++ b/oscar64/Linker.h @@ -71,7 +71,7 @@ public: uint32 mFlags; int mStart, mEnd, mUsed, mNonzero, mReloc; - int mCartridge; + uint64 mCartridgeBanks; GrowingArray mSections; diff --git a/oscar64/Parser.cpp b/oscar64/Parser.cpp index b43319a..922df17 100644 --- a/oscar64/Parser.cpp +++ b/oscar64/Parser.cpp @@ -3159,7 +3159,8 @@ void Parser::ParsePragma(void) mScanner->NextToken(); Expression* exp; - int start = 0, end = 0, flags = 0, bank = -1; + int start = 0, end = 0, flags = 0; + uint64 bank = 0; ConsumeToken(TK_COMMA); @@ -3192,11 +3193,30 @@ void Parser::ParsePragma(void) if (mScanner->mToken != TK_COMMA) { - exp = ParseRExpression(); - if (exp->mType == EX_CONSTANT && exp->mDecValue->mType == DT_CONST_INTEGER) - bank = exp->mDecValue->mInteger; + if (mScanner->mToken == TK_OPEN_BRACE) + { + do + { + mScanner->NextToken(); + + exp = ParseRExpression(); + if (exp->mType == EX_CONSTANT && exp->mDecValue->mType == DT_CONST_INTEGER) + bank |= 1ULL << exp->mDecValue->mInteger; + else + mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Integer number for bank expected"); + + } while (mScanner->mToken == TK_COMMA); + + ConsumeToken(TK_CLOSE_BRACE); + } else - mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Integer number for bank expected"); + { + exp = ParseRExpression(); + if (exp->mType == EX_CONSTANT && exp->mDecValue->mType == DT_CONST_INTEGER) + bank = 1ULL << exp->mDecValue->mInteger; + else + mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Integer number for bank expected"); + } } LinkerRegion* rgn = mCompilationUnits->mLinker->FindRegion(regionIdent); @@ -3206,7 +3226,7 @@ void Parser::ParsePragma(void) mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Conflicting linker region definition"); rgn->mFlags = flags; - rgn->mCartridge = bank; + rgn->mCartridgeBanks = bank; ConsumeToken(TK_COMMA); ConsumeToken(TK_OPEN_BRACE); diff --git a/oscar64/oscar64.cpp b/oscar64/oscar64.cpp index 0dcccab..6d939b4 100644 --- a/oscar64/oscar64.cpp +++ b/oscar64/oscar64.cpp @@ -73,7 +73,7 @@ int main2(int argc, const char** argv) #else strcpy(strProductName, "oscar64"); - strcpy(strProductVersion, "1.4.84"); + strcpy(strProductVersion, "1.4.87"); #ifdef __APPLE__ uint32_t length = sizeof(basePath); diff --git a/oscar64/oscar64.rc b/oscar64/oscar64.rc index 5466780..ad9b612 100644 --- a/oscar64/oscar64.rc +++ b/oscar64/oscar64.rc @@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL // VS_VERSION_INFO VERSIONINFO - FILEVERSION 1,4,84,0 - PRODUCTVERSION 1,4,84,0 + FILEVERSION 1,4,87,0 + PRODUCTVERSION 1,4,87,0 FILEFLAGSMASK 0x3fL #ifdef _DEBUG FILEFLAGS 0x1L @@ -43,12 +43,12 @@ BEGIN BEGIN VALUE "CompanyName", "oscar64" VALUE "FileDescription", "oscar64 compiler" - VALUE "FileVersion", "1.4.84.0" + VALUE "FileVersion", "1.4.87.0" VALUE "InternalName", "oscar64.exe" VALUE "LegalCopyright", "Copyright (C) 2021" VALUE "OriginalFilename", "oscar64.exe" VALUE "ProductName", "oscar64" - VALUE "ProductVersion", "1.4.84.0" + VALUE "ProductVersion", "1.4.87.0" END END BLOCK "VarFileInfo" diff --git a/oscar64setup/oscar64setup.vdproj b/oscar64setup/oscar64setup.vdproj index 8f72b62..5cd9105 100644 --- a/oscar64setup/oscar64setup.vdproj +++ b/oscar64setup/oscar64setup.vdproj @@ -538,6 +538,12 @@ } "Entry" { + "MsmKey" = "8:_AB5120799C684496B5E81A4212BD54D4" + "OwnerKey" = "8:_UNDEFINED" + "MsmSig" = "8:_UNDEFINED" + } + "Entry" + { "MsmKey" = "8:_AB90D0DCB4E044348BCCD9054215278F" "OwnerKey" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED" @@ -2657,6 +2663,26 @@ "IsDependency" = "11:FALSE" "IsolateTo" = "8:" } + "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_AB5120799C684496B5E81A4212BD54D4" + { + "SourcePath" = "8:..\\samples\\memmap\\easyflashshared.c" + "TargetName" = "8:easyflashshared.c" + "Tag" = "8:" + "Folder" = "8:_A62A71A6A08941C5964B90112D87731F" + "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:FALSE" + "IsolateTo" = "8:" + } "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_AB90D0DCB4E044348BCCD9054215278F" { "SourcePath" = "8:..\\samples\\memmap\\charsetcopy.c" @@ -3882,15 +3908,15 @@ { "Name" = "8:Microsoft Visual Studio" "ProductName" = "8:oscar64" - "ProductCode" = "8:{A0C4446A-49BE-4F87-9DD2-AE08FDB6A4AF}" - "PackageCode" = "8:{F280BCCE-9142-4B81-93B8-454DCA640E4E}" + "ProductCode" = "8:{FDFDB1FC-D1CF-4D8C-BED7-6E0B594D9039}" + "PackageCode" = "8:{9620B37A-E865-4915-8CA3-99394FD90E25}" "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.4.84" + "ProductVersion" = "8:1.4.87" "Manufacturer" = "8:oscar64" "ARPHELPTELEPHONE" = "8:" "ARPHELPLINK" = "8:" diff --git a/samples/games/breakout.c b/samples/games/breakout.c index 9ceef37..9131caf 100644 --- a/samples/games/breakout.c +++ b/samples/games/breakout.c @@ -246,7 +246,7 @@ void ball_loop(Ball * ball) if (iy + 6 > 190 && iy < 190) { - if (ix + 3 >= px && ix + 3 < px + 48) + if (ix + 5 >= px && ix < px + 48) { mirrorY = true; if (ix < px && ball->vx > 0) diff --git a/samples/memmap/build.sh b/samples/memmap/build.sh index 0a15861..c55e053 100644 --- a/samples/memmap/build.sh +++ b/samples/memmap/build.sh @@ -6,4 +6,5 @@ ../../bin/oscar64 charsetcopy.c ../../bin/oscar64 easyflash.c -n -tf=crt ../../bin/oscar64 easyflashreloc.c -n -tf=crt +../../bin/oscar64 easyflashshared.c -n -tf=crt ../../bin/oscar64 tsr.c -n -dNOFLOAT -dNOLONG diff --git a/samples/memmap/easyflashshared.c b/samples/memmap/easyflashshared.c new file mode 100644 index 0000000..ac215ff --- /dev/null +++ b/samples/memmap/easyflashshared.c @@ -0,0 +1,158 @@ +#include +#include +#include +#include +#include + +// Shared code/data region, copied from easyflash bank 0 to ram during startup + +#pragma region( main, 0x0900, 0x8000, , , { code, data, bss, heap, stack } ) + + +#pragma section( bcode1, 0 ) +#pragma section( bdata1, 0 ) +#pragma region(bank1, 0x8000, 0xbf00, , 1, { bcode1, bdata1 } ) + +// Section and region for second easyflash bank + +#pragma section( bcode2, 0 ) +#pragma section( bdata2, 0 ) +#pragma region(bank2, 0x8000, 0xbf00, , 2, { bcode2, bdata2 } ) + +#pragma section( bcode3, 0 ) +#pragma section( bdata3, 0 ) +#pragma region(bank3, 0x8000, 0xbf00, , 3, { bcode3, bdata3 } ) + +#pragma section( bcode4, 0 ) +#pragma section( bdata4, 0 ) +#pragma region(bank4, 0x8000, 0xbf00, , 4, { bcode4, bdata4 } ) + +#pragma section( bcode5, 0 ) +#pragma section( bdata5, 0 ) +#pragma region(bank5, 0x8000, 0xbf00, , 5, { bcode5, bdata5 } ) + +#pragma section( bcode6, 0 ) +#pragma section( bdata6, 0 ) +#pragma region(bank6, 0x8000, 0xbf00, , 6, { bcode6, bdata6 } ) + +// Charwin in shared memory section + +CharWin cw; + +// Setting up a common range + +#pragma section( ccode, 0 ) +#pragma region( cbank, 0xbf00, 0xc000, , {1, 2, 3, 4, 5, 6}, { ccode } ) + +// Code shared by all banks + +#pragma code( ccode ) + +__export void callbank(void (* fn)(void), char bank) +{ + eflash.bank = bank; + fn(); +} + +#pragma code( code ) + +// Now switch code generation to bank 1 + +#pragma code ( bcode1 ) +#pragma data ( bdata1 ) + +// Print into shared charwin + +void print1(void) +{ + cwin_put_string(&cw, p"This is first bank", 7); + cwin_cursor_newline(&cw); +} + +// Now switch code generation to bank 2 + +#pragma code ( bcode2 ) +#pragma data ( bdata2 ) + +void print2(void) +{ + cwin_put_string(&cw, p"This is second bank", 7); + cwin_cursor_newline(&cw); +} + +#pragma code ( bcode3 ) +#pragma data ( bdata3 ) + +void print3(void) +{ + cwin_put_string(&cw, p"This is third bank", 7); + cwin_cursor_newline(&cw); +} + +#pragma code ( bcode4 ) +#pragma data ( bdata4 ) + +void print4(void) +{ + cwin_put_string(&cw, p"This is fourth bank", 7); + cwin_cursor_newline(&cw); +} + +#pragma code ( bcode5 ) +#pragma data ( bdata5 ) + +void print5(void) +{ + cwin_put_string(&cw, p"This is fifth bank", 7); + cwin_cursor_newline(&cw); +} + +#pragma code ( bcode6 ) +#pragma data ( bdata6 ) + +void print6(void) +{ + cwin_put_string(&cw, p"This is sixth bank", 7); + cwin_cursor_newline(&cw); +} + +// Switching code generation back to shared section + +#pragma code ( code ) +#pragma data ( data ) + + +int main(void) +{ + // Enable ROM + mmap_set(MMAP_ROM); + + // Init CIAs (no kernal rom was executed so far) + cia_init(); + + // Init VIC + vic_setmode(VICM_TEXT, (char *)0x0400, (char *)0x1800); + + // Prepare output window + cwin_init(&cw, (char *)0x0400, 0, 0, 40, 25); + cwin_clear(&cw); + + eflash.bank = 1; + + // Call function in bank 1 + callbank(print1, 1); + + // Call function in bank 2 + callbank(print2, 2); + + callbank(print3, 3); + callbank(print4, 4); + callbank(print5, 5); + callbank(print6, 6); + + // Loop forever + while (true) + ; + + return 0; +} diff --git a/samples/memmap/make.bat b/samples/memmap/make.bat index db12e64..c3ab0ed 100644 --- a/samples/memmap/make.bat +++ b/samples/memmap/make.bat @@ -5,4 +5,5 @@ call ..\..\bin\oscar64 charsethi.c call ..\..\bin\oscar64 charsetcopy.c call ..\..\bin\oscar64 easyflash.c -n -tf=crt call ..\..\bin\oscar64 easyflashreloc.c -n -tf=crt +call ..\..\bin\oscar64 easyflashshared.c -n -tf=crt call ..\..\bin\oscar64 tsr.c -n -dNOFLOAT -dNOLONG