From 51d2efba039f93f993f959c7dcea6eb2af77b4dd Mon Sep 17 00:00:00 2001 From: Aaron Culliney Date: Sun, 25 Mar 2018 15:43:56 -0700 Subject: [PATCH] Streamline CPU tracing codepaths and remove some deadc0de --- src/arm/cpu.S | 28 ++-------------------------- src/arm/glue-offsets32.h | 8 ++++---- src/cpu-supp.c | 27 +++------------------------ src/cpu.h | 2 -- src/glue-offsets.c | 8 ++++---- src/glue.h | 19 +++++++++++-------- src/test/testcpu.c | 1 - src/timing.c | 1 - src/vm.c | 6 ------ src/x86/cpu.S | 35 ++++++----------------------------- src/x86/glue-offsets32.h | 8 ++++---- src/x86/glue-offsets64.h | 8 ++++---- 12 files changed, 38 insertions(+), 113 deletions(-) diff --git a/src/arm/cpu.S b/src/arm/cpu.S index 8dae3768..04f4c607 100644 --- a/src/arm/cpu.S +++ b/src/arm/cpu.S @@ -47,10 +47,6 @@ bl CALL(cpu65_trace_prologue); # define TRACE_ARG \ bl CALL(cpu65_trace_arg); -# define TRACE_ARG1 \ - bl CALL(cpu65_trace_arg1); -# define TRACE_ARG2 \ - bl CALL(cpu65_trace_arg2); # define TRACE_EPILOGUE \ CommonSaveCPUState; \ bl CALL(cpu65_trace_epilogue); @@ -59,8 +55,6 @@ #else # define TRACE_PROLOGUE # define TRACE_ARG -# define TRACE_ARG1 -# define TRACE_ARG2 # define TRACE_EPILOGUE # define TRACE_IRQ #endif @@ -128,12 +122,12 @@ AddUint16(PC_Reg, #2) \ ldr r1, [reg_vmem_r, EffectiveAddr, LSL PTR_SHIFT]; \ blx r1; \ - TRACE_ARG1 \ + TRACE_ARG \ mov lo_byte, r0; \ IncUint16(EffectiveAddr) \ ldr r1, [reg_vmem_r, EffectiveAddr, LSL PTR_SHIFT]; \ blx r1; \ - TRACE_ARG2; \ + TRACE_ARG; \ mov hi_byte, hi_byte, LSL #8; \ orr r0, hi_byte, lo_byte; @@ -2408,14 +2402,6 @@ continue: add r1, r1, cycles_exe str r1, [reg_args, #CPU65_CYCLE_COUNT] -#if CONFORMANT_IRQ_CHECKPOINT -# error 2018/01/15 untested ... - ldr r1, [reg_args, #CPU_IRQCHECK] // AppleWin : CheckInterruptSources() - subs r1, r1, cycles_exe - str r1, [reg_args, #CPU_IRQCHECK] - bmi irq_checkpoint -#endif - continue1: ldr r1, [reg_args, #CPU65_CYCLES_TO_EXECUTE] subs r1, r1, cycles_exe str r1, [reg_args, #CPU65_CYCLES_TO_EXECUTE] @@ -2428,16 +2414,6 @@ continue2: ldrb r0, [reg_args, #CPU65__SIGNAL] CPUStatsReset JumpNextInstruction -#if CONFORMANT_IRQ_CHECKPOINT -# error 2018/01/15 untested ... -irq_checkpoint: - bl CALL(cpu_irqCheck); - //eor r1, r1, r1 - mov r1, #IRQ_CHECK_CYCLES - str r1, [reg_args, #CPU_IRQCHECK] - b continue1 -#endif - /* ------------------------------------------------------------------------- Exception handlers ------------------------------------------------------------------------- */ diff --git a/src/arm/glue-offsets32.h b/src/arm/glue-offsets32.h index 7645e911..090e8737 100644 --- a/src/arm/glue-offsets32.h +++ b/src/arm/glue-offsets32.h @@ -1,9 +1,9 @@ /* This file is auto-generated for a specific architecture ABI */ -#define CPU_IRQCHECK 0 +#define UNUSED0 0 #define CPU65_TRACE_PROLOGUE 4 #define CPU65_TRACE_ARG 8 -#define CPU65_TRACE_ARG1 12 -#define CPU65_TRACE_ARG2 16 +#define UNUSED1 12 +#define UNUSED2 16 #define CPU65_TRACE_EPILOGUE 20 #define CPU65_TRACE_IRQ 24 #define DEBUG_ILLEGAL_BCD 28 @@ -33,7 +33,7 @@ #define GC_CYCLES_TIMER_1 124 #define CPU65_CYCLES_TO_EXECUTE 128 #define CPU65_CYCLE_COUNT 132 -#define IRQ_CHECK_TIMEOUT 136 +#define UNUSED3 136 #define INTERRUPT_VECTOR 140 #define RESET_VECTOR 142 #define CPU65_PC 144 diff --git a/src/cpu-supp.c b/src/cpu-supp.c index 654e75c5..bab1c218 100644 --- a/src/cpu-supp.c +++ b/src/cpu-supp.c @@ -610,9 +610,6 @@ static void init_flags_conversion_tables(void) { static __attribute__((constructor)) void __init_cpu65(void) { // emulator_registerStartupCallback(CTOR_PRIORITY_LATE, &_init_cpu65); -- 2018/01/15 NOTE : too late for testcpu.c - extern void (*cpu_irqCheck)(uint16_t, uint8_t); - run_args.cpu_irqCheck = cpu_irqCheck; - run_args.cpu65_vmem_r = &cpu65_vmem_r[0]; run_args.cpu65_vmem_w = &cpu65_vmem_w[0]; run_args.cpu65_flags_encode = &cpu65_flags_encode[0]; @@ -628,10 +625,6 @@ static __attribute__((constructor)) void __init_cpu65(void) { run_args.cpu65_trace_prologue = cpu65_trace_prologue; extern void (*cpu65_trace_arg)(uint16_t, uint8_t); run_args.cpu65_trace_arg = cpu65_trace_arg; - extern void (*cpu65_trace_arg1)(uint16_t, uint8_t); - run_args.cpu65_trace_arg1 = cpu65_trace_arg1; - extern void (*cpu65_trace_arg2)(uint16_t, uint8_t); - run_args.cpu65_trace_arg2 = cpu65_trace_arg2; extern void (*cpu65_trace_epilogue)(uint16_t, uint8_t); run_args.cpu65_trace_epilogue = cpu65_trace_epilogue; extern void (*cpu65_trace_irq)(uint16_t, uint8_t); @@ -798,20 +791,6 @@ GLUE_C_WRITE(cpu65_trace_arg) opargs[nargs++] = b; } -GLUE_C_WRITE(cpu65_trace_arg1) -{ - assert(nargs <= 2); - opargs[2] = b; - ++nargs; -} - -GLUE_C_WRITE(cpu65_trace_arg2) -{ - assert(nargs <= 2); - opargs[1] = b; - ++nargs; -} - GLUE_C_WRITE(cpu65_trace_epilogue) { int8_t arg1 = opargs[1]; @@ -888,11 +867,11 @@ GLUE_C_WRITE(cpu65_trace_epilogue) char fmt[64]; if (UNLIKELY(run_args.cpu65_opcycles >= 10)) { // occurs rarely for interrupt + opcode - snprintf(fmt, 64, "%s", " %s CY:%u irqChk:%d totCyc:%d EA:%04X"); + snprintf(fmt, 64, "%s", " %s CY:%u totCyc:%d EA:%04X"); } else { - snprintf(fmt, 64, "%s", " %s CYC:%u irqChk:%d totCyc:%d EA:%04X"); + snprintf(fmt, 64, "%s", " %s CYC:%u totCyc:%d EA:%04X"); } - fprintf(cpu_trace_fp, fmt, flags_buf, run_args.cpu65_opcycles, (run_args.irq_check_timeout - run_args.cpu65_opcycles), (cycles_count_total + run_args.cpu65_opcycles), run_args.cpu65_ea); + fprintf(cpu_trace_fp, fmt, flags_buf, run_args.cpu65_opcycles, (cycles_count_total + run_args.cpu65_opcycles), run_args.cpu65_ea); sprintf(fmt, " %s %s", opcodes_65c02[run_args.cpu65_opcode].mnemonic, disasm_templates[opcodes_65c02[run_args.cpu65_opcode].mode]); diff --git a/src/cpu.h b/src/cpu.h index ef77ae1e..137a0936 100644 --- a/src/cpu.h +++ b/src/cpu.h @@ -62,8 +62,6 @@ void cpu65_trace_checkpoint(void); #endif /* !__ASSEMBLER__ */ -#define IRQ_CHECK_CYCLES 128 - #define ResetSig 0x02 #define IRQ6522 0x08 #define IRQSpeech 0x10 diff --git a/src/glue-offsets.c b/src/glue-offsets.c index c282f2e5..0e0f284d 100644 --- a/src/glue-offsets.c +++ b/src/glue-offsets.c @@ -19,12 +19,12 @@ int main (int argc, char **argv) { printf("/* This file is auto-generated for a specific architecture ABI */\n"); - OUTPUT_CPU_IRQCHECK(); + OUTPUT_UNUSED0(); OUTPUT_CPU65_TRACE_PROLOGUE(); OUTPUT_CPU65_TRACE_ARG(); - OUTPUT_CPU65_TRACE_ARG1(); - OUTPUT_CPU65_TRACE_ARG2(); + OUTPUT_UNUSED1(); + OUTPUT_UNUSED2(); OUTPUT_CPU65_TRACE_EPILOGUE(); OUTPUT_CPU65_TRACE_IRQ(); @@ -62,7 +62,7 @@ int main (int argc, char **argv) { OUTPUT_CPU65_CYCLES_TO_EXECUTE(); OUTPUT_CPU65_CYCLE_COUNT(); - OUTPUT_IRQ_CHECK_TIMEOUT(); + OUTPUT_UNUSED3(); OUTPUT_INTERRUPT_VECTOR(); OUTPUT_RESET_VECTOR(); diff --git a/src/glue.h b/src/glue.h index a9b40859..fb6e7f09 100644 --- a/src/glue.h +++ b/src/glue.h @@ -76,19 +76,21 @@ // Stack struct assembly bridge (avoiding all PIC nastiness) typedef struct cpu65_run_args_s { - void (*cpu_irqCheck)(uint16_t, uint8_t); -#define OUTPUT_CPU_IRQCHECK() printf("#define CPU_IRQCHECK %ld\n", offsetof(cpu65_run_args_s, cpu_irqCheck)) + void (*unused0)(uint16_t, uint8_t); +#define OUTPUT_UNUSED0() printf("#define UNUSED0 %ld\n", offsetof(cpu65_run_args_s, unused0)) void (*cpu65_trace_prologue)(uint16_t, uint8_t); #define OUTPUT_CPU65_TRACE_PROLOGUE() printf("#define CPU65_TRACE_PROLOGUE %ld\n", offsetof(cpu65_run_args_s, cpu65_trace_prologue)) void (*cpu65_trace_arg)(uint16_t, uint8_t); #define OUTPUT_CPU65_TRACE_ARG() printf("#define CPU65_TRACE_ARG %ld\n", offsetof(cpu65_run_args_s, cpu65_trace_arg)) - void (*cpu65_trace_arg1)(uint16_t, uint8_t); -#define OUTPUT_CPU65_TRACE_ARG1() printf("#define CPU65_TRACE_ARG1 %ld\n", offsetof(cpu65_run_args_s, cpu65_trace_arg1)) - void (*cpu65_trace_arg2)(uint16_t, uint8_t); -#define OUTPUT_CPU65_TRACE_ARG2() printf("#define CPU65_TRACE_ARG2 %ld\n", offsetof(cpu65_run_args_s, cpu65_trace_arg2)) + void (*unused1)(uint16_t, uint8_t); +#define OUTPUT_UNUSED1() printf("#define UNUSED1 %ld\n", offsetof(cpu65_run_args_s, unused1)) + void (*unused2)(uint16_t, uint8_t); +#define OUTPUT_UNUSED2() printf("#define UNUSED2 %ld\n", offsetof(cpu65_run_args_s, unused2)) + void (*cpu65_trace_epilogue)(uint16_t, uint8_t); #define OUTPUT_CPU65_TRACE_EPILOGUE() printf("#define CPU65_TRACE_EPILOGUE %ld\n", offsetof(cpu65_run_args_s, cpu65_trace_epilogue)) + void (*cpu65_trace_irq)(uint16_t, uint8_t); #define OUTPUT_CPU65_TRACE_IRQ() printf("#define CPU65_TRACE_IRQ %ld\n", offsetof(cpu65_run_args_s, cpu65_trace_irq)) @@ -153,8 +155,9 @@ typedef struct cpu65_run_args_s { #define OUTPUT_CPU65_CYCLES_TO_EXECUTE() printf("#define CPU65_CYCLES_TO_EXECUTE %ld\n", offsetof(cpu65_run_args_s, cpu65_cycles_to_execute)) int32_t cpu65_cycle_count; // cycles currently excuted by cpu65_run() #define OUTPUT_CPU65_CYCLE_COUNT() printf("#define CPU65_CYCLE_COUNT %ld\n", offsetof(cpu65_run_args_s, cpu65_cycle_count)) - int32_t irq_check_timeout; // cycles to check for raised IRQ -#define OUTPUT_IRQ_CHECK_TIMEOUT() printf("#define IRQ_CHECK_TIMEOUT %ld\n", offsetof(cpu65_run_args_s, irq_check_timeout)) + + int32_t unused3; +#define OUTPUT_UNUSED3() printf("#define UNUSED3 %ld\n", offsetof(cpu65_run_args_s, unused3)) uint16_t interrupt_vector; #define OUTPUT_INTERRUPT_VECTOR() printf("#define INTERRUPT_VECTOR %ld\n", offsetof(cpu65_run_args_s, interrupt_vector)) diff --git a/src/test/testcpu.c b/src/test/testcpu.c index eaaf2850..2b41c412 100644 --- a/src/test/testcpu.c +++ b/src/test/testcpu.c @@ -51,7 +51,6 @@ static void testcpu_setup(void *arg) { cpu65_uninterrupt(0xff); run_args.cpu65_cycle_count = 0; run_args.cpu65_cycles_to_execute = 1; - run_args.irq_check_timeout = 255; run_args.cpu65_pc = TEST_LOC; run_args.cpu65_a = 0x0; diff --git a/src/timing.c b/src/timing.c index e982847b..b2981a2c 100644 --- a/src/timing.c +++ b/src/timing.c @@ -145,7 +145,6 @@ void reinitialize(void) { cycles_count_total = 0; g_dwCyclesThisFrame = 0; - run_args.irq_check_timeout = IRQ_CHECK_CYCLES; #if TESTING extern unsigned long (*testing_getCyclesCount)(void); if (testing_getCyclesCount) { diff --git a/src/vm.c b/src/vm.c index 3210c473..f992b842 100644 --- a/src/vm.c +++ b/src/vm.c @@ -913,12 +913,6 @@ GLUE_C_READ(debug_illegal_bcd) return 0; } -GLUE_C_WRITE(cpu_irqCheck) -{ - MB_UpdateCycles(); - // TODO : other peripheral card interrupt handling -} - // ---------------------------------------------------------------------------- static void _initialize_iie_switches(void) { diff --git a/src/x86/cpu.S b/src/x86/cpu.S index 3dcf9344..78046e56 100644 --- a/src/x86/cpu.S +++ b/src/x86/cpu.S @@ -35,10 +35,6 @@ callLQ *CPU65_TRACE_PROLOGUE(reg_args); # define TRACE_ARG \ callLQ *CPU65_TRACE_ARG(reg_args); -# define TRACE_ARG1 \ - callLQ *CPU65_TRACE_ARG1(reg_args); -# define TRACE_ARG2 \ - callLQ *CPU65_TRACE_ARG2(reg_args); # define TRACE_EPILOGUE \ pushLQ _XAX; \ CommonSaveCPUState; \ @@ -49,8 +45,6 @@ #else # define TRACE_PROLOGUE # define TRACE_ARG -# define TRACE_ARG1 -# define TRACE_ARG2 # define TRACE_EPILOGUE # define TRACE_IRQ #endif @@ -67,14 +61,14 @@ #define GetFromPC_W \ movLQ PC_Reg_X, EffectiveAddr_X; \ - incw EffectiveAddr; \ addw $2, PC_Reg; \ CALL_IND(CPU65_VMEM_R,EffectiveAddr_X); \ - decw EffectiveAddr; \ - TRACE_ARG2; \ + TRACE_ARG; \ movb %al, %ah; \ + incw EffectiveAddr; \ CALL_IND(CPU65_VMEM_R,EffectiveAddr_X); \ - TRACE_ARG1; + TRACE_ARG; \ + xchgb %al, %ah; #define CPUStatsReset \ movb $0, CPU65_OPCYCLES(reg_args); \ @@ -2108,36 +2102,19 @@ continue: addb CPU65_OPCYCLES(reg_args), %al movb %al, CPU65_OPCYCLES(reg_args) TRACE_EPILOGUE + addl %eax, CPU65_CYCLE_COUNT(reg_args) subl %eax, GC_CYCLES_TIMER_0(reg_args) subl %eax, GC_CYCLES_TIMER_1(reg_args) -#if CONFORMANT_IRQ_CHECKPOINT -# error 2018/01/15 untested ... - subl %eax, IRQ_CHECK_TIMEOUT(reg_args) - jl irq_checkpoint // AppleWin : CheckInterruptSources() -#endif continue1: subl %eax, CPU65_CYCLES_TO_EXECUTE(reg_args) jle exit_cpu65_run + continue2: xorLQ _XAX, _XAX orb CPU65__SIGNAL(reg_args), %al jnz exception CPUStatsReset JumpNextInstruction -#if CONFORMANT_IRQ_CHECKPOINT -# error 2018/01/15 untested ... -irq_checkpoint: -#if __PIC__ && __i386__ - pushl %ebx -#endif - callLQ *CPU_IRQCHECK(reg_args) -#if __PIC__ && __i386__ - popl %ebx -#endif - movl $IRQ_CHECK_CYCLES, IRQ_CHECK_TIMEOUT(reg_args) - jmp continue1 -#endif - /* ------------------------------------------------------------------------- Exception handlers ------------------------------------------------------------------------- */ diff --git a/src/x86/glue-offsets32.h b/src/x86/glue-offsets32.h index 7645e911..090e8737 100644 --- a/src/x86/glue-offsets32.h +++ b/src/x86/glue-offsets32.h @@ -1,9 +1,9 @@ /* This file is auto-generated for a specific architecture ABI */ -#define CPU_IRQCHECK 0 +#define UNUSED0 0 #define CPU65_TRACE_PROLOGUE 4 #define CPU65_TRACE_ARG 8 -#define CPU65_TRACE_ARG1 12 -#define CPU65_TRACE_ARG2 16 +#define UNUSED1 12 +#define UNUSED2 16 #define CPU65_TRACE_EPILOGUE 20 #define CPU65_TRACE_IRQ 24 #define DEBUG_ILLEGAL_BCD 28 @@ -33,7 +33,7 @@ #define GC_CYCLES_TIMER_1 124 #define CPU65_CYCLES_TO_EXECUTE 128 #define CPU65_CYCLE_COUNT 132 -#define IRQ_CHECK_TIMEOUT 136 +#define UNUSED3 136 #define INTERRUPT_VECTOR 140 #define RESET_VECTOR 142 #define CPU65_PC 144 diff --git a/src/x86/glue-offsets64.h b/src/x86/glue-offsets64.h index a2a8ca55..2ce440ee 100644 --- a/src/x86/glue-offsets64.h +++ b/src/x86/glue-offsets64.h @@ -1,9 +1,9 @@ /* This file is auto-generated for a specific architecture ABI */ -#define CPU_IRQCHECK 0 +#define UNUSED0 0 #define CPU65_TRACE_PROLOGUE 8 #define CPU65_TRACE_ARG 16 -#define CPU65_TRACE_ARG1 24 -#define CPU65_TRACE_ARG2 32 +#define UNUSED1 24 +#define UNUSED2 32 #define CPU65_TRACE_EPILOGUE 40 #define CPU65_TRACE_IRQ 48 #define DEBUG_ILLEGAL_BCD 56 @@ -33,7 +33,7 @@ #define GC_CYCLES_TIMER_1 240 #define CPU65_CYCLES_TO_EXECUTE 244 #define CPU65_CYCLE_COUNT 248 -#define IRQ_CHECK_TIMEOUT 252 +#define UNUSED3 252 #define INTERRUPT_VECTOR 256 #define RESET_VECTOR 258 #define CPU65_PC 260