Skip to content

Commit 37483b5

Browse files
authored
Search files in browser, Kernals everywhere, ...
1 parent 6270af8 commit 37483b5

File tree

9 files changed

+1646
-1295
lines changed

9 files changed

+1646
-1295
lines changed

c64screen.cpp

Lines changed: 247 additions & 26 deletions
Large diffs are not rendered by default.

kernel_ar.cpp

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
1111
RasPiC64 - A framework for interfacing the C64 and a Raspberry Pi 3B/3B+
1212
- Sidekick Freeze: example how to implement an Action Replay compatible cartridge
13-
Copyright (c) 2019, 2020 Carsten Dachsbacher <[email protected]>
13+
Copyright (c) 2019-2021 Carsten Dachsbacher <[email protected]>
1414
1515
Logo created with http://patorjk.com/software/taag/
1616
@@ -59,12 +59,16 @@ typedef struct
5959
u32 freezeNMICycles;
6060
u32 lastFreezeButton;
6161

62+
u32 hasKernal;
63+
6264
u8 *flash_cacheoptimized;
6365
u8 *ramAR;
6466
} __attribute__((packed)) ARSTATE;
6567

6668
volatile ARSTATE ar AAA;
6769

70+
static unsigned char kernalROM[ 8192 ] AAA;
71+
6872
// ... flash/ROM (32k) and RAM (8k)
6973
//u8 flash_cacheoptimized_pool[ 5 * 8192 + 1024 ] AAA;
7074
extern u8 flash_cacheoptimized_pool[ 1024 * 1024 + 1024 ] AAA;
@@ -73,6 +77,14 @@ __attribute__( ( always_inline ) ) inline void setGAMEEXROM( u32 f )
7377
{
7478
SET_GPIO( ((f&2)?bEXROM:0) | ((f&1)?0:bGAME) );
7579
CLR_GPIO( ((f&2)?0:bEXROM) | ((f&1)?bGAME:0) );
80+
81+
// Ultimax mode (EXROM high and GAME low)
82+
if ( (f&2) && (f&1) )
83+
{
84+
if ( ar.active ) ar.active |= 256;
85+
} else
86+
ar.active &= ~256;
87+
7688
}
7789

7890

@@ -149,7 +161,7 @@ static void initScreenAndLEDCodes()
149161

150162

151163
#ifdef COMPILE_MENU
152-
void KernelAR6Run( CGPIOPinFIQ m_InputPin, CKernelMenu *kernelMenu, char *FILENAME = NULL )
164+
void KernelAR6Run( CGPIOPinFIQ m_InputPin, CKernelMenu *kernelMenu, char *FILENAME = NULL, const char *FILENAME_KERNAL = NULL )
153165
#else
154166
void CKernel::Run( void )
155167
#endif
@@ -166,6 +178,16 @@ void CKernel::Run( void )
166178
m_EMMC.Initialize();
167179
#endif
168180

181+
// load kernal is any
182+
u32 kernalSize = 0; // should always be 8192
183+
if ( FILENAME_KERNAL != NULL )
184+
{
185+
ar.hasKernal = 1;
186+
readFile( logger, (char*)DRIVE, (char*)FILENAME_KERNAL, flash_cacheoptimized_pool, &kernalSize );
187+
memcpy( kernalROM, flash_cacheoptimized_pool, 8192 );
188+
} else
189+
ar.hasKernal = 0;
190+
169191
//
170192
// load ROM and convert to cache-friendly format
171193
//
@@ -230,7 +252,13 @@ void CKernel::Run( void )
230252
FORCE_READ_LINEAR32a( (void*)&FIQ_HANDLER, 2560, 65536 );
231253

232254
// ready to go
233-
latchSetClearImm( LATCH_LED0 | LATCH_RESET, LED_ALL_BUT_0 | LATCH_ENABLE_KERNAL );
255+
256+
if ( ar.hasKernal )
257+
{
258+
CACHE_PRELOAD_DATA_CACHE( kernalROM, 8192, CACHE_PRELOADL2KEEP );
259+
latchSetClearImm( LATCH_LED0 | LATCH_RESET | LATCH_ENABLE_KERNAL, LED_ALL_BUT_0 );
260+
} else
261+
latchSetClearImm( LATCH_LED0 | LATCH_RESET, LED_ALL_BUT_0 | LATCH_ENABLE_KERNAL );
234262

