Skip to content

Commit 48b8cdc

Browse files
authored
additional timing value, fix georam image saving, self-healing menu
1 parent 86d573b commit 48b8cdc

File tree

10 files changed

+296
-130
lines changed

10 files changed

+296
-130
lines changed

Source/Firmware/config.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
#include "helpers.h"
3434
#include "linux/kernel.h"
3535

36-
u32 radStartup = 0, radStartupSize = 0;
36+
u32 radStartup = 0, radStartupSize = 0, radSilentMode = 0, radWaitCycles = 200000;
3737

3838
int atoi( char* str )
3939
{
@@ -86,6 +86,21 @@ int readConfig( CLogger *logger, const char *DRIVE, const char *FILENAME )
8686

8787
if ( ptr )
8888
{
89+
if ( strcmp( ptr, "BOOT_DELAY" ) == 0 && ( ptr = strtok_r( NULL, "\"", &rest ) ) )
90+
{
91+
s32 delay = atoi( ptr );
92+
while ( *ptr == '\t' || *ptr == ' ' ) ptr++;
93+
if ( delay < 200 ) delay = 200;
94+
radWaitCycles = delay * 1000;
95+
}
96+
97+
if ( strcmp( ptr, "VERBOSITY" ) == 0 )
98+
{
99+
ptr = strtok_r( NULL, " \t", &rest );
100+
if ( strcmp( ptr, "NORMAL" ) == 0 ) radSilentMode = 0;
101+
if ( strcmp( ptr, "SILENT" ) == 0 ) radSilentMode = 0xffffffff;
102+
}
103+
89104
if ( strcmp( ptr, "STARTUP" ) == 0 )
90105
{
91106
ptr = strtok_r( NULL, " \t", &rest );
@@ -145,6 +160,8 @@ int readConfig( CLogger *logger, const char *DRIVE, const char *FILENAME )
145160
if ( timingValues[ 19 ] ) CACHING_L2_OFFSET_KB = timingValues[ 19 ];
146161
if ( timingValues[ 20 ] ) CACHING_L2_PRELOADS_PER_CYCLE = timingValues[ 20 ];
147162

163+
if ( timingValues[ 21 ] ) TIMING_RW_BEFORE_ADDR = timingValues[ 21 ];
164+
148165
return 1;
149166
}
150167

Source/Firmware/config.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@
2828
#ifndef _config_h
2929
#define _config_h
3030

31-
extern u32 radStartup, radStartupSize;
31+
extern u32 radStartup, radStartupSize, radSilentMode, radWaitCycles;
3232

33-
#define TIMING_NAMES 21
33+
#define TIMING_NAMES 22
3434
const char timingNames[TIMING_NAMES][32] = {
3535
"WAIT_FOR_SIGNALS",
3636
"WAIT_CYCLE_READ",
@@ -52,7 +52,8 @@ const char timingNames[TIMING_NAMES][32] = {
5252
"WAIT_BA_SIGNAL_AVAIL",
5353
"CACHING_L1_WINDOW_KB",
5454
"CACHING_L2_OFFSET_KB",
55-
"CACHING_L2_PRELOADS_PER_CYCLE"
55+
"CACHING_L2_PRELOADS_PER_CYCLE",
56+
"WAIT_RW_BEFORE_ADDR"
5657
};
5758

5859
extern int readConfig( CLogger *logger, const char *DRIVE, const char *FILENAME );

Source/Firmware/lowlevel_arm64.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ u32 CACHING_L1_WINDOW_KB = 0;
5252
u32 CACHING_L2_OFFSET_KB = 0;
5353
u32 CACHING_L2_PRELOADS_PER_CYCLE = 0;
5454

55+
u32 TIMING_RW_BEFORE_ADDR = 40;
56+
5557
// initialize what we need for the performance counters
5658
void initCycleCounter()
5759
{

Source/Firmware/lowlevel_arm64.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,8 @@ extern u32 CACHING_L1_WINDOW_KB;
6262
extern u32 CACHING_L2_OFFSET_KB;
6363
extern u32 CACHING_L2_PRELOADS_PER_CYCLE;
6464

65+
extern u32 TIMING_RW_BEFORE_ADDR;
66+
6567
extern u32 modeC128;
6668
extern u32 modeVIC, modePALNTSC;
6769
extern u32 hasSIDKick;

Source/Firmware/lowlevel_dma.h

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ __attribute__( ( always_inline ) ) inline u8 flipByte( u8 x )
9696
return *(u8*)&t;
9797
}
9898

99+
99100
#define DISABLE_ADDRESS_LATCH_AND_BUSTRANSCEIVER( releaseDMA ) \
100101
SET_GPIO( bLATCH_A_OE | bGAME_OUT | bOE_Dx | bRW_OUT | (releaseDMA ? bDMA_OUT : 0) ); \
101102
INP_GPIO_RW(); \
@@ -139,7 +140,20 @@ __attribute__( ( always_inline ) ) inline u8 flipByte( u8 x )
139140
} while ( !(g2 & bBA) ); \
140141
}
141142

143+
#define HANDLE_BUS_AVAILABLE \
144+
WAIT_UP_TO_CYCLE( reu.TIMING_READ_BA_WRITING ); \
145+
/*g2 = read32( ARM_GPIO_GPLEV0 ); */ \
146+
if ( VIC_BA ) { \
147+
do { \
148+
WAIT_FOR_CPU_HALFCYCLE \
149+
WAIT_FOR_VIC_HALFCYCLE \
150+
RESTART_CYCLE_COUNTER \
151+
WAIT_UP_TO_CYCLE( reu.TIMING_READ_BA_WRITING ); \
152+
g2 = read32( ARM_GPIO_GPLEV0 ); \
153+
} while ( !(g2 & bBA) ); \
154+
}
142155

156+
#if 0
143157
#define HANDLE_BUS_AVAILABLE \
144158
WAIT_UP_TO_CYCLE( reu.TIMING_READ_BA_WRITING ); \
145159
/*g2 = read32( ARM_GPIO_GPLEV0 );*/ \
@@ -149,7 +163,7 @@ __attribute__( ( always_inline ) ) inline u8 flipByte( u8 x )
149163
RESTART_CYCLE_COUNTER \
150164
WAIT_UP_TO_CYCLE( reu.TIMING_READ_BA_WRITING ); \
151165
g2 = read32( ARM_GPIO_GPLEV0 ); }
152-
166+
#endif
153167

