       break;
   }
 
-  // Game controller pass through (XXX currently broken)
+  // Game controller pass through (Courtesy norgate)
   #if gameControllerDataPin >= 0
-    digitalWrite(gigatronDataPin, digitalRead(gameControllerDataPin));
-  #endif
+    for (;;) {
+      byte serialByte = 0;
+      sendPulse(gameControllerLatchPin);
+      for (byte i=0; i<8; i++) {       // Shift in all 8 bits
+        serialByte <<= 1;
+        serialByte |= digitalRead(gameControllerDataPin);
+        sendPulse(gameControllerPulsePin);
+      }
+
+      if (serialByte == 255)
+        break;
+      critical();                      // Forward byte to Gigatron
+      sendFirstByte(serialByte);
+      nonCritical();
+    } // Loop locally while active to skip PS/2 and waitVSync
+
+    // Allow PS/2 interrupts for a reasonable window
+    delay(14);                         // The game controller probe takes 1 ms
+  #else
+    delay(15);
+  #endif
+
+  // debugging
+  PORTB &= ~gigatronDataBit;
+  PORTB |= gigatronDataBit;
 
   // PS/2 keyboard events
-  delay(15);                           // Allow PS/2 interrupts for a reasonable window
   byte key = keyboard_getState();
   if (key != 255) {
     byte f = fnKey(key ^ 64);          // Ctrl+Fn key?

// 3. Forward text from USB to Gigatron as keystrokes
//    For example to get a long BASIC program loaded into BASIC
// 4. Controlling the Gigatron over USB from a PC/laptop
// 5. Passing through of game controller signals (XXX currently broken)
// 6. Receive data from Gigatron and store it in the EEPROM area.
//    If USB is connected, it also gets forwarded to the PC/laptop.
// 7. Sending the EEPROM data back into the Gigatron as a series


  #if gameControllerDataPin >= 0
    pinMode(gameControllerDataPin, INPUT_PULLUP); // Force HIGH if disconnected
    pinMode(gameControllerLatchPin, OUTPUT);
    pinMode(gameControllerPulsePin, OUTPUT);
  #endif

  // Open upstream communication
