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; }
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; }
//------------------------------------------------------------------- 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); }
//------------------------------------------------------------------- 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); }
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 }
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(); }