154168
__attribute__( ( always_inline ) ) inline
155169
void emuReadByteREU_p1( register u32 &g2, u16 addr )
@@ -204,26 +218,30 @@ void emuReadByteREU_p3( register u32 &g2, register u8 &x, bool releaseDMA )
204218
__attribute__( ( always_inline ) ) inline
205219
void emuWriteByteREU_p1( register u32 &g2, u16 addr, u8 data )
206220
{
207-
register u32 DD = flipByte( ( addr ) & 255 ) << D0;
221+
register u32 A asm ("r3" ) = addr;
222+
register u32 DD asm ("r4" );
223+
asm volatile( "rbit %w0, %w1" : "=r" ( A ) : "r" ( A ) ); // flip all bits in 32-bit-DWORD
224+
DD = ( A & 0x00ff0000 ) << ( D0 - 16 );
225+
208226
SET_GPIO( bLATCH_A0 | bLATCH_A8 | DD );
209227
CLR_GPIO( bDMA_OUT | ( D_FLAG & ( ~DD ) ) );
210-
DD = flipByte( ( ( addr ) >> 8 ) & 255 ) << D0;
211-
CLR_GPIO( bDIR_Dx | bRW_OUT | bLATCH_A0 );
228+
DD = ( A & 0xff000000 ) >> ( 24 - D0 );
229+
230+
CLR_GPIO( bDIR_Dx | bRW_OUT | bLATCH_A8 );
212231
SET_GPIO( DD );
213232
CLR_GPIO( ( D_FLAG & ( ~DD ) ) );
214-
DD = ( ( data ) & 255 ) << D0;
215-
CLR_GPIO( bLATCH_A8 );
233+
DD = data << D0;
234+
CLR_GPIO( bLATCH_A0 );
235+
216236
SET_GPIO( DD );
217237
CLR_GPIO( ( D_FLAG & ( ~DD ) ) );
218238

219239
HANDLE_BUS_AVAILABLE
220240

221-
// this RW_OUT a bit before A_OE and DIR_Dx is important for old VICs,
222-
// and took me quite a while to figure out...
223-
WAIT_UP_TO_CYCLE(reu.TIMING_ENABLE_RWOUT_ADDR_LATCH_WRITING - 40 );
241+
WAIT_UP_TO_CYCLE(reu.TIMING_ENABLE_RWOUT_ADDR_LATCH_WRITING_MINUS_RW_BEFORE_ADDR );
224242
OUT_GPIO( RW_OUT );
225243
WAIT_UP_TO_CYCLE( reu.TIMING_ENABLE_RWOUT_ADDR_LATCH_WRITING + 0 );
226-
CLR_GPIO( bLATCH_A_OE | bDIR_Dx );
244+
CLR_GPIO( bLATCH_A_OE );
227245

228246
WAIT_UP_TO_CYCLE( reu.TIMING_ENABLE_DATA_WRITING );
229247
CLR_GPIO( bOE_Dx );

Source/Firmware/rad_georam.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ typedef struct
5353
volatile static GEOSTATE geo AAA;
5454

5555
// geoRAM memory pool
56-
static u8 *geoRAM_Pool = mempool;
56+
extern u8* mempoolPtr;
57+
static u8 *geoRAM_Pool = (u8*)mempoolPtr;
5758

5859
// u8* to current window
5960
#define GEORAM_WINDOW (&geo.RAM[ ( geo.reg[ 1 ] * 16384 ) + ( geo.reg[ 0 ] * 256 ) ])
@@ -62,7 +63,7 @@ static u8 *geoRAM_Pool = mempool;
6263
static void geoRAM_Init()
6364
{
6465
geo.reg[ 0 ] = geo.reg[ 1 ] = 0;
65-
geo.RAM = (u8*)( ( (u64)&geoRAM_Pool[0] + 128 ) & ~127 );
66+
geo.RAM = &geoRAM_Pool[0]; //(u8*)( ( (u64)&geoRAM_Pool[0] + 128 ) & ~127 );
6667
memset( geo.RAM, 0, geoSizeKB * 1024 );
6768

6869
geo.c64CycleCount = 0;

0 commit comments

Comments
 (0)