OSDN Git Service

[VM] .
[csp-qt/common_source_project-fm7.git] / source / src / vm / i386.cpp
index 38e9838..b3ad522 100644 (file)
 #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)
@@ -436,6 +440,47 @@ bool I386::write_debug_reg(const _TCHAR *reg, uint32_t data)
        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;
@@ -496,43 +541,83 @@ int I386::get_shutdown_flag()
        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;
 }