2 // swi 0 in do_unalignedwritestub?
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, psxRegs.cycle, next_interupt);
37 next_interupt = psxNextsCounter + psxNextCounter;
38 evprintf(" -ge %08x, %d->%d\n", psxRegs.pc, psxRegs.cycle, next_interupt);
40 pending_exception = 1; /* FIXME */
45 printf("ari64_check_interupt\n");
50 printf("ari64_read_nomem_new\n");
53 static void read_mem8()
55 memprintf("ari64_read_mem8 %08x, PC~=%08x\n", address, psxRegs.pc);
56 readmem_word = psxMemRead8(address) & 0xff;
59 static void read_mem16()
61 memprintf("ari64_read_mem16 %08x, PC~=%08x\n", address, psxRegs.pc);
62 readmem_word = psxMemRead16(address) & 0xffff;
65 static void read_mem32()
67 memprintf("ari64_read_mem32 %08x, PC~=%08x\n", address, psxRegs.pc);
68 readmem_word = psxMemRead32(address);
71 static void write_mem8()
73 memprintf("ari64_write_mem8 %08x, %02x, PC~=%08x\n", address, byte, psxRegs.pc);
74 psxMemWrite8(address, byte);
77 static void write_mem16()
79 memprintf("ari64_write_mem16 %08x, %04x, PC~=%08x\n", address, hword, psxRegs.pc);
80 psxMemWrite16(address, hword);
83 static void write_mem32()
85 memprintf("ari64_write_mem32 %08x, %08x, PC~=%08x\n", address, word, psxRegs.pc);
86 psxMemWrite32(address, word);
89 void (*readmem[0x10000])();
90 void (*readmemb[0x10000])();
91 void (*readmemh[0x10000])();
92 void (*writemem[0x10000])();
93 void (*writememb[0x10000])();
94 void (*writememh[0x10000])();
97 static int ari64_init()
102 for (i = 0; i < sizeof(readmem) / sizeof(readmem[0]); i++) {
103 readmemb[i] = read_mem8;
104 readmemh[i] = read_mem16;
105 readmem[i] = read_mem32;
106 writememb[i] = write_mem8;
107 writememh[i] = write_mem16;
108 writemem[i] = write_mem32;
111 psxHLEt_addr = (void *)psxHLEt;
114 static void ari64_reset()
117 printf("ari64_reset\n");
120 static void ari64_execute()
122 next_interupt = psxNextsCounter + psxNextCounter;
124 evprintf("psxNextsCounter %d, psxNextCounter %d, Count %d\n", psxNextsCounter, psxNextCounter, psxRegs.CP0.r[9]);
125 evprintf("ari64_execute %08x, %d->%d\n", psxRegs.pc, psxRegs.cycle, next_interupt);
126 new_dyna_start(psxRegs.pc);
127 evprintf("ari64_execute end %08x, %d->%d\n", psxRegs.pc, psxRegs.cycle, next_interupt);
130 static void ari64_clear(u32 Addr, u32 Size)
134 static void ari64_shutdown()
136 new_dynarec_cleanup();
139 extern void intExecute();
140 extern void intExecuteT();
141 extern void intExecuteBlock();
142 extern void intExecuteBlockT();
144 #define intExecuteT intExecute
145 #define intExecuteBlockT intExecuteBlock
164 void do_insn_trace() {}
165 void do_insn_cmp() {}
168 #if defined(__x86_64__) || defined(__i386__)
169 unsigned int address, readmem_word, word;
170 unsigned short hword;
172 int pending_exception;
173 unsigned int next_interupt;
175 void new_dynarec_init() {}
176 int new_dyna_start() {}
177 void new_dynarec_cleanup() {}
184 extern u32 last_io_addr;
186 static void dump_mem(const char *fname, void *mem, size_t size)
188 FILE *f1 = fopen(fname, "wb");
189 fwrite(mem, 1, size, f1);
193 void do_insn_trace(void)
195 static psxRegisters oldregs;
196 static u32 old_io_addr = (u32)-1;
197 static u32 old_io_data = 0xbad0c0de;
198 u32 *allregs_p = (void *)&psxRegs;
199 u32 *allregs_o = (void *)&oldregs;
204 //last_io_addr = 0x5e2c8;
206 f = fopen("tracelog", "wb");
208 oldregs.code = psxRegs.code; // don't care
209 for (i = 0; i < offsetof(psxRegisters, intCycle) / 4; i++) {
210 if (allregs_p[i] != allregs_o[i]) {
212 fwrite(&allregs_p[i], 1, 4, f);
213 allregs_o[i] = allregs_p[i];
216 if (old_io_addr != last_io_addr) {
218 fwrite(&byte, 1, 1, f);
219 fwrite(&last_io_addr, 1, 4, f);
220 old_io_addr = last_io_addr;
222 io_data = (void *)(psxM + (last_io_addr&0x1ffffc));
223 if (old_io_data != *io_data) {
225 fwrite(&byte, 1, 1, f);
226 fwrite(io_data, 1, 4, f);
227 old_io_data = *io_data;
230 fwrite(&byte, 1, 1, f);
233 if (psxRegs.cycle == 190230) {
234 dump_mem("/mnt/ntz/dev/pnd/tmp/psxram_i.dump", psxM, 0x200000);
235 dump_mem("/mnt/ntz/dev/pnd/tmp/psxregs_i.dump", psxH, 0x10000);
242 static const char *regnames[offsetof(psxRegisters, intCycle) / 4] = {
243 "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7",
244 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15",
245 "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23",
246 "r24", "r25", "r26", "r27", "r28", "r29", "r30", "r31",
248 "C0_0", "C0_1", "C0_2", "C0_3", "C0_4", "C0_5", "C0_6", "C0_7",
249 "C0_8", "C0_9", "C0_10", "C0_11", "C0_12", "C0_13", "C0_14", "C0_15",
250 "C0_16", "C0_17", "C0_18", "C0_19", "C0_20", "C0_21", "C0_22", "C0_23",
251 "C0_24", "C0_25", "C0_26", "C0_27", "C0_28", "C0_29", "C0_30", "C0_31",
253 "C2D0", "C2D1", "C2D2", "C2D3", "C2D4", "C2D5", "C2D6", "C2D7",
254 "C2D8", "C2D9", "C2D10", "C2D11", "C2D12", "C2D13", "C2D14", "C2D15",
255 "C2D16", "C2D17", "C2D18", "C2D19", "C2D20", "C2D21", "C2D22", "C2D23",
256 "C2D24", "C2D25", "C2D26", "C2D27", "C2D28", "C2D29", "C2D30", "C2D31",
258 "C2C0", "C2C1", "C2C2", "C2C3", "C2C4", "C2C5", "C2C6", "C2C7",
259 "C2C8", "C2C9", "C2C10", "C2C11", "C2C12", "C2C13", "C2C14", "C2C15",
260 "C2C16", "C2C17", "C2C18", "C2C19", "C2C20", "C2C21", "C2C22", "C2C23",
261 "C2C24", "C2C25", "C2C26", "C2C27", "C2C28", "C2C29", "C2C30", "C2C31",
263 "PC", "code", "cycle", "interrupt",
268 void do_insn_cmp(void)
270 static psxRegisters rregs;
271 static u32 mem_addr, mem_val;
272 u32 *allregs_p = (void *)&psxRegs;
273 u32 *allregs_e = (void *)&rregs;
274 static u32 ppc, failcount;
279 f = fopen("tracelog", "rb");
282 if ((ret = fread(&code, 1, 1, f)) <= 0)
289 if ((ret = fread(&mem_addr, 1, 4, f)) <= 0)
294 if ((ret = fread(&mem_val, 1, 4, f)) <= 0)
298 if ((ret = fread(&allregs_e[code], 1, 4, f)) <= 0)
307 psxRegs.code = rregs.code; // don't care
308 psxRegs.cycle = rregs.cycle;
309 psxRegs.CP0.r[9] = rregs.CP0.r[9]; // Count
311 //if (psxRegs.cycle == 166172) breakme();
312 //if (psxRegs.cycle > 11296376) printf("pc=%08x %u %08x\n", psxRegs.pc, psxRegs.cycle, psxRegs.interrupt);
314 mem_addr &= 0x1ffffc;
316 if (memcmp(&psxRegs, &rregs, offsetof(psxRegisters, intCycle)) == 0 &&
317 mem_val == *(u32 *)(psxM + mem_addr)
323 for (i = 0; i < offsetof(psxRegisters, intCycle) / 4; i++) {
324 if (allregs_p[i] != allregs_e[i]) {
325 printf("bad %5s: %08x %08x, pc=%08x, cycle %u\n",
326 regnames[i], allregs_p[i], allregs_e[i], psxRegs.pc, psxRegs.cycle);
331 if (mem_val != *(u32 *)(psxM + mem_addr)) {
332 printf("bad mem @%08x: %08x %08x\n", mem_addr, *(u32 *)(psxM + mem_addr), mem_val);
336 if (psxRegs.pc == rregs.pc && bad < 6 && failcount < 32) {
337 printf("-- %d\n", bad);
343 printf("PC: %08x/%08x, cycle %u\n", psxRegs.pc, ppc, psxRegs.cycle);
344 dump_mem("/mnt/ntz/dev/pnd/tmp/psxram.dump", psxM, 0x200000);
345 dump_mem("/mnt/ntz/dev/pnd/tmp/psxregs.dump", psxH, 0x10000);
348 psxRegs.cycle = rregs.cycle + 2; // sync timing