@@ -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
155169void 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
205219void 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 );
0 commit comments