cartreader/Cart_Reader
2021-05-26 17:07:26 +02:00
..
atoi32.cpp Corrected type 2021-02-07 23:07:02 -08:00
atoi32.h Implemented custom atoi methods, as the included one only has 16-bit precision 2021-02-07 20:34:39 -08:00
Cart_Reader.ino V6.2: Add option to manually config N64 repro 2021-05-26 16:29:57 +02:00
FLASH.ino Add option to force A23 to high while flashing HiROM repros 2021-05-12 17:42:49 +02:00
GB.ino Fix Ramtron GB Save read/write 2021-04-06 14:20:32 +02:00
GBA.ino V5.5: Reduce memory usage in Filebrowser 2020-10-28 18:44:13 +01:00
GBM.ino V5.5: Reduce memory usage in Filebrowser 2020-10-28 18:44:13 +01:00
GBSmart.ino V5.5: Reduce memory usage in Filebrowser 2020-10-28 18:44:13 +01:00
MD.ino Fix Megadrive Zero Wing (J) 2020-12-10 12:04:25 +01:00
N64.ino Add 64 byte write buffer for N64 repro 2021-05-26 17:07:26 +02:00
NES.ino V6.1: Add support for exFAT SD cards (>32GB) 2021-04-26 18:20:30 +02:00
NGP.ino add #ifdef enable_XXX check to each module 2020-07-05 00:07:14 +09:00
NP.ino Up version number and default to clock correction factor 0 2021-01-31 13:31:23 +01:00
options.h V6.0: Update SdFat to Version 2 2021-04-26 10:14:37 +02:00
PCE.ino V6.1: Add support for exFAT SD cards (>32GB) 2021-04-26 18:20:30 +02:00
README.md V5.5: Reduce memory usage in Filebrowser 2020-10-28 18:44:13 +01:00
SMS.ino SMS: add a strange checksum from The Pro Yakyuu '91 (Game Gear). 2021-04-11 00:21:08 +09:00
snes_clk.cpp Updated snes_clk for exFAT changes 2021-04-28 00:44:11 -07:00
snes_clk.h Updated snes_clk for exFAT changes 2021-04-28 00:44:11 -07:00
SNES.ino Add option to force A23 to high while flashing HiROM repros 2021-05-12 17:42:49 +02:00
SV.ino add #ifdef enable_XXX check to each module 2020-07-05 00:07:14 +09:00
WS.ino Add more developerId 2020-08-16 00:05:58 +08:00

This Arduino code is written by a beginner for beginners, therefore I tried to comment every line of code. To an experienced coder this probably will seem very wrong but it really helps if you're just starting out.

Every submodule has it's own setup_XX() function that configures the needed pins and a submenu that lets you choose what you want to do. The code directly addresses the pins via the DDR, PIN and PORT registers.
Please also refer to the pinout Excel sheet.

void setup_N64_Controller() {  
  // Output a low signal  
  PORTH &= ~(1 << 4);  
  // Set Controller Data Pin(PH4) to Input  
  DDRH &= ~(1 << 4);  
}  

Would be the same as this in a more traditional Arduino sketch:

int dataPin = 7;   

void setup(){    
  // Output a low signal   
  digitalWrite(dataPin, LOW);   
  // Set controller data pin to input  
  pinMode(dataPin, INPUT);  
}  

To preserve memory every string is saved into the flash of the Arduino, also called progmem. This is done by using the F() macro.

println_Msg(F("Press Button."));  

Also all the menus are stored in progmem and are only recalled to sram when needed.

// N64 controller menu items  
const char N64ContMenuItem1[] PROGMEM = "Test Controller";  
const char N64ContMenuItem2[] PROGMEM = "Read ControllerPak";  
const char N64ContMenuItem3[] PROGMEM = "Write ControllerPak";  
const char N64ContMenuItem4[] PROGMEM = "Reset";  
const char* const menuOptionsN64Controller[] PROGMEM = {N64ContMenuItem1, N64ContMenuItem2, N64ContMenuItem3, N64ContMenuItem4};  

In an effort to keep the codebase as portable as possible instead of using the functions supplied by the OLED library directly to print out text, auxiliary functions like println_Msg are being used. So if you want to change to another display library you don't need to change all the code but only the helper functions.

void print_Msg(long unsigned int message) {
  if (enable_OLED)
    display.print(message);
  if (enable_Serial)
    Serial.print(message);
}

For development purposes you can route all the text output to the Arduino's Serial Monitor instead of to the OLED screen. In this case you control the cart reader by typing numbers into the serial monitor corresponding to the action you want to perform. If you are asked to press the button just send a random number.

// Comment out to change to Serial Output
// be sure to change the Arduino Serial Monitor to no line ending
//#define enable_OLED

To compile and upload the code please have a look at this wiki article.

Needed libraries(already included in the portable Arduino IDE under Releases)

SD lib: https://github.com/greiman/SdFat
LCD lib: https://github.com/adafruit/Adafruit_SSD1306
GFX Lib: https://github.com/adafruit/Adafruit-GFX-Library
BusIO: https://github.com/adafruit/Adafruit_BusIO
RGB Tools lib: https://github.com/joushx/Arduino-RGB-Tools
SI5351 lib: https://github.com/etherkit/Si5351Arduino