Beispiel #1
0
static void MsgFindPci(uintptr_t rcpt, uintptr_t arg)
{
	ACPI_PCI_ID temp = { 0, 0, 0, 0 };
	u16 vendor = arg >> 16;
	u16 device = arg;
	uintptr_t addr = -1;
	ACPI_STATUS status = FindPCIDevByVendor(vendor, device, &temp);
	if (ACPI_SUCCESS(status)) {
		addr = temp.Bus << 16 | temp.Device << 3 | temp.Function;
	}
	send1(MSG_ACPI_FIND_PCI, rcpt, addr);
}
/*****************************************************************************
* 函 数 名  : hsUartSend
*
* 功能描述  : HS UART发送数据接口函数
*
* 输入参数  : UINT32  u32SrcAddr       需发送的数据的首地址
*             UINT32  u32TransLength   需发送的数据的长度
*
* 输出参数  : 无
* 返 回 值  : OK       成功
*             ERROR    失败
*
* 修改记录  :2010年12月16日   鲁婷  创建
*****************************************************************************/
HSUART_STATUS hsUartSend(UINT8 * pucSrcAddr, UINT32 u32TransLength)
{
//    UINT32 regval;
    UINT8 * pu8Buffer;
    UINT32 ulTimes;
    UINT32 ulLeft;

    /* 参数的有效性检查 */
    if((NULL == pucSrcAddr) || (0 == u32TransLength))
    {
    	return HSUART_STATUS_PARA_ERR;
    }

    pu8Buffer = pucSrcAddr;

    ulTimes = u32TransLength / 4;
    ulLeft = u32TransLength % 4;

    send4((UINT32*)pu8Buffer, ulTimes); /*lint !e826*/
    pu8Buffer = pu8Buffer + ulTimes*4;

    if(ulLeft == 1)
    {
        send1(pu8Buffer, 1);
    }
    else if(ulLeft == 2)
    {
        send2((UINT16*)pu8Buffer, 1); /*lint !e826*/
    }
    else if(ulLeft == 3)
    {
        send2((UINT16*)pu8Buffer, 1); /*lint !e826*/
        pu8Buffer = pu8Buffer + 1*2;
        send1(pu8Buffer, 1);
    }

    return HSUART_STATUS_OK;
}
Beispiel #3
0
void sendByte(char data)
{
	char temp;
	for(int i=0;i<8;i++)
	{
		temp = data & 0x01;
		if(temp & (1<<0))
		{
			send1();
		}
		else
		{
			send0();
		}
		data >>= 1;
	}
	return;
}
Beispiel #4
0
//-------------------------------------------------------------------
void getMinus2Data(IFloat* rcv_buf, IFloat* send_buf, int len, int mu, int nu)
{
    IFloat *tmp_buf = (IFloat *)smalloc(len*sizeof(IFloat));

    SCUDirArg send1(send_buf, pos_dir[mu], SCU_SEND, len);
    SCUDirArg recv1(tmp_buf, neg_dir[mu], SCU_REC, len);
    SCUTrans(&send1);
    SCUTrans(&recv1);
    SCUTransComplete();

    SCUDirArg send2(tmp_buf, pos_dir[nu], SCU_SEND, len);
    SCUDirArg recv2(rcv_buf, neg_dir[nu], SCU_REC, len);
    SCUTrans(&send2);
    SCUTrans(&recv2);
    SCUTransComplete();

    sfree(tmp_buf);
}
Beispiel #5
0
//-------------------------------------------------------------------
void getMinus3Data(IFloat* rcv_buf, IFloat* send_buf, int len, int dir)
{
    IFloat *tmp_buf = (IFloat *)smalloc(len*sizeof(IFloat));

    int i = (dir+1)%4;
    int j = (dir+2)%4;
    int k = (dir+3)%4;

    //--------------------------------------------------------------
    // send_buf --> rcv_buf(as a temporary buffer) 
    //--------------------------------------------------------------
    SCUDirArg send1(send_buf, pos_dir[i], SCU_SEND, len);
    SCUDirArg recv1(rcv_buf, neg_dir[i], SCU_REC, len);
    SCUTrans(&send1);
    SCUTrans(&recv1);
    SCUTransComplete();

    //--------------------------------------------------------------
    // rcv_buf --> tmp_buf 
    //--------------------------------------------------------------
    SCUDirArg send2(rcv_buf, pos_dir[j], SCU_SEND, len);
    SCUDirArg recv2(tmp_buf, neg_dir[j], SCU_REC, len);
    SCUTrans(&send2);
    SCUTrans(&recv2);
    SCUTransComplete();

    //--------------------------------------------------------------
    // tmp_buf --> rcv_buf 
    //--------------------------------------------------------------
    SCUDirArg send3(tmp_buf, pos_dir[k], SCU_SEND, len);
    SCUDirArg recv3(rcv_buf, neg_dir[k], SCU_REC, len);
    SCUTrans(&send3);
    SCUTrans(&recv3);
    SCUTransComplete();

    sfree(tmp_buf);
}
Beispiel #6
0
void Game::start( Result *result){
    //各プレイヤーの順位が決定するまでゲームを行う
    COUT<<"start"<<endl;
    
    if( players.isInequality() ){//身分差があるなら
        changeCardsUEC( result );//カードの交換
    }
    
    players.setCardsNum();//プレイヤーのカード枚数を確認する
    
    //最初のプレイヤーIDをturnに保存する
    players.turn = players.convIDtoSekiNum(whoHave(2, 1));//ダイヤの3を持つものが最初のターンである
    
    while( !isGameEnd() ){//試合が存続中である(順位がすべて決していない)

        {//各プレイヤの手札を作り、送る
            int sendTefuda[config.PLAYER_NUM][8][15]={{0}};
            makeTefuda815( sendTefuda );
            for(int i=0; i<config.PLAYER_NUM; i++){
                send815( sendTefuda[i], players.id[i].sockfd );
            }
            COUT<<"send hand"<<endl;
            PRINT815( sendTefuda[players.turnId()] );
        }
        int data[8][15]={{0}};
        recv815(data, players.id[players.turnId()].sockfd);//現在のターンのプレイヤから提出カードを受け取る
        
        #ifdef DEBUGMODE
        //デバグ用出力
        table.print();
        players.print();
        COUT<<"get"<<endl;
        PRINT815(data);
        #endif
        
        //提出されたデータの解析
        Yaku yaku;//受け取ったデータの変換先
        int num = 0;//返信用番号
        if( conv815toYaku(&yaku, data) ){//815はそもそも"役"として解釈可能か?
            //解釈可能ならばyaku形式に変換されている
            if(isSubmittableYaku(yaku)){//提出可能な手か?
                if(yaku.isPass()){//パスと明示している(UEC標準ルールには存在しない)
                    if( config.PROTOCOL!=20070 ){
                        //20070以上のプロトコルならパス明示の返答をする。
                        num = 7;
                    }else{
                        //でなければ普通にパスである。
                        num = 8;
                    }
                }else{//提出可能な役
                    num = 9;
                }
            }else{//提出不可能な役
                //パスとして更新する
                yaku.demoPass();
                num = 8;
            }
        }else{//役として成り立っていない
            //cout << "unable to convert into Yaku!" << endl;
            //UECルールではパス(出せる手がない場合)もここにくるので出力させているときりがない
            yaku.demoPass();
            num = 8;
        }
        
        {//提出手役の記録
            Table bTable = table;//提出前の盤面
            vector<int> passArray, numArray;//パスしてるかの配列
            makePassArray( &passArray );//パスアレイを作る
            makeNumArray( &numArray );//枚数アレイを作る
            result->addAct( players.turnId(), bTable, passArray, numArray, yaku );//提出役の記録
            //result->print();
        }
        
        table.player_id = players.turnId();
        
        //以下、実際の盤面更新
        switch( num ){
        case 7:
            COUT << 7 << endl;
            send1( 7, players.id[players.turnId()].sockfd );//パスとしてパスをした
            pass();
            break;
        case 8:
            COUT << 8 << endl;
            send1( 8, players.id[players.turnId()].sockfd );//パスしたとみなした
            pass();
            break;
        case 9:
            COUT << 9 << endl;
            //役による盤面更新
            send1( 9, players.id[players.turnId()].sockfd );//提出できた
            update(yaku);//役情報による盤面の更新
            break;
        }
        
        {//更新された場札を送る
            int sendBafuda[config.PLAYER_NUM][8][15] = {{0}};
            makeBafuda815( sendBafuda );//加工
            for(int i=0; i<5; i++){
                send815( sendBafuda[i], players.id[i].sockfd );
            }
            COUT<<"send bafuda"<<endl;
            PRINT815( sendBafuda[players.turnId()] );
        }
            
        //場札を通知したら、次のプレイヤーに移るが、場が流れることもある
        bool pf  = true;//ぱふ
        switch(num){
        case 7:
        case 8:
            //パスした場合の次のプレイヤー
            if( isBaAlive() ){
                //まだ回せるなら回す
                players.nextTurn();
            }else{
                //場を流す
                purge();
            }
            break;
        case 9:
            //何かが通知されれば次のプレイヤーに移るが、場が流れることもある
            if( table.isOnset() ){
                purge();
                break;
            }
            players.nextTurn();
            break;
        }
            
        {
            //試合終了の判定
            if(isGameEnd()){
                //試合が終わってしまった
                result->mAgari = players.agari;//あがった順番をresultに保存する
                for(int i=0; i<players.agari.size(); i++){
                    players.id[players.agari[i]].mibun = i;
                }
                result->finish( players );
                break;//おさらば
            }else{
                //まだ終わってない
                for(int i=0; i<config.PLAYER_NUM; i++){
                    send1( 0, players.id[i].sockfd );
                }
            }
        }
        
    }//while
    
}
Beispiel #7
0
void start() {
	ACPI_STATUS status = AE_OK;

	printf("acpica: starting...\n");

	// NB! Must be at least as large as physical memory - the ACPI tables could
	// be anywhere. (Could be handled by AcpiOsMapMemory though.)
	map(0, MAP_PHYS | PROT_READ | PROT_WRITE | PROT_NO_CACHE,
		(void*)ACPI_PHYS_BASE, 0, USER_MAP_MAX - ACPI_PHYS_BASE);

	__default_section_init();

    AcpiDbgLayer = 0;
    AcpiDbgLevel = ACPI_LV_REPAIR | ACPI_LV_INTERRUPTS;

	status = InitializeFullAcpi ();
	CHECK_STATUS("InitializeFullAcpi");

	int pic_mode = 0; // Default is PIC mode if something fails
	status = PrintAPICTable();
	CHECK_STATUS("PrintAPICTable");
	status = FindIOAPICs(&pic_mode);
	CHECK_STATUS("Find IOAPIC");
	status = ExecuteOSI(pic_mode);
	CHECK_STATUS("ExecuteOSI");
	// Tables we get in Bochs:
	// * DSDT: All the AML code
	// * FACS
	// * FACP
	// * APIC (= MADT)
	// * SSDT: Secondary System Description Table
	//   Contains more AML code loaded automatically by ACPICA
	// More tables on qemu:
	// * Another SSDT (Loaded by ACPICA)
	// * HPET table
//	PrintFACSTable();
//	PrintFACPTable();
	// TODO Iterate through and disable all pci interrupt link devices (call
	// _DIS). Then we'll enable the ones we actually intend to use.

	EnumeratePCI();

	AcpiWriteBitRegister(ACPI_BITREG_SCI_ENABLE, 1);
	//AcpiWriteBitRegister(ACPI_BITREG_POWER_BUTTON_ENABLE, 1);
	AcpiInstallGlobalEventHandler(GlobalEventHandler, NULL);
	AcpiEnableEvent(ACPI_EVENT_POWER_BUTTON, 0);

	for (;;) {
		ipc_dest_t rcpt = 0x100;
		ipc_arg_t arg = 0;
		ipc_arg_t arg2 = 0;
		ipc_msg_t msg = recv2(&rcpt, &arg, &arg2);
		//printf("acpica: Received %#lx from %#lx: %#lx %#lx\n", msg, rcpt, arg, arg2);
		if (msg == MSG_PULSE) {
			if (AcpiOsCheckInterrupt(rcpt, arg)) {
				continue;
			} else {
				printf("acpica: Unhandled pulse: %#x from %#lx\n", arg, rcpt);
			}
		}
		switch (msg & 0xff)
		{
		case MSG_ACPI_FIND_PCI:
			MsgFindPci(rcpt, arg);
			break;
		case MSG_ACPI_CLAIM_PCI:
			MsgClaimPci(rcpt, arg, arg2);
			break;
		// This feels a bit wrong, but as long as we use PIO access to PCI
		// configuration space, we need to serialize all accesses.
		case MSG_ACPI_READ_PCI:
			arg = PciReadWord((arg & 0x7ffffffc) | 0x80000000);
			send1(MSG_ACPI_READ_PCI, rcpt, arg);
			break;
		case MSG_ACPI_DEBUGGER_INIT:
			debugger_pre_cmd();
			send0(MSG_ACPI_DEBUGGER_INIT, rcpt);
			break;
		case MSG_ACPI_DEBUGGER_BUFFER:
			assert(debugger_buffer_pos < ACPI_DB_LINE_BUFFER_SIZE);
			AcpiGbl_DbLineBuf[debugger_buffer_pos++] = arg;
			send0(MSG_ACPI_DEBUGGER_BUFFER, rcpt);
			break;
		case MSG_ACPI_DEBUGGER_CMD:
			assert(debugger_buffer_pos < ACPI_DB_LINE_BUFFER_SIZE);
			AcpiGbl_DbLineBuf[debugger_buffer_pos++] = 0;
			putchar('\n');
			AcpiDbCommandDispatch(AcpiGbl_DbLineBuf, NULL, NULL);
			debugger_pre_cmd();
			send0(MSG_ACPI_DEBUGGER_CMD, rcpt);
			break;
		case MSG_ACPI_DEBUGGER_CLR_BUFFER:
			debugger_pre_cmd();
			send0(MSG_ACPI_DEBUGGER_CLR_BUFFER, rcpt);
			break;
		case MSG_REG_IRQ:
			RegIRQ(rcpt, arg);
			continue;
		case MSG_IRQ_ACK:
			AckIRQ(rcpt);
			continue;
		}
		// TODO Handle other stuff.
		if (rcpt == 0x100)
		{
			hmod(rcpt, 0, 0);
		}
	}
	__builtin_unreachable();

failed:
	printf("ACPI failed :( (status %x)\n", status);
	abort();
}