Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 1:a93f71ee6778, committed 2015-12-06
- Comitter:
- christopherjwang
- Date:
- Sun Dec 06 19:16:05 2015 +0000
- Parent:
- 0:7434770d9fc9
- Commit message:
- MVP, hard coded at p9 and p10
Changed in this revision
| Nintendo.cpp | Show diff for this revision Revisions of this file |
| Nintendo.h | Show diff for this revision Revisions of this file |
--- a/Nintendo.cpp Sun Dec 06 19:15:28 2015 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,504 +0,0 @@
-///*
-//Copyright (c) 2014-2015 NicoHood
-//See the readme for credit to other people.
-//
-//Permission is hereby granted, free of charge, to any person obtaining a copy
-//of this software and associated documentation files (the "Software"), to deal
-//in the Software without restriction, including without limitation the rights
-//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-//copies of the Software, and to permit persons to whom the Software is
-//furnished to do so, subject to the following conditions:
-//
-//The above copyright notice and this permission notice shall be included in
-//all copies or substantial portions of the Software.
-//
-//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-//THE SOFTWARE.
-//*/
-//
-//#include "Nintendo.h"
-//
-////================================================================================
-//// Gamecube
-////================================================================================
-//
-//// it has this fucking global variable...
-////Gamecube_ Gamecube;
-////
-////Gamecube_::Gamecube_(void) {
-////
-////}
-//
-//Gamecube_::Gamecube_(PinName _data_line)
-// :data_line(_data_line)
-//{
-//
-//}
-//
-//bool Gamecube_::begin(const uint8_t pin)
-//{
-// // discard the information
-// Gamecube_Status_t status;
-// return begin(pin, status);
-//}
-//
-//bool Gamecube_::begin(const uint8_t pin, Gamecube_Status_t &status) {
-//// // get the port mask and the pointers to the in/out/mode registers
-//// uint8_t bitMask = digitalPinToBitMask(pin);
-//// uint8_t port = digitalPinToPort(pin);
-//// volatile uint8_t* modePort = portModeRegister(port);
-//// volatile uint8_t* outPort = portOutputRegister(port);
-//// volatile uint8_t* inPort = portInputRegister(port);
-////
-//// // Initialize the gamecube controller by sending it a null byte.
-//// // This is unnecessary for a standard controller, but is required for the
-//// // Wavebird.
-//// uint8_t command[] = { 0x00 };
-////
-//// // don't want interrupts getting in the way
-//// uint8_t oldSREG = SREG;
-//// cli();
-////
-//// // send the command
-//// gc_send(command, sizeof(command), modePort, outPort, bitMask);
-////
-//// // read in data
-//// uint8_t receivedBytes = gc_get((uint8_t*)&status, sizeof(status), modePort, outPort, inPort, bitMask);
-////
-//// // end of time sensitive code
-//// SREG = oldSREG;
-////
-//// // return status information for optional use
-//// bool newinput;
-//// if (receivedBytes == sizeof(status)){
-//// // switch the first two bytes to compare it easy with the documentation
-//// uint8_t temp = status.whole8[0];
-//// status.whole8[0] = status.whole8[1];
-//// status.whole8[1] = temp;
-////
-//// newinput = true;
-//// }
-//// else
-//// newinput = false;
-//// return newinput;
-//}
-////
-////
-////bool Gamecube_::end(const uint8_t pin){
-//// // Turns off rumble by sending a normal reading request
-//// // and discards the information
-//// Gamecube_Data_t report;
-//// return read(pin, report, false);
-////}
-////
-////
-////bool Gamecube_::read(const uint8_t pin, Gamecube_Data_t &report, const bool rumble)
-////{
-//// // get the port mask and the pointers to the in/out/mode registers
-//// uint8_t bitMask = digitalPinToBitMask(pin);
-//// uint8_t port = digitalPinToPort(pin);
-//// volatile uint8_t* modePort = portModeRegister(port);
-//// volatile uint8_t* outPort = portOutputRegister(port);
-//// volatile uint8_t* inPort = portInputRegister(port);
-////
-//// // command to send to the gamecube, LSB is rumble
-//// uint8_t command[] = { 0x40, 0x03, rumble & 0x01 };
-////
-//// // don't want interrupts getting in the way
-//// uint8_t oldSREG = SREG;
-//// cli();
-////
-//// // send the command
-//// gc_send(command, sizeof(command), modePort, outPort, bitMask);
-////
-//// // read in new data
-//// uint8_t receivedBytes = gc_get((uint8_t*)&report, sizeof(report), modePort, outPort, inPort, bitMask);
-////
-//// // end of time sensitive code
-//// SREG = oldSREG;
-////
-//// // return status information for optional use
-//// bool newinput;
-//// if (receivedBytes == sizeof(report))
-//// newinput = true;
-//// else
-//// newinput = false;
-//// return newinput;
-////}
-////
-////
-//////================================================================================
-////// Gamecube/N64 i/o functions
-//////================================================================================
-////
-////// nop definitions, placed here so the header/user
-////// doesnt see/use this because it is %[nop] specific
-/////*
-////Serial.begin(115200);
-////for (int n = 0; n < 100; n++) {
-////Serial.print("#define nopn");
-////Serial.print(n);
-////Serial.print(" nopn");
-////Serial.println(n % 3);
-////}
-////*/
-////
-////#define nopManual(n) nopn ## n
-////#define nopn0 // (0 % 3)
-////#define nopn1 "nop\n" // (1 % 3)
-////#define nopn2 "nop\nnop\n" // (2 % 3)
-////#define nopn3 nopn0 // (3 % 3)
-////#define nopn4 nopn1 //..
-////#define nopn5 nopn2
-////#define nopn6 nopn0
-////#define nopn7 nopn1
-////#define nopn8 nopn2
-////#define nopn9 nopn0
-////#define nopn10 nopn1
-////#define nopn11 nopn2
-////#define nopn12 nopn0
-////#define nopn13 nopn1
-////#define nopn14 nopn2
-////#define nopn15 nopn0
-////#define nopn16 nopn1
-////#define nopn17 nopn2
-////#define nopn18 nopn0
-////#define nopn19 nopn1
-////#define nopn20 nopn2
-////#define nopn21 nopn0
-////#define nopn22 nopn1
-////#define nopn23 nopn2
-////#define nopn24 nopn0
-////#define nopn25 nopn1
-////#define nopn26 nopn2
-////#define nopn27 nopn0
-////#define nopn28 nopn1
-////#define nopn29 nopn2
-////#define nopn30 nopn0
-////#define nopn31 nopn1
-////#define nopn32 nopn2
-////#define nopn33 nopn0
-////#define nopn34 nopn1
-////#define nopn35 nopn2
-////#define nopn36 nopn0
-////#define nopn37 nopn1
-////#define nopn38 nopn2
-////#define nopn39 nopn0
-////#define nopn40 nopn1
-////#define nopn41 nopn2
-////#define nopn42 nopn0
-////#define nopn43 nopn1
-////#define nopn44 nopn2
-////#define nopn45 nopn0
-////#define nopn46 nopn1
-////#define nopn47 nopn2
-////#define nopn48 nopn0
-////#define nopn49 nopn1
-////#define nopn50 nopn2
-////#define nopn51 nopn0
-////#define nopn52 nopn1
-////#define nopn53 nopn2
-////#define nopn54 nopn0
-////#define nopn55 nopn1
-////#define nopn56 nopn2
-////#define nopn57 nopn0
-////#define nopn58 nopn1
-////#define nopn59 nopn2
-////#define nopn60 nopn0
-////#define nopn61 nopn1
-////#define nopn62 nopn2
-////#define nopn63 nopn0
-////#define nopn64 nopn1
-////#define nopn65 nopn2
-////#define nopn66 nopn0
-////#define nopn67 nopn1
-////#define nopn68 nopn2
-////#define nopn69 nopn0
-////#define nopn70 nopn1
-////#define nopn71 nopn2
-////#define nopn72 nopn0
-////#define nopn73 nopn1
-////#define nopn74 nopn2
-////#define nopn75 nopn0
-////#define nopn76 nopn1
-////#define nopn77 nopn2
-////#define nopn78 nopn0
-////#define nopn79 nopn1
-////#define nopn80 nopn2
-////#define nopn81 nopn0
-////#define nopn82 nopn1
-////#define nopn83 nopn2
-////#define nopn84 nopn0
-////#define nopn85 nopn1
-////#define nopn86 nopn2
-////#define nopn87 nopn0
-////#define nopn88 nopn1
-////#define nopn89 nopn2
-////#define nopn90 nopn0
-////#define nopn91 nopn1
-////#define nopn92 nopn2
-////#define nopn93 nopn0
-////#define nopn94 nopn1
-////#define nopn95 nopn2
-////#define nopn96 nopn0
-////#define nopn97 nopn1
-////#define nopn98 nopn2
-////#define nopn99 nopn0
-////
-////#define nop_reg "%[nop]" // in this sketch we named the register like this
-////#define nop_block(id, N) /* nops have to be >=3 in order to work*/ \
-////"ldi " nop_reg ", (" #N "/3)\n" /* (1) ldi, start */ \
-////".L%=_nop_loop" #id ":\n" /* + ((N-1) * (1) dec + (2) brne), (N-1) loops */ \
-////"dec " nop_reg "\n" /* + (1) dec + (1) brne, last loop */ \
-////"brne .L%=_nop_loop" #id "\n" /* --> (N * 3) nops */ \
-////nopManual(N) /* N % 3 manual nops */
-//
-//void Gamecube_::gc_send(uint8_t* buff, uint8_t len) {
-// __disable_irq();
-// uint8_t i;
-// data_line.output();
-// for (i=0; i < len; i++) {
-// data_line.write(buff[i]);
-// wait_us(1);
-// }
-// __enable_irq();
-//}
-/////**
-//// * This sends the given byte sequence to the controller
-//// * length must be at least 1
-//// */
-////void gc_send(uint8_t* buff, uint8_t len,
-//// volatile uint8_t* modePort, volatile uint8_t* outPort, uint8_t bitMask)
-////{
-//// // set pin to output, default high
-//// *outPort |= bitMask;
-//// *modePort |= bitMask;
-////
-//// // temporary register values used as "clobbers"
-//// register uint8_t bitCount;
-//// register uint8_t data;
-//// register uint8_t nop;
-////
-//// asm volatile (
-//// "; Start of gc_send assembly\n"
-////
-//// // passed in to this block are:
-//// // the %a[buff] register is the buffer pointer
-//// // %[len] is the register holding the length of the buffer in bytes
-////
-//// // Instruction cycles are noted in parentheses
-//// // branch instructions have two values, one if the branch isn't
-//// // taken and one if it is
-////
-//// // %[data] will be the current buffer byte loaded from memory
-//// // %[bitCount] will be the bit counter for the current byte. when this
-//// // reaches 0, we need to decrement the length counter, load
-//// // the next buffer byte, and loop. (if the length counter becomes
-//// // 0, that's our exit condition)
-////
-//// // This label starts the outer loop, which sends a single byte
-//// ".L%=_byte_loop:\n"
-//// "ld %[data], %a[buff]+\n" // (2) load the next byte and increment byte pointer
-//// "ldi %[bitCount],0x08\n" // (1) set bitcount to 8 bits
-////
-//// // This label starts the inner loop, which sends a single bit
-//// ".L%=_bit_loop:\n"
-//// "st %a[outPort],%[low]\n" // (2) pull the line low
-////
-//// // line needs to stay low for 1�s for a 1 bit, 3�s for a 0 bit
-//// // this block figures out if the next bit is a 0 or a 1
-//// // the strategy here is to shift the register left, then test and
-//// // branch on the carry flag
-//// "lsl %[data]\n" // (1) shift left. MSB goes into carry bit of status reg
-//// "brcc .L%=_zero_bit\n" // (1/2) branch if carry is cleared
-////
-////
-//// // this block is the timing for a 1 bit (1�s low, 3�s high)
-//// // Stay low for 2uS: 16 - 2 (above lsl,brcc) - 2 (below st) = 12 cycles
-//// nop_block(1, 12) // nop block 1, 12 cycles
-////
-//// "st %a[outPort],%[high]\n" // (2) set the line high again
-//// // Now stay high for 2�s of the 3�s to sync up with the branch below
-//// // 2*16 - 2 (for the rjmp) = 30 cycles
-//// nop_block(2, 30) // nop block 2, 30 cycles
-//// "rjmp .L%=_finish_bit\n" // (2)
-////
-////
-//// // this block is the timing for a 0 bit (3�s low, 1�s high)
-//// // Need to go high in 3*16 - 3 (above lsl,brcc) - 2 (below st) = 43 cycles
-//// ".L%=_zero_bit:\n"
-//// nop_block(3, 43) // nop block 3, 43 cycles
-//// "st %a[outPort],%[high]\n" // (2) set the line high again
-////
-////
-//// // The two branches meet up here.
-//// // We are now *exactly* 3�s into the sending of a bit, and the line
-//// // is high again. We have 1�s to do the looping and iteration
-//// // logic.
-//// ".L%=_finish_bit:\n"
-//// "dec %[bitCount]\n" // (1) subtract 1 from our bit counter
-//// "breq .L%=_load_next_byte\n" // (1/2) branch if we've sent all the bits of this byte
-////
-//// // At this point, we have more bits to send in this byte, but the
-//// // line must remain high for another 1�s (minus the above
-//// // instructions and the jump below and the st instruction at the
-//// // top of the loop)
-//// // 16 - 2(above) - 2 (rjmp below) - 2 (st after jump) = 10
-//// nop_block(4, 10) // nop block 4, 10 cycles
-//// "rjmp .L%=_bit_loop\n" // (2)
-////
-////
-//// // This block starts 3 cycles into the last 1�s of the line being high
-//// // We need to decrement the byte counter. If it's 0, that's our exit condition.
-//// // If not we need to load the next byte and go to the top of the byte loop
-//// ".L%=_load_next_byte:\n"
-//// "dec %[len]\n" // (1) len--
-//// "breq .L%=_loop_exit\n" // (1/2) if the byte counter is 0, exit
-//// // delay block:
-//// // needs to go high after 1�s or 16 cycles
-//// // 16 - 5 (above) - 2 (the jump itself) - 5 (after jump) = 4
-//// nop_block(5, 4) // nop block 5, 4 cycles
-//// "rjmp .L%=_byte_loop\n" // (2)
-////
-////
-//// // Loop exit
-//// ".L%=_loop_exit:\n"
-////
-//// // final task: send the stop bit, which is a 1 (1�s low 3�s high)
-//// // the line goes low in:
-//// // 16 - 6 (above since line went high) - 2 (st instruction below) = 8 cycles
-//// nop_block(6, 8) // nop block 6, 8 cycles
-//// "st %a[outPort],%[low]\n" // (2) pull the line low
-//// // stay low for 1�s
-//// // 16 - 2 (below st) = 14
-//// nop_block(7, 14) // nop block 7, 14 cycles
-//// "st %a[outPort],%[high]\n" // (2) set the line high again
-//// // just stay high. no need to wait 3�s before returning
-////
-//// // ----------
-//// // outputs:
-//// : [buff] "+e" (buff), // (read and write)
-//// [outPort] "+e" (outPort), // (read and write)
-//// [bitCount] "=&d" (bitCount), // (output only, ldi needs the upper registers)
-//// [data] "=&r" (data), // (output only)
-//// [nop] "=&d" (nop) // (output only, ldi needs the upper registers)
-////
-//// // inputs:
-//// : [len] "r" (len),
-//// [high] "r" (*outPort | bitMask), // precalculate new pin states
-//// [low] "r" (*outPort & ~bitMask) // this works because we turn interrupts off
-////
-//// // no clobbers
-//// ); // end of asm volatile
-////}
-////
-////
-/////**
-////* Read bytes from the gamecube controller
-////* listen for the expected bytes of data back from the controller and
-////* and pack it into the buff
-////*/
-////uint8_t gc_get(uint8_t* buff, uint8_t len,
-//// volatile uint8_t* modePort, volatile uint8_t* outPort, volatile uint8_t * inPort, uint8_t bitMask)
-////{
-//// // prepare pin for input with pullup
-//// *modePort &= ~bitMask;
-//// *outPort |= bitMask;
-////
-//// // temporary register values used as "clobbers"
-//// register uint8_t timeoutCount; // counts down the timeout
-//// register uint8_t bitCount; // counts down 8 bits for each byte
-//// register uint8_t inputVal; // temporary variable to save the pin states
-//// register uint8_t data; // keeps the temporary received data byte
-//// register uint8_t receivedBytes; // the return value of the function
-////
-//// asm volatile (
-//// "; Start of gc_get assembly\n"
-////
-//// // [bitCount] is our bit counter. We read %[len] bytes
-//// // and increment the byte pointer and receivedBytes every 8 bits
-//// "ldi %[bitCount],0x08\n" // (1) set bitcount to 8 bits
-//// "ldi %[receivedBytes],0x00\n" // (1) default exit value is 0 bytes received
-////
-//// // This first spinloop waits for the line to go low.
-//// // It loops 64 times before it gives up and returns
-//// ".L%=_wait_for_low:\n"
-//// "ldi %[timeoutCount],%[timeout]\n" // (1) set the timeout
-//// ".L%=_wait_for_low_loop:\n" // 7 cycles if loop fails
-//// "ld %[inputVal], %a[inPort]\n" // (2) read the pin (happens before the 2 cycles)
-//// "and %[inputVal], %[bitMask]\n" // (1) compare pinstate with bitmask
-//// "breq .L%=_wait_for_measure\n" // (1/2) jump to the measure part if pin is low
-//// // the following happens if the line is still high
-//// "dec %[timeoutCount]\n" // (1) decrease timeout by 1
-//// "brne .L%=_wait_for_low_loop\n" // (1/2) loop if the counter isn't 0
-//// "rjmp .L%=_exit\n" // (2) timeout, jump to the end
-////
-////
-//// // Next block. The line has just gone low. Wait approx 2�s
-//// // each cycle is 1/16 �s on a 16Mhz processor
-//// // best case: 32 - 5 (above) - 1 (below) = 26 nops
-//// // worst case: 32 - 5 (above) - 6 (above, worst case) - 1 (below) = 20 nops
-//// // --> 23 nops
-//// ".L%=_wait_for_measure:\n"
-//// // nop block, 23 cycles, use inputVal as temporary reg since we dont need it right now
-//// "ldi %[inputVal], (23/3)\n" /* (1) ldi, start */
-//// ".L%=_nop_loop1:\n" /* + ((N-1) * (1) dec + (2) brne), (N-1) loops */
-//// "dec %[inputVal]\n" /* + (1) dec + (1) brne, last loop */
-//// "brne .L%=_nop_loop1\n" /* --> (N * 3) nops */
-//// nopManual(2) /* 23 % 3 manual nops */
-//// // save the data
-//// "lsl %[data]\n" // (1) left shift the current byte in %[data]
-//// "ld %[inputVal], %a[inPort]\n" // (2) read the pin (happens before the 2 cycles)
-//// "and %[inputVal], %[bitMask]\n" // (1) compare pinstate with bitmask
-//// "breq .L%=_check_bit_count\n" // (1/2) skip setting data to 1 if pin is low
-//// "sbr %[data],0x01\n" // set bit 1 in %[data] if pin is high
-//// ".L%=_check_bit_count:\n"
-//// "dec %[bitCount]\n" // (1) decrement 1 from our bit counter
-//// "brne .L%=_wait_for_high\n" // (1/2) branch if we've not received the whole byte
-////
-//// // we received a full byte
-//// "st %a[buff]+,%[data]\n" // (2) save %[data] back to memory and increment byte pointer
-//// "inc %[receivedBytes]\n" // (1) increase byte count
-//// "ldi %[bitCount],0x08\n" // (1) set bitcount to 8 bits again
-//// "cp %[len],%[receivedBytes]\n" // (1) %[len] == %[receivedBytes] ?
-//// "breq .L%=_exit\n" // (1/2) jump to exit if we received all bytes
-//// // dont wait for line to go high again
-////
-////
-//// // This next block waits for the line to go high again.
-//// // again, it sets a timeout counter of 64 iterations
-//// ".L%=_wait_for_high:\n"
-//// "ldi %[timeoutCount],%[timeout]\n" // (1) set the timeout
-//// ".L%=_wait_for_high_loop:\n" // 7 cycles if loop fails
-//// "ld %[inputVal], %a[inPort]\n" // (2) read the pin (happens before the 2 cycles)
-//// "and %[inputVal], %[bitMask]\n" // (1) compare pinstate with bitmask
-//// "brne .L%=_wait_for_low\n" // (1/2) line is high. ready for next loop
-//// // the following happens if the line is still low
-//// "dec %[timeoutCount]\n" // (1) decrease timeout by 1
-//// "brne .L%=_wait_for_high_loop\n" // (1/2) loop if the counter isn't 0
-//// // timeout, exit now
-//// ".L%=_exit:\n"
-////
-//// // ----------
-//// // outputs:
-//// : [receivedBytes] "=&d" (receivedBytes), // (ldi needs the upper registers)
-//// [buff] "+e" (buff), // (read and write)
-//// [bitCount] "=&d" (bitCount), // (output only, ldi needs the upper registers)
-//// [timeoutCount] "=&r" (timeoutCount), // (output only)
-//// [inputVal] "=&r" (inputVal), // (output only)
-//// [data] "=&r" (data) // (output only)
-////
-//// // inputs
-//// : [len] "r" (len),
-//// [inPort] "e" (inPort),
-//// [bitMask] "r" (bitMask),
-//// [timeout] "M" (NINTENDO_GAMECUBE_N64_TIMEOUT) // constant
-//// ); // end of asm volatile
-////
-//// return receivedBytes;
-////}
\ No newline at end of file
--- a/Nintendo.h Sun Dec 06 19:15:28 2015 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,160 +0,0 @@
-///*
-//Copyright (c) 2014-2015 NicoHood
-//See the readme for credit to other people.
-//
-//Permission is hereby granted, free of charge, to any person obtaining a copy
-//of this software and associated documentation files (the "Software"), to deal
-//in the Software without restriction, including without limitation the rights
-//to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-//copies of the Software, and to permit persons to whom the Software is
-//furnished to do so, subject to the following conditions:
-//
-//The above copyright notice and this permission notice shall be included in
-//all copies or substantial portions of the Software.
-//
-//THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-//IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-//FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-//AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-//LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-//OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-//THE SOFTWARE.
-//*/
-//
-//#ifndef NINTENDO_H
-//#define NINTENDO_H
-//
-//#include <stdint.h>
-//#include <mbed.h>
-////#include <Arduino.h>
-//
-////================================================================================
-//// Settings
-////================================================================================
-//
-//// timeout for the reading function for the pin to go low/high
-//#define NINTENDO_GAMECUBE_N64_TIMEOUT NINTENDO_GAMECUBE_N64_TIMEOUT_US(28)
-//
-////================================================================================
-//// Definitions
-////================================================================================
-//
-////#if (F_CPU != 16000000)
-////#error This library only supports 16MHz AVRs
-////#endif
-//
-//// timeout for the reading function for the pin to go low/high
-//#define NINTENDO_GAMECUBE_N64_TIMEOUT_US(uS) (uS * F_CPU / (1000000 * 7))
-//
-////================================================================================
-//// Gamecube
-////================================================================================
-//
-//// gamecube controller device status ids
-//#define NINTENDO_DEVICE_GC_WIRED 0x0900
-//
-//// dpad directions
-//#define NINTENDO_GAMECUBE_DPAD_CENTERED 0
-//#define NINTENDO_GAMECUBE_DPAD_UP (1 << 3)
-//#define NINTENDO_GAMECUBE_DPAD_UP_RIGHT (NINTENDO_GAMECUBE_DPAD_UP | NINTENDO_GAMECUBE_DPAD_RIGHT)
-//#define NINTENDO_GAMECUBE_DPAD_RIGHT (1 << 1)
-//#define NINTENDO_GAMECUBE_DPAD_DOWN_RIGHT (NINTENDO_GAMECUBE_DPAD_DOWN | NINTENDO_GAMECUBE_DPAD_RIGHT)
-//#define NINTENDO_GAMECUBE_DPAD_DOWN (1 << 2)
-//#define NINTENDO_GAMECUBE_DPAD_DOWN_LEFT (NINTENDO_GAMECUBE_DPAD_DOWN | NINTENDO_GAMECUBE_DPAD_LEFT)
-//#define NINTENDO_GAMECUBE_DPAD_LEFT (1 << 0)
-//#define NINTENDO_GAMECUBE_DPAD_UP_LEFT (NINTENDO_GAMECUBE_DPAD_UP | NINTENDO_GAMECUBE_DPAD_LEFT)
-//
-//typedef union{
-// // 8 bytes of datareport that we get from the controller
-// uint8_t whole8[];
-// uint16_t whole16[];
-// uint32_t whole32[];
-//
-// struct{
-// uint8_t buttons0;
-// union{
-// uint8_t buttons1;
-// uint8_t dpad : 4;
-// };
-// };
-//
-// struct {
-// // first data byte (bitfields are sorted in LSB order)
-// uint8_t a : 1;
-// uint8_t b : 1;
-// uint8_t x : 1;
-// uint8_t y : 1;
-// uint8_t start : 1;
-// uint8_t high0 : 1;
-// uint8_t errlatch : 1;
-// uint8_t errstat : 1;
-//
-// // second data byte
-// uint8_t dleft : 1;
-// uint8_t dright : 1;
-// uint8_t ddown : 1;
-// uint8_t dup : 1;
-// uint8_t z : 1;
-// uint8_t r : 1;
-// uint8_t l : 1;
-// uint8_t high1 : 1;
-//
-// // 3rd-8th data byte
-// uint8_t xAxis;
-// uint8_t yAxis;
-// uint8_t cxAxis;
-// uint8_t cyAxis;
-// uint8_t left;
-// uint8_t right;
-// };
-//} Gamecube_Data_t;
-//
-//typedef union{
-// // 3 bytes of statusreport that we get from the controller
-// uint8_t whole8[];
-// uint16_t whole16[];
-// struct {
-// // device information
-// uint16_t device;
-//
-// // controller status (only rumble is known)
-// uint8_t status0 : 3;
-// uint8_t rumble : 1;
-// uint8_t status1 : 4;
-// };
-//} Gamecube_Status_t;
-//
-//class Gamecube_{
-//public:
-// Gamecube_(void);
-// Gamecube_(PinName _data_line);
-//
-// bool begin(const uint8_t pin, Gamecube_Status_t &status);
-// bool begin(const uint8_t pin);
-//// bool end(const uint8_t pin);
-//// bool read(const uint8_t pin, Gamecube_Data_t &report, const bool rumble = false); // default no rumble
-//// inline void write(void){} // TODO
-// void gc_send(uint8_t* buff, uint8_t len);
-//
-//private:
-// DigitalInOut data_line;
-//};
-//
-//extern Gamecube_ Gamecube;
-////
-//////================================================================================
-////// Function prototypes
-//////================================================================================
-////
-//
-//// functions to communicate with the gc/n64 controller
-//void gc_send(uint8_t* buff, uint8_t len);
-//
-////void gc_send(uint8_t* buff, uint8_t len,
-//// volatile uint8_t* modePort, volatile uint8_t* outPort, uint8_t bitMask);
-////
-////uint8_t gc_get(uint8_t* buff, uint8_t len,
-//// volatile uint8_t* modePort, volatile uint8_t* outPort, volatile uint8_t * inPort, uint8_t bitMask);
-////
-////
-//#endif // include guard
\ No newline at end of file