@@ -323,6 +323,20 @@ void emac3_write(u32 addr)
323323 dev9Ru32 (addr) = wswap (value);
324324}
325325
326+ static u32 smap_readRxfifo (int bytes)
327+ {
328+ int result = 0 ;
329+ int rd_ptr = dev9Ru32 (SMAP_R_RXFIFO_RD_PTR ) & 16383 ;
330+
331+ for (int i = 0 ; i < bytes; ++i) {
332+ u8 byte = dev9.rxfifo [(rd_ptr + i) & 16383 ];
333+ result |= (u32 )byte << (i * 8 );
334+ }
335+
336+ dev9Ru32 (SMAP_R_RXFIFO_RD_PTR ) = (rd_ptr + bytes) & 16383 ;
337+ return result;
338+ }
339+
326340u8 smap_read8 (u32 addr)
327341{
328342 switch (addr)
@@ -333,16 +347,16 @@ u8 smap_read8(u32 addr)
333347 case SMAP_R_RXFIFO_FRAME_CNT :
334348 DevCon.WriteLn (" DEV9: SMAP_R_RXFIFO_FRAME_CNT read 8" );
335349 break ;
336-
350+ case SMAP_R_RXFIFO_DATA :
351+ DevCon.WriteLn (" DEV9: SMAP_R_RXFIFO_DATA read 8" );
352+ return (u8 )smap_readRxfifo (1 );
337353 case SMAP_R_BD_MODE :
338354 return dev9.bd_swap ;
339-
340355 default :
341- DevCon.WriteLn (" DEV9: SMAP : Unknown 8 bit read @ %X,v=%X" , addr, dev9Ru8 (addr));
342- return dev9Ru8 (addr);
356+ DevCon.WriteLn (" DEV9: SMAP: Unknown 8 bit read" );
343357 }
344358
345- DevCon.WriteLn (" DEV9: SMAP : error , 8 bit read @ %X,v=%X" , addr, dev9Ru8 (addr));
359+ DevCon.WriteLn (" DEV9: SMAP: 8 bit read @ %X,v=%X" , addr, dev9Ru8 (addr));
346360 return dev9Ru8 (addr);
347361}
348362
@@ -496,6 +510,10 @@ u16 smap_read16(u32 addr)
496510 return dev9Ru16 (addr);
497511 }
498512#endif
513+
514+ if (addr == SMAP_R_RXFIFO_DATA )
515+ return (u16 )smap_readRxfifo (2 );
516+
499517 return rv;
500518}
501519
@@ -518,18 +536,8 @@ u32 smap_read32(u32 addr)
518536 case SMAP_R_EMAC3_STA_CTRL_L :
519537 DevCon.WriteLn (" DEV9: SMAP_R_EMAC3_STA_CTRL_L 32bit read value %x" , dev9Ru32 (addr));
520538 return dev9Ru32 (addr);
521-
522539 case SMAP_R_RXFIFO_DATA :
523- {
524- int rd_ptr = dev9Ru32 (SMAP_R_RXFIFO_RD_PTR ) & 16383 ;
525-
526- const int rv = *((u32 *)(dev9.rxfifo + rd_ptr));
527-
528- dev9Ru32 (SMAP_R_RXFIFO_RD_PTR ) = ((rd_ptr + 4 ) & 16383 );
529-
530- // DevCon.WriteLn("DEV9: SMAP_R_RXFIFO_DATA 32bit read %x", rv);
531- return rv;
532- }
540+ return smap_readRxfifo (4 );
533541 default :
534542 DevCon.WriteLn (" DEV9: SMAP : Unknown 32 bit read @ %X,v=%X" , addr, dev9Ru32 (addr));
535543 return dev9Ru32 (addr);
0 commit comments