diff --git a/src/pc/controller/controller_entry_point.c b/src/pc/controller/controller_entry_point.c index be8e773..6c5f93f 100644 --- a/src/pc/controller/controller_entry_point.c +++ b/src/pc/controller/controller_entry_point.c @@ -3,15 +3,16 @@ #include "controller_recorded_tas.h" #include "controller_keyboard.h" - #include "controller_sdl.h" #include "controller_gamebridge.h" +#include "controller_tas_recorder.h" static struct ControllerAPI *controller_implementations[] = { &controller_recorded_tas, &controller_sdl, &controller_keyboard, &controller_gamebridge, + &controller_tas_recorder, }; s32 osContInit(OSMesgQueue *mq, u8 *controllerBits, OSContStatus *status) { diff --git a/src/pc/controller/controller_recorded_tas.c b/src/pc/controller/controller_recorded_tas.c index 4f5c1bb..af6bf43 100644 --- a/src/pc/controller/controller_recorded_tas.c +++ b/src/pc/controller/controller_recorded_tas.c @@ -1,26 +1,48 @@ #include #include +#include +#include #include "controller_api.h" -static FILE *fp; +static FILE *fin; +static int counter; + +#define OFFSET 0x400 +#define fname "cont.m64" static void tas_init(void) { - fp = fopen("cont.m64", "rb"); - if (fp != NULL) { - uint8_t buf[0x400]; - fread(buf, 1, sizeof(buf), fp); + fin = fopen(fname, "rb"); + if (fin == NULL) { + return; } + + printf("[tas_playback] loading %s\n", fname); + uint8_t buf[OFFSET]; + fread(buf, 1, sizeof(buf), fin); + counter = 0; } static void tas_read(OSContPad *pad) { - if (fp != NULL) { - uint8_t bytes[4] = {0}; - fread(bytes, 1, 4, fp); - pad->button = (bytes[0] << 8) | bytes[1]; - pad->stick_x = bytes[2]; - pad->stick_y = bytes[3]; + if (fin == NULL) { + return; } + + uint8_t bytes[4] = {0}; + int result = fread(bytes, 1, 4, fin); + if (feof(fin)) { + printf("[tas_playback] end of tas input\n"); + fclose(fin); + fin = NULL; + return; + } + + pad->button = (bytes[0] << 8) | bytes[1]; + pad->stick_x = bytes[2]; + pad->stick_y = bytes[3]; + counter+=4; + printf("[tas_playback] %08x called %04x %02x%02x\n", (counter + OFFSET), pad->button, bytes[2], bytes[3]); + fflush(stdout); } struct ControllerAPI controller_recorded_tas = { diff --git a/src/pc/controller/controller_tas_recorder.c b/src/pc/controller/controller_tas_recorder.c new file mode 100644 index 0000000..6bd1c99 --- /dev/null +++ b/src/pc/controller/controller_tas_recorder.c @@ -0,0 +1,53 @@ +#include +#include +#include +#include + +#include "controller_api.h" + +static FILE *fout; +static int counter; + +#define OFFSET 0x400 +#define fname "rec.m64" + +static void tas_recorder_close(void) { + fclose(fout); + printf("[tas_recorder] saving tas data to %s\n", fname); +} + +static void tas_recorder_init(void) { + if (fname == NULL) { + fout = NULL; + return; + } + + unlink(fname); + printf("[tas_recorder] writing output to %s\n", fname); + fout = fopen(fname, "wb"); + assert(fout != NULL); + uint8_t buf[OFFSET]; + memset(buf, 0, sizeof(buf)); + fwrite(buf, 1, sizeof(buf), fout); + atexit(tas_recorder_close); +} + +static void tas_recorder_read(OSContPad *pad) { + if (fout == NULL) { + return; + } + + uint8_t bytes[4] = {0}; + int button1 = pad->button; + int button2 = pad->button; + bytes[0] = button1 >> 8; + bytes[1] = button2 & 0x00FF; + bytes[2] = pad->stick_x; + bytes[3] = pad->stick_y; + fwrite(bytes, 1, 4, fout); +} + +struct ControllerAPI controller_tas_recorder = { + tas_recorder_init, + tas_recorder_read +}; diff --git a/src/pc/controller/controller_tas_recorder.h b/src/pc/controller/controller_tas_recorder.h new file mode 100644 index 0000000..8ceccf8 --- /dev/null +++ b/src/pc/controller/controller_tas_recorder.h @@ -0,0 +1,8 @@ +#ifndef CONTROLLER_TAS_RECORDER_H +#define CONTROLLER_TAS_RECORDER_H + +#include "controller_api.h" + +extern struct ControllerAPI controller_tas_recorder; + +#endif