From 759a701df890c0296902e4e4f4c08ae2b65f8993 Mon Sep 17 00:00:00 2001 From: drmortalwombat <90205530+drmortalwombat@users.noreply.github.com> Date: Fri, 30 Aug 2024 18:40:48 +0200 Subject: [PATCH] Add kernal banking for plus/4 kernalio.c --- include/c64/kernalio.c | 66 ++++++++++++++++++++++++++++++++++-------- oscar64/Compiler.cpp | 10 ++++--- 2 files changed, 60 insertions(+), 16 deletions(-) diff --git a/include/c64/kernalio.c b/include/c64/kernalio.c index 269f8b3..ff7f25c 100644 --- a/include/c64/kernalio.c +++ b/include/c64/kernalio.c @@ -16,7 +16,18 @@ void krnio_setbnk(char filebank, char namebank) #pragma native(krnio_setbnk) #endif -void krnio_setnam(const char * name) +#if defined(__PLUS4__) +#pragma code(lowcode) +#define BANKIN sta 0xff3e +#define BANKOUT sta 0xff3f +#define BANKINLINE __noinline +#else +#define BANKIN +#define BANKOUT +#define BANKINLINE +#endif + +BANKINLINE void krnio_setnam(const char * name) { __asm { @@ -31,26 +42,30 @@ void krnio_setnam(const char * name) tya W1: ldx name ldy name + 1 + BANKIN jsr $ffbd // setnam + BANKOUT } } #pragma native(krnio_setnam) -void krnio_setnam_n(const char * name, char len) +BANKINLINE void krnio_setnam_n(const char * name, char len) { __asm { lda len ldx name ldy name + 1 + BANKIN jsr $ffbd // setnam + BANKOUT } } #pragma native(krnio_setnam_n) -bool krnio_open(char fnum, char device, char channel) +BANKINLINE bool krnio_open(char fnum, char device, char channel) { krnio_pstatus[fnum] = KRNIO_OK; @@ -60,6 +75,8 @@ bool krnio_open(char fnum, char device, char channel) sta accu sta accu + 1 + BANKIN + lda fnum ldx device ldy channel @@ -74,6 +91,8 @@ bool krnio_open(char fnum, char device, char channel) W1: lda #1 sta accu + + BANKOUT E2: }; @@ -81,22 +100,26 @@ bool krnio_open(char fnum, char device, char channel) #pragma native(krnio_open) -void krnio_close(char fnum) +BANKINLINE void krnio_close(char fnum) { __asm { + BANKIN lda fnum jsr $ffc3 // close + BANKOUT } } #pragma native(krnio_close) -krnioerr krnio_status(void) +BANKINLINE krnioerr krnio_status(void) { return __asm { + BANKIN jsr $ffb7 // readst + BANKOUT sta accu lda #0 sta accu + 1 @@ -106,10 +129,11 @@ krnioerr krnio_status(void) #pragma native(krnio_status) -bool krnio_load(char fnum, char device, char channel) +BANKINLINE bool krnio_load(char fnum, char device, char channel) { return __asm { + BANKIN lda fnum ldx device ldy channel @@ -119,6 +143,7 @@ bool krnio_load(char fnum, char device, char channel) ldx #0 ldy #0 jsr $FFD5 // load + BANKOUT lda #0 rol @@ -129,10 +154,11 @@ bool krnio_load(char fnum, char device, char channel) #pragma native(krnio_load) -bool krnio_save(char device, const char* start, const char* end) +BANKINLINE bool krnio_save(char device, const char* start, const char* end) { return __asm { + BANKIN lda #0 ldx device ldy #0 @@ -143,6 +169,8 @@ bool krnio_save(char device, const char* start, const char* end) ldy end+1 jsr $FFD8 // save + BANKOUT + lda #0 rol eor #1 @@ -152,12 +180,14 @@ bool krnio_save(char device, const char* start, const char* end) #pragma native(krnio_save) -bool krnio_chkout(char fnum) +BANKINLINE bool krnio_chkout(char fnum) { return __asm { + BANKIN ldx fnum jsr $ffc9 // chkout + BANKOUT lda #0 rol @@ -168,12 +198,14 @@ bool krnio_chkout(char fnum) #pragma native(krnio_chkout) -bool krnio_chkin(char fnum) +BANKINLINE bool krnio_chkin(char fnum) { return __asm { + BANKIN ldx fnum jsr $ffc6 // chkin + BANKOUT lda #0 rol @@ -184,39 +216,49 @@ bool krnio_chkin(char fnum) #pragma native(krnio_chkin) -void krnio_clrchn(void) +BANKINLINE void krnio_clrchn(void) { __asm { + BANKIN jsr $ffcc // clrchn + BANKOUT } } #pragma native(krnio_clrchn) -bool krnio_chrout(char ch) +BANKINLINE bool krnio_chrout(char ch) { return __asm { + BANKIN lda ch jsr $ffd2 // chrout sta accu + BANKOUT }; } #pragma native(krnio_chrout) -char krnio_chrin(void) +BANKINLINE char krnio_chrin(void) { return __asm { + BANKIN jsr $ffcf // chrin sta accu + BANKOUT }; } #pragma native(krnio_chrin) +#if defined(__PLUS4__) +#pragma code(code) +#endif + int krnio_getch(char fnum) { if (krnio_pstatus[fnum] == KRNIO_EOF) diff --git a/oscar64/Compiler.cpp b/oscar64/Compiler.cpp index 83c84b2..a5aedc7 100644 --- a/oscar64/Compiler.cpp +++ b/oscar64/Compiler.cpp @@ -552,12 +552,12 @@ bool Compiler::GenerateCode(void) if (mCompilerOptions & COPT_NATIVE) { regionStartup = mLinker->AddRegion(identStartup, 0x1001, 0x1080); - regionLowcode = mLinker->AddRegion(identLowcode, 0x1080, 0x1100); + regionLowcode = mLinker->AddRegion(identLowcode, 0x1080, 0x1180); } else { regionStartup = mLinker->AddRegion(identStartup, 0x1001, 0x1080); - regionLowcode = mLinker->AddRegion(identLowcode, 0x1080, 0x1000); + regionLowcode = mLinker->AddRegion(identLowcode, 0x1080, 0x1180); } regionLowcode->mSections.Push(mCompilationUnits->mSectionLowCode); break; @@ -633,6 +633,8 @@ bool Compiler::GenerateCode(void) regionBytecode = mLinker->AddRegion(identBytecode, 0x1d00, 0x1e00); break; case TMACH_PLUS4: + regionBytecode = mLinker->AddRegion(identBytecode, 0x1200, 0x1300); + break; case TMACH_VIC20: regionBytecode = mLinker->AddRegion(identBytecode, 0x1100, 0x1200); break; @@ -698,7 +700,7 @@ bool Compiler::GenerateCode(void) regionMain = mLinker->AddRegion(identMain, 0x1e00, 0xc000); break; case TMACH_PLUS4: - regionMain = mLinker->AddRegion(identMain, 0x1200, 0xfc00); + regionMain = mLinker->AddRegion(identMain, 0x1300, 0xfc00); break; case TMACH_VIC20: regionMain = mLinker->AddRegion(identMain, 0x1200, 0x1e00); @@ -753,7 +755,7 @@ bool Compiler::GenerateCode(void) regionMain = mLinker->AddRegion(identMain, 0x1c80, 0xc000); break; case TMACH_PLUS4: - regionMain = mLinker->AddRegion(identMain, 0x1100, 0xfc00); + regionMain = mLinker->AddRegion(identMain, 0x1180, 0xfc00); break; case TMACH_VIC20: regionMain = mLinker->AddRegion(identMain, 0x1080, 0x1e00);