Add regions replicated in multiple easyflash banks

This commit is contained in:
drmortalwombat 2022-02-07 18:04:17 +01:00
parent a5d5060048
commit 2f009f129e
14 changed files with 312 additions and 51 deletions

View File

@ -197,9 +197,15 @@ bool Compiler::GenerateCode(void)
{ {
Declaration* dec = mCompilationUnits->mReferenced[i]; Declaration* dec = mCompilationUnits->mReferenced[i];
if (dec->mType == DT_CONST_FUNCTION) if (dec->mType == DT_CONST_FUNCTION)
mInterCodeGenerator->TranslateProcedure(mInterCodeModule, dec->mValue, dec); {
if (!dec->mLinkerObject)
mInterCodeGenerator->TranslateProcedure(mInterCodeModule, dec->mValue, dec);
}
else else
mInterCodeGenerator->InitGlobalVariable(mInterCodeModule, dec); {
if (!dec->mLinkerObject)
mInterCodeGenerator->InitGlobalVariable(mInterCodeModule, dec);
}
} }
if (mErrors->mErrorCount != 0) if (mErrors->mErrorCount != 0)

View File

@ -59,7 +59,7 @@ const char* ByteCodeDisassembler::AddrName(int addr, char* buffer, Linker* linke
return buffer; 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"); fprintf(file, "--------------------------------------------------------------------\n");
if (proc && proc->mIdent) 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); ByteCode bc = ByteCode(memory[start + i] / 2);
if (bank)
fprintf(file, "%02x:", bank);
fprintf(file, "%04x:\t", start + i); fprintf(file, "%04x:\t", start + i);
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"); fprintf(file, "--------------------------------------------------------------------\n");
if (proc && proc->mIdent) 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 (lobj->mSection->mType == LST_BSS)
{ {
if (bank)
fprintf(file, "%02x:", bank);
fprintf(file, "%04x : __ __ __ BSS\t%d\n", start, size); fprintf(file, "%04x : __ __ __ BSS\t%d\n", start, size);
} }
else else
@ -626,6 +632,9 @@ void NativeCodeDisassembler::DumpMemory(FILE* file, const uint8* memory, int sta
if (ip + n > start + size) if (ip + n > start + size)
n = start + size - ip; n = start + size - ip;
if (bank)
fprintf(file, "%02x:", bank);
fprintf(file, "%04x : __ __ __ BYT", ip); fprintf(file, "%04x : __ __ __ BYT", ip);
for (int i = 0; i < n; i++) 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"); fprintf(file, "--------------------------------------------------------------------\n");
if (proc && proc->mIdent) if (proc && proc->mIdent)
@ -666,6 +675,9 @@ void NativeCodeDisassembler::Disassemble(FILE* file, const uint8* memory, int st
AsmInsData d = DecInsData[opcode]; AsmInsData d = DecInsData[opcode];
int addr = 0; int addr = 0;
if (bank)
fprintf(file, "%02x:", bank);
switch (d.mMode) switch (d.mMode)
{ {
case ASMIM_IMPLIED: case ASMIM_IMPLIED:

View File

@ -15,7 +15,7 @@ public:
ByteCodeDisassembler(void); ByteCodeDisassembler(void);
~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: protected:
const char* TempName(uint8 tmp, char* buffer, InterCodeProcedure* proc); const char* TempName(uint8 tmp, char* buffer, InterCodeProcedure* proc);
const char* AddrName(int addr, char* buffer, Linker* linker); const char* AddrName(int addr, char* buffer, Linker* linker);
@ -27,8 +27,8 @@ public:
NativeCodeDisassembler(void); NativeCodeDisassembler(void);
~NativeCodeDisassembler(void); ~NativeCodeDisassembler(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);
void DumpMemory(FILE* file, const uint8* memory, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker* linker, LinkerObject * lobj); void DumpMemory(FILE* file, const uint8* memory, int bank, int start, int size, InterCodeProcedure* proc, const Ident* ident, Linker* linker, LinkerObject * lobj);
protected: protected:
const char* TempName(uint8 tmp, char* buffer, InterCodeProcedure* proc); const char* TempName(uint8 tmp, char* buffer, InterCodeProcedure* proc);
const char* AddrName(int addr, char* buffer, Linker* linker); const char* AddrName(int addr, char* buffer, Linker* linker);

View File

@ -40,14 +40,14 @@ void GlobalAnalyzer::DumpCallGraph(void)
for (int j = 0; j < decs.Size(); j++) for (int j = 0; j < decs.Size(); j++)
{ {
if (decs[j]->mType == DT_CONST_FUNCTION) 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 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 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 );
} }
} }
} }

View File

