Streamline CPU tracing codepaths and remove some deadc0de

This commit is contained in:
Aaron Culliney 2018-03-25 15:43:56 -07:00
parent 1de71d1ff4
commit 51d2efba03
12 changed files with 38 additions and 113 deletions

View File

@ -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
------------------------------------------------------------------------- */

View File

@ -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

View File

@ -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]);

View File

@ -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

View File

@ -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();

View File

@ -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))

View File

@ -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;

View File

@ -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) {

View File

@ -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) {

View File

@ -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
------------------------------------------------------------------------- */

View File

@ -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

View File

@ -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