X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=megaed-sv%2Fmain.c;h=a0741b6d18873a368db11ec78841c85466263113;hb=71b41fddd18f66c99e13f53bd78582627e6ff10b;hp=fa0c16343081e3f4035d0135eae0279c98a60808;hpb=c6d1079a7b38a586ea977236d1075075d1e50d57;p=megadrive.git diff --git a/megaed-sv/main.c b/megaed-sv/main.c index fa0c163..a0741b6 100644 --- a/megaed-sv/main.c +++ b/megaed-sv/main.c @@ -36,6 +36,8 @@ extern u16 start_hvc; *((volatile u16 *) (a)) #define read32(a) \ *((volatile u32 *) (a)) +#define write8(a, d) \ + *((volatile u8 *) (a)) = (d) #define write16(a, d) \ *((volatile u16 *) (a)) = (d) #define write32(a, d) \ @@ -213,6 +215,17 @@ static noinline int printf(const char *fmt, ...) return d; // wrong.. } +static u8 gethex(char c) +{ + if ('0' <= c && c <= '9') + return c - '0'; + if ('a' <= c && c <= 'f') + return c - 'a' + 10; + if ('A' <= c && c <= 'F') + return c - 'A' + 10; + return 0; +} + static const char *exc_names[] = { NULL, NULL, @@ -386,13 +399,15 @@ static void test_joy_latency(int *min_out, int *max_out) static int do_test(OsRoutine *ed, u8 b3) { int min = 0, max = 0; + int i, t, len, seed; + u8 *p, v; switch (b3) { case '0': printf("reading..\n"); - test_joy_read_log((void *)0x200000, 0x20000); - //test_joy_read_log((void *)0xff0200, 0x0f000); + test_joy_read_log((void *)0x200000, 0x20000, 1); + //test_joy_read_log((void *)0xff0200, 0x0f000, 1); printf("done\n"); return 0; case '1': @@ -400,6 +415,47 @@ static int do_test(OsRoutine *ed, u8 b3) test_joy_read_log_vsync((void *)0x200000, 3600 * 2); printf("done\n"); return 0; + case '2': + case '3': + printf("3btn_idle test..\n"); + p = (void *)0x200000; + len = 0x20000; + test_joy_read_log(p, len, b3 == '3'); + for (i = 0; i < len; i++) { + static const u8 e[2] = { 0x33, 0x7f }; + v = e[i & 1]; + if (p[i] != v) + printf("%06x: bad: %02x %02x\n", &p[i], p[i], v); + } + printf("done\n"); + return 0; + case '4': + printf("3btn_idle data test..\n"); + p = (void *)0x200000; + len = 0x20000; + for (i = 0; i < len; i++) { + static const u8 e[2] = { 0x33, 0x7f }; + v = e[i & 1]; + if (p[i] != v) + printf("%06x: bad: %02x %02x\n", &p[i], p[i], v); + } + printf("done\n"); + return 0; + case '5': + seed = read8(0xC00009); + printf("testing, seed=%02x\n", seed); + p = (void *)0x200000; + len = 0x100000; + test_byte_write(p, len, seed); + for (t = 0; t < 2; t++) { + for (i = 0; i < len; i++) { + v = (u8)(i + seed); + if (p[i] != v) + printf("%06x: bad: %02x %02x\n", &p[i], p[i], v); + } + printf("done (%d)\n", t); + } + return 0; case 'j': test_joy_latency(&min, &max); printf("latency: %d - %d\n\n", min, max); @@ -466,11 +522,17 @@ static int do_run(OsRoutine *ed, u8 b3, int tas_sync) case 'M': mapper = MTYPE_10M; break; + case 'n': + // raw numer: hex XX: mtype | x; + // x: bits [4-7]: SRAM_ON, SRAM_3M_ON, SNAP_SAVE_ON, MKEY + mapper = gethex(ed->usbReadByte()) << 4; + mapper |= gethex(ed->usbReadByte()); + break; default: return -1; } - printf("starting mapper %x..\n", mapper); + printf("syncing and starting mapper %x..\n", mapper); while (read16(GFX_CTRL_PORT) & 2) ; @@ -485,6 +547,25 @@ static int do_run(OsRoutine *ed, u8 b3, int tas_sync) return -1; } +void setup_z80(void) +{ + u8 *mem = (u8 *)0xa00000; + int i; + + write8(0xa11100, 1); + write8(0xa11200, 1); + + while (read8(0xa11100) & 1) + ; + + /* must use byte access */ + for (i = 0x2000; i > 0; i--) + *mem++ = 0; + + /* console starts with reset on, busreq off, + * gens starts with busreq on, keep that for gmv.. */ +} + int main() { OsRoutine *ed; @@ -495,6 +576,10 @@ int main() ed = (OsRoutine *) *(u32 *)0x1A0; ed->memInitDmaCode(); + /* setup VDP */ + while (read16(GFX_CTRL_PORT) & 2) + ; + ed->VDP_setReg(VDP_MODE1, 0x04); ed->VDP_setReg(VDP_MODE2, 0x64); ed->VDP_setReg(VDP_AUTOINC, 2); @@ -516,11 +601,13 @@ int main() /* note: relying on ED menu's font setup here.. */ printf("\n"); - printf("version: %02x, start_hvc: %04x\n", - read8(0xa10001), start_hvc); + printf("version: %02x, hvc: %04x %04x\n", + read8(0xa10001), start_hvc, read16(0xc00008)); printf("ED os/fw: %d/%d\n\n", ed->osGetOsVersion(), ed->osGetFirmVersion()); + setup_z80(); + for (;;) { if (!ed->usbRdReady()) { /* note: stop corrupts SDRAM */