megaed-sv: more tests
[megadrive.git] / megaed-sv / main.c
index d5a65a9..4473c5c 100644 (file)
@@ -308,10 +308,10 @@ void vbl(void)
 }
 
 static int usb_read_while_ready(OsRoutine *ed,
-    void *buf_, int maxlen)
+    void *buf_, unsigned int maxlen)
 {
     u8 *buf = buf_;
-    int r = 0;
+    unsigned int r = 0;
 
     while (ed->usbRdReady() && r < maxlen)
         buf[r++] = ed->usbReadByte();
@@ -319,6 +319,28 @@ static int usb_read_while_ready(OsRoutine *ed,
     return r;
 }
 
+static int usb_read(OsRoutine *ed, void *buf_, unsigned int maxlen)
+{
+    u8 *buf = buf_;
+    unsigned int r = 0;
+
+    while (r < maxlen)
+        buf[r++] = ed->usbReadByte();
+
+    return r;
+}
+
+static int usb_write(OsRoutine *ed, const void *buf_, unsigned int maxlen)
+{
+    const u8 *buf = buf_;
+    unsigned int r = 0;
+
+    while (r < maxlen)
+        ed->usbWriteByte(buf[r++]);
+
+    return r;
+}
+
 /*
  * TH = 1 : ?1CBRLDU    3-button pad return value (not read)
  * TH = 0 : ?0SA00DU    3-button pad return value
@@ -364,9 +386,63 @@ 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, 1);
+        //test_joy_read_log((void *)0xff0200, 0x0f000, 1);
+        printf("done\n");
+        return 0;
+    case '1':
+        printf("reading w/vsync..\n");
+        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);
@@ -378,6 +454,29 @@ static int do_test(OsRoutine *ed, u8 b3)
     return -1;
 }
 
+static int do_custom(OsRoutine *ed, u8 b3)
+{
+    struct {
+        unsigned int addr;
+        unsigned int size;
+    } d;
+
+    switch (b3)
+    {
+    case 'd':
+        usb_read(ed, &d, sizeof(d));
+        ed->usbWriteByte('k');
+        printf("sending %i bytes from %06x..\n", d.size, d.addr);
+        usb_write(ed, (void *)d.addr, d.size);
+        printf("done.\n");
+        return 1;
+    default:
+        break;
+    }
+
+    return -1;
+}
+
 #define MTYPE_OS 0
 #define MTYPE_MD 1
 #define MTYPE_SSF 2
@@ -453,16 +552,25 @@ int main()
     for (i = 0; i < PLANE_W * PLANE_H / 2; i++)
         write32(GFX_DATA_PORT, 0);
 
+    /* scroll planes */
+    write32(GFX_CTRL_PORT, GFX_WRITE_VSRAM_ADDR(0));
+    write32(GFX_DATA_PORT, 0);
+
     /* 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("ED os/fw: %d/%d\n\n", ed->osGetOsVersion(),
            ed->osGetFirmVersion());
 
     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;
         }
 
@@ -509,6 +617,17 @@ int main()
             }
             ed->usbWriteByte('k');
             break;
+        case 'x':
+            buf[2] = ed->usbReadByte();
+            ret = do_custom(ed, buf[2]);
+            if (ret == 1)
+                break;
+            if (ret != 0) {
+                d = 3;
+                goto bad_input;
+            }
+            ed->usbWriteByte('k');
+            break;
         default:
             d = 2;
             goto bad_input;