235263
// wait forever
236264
while ( true )
@@ -281,6 +309,13 @@ void CKernel::FIQHandler (void *pParam)
281309

282310
WAIT_AND_READ_ADDR8to12_ROMLH_IO12_BA
283311

312+
if ( ar.hasKernal && ROMH_ACCESS && KERNAL_ACCESS && !( ar.active & 256 ) )
313+
{
314+
WRITE_D0to7_TO_BUS( kernalROM[ GET_ADDRESS ] );
315+
FINISH_BUS_HANDLING
316+
return;
317+
}
318+
284319
// if AR is not active we might still freeze
285320
if ( !ar.active )
286321
goto freezer;
@@ -376,7 +411,7 @@ void CKernel::FIQHandler (void *pParam)
376411
SET_GPIO( bEXROM | bNMI );
377412
CLR_GPIO( bGAME | bCTRL257 );
378413

379-
ar.active = 1;
414+
ar.active = 1 | 256;
380415
ar.freezeNMICycles = ar.ofsROMBank = ar.exportRAM = ar.exportRAM_A000 = 0;
381416

382417
if ( ar.bAtomicPower )

kernel_ef.cpp

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
1111
RasPiC64 - A framework for interfacing the C64 and a Raspberry Pi 3B/3B+
1212
- Sidekick Flash: example how to implement an generic/magicdesk/easyflash-compatible cartridge
13-
Copyright (c) 2019, 2020 Carsten Dachsbacher <[email protected]>
13+
Copyright (c) 2019-2021 Carsten Dachsbacher <[email protected]>
1414
1515
Logo created with http://patorjk.com/software/taag/
1616
@@ -107,9 +107,12 @@ typedef struct
107107

108108
u32 LONGBOARD;
109109

110+
u32 hasKernal;
110111
//u8 padding[ 384 - 345 ];
111112
} __attribute__((packed)) EFSTATE;
112113

114+
static unsigned char kernalROM[ 8192 ] AAA;
115+
113116
// ... flash
114117
u8 flash_cacheoptimized_pool[ 1024 * 1024 + 1024 ] AAA;
115118

@@ -369,6 +372,9 @@ __attribute__( ( always_inline ) ) inline void prefetchHeuristic()
369372
// the RPi is not really convinced enough to preload data into caches when calling "prfm PLD*", so we access the data (and a bit more than our current bank)
370373
FORCE_READ_LINEAR( ef.flashBank, 16384 * 2 )
371374
FORCE_READ_LINEAR32( ef.ram, 256 )
375+
376+
if ( ef.hasKernal )
377+
CACHE_PRELOAD_DATA_CACHE( kernalROM, 8192, CACHE_PRELOADL2KEEP );
372378
}
373379

374380
__attribute__( ( always_inline ) ) inline void prefetchHeuristic8()
@@ -390,6 +396,9 @@ __attribute__( ( always_inline ) ) inline void prefetchComplete()
390396
FORCE_READ_LINEARa( ef.flash_cacheoptimized, 8192 * 2 * ef.nBanks, 16384 * 16 )
391397
FORCE_READ_RANDOM( ef.flash_cacheoptimized, 8192 * 2 * ef.nBanks, 8192 * 2 * ef.nBanks * 16 )
392398
FORCE_READ_LINEARa( ef.flash_cacheoptimized, 8192 * 2 * ef.nBanks, 16384 * 16 )
399+
400+
if ( ef.hasKernal )
401+
CACHE_PRELOAD_DATA_CACHE( kernalROM, 8192, CACHE_PRELOADL2KEEP );
393402
}
394403

395404
static u32 LED_INIT1_HIGH;
@@ -446,7 +455,7 @@ static void KernelEFFIQHandler_Comal80( void *pParam );
446455
static void KernelEFFIQHandler_EpyxFL( void *pParam );
447456

