megaed-sv: download memory command
[megadrive.git] / megaed-sv / main.c
index a5ba918..6486a05 100644 (file)
@@ -13,6 +13,8 @@
 #include "edos.h"
 #include "asmtools.h"
 
+extern u16 start_hvc;
+
 #define GFX_DATA_PORT    0xC00000
 #define GFX_CTRL_PORT    0xC00004
 
@@ -22,7 +24,7 @@
 #define TILE_FONT_BASE   (TILE_MEM_END / 32  - FONT_LEN)
 
 /* note: using ED menu's layout here.. */
-#define WPLAN            (TILE_MEM_END + 0x0000)
+#define WPLANE           (TILE_MEM_END + 0x0000)
 #define HSCRL            (TILE_MEM_END + 0x0800)
 #define SLIST            (TILE_MEM_END + 0x0C00)
 #define APLANE           (TILE_MEM_END + 0x1000)
@@ -306,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();
@@ -317,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
@@ -376,6 +400,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
@@ -384,7 +431,7 @@ static int do_test(OsRoutine *ed, u8 b3)
 #define MTYPE_10M 5
 #define MTYPE_32X 6
 
-static int do_run(OsRoutine *ed, u8 b3)
+static int do_run(OsRoutine *ed, u8 b3, int tas_sync)
 {
     u8 mapper = 0;
 
@@ -412,14 +459,16 @@ static int do_run(OsRoutine *ed, u8 b3)
         return -1;
     }
 
-    while (read32(GFX_CTRL_PORT) & 2)
+    printf("starting mapper %x..\n", mapper);
+
+    while (read16(GFX_CTRL_PORT) & 2)
         ;
     ed->VDP_setReg(VDP_MODE1, 0x04); 
     ed->VDP_setReg(VDP_MODE2, 0x44); 
 
     ed->usbWriteByte('k');
 
-    run_game(mapper);
+    run_game(mapper, tas_sync);
     /* should not get here.. */
 
     return -1;
@@ -449,9 +498,15 @@ 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("version: %02x\n", read8(0xa10001));
+    printf("\n");
+    printf("version: %02x, start_hvc: %04x\n",
+           read8(0xa10001), start_hvc);
     printf("ED os/fw: %x/%x\n\n", ed->osGetOsVersion(),
            ed->osGetFirmVersion());
 
@@ -484,8 +539,9 @@ int main()
             printf("done\n");
             break;
         case 'r':
+        case 'R':
             buf[2] = ed->usbReadByte();
-            ret = do_run(ed, buf[2]);
+            ret = do_run(ed, buf[2], buf[1] == 'R');
             if (ret != 0) {
                 d = 3;
                 goto bad_input;
@@ -503,6 +559,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;