Пример #1
0
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;
	}
}
Пример #2
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);

}
Пример #3
0
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;
	}
}
Пример #4
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;
	}
}
Пример #5
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;
	}
}
Пример #6
0
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;
}