The porting of the NESBot Play the 'Tool Assisted Speedrun' videos on the real machine(NES). original (with Arduino): http://www.instructables.com/id/NESBot-Arduino-Powered-Robot-beating-Super-Mario-/ Almost same as the original, it need generated Key-input data by emulator with Lua script. See the original instructables' documents to know how to generate data file. BOM: mbed x1 NES x1 NES controller x1 4021(shift registor) x1

Dependencies:   mbed

Revision:
0:19e971e75a74
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Jan 07 06:23:54 2012 +0000
@@ -0,0 +1,118 @@
+#include "mbed.h"
+
+// - The porting of the NESBot
+// original : http://www.instructables.com/id/NESBot-Arduino-Powered-Robot-beating-Super-Mario-/
+// 
+// ported by Kaoru Shoji : http://mbed.org/users/kshoji
+// 
+// - Connections:
+// a NES, a mbed and a 4021 (shift register) needed.
+// 
+// for example) AV-FAMICOM(JPY) connector pinout
+// 1 LATCH (PL, P/S)    -> mbed's 9 pin
+// 2 CLOCK              -> 4021's 10 pin
+// 3 VCC                -> 4021's 16 pin
+// 4 GND                -> mbed's GND & 4021's 8 pin
+// 5 DATA               -> 4021's 3 pin
+// 
+// - Note:
+// The mbed's VCC must be supplied from USB cable.
+// If mbed's VCC is supplied from NES VCC, the LATCH signal detection may be failed.
+// 
+// - How to use:
+// 0. Prepare the replay data with FCEUX and Lua script. (Lua script can be downloaded from instructables).
+//    The data file needs to be placed into mbed's LocalFileSystem(on the root directory).
+// 1. NES power turn off.
+// 2. connect mbed to NES, and USB power.
+// 3. NES power turn on.
+
+InterruptIn latchInterrupt(p9); // LATCH signal in
+
+DigitalOut R(p10); // -> 4021's p1(7)
+DigitalOut L(p11); // -> 4021's p2(6)
+DigitalOut D(p12); // -> 4021's p3(5)
+DigitalOut U(p13); // -> 4021's p4(4)
+DigitalOut T(p14); // -> 4021's p5(13)
+DigitalOut S(p15); // -> 4021's p6(14)
+DigitalOut B(p16); // -> 4021's p7(15)
+DigitalOut A(p17); // -> 4021's p8(1)
+
+// status LEDs
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+
+LocalFileSystem local("mbed");
+
+// Large buffer may cause time rag when file loading.
+#define BUFFER_LENGTH (128)
+
+unsigned char controllerData[BUFFER_LENGTH];
+int controllerDataPosition = 0;
+
+FILE *fp;
+long fileLength = 0;
+long filePosition = 0;
+
+volatile bool finished = false;
+
+void writeButtons() {
+    unsigned char state = ~controllerData[controllerDataPosition];
+
+    // output to shift register
+    R = state & 0x80;
+    L = state & 0x40;
+    D = state & 0x20;
+    U = state & 0x10;
+    T = state & 0x08;
+    S = state & 0x04;
+    B = state & 0x02;
+    A = state & 0x01;
+}
+
+void showLEDs() {
+    led1 = !U | !D;
+    led2 = !L | !R;
+    led3 = !A;
+    led4 = !B;
+}
+
+void trigger() {
+    // when P/S Control signal falled(Serial mode)
+    // read the controller state
+    writeButtons();
+    showLEDs();
+
+    filePosition++;
+    if (filePosition >= fileLength) {
+        latchInterrupt.fall(0);
+        finished = true;
+        return;
+    }
+
+    controllerDataPosition++;
+    if (controllerDataPosition >= BUFFER_LENGTH) {
+        fread(controllerData, 1, BUFFER_LENGTH, fp);
+        controllerDataPosition = 0;
+    }
+}
+
+int main() {
+    // TODO replace your filename
+    fp = fopen("/mbed/tas.txt", "rb");
+    controllerDataPosition = 0;
+
+    fseek(fp, 0L, SEEK_END);
+    fileLength = ftell(fp);
+    fseek(fp, 0L, SEEK_SET);
+
+    fread(controllerData, 1, BUFFER_LENGTH, fp);
+    writeButtons();    
+    
+    latchInterrupt.mode(PullNone);
+    latchInterrupt.fall(&trigger);
+    
+    while(!finished);
+    fclose(fp);
+}