@ -68,7 +68,7 @@ LinkerRegion* Linker::AddRegion(const Ident* region, int start, int end)
lrgn->mEnd = end; lrgn->mEnd = end;
lrgn->mUsed = 0; lrgn->mUsed = 0;
lrgn->mNonzero = 0; lrgn->mNonzero = 0;
lrgn->mCartridge = -1; lrgn->mCartridgeBanks = 0;
lrgn->mFlags = 0; lrgn->mFlags = 0;
mRegions.Push(lrgn); mRegions.Push(lrgn);
return lrgn; return lrgn;
@ -346,10 +346,16 @@ void Linker::Link(void)
{ {
if (!obj->mRegion) if (!obj->mRegion)
mErrors->Error(obj->mLocation, ERRR_INSUFFICIENT_MEMORY, "Could not place object", obj->mIdent->mString); 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; for (int i = 0; i < 64; i++)
memcpy(mCartridge[obj->mRegion->mCartridge] + obj->mAddress - 0x8000, obj->mData, obj->mSize); {
if (obj->mRegion->mCartridgeBanks & (1ULL << i))
{
mCartridgeBankUsed[i] = true;
memcpy(mCartridge[i] + obj->mAddress - 0x8000, obj->mData, obj->mSize);
}
}
} }
else else
{ {
@ -371,22 +377,42 @@ void Linker::Link(void)
int raddr = robj->mRefAddress + ref->mRefOffset; int raddr = robj->mRefAddress + ref->mRefOffset;
uint8* dp; uint8* dp;
if (obj->mRegion->mCartridge < 0) if (obj->mRegion->mCartridgeBanks)
dp = mMemory + obj->mAddress + ref->mOffset; {
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 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) switch (obj->mType)
{ {
case LOT_BYTE_CODE: 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; break;
case LOT_NATIVE_CODE: case LOT_NATIVE_CODE:
if (obj->mRegion->mCartridge < 0) if (obj->mRegion->mCartridgeBanks)
mNativeDisassembler.Disassemble(file, mMemory, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this); {
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 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; break;
case LOT_DATA: case LOT_DATA:
if (obj->mRegion->mCartridge < 0) if (obj->mRegion->mCartridgeBanks)
mNativeDisassembler.DumpMemory(file, mMemory, obj->mAddress, obj->mSize, obj->mProc, obj->mIdent, this, obj); {
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 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;
} }
} }
} }

View File

@ -71,7 +71,7 @@ public:
uint32 mFlags; uint32 mFlags;
int mStart, mEnd, mUsed, mNonzero, mReloc; int mStart, mEnd, mUsed, mNonzero, mReloc;
int mCartridge; uint64 mCartridgeBanks;
GrowingArray<LinkerSection*> mSections; GrowingArray<LinkerSection*> mSections;

View File

