X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=megaed-sv%2Fmain.c;h=fa0c16343081e3f4035d0135eae0279c98a60808;hb=c6d1079a7b38a586ea977236d1075075d1e50d57;hp=d5a65a9ca0fe6b937185fb1dfd5da6da4b071cf7;hpb=65d9165cf790c51d46b68866f47b042105083f43;p=megadrive.git diff --git a/megaed-sv/main.c b/megaed-sv/main.c index d5a65a9..fa0c163 100644 --- a/megaed-sv/main.c +++ b/megaed-sv/main.c @@ -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 @@ -367,6 +389,17 @@ static int do_test(OsRoutine *ed, u8 b3) switch (b3) { + case '0': + printf("reading..\n"); + test_joy_read_log((void *)0x200000, 0x20000); + //test_joy_read_log((void *)0xff0200, 0x0f000); + 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 'j': test_joy_latency(&min, &max); printf("latency: %d - %d\n\n", min, max); @@ -378,6 +411,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 +509,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 +574,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;