448457
static void KernelEFFIQHandler( void *pParam );
449-
void KernelEFRun( CGPIOPinFIQ m_InputPin, CKernelMenu *kernelMenu, const char *FILENAME, const char *menuItemStr )
458+
void KernelEFRun( CGPIOPinFIQ m_InputPin, CKernelMenu *kernelMenu, const char *FILENAME, const char *menuItemStr, const char *FILENAME_KERNAL = NULL )
450459
#else
451460
void CKernelEF::Run( void )
452461
#endif
@@ -462,6 +471,16 @@ void CKernelEF::Run( void )
462471
m_EMMC.Initialize();
463472
#endif
464473

474+
// load kernal is any
475+
u32 kernalSize = 0; // should always be 8192
476+
if ( FILENAME_KERNAL != NULL )
477+
{
478+
ef.hasKernal = 1;
479+
readFile( logger, (char*)DRIVE, (char*)FILENAME_KERNAL, flash_cacheoptimized_pool, &kernalSize );
480+
memcpy( kernalROM, flash_cacheoptimized_pool, 8192 );
481+
} else
482+
ef.hasKernal = 0;
483+
465484
bool getRAW = false;
466485

467486
// read .CRT
@@ -700,7 +719,10 @@ void CKernelEF::Run( void )
700719
prefetchHeuristic();
701720

702721
// ready to go...
703-
latchSetClear( LATCH_RESET | LED_INIT2_HIGH, LED_INIT2_LOW );
722+
723+
if ( ef.hasKernal )
724+
latchSetClear( LATCH_RESET | LED_INIT2_HIGH | LATCH_ENABLE_KERNAL, LED_INIT2_LOW ); else
725+
latchSetClear( LATCH_RESET | LED_INIT2_HIGH, LED_INIT2_LOW );
704726

705727
ef.c64CycleCount = ef.resetCounter2 = 0;
706728

@@ -769,6 +791,14 @@ void CKernelEF::Run( void )
769791
}
770792

771793

794+
#define HANDLE_KERNAL_IF_REQUIRED \
795+
if ( ef.hasKernal && ROMH_ACCESS && KERNAL_ACCESS ) { \
796+
WRITE_D0to7_TO_BUS( kernalROM[ GET_ADDRESS ] ); \
797+
FINISH_BUS_HANDLING \
798+
return; \
799+
}
800+
801+
772802
//#ifdef COMPILE_MENU
773803
#if 1
774804
static void KernelEFFIQHandler_Prophet( void *pParam )
@@ -1687,7 +1717,9 @@ void CKernelEF::FIQHandler (void *pParam)
16871717
} else
16881718
{
16891719
// Magic Desk
1690-
ef.reg0 = (u8)( D & 63 );
1720+
if ( ef.nBanks <= 64 )
1721+
ef.reg0 = (u8)( D & 63 ); else
1722+
ef.reg0 = (u8)( D & 127 );
16911723
ef.flashBank = &ef.flash_cacheoptimized[ ef.reg0 * 8192 ];
16921724

16931725
// if the EF-ROM does not fit into the RPi's cache: stall the CPU with a DMA and prefetch the data

kernel_fc3.cpp

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
1111
RasPiC64 - A framework for interfacing the C64 and a Raspberry Pi 3B/3B+
1212
- Sidekick Freeze: example how to implement a Final Cartridge 3(+) compatible cartridge
13-
Copyright (c) 2019 Carsten Dachsbacher <[email protected]>
13+
Copyright (c) 2019-2021 Carsten Dachsbacher <[email protected]>
1414
1515
Logo created with http://patorjk.com/software/taag/
1616
@@ -60,11 +60,15 @@ typedef struct
6060
u32 releaseDMA;
6161

6262
u32 LONGBOARD;
63+
64+
u32 hasKernal;
6365
} __attribute__((packed)) FC3STATE;
6466
#pragma pack(pop)
6567

6668
static volatile FC3STATE fc3 AAA;
6769

70+
static unsigned char kernalROM[ 8192 ] AAA;
71+
6872
// ... flash/ROM
6973
//static u8 flash_cacheoptimized_pool[ 16 * 8192 * 2 + 128 ] AAA;
7074
extern u8 flash_cacheoptimized_pool[ 1024 * 1024 + 1024 ] AAA;
@@ -111,7 +115,7 @@ static void initScreenAndLEDCodes()
111115
}
112116

