return dummy_memory;
}
+void do_cycles_test(int cycles)
+{
+ if (!testing_active)
+ return;
+ cpu_cycles += cycles;
+}
+
+static void add_memory_cycles(int c)
+{
+ if (!testing_active)
+ return;
+ if (trace_store_pc != 0xffffffff)
+ return;
+ cpu_cycles += c * 4;
+}
+
static void check_bus_error(uaecptr addr, int write, int fc)
{
if (!testing_active)
}
}
-static void add_memory_cycles(int c)
-{
- if (!testing_active)
- return;
- if (trace_store_pc != 0xffffffff)
- return;
- cpu_cycles += c * 4;
-}
static uae_u8 get_ibyte_test(uaecptr addr)
{
return 0;
}
-void do_cycles_test(int cycles)
-{
- if (!testing_active)
- return;
- cpu_cycles += cycles;
-}
-
uae_u32(*x_get_long)(uaecptr);
uae_u32(*x_get_word)(uaecptr);
uae_u32(*x_get_byte)(uaecptr);
uae_u8 *ao = opcode_memory_ptr + 2;
uae_u16 apw1 = (ao[0] << 8) | (ao[1] << 0);
uae_u16 apw2 = (ao[2] << 8) | (ao[3] << 0);
- if (opc == 0x4ef8
- && apw1 == 0x0000
+ if (opc == 0x4662
+ // && apw1 == 0x0000
//&& apw2 == 0x7479
)
printf("");
.globl _testexit
.globl _get_cpu_model
.globl sync
+ .globl _uae_command
+
+_uae_command:
+ move.l 4(sp),a0
+ movem.l d2-d3/a2-a3/a6,-(sp)
+ move.l 4.w,a6
+ move.l a0,a2
+ lea uaeres(pc),a1
+ jsr -0x1f2(a6) | OpenResource
+ tst.l d0
+ beq.s .nores
+ move.l d0,a6
+ lea uaefuncname(pc),a0
+ jsr -6(a6)
+ move.l d0,a0
+ clr.l -(sp)
+ clr.l -(sp)
+ move.l #100,-(sp)
+ move.l a2,-(sp)
+ move.l #-1,-(sp)
+ move.l #82,-(sp)
+ jsr (a0)
+ add.w #6*4,sp
+.nores:
+ movem.l (sp)+,d2-d3/a2-a3/a6
+ rts
+
+uaeres:
+ .asciz "uae.resource"
+uaefuncname:
+ .asciz "uaelib_demux"
sync:
move.b 0xdff006,d0
enabled=1
mode=all
+; basic instruction test
+[test=ALL]
+enabled=0
+mode=tas
+feature_sr_mask=0xa000
+
+; interrupt exception test
[test=IRQ]
enabled=0
mode=nop,ext,swap
feature_interrupts=1
+; source EA address error
[test=AE_SRC]
enabled=0
feature_target_src_ea=0x87fff1,0x7111
feature_target_dst_ea=
mode=all
+; destination EA address error
[test=AE_DST]
enabled=0
feature_target_src_ea=
feature_target_dst_ea=0x87fff1,0x7111
mode=all
-[test=BERR_SRC]
+; user stack address error
+[test=ODD_STACK]
+enabled=0
+feature_usp=2
+mode=all
+
+; prefetch bus error (requires extra hardware)
+[test=BE_PR]
+enabled=0
+feature_safe_memory_start=0x880000
+feature_safe_memory_size=0x80000
+feature_safe_memory_mode=P
+feature_target_opcode_offset=90,92,94,96,98,100,102,104
+opcode_memory_start=0x87ff98
+mode=all
+
+; source EA read bus error (requires extra hardware)
+[test=BE_SRC]
enabled=0
feature_safe_memory_start=0x880000
feature_safe_memory_size=0x80000
feature_safe_memory_mode=R
feature_target_src_ea=0x87fffc,0x87fffd,0x87fffe,0x87ffff,0x880000,0x880001,0x880002,0x880003,0x880004
feature_target_dst_ea=
+test_memory_size=0xa0000
mode=all
-[test=BERR_DST]
+; destination EA read bus error (requires extra hardware)
+[test=BE_DST]
enabled=0
feature_safe_memory_start=0x880000
feature_safe_memory_size=0x80000
feature_safe_memory_mode=R
feature_target_src_ea=
feature_target_dst_ea=0x87fffc,0x87fffd,0x87fffe,0x87ffff,0x880000,0x880001,0x880002,0x880003,0x880004
+test_memory_size=0xa0000
+mode=all
+
+; source EA (=RMW instructions like NOT have only source EA) write bus error (requires extra hardware)
+[test=BE_SRCW]
+enabled=0
+feature_safe_memory_start=0x900000
+feature_safe_memory_size=0x80000
+feature_safe_memory_mode=W
+feature_target_src_ea=0x8ffffc,0x8ffffd,0x8ffffe,0x8fffff,0x900000,0x900001,0x900002,0x900003,0x900004
+feature_target_dst_ea=
+opcode_memory_start=0x8fffa0
+test_memory_start=0x880000
+test_memory_size=0x100000
+mode=all
+
+; destination EA write bus error (requires extra hardware)
+[test=BE_DSTW]
+enabled=0
+feature_safe_memory_start=0x900000
+feature_safe_memory_size=0x80000
+feature_safe_memory_mode=W
+feature_target_src_ea=
+feature_target_dst_ea=0x8ffffc,0x8ffffd,0x8ffffe,0x8fffff,0x900000,0x900001,0x900002,0x900003,0x900004
+opcode_memory_start=0x8fffa0
+test_memory_start=0x880000
+test_memory_size=0x100000
mode=all
static short gotcycles;
static short interrupttest;
static uae_u32 cyclecounter_addr;
+static short uae;
#ifdef AMIGA
static short interrupt_count;
static uae_u16 main_intena;
#define INFLATE_STACK_SIZE 3000
static uae_u8 *inflatestack;
+#ifdef AMIGA
+extern void uae_command(char*);
+#endif
+
+static int set_berr(int mask, int ask)
+{
+#ifdef AMIGA
+ if (uae) {
+ if (!mask) {
+ sprintf(tmpbuffer, "dbg \"w 0\"");
+ } else {
+ sprintf(tmpbuffer, "dbg \"w 0 %08x %08x BE%s%s%s\"", (uae_u32)safe_memory_start, safe_memory_end - safe_memory_start, (mask & 1) ? "R" : "", (mask & 2) ? "W" : "", (mask & 4) ? "P" : "");
+ }
+ uae_command(tmpbuffer);
+ return 0;
+ }
+#endif
+ if (!ask) {
+ return 0;
+ }
+ if (mask) {
+ printf("Re-enable write bus error mode and press any key (ESC=abort)\n");
+ } else {
+ printf("Disable write bus error mode and press any key (SPACE=skip,ESC=abort)\n");
+ }
+ return getchar();
+}
+
static uae_u8 *load_file(const char *path, const char *file, uae_u8 *p, int *sizep, int exiterror, int candirect)
{
char fname[256];
}
readdata(tmp, size2, f, unpack, &unpackoffset);
if (memcmp(tmp, p, size2)) {
- printf("Disable write bus error mode and press any key (SPACE=skip,ESC=abort)\n");
- int ch = getchar();
+ int ch = set_berr(0, 1);
if (ch == 27) {
exit(0);
} else if (ch == 32) {
memcpy(p, tmp, size2);
p += size2;
size -= size2;
- printf("Re-enable write bus error mode and press any key (ESC=abort)\n");
- if (getchar() == 27) {
+ ch = set_berr(2, 1);
+ if (ch == 27) {
exit(0);
}
}
} else {
#ifdef AMIGA
gotcycles = get_cycles_amiga();
+ // if write bus error, decrease cycles by 2. Tester hardware side-effect.
+ if (exc == 2) {
+ if (cpu_lvl == 0 && (last_exception[1] & 0x10) == 0) {
+ gotcycles -= 2;
+ }
+ if (cpu_lvl == 1 && (last_exception[8] & 0x01) == 0) {
+ gotcycles -= 2;
+ }
+ }
#else
end_test();
printf("No cycle count support\n");
regs.dstaddr = 0xffffffff;
regs.branchtarget = 0xffffffff;
+ if (safe_memory_mode) {
+ set_berr(safe_memory_mode, 0);
+ }
+
endpc = opcode_memory_addr;
startpc = opcode_memory_addr;
start_test();
end:
end_test();
+ set_berr(0, 0);
if (infoadded) {
printf("\n");
cyclecounter_addr = getparamval(next);
cycles = 1;
}
+ } else if (!_stricmp(s, "-uae")) {
+ uae = 1;
}
}