2 // swi 0 in do_unalignedwritestub?
9 //#define memprintf printf
10 #define memprintf(...)
11 //#define evprintf printf
14 char invalid_code[0x100000];
18 extern void psxMTC0();
20 memprintf("ari64 MTC0 %08x\n", psxRegs.code);
22 pending_exception = 1; /* FIXME? */
27 evprintf("ari64_gen_interupt\n");
28 evprintf(" +ge %08x, %d->%d\n", psxRegs.pc, psxRegs.cycle, next_interupt);
35 next_interupt = psxNextsCounter + psxNextCounter;
36 evprintf(" -ge %08x, %d->%d\n", psxRegs.pc, psxRegs.cycle, next_interupt);
38 pending_exception = 1; /* FIXME */
43 printf("ari64_check_interupt\n");
48 printf("ari64_read_nomem_new\n");
51 static void read_mem8()
53 memprintf("ari64_read_mem8 %08x, PC~=%08x\n", address, psxRegs.pc);
54 readmem_word = psxMemRead8(address) & 0xff;
57 static void read_mem16()
59 memprintf("ari64_read_mem16 %08x, PC~=%08x\n", address, psxRegs.pc);
60 readmem_word = psxMemRead16(address) & 0xffff;
63 static void read_mem32()
65 memprintf("ari64_read_mem32 %08x, PC~=%08x\n", address, psxRegs.pc);
66 readmem_word = psxMemRead32(address);
69 static void write_mem8()
71 memprintf("ari64_write_mem8 %08x, %02x, PC~=%08x\n", address, byte, psxRegs.pc);
72 psxMemWrite8(address, byte);
75 static void write_mem16()
77 memprintf("ari64_write_mem16 %08x, %04x, PC~=%08x\n", address, hword, psxRegs.pc);
78 psxMemWrite16(address, hword);
81 static void write_mem32()
83 memprintf("ari64_write_mem32 %08x, %08x, PC~=%08x\n", address, word, psxRegs.pc);
84 psxMemWrite32(address, word);
87 void (*readmem[0x10000])();
88 void (*readmemb[0x10000])();
89 void (*readmemh[0x10000])();
90 void (*writemem[0x10000])();
91 void (*writememb[0x10000])();
92 void (*writememh[0x10000])();
94 void *gte_handlers[64];
96 /* from gte.txt.. not sure if this is any good. */
97 const char gte_cycletab[64] = {
98 /* 1 2 3 4 5 6 7 8 9 a b c d e f */
99 0, 15, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 6, 0, 0, 0,
100 8, 8, 8, 19, 13, 0, 44, 0, 0, 0, 0, 17, 11, 0, 14, 0,
101 30, 0, 0, 0, 0, 0, 0, 0, 5, 8, 17, 0, 0, 5, 6, 0,
102 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 39,
105 static int ari64_init()
107 extern void (*psxCP2[64])();
108 extern void psxNULL();
113 for (i = 0; i < sizeof(readmem) / sizeof(readmem[0]); i++) {
114 readmemb[i] = read_mem8;
115 readmemh[i] = read_mem16;
116 readmem[i] = read_mem32;
117 writememb[i] = write_mem8;
118 writememh[i] = write_mem16;
119 writemem[i] = write_mem32;
122 for (i = 0; i < sizeof(gte_handlers) / sizeof(gte_handlers[0]); i++)
123 if (psxCP2[i] != psxNULL)
124 gte_handlers[i] = psxCP2[i];
126 psxHLEt_addr = (void *)psxHLEt; // FIXME: rm
130 static void ari64_reset()
133 printf("ari64_reset\n");
136 static void ari64_execute()
138 next_interupt = psxNextsCounter + psxNextCounter;
140 evprintf("psxNextsCounter %d, psxNextCounter %d\n", psxNextsCounter, psxNextCounter);
141 evprintf("ari64_execute %08x, %d->%d\n", psxRegs.pc, psxRegs.cycle, next_interupt);
143 evprintf("ari64_execute end %08x, %d->%d\n", psxRegs.pc, psxRegs.cycle, next_interupt);
146 static void ari64_clear(u32 Addr, u32 Size)
150 static void ari64_shutdown()
152 new_dynarec_cleanup();
155 extern void intExecute();
156 extern void intExecuteT();
157 extern void intExecuteBlock();
158 extern void intExecuteBlockT();
160 #define intExecuteT intExecute
161 #define intExecuteBlockT intExecuteBlock
180 void do_insn_trace() {}
181 void do_insn_cmp() {}
184 #if defined(__x86_64__) || defined(__i386__)
185 unsigned int address, readmem_word, word;
186 unsigned short hword;
188 int pending_exception;
189 unsigned int next_interupt;
191 void new_dynarec_init() {}
192 int new_dyna_start() {}
193 void new_dynarec_cleanup() {}
200 extern u32 last_io_addr;
202 static void dump_mem(const char *fname, void *mem, size_t size)
204 FILE *f1 = fopen(fname, "wb");
205 fwrite(mem, 1, size, f1);
209 void do_insn_trace(void)
211 static psxRegisters oldregs;
212 static u32 old_io_addr = (u32)-1;
213 static u32 old_io_data = 0xbad0c0de;
214 u32 *allregs_p = (void *)&psxRegs;
215 u32 *allregs_o = (void *)&oldregs;
220 //last_io_addr = 0x5e2c8;
222 f = fopen("tracelog", "wb");
224 oldregs.code = psxRegs.code; // don't care
225 for (i = 0; i < offsetof(psxRegisters, intCycle) / 4; i++) {
226 if (allregs_p[i] != allregs_o[i]) {
228 fwrite(&allregs_p[i], 1, 4, f);
229 allregs_o[i] = allregs_p[i];
232 if (old_io_addr != last_io_addr) {
234 fwrite(&byte, 1, 1, f);
235 fwrite(&last_io_addr, 1, 4, f);
236 old_io_addr = last_io_addr;
238 io_data = (void *)(psxM + (last_io_addr&0x1ffffc));
239 if (old_io_data != *io_data) {
241 fwrite(&byte, 1, 1, f);
242 fwrite(io_data, 1, 4, f);
243 old_io_data = *io_data;
246 fwrite(&byte, 1, 1, f);
249 if (psxRegs.cycle == 190230) {
250 dump_mem("/mnt/ntz/dev/pnd/tmp/psxram_i.dump", psxM, 0x200000);
251 dump_mem("/mnt/ntz/dev/pnd/tmp/psxregs_i.dump", psxH, 0x10000);
258 static const char *regnames[offsetof(psxRegisters, intCycle) / 4] = {
259 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
260 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
261 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
262 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
264 "C0_0", "C0_1", "C0_2", "C0_3", "C0_4", "C0_5", "C0_6", "C0_7",
265 "C0_8", "C0_9", "C0_10", "C0_11", "C0_12", "C0_13", "C0_14", "C0_15",
266 "C0_16", "C0_17", "C0_18", "C0_19", "C0_20", "C0_21", "C0_22", "C0_23",
267 "C0_24", "C0_25", "C0_26", "C0_27", "C0_28", "C0_29", "C0_30", "C0_31",
269 "C2D0", "C2D1", "C2D2", "C2D3", "C2D4", "C2D5", "C2D6", "C2D7",
270 "C2D8", "C2D9", "C2D10", "C2D11", "C2D12", "C2D13", "C2D14", "C2D15",
271 "C2D16", "C2D17", "C2D18", "C2D19", "C2D20", "C2D21", "C2D22", "C2D23",
272 "C2D24", "C2D25", "C2D26", "C2D27", "C2D28", "C2D29", "C2D30", "C2D31",
274 "C2C0", "C2C1", "C2C2", "C2C3", "C2C4", "C2C5", "C2C6", "C2C7",
275 "C2C8", "C2C9", "C2C10", "C2C11", "C2C12", "C2C13", "C2C14", "C2C15",
276 "C2C16", "C2C17", "C2C18", "C2C19", "C2C20", "C2C21", "C2C22", "C2C23",
277 "C2C24", "C2C25", "C2C26", "C2C27", "C2C28", "C2C29", "C2C30", "C2C31",
279 "PC", "code", "cycle", "interrupt",
284 void do_insn_cmp(void)
286 static psxRegisters rregs;
287 static u32 mem_addr, mem_val;
288 u32 *allregs_p = (void *)&psxRegs;
289 u32 *allregs_e = (void *)&rregs;
290 static u32 ppc, failcount;
295 f = fopen("tracelog", "rb");
298 if ((ret = fread(&code, 1, 1, f)) <= 0)
305 if ((ret = fread(&mem_addr, 1, 4, f)) <= 0)
310 if ((ret = fread(&mem_val, 1, 4, f)) <= 0)
314 if ((ret = fread(&allregs_e[code], 1, 4, f)) <= 0)
323 psxRegs.code = rregs.code; // don't care
324 psxRegs.cycle = rregs.cycle;
325 psxRegs.CP0.r[9] = rregs.CP0.r[9]; // Count
327 //if (psxRegs.cycle == 166172) breakme();
328 //if (psxRegs.cycle > 11296376) printf("pc=%08x %u %08x\n", psxRegs.pc, psxRegs.cycle, psxRegs.interrupt);
330 mem_addr &= 0x1ffffc;
332 if (memcmp(&psxRegs, &rregs, offsetof(psxRegisters, intCycle)) == 0 &&
333 mem_val == *(u32 *)(psxM + mem_addr)
339 for (i = 0; i < offsetof(psxRegisters, intCycle) / 4; i++) {
340 if (allregs_p[i] != allregs_e[i]) {
341 printf("bad %5s: %08x %08x, pc=%08x, cycle %u\n",
342 regnames[i], allregs_p[i], allregs_e[i], psxRegs.pc, psxRegs.cycle);
347 if (mem_val != *(u32 *)(psxM + mem_addr)) {
348 printf("bad mem @%08x: %08x %08x\n", mem_addr, *(u32 *)(psxM + mem_addr), mem_val);
352 if (psxRegs.pc == rregs.pc && bad < 6 && failcount < 32) {
353 printf("-- %d\n", bad);
359 printf("PC: %08x/%08x, cycle %u\n", psxRegs.pc, ppc, psxRegs.cycle);
360 dump_mem("/mnt/ntz/dev/pnd/tmp/psxram.dump", psxM, 0x200000);
361 dump_mem("/mnt/ntz/dev/pnd/tmp/psxregs.dump", psxH, 0x10000);
364 psxRegs.cycle = rregs.cycle + 2; // sync timing