From 1c1d7fefaa1accdd4558e03e9fabcd24267e28db Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Sat, 6 Jan 2024 09:09:52 +0100 Subject: [PATCH] Add c128e target machine --- include/c128/mmu.c | 7 +++++++ include/conio.c | 4 +++- include/conio.h | 2 +- include/crt.c | 3 +++ include/stdio.c | 31 ++++++++++++++++++++----------- oscar64/Compiler.cpp | 8 ++++++++ oscar64/CompilerTypes.h | 1 + oscar64/oscar64.cpp | 6 ++++++ 8 files changed, 49 insertions(+), 13 deletions(-) diff --git a/include/c128/mmu.c b/include/c128/mmu.c index 84cfba0..6239f10 100644 --- a/include/c128/mmu.c +++ b/include/c128/mmu.c @@ -1 +1,8 @@ #include "mmu.h" + +inline char mmu_set(char cr) +{ + char pcr = mmu.cr; + mmu.cr = cr; + return pcr; +} diff --git a/include/conio.c b/include/conio.c index 6b4b008..4d0e198 100644 --- a/include/conio.c +++ b/include/conio.c @@ -39,6 +39,8 @@ __asm dswap sta 0xff01 } #pragma code(code) +#elif defined(__C128B__) || defined(__C128E__) +#define dswap 0xff5f #elif defined(__PLUS4__) #pragma code(lowcode) __asm bsout @@ -100,7 +102,7 @@ __asm bsinit #define bsinit 0xff81 #endif -#if defined(__C128__) +#if defined(__C128__) || defined(__C128B__) || defined(__C128E__) void dispmode40col(void) { if (*(volatile char *)0xd7 >= 128) diff --git a/include/conio.h b/include/conio.h index 90d4251..59fc634 100644 --- a/include/conio.h +++ b/include/conio.h @@ -18,7 +18,7 @@ extern IOCharMap giocharmap; void iocharmap(IOCharMap chmap); -#if defined(__C128__) +#if defined(__C128__) || defined(__C128B__) || defined(__C128E__) void dispmode40col(void); void dispmode80col(void); #endif diff --git a/include/crt.c b/include/crt.c index 67f6877..1327d72 100644 --- a/include/crt.c +++ b/include/crt.c @@ -211,6 +211,9 @@ w0: #if defined(__C128__) sta 0xff01 +#elif defined(__C128E__) + lda #$0e + sta 0xff00 #elif defined(__PLUS4__) lda # 0 && cs > 0 && !isspace(cs)) @@ -1104,6 +1112,7 @@ int fpscanf(const char * fmt, int (* ffunc)(void * p), void * fparam, void ** pa } break; case 'c': + case p'c': { char * pch = (char *)*params; if (!ignore) diff --git a/oscar64/Compiler.cpp b/oscar64/Compiler.cpp index c0c24df..ac8841d 100644 --- a/oscar64/Compiler.cpp +++ b/oscar64/Compiler.cpp @@ -542,6 +542,7 @@ bool Compiler::GenerateCode(void) regionLowcode->mSections.Push(mCompilationUnits->mSectionLowCode); break; case TMACH_C128B: + case TMACH_C128E: if (mCompilerOptions & COPT_NATIVE) regionStartup = mLinker->AddRegion(identStartup, 0x1c01, 0x1c80); else @@ -628,6 +629,7 @@ bool Compiler::GenerateCode(void) break; case TMACH_C128: case TMACH_C128B: + case TMACH_C128E: regionBytecode = mLinker->AddRegion(identBytecode, 0x1d00, 0x1e00); break; case TMACH_PLUS4: @@ -692,6 +694,9 @@ bool Compiler::GenerateCode(void) case TMACH_C128B: regionMain = mLinker->AddRegion(identMain, 0x1e00, 0x4000); break; + case TMACH_C128E: + regionMain = mLinker->AddRegion(identMain, 0x1e00, 0xc000); + break; case TMACH_PLUS4: regionMain = mLinker->AddRegion(identMain, 0x1200, 0xfc00); break; @@ -744,6 +749,9 @@ bool Compiler::GenerateCode(void) case TMACH_C128B: regionMain = mLinker->AddRegion(identMain, 0x1c80, 0x4000); break; + case TMACH_C128E: + regionMain = mLinker->AddRegion(identMain, 0x1c80, 0xc000); + break; case TMACH_PLUS4: regionMain = mLinker->AddRegion(identMain, 0x1100, 0xfc00); break; diff --git a/oscar64/CompilerTypes.h b/oscar64/CompilerTypes.h index 79b8fc5..60efb65 100644 --- a/oscar64/CompilerTypes.h +++ b/oscar64/CompilerTypes.h @@ -61,6 +61,7 @@ enum TargetMachine TMACH_VIC20_24K, TMACH_C128, TMACH_C128B, + TMACH_C128E, TMACH_PET_8K, TMACH_PET_16K, TMACH_PET_32K, diff --git a/oscar64/oscar64.cpp b/oscar64/oscar64.cpp index 3e1a2a9..7594484 100644 --- a/oscar64/oscar64.cpp +++ b/oscar64/oscar64.cpp @@ -303,6 +303,12 @@ int main2(int argc, const char** argv) compiler->mTargetMachine = TMACH_C128B; compiler->AddDefine(Ident::Unique("__C128B__"), "1"); } + else if (!strcmp(targetMachine, "c128e")) + { + strcpy_s(basicStart, "0x1c01"); + compiler->mTargetMachine = TMACH_C128E; + compiler->AddDefine(Ident::Unique("__C128E__"), "1"); + } else if (!strcmp(targetMachine, "vic20")) { strcpy_s(basicStart, "0x1001");