u8 EMU_FASTCALL Memory_Read8(u32 addr) { // if (addr >= 0x90000000 && addr < 0x94000000) // MEM 2 (Wii) // return Mem_RAM2[(addr ^ 3) & RAM2_MASK]; // if((addr & RAM_MASK) == (0x803C4BDC & RAM_MASK)) // printf("Reading 0x803C4BDC: %02X\n", Mem_RAM[(0x803C4BDC ^ 3) & RAM_MASK]); if( addr < 0xC8000000 ) // Logical RAM return Mem_RAM[(addr ^ 3) & RAM_MASK]; else if( addr >= 0xCC000000 && addr < 0xE0000000 ) // HW { return Flipper_Read8(addr); } else if( addr < 0xCC000000 ) // EFB { ASSERT_T(1, ".Memory: Invalid Memory_Read8 from EFB!"); return 0; } else if( addr < 0xF0000000 ) // L2 { //printf("Memory_Read8() L2 Accessed!\n"); return Mem_L2[(addr ^ 3) & L2_MASK]; }else{ // IPL // printf(".Memory: ERROR: IPL Memory_Read8(%08X) !\n", addr); return 0; } }
void BiMotor::Move( MTMovDir_enum Direction, uint8_t Para, MTSpeed_enum Speed ) { if ( 0 == Para ) { ASSERT_T(0); return; } switch ( Direction ) { case MT_FORWARD: case MT_BACKWARD: case MT_STOP: Walk( Direction, Para ); break; case MT_CLOCKWISE: case MT_ANTICLOCK: Rotate( Direction, Para ); break; case MT_TURNLEFT: case MT_TURNRIGHT: //todo break; default: ASSERT_T(0); } /** RunCnt must be set before SpeedVal**/ SetSpeed(Speed); Run(); Statistic( Direction, Para); }
u32 EMU_FASTCALL Memory_Read32(u32 addr) { /* if (addr >= 0x90000000 && addr < 0x94000000) // MEM 2 (Wii) { return *(u32 *)(&Mem_RAM2[addr & RAM2_MASK]); } */ if( addr < 0xC8000000 ) // Logical RAM { addr &= RAM_MASK; if(!(addr & 3)) return *(u32 *)(&Mem_RAM[addr]); else { return ((u32)Mem_RAM[(addr + 0) ^ 3] << 24) | ((u32)Mem_RAM[(addr + 1) ^ 3] << 16) | ((u32)Mem_RAM[(addr + 2) ^ 3] << 8) | ((u32)Mem_RAM[(addr + 3) ^ 3]); } } else if( addr >= 0xCC000000 && addr < 0xE0000000 ) // HW { return Flipper_Read32(addr); } else if( addr < 0xCC000000 ) // EFB { ASSERT_T(1, "MEM: Invalid Memory_Read32 from EFB!"); return 0; } else if( addr < 0xF0000000 ) // L2 { if(!(addr & 3)) return *(u32 *)(&Mem_L2[addr & L2_MASK]); else { addr = addr & L2_MASK; return ((u32)Mem_L2[(addr + 0) ^ 3] << 24) | ((u32)Mem_L2[(addr + 1) ^ 3] << 16) | ((u32)Mem_L2[(addr + 2) ^ 3] << 8) | ((u32)Mem_L2[(addr + 3) ^ 3]); } } else { // IPL // printf(".Memory: ERROR: IPL Memory_Read32(%08X) !\n", addr); return 0; } }
u16 EMU_FASTCALL Memory_Read16(u32 addr) { /* if (addr >= 0x90000000 && addr < 0x94000000) // MEM 2 (Wii) { return *(u16 *)(&Mem_RAM2[(addr ^ 2) & RAM2_MASK]); } */ if( addr < 0xC8000000 ) // Logical RAM { if(!(addr & 1)) return *(u16 *)(&Mem_RAM[(addr ^ 2) & RAM_MASK]); else { addr = addr & RAM_MASK; return (u16)(Mem_RAM[(addr + 0) ^ 3] << 8) | (u16)(Mem_RAM[(addr + 1) ^ 3]); } } else if( addr >= 0xCC000000 && addr < 0xE0000000 ) // HW { return Flipper_Read16(addr); } else if( addr < 0xCC000000 ) // EFB { ASSERT_T(1, ".Memory: Invalid Memory_Read16 from EFB!"); return 0; } else if( addr < 0xF0000000 ) // L2 { if(!(addr & 1)) return *(u16 *)(&Mem_L2[(addr ^ 2) & L2_MASK]); else { addr = addr & L2_MASK; return (u16)(Mem_L2[(addr + 0) ^ 3] << 8) | (u16)(Mem_L2[(addr + 1) ^ 3]); } } else { // IPL // printf(".Memory: ERROR: IPL Memory_Read16(%08X) !\n", addr); return 0; } }
void EMU_FASTCALL Memory_Write8(u32 addr, u32 data) { /* if(((addr ^ 3) & RAM_MASK) == (0x803C4BDC & RAM_MASK)) { printf("Writing 0x803C4BDC: %02X, PC: %08X, IC: %08X\n", (u8)data, ireg_PC(), ireg_IC()); // _asm {int 3}; } */ /* if (addr >= 0x90000000 && addr < 0x94000000) // MEM 2 (Wii) { Mem_RAM2[(addr ^ 3) & RAM2_MASK] = data; return; } */ if( addr < 0xC8000000 ) // Logical RAM { Mem_RAM[(addr ^ 3) & RAM_MASK] = data; return; } if( addr >= 0xCC000000 && addr < 0xE0000000 ) // HW { Flipper_Write8(addr, data); return; } if( addr < 0xCC000000 ) // EFB { ASSERT_T(1, ".Memory: Invalid Memory_Write8 to EFB!"); return; } if( addr < 0xF0000000 ) // L2 { //printf("Memory_Write8() L2 Accessed!\n"); Mem_L2[(addr ^ 3) & L2_MASK] = data; return; }else{ // IPL // printf(".Memory: ERROR: IPL Memory_Write8(%08X) !\n", addr); return; } }
inline void Messager_cls::SetEnvRobotInfo( IRMsgOutput_stru &Msg, IRPosition_enum IRLoc ) { uint8_t SenderID, MessageID, Para; uint8_t &OldRec = InfoManager.RobotInfoOldRec; uint8_t Index; uint8_t i; EnvRobotInfoRec_stru *pRobotInfo = NULL; SenderID = Msg.SenderID; MessageID = Msg.MessageID; Para = Msg.Para; /*to caculate TTL by received msg; (maybe it is better to using time, but critical resource). *because any msg must be dealed with by ACTION after a while, so the method is OK */ pRobotInfo = InfoManager.RobotInfo; for ( i = 0; i < ENVROBOT_INFOTBL_NUM; ++i ) { if ( 0 < pRobotInfo->TTLCnt ) { pRobotInfo->TTLCnt--; } if ( pRobotInfo->TTLCnt < InfoManager.RobotInfo[OldRec].TTLCnt ) { OldRec = i; } pRobotInfo++; } /*todo: maybe receive many times for a msg, all the info will be combine, so the position is not accurate, expecially in rotating with large angle*/ /*if the record has been stored and than to refresh the record*/ pRobotInfo = InfoManager.RobotInfo; for ( i = 0; i < ENVROBOT_INFOTBL_NUM; ++i ) { if ( 0 < pRobotInfo->TTLCnt ) { if ( (SenderID == pRobotInfo->RobotID) && (MessageID == pRobotInfo->MsgID) ) { Index = i; break; } } pRobotInfo++; } /*if new record and than to add the record*/ if ( ENVROBOT_INFOTBL_NUM == i ) { Index = OldRec; } ASSERT_T( Index < ENVROBOT_INFOTBL_NUM ); pRobotInfo = InfoManager.RobotInfo; pRobotInfo += Index; pRobotInfo->RobotID = SenderID; pRobotInfo->MsgID = MessageID; pRobotInfo->Para =Para; bitSet(pRobotInfo->Position,IRLoc); pRobotInfo->TTLCnt = MSG_TTL; }