//--------------------------------------------------------------------------- void __fastcall TFormPici::MN_StatMode1Click(TObject *Sender) { if(!GroupBox_Stat1->Visible) { GroupBox_Stat1->Visible=true; GroupBox_Stat2->Visible=true; refresh_stat(); } }
/// @brief /// Equip item /// @param to /// Knight who you want to equip the item /// @param id /// Target item id void equip(name from, uint8_t to, uint32_t id) { require_auth(from); assert_true(to > 0 && to < kt_count, "invalid knight type"); auto item_iter = item_controller.find(from); auto &rows = item_controller.get_items(item_iter); auto &item = item_controller.get_item(rows, id); assert_true(item.saleid == 0, "item is on sale"); auto &rule_table = item_controller.get_ritem_rule().get_table(); auto rule = rule_table.find(item.code); assert_true(rule != rule_table.cend(), "could not find rule"); assert_true(is_valid_for((knight_type)to, (item_sub_type)rule->sub_type), "it's invalid knight to attach"); auto knt_iter = knights.find(from); assert_true(knt_iter != knights.cend(), "could not found knight"); auto &knight = get_knight(knt_iter, to); assert_true(rule->min_level <= knight.level, "not enough knight level to equip item"); for (int index = 0; index < rows.size(); index++) { if (rows[index].knight != to) { continue; } auto itr_rule = rule_table.find(rows[index].code); assert_true(itr_rule != rule_table.cend(), "could not find target item rule"); if (itr_rule->type == rule->type) { item_controller.set_item_knight(item_iter, rows[index].id, 0); break; } } item_controller.set_item_knight(item_iter, id, to); refresh_stat(from, to); }
void dynarec(unsigned int address){ while(!stop){ refresh_stat(); start_section(TRAMP_SECTION); PowerPC_block* dst_block = blocks_get(address>>12); unsigned long paddr = update_invalid_addr(address); /* sprintf(txtbuffer, "trampolining to 0x%08x\n", address); DEBUG_print(txtbuffer, DBG_USBGECKO); */ if(!paddr){ link_branch = NULL; address = interp_addr; dst_block = blocks_get(address>>12); paddr = update_invalid_addr(address); } if(!dst_block){ /*sprintf(txtbuffer, "block at %08x doesn't exist\n", address&~0xFFF); DEBUG_print(txtbuffer, DBG_USBGECKO);*/ dst_block = calloc(1, sizeof(PowerPC_block)); blocks_set(address>>12, dst_block); dst_block->start_address = address & ~0xFFF; dst_block->end_address = (address & ~0xFFF) + 0x1000; init_block(dst_block); } else if(invalid_code_get(address>>12)){
/// @brief /// Detach item /// @param id /// Target item id void detach(name from, uint32_t id) { require_auth(from); auto iter = item_controller.find(from); auto &rows = item_controller.get_items(iter); auto &item = item_controller.get_item(rows, id); int8_t knight = item.knight; item_controller.set_item_knight(iter, id, 0); refresh_stat(from, knight); }
//--------------------------------------------------------------------------- void __fastcall TFormPici::FormShow(TObject *Sender) { if(!g_CurPiciProductID)return; strDefaultUnit=UNIT_CAPTIONS[g_defaultUnit]; MyQuery->SQL->Text="select * from `catalog` where id="+IntToStr(g_CurPiciProductID); MyQuery->Active=true; if(!MyQuery->Eof) { correction_factor=MyQuery->FieldByName("correction_factor")->AsFloat; weight_tp=weight_kg2default(MyQuery->FieldByName("value_tp")->AsFloat); weight_ul=weight_kg2default(MyQuery->FieldByName("value_ul")->AsFloat); weight_ll=weight_kg2default(MyQuery->FieldByName("value_ll")->AsFloat); float stat_range=MyQuery->FieldByName("stat_range")->AsFloat; weight_range_ul=weight_ul*(stat_range+1); weight_range_ll=weight_ll*stat_range; weight_tare=weight_kg2default(MyQuery->FieldByName("preset_tare")->AsFloat); Label_ValueTP->Caption=WeightToStr(weight_tp)+strDefaultUnit; Label_ValueUL->Caption=WeightToStr(weight_ul)+strDefaultUnit; Label_ValueLL->Caption=WeightToStr(weight_ll)+strDefaultUnit; bNetWeight=MyQuery->FieldByName("gross_or_net")->AsInteger; SpeedButton_grossornet->Caption=bNetWeight?"N":"G"; // Edit_StatRange->Text=WeightToStr(MyQuery->FieldByName("stat_range")->AsFloat*100); // Edit_PassRate->Text=WeightToStr(MyQuery->FieldByName("pass_rate")->AsFloat*100); // Edit_PresetTare->Text=WeightToStr(MyQuery->FieldByName("preset_tare")->AsFloat); //->Text=FormatFloat("0.0",MyQuery->FieldByName("pack_length")->AsFloat); } MyQuery->Active=false; if(weight_tare) { } char strProductID[8]; sprintf(strProductID,"%03d",g_CurPiciProductID); StaticText_ProductID->Caption=strProductID; Label_PiciNumber->Caption=g_piciNumber; refresh_stat(); connected=FormMain->comm_open(true); SecondsTimer->Enabled=true; LabelUnit->Caption=strDefaultUnit; LabelUnit1->Caption=strDefaultUnit; LabelUnit2->Caption=strDefaultUnit; LabelUnit3->Caption=strDefaultUnit; LabelUnit4->Caption=strDefaultUnit; LabelUnit5->Caption=strDefaultUnit; LabelUnit6->Caption=strDefaultUnit; LabelUnit7->Caption=strDefaultUnit; LabelUnit8->Caption=strDefaultUnit; LabelUnit9->Caption=strDefaultUnit; LabelUnit10->Caption=strDefaultUnit; }
//--------------------------------------------------------------------------- __fastcall TFormPici::TFormPici(TComponent* Owner) : TForm(Owner) { this->Caption=PROJECT_COMPANY; MN_Lock->Visible=false; mark_panels[0]=Panel_LL; mark_panels[1]=Panel_TP; mark_panels[2]=Panel_UL; if(g_PiciCapacity<=0) { g_PiciCapacity=DefaultPiciCapacity; } bNetWeight=false; SecondsTimer->Interval=1000; Label_picitick->Caption=Now(); qualified_counter=0; read_weight=0; totalweight=weight_maximum=weight_minimum=totalweight1=weight_minimum1=weight_maximum1=0; weight_values=(float *)malloc(g_PiciCapacity *sizeof(float)); weight_times=(TDateTime *)malloc(g_PiciCapacity *sizeof(TDateTime)); for(int i=0;i<3;i++) { mark_panels[i]->Color=grayColors[i]; } refresh_stat(); }
void gen_interupt() { if(!__emulation_run) stop = 1; if (stop == 1) { vi_counter = 0; // debug dyna_stop(); } if (savestates_job & LOADSTATE) { savestates_load(); savestates_job &= ~LOADSTATE; return; } if (skip_jump) { if (q->count > Count || (Count - q->count) < 0x80000000) next_interupt = q->count; else next_interupt = 0; if (interpcore) { interp_addr = skip_jump; last_addr = interp_addr; } else { unsigned int dest = skip_jump; skip_jump=0; jump_to(dest); last_addr = PC->addr; } skip_jump=0; return; } switch(q->type) { case SPECIAL_INT: if (Count > 0x10000000) return; remove_interupt_event(); add_interupt_event_count(SPECIAL_INT, 0); return; break; case VI_INT: if(vi_counter < 60) { if (vi_counter == 0) cheat_apply_cheats(ENTRY_BOOT); vi_counter++; } else { cheat_apply_cheats(ENTRY_VI); } updateScreen(); #ifdef WITH_LIRC lircCheckInput(); #endif SDL_PumpEvents(); refresh_stat(); // if paused, poll for input events if(rompause) { osd_render(); // draw Paused message in case updateScreen didn't do it SDL_GL_SwapBuffers(); while(rompause) { #ifdef __WIN32__ Sleep(10); #else struct timespec ts; ts.tv_sec = 0; ts.tv_nsec = 10000000; nanosleep(&ts, NULL); // sleep for 10 milliseconds #endif SDL_PumpEvents(); #ifdef WITH_LIRC lircCheckInput(); #endif //WITH_LIRC } } new_vi(); if (vi_register.vi_v_sync == 0) vi_register.vi_delay = 500000; else vi_register.vi_delay = ((vi_register.vi_v_sync + 1)*1500); next_vi += vi_register.vi_delay; if (vi_register.vi_status&0x40) vi_field=1-vi_field; else vi_field=0; remove_interupt_event(); add_interupt_event_count(VI_INT, next_vi); MI_register.mi_intr_reg |= 0x08; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; break; case COMPARE_INT: remove_interupt_event(); Count+=2; add_interupt_event_count(COMPARE_INT, Compare); Count-=2; Cause = (Cause | 0x8000) & 0xFFFFFF83; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; break; case CHECK_INT: remove_interupt_event(); break; case SI_INT: #ifdef WITH_LIRC lircCheckInput(); #endif //WITH_LIRC SDL_PumpEvents(); PIF_RAMb[0x3F] = 0x0; remove_interupt_event(); MI_register.mi_intr_reg |= 0x02; si_register.si_stat |= 0x1000; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; break; case PI_INT: remove_interupt_event(); MI_register.mi_intr_reg |= 0x10; pi_register.read_pi_status_reg &= ~3; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; break; case AI_INT: if (ai_register.ai_status & 0x80000000) // full { unsigned int ai_event = get_event(AI_INT); remove_interupt_event(); ai_register.ai_status &= ~0x80000000; ai_register.current_delay = ai_register.next_delay; ai_register.current_len = ai_register.next_len; add_interupt_event_count(AI_INT, ai_event+ai_register.next_delay); MI_register.mi_intr_reg |= 0x04; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; } else { remove_interupt_event(); ai_register.ai_status &= ~0x40000000; //------- MI_register.mi_intr_reg |= 0x04; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; } break; case SP_INT: remove_interupt_event(); sp_register.sp_status_reg |= 0x303; //sp_register.signal1 = 1; sp_register.signal2 = 1; sp_register.broke = 1; sp_register.halt = 1; if (!sp_register.intr_break) return; MI_register.mi_intr_reg |= 0x01; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; break; case DP_INT: remove_interupt_event(); dpc_register.dpc_status &= ~2; dpc_register.dpc_status |= 0x81; MI_register.mi_intr_reg |= 0x20; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; break; case HW2_INT: // Hardware Interrupt 2 -- remove interrupt event from queue remove_interupt_event(); // setup r4300 Status flags: reset TS, and SR, set IM2 Status = (Status & ~0x00380000) | 0x1000; Cause = (Cause | 0x1000) & 0xFFFFFF83; /* the exception_general() call below will jump to the interrupt vector (0x80000180) and setup the * interpreter or dynarec */ break; case NMI_INT: // Non Maskable Interrupt -- remove interrupt event from queue remove_interupt_event(); // setup r4300 Status flags: reset TS and SR, set BEV, ERL, and SR Status = (Status & ~0x00380000) | 0x00500004; Cause = 0x00000000; // simulate the soft reset code which would run from the PIF ROM r4300_reset_soft(); // clear all interrupts, reset interrupt counters back to 0 Count = 0; vi_counter = 0; init_interupt(); // clear the audio status register so that subsequent write_ai() calls will work properly ai_register.ai_status = 0; // reset the r4300 internal state if (interpcore) /* pure interpreter only */ { // set ErrorEPC with last instruction address and set next instruction address to reset vector ErrorEPC = interp_addr; interp_addr = 0xa4000040; last_addr = interp_addr; } else /* decode-cached interpreter or dynamic recompiler */ { int i; // clear all the compiled instruction blocks for (i=0; i<0x100000; i++) { if (blocks[i]) { if (blocks[i]->block) { free(blocks[i]->block); blocks[i]->block = NULL; } if (blocks[i]->code) { free(blocks[i]->code); blocks[i]->code = NULL; } if (blocks[i]->jumps_table) { free(blocks[i]->jumps_table); blocks[i]->jumps_table = NULL; } if (blocks[i]->riprel_table) { free(blocks[i]->riprel_table); blocks[i]->riprel_table = NULL; } free(blocks[i]); blocks[i] = NULL; } } // re-initialize init_blocks(); // jump to the start ErrorEPC = PC->addr; jump_to(0xa4000040); last_addr = PC->addr; } // adjust ErrorEPC if we were in a delay slot, and clear the delay_slot and dyna_interp flags if(delay_slot==1 || delay_slot==3) { ErrorEPC-=4; } delay_slot = 0; dyna_interp = 0; return; default: remove_interupt_event(); break; } #ifdef NEW_DYNAREC EPC = pcaddr; pcaddr = 0x80000180; Status |= 2; Cause &= 0x7FFFFFFF; pending_exception=1; #else exception_general(); #endif if (savestates_job & SAVESTATE) { savestates_save(); savestates_job &= ~SAVESTATE; } }
//--------------------------------------------------------------------------- void _fastcall TFormPici::Wnd_Proc(TMessage &Msg) { switch(Msg.Msg) { case WM_QUERYENDSESSION: Msg.Result=true;break; case MSG_WEIGH_NOTIFY:if(Msg.WParam>=0 && g_CurPiciProductID) { if(g_PiciCounter<g_PiciCapacity) { read_weight=*((float *)(&Msg.LParam)); if(correction_factor!=1.0) { unsigned long int_weight=(unsigned long)(read_weight*correction_factor*1000); read_weight=(float)int_weight/1000; } if(Msg.WParam!=g_defaultUnit) { if(g_defaultUnit==UNIT_KG) { if(Msg.WParam==UNIT_G) read_weight/=1000; else read_weight*=1000; } else if(g_defaultUnit==UNIT_G) { if(Msg.WParam==UNIT_KG) read_weight*=1000; else read_weight*=1000000; } else// if(g_defaultUnit==UNIT_T) { if(Msg.WParam==UNIT_KG) read_weight/=1000; else read_weight/=1000000; } } if(bNetWeight && weight_tare!=0) { Label_Weight->Caption=WeightToStr(read_weight-weight_tare); } else { Label_Weight->Caption=WeightToStr(read_weight); } if(read_weight<weight_range_ul && read_weight>weight_range_ll) { weight_values[g_PiciCounter]=read_weight; weight_times[g_PiciCounter]=Now(); g_PiciCounter++; if(g_PiciCounter==1) { weight_maximum=weight_minimum=read_weight; } else { if(read_weight<weight_minimum)weight_minimum=read_weight; else if(read_weight>weight_maximum)weight_maximum=read_weight; } totalweight+=read_weight; } int weight_level; if(read_weight<weight_ll)weight_level=0; else if(read_weight>weight_ul)weight_level=2; else { weight_level=1; if(++qualified_counter==1) { weight_maximum1=weight_minimum1=read_weight; } else { if(read_weight<weight_minimum1)weight_minimum1=read_weight; else if(read_weight>weight_maximum1)weight_maximum1=read_weight; } totalweight1+=read_weight; } for(int i=0;i<3;i++) { mark_panels[i]->Color=(i==weight_level)?lightColors[i]:grayColors[i]; } refresh_stat(); } else if(g_PiciCounter==g_PiciCapacity) { ShowMessage("已经连续称重完成"+IntToStr(g_PiciCounter)+"次!"); MN_StopPici->Click(); } } break; } }
void gen_interupt(void) { if (stop == 1) { vi_counter = 0; // debug dyna_stop(); } if (!interupt_unsafe_state) { if (savestates_get_job() == savestates_job_load) { savestates_load(); return; } if (reset_hard_job) { reset_hard(); reset_hard_job = 0; return; } } if (skip_jump) { unsigned int dest = skip_jump; skip_jump = 0; if (q->count > Count || (Count - q->count) < 0x80000000) next_interupt = q->count; else next_interupt = 0; last_addr = dest; generic_jump_to(dest); return; } switch(q->type) { case SPECIAL_INT: if (Count > 0x10000000) return; remove_interupt_event(); add_interupt_event_count(SPECIAL_INT, 0); return; break; case VI_INT: if(vi_counter < 60) { if (vi_counter == 0) cheat_apply_cheats(ENTRY_BOOT); vi_counter++; } else { cheat_apply_cheats(ENTRY_VI); } gfx.updateScreen(); #ifdef WITH_LIRC lircCheckInput(); #endif SDL_PumpEvents(); refresh_stat(); // if paused, poll for input events if(rompause) { osd_render(); // draw Paused message in case gfx.updateScreen didn't do it VidExt_GL_SwapBuffers(); while(rompause) { SDL_Delay(10); SDL_PumpEvents(); #ifdef WITH_LIRC lircCheckInput(); #endif //WITH_LIRC } } new_vi(); if (vi_register.vi_v_sync == 0) vi_register.vi_delay = 500000; else vi_register.vi_delay = ((vi_register.vi_v_sync + 1)*1500); next_vi += vi_register.vi_delay; if (vi_register.vi_status&0x40) vi_field=1-vi_field; else vi_field=0; remove_interupt_event(); add_interupt_event_count(VI_INT, next_vi); MI_register.mi_intr_reg |= 0x08; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; break; case COMPARE_INT: remove_interupt_event(); Count+=count_per_op; add_interupt_event_count(COMPARE_INT, Compare); Count-=count_per_op; Cause = (Cause | 0x8000) & 0xFFFFFF83; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; break; case CHECK_INT: remove_interupt_event(); break; case SI_INT: #ifdef WITH_LIRC lircCheckInput(); #endif //WITH_LIRC SDL_PumpEvents(); PIF_RAMb[0x3F] = 0x0; remove_interupt_event(); MI_register.mi_intr_reg |= 0x02; si_register.si_stat |= 0x1000; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; break; case PI_INT: remove_interupt_event(); MI_register.mi_intr_reg |= 0x10; pi_register.read_pi_status_reg &= ~3; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; break; case AI_INT: if (ai_register.ai_status & 0x80000000) // full { unsigned int ai_event = get_event(AI_INT); remove_interupt_event(); ai_register.ai_status &= ~0x80000000; ai_register.current_delay = ai_register.next_delay; ai_register.current_len = ai_register.next_len; add_interupt_event_count(AI_INT, ai_event+ai_register.next_delay); MI_register.mi_intr_reg |= 0x04; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; } else { remove_interupt_event(); ai_register.ai_status &= ~0x40000000; //------- MI_register.mi_intr_reg |= 0x04; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; } break; case SP_INT: remove_interupt_event(); sp_register.sp_status_reg |= 0x203; // sp_register.sp_status_reg |= 0x303; if (!(sp_register.sp_status_reg & 0x40)) return; // !intr_on_break MI_register.mi_intr_reg |= 0x01; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; break; case DP_INT: remove_interupt_event(); dpc_register.dpc_status &= ~2; dpc_register.dpc_status |= 0x81; MI_register.mi_intr_reg |= 0x20; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; break; case HW2_INT: // Hardware Interrupt 2 -- remove interrupt event from queue remove_interupt_event(); // setup r4300 Status flags: reset TS, and SR, set IM2 Status = (Status & ~0x00380000) | 0x1000; Cause = (Cause | 0x1000) & 0xFFFFFF83; /* the exception_general() call below will jump to the interrupt vector (0x80000180) and setup the * interpreter or dynarec */ break; case NMI_INT: // Non Maskable Interrupt -- remove interrupt event from queue remove_interupt_event(); // setup r4300 Status flags: reset TS and SR, set BEV, ERL, and SR Status = (Status & ~0x00380000) | 0x00500004; Cause = 0x00000000; // simulate the soft reset code which would run from the PIF ROM r4300_reset_soft(); // clear all interrupts, reset interrupt counters back to 0 Count = 0; vi_counter = 0; init_interupt(); // clear the audio status register so that subsequent write_ai() calls will work properly ai_register.ai_status = 0; // set ErrorEPC with the last instruction address ErrorEPC = PC->addr; // reset the r4300 internal state if (r4300emu != CORE_PURE_INTERPRETER) { // clear all the compiled instruction blocks and re-initialize free_blocks(); init_blocks(); } // adjust ErrorEPC if we were in a delay slot, and clear the delay_slot and dyna_interp flags if(delay_slot==1 || delay_slot==3) { ErrorEPC-=4; } delay_slot = 0; dyna_interp = 0; // set next instruction address to reset vector last_addr = 0xa4000040; generic_jump_to(0xa4000040); return; default: DebugMessage(M64MSG_ERROR, "Unknown interrupt queue event type %.8X.", q->type); remove_interupt_event(); break; } #ifdef NEW_DYNAREC if (r4300emu == CORE_DYNAREC) { EPC = pcaddr; pcaddr = 0x80000180; Status |= 2; Cause &= 0x7FFFFFFF; pending_exception=1; } else { exception_general(); } #else exception_general(); #endif if (!interupt_unsafe_state) { if (savestates_get_job() == savestates_job_save) { savestates_save(); return; } } }
void gen_interupt() { //if (!skip_jump) //printf("interrupt:%x (%x)\n", q->type, Count); if (stop == 1) dyna_stop(); if (savestates_job & LOADSTATE) { savestates_load(); savestates_job &= ~LOADSTATE; return; } if (skip_jump /*&& !dynacore*/) { if (q->count > Count || (Count - q->count) < 0x80000000) next_interupt = q->count; else next_interupt = 0; if (interpcore) { /*if ((Cause & (2 << 2)) && (Cause & 0x80000000)) interp_addr = skip_jump+4; else*/ interp_addr = skip_jump; last_addr = interp_addr; } else { /*if ((Cause & (2 << 2)) && (Cause & 0x80000000)) jump_to(skip_jump+4); else*/ unsigned long dest = skip_jump; skip_jump=0; jump_to(dest); last_addr = PC->addr; } skip_jump=0; return; } switch(q->type) { case SPECIAL_INT: if (Count > 0x10000000) return; remove_interupt_event(); add_interupt_event_count(SPECIAL_INT, 0); return; break; case VI_INT: #ifdef VCR_SUPPORT VCR_updateScreen(); #else updateScreen(); #endif #ifndef __WIN32__ SDL_PumpEvents(); refresh_stat(); #endif new_vi(); if (vi_register.vi_v_sync == 0) vi_register.vi_delay = 500000; else vi_register.vi_delay = ((vi_register.vi_v_sync + 1)*1500); next_vi += vi_register.vi_delay; if (vi_register.vi_status&0x40) vi_field=1-vi_field; else vi_field=0; remove_interupt_event(); add_interupt_event_count(VI_INT, next_vi); MI_register.mi_intr_reg |= 0x08; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; break; case COMPARE_INT: remove_interupt_event(); Count+=2; add_interupt_event_count(COMPARE_INT, Compare); Count-=2; Cause = (Cause | 0x8000) & 0xFFFFFF83; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; break; case CHECK_INT: remove_interupt_event(); break; case SI_INT: #ifndef __WIN32__ SDL_PumpEvents(); #endif PIF_RAMb[0x3F] = 0x0; remove_interupt_event(); MI_register.mi_intr_reg |= 0x02; si_register.si_status |= 0x1000; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; break; case PI_INT: remove_interupt_event(); MI_register.mi_intr_reg |= 0x10; pi_register.read_pi_status_reg &= ~3; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; break; case AI_INT: if (ai_register.ai_status & 0x80000000) // full { unsigned long ai_event = get_event(AI_INT); remove_interupt_event(); ai_register.ai_status &= ~0x80000000; ai_register.current_delay = ai_register.next_delay; ai_register.current_len = ai_register.next_len; //add_interupt_event(AI_INT, ai_register.next_delay/**2*/); add_interupt_event_count(AI_INT, ai_event+ai_register.next_delay); MI_register.mi_intr_reg |= 0x04; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; } else { remove_interupt_event(); ai_register.ai_status &= ~0x40000000; //------- MI_register.mi_intr_reg |= 0x04; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; //return; } break; case SP_INT: remove_interupt_event(); sp_register.sp_status_reg |= 0x303; //sp_register.signal1 = 1; sp_register.signal2 = 1; sp_register.broke = 1; sp_register.halt = 1; if (!sp_register.intr_break) return; MI_register.mi_intr_reg |= 0x01; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; break; case DP_INT: remove_interupt_event(); dpc_register.dpc_status &= ~2; dpc_register.dpc_status |= 0x81; MI_register.mi_intr_reg |= 0x20; if (MI_register.mi_intr_reg & MI_register.mi_intr_mask_reg) Cause = (Cause | 0x400) & 0xFFFFFF83; else return; if ((Status & 7) != 1) return; if (!(Status & Cause & 0xFF00)) return; break; default: remove_interupt_event(); break; } exception_general(); if (savestates_job & SAVESTATE) { savestates_save(); savestates_job &= ~SAVESTATE; } #ifdef __WIN32__ extern BOOL emu_paused; while(emu_paused) { Sleep(10); // viStatusChanged(); //// processDList(); // processRDPList(); // updateScreen(); processLuaMessages(); } #endif }
void psxRcntUpdate() { u32 cycle; cycle = psxRegs.cycle; // rcnt 0. if( cycle - rcnts[0].cycleStart >= rcnts[0].cycle ) { psxRcntReset( 0 ); } // rcnt 1. if( cycle - rcnts[1].cycleStart >= rcnts[1].cycle ) { psxRcntReset( 1 ); } // rcnt 2. if( cycle - rcnts[2].cycleStart >= rcnts[2].cycle ) { psxRcntReset( 2 ); } // rcnt base. if( cycle - rcnts[3].cycleStart >= rcnts[3].cycle ) { psxRcntReset( 3 ); spuSyncCount++; hSyncCount++; // Update spu. if( spuSyncCount >= SpuUpdInterval[Config.PsxType] ) { spuSyncCount = 0; if( SPU_async ) { SPU_async( SpuUpdInterval[Config.PsxType] * rcnts[3].target ); } } // VSync irq. if( hSyncCount == VBlankStart[Config.PsxType] ) { GPU_vBlank( 1 ); // For the best times. :D //setIrq( 0x01 ); } // Update lace. (with InuYasha fix) if( hSyncCount >= (Config.VSyncWA ? HSyncTotal[Config.PsxType] / BIAS : HSyncTotal[Config.PsxType]) ) { hSyncCount = 0; GPU_vBlank( 0 ); setIrq( 0x01 ); GPU_updateLace(); EmuUpdate(); } } #ifdef PROFILE refresh_stat(); #endif // DebugVSync(); }
void gen_interupt() { if (stop == 1) { dyna_stop(); } if (savestates_job & LOADSTATE) { savestates_load(); savestates_job &= ~LOADSTATE; return; } if (skip_jump) { if (q->count > Count || (Count - q->count) < 0x80000000) { next_interupt = q->count; } else { next_interupt = 0; } interp_addr = skip_jump; last_addr = interp_addr; skip_jump=0; return; } switch(q->type) { case SPECIAL_INT: if (Count > 0x10000000) { return; } remove_interupt_event(); add_interupt_event_count(SPECIAL_INT, 0); return; break; case VI_INT: updateScreen(); #ifdef PROFILE refresh_stat(); #endif new_vi(); vi_register.vi_delay = (vi_register.vi_v_sync == 0) ? 500000 : ((vi_register.vi_v_sync + 1)*1500); next_vi += vi_register.vi_delay; vi_field = (vi_register.vi_status&0x40) ? 1-vi_field : 0; remove_interupt_event(); add_interupt_event_count(VI_INT, next_vi); MI_register.mi_intr_reg |= 0x08; if(!chk_status(1)) { return; } break; case COMPARE_INT: remove_interupt_event(); Count+=2; add_interupt_event_count(COMPARE_INT, Compare); Count-=2; Cause = (Cause | 0x8000) & 0xFFFFFF83; if(!chk_status(0)) { return; } break; case CHECK_INT: remove_interupt_event(); break; case SI_INT: PIF_RAMb[0x3F] = 0x0; remove_interupt_event(); MI_register.mi_intr_reg |= 0x02; si_register.si_status |= 0x1000; if(!chk_status(1)) { return; } break; case PI_INT: remove_interupt_event(); MI_register.mi_intr_reg |= 0x10; pi_register.read_pi_status_reg &= ~3; if(!chk_status(1)) { return; } break; case AI_INT: if (ai_register.ai_status & 0x80000000) { // full unsigned long ai_event = get_event(AI_INT); remove_interupt_event(); ai_register.ai_status &= ~0x80000000; ai_register.current_delay = ai_register.next_delay; ai_register.current_len = ai_register.next_len; add_interupt_event_count(AI_INT, ai_event+ai_register.next_delay); } else { remove_interupt_event(); ai_register.ai_status &= ~0x40000000; } MI_register.mi_intr_reg |= 0x04; if(!chk_status(1)) { return; } break; default: remove_interupt_event(); break; } exception_general(); if (savestates_job & SAVESTATE) { savestates_save(); savestates_job &= ~SAVESTATE; } }