@ -3159,7 +3159,8 @@ void Parser::ParsePragma(void)
mScanner->NextToken(); mScanner->NextToken();
Expression* exp; Expression* exp;
int start = 0, end = 0, flags = 0, bank = -1; int start = 0, end = 0, flags = 0;
uint64 bank = 0;
ConsumeToken(TK_COMMA); ConsumeToken(TK_COMMA);
@ -3192,11 +3193,30 @@ void Parser::ParsePragma(void)
if (mScanner->mToken != TK_COMMA) if (mScanner->mToken != TK_COMMA)
{ {
exp = ParseRExpression(); if (mScanner->mToken == TK_OPEN_BRACE)
if (exp->mType == EX_CONSTANT && exp->mDecValue->mType == DT_CONST_INTEGER) {
bank = exp->mDecValue->mInteger; 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 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); 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"); mErrors->Error(mScanner->mLocation, EERR_PRAGMA_PARAMETER, "Conflicting linker region definition");
rgn->mFlags = flags; rgn->mFlags = flags;
rgn->mCartridge = bank; rgn->mCartridgeBanks = bank;
ConsumeToken(TK_COMMA); ConsumeToken(TK_COMMA);
ConsumeToken(TK_OPEN_BRACE); ConsumeToken(TK_OPEN_BRACE);

View File

@ -73,7 +73,7 @@ int main2(int argc, const char** argv)
#else #else
strcpy(strProductName, "oscar64"); strcpy(strProductName, "oscar64");
strcpy(strProductVersion, "1.4.84"); strcpy(strProductVersion, "1.4.87");
#ifdef __APPLE__ #ifdef __APPLE__
uint32_t length = sizeof(basePath); uint32_t length = sizeof(basePath);

View File

@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_NEUTRAL
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,4,84,0 FILEVERSION 1,4,87,0
PRODUCTVERSION 1,4,84,0 PRODUCTVERSION 1,4,87,0
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
FILEFLAGS 0x1L FILEFLAGS 0x1L
@ -43,12 +43,12 @@ BEGIN
BEGIN BEGIN
VALUE "CompanyName", "oscar64" VALUE "CompanyName", "oscar64"
VALUE "FileDescription", "oscar64 compiler" VALUE "FileDescription", "oscar64 compiler"
VALUE "FileVersion", "1.4.84.0" VALUE "FileVersion", "1.4.87.0"
VALUE "InternalName", "oscar64.exe" VALUE "InternalName", "oscar64.exe"
VALUE "LegalCopyright", "Copyright (C) 2021" VALUE "LegalCopyright", "Copyright (C) 2021"
VALUE "OriginalFilename", "oscar64.exe" VALUE "OriginalFilename", "oscar64.exe"
VALUE "ProductName", "oscar64" VALUE "ProductName", "oscar64"
VALUE "ProductVersion", "1.4.84.0" VALUE "ProductVersion", "1.4.87.0"
END END
END END
BLOCK "VarFileInfo" BLOCK "VarFileInfo"

View File

@ -538,6 +538,12 @@
} }
"Entry" "Entry"
{ {
"MsmKey" = "8:_AB5120799C684496B5E81A4212BD54D4"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_AB90D0DCB4E044348BCCD9054215278F" "MsmKey" = "8:_AB90D0DCB4E044348BCCD9054215278F"
"OwnerKey" = "8:_UNDEFINED" "OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED" "MsmSig" = "8:_UNDEFINED"
@ -2657,6 +2663,26 @@
"IsDependency" = "11:FALSE" "IsDependency" = "11:FALSE"
"IsolateTo" = "8:" "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" "{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_AB90D0DCB4E044348BCCD9054215278F"
{ {
"SourcePath" = "8:..\\samples\\memmap\\charsetcopy.c" "SourcePath" = "8:..\\samples\\memmap\\charsetcopy.c"
@ -3882,15 +3908,15 @@
{ {
"Name" = "8:Microsoft Visual Studio" "Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:oscar64" "ProductName" = "8:oscar64"
"ProductCode" = "8:{A0C4446A-49BE-4F87-9DD2-AE08FDB6A4AF}" "ProductCode" = "8:{FDFDB1FC-D1CF-4D8C-BED7-6E0B594D9039}"
"PackageCode" = "8:{F280BCCE-9142-4B81-93B8-454DCA640E4E}" "PackageCode" = "8:{9620B37A-E865-4915-8CA3-99394FD90E25}"
"UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}" "UpgradeCode" = "8:{9AB61EFF-ACAC-4079-9950-8D96615CD4EF}"
"AspNetVersion" = "8:2.0.50727.0" "AspNetVersion" = "8:2.0.50727.0"
"RestartWWWService" = "11:FALSE" "RestartWWWService" = "11:FALSE"
"RemovePreviousVersions" = "11:TRUE" "RemovePreviousVersions" = "11:TRUE"
"DetectNewerInstalledVersion" = "11:TRUE" "DetectNewerInstalledVersion" = "11:TRUE"
"InstallAllUsers" = "11:FALSE" "InstallAllUsers" = "11:FALSE"
"ProductVersion" = "8:1.4.84" "ProductVersion" = "8:1.4.87"
"Manufacturer" = "8:oscar64" "Manufacturer" = "8:oscar64"
"ARPHELPTELEPHONE" = "8:" "ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:" "ARPHELPLINK" = "8:"

View File

@ -246,7 +246,7 @@ void ball_loop(Ball * ball)
if (iy + 6 > 190 && iy < 190) if (iy + 6 > 190 && iy < 190)
{ {
if (ix + 3 >= px && ix + 3 < px + 48) if (ix + 5 >= px && ix < px + 48)
{ {
mirrorY = true; mirrorY = true;
if (ix < px && ball->vx > 0) if (ix < px && ball->vx > 0)

View File

@ -6,4 +6,5 @@
../../bin/oscar64 charsetcopy.c ../../bin/oscar64 charsetcopy.c
../../bin/oscar64 easyflash.c -n -tf=crt ../../bin/oscar64 easyflash.c -n -tf=crt
../../bin/oscar64 easyflashreloc.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 ../../bin/oscar64 tsr.c -n -dNOFLOAT -dNOLONG

View File

@ -0,0 +1,158 @@
#include <c64/memmap.h>
#include <c64/charwin.h>
#include <c64/cia.h>
#include <c64/vic.h>
#include <c64/easyflash.h>
// 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;
}

View File

@ -5,4 +5,5 @@ call ..\..\bin\oscar64 charsethi.c
call ..\..\bin\oscar64 charsetcopy.c call ..\..\bin\oscar64 charsetcopy.c
call ..\..\bin\oscar64 easyflash.c -n -tf=crt call ..\..\bin\oscar64 easyflash.c -n -tf=crt
call ..\..\bin\oscar64 easyflashreloc.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 call ..\..\bin\oscar64 tsr.c -n -dNOFLOAT -dNOLONG