Rearrange register layout and exclude useless regs from savestat
This changes the savestate format once again.
This commit is contained in:
parent
2d34d91c64
commit
5be5015338
|
@ -111,7 +111,6 @@ void execute_store_u32_safe(u32 address, u32 source);
|
|||
#define reg_x5 ARMREG_R8
|
||||
|
||||
#define mem_reg (~0U)
|
||||
#define save1_reg 21
|
||||
|
||||
/*
|
||||
|
||||
|
@ -1462,14 +1461,14 @@ u32 execute_store_cpsr_body(u32 _cpsr, u32 store_mask, u32 address)
|
|||
arm_block_memory_offset_##offset_type(); \
|
||||
arm_block_memory_writeback_##access_type(writeback_type); \
|
||||
ARM_BIC_REG_IMM(0, reg_s0, reg_s0, 0x03, 0); \
|
||||
arm_generate_store_reg(reg_s0, save1_reg); \
|
||||
arm_generate_store_reg(reg_s0, REG_SAVE); \
|
||||
\
|
||||
for(i = 0; i < 16; i++) \
|
||||
{ \
|
||||
if((reg_list >> i) & 0x01) \
|
||||
{ \
|
||||
cycle_count++; \
|
||||
arm_generate_load_reg(reg_s0, save1_reg); \
|
||||
arm_generate_load_reg(reg_s0, REG_SAVE); \
|
||||
generate_add_reg_reg_imm(reg_a0, reg_s0, offset, 0); \
|
||||
if(reg_list & ~((2 << i) - 1)) \
|
||||
{ \
|
||||
|
@ -1735,14 +1734,14 @@ u32 execute_store_cpsr_body(u32 _cpsr, u32 store_mask, u32 address)
|
|||
#define thumb_block_memory_extra_down() \
|
||||
|
||||
#define thumb_block_memory_extra_pop_pc() \
|
||||
thumb_generate_load_reg(reg_s0, save1_reg); \
|
||||
thumb_generate_load_reg(reg_s0, REG_SAVE); \
|
||||
generate_add_reg_reg_imm(reg_a0, reg_s0, (bit_count[reg_list] * 4), 0); \
|
||||
generate_function_call(execute_load_u32); \
|
||||
write32((pc + 4)); \
|
||||
generate_indirect_branch_cycle_update(thumb) \
|
||||
|
||||
#define thumb_block_memory_extra_push_lr(base_reg) \
|
||||
thumb_generate_load_reg(reg_s0, save1_reg); \
|
||||
thumb_generate_load_reg(reg_s0, REG_SAVE); \
|
||||
generate_add_reg_reg_imm(reg_a0, reg_s0, (bit_count[reg_list] * 4), 0); \
|
||||
thumb_generate_load_reg(reg_a1, REG_LR); \
|
||||
generate_function_call(execute_store_u32_safe) \
|
||||
|
@ -1789,14 +1788,14 @@ u32 execute_store_cpsr_body(u32 _cpsr, u32 store_mask, u32 address)
|
|||
ARM_BIC_REG_IMM(0, reg_s0, reg_s0, 0x03, 0); \
|
||||
thumb_block_address_preadjust_##pre_op(); \
|
||||
thumb_block_address_postadjust_##post_op(base_reg); \
|
||||
thumb_generate_store_reg(reg_s0, save1_reg); \
|
||||
thumb_generate_store_reg(reg_s0, REG_SAVE); \
|
||||
\
|
||||
for(i = 0; i < 8; i++) \
|
||||
{ \
|
||||
if((reg_list >> i) & 0x01) \
|
||||
{ \
|
||||
cycle_count++; \
|
||||
thumb_generate_load_reg(reg_s0, save1_reg); \
|
||||
thumb_generate_load_reg(reg_s0, REG_SAVE); \
|
||||
generate_add_reg_reg_imm(reg_a0, reg_s0, offset, 0); \
|
||||
if(reg_list & ~((2 << i) - 1)) \
|
||||
{ \
|
||||
|
|
|
@ -36,16 +36,17 @@ _##symbol:
|
|||
#define REG_C_FLAG (18 * 4)
|
||||
#define REG_V_FLAG (19 * 4)
|
||||
#define REG_CPSR (20 * 4)
|
||||
#define CPU_MODE (21 * 4)
|
||||
#define CPU_HALT_STATE (22 * 4)
|
||||
|
||||
#define REG_SAVE (21 * 4)
|
||||
#define REG_SAVE2 (22 * 4)
|
||||
#define REG_SAVE3 (23 * 4)
|
||||
|
||||
#define CPU_MODE (29 * 4)
|
||||
#define CPU_HALT_STATE (30 * 4)
|
||||
#define CHANGED_PC_STATUS (31 * 4)
|
||||
#define COMPLETED_FRAME (32 * 4)
|
||||
#define OAM_UPDATED (33 * 4)
|
||||
#define CHANGED_PC_STATUS (24 * 4)
|
||||
#define COMPLETED_FRAME (25 * 4)
|
||||
#define OAM_UPDATED (26 * 4)
|
||||
#define REG_SAVE (27 * 4)
|
||||
#define REG_SAVE2 (28 * 4)
|
||||
#define REG_SAVE3 (29 * 4)
|
||||
#define REG_SAVE4 (30 * 4)
|
||||
#define REG_SAVE5 (31 * 4)
|
||||
|
||||
#define reg_a0 r0
|
||||
#define reg_a1 r1
|
||||
|
|
12
cpu.c
12
cpu.c
|
@ -3780,12 +3780,12 @@ void init_cpu(void)
|
|||
reg_mode[MODE_SUPERVISOR][5] = 0x03007FE0;
|
||||
}
|
||||
|
||||
#define cpu_savestate_builder(type) \
|
||||
void cpu_##type##_savestate(void) \
|
||||
{ \
|
||||
state_mem_##type(reg, 0x100); \
|
||||
state_mem_##type##_array(spsr); \
|
||||
state_mem_##type##_array(reg_mode); \
|
||||
#define cpu_savestate_builder(type) \
|
||||
void cpu_##type##_savestate(void) \
|
||||
{ \
|
||||
state_mem_##type(reg, 4 * REG_IGNORE); \
|
||||
state_mem_##type##_array(spsr); \
|
||||
state_mem_##type##_array(reg_mode); \
|
||||
}
|
||||
|
||||
cpu_savestate_builder(read)
|
||||
|
|
25
cpu.h
25
cpu.h
|
@ -69,6 +69,7 @@ typedef u16 irq_type;
|
|||
|
||||
typedef enum
|
||||
{
|
||||
// CPU status & registers
|
||||
REG_SP = 13,
|
||||
REG_LR = 14,
|
||||
REG_PC = 15,
|
||||
|
@ -77,14 +78,22 @@ typedef enum
|
|||
REG_C_FLAG = 18,
|
||||
REG_V_FLAG = 19,
|
||||
REG_CPSR = 20,
|
||||
REG_SAVE = 21,
|
||||
REG_SAVE2 = 22,
|
||||
REG_SAVE3 = 23,
|
||||
CPU_MODE = 29,
|
||||
CPU_HALT_STATE = 30,
|
||||
CHANGED_PC_STATUS = 31,
|
||||
COMPLETED_FRAME = 32,
|
||||
OAM_UPDATED = 33
|
||||
CPU_MODE = 21,
|
||||
CPU_HALT_STATE = 22,
|
||||
REG_IGNORE = 23,
|
||||
|
||||
// Dynarec signaling and spilling
|
||||
// (Not really part of the CPU state)
|
||||
CHANGED_PC_STATUS = 24,
|
||||
COMPLETED_FRAME = 25,
|
||||
OAM_UPDATED = 26,
|
||||
REG_SAVE = 27,
|
||||
REG_SAVE2 = 28,
|
||||
REG_SAVE3 = 29,
|
||||
REG_SAVE4 = 30,
|
||||
REG_SAVE5 = 31,
|
||||
|
||||
REG_MAX = 64
|
||||
} ext_reg_numbers;
|
||||
|
||||
typedef enum
|
||||
|
|
|
@ -2513,13 +2513,13 @@ u8 swi_hle_handle[256] =
|
|||
|
||||
|
||||
// Register save layout as follows:
|
||||
#define ReOff_RegPC (15*4) // REG_PC
|
||||
#define ReOff_CPSR (20*4) // REG_CPSR
|
||||
#define ReOff_SaveR1 (21*4) // 3 save scratch regs
|
||||
#define ReOff_SaveR2 (22*4)
|
||||
#define ReOff_SaveR3 (23*4)
|
||||
#define ReOff_OamUpd (33*4) // OAM_UPDATED
|
||||
#define ReOff_GP_Save (34*4) // GP_SAVE
|
||||
#define ReOff_RegPC (REG_PC * 4) // REG_PC
|
||||
#define ReOff_CPSR (REG_CPSR * 4) // REG_CPSR
|
||||
#define ReOff_SaveR1 (REG_SAVE * 4) // 3 save scratch regs
|
||||
#define ReOff_SaveR2 (REG_SAVE2 * 4)
|
||||
#define ReOff_SaveR3 (REG_SAVE3 * 4)
|
||||
#define ReOff_OamUpd (OAM_UPDATED*4) // OAM_UPDATED
|
||||
#define ReOff_GP_Save (REG_SAVE4 * 4) // GP_SAVE
|
||||
|
||||
// Saves all regs to their right slot and loads gp
|
||||
#define emit_save_regs(save_a2) { \
|
||||
|
|
|
@ -100,16 +100,17 @@ symbol:
|
|||
.equ REG_C_FLAG, (18 * 4)
|
||||
.equ REG_V_FLAG, (19 * 4)
|
||||
.equ REG_CPSR, (20 * 4)
|
||||
.equ REG_SAVE, (21 * 4)
|
||||
.equ REG_SAVE2, (22 * 4)
|
||||
.equ REG_SAVE3, (23 * 4)
|
||||
.equ CPU_MODE, (29 * 4)
|
||||
.equ CPU_HALT_STATE, (30 * 4)
|
||||
.equ CHANGED_PC_STATUS, (31 * 4)
|
||||
.equ COMPLETED_FRAME, (32 * 4)
|
||||
.equ OAM_UPDATED, (33 * 4)
|
||||
.equ GP_SAVE, (34 * 4)
|
||||
.equ GP_SAVE_HI, (35 * 4)
|
||||
.equ CPU_MODE, (21 * 4)
|
||||
.equ CPU_HALT_STATE, (22 * 4)
|
||||
|
||||
.equ CHANGED_PC_STATUS, (24 * 4)
|
||||
.equ COMPLETED_FRAME, (25 * 4)
|
||||
.equ OAM_UPDATED, (26 * 4)
|
||||
.equ REG_SAVE, (27 * 4)
|
||||
.equ REG_SAVE2, (28 * 4)
|
||||
.equ REG_SAVE3, (29 * 4)
|
||||
.equ GP_SAVE, (30 * 4)
|
||||
.equ GP_SAVE_HI, (31 * 4)
|
||||
|
||||
.equ SPSR_BASE, (0x100 + 0x400 * 3)
|
||||
.equ REGMODE_BASE, (SPSR_BASE + 24)
|
||||
|
|
|
@ -52,14 +52,17 @@ _##symbol:
|
|||
.equ REG_C_FLAG, (18 * 4)
|
||||
.equ REG_V_FLAG, (19 * 4)
|
||||
.equ REG_CPSR, (20 * 4)
|
||||
.equ REG_SAVE, (21 * 4)
|
||||
.equ REG_SAVE2, (22 * 4)
|
||||
.equ REG_SAVE3, (23 * 4)
|
||||
.equ CPU_MODE, (29 * 4)
|
||||
.equ CPU_HALT_STATE, (30 * 4)
|
||||
.equ CHANGED_PC_STATUS, (31 * 4)
|
||||
.equ COMPLETED_FRAME, (32 * 4)
|
||||
.equ OAM_UPDATED, (33 * 4)
|
||||
.equ CPU_MODE, (21 * 4)
|
||||
.equ CPU_HALT_STATE, (22 * 4)
|
||||
|
||||
.equ CHANGED_PC_STATUS, (24 * 4)
|
||||
.equ COMPLETED_FRAME, (25 * 4)
|
||||
.equ OAM_UPDATED, (26 * 4)
|
||||
.equ REG_SAVE, (27 * 4)
|
||||
.equ REG_SAVE2, (28 * 4)
|
||||
.equ REG_SAVE3, (29 * 4)
|
||||
.equ REG_SAVE4, (30 * 4)
|
||||
.equ REG_SAVE5, (31 * 4)
|
||||
|
||||
.equ ESTORE_U32_TBL, -(16 * 4)
|
||||
.equ ESTORE_U16_TBL, -(32 * 4)
|
||||
|
|
Loading…
Reference in New Issue