Add regions replicated in multiple easyflash banks
This commit is contained in:
parent
a5d5060048
commit
2f009f129e
|
@ -197,10 +197,16 @@ bool Compiler::GenerateCode(void)
|
|||
{
|
||||
Declaration* dec = mCompilationUnits->mReferenced[i];
|
||||
if (dec->mType == DT_CONST_FUNCTION)
|
||||
{
|
||||
if (!dec->mLinkerObject)
|
||||
mInterCodeGenerator->TranslateProcedure(mInterCodeModule, dec->mValue, dec);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!dec->mLinkerObject)
|
||||
mInterCodeGenerator->InitGlobalVariable(mInterCodeModule, dec);
|
||||
}
|
||||
}
|
||||
|
||||
if (mErrors->mErrorCount != 0)
|
||||
return false;
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,11 +377,13 @@ void Linker::Link(void)
|
|||
int raddr = robj->mRefAddress + ref->mRefOffset;
|
||||
uint8* dp;
|
||||
|
||||
if (obj->mRegion->mCartridge < 0)
|
||||
dp = mMemory + obj->mAddress + ref->mOffset;
|
||||
else
|
||||
dp = mCartridge[obj->mRegion->mCartridge] + obj->mAddress - 0x8000 + 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)
|
||||
{
|
||||
|
@ -390,6 +398,24 @@ void Linker::Link(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
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];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -71,7 +71,7 @@ public:
|
|||
|
||||
uint32 mFlags;
|
||||
int mStart, mEnd, mUsed, mNonzero, mReloc;
|
||||
int mCartridge;
|
||||
uint64 mCartridgeBanks;
|
||||
|
||||
GrowingArray<LinkerSection*> mSections;
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
if (mScanner->mToken == TK_OPEN_BRACE)
|
||||
{
|
||||
do
|
||||
{
|
||||
mScanner->NextToken();
|
||||
|
||||
exp = ParseRExpression();
|
||||
if (exp->mType == EX_CONSTANT && exp->mDecValue->mType == DT_CONST_INTEGER)
|
||||
bank = exp->mDecValue->mInteger;
|
||||
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
|
||||
{
|
||||
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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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:"
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue