first debug version of ncpu
[fceu.git] / ncpu_debug.c
CommitLineData
af32b6c2 1#include <stdio.h>
2#include <stdlib.h>
3
4#include "types.h"
5#include "x6502.h"
6#include "fce.h"
7
8// asm core state
9extern uint32 nes_registers[0x10];
10extern uint32 pc_base;
11uint32 PC_prev = 0;
12
13
14static void leave(void)
15{
16 printf("A: %02x, X: %02x, Y: %02x, S: %02x\n", X.A, X.X, X.Y, X.S);
17 printf("PC = %04lx, OP=%02X\n", PC_prev, (PC_prev < 0x2000) ? RAM[PC_prev&0x7ff] : ARead[PC_prev](PC_prev));
18 exit(1);
19}
20
21static void compare_state(void)
22{
23 uint8 nes_flags;
24
25 if ((nes_registers[0] >> 24) != X.A) {
26 printf("A: %02lx vs %02x\n", nes_registers[0] >> 24, X.A);
27 leave();
28 }
29
30 if ((nes_registers[1] & 0xff) != X.X) {
31 printf("X: %02lx vs %02x\n", nes_registers[1] & 0xff, X.X);
32 leave();
33 }
34
35 if ((nes_registers[2] & 0xff) != X.Y) {
36 printf("Y: %02lx vs %02x\n", nes_registers[2] & 0xff, X.Y);
37 leave();
38 }
39
40 if (nes_registers[3] - pc_base != X.PC) {
41 printf("PC: %04lx vs %04x\n", nes_registers[3] - pc_base, X.PC);
42 leave();
43 }
44
45 if ((nes_registers[4] >> 24) != X.S) {
46 printf("S: %02lx vs %02x\n", nes_registers[4] >> 24, X.S);
47 leave();
48 }
49
50 if (((nes_registers[4]>>8)&0xff) != X.IRQlow) {
51 printf("IRQlow: %02lx vs %02x\n", ((nes_registers[4]>>8)&0xff), X.IRQlow);
52 leave();
53 }
54
55 // NVUB DIZC
56 nes_flags = nes_registers[4] & 0x5d;
57 if ( nes_registers[5]&0x80000000) nes_flags |= 0x80; // N
58 if (!(nes_registers[5]&0x000000ff)) nes_flags |= 0x02; // Z
59 // nes_flags |= 0x20; // U, not set in C core (set only when pushing)
60
61 if (nes_flags != X.P) {
62 printf("flags: %02x vs %02x\n", nes_flags, X.P);
63 leave();
64 }
65
66 if ((int32)nes_registers[7] != X.count) {
67 printf("cycles: %li vs %li\n", (int32)nes_registers[7], X.count);
68 leave();
69 }
70}
71
72
73void TriggerIRQ_d(void)
74{
75 printf("-- irq\n");
76 TriggerIRQ_c();
77 TriggerIRQ_a();
78 compare_state();
79}
80
81void TriggerNMI_d(void)
82{
83 printf("-- nmi\n");
84 TriggerNMI_c();
85 TriggerNMI_a();
86 compare_state();
87}
88
89void TriggerNMINSF_d(void)
90{
91}
92
93void X6502_Run_d(int32 c)
94{
95 int32 cycles = c << 4; /* *16 */ \
96 if (PAL) cycles -= c; /* *15 */ \
97
98 printf("-- run(%i)\n", (int)c);
99
100 while (cycles > 0)
101 {
102 PC_prev = X.PC;
103 nes_registers[7]=1;
104 X.count=1;
105 X6502_Run_c();
106 X6502_Run_a();
107 compare_state();
108 cycles -= 1 - X.count;
109 }
110}
111
112void X6502_Reset_d(void)
113{
114 printf("-- reset\n");
115
116 X6502_Reset_c();
117 X6502_Reset_a();
118 compare_state();
119}
120
121void X6502_Power_d(void)
122{
123 printf("-- power\n");
124
125 X6502_Power_c();
126 X6502_Power_a();
127 compare_state();
128}
129
130void X6502_AddCycles_d(int x)
131{
132 printf("-- AddCycles(%i)\n", x);
133
134 X6502_AddCycles_c(x);
135 X6502_AddCycles_a(x);
136 //compare_state();
137}
138
139void X6502_IRQBegin_d(int w)
140{
141 printf("-- IRQBegin(%02x)\n", w);
142
143 X6502_IRQBegin_c(w);
144 X6502_IRQBegin_a(w);
145}
146
147void X6502_IRQEnd_d(int w)
148{
149 printf("-- IRQEnd(%02x)\n", w);
150
151 X6502_IRQEnd_c(w);
152 X6502_IRQEnd_a(w);
153}
154
155
156