From 7e0ed7de50c4e9ca63a33b86c09aa8707c0e0be3 Mon Sep 17 00:00:00 2001 From: Raphael Assenat Date: Sat, 7 Nov 2015 01:35:40 -0500 Subject: [PATCH] Add n64 expansion read to lib --- tool/gcn64lib.c | 25 ++++++++++++++++++++----- tool/gcn64lib.h | 3 ++- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/tool/gcn64lib.c b/tool/gcn64lib.c index 2c4749a..fa8a496 100644 --- a/tool/gcn64lib.c +++ b/tool/gcn64lib.c @@ -218,25 +218,40 @@ int gcn64lib_bootloader(gcn64_hdl_t hdl) return 0; } -int gcn64lib_n64_expansionWrite(gcn64_hdl_t hdl, unsigned short addr, unsigned char data[32]) +int gcn64lib_n64_expansionWrite(gcn64_hdl_t hdl, unsigned short addr, unsigned char *data, int len) { - unsigned char cmd[40]; + unsigned char cmd[3 + len]; int cmdlen; int n; cmd[0] = N64_EXPANSION_WRITE; cmd[1] = addr>>8; // Address high byte cmd[2] = addr&0xff; // Address low byte - memcpy(cmd + 3, data, 0x20); - cmdlen = 3 + 0x20; + memcpy(cmd + 3, data, len); + cmdlen = 3 + len; n = gcn64lib_rawSiCommand(hdl, 0, cmd, cmdlen, cmd, sizeof(cmd)); if (n != 1) { - printf("write block returned != 1 (%d)\n", n); + printf("expansion write returned != 1 (%d)\n", n); return -1; } return cmd[0]; } +int gcn64lib_n64_expansionRead(gcn64_hdl_t hdl, unsigned short addr, unsigned char *dst, int max_len) +{ + unsigned char cmd[3]; + int n; + + cmd[0] = N64_EXPANSION_READ; + cmd[1] = addr>>8; // Address high byte + cmd[2] = addr&0xff; // Address low byte + + n = gcn64lib_rawSiCommand(hdl, 0, cmd, 3, dst, max_len); + if (n < 0) + return n; + + return n; +} diff --git a/tool/gcn64lib.h b/tool/gcn64lib.h index f8046bf..7fcadbe 100644 --- a/tool/gcn64lib.h +++ b/tool/gcn64lib.h @@ -19,7 +19,8 @@ int gcn64lib_getControllerType(gcn64_hdl_t hdl, int chn); const char *gcn64lib_controllerName(int type); int gcn64lib_bootloader(gcn64_hdl_t hdl); -int gcn64lib_n64_expansionWrite(gcn64_hdl_t hdl, unsigned short addr, unsigned char data[32]); +int gcn64lib_n64_expansionWrite(gcn64_hdl_t hdl, unsigned short addr, unsigned char *data, int len); +int gcn64lib_n64_expansionRead(gcn64_hdl_t hdl, unsigned short addr, unsigned char *dst, int max_len); int gcn64lib_8bit_scan(gcn64_hdl_t hdl, unsigned char min, unsigned char max); int gcn64lib_16bit_scan(gcn64_hdl_t hdl, unsigned short min, unsigned short max);