megaed-sv: z80 init
[megadrive.git] / megaed-sv / main.c
index d693dff..24a2528 100644 (file)
@@ -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) \
@@ -386,13 +388,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 +404,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);
@@ -485,6 +530,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 +559,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,14 +584,21 @@ 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("ED os/fw: %x/%x\n\n", ed->osGetOsVersion(),
+    printf("version: %02x, hvc: %04x %04x, zbus: %d\n",
+           read8(0xa10001), start_hvc, read16(GFX_CTRL_PORT),
+           read8(0xa11100) & 1);
+    printf("ED os/fw: %d/%d\n\n", ed->osGetOsVersion(),
            ed->osGetFirmVersion());
 
+    setup_z80();
+
     for (;;) {
         if (!ed->usbRdReady()) {
-            asm volatile("stop #0x2000");
+            /* note: stop corrupts SDRAM */
+            //asm volatile("stop #0x2000");
+            asm volatile(
+                "move.l #1000/10, %0\n"
+                "0: dbra %0, 0b\n" : "=r" (i) :: "cc");
             continue;
         }