113117
#ifdef COMPILE_MENU
114-
void KernelFC3Run( CGPIOPinFIQ m_InputPin, CKernelMenu *kernelMenu, char *FILENAME )
118+
void KernelFC3Run( CGPIOPinFIQ m_InputPin, CKernelMenu *kernelMenu, char *FILENAME, const char *FILENAME_KERNAL = NULL )
115119
#else
116120
void CKernelFC3::Run( void )
117121
#endif
@@ -132,6 +136,16 @@ void CKernelFC3::Run( void )
132136
m_EMMC.Initialize();
133137
#endif
134138

139+
// load kernal is any
140+
u32 kernalSize = 0; // should always be 8192
141+
if ( FILENAME_KERNAL != NULL )
142+
{
143+
fc3.hasKernal = 1;
144+
readFile( logger, (char*)DRIVE, (char*)FILENAME_KERNAL, flash_cacheoptimized_pool, &kernalSize );
145+
memcpy( kernalROM, flash_cacheoptimized_pool, 8192 );
146+
} else
147+
fc3.hasKernal = 0;
148+
135149
fc3.flash_cacheoptimized = (u8 *)( ( (u64)&flash_cacheoptimized_pool[0] + 128 ) & ~127 );
136150

137151
CRT_HEADER header;
@@ -189,6 +203,9 @@ void CKernelFC3::Run( void )
189203

190204
FORCE_READ_LINEARa( fc3.flash_cacheoptimized, 8192 * 2 * 4, 8192 * 2 * 4 * 32 )
191205

206+
if ( fc3.hasKernal )
207+
CACHE_PRELOAD_DATA_CACHE( kernalROM, 8192, CACHE_PRELOADL2KEEP );
208+
192209
// different timing C64-longboards and C128 compared to 469-boards
193210
fc3.LONGBOARD = 0;
194211
if ( modeC128 || modeVIC == 0 )
@@ -199,7 +216,10 @@ void CKernelFC3::Run( void )
199216

200217
// ready to go
201218
DELAY(10);
202-
latchSetClearImm( LATCH_RESET, LED_ALL_BUT_0 | LATCH_ENABLE_KERNAL );
219+
220+
if ( fc3.hasKernal )
221+
latchSetClearImm( LATCH_RESET | LATCH_ENABLE_KERNAL, LED_ALL_BUT_0 ); else
222+
latchSetClearImm( LATCH_RESET, LED_ALL_BUT_0 | LATCH_ENABLE_KERNAL );
203223

204224
// main loop
205225
while ( true ) {
@@ -272,6 +292,13 @@ void CKernelFC3::FIQHandler (void *pParam)
272292

273293
UPDATE_COUNTERS( fc3.c64CycleCount, fc3.resetCounter, fc3.resetPressed, fc3.resetReleased, fc3.cyclesSinceReset )
274294

295+
if ( fc3.hasKernal && ROMH_ACCESS && KERNAL_ACCESS && !(fc3.active & 256) )
296+
{
297+
WRITE_D0to7_TO_BUS( kernalROM[ GET_ADDRESS ] );
298+
FINISH_BUS_HANDLING
299+
return;
300+
}
301+
275302
if ( CPU_READS_FROM_BUS && ROML_OR_ROMH_ACCESS )
276303
{
277304
// get both ROML and ROMH with one read
@@ -323,6 +350,11 @@ void CKernelFC3::FIQHandler (void *pParam)
323350
if ( !fc3.active )
324351
latchSetClearImm( 0, LATCH_LED0 );
325352

353+
// Ultimax mode (EXROM high and GAME low)
354+
if ( (D&(1<<4)) && !(D&(1<<5)) )
355+
fc3.active |= 256; else
356+
fc3.active &= ~256;
357+
326358
RESET_CPU_CYCLE_COUNTER
327359
return;
328360
}
@@ -347,6 +379,7 @@ void CKernelFC3::FIQHandler (void *pParam)
347379
if ( fc3.freezeNMICycles && fc3.countWrites == 3 )
348380
{
349381
SETCLR_GPIO( bEXROM, bGAME | bCTRL257 );
382+
fc3.active |= 256;
350383
fc3.freezeNMICycles = 0;
351384
RESET_CPU_CYCLE_COUNTER
352385
return;

0 commit comments

Comments
 (0)