9 //typedef int (clock_func_t) (void);
10 static int fetch_and_decode_inst(void);
11 static int decode_inst(void);
12 static int execute_inst(void);
15 int reset_exec6502(void);
16 int decode6502(unsigned char inst);
17 int execute6502(void);
18 int test_and_set_exec(void);
19 int test_and_set_intr(void);
21 int init_6502core(void);
25 void pc_set(unsigned short addr);
26 unsigned short pc_get(void);
27 void pc_move(int offset);
28 void report_exec_err(void);
29 void d1_set(int on_off);
30 void d2_set(int on_off);
31 void d3_set(int on_off);
35 int disas_inst(unsigned short addr);
36 void dump_6502(int full);
37 extern int debug_mode;
38 extern unsigned short break_point;
39 extern int critical_error;
42 static unsigned char cpu_data_buffer;
43 static unsigned short cpu_addr_buffer;
45 static void (*dump_6502_level2)(int);
46 static void (*dump_6502_level3_load)(unsigned short, unsigned char);
47 static void (*dump_6502_level3_store)(unsigned short, unsigned char);
48 static int (*d1_disas)(unsigned short);
51 * clock execution function array.
52 * max execution cycle is 7.
53 * the last element must be NULL.
55 clock_func_t *execute_func;
57 static unsigned long clock_cnt;
60 int get_clock_cnt(void) {
71 //dprint("%d\n", clock_cnt);
79 unsigned char load_memory(unsigned short addr) {
84 cpu_data_buffer = get_bus_data();
87 dump_6502_level3_load (addr, cpu_data_buffer);
90 return cpu_data_buffer;
93 void store_memory(unsigned short addr, unsigned char data) {
94 dump_6502_level3_store (addr, data);
102 cpu_data_buffer = data;
106 * load address in the memory.
107 * loading 2 bytes takes 2 cycles.
108 * the parameter "cycle" means first or second read.
110 unsigned short load_addr(unsigned short addr, int cycle) {
111 unsigned short byte = load_memory(addr);
113 ///NES=little endian. lower byte first, higher byte second.
115 cpu_addr_buffer = ((cpu_addr_buffer & 0xff00) | byte);
117 cpu_addr_buffer = ((cpu_addr_buffer & 0x00ff) | (byte << 8));
118 return cpu_addr_buffer;
121 static int reset_handler2(void) {
123 ret = reset_exec6502();
125 fprintf(stderr, "cpu reset failure.\n");
126 critical_error = TRUE;
130 if (test_and_set_intr()) {
131 execute_func = fetch_and_decode_inst;
136 static int reset_handler1(void) {
140 fprintf(stderr, "cpu reset failure.\n");
141 critical_error = TRUE;
144 execute_func = reset_handler2;
148 void reset_cpu(void) {
149 execute_func = reset_handler1;
152 static int nmi_handler(void) {
158 fprintf(stderr, "cpu nmi handling failure.\n");
161 critical_error = TRUE;
165 //last cycle goes to next execute cycle
166 if (test_and_set_intr()) {
169 execute_func = fetch_and_decode_inst;
174 static int decode_inst(void) {
177 ret = decode6502(cpu_data_buffer);
182 static int fetch_and_decode_inst(void) {
186 //if nmi occurred, no further execution on the current instruction.
188 execute_func = nmi_handler;
189 return execute_func();
193 dump_6502_level2(TRUE);
196 if (break_point == pc) {
208 //if bus not ready, do nothing.
218 fprintf(stderr, "cpu decode instruction failure.\n");
221 critical_error = TRUE;
227 execute_func = execute_inst;
233 static int execute_inst(void) {
236 //dprint("execute\n");
238 //execute the instruction
247 critical_error = TRUE;
252 //last cycle goes to next execute cycle
253 if (test_and_set_exec()) {
254 execute_func = fetch_and_decode_inst;
259 void set_cpu_addr_buf(unsigned short addr) {
260 cpu_addr_buffer = addr;
263 unsigned short get_cpu_addr_buf(void) {
264 return cpu_addr_buffer;
267 void set_cpu_data_buf(unsigned char data) {
268 cpu_data_buffer = data;
271 unsigned char get_cpu_data_buf(void) {
272 return cpu_data_buffer;
276 static void null_dump_6502 (int param) {}
277 static void null_load_store (unsigned short addr, unsigned char data) {}
278 static int null_disas(unsigned short addr) {return 0;}
280 static void dump_load (unsigned short addr, unsigned char data) {
283 dprint("load: @%04x = %02x\n", addr, data);
285 static void dump_store (unsigned short addr, unsigned char data) {
287 dprint("store: @%04x = %02x\n", addr, data);
293 ret = init_6502core();
298 ret = register_clock_hander(clock_cpu);
314 /*------for debug.c-----*/
315 void d1_set(int on_off) {
317 d1_disas = disas_inst;
320 d1_disas = null_disas;
324 void d2_set(int on_off) {
326 dump_6502_level2 = dump_6502;
329 dump_6502_level2 = null_dump_6502;
333 void d3_set(int on_off) {
335 dump_6502_level3_load = dump_load;
336 dump_6502_level3_store = dump_store;
339 dump_6502_level3_load = null_load_store;
340 dump_6502_level3_store = null_load_store;