@@ -459,6 +459,7 @@ static void KernelEFFIQHandler_Dinamic( void *pParam );
459459static void KernelEFFIQHandler_SimonsBasic ( void *pParam );
460460static void KernelEFFIQHandler_Comal80 ( void *pParam );
461461static void KernelEFFIQHandler_EpyxFL ( void *pParam );
462+ static void KernelMDOnlyFIQHandler ( void *pParam );
462463
463464#define LRU_CACHE_ENTRIES 16
464465
@@ -502,6 +503,13 @@ static void checkForEyeOfTheBeholder()
502503 }
503504}
504505
506+ static u8 showSlideShow = 0 ;
507+ static u8 curSlideShowImage = 0 ;
508+ static u16 curPixelRow = 0 ;
509+ static u16 curCopyRow = 0 ;
510+ static u32 pauseSlideShow = 0 ;
511+ static u8 timeSlideShow[ 32 ];
512+
505513static void KernelEFFIQHandler ( void *pParam );
506514void KernelEFRun ( CGPIOPinFIQ m_InputPin, CKernelMenu *kernelMenu, const char *FILENAME, const char *menuItemStr, const char *FILENAME_KERNAL = NULL )
507515#else
@@ -555,6 +563,9 @@ void CKernelEF::Run( void )
555563
556564 checkForEyeOfTheBeholder ();
557565
566+ showSlideShow = 0 ;
567+ tftSlideShowNImages = 0 ;
568+
558569 #ifdef COMPILE_MENU
559570 if ( screenType == 0 )
560571 {
@@ -568,9 +579,11 @@ void CKernelEF::Run( void )
568579 } else
569580 if ( screenType == 1 )
570581 {
582+
571583 char fn[ 1024 ];
572584 // attention: this assumes that the filename ending is always ".crt"!
573585 memset ( fn, 0 , 1024 );
586+
574587 strncpy ( fn, FILENAME, strlen ( FILENAME ) - 4 );
575588 strcat ( fn, " .tga" );
576589
@@ -664,6 +677,25 @@ void CKernelEF::Run( void )
664677 tftCopyBackground2Framebuffer ();
665678 }
666679
680+ memset ( fn, 0 , 1024 );
681+ strncpy ( fn, FILENAME, strlen ( FILENAME ) - 4 );
682+ strcat ( fn, " -slideshow.tga" );
683+
684+ if ( tftLoadSlideShowTGA ( DRIVE, fn ) && tftSlideShowNImages > 0 )
685+ {
686+ showSlideShow = 1 ;
687+ curSlideShowImage = tftSlideShowNImages - 1 ;
688+ curCopyRow = curPixelRow = 0 ;
689+ pauseSlideShow = 0 ;
690+
691+ fn[ strlen ( fn ) - 3 ] = 0 ;
692+ strcat ( fn, " time" );
693+ u32 size = 0 ;
694+ for ( u32 i = 0 ; i < 32 ; i++ )
695+ timeSlideShow[ i ] = 10 ;
696+ readFile ( logger, DRIVE, fn, timeSlideShow, &size, 32 );
697+ }
698+
667699 tftInitImm ();
668700 tftSendFramebuffer16BitImm ( tftFrameBuffer );
669701 }
@@ -708,6 +740,10 @@ void CKernelEF::Run( void )
708740 myHandler = KernelEFFIQHandler_EpyxFL;
709741 if ( ef.bankswitchType == BS_SIMONSBASIC )
710742 myHandler = KernelEFFIQHandler_SimonsBasic;
743+
744+
745+ if ( ef.bankswitchType == BS_MAGICDESK )
746+ myHandler = KernelMDOnlyFIQHandler;
711747 #endif
712748
713749 if ( !isEyeOfTheBeholder )
@@ -2199,3 +2235,205 @@ void efPollingHandler()
21992235 OUTPUT_LATCH_AND_FINISH_BUS_HANDLING
22002236 }
22012237}
2238+
2239+
2240+
2241+
2242+
2243+
2244+
2245+
2246+
2247+
2248+
2249+
2250+
2251+
2252+
2253+
2254+ static void KernelMDOnlyFIQHandler ( void *pParam )
2255+ {
2256+ register u32 D, addr;
2257+ register u8 *flashBankR = ef.flashBank ;
2258+
2259+ // after this call we have some time (until signals are valid, multiplexers have switched, the RPi can/should read again)
2260+ START_AND_READ_ADDR0to7_RW_RESET_CS
2261+
2262+ // we got the A0..A7 part of the address which we will access
2263+ addr = GET_ADDRESS0to7 << 5 ;
2264+
2265+ CACHE_PRELOADL2STRM ( &flashBankR[ addr * 2 ] );
2266+ UPDATE_COUNTERS_MIN ( ef.c64CycleCount , ef.resetCounter2 )
2267+
2268+ //
2269+ //
2270+ //
2271+ if ( ef.reg2 != 4 && VIC_HALF_CYCLE )
2272+ {
2273+ WAIT_AND_READ_ADDR8to12_ROMLH_IO12_BA
2274+ // READ_ADDR0to7_RW_RESET_CS_AND_MULTIPLEX
2275+ // WAIT_AND_READ_ADDR8to12_ROMLH_IO12_BA_VIC2
2276+
2277+ addr |= GET_ADDRESS8to12;
2278+
2279+ if ( ROML_OR_ROMH_ACCESS )
2280+ {
2281+ // get both ROML and ROMH with one read
2282+ D = *(u32 *)&flashBankR[ addr * 2 ];
2283+ if ( ROMH_ACCESS ) D >>= 8 ;
2284+ WRITE_D0to7_TO_BUS_VIC ( D )
2285+ setLatchFIQ ( LED_ROM_ACCESS );
2286+ } else
2287+ if ( IO2_ACCESS && ( ef.bankswitchType == BS_EASYFLASH ) )
2288+ {
2289+ WRITE_D0to7_TO_BUS_VIC ( ef.ram [ GET_IO12_ADDRESS ] );
2290+ setLatchFIQ ( LED_IO2 );
2291+ } else
2292+ if ( IO1_ACCESS && ( ef.bankswitchType == BS_EASYFLASH ) )
2293+ {
2294+ WRITE_D0to7_TO_BUS_VIC ( easyflash_IO1_Read ( GET_IO12_ADDRESS ) );
2295+ setLatchFIQ ( LED_IO1 );
2296+ }
2297+
2298+ FINISH_BUS_HANDLING
2299+ return ;
2300+ }
2301+
2302+ ef.mainloopCount = 0 ;
2303+
2304+ // read the rest of the signals
2305+ WAIT_AND_READ_ADDR8to12_ROMLH_IO12_BA
2306+
2307+ // make our address complete
2308+ addr |= GET_ADDRESS8to12;
2309+
2310+ // VIC2 read during badline?
2311+ if ( ef.reg2 != 4 && VIC_BADLINE )
2312+ {
2313+ if ( !ef.LONGBOARD )
2314+ READ_ADDR8to12_ROMLH_IO12_BA
2315+
2316+ if ( ROMH_ACCESS )
2317+ {
2318+ if ( ef.bankswitchType == BS_MAGICDESK )
2319+ D = *(u32 *)&flashBankR[ addr ]; else
2320+ D = *(u8 *)&flashBankR[ addr * 2 + 1 ];
2321+ WRITE_D0to7_TO_BUS_BADLINE ( D )
2322+ }
2323+ FINISH_BUS_HANDLING
2324+ return ;
2325+ }
2326+
2327+ //
2328+ // starting from here: CPU communication
2329+ //
2330+ if ( ef.reg2 != 4 && CPU_READS_FROM_BUS )
2331+ {
2332+ if ( ( ~g3 & ef.ROM_LH ) )
2333+ {
2334+ D = *(u32 *)&flashBankR[ addr ];
2335+
2336+ WRITE_D0to7_TO_BUS ( D )
2337+ setLatchFIQ ( LED_ROM_ACCESS );
2338+ goto cleanup;
2339+ }
2340+ }
2341+
2342+ if ( ef.reg2 != 4 && CPU_WRITES_TO_BUS && IO1_ACCESS )
2343+ {
2344+ READ_D0to7_FROM_BUS ( D )
2345+
2346+ if ( GET_IO12_ADDRESS == 0 )
2347+ {
2348+ if ( !( D & 128 ) )
2349+ {
2350+ if ( ef.nBanks <= 64 )
2351+ ef.reg0 = (u8 )( D & 63 ); else
2352+ ef.reg0 = (u8 )( D & 127 );
2353+ ef.reg2 = 128 + 4 + 2 ;
2354+ } else
2355+ ef.reg2 = 4 + 0 ;
2356+ }
2357+
2358+ ef.flashBank = &ef.flash_cacheoptimized [ ef.reg0 * 8192 ];
2359+
2360+ // if the EF-ROM does not fit into the RPi's cache: stall the CPU with a DMA and prefetch the data
2361+ if ( !ef.flashFitsInCache )
2362+ {
2363+ WAIT_UP_TO_CYCLE ( WAIT_TRIGGER_DMA );
2364+ CLR_GPIO ( bDMA );
2365+ ef.releaseDMA = NUM_DMA_CYCLES;
2366+ prefetchHeuristic ();
2367+ }
2368+
2369+ setGAMEEXROM ();
2370+
2371+ setLatchFIQ ( LED_IO1 );
2372+ goto cleanup;
2373+ }
2374+
2375+ // reset handling
2376+ if ( !( g2 & bRESET ) ) { ef.resetCounter ++; } else { ef.resetCounter = 0 ; }
2377+
2378+ if ( ef.resetCounter > 3 && ef.resetCounter < 0x8000000 )
2379+ {
2380+ ef.resetCounter = 0x8000000 ;
2381+ initEF ();
2382+ SET_GPIO ( bDMA );
2383+ FINISH_BUS_HANDLING
2384+ return ;
2385+ }
2386+
2387+ cleanup:
2388+
2389+ if ( ef.releaseDMA > 0 && --ef.releaseDMA == 0 )
2390+ {
2391+ WAIT_UP_TO_CYCLE ( WAIT_RELEASE_DMA );
2392+ SET_GPIO ( bDMA );
2393+ }
2394+
2395+ if ( ef.reg2 == 4 ) // cartridge disabled (like this because of my mapping of MD to EF)
2396+ {
2397+ if ( showSlideShow )
2398+ {
2399+ if ( pauseSlideShow )
2400+ {
2401+ pauseSlideShow --;
2402+ } else
2403+ if ( bufferEmptyI2C () )
2404+ {
2405+ extern void setMultiplePixels ( u32 x, u32 y, u32 nx, u32 ny, u16 *c );
2406+ setMultiplePixels ( curCopyRow, 0 , 0 , 239 , (u16 *)&tftSlideShow[ (curSlideShowImage * 240 + curCopyRow ) * 240 * 2 ] );
2407+
2408+ do {
2409+ curPixelRow ++;
2410+ if ( curPixelRow > 255 )
2411+ {
2412+ curPixelRow = 0 ;
2413+ pauseSlideShow = (u32 )timeSlideShow[ tftSlideShowNImages - 1 - curSlideShowImage ] * 500000 * 2 ;
2414+ curSlideShowImage = ( curSlideShowImage + tftSlideShowNImages - 1 ) % tftSlideShowNImages;
2415+ }
2416+ curCopyRow = flipByte ( curPixelRow );
2417+ } while ( curCopyRow >= 240 );
2418+ }
2419+ }
2420+
2421+ prepareOutputLatch4Bit ();
2422+ }
2423+
2424+ /* if ( bufferEmptyI2C() )
2425+ {
2426+ if ( mode & 1 )
2427+ setLatchFIQ( LATCH_LED0 );
2428+ if (!( mode & 1 ))
2429+ setLatchFIQ( LATCH_LED1 );
2430+ }*/
2431+
2432+
2433+ // CLEAR_LEDS_EVERY_8K_CYCLES
2434+ static u32 cycleCount = 0 ;
2435+ if ( !((++cycleCount)&8191 ) )
2436+ clrLatchFIQ ( LED_CLEAR );
2437+
2438+ OUTPUT_LATCH_AND_FINISH_BUS_HANDLING
2439+ }
0 commit comments