#include "edos.h"
#include "asmtools.h"
+extern u16 start_hvc;
+
#define GFX_DATA_PORT 0xC00000
#define GFX_CTRL_PORT 0xC00004
#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)
}
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();
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
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
#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;
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;
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());
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;
}
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;