1 // cycles after syscall/hle?
9 //#define memprintf printf
10 #define memprintf(...)
11 //#define evprintf printf
16 char invalid_code[0x100000];
20 extern void psxMTC0();
22 printf("ari64 MTC0 %08x\n", psxRegs.code);
24 pending_exception = 1; /* FIXME? */
29 evprintf("ari64_gen_interupt\n");
30 evprintf(" +ge %08x, %d->%d\n", psxRegs.pc, Count, next_interupt);
34 psxRegs.cycle = Count; // stupid
39 if (psxRegs.cycle != Count) {
40 printf("psxRegs.cycle != Count: %d != %d\n", psxRegs.cycle, Count);
41 Count = psxRegs.cycle;
44 next_interupt = Count + psxNextCounter;
45 evprintf(" -ge %08x, %d->%d\n", psxRegs.pc, Count, next_interupt);
47 pending_exception = 1; /* FIXME */
52 printf("ari64_check_interupt\n");
57 printf("ari64_read_nomem_new\n");
60 static void read_mem8()
62 memprintf("ari64_read_mem8 %08x, PC~=%08x\n", address, psxRegs.pc);
63 readmem_word = psxMemRead8(address) & 0xff;
66 static void read_mem16()
68 memprintf("ari64_read_mem16 %08x, PC~=%08x\n", address, psxRegs.pc);
69 readmem_word = psxMemRead16(address) & 0xffff;
72 static void read_mem32()
74 memprintf("ari64_read_mem32 %08x, PC~=%08x\n", address, psxRegs.pc);
75 readmem_word = psxMemRead32(address);
78 static void write_mem8()
80 memprintf("ari64_write_mem8 %08x, %02x, PC~=%08x\n", address, byte, psxRegs.pc);
81 psxMemWrite8(address, byte);
84 static void write_mem16()
86 memprintf("ari64_write_mem16 %08x, %04x, PC~=%08x\n", address, hword, psxRegs.pc);
87 psxMemWrite16(address, hword);
90 static void write_mem32()
92 memprintf("ari64_write_mem32 %08x, %08x, PC~=%08x\n", address, word, psxRegs.pc);
93 psxMemWrite32(address, word);
96 void (*readmem[0x10000])();
97 void (*readmemb[0x10000])();
98 void (*readmemh[0x10000])();
99 void (*writemem[0x10000])();
100 void (*writememb[0x10000])();
101 void (*writememh[0x10000])();
104 static int ari64_init()
109 for (i = 0; i < sizeof(readmem) / sizeof(readmem[0]); i++) {
110 readmemb[i] = read_mem8;
111 readmemh[i] = read_mem16;
112 readmem[i] = read_mem32;
113 writememb[i] = write_mem8;
114 writememh[i] = write_mem16;
115 writemem[i] = write_mem32;
118 psxHLEt_addr = (void *)psxHLEt;
121 static void ari64_reset()
124 printf("ari64_reset\n");
127 static void ari64_execute()
129 /* TODO: get rid of this cycle counter copying */
130 Count = psxRegs.cycle;
131 next_interupt = Count + psxNextCounter;
133 evprintf("psxNextsCounter %d, psxNextCounter %d\n", psxNextsCounter, psxNextCounter);
134 evprintf("ari64_execute %08x, %d->%d\n", psxRegs.pc, Count, next_interupt);
135 new_dyna_start(psxRegs.pc);
136 evprintf("ari64_execute end %08x, %d->%d\n", psxRegs.pc, Count, next_interupt);
139 psxRegs.cycle = Count;
143 static void ari64_clear(u32 Addr, u32 Size)
147 static void ari64_shutdown()
149 new_dynarec_cleanup();
152 extern void intExecute();
153 extern void intExecuteT();
154 extern void intExecuteBlock();
155 extern void intExecuteBlockT();
157 #define intExecuteT intExecute
158 #define intExecuteBlockT intExecuteBlock
177 void do_insn_trace() {}
178 void do_insn_cmp() {}
181 #if defined(__x86_64__) || defined(__i386__)
182 unsigned int address, readmem_word, word;
183 unsigned short hword;
185 int pending_exception;
186 unsigned int next_interupt;
188 void new_dynarec_init() {}
189 int new_dyna_start() {}
190 void new_dynarec_cleanup() {}
197 extern u32 last_io_addr;
199 static void dump_mem(const char *fname, void *mem, size_t size)
201 FILE *f1 = fopen(fname, "wb");
202 fwrite(mem, 1, size, f1);
206 void do_insn_trace(void)
208 static psxRegisters oldregs;
209 static u32 old_io_addr = (u32)-1;
210 static u32 old_io_data = 0xbad0c0de;
211 u32 *allregs_p = (void *)&psxRegs;
212 u32 *allregs_o = (void *)&oldregs;
217 //last_io_addr = 0x5e2c8;
219 f = fopen("tracelog", "wb");
221 oldregs.code = psxRegs.code; // don't care
222 for (i = 0; i < offsetof(psxRegisters, intCycle) / 4; i++) {
223 if (allregs_p[i] != allregs_o[i]) {
225 fwrite(&allregs_p[i], 1, 4, f);
226 allregs_o[i] = allregs_p[i];
229 if (old_io_addr != last_io_addr) {
231 fwrite(&byte, 1, 1, f);
232 fwrite(&last_io_addr, 1, 4, f);
233 old_io_addr = last_io_addr;
235 io_data = (void *)(psxM + (last_io_addr&0x1ffffc));
236 if (old_io_data != *io_data) {
238 fwrite(&byte, 1, 1, f);
239 fwrite(io_data, 1, 4, f);
240 old_io_data = *io_data;
243 fwrite(&byte, 1, 1, f);
246 if (psxRegs.cycle == 190230) {
247 dump_mem("/mnt/ntz/dev/pnd/tmp/psxram_i.dump", psxM, 0x200000);
248 dump_mem("/mnt/ntz/dev/pnd/tmp/psxregs_i.dump", psxH, 0x10000);
255 static const char *regnames[offsetof(psxRegisters, intCycle) / 4] = {
256 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
257 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
258 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
259 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
261 "C0_0", "C0_1", "C0_2", "C0_3", "C0_4", "C0_5", "C0_6", "C0_7",
262 "C0_8", "C0_9", "C0_10", "C0_11", "C0_12", "C0_13", "C0_14", "C0_15",
263 "C0_16", "C0_17", "C0_18", "C0_19", "C0_20", "C0_21", "C0_22", "C0_23",
264 "C0_24", "C0_25", "C0_26", "C0_27", "C0_28", "C0_29", "C0_30", "C0_31",
266 "C2D0", "C2D1", "C2D2", "C2D3", "C2D4", "C2D5", "C2D6", "C2D7",
267 "C2D8", "C2D9", "C2D10", "C2D11", "C2D12", "C2D13", "C2D14", "C2D15",
268 "C2D16", "C2D17", "C2D18", "C2D19", "C2D20", "C2D21", "C2D22", "C2D23",
269 "C2D24", "C2D25", "C2D26", "C2D27", "C2D28", "C2D29", "C2D30", "C2D31",
271 "C2C0", "C2C1", "C2C2", "C2C3", "C2C4", "C2C5", "C2C6", "C2C7",
272 "C2C8", "C2C9", "C2C10", "C2C11", "C2C12", "C2C13", "C2C14", "C2C15",
273 "C2C16", "C2C17", "C2C18", "C2C19", "C2C20", "C2C21", "C2C22", "C2C23",
274 "C2C24", "C2C25", "C2C26", "C2C27", "C2C28", "C2C29", "C2C30", "C2C31",
276 "PC", "code", "cycle", "interrupt",
281 void do_insn_cmp(void)
283 static psxRegisters rregs;
284 static u32 mem_addr, mem_val;
285 u32 *allregs_p = (void *)&psxRegs;
286 u32 *allregs_e = (void *)&rregs;
287 static u32 ppc, failcount;
292 f = fopen("tracelog", "rb");
295 if ((ret = fread(&code, 1, 1, f)) <= 0)
302 if ((ret = fread(&mem_addr, 1, 4, f)) <= 0)
307 if ((ret = fread(&mem_val, 1, 4, f)) <= 0)
311 if ((ret = fread(&allregs_e[code], 1, 4, f)) <= 0)
320 psxRegs.code = rregs.code; // don't care
321 psxRegs.cycle = rregs.cycle;
322 psxRegs.CP0.r[9] = rregs.CP0.r[9]; // Count
324 //if (psxRegs.cycle == 166172) breakme();
325 //if (psxRegs.cycle > 11296376) printf("pc=%08x %u %08x\n", psxRegs.pc, psxRegs.cycle, psxRegs.interrupt);
327 mem_addr &= 0x1ffffc;
329 if (memcmp(&psxRegs, &rregs, offsetof(psxRegisters, intCycle)) == 0 &&
330 mem_val == *(u32 *)(psxM + mem_addr)
336 for (i = 0; i < offsetof(psxRegisters, intCycle) / 4; i++) {
337 if (allregs_p[i] != allregs_e[i]) {
338 printf("bad %5s: %08x %08x, pc=%08x, cycle %u\n",
339 regnames[i], allregs_p[i], allregs_e[i], psxRegs.pc, psxRegs.cycle);
344 if (mem_val != *(u32 *)(psxM + mem_addr)) {
345 printf("bad mem @%08x: %08x %08x\n", mem_addr, *(u32 *)(psxM + mem_addr), mem_val);
349 if (psxRegs.pc == rregs.pc && bad < 6 && failcount < 32) {
350 printf("-- %d\n", bad);
356 printf("PC: %08x/%08x, cycle %u\n", psxRegs.pc, ppc, psxRegs.cycle);
357 dump_mem("/mnt/ntz/dev/pnd/tmp/psxram.dump", psxM, 0x200000);
358 dump_mem("/mnt/ntz/dev/pnd/tmp/psxregs.dump", psxH, 0x10000);
361 psxRegs.cycle = rregs.cycle + 2; // sync timing