diff --git a/README.md b/README.md index 1227d3a..728fe8d 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,7 @@ A list of source files can be provided. * nes_mmc1 : Nintendo entertainment system, MMC1, 256K PROM, 128K CROM * nes_mmc3 : Nintendo entertainment system, MMC3, 512K PROM, 256K CROM * atari : Atari 8bit systems, (0x2000..0xbc00) +* x16 : Commander X16, (0x0800..0x9f00) ### Files generated diff --git a/include/time.c b/include/time.c index 820e139..07986cd 100644 --- a/include/time.c +++ b/include/time.c @@ -35,7 +35,13 @@ loop: sty accu + 2 lda #0 sta accu + 3 - +#elif defined(__X16__) + jsr $ffde + sta accu + 0 + stx accu + 1 + sty accu + 2 + lda #0 + sta accu + 3 #else lda $a2 sta accu + 0 diff --git a/oscar64/Compiler.cpp b/oscar64/Compiler.cpp index 690df10..91d3774 100644 --- a/oscar64/Compiler.cpp +++ b/oscar64/Compiler.cpp @@ -67,6 +67,22 @@ bool Compiler::ParseSource(void) BC_REG_TMP = 0xa5; BC_REG_TMP_SAVED = 0xc5; } + else if (mTargetMachine == TMACH_X16) + { + BC_REG_WORK_Y = 0x22; + BC_REG_WORK = 0x23; + BC_REG_FPARAMS = 0x2d; + BC_REG_FPARAMS_END = 0x39; + + BC_REG_IP = 0x39; + BC_REG_ACCU = 0x3b; + BC_REG_ADDR = 0x3f; + BC_REG_STACK = 0x43; + BC_REG_LOCALS = 0x45; + + BC_REG_TMP = 0x47; + BC_REG_TMP_SAVED = 0x67; + } else if (mCompilerOptions & COPT_EXTENDED_ZERO_PAGE) { BC_REG_FPARAMS = 0x0d; @@ -95,6 +111,7 @@ bool Compiler::ParseSource(void) case TMACH_PET_16K: case TMACH_VIC20_16K: case TMACH_VIC20_24K: + case TMACH_X16: mCompilationUnits->mSectionStack->mSize = 1024; mCompilationUnits->mSectionHeap->mSize = 1024; break; @@ -248,6 +265,7 @@ bool Compiler::GenerateCode(void) switch (mTargetMachine) { case TMACH_C64: + case TMACH_X16: if (mCompilerOptions & COPT_NATIVE) regionStartup = mLinker->AddRegion(identStartup, 0x0801, 0x0880); else @@ -343,6 +361,7 @@ bool Compiler::GenerateCode(void) switch (mTargetMachine) { case TMACH_C64: + case TMACH_X16: regionBytecode = mLinker->AddRegion(identBytecode, 0x0900, 0x0a00); break; case TMACH_C128: @@ -402,6 +421,9 @@ bool Compiler::GenerateCode(void) case TMACH_C64: regionMain = mLinker->AddRegion(identMain, 0x0a00, 0xa000); break; + case TMACH_X16: + regionMain = mLinker->AddRegion(identMain, 0x0a00, 0x9f00); + break; case TMACH_C128: regionMain = mLinker->AddRegion(identMain, 0x1e00, 0xfe00); break; @@ -447,6 +469,9 @@ bool Compiler::GenerateCode(void) case TMACH_C64: regionMain = mLinker->AddRegion(identMain, 0x0880, 0xa000); break; + case TMACH_X16: + regionMain = mLinker->AddRegion(identMain, 0x0880, 0x9f00); + break; case TMACH_C128: regionMain = mLinker->AddRegion(identMain, 0x1d00, 0xfe00); break; diff --git a/oscar64/CompilerTypes.h b/oscar64/CompilerTypes.h index 415c74b..3066de6 100644 --- a/oscar64/CompilerTypes.h +++ b/oscar64/CompilerTypes.h @@ -58,7 +58,8 @@ enum TargetMachine TMACH_NES_NROM_V, TMACH_NES_MMC1, TMACH_NES_MMC3, - TMACH_ATARI + TMACH_ATARI, + TMACH_X16 }; diff --git a/oscar64/oscar64.cpp b/oscar64/oscar64.cpp index a7704fd..f356af9 100644 --- a/oscar64/oscar64.cpp +++ b/oscar64/oscar64.cpp @@ -308,6 +308,12 @@ int main2(int argc, const char** argv) compiler->mTargetMachine = TMACH_PLUS4; compiler->AddDefine(Ident::Unique("__PLUS4__"), "1"); } + else if (!strcmp(targetMachine, "x16")) + { + strcpy_s(basicStart, "0x0801"); + compiler->mTargetMachine = TMACH_X16; + compiler->AddDefine(Ident::Unique("__X16__"), "1"); + } else if (!strcmp(targetMachine, "nes")) { compiler->mTargetMachine = TMACH_NES;