Skip to content

Commit c7732de

Browse files
authored
modifications for slide shows
1 parent f4541c7 commit c7732de

File tree

7 files changed

+442
-63
lines changed

7 files changed

+442
-63
lines changed

Source/Firmware/helpers.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,12 @@
2929
#include "helpers.h"
3030

3131
// file reading
32-
int readFile( CLogger *logger, const char *DRIVE, const char *FILENAME, u8 *data, u32 *size )
32+
int readFile( CLogger *logger, const char *DRIVE, const char *FILENAME, u8 *data, u32 *size, u32 maxSize )
3333
{
3434
FATFS m_FileSystem;
3535

36+
*size = 0;
37+
3638
// mount file system
3739
if ( f_mount( &m_FileSystem, DRIVE, 1 ) != FR_OK )
3840
logger->Write( "RaspiMenu", LogPanic, "Cannot mount drive: %s", DRIVE );
@@ -55,6 +57,9 @@ int readFile( CLogger *logger, const char *DRIVE, const char *FILENAME, u8 *data
5557
return 0;
5658
}
5759

60+
if ( filesize > maxSize )
61+
filesize = maxSize;
62+
5863
*size = filesize;
5964

6065
// read data in one big chunk

Source/Firmware/helpers.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
#include <SDCard/emmc.h>
3434
#include <fatfs/ff.h>
3535

36-
extern int readFile( CLogger *logger, const char *DRIVE, const char *FILENAME, u8 *data, u32 *size );
36+
extern int readFile( CLogger *logger, const char *DRIVE, const char *FILENAME, u8 *data, u32 *size, u32 maxSize = 0x7fffffff );
3737
extern int getFileSize( CLogger *logger, const char *DRIVE, const char *FILENAME, u32 *size );
3838
extern int writeFile( CLogger *logger, const char *DRIVE, const char *FILENAME, u8 *data, u32 size );
3939

@@ -261,4 +261,12 @@ C64IsRunning: \
261261
#define min(a,b) (((a)<(b))?(a):(b))
262262
#define max(a,b) (((a)>(b))?(a):(b))
263263

264+
__attribute__( ( always_inline ) ) inline u8 flipByte( u8 x )
265+
{
266+
u32 t;
267+
asm volatile( "rbit %w0, %w1" : "=r" ( t ) : "r" ( x ) ); // flip all bits in 32-bit-DWORD
268+
asm volatile( "rev %w0, %w1" : "=r" ( t ) : "r" ( t ) ); // reverse 4 bytes in 32-bit-DWORD
269+
return *(u8*)&t;
270+
}
271+
264272
#endif

Source/Firmware/kernel_ef.cpp

Lines changed: 238 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,7 @@ static void KernelEFFIQHandler_Dinamic( void *pParam );
459459
static void KernelEFFIQHandler_SimonsBasic( void *pParam );
460460
static void KernelEFFIQHandler_Comal80( void *pParam );
461461
static 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+
505513
static void KernelEFFIQHandler( void *pParam );
506514
void 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

Comments
 (0)