#define CPU_INIT(name) void* CPU_INIT_NAME(name)()
#define CPU_INIT_CALL(name) CPU_INIT_NAME(name)()
+#define CPU_TABLE_NAME(name) cpu_table_##name
+#define CPU_TABLE(name) void CPU_TABLE_NAME(name)(i386_state *cpustate)
+#define CPU_TABLE_CALL(name) CPU_TABLE_NAME(name)(cpustate)
+
#define CPU_RESET_NAME(name) cpu_reset_##name
#define CPU_RESET(name) void CPU_RESET_NAME(name)(i386_state *cpustate)
#define CPU_RESET_CALL(name) CPU_RESET_NAME(name)(cpustate)
return true;
}
+uint32_t I386::read_debug_reg(const _TCHAR *reg)
+{
+ i386_state *cpustate = (i386_state *)opaque;
+ if(_tcsicmp(reg, _T("IP")) == 0) {
+ return cpustate->eip;
+ } else if(_tcsicmp(reg, _T("AX")) == 0) {
+ return REG16(AX);
+ } else if(_tcsicmp(reg, _T("BX")) == 0) {
+ return REG16(BX);
+ } else if(_tcsicmp(reg, _T("CX")) == 0) {
+ return REG16(CX);
+ } else if(_tcsicmp(reg, _T("DX")) == 0) {
+ return REG16(DX);
+ } else if(_tcsicmp(reg, _T("SP")) == 0) {
+ return REG16(SP);
+ } else if(_tcsicmp(reg, _T("BP")) == 0) {
+ return REG16(BP);
+ } else if(_tcsicmp(reg, _T("SI")) == 0) {
+ return REG16(SI);
+ } else if(_tcsicmp(reg, _T("DI")) == 0) {
+ return REG16(DI);
+ } else if(_tcsicmp(reg, _T("AL")) == 0) {
+ return REG8(AL);
+ } else if(_tcsicmp(reg, _T("AH")) == 0) {
+ return REG8(AH);
+ } else if(_tcsicmp(reg, _T("BL")) == 0) {
+ return REG8(BL);
+ } else if(_tcsicmp(reg, _T("BH")) == 0) {
+ return REG8(BH);
+ } else if(_tcsicmp(reg, _T("CL")) == 0) {
+ return REG8(CL);
+ } else if(_tcsicmp(reg, _T("CH")) == 0) {
+ return REG8(CH);
+ } else if(_tcsicmp(reg, _T("DL")) == 0) {
+ return REG8(DL);
+ } else if(_tcsicmp(reg, _T("DH")) == 0) {
+ return REG8(DH);
+ }
+ return 0;
+}
+
void I386::get_debug_regs_info(_TCHAR *buffer, size_t buffer_len)
{
i386_state *cpustate = (i386_state *)opaque;
return cpustate->shutdown;
}
-#define STATE_VERSION 2
-
-void I386::save_state(FILEIO* state_fio)
-{
- state_fio->FputUint32(STATE_VERSION);
- state_fio->FputInt32(this_device_id);
-
- state_fio->Fwrite(opaque, sizeof(i386_state), 1);
-}
+#define STATE_VERSION 3
-bool I386::load_state(FILEIO* state_fio)
+bool I386::process_state(FILEIO* state_fio, bool loading)
{
- if(state_fio->FgetUint32() != STATE_VERSION) {
+ i386_state *cpustate = (i386_state *)opaque;
+ vtlb_state *vtlb = cpustate->vtlb;
+ void *cpudevice = NULL;
+ offs_t *live = NULL;
+ int live_size = 0;
+ int *fixedpages = NULL;
+ int fixedpages_size = 0;
+ vtlb_entry *table = NULL;
+ int table_size = 0;
+// vtlb_entry *save = NULL;
+// int save_size = 0;
+ if(vtlb != NULL) {
+ cpudevice = vtlb->cpudevice;
+ live = vtlb->live;
+ live_size = vtlb->live_size;
+ fixedpages = vtlb->fixedpages;
+ fixedpages_size = vtlb->fixedpages_size;
+ table = vtlb->table;
+ table_size = vtlb->table_size;
+// save = vtlb->save;
+// save_size = vtlb->save_size;
+ }
+ if(!state_fio->StateCheckUint32(STATE_VERSION)) {
return false;
}
- if(state_fio->FgetInt32() != this_device_id) {
+ if(!state_fio->StateCheckInt32(this_device_id)) {
return false;
}
- state_fio->Fread(opaque, sizeof(i386_state), 1);
+ state_fio->StateBuffer(opaque, sizeof(i386_state), 1);
+ if(vtlb != NULL) {
+ state_fio->StateBuffer(vtlb, sizeof(vtlb_state), 1);
+ }
+ if(live != NULL && live_size > 0) {
+ state_fio->StateBuffer(live, live_size, 1);
+ }
+ if(fixedpages != NULL && fixedpages_size > 0) {
+ state_fio->StateBuffer(fixedpages, fixedpages_size, 1);
+ }
+ if(table != NULL && table_size > 0) {
+ state_fio->StateBuffer(table, table_size, 1);
+ }
+// if(save != NULL && save_size > 0) {
+// state_fio->StateBuffer(save, save_size, 1);
+// }
// post process
- i386_state *cpustate = (i386_state *)opaque;
- cpustate->pic = d_pic;
- cpustate->program = d_mem;
- cpustate->io = d_io;
+ if(loading) {
+ cpustate->vtlb = vtlb;
+ if(vtlb != NULL) {
+ vtlb->cpudevice = cpudevice;
+ vtlb->live = live;
+ vtlb->fixedpages = fixedpages;
+ vtlb->table = table;
+// vtlb->save = save;
+ }
+ cpustate->pic = d_pic;
+ cpustate->program = d_mem;
+ cpustate->io = d_io;
#ifdef I86_PSEUDO_BIOS
- cpustate->bios = d_bios;
+ cpustate->bios = d_bios;
#endif
#ifdef SINGLE_MODE_DMA
- cpustate->dma = d_dma;
+ cpustate->dma = d_dma;
#endif
#ifdef USE_DEBUGGER
- cpustate->emu = emu;
- cpustate->debugger = d_debugger;
- cpustate->program_stored = d_mem;
- cpustate->io_stored = d_io;
+ cpustate->emu = emu;
+ cpustate->debugger = d_debugger;
+ cpustate->program_stored = d_mem;
+ cpustate->io_stored = d_io;
+ cpustate->prev_total_cycles = cpustate->total_cycles;
#endif
+ CPU_TABLE_CALL(CPU_MODEL);
+ }
return true;
}