Initial commit

This commit is contained in:
sanni 2016-07-04 13:21:34 +02:00
commit 6ab6e1caac
63 changed files with 74724 additions and 0 deletions

1105
Cart_Reader/Cart_Reader.ino Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,20 @@
#include <EEPROM.h>
#include <Arduino.h> // for type definitions
template <class T> int EEPROM_writeAnything(int ee, const T& value)
{
const byte* p = (const byte*)(const void*)&value;
unsigned int i;
for (i = 0; i < sizeof(value); i++)
EEPROM.write(ee++, *p++);
return i;
}
template <class T> int EEPROM_readAnything(int ee, T& value)
{
byte* p = (byte*)(void*)&value;
unsigned int i;
for (i = 0; i < sizeof(value); i++)
*p++ = EEPROM.read(ee++);
return i;
}

662
Cart_Reader/FLASH.ino Normal file
View File

@ -0,0 +1,662 @@
//******************************************
// FLASHROM
//******************************************
/******************************************
Variables
*****************************************/
// Flashrom
char flashid[5];
unsigned long flashSize;
byte flashromType;
byte secondID = 1;
unsigned long time;
unsigned long blank;
/******************************************
Menu
*****************************************/
// Flash menu items
const char flashMenuItem1[] PROGMEM = "Blankcheck";
const char flashMenuItem2[] PROGMEM = "Erase";
const char flashMenuItem3[] PROGMEM = "Read";
const char flashMenuItem4[] PROGMEM = "Write";
const char flashMenuItem5[] PROGMEM = "ID";
const char flashMenuItem6[] PROGMEM = "Print";
const char flashMenuItem7[] PROGMEM = "Reset";
const char* const menuOptionsFLASH[] PROGMEM = {flashMenuItem1, flashMenuItem2, flashMenuItem3, flashMenuItem4, flashMenuItem5, flashMenuItem6, flashMenuItem7};
void flashromMenu() {
// create menu with title and 7 options to choose from
unsigned char mainMenu;
// Copy menuOptions of of progmem
convertPgm(menuOptionsFLASH, 7);
mainMenu = question_box("Flashrom Writer", menuOptions, 7, 0);
// wait for user choice to come back from the question box menu
switch (mainMenu)
{
case 0:
display_Clear();
println_Msg(F("Blankcheck"));
display_Update();
time = millis();
if (flashromType == 1)
resetFlash29F032();
else
resetFlash29F1610();
blankcheck_Flash();
break;
case 1:
display_Clear();
println_Msg(F("Erasing Flashrom"));
println_Msg(F("Please wait..."));
display_Update();
time = millis();
if (flashromType == 1) {
eraseFlash29F032();
}
else {
eraseFlash29F1610();
delay(1000);
busyCheck29F1610();
}
println_Msg(F("Flashrom erased"));
display_Update();
if (flashromType == 1)
resetFlash29F032();
else
resetFlash29F1610();
break;
case 2:
time = millis();
if (flashromType == 1)
resetFlash29F032();
else
resetFlash29F1610();
readFlash();
break;
case 3:
filePath[0] = '\0';
sd.chdir("/");
fileBrowser("Select File");
display_Clear();
time = millis();
if (flashromType == 1)
writeFlash29F032();
else if (flashromType == 2)
writeFlash29F1610();
// Reset twice just to be sure
delay(1000);
if (flashromType == 1)
resetFlash29F032();
else
resetFlash29F1610();
delay(1000);
if (flashromType == 1)
resetFlash29F032();
else
resetFlash29F1610();
delay(1000);
verifyFlash();
break;
case 4:
time = 0;
display_Clear();
println_Msg(F("ID Flashrom"));
if (flashromType == 1)
idFlash29F032();
else
idFlash29F1610();
println_Msg(flashid);
display_Update();
if (flashromType == 1)
resetFlash29F032();
else
resetFlash29F1610();
break;
case 5:
time = 0;
display_Clear();
println_Msg(F("Print first 70Bytes"));
display_Update();
if (flashromType == 1)
resetFlash29F032();
else
resetFlash29F1610();
printFlash(70);
break;
case 6:
time = 0;
display_Clear();
display_Update();
if (flashromType == 1)
resetFlash29F032();
else
resetFlash29F1610();
delay(500);
asm volatile (" jmp 0");
break;
}
if (time != 0) {
print_Msg(F("Operation took : "));
print_Msg((millis() - time) / 1000, DEC);
println_Msg(F("s"));
display_Update();
}
print_Msg(F("Press Button..."));
display_Update();
wait();
}
/******************************************
Setup
*****************************************/
void setup_Flash() {
// Set Address Pins to Output
//A0-A7
DDRF = 0xFF;
//A8-A15
DDRK = 0xFF;
//A16-A23
DDRL = 0xFF;
// Set Control Pins to Output OE(PH1) WE(PH4) CE(PH6)
DDRH |= (1 << 1) | (1 << 4) | (1 << 6);
// Setting OE(PH1) WE(PH4) HIGH
PORTH |= (1 << 1) | (1 << 4);
// Setting CE(PH6) LOW
PORTH &= ~(1 << 6);
// Set Data Pins (D0-D7) to Input
DDRC = 0x00;
// Disable Internal Pullups
PORTC = 0x00;
// ID flash
idFlash29F032();
// Print start screen
idtheflash:
display_Clear();
display_Update();
println_Msg(F("Flashrom Writer 8bit"));
println_Msg(" ");
println_Msg(" ");
print_Msg(F("Flash ID: "));
println_Msg(flashid);
if (strcmp(flashid, "C2F1") == 0) {
println_Msg(F("MX29F1610 detected"));
flashSize = 2097152;
flashromType = 2;
}
else if (strcmp(flashid, "C2F9") == 0) {
println_Msg(F("MX29L3211 detected"));
println_Msg(F("ATTENTION 3.3V"));
flashSize = 4194304;
flashromType = 2;
}
else if (strcmp(flashid, "0141") == 0) {
println_Msg(F("AM29F032B"));
flashSize = 4194304;
flashromType = 1;
}
else if (strcmp(flashid, "01AD") == 0) {
println_Msg(F("AM29F016B"));
flashSize = 2097152;
flashromType = 1;
}
else if (strcmp(flashid, "04D4") == 0) {
println_Msg(F("MBM29F033C"));
flashSize = 4194304;
flashromType = 1;
}
else if (secondID) {
idFlash29F1610();
secondID = 0;
goto idtheflash;
}
else {
print_Error(F("Unknown flashrom"), true);
}
println_Msg(" ");
println_Msg(F("Press Button..."));
display_Update();
if (flashromType == 1)
resetFlash29F032();
else
resetFlash29F1610();
wait();
}
/******************************************
I/O Functions
*****************************************/
// Switch data pins to read
void dataIn_Flash() {
// Set to Input
DDRC = 0x00;
}
/******************************************
Low level functions
*****************************************/
void writeByte_Flash(unsigned long myAddress, byte myData) {
PORTF = myAddress & 0xFF;
PORTK = (myAddress >> 8) & 0xFF;
PORTL = (myAddress >> 16) & 0xFF;
PORTC = myData;
// Arduino running at 16Mhz -> one nop = 62.5ns
// Wait till output is stable
__asm__("nop\n\t");
// Switch WE(PH4) to LOW
PORTH &= ~(1 << 4);
// Leave WE low for at least 60ns
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
// Switch WE(PH4) to HIGH
PORTH |= (1 << 4);
// Leave WE high for at least 50ns
__asm__("nop\n\t");
}
byte readByte_Flash(unsigned long myAddress) {
PORTF = myAddress & 0xFF;
PORTK = (myAddress >> 8) & 0xFF;
PORTL = (myAddress >> 16) & 0xFF;
// Arduino running at 16Mhz -> one nop = 62.5ns
__asm__("nop\n\t");
// Setting OE(PH1) LOW
PORTH &= ~(1 << 1);
__asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");
// Read
byte tempByte = PINC;
// Setting OE(PH1) HIGH
PORTH |= (1 << 1);
__asm__("nop\n\t");
return tempByte;
}
/******************************************
29F032 flashrom functions
*****************************************/
void resetFlash29F032() {
// Set data pins to output
dataOut();
// Reset command sequence
writeByte_Flash(0x555, 0xf0);
// Set data pins to input again
dataIn_Flash();
}
void idFlash29F032() {
// Set data pins to output
dataOut();
// ID command sequence
writeByte_Flash(0x555, 0xaa);
writeByte_Flash(0x2aa, 0x55);
writeByte_Flash(0x555, 0x90);
// Set data pins to input again
dataIn_Flash();
// Read the two id bytes into a string
sprintf(flashid, "%02X%02X", readByte_Flash(0), readByte_Flash(1));
}
void eraseFlash29F032() {
// Set data pins to output
dataOut();
// Erase command sequence
writeByte_Flash(0x555, 0xaa);
writeByte_Flash(0x2aa, 0x55);
writeByte_Flash(0x555, 0x80);
writeByte_Flash(0x555, 0xaa);
writeByte_Flash(0x2aa, 0x55);
writeByte_Flash(0x555, 0x10);
// Set data pins to input again
dataIn_Flash();
// Read the status register
byte statusReg = readByte_Flash(0);
// After a completed erase D7 will output 1
while ((statusReg & 0x80) != 0x80) {
// Blink led
PORTB ^= (1 << 4);
delay(100);
// Update Status
statusReg = readByte_Flash(0);
}
}
void writeFlash29F032() {
// Create filepath
sprintf(filePath, "%s/%s", filePath, fileName);
print_Msg(F("Flashing file "));
print_Msg(filePath);
println_Msg(F("..."));
display_Update();
// Open file on sd card
if (myFile.open(filePath, O_READ)) {
// Set data pins to output
dataOut();
// Fill sdBuffer
for (unsigned long currByte = 0; currByte < flashSize; currByte += 512) {
myFile.read(sdBuffer, 512);
// Blink led
if (currByte % 2048 == 0)
PORTB ^= (1 << 4);
for (unsigned long c = 0; c < 512; c++) {
// Write command sequence
writeByte_Flash(0x555, 0xaa);
writeByte_Flash(0x2aa, 0x55);
writeByte_Flash(0x555, 0xa0);
// Write current byte
writeByte_Flash(currByte + c, sdBuffer[c]);
busyCheck29F032(sdBuffer[c]);
}
}
// Set data pins to input again
dataIn_Flash();
// Close the file:
myFile.close();
}
else {
println_Msg(F("Can't open file"));
display_Update();
}
}
void busyCheck29F032(byte c) {
// Set data pins to input
dataIn_Flash();
// Setting OE(PH1) CE(PH6)LOW
PORTH &= ~((1 << 1) | (1 << 6));
// Setting WE(PH4) HIGH
PORTH |= (1 << 4);
//When the Embedded Program algorithm is complete, the device outputs the datum programmed to D7
while ((PINC & 0x80) != (c & 0x80)) {}
// Set data pins to output
dataOut();
// Setting OE(PH1) HIGH
PORTH |= (1 << 1);
}
/******************************************
29F1610 flashrom functions
*****************************************/
void resetFlash29F1610() {
// Set data pins to output
dataOut();
// Reset command sequence
writeByte_Flash(0x5555 << 1, 0xaa);
writeByte_Flash(0x2aaa << 1, 0x55);
writeByte_Flash(0x5555 << 1, 0xf0);
// Set data pins to input again
dataIn_Flash();
}
void writeFlash29F1610() {
// Create filepath
sprintf(filePath, "%s/%s", filePath, fileName);
println_Msg(F("Flashing file "));
println_Msg(filePath);
display_Update();
// Open file on sd card
if (myFile.open(filePath, O_READ)) {
// Set data pins to output
dataOut();
for (unsigned long currByte = 0; currByte < flashSize; currByte += 128) {
// Fill SDBuffer with 1 page at a time then write it repeat until all bytes are written
myFile.read(sdBuffer, 128);
// Blink led
if (currByte % 3072 == 0)
PORTB ^= (1 << 4);
// Write command sequence
writeByte_Flash(0x5555 << 1, 0xaa);
writeByte_Flash(0x2aaa << 1, 0x55);
writeByte_Flash(0x5555 << 1, 0xa0);
// Write one full page at a time
for (byte c = 0; c < 128; c++) {
writeByte_Flash(currByte + c, sdBuffer[c]);
}
// Check if write is complete
delayMicroseconds(100);
busyCheck29F1610();
}
// Set data pins to input again
dataIn_Flash();
// Close the file:
myFile.close();
}
else {
println_Msg(F("Can't open file on SD"));
display_Update();
}
}
void idFlash29F1610() {
// Set data pins to output
dataOut();
// ID command sequence
writeByte_Flash(0x5555 << 1, 0xaa);
writeByte_Flash(0x2aaa << 1, 0x55);
writeByte_Flash(0x5555 << 1, 0x90);
// Set data pins to input again
dataIn_Flash();
// Read the two id bytes into a string
sprintf(flashid, "%02X%02X", readByte_Flash(0), readByte_Flash(2));
}
byte readStatusReg() {
// Set data pins to output
dataOut();
// Status reg command sequence
writeByte_Flash(0x5555 << 1, 0xaa);
writeByte_Flash(0x2aaa << 1, 0x55);
writeByte_Flash(0x5555 << 1, 0x70);
// Set data pins to input again
dataIn_Flash();
// Read the status register
byte statusReg = readByte_Flash(0);
return statusReg;
}
void eraseFlash29F1610() {
// Set data pins to output
dataOut();
// Erase command sequence
writeByte_Flash(0x5555 << 1, 0xaa);
writeByte_Flash(0x2aaa << 1, 0x55);
writeByte_Flash(0x5555 << 1, 0x80);
writeByte_Flash(0x5555 << 1, 0xaa);
writeByte_Flash(0x2aaa << 1, 0x55);
writeByte_Flash(0x5555 << 1, 0x10);
// Set data pins to input again
dataIn_Flash();
}
// Delay between write operations based on status register
void busyCheck29F1610() {
// Set data pins to input
dataIn_Flash();
// Read the status register
byte statusReg = readByte_Flash(0);
while ((statusReg & 0x80) != 0x80) {
statusReg = readByte_Flash(0);
}
// Set data pins to output
dataOut();
}
/******************************************
Common flashrom functions
*****************************************/
void blankcheck_Flash() {
println_Msg(F("Please wait..."));
display_Update();
blank = 1;
for (unsigned long currByte = 0; currByte < flashSize; currByte++) {
// Check if all bytes are 0xFF
if (readByte_Flash(currByte) != 0xFF) {
currByte = flashSize;
blank = 0;
}
}
if (blank) {
println_Msg(F("Flashrom is empty"));
display_Update();
}
else {
print_Error(F("Error: Not blank"), false);
}
}
void verifyFlash() {
println_Msg(F("Verifying against"));
println_Msg(filePath);
display_Update();
// Open file on sd card
if (myFile.open(filePath, O_READ)) {
blank = 0;
for (unsigned long currByte = 0; currByte < flashSize; currByte += 512) {
//fill SDBuffer
myFile.read(sdBuffer, 512);
for (unsigned long c = 0; c < 512; c++) {
if (readByte_Flash(currByte + c) != sdBuffer[c]) {
blank++;
}
}
}
if (blank == 0) {
println_Msg(F("Flashrom verified OK"));
display_Update();
}
else {
print_Msg(F("Error: "));
print_Msg(blank);
println_Msg(F(" bytes "));
print_Error(F("did not verify."), false);
}
// Close the file:
myFile.close();
}
else {
println_Msg(F("Can't open file on SD"));
display_Update();
}
}
void readFlash() {
// Reset to root directory
sd.chdir("/");
// Get name, add extension and convert to char array for sd lib
EEPROM_readAnything(0, foldern);
sd.mkdir("FLASH", true);
sd.chdir("FLASH");
sprintf(fileName, "FL%d", foldern);
strcat(fileName, ".bin");
// write new folder number back to eeprom
foldern = foldern + 1;
EEPROM_writeAnything(0, foldern);
display_Clear();
print_Msg(F("Saving as "));
print_Msg(fileName);
println_Msg(F("..."));
display_Update();
// Open file on sd card
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
print_Error(F("Can't create file on SD"), true);
}
for (unsigned long currByte = 0; currByte < flashSize; currByte += 512) {
for (unsigned long c = 0; c < 512; c++) {
sdBuffer[c] = readByte_Flash(currByte + c);
}
myFile.write(sdBuffer, 512);
}
// Close the file:
myFile.close();
println_Msg(F("Finished reading"));
display_Update();
}
void printFlash(int numBytes) {
char myBuffer[3];
for (int currByte = 0; currByte < numBytes; currByte += 10) {
for (int c = 0; c < 10; c++) {
itoa (readByte_Flash(currByte + c), myBuffer, 16);
for (int i = 0; i < 2 - strlen(myBuffer); i++) {
print_Msg("0");
}
// Now print the significant bits
print_Msg(myBuffer);
}
println_Msg("");
}
display_Update();
}
//******************************************
// End of File
//******************************************

25
Cart_Reader/GB.ino Normal file
View File

@ -0,0 +1,25 @@
//******************************************
// GAMEBOY
//******************************************
/******************************************
Menu
*****************************************/
void gbMenu() {
println_Msg(F("WORK IN PROGRESS"));
println_Msg(F("Press Button..."));
display_Update();
wait();
asm volatile (" jmp 0");
}
/******************************************
Setup
*****************************************/
void setup_GB() {
}
//******************************************
// End of File
//******************************************

2067
Cart_Reader/N64.ino Normal file

File diff suppressed because it is too large Load Diff

1439
Cart_Reader/NP.ino Normal file

File diff suppressed because it is too large Load Diff

2
Cart_Reader/README.md Normal file
View File

@ -0,0 +1,2 @@
Double click on Cart_Reader.ino to open the program in the Arduino IDE.
And don't forget to copy the files from the sd folder to the root of your sd card.

1121
Cart_Reader/SNS.ino Normal file

File diff suppressed because it is too large Load Diff

39
README.md Normal file
View File

@ -0,0 +1,39 @@
# Cartridge Reader for Arduino Mega2560
![cartreaderpcb](https://dl.dropboxusercontent.com/u/20912715/snes/Snes_Cart_Reader_Mega_Shield/cartreader_n642.jpg)
####Features:
- Reads SNES roms and reads/writes save games from and to the SNES cartridge
Supported cartridge types so far: LoRom, HiRom, ExHiRom, SuperFX, SuperFX2, SA1(can't write save back to SA1)
- Read and writes SFC Nintendo Power Cartridges
- Reads N64 roms and reads/writes save games(4K/16K Eeprom + Sram + Flashram)
- Reads and writes N64 controller paks and also can test a N64 controller
- Programs Flashroms like 29F016, 29F032, 29F033, 29F1610 and 29L3211(needs 3.3V).
![cartreaderpcb](http://dl.dropboxusercontent.com/u/20912715/snes/Snes_Cart_Reader_Mega_Shield/cartreader_flash.jpg)
####Be sure to check the guides in the wiki too.
[![](http://dl.dropboxusercontent.com/u/20912715/video1.jpg)](https://www.youtube.com/watch?v=YGsC28IBr2A)
####Thanks to:
MichlK - ROM-Reader for Super Nintendo
Jeff Saltzman - 4-Way Button
Wayne and Layne - Video-Game-Shield menu
skaman - SNES enhancements
nocash - Nintendo Power commands
crazynation - N64 bus timing
hkz/themanbehindthecurtain - N64 flashram commands
jago85 - help with N64 stuff
Andrew Brown/Peter Den Hartog - N64 controller protocol
bryc - mempak
Shaun Taylor - N64 controller CRC functions
Angus Gratton - CRC32
Tamanegi_taro - SA1 fix
Snes9x - SuperFX Sram Fix
![cartreaderpcb](http://dl.dropboxusercontent.com/u/20912715/snes/Snes_Cart_Reader_Mega_Shield/cartreader_np.jpg)
####Please join the discussion at: http://forum.arduino.cc/index.php?topic=158974.0
![cartreaderpcb](http://dl.dropboxusercontent.com/u/20912715/snes/Snes_Cart_Reader_Mega_Shield/cartreader_stuff.jpg)

1
extras/README.md Normal file
View File

@ -0,0 +1 @@
Here you will find additional stuff for your cart reader shield.

View File

@ -0,0 +1,812 @@
/**********************************************************************************
Nintendo 64 Controller Test for Arduino Mega
Author: sanni
Date: 2016-04-15
Version: V2
OLED lib: http://www.rinkydinkelectronics.com/library.php?id=79
Thanks to:
Andrew Brown/Peter Den Hartog - N64 send/get functions
**********************************************************************************/
#include <OLED_I2C.h>
extern uint8_t SmallFont[];
// define LCD pins
OLED myOLED(SDA, SCL, 8);
//define LED pin
int ledPin = 10;
// These two macros toggle the eepDataPin/ControllerDataPin between input and output
// External 1K pull-up resistor from eepDataPin to VCC required
// 0x10 = 00010000 -> Port H Pin 4
#define N64_HIGH DDRH &= ~0x10
#define N64_LOW DDRH |= 0x10
// Read the current state(0/1) of the eepDataPin
#define N64_QUERY (PINH & 0x10)
// received Controller data
char N64_raw_dump[33]; // 1 received bit per byte
String rawStr = ""; // above char array read into a string
struct {
char stick_x;
char stick_y;
}
N64_status;
// on which screens do we start
int startscreen = 0;
int mode = 0;
int test = 1;
//stings that hold the buttons
String button = "N/A";
String lastbutton = "N/A";
//name of the current displayed result
String anastick = "";
// Graph
int xax = 22 + 24; // midpoint x
int yax = 24; // midpoint y
int zax = 24; // size
// variables to display test data of different sticks
int upx = 0;
int upy = 0;
int uprightx = 0;
int uprighty = 0;
int rightx = 0;
int righty = 0;
int downrightx = 0;
int downrighty = 0;
int downx = 0;
int downy = 0;
int downleftx = 0;
int downlefty = 0;
int leftx = 0;
int lefty = 0;
int upleftx = 0;
int uplefty = 0;
// variables to save test data
int bupx = 0;
int bupy = 0;
int buprightx = 0;
int buprighty = 0;
int brightx = 0;
int brighty = 0;
int bdownrightx = 0;
int bdownrighty = 0;
int bdownx = 0;
int bdowny = 0;
int bdownleftx = 0;
int bdownlefty = 0;
int bleftx = 0;
int blefty = 0;
int bupleftx = 0;
int buplefty = 0;
int results = 0;
void N64_send(unsigned char *buffer, char length);
void N64_get();
void setup()
{
// Communication with controller on this pin
// Don't remove these lines, we don't want to push +5V to the controller
// Output a low signal
PORTH &= ~(1 << 4);
// Set Controller Data Pin(PH4) to Input
DDRH &= ~(1 << 4);
// Led
pinMode(ledPin, OUTPUT);
// OLED
myOLED.begin();
myOLED.setFont(SmallFont);
}
// This sends the given byte sequence to the controller
// length must be at least 1
// Oh, it destroys the buffer passed in as it writes it
void N64_send(unsigned char *buffer, char length)
{
// Send these bytes
char bits;
bool bit;
// This routine is very carefully timed by examining the assembly output.
// Do not change any statements, it could throw the timings off
//
// We get 16 cycles per microsecond, which should be plenty, but we need to
// be conservative. Most assembly ops take 1 cycle, but a few take 2
//
// I use manually constructed for-loops out of gotos so I have more control
// over the outputted assembly. I can insert nops where it was impossible
// with a for loop
asm volatile (";Starting outer for loop");
outer_loop:
{
asm volatile (";Starting inner for loop");
bits = 8;
inner_loop:
{
// Starting a bit, set the line low
asm volatile (";Setting line to low");
N64_LOW; // 1 op, 2 cycles
asm volatile (";branching");
if (*buffer >> 7) {
asm volatile (";Bit is a 1");
// 1 bit
// remain low for 1us, then go high for 3us
// nop block 1
asm volatile ("nop\nnop\nnop\nnop\nnop\n");
asm volatile (";Setting line to high");
N64_HIGH;
// nop block 2
// we'll wait only 2us to sync up with both conditions
// at the bottom of the if statement
asm volatile ("nop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\n"
);
}
else {
asm volatile (";Bit is a 0");
// 0 bit
// remain low for 3us, then go high for 1us
// nop block 3
asm volatile ("nop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\n"
"nop\n");
asm volatile (";Setting line to high");
N64_HIGH;
// wait for 1us
asm volatile ("; end of conditional branch, need to wait 1us more before next bit");
}
// end of the if, the line is high and needs to remain
// high for exactly 16 more cycles, regardless of the previous
// branch path
asm volatile (";finishing inner loop body");
--bits;
if (bits != 0) {
// nop block 4
// this block is why a for loop was impossible
asm volatile ("nop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\n");
// rotate bits
asm volatile (";rotating out bits");
*buffer <<= 1;
goto inner_loop;
} // fall out of inner loop
}
asm volatile (";continuing outer loop");
// In this case: the inner loop exits and the outer loop iterates,
// there are /exactly/ 16 cycles taken up by the necessary operations.
// So no nops are needed here (that was lucky!)
--length;
if (length != 0) {
++buffer;
goto outer_loop;
} // fall out of outer loop
}
// send a single stop (1) bit
// nop block 5
asm volatile ("nop\nnop\nnop\nnop\n");
N64_LOW;
// wait 1 us, 16 cycles, then raise the line
// 16-2=14
// nop block 6
asm volatile ("nop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\n");
N64_HIGH;
}
void N64_get()
{
// listen for the expected 8 bytes of data back from the controller and
// blast it out to the N64_raw_dump array, one bit per byte for extra speed.
// Afterwards, call translate_raw_data() to interpret the raw data and pack
// it into the N64_status struct.
asm volatile (";Starting to listen");
unsigned char timeout;
char bitcount = 32;
char *bitbin = N64_raw_dump;
// Again, using gotos here to make the assembly more predictable and
// optimization easier (please don't kill me)
read_loop:
timeout = 0x3f;
// wait for line to go low
while (N64_QUERY) {
if (!--timeout)
return;
}
// wait approx 2us and poll the line
asm volatile (
"nop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\n"
"nop\nnop\nnop\nnop\nnop\n"
);
*bitbin = N64_QUERY;
++bitbin;
--bitcount;
if (bitcount == 0)
return;
// wait for line to go high again
// it may already be high, so this should just drop through
timeout = 0x3f;
while (!N64_QUERY) {
if (!--timeout)
return;
}
goto read_loop;
}
void get_button()
{
// Command to send to the gamecube
// The last bit is rumble, flip it to rumble
// yes this does need to be inside the loop, the
// array gets mutilated when it goes through N64_send
unsigned char command[] = {
0x01
};
// don't want interrupts getting in the way
noInterrupts();
// send those 3 bytes
N64_send(command, 1);
// read in data and dump it to N64_raw_dump
N64_get();
// end of time sensitive code
interrupts();
// The get_N64_status function sloppily dumps its data 1 bit per byte
// into the get_status_extended char array. It's our job to go through
// that and put each piece neatly into the struct N64_status
int i;
memset(&N64_status, 0, sizeof(N64_status));
// bits: joystick x value
// These are 8 bit values centered at 0x80 (128)
for (i = 0; i < 8; i++) {
N64_status.stick_x |= N64_raw_dump[16 + i] ? (0x80 >> i) : 0;
}
for (i = 0; i < 8; i++) {
N64_status.stick_y |= N64_raw_dump[24 + i] ? (0x80 >> i) : 0;
}
// read char array N64_raw_dump into string rawStr
rawStr = "";
for (i = 0; i < 16; i++) {
rawStr = rawStr + String(N64_raw_dump[i], DEC);
}
// Buttons (A,B,Z,S,DU,DD,DL,DR,0,0,L,R,CU,CD,CL,CR)
if (rawStr.substring(0, 16) == "0000000000000000") {
lastbutton = button;
button = "Press a button";
digitalWrite(ledPin, LOW);
}
else
{
digitalWrite(ledPin, HIGH);
for (int i = 0; i < 16; i++)
{
// seems to be 16, 8 or 4 depending on what pin is used
if (N64_raw_dump[i] == 16)
{
switch (i)
{
case 7:
button = "D-Right";
break;
case 6:
button = "D-Left";
break;
case 5:
button = "D-Down";
break;
case 4:
button = "D-Up";
break;
case 3:
button = "START";
break;
case 2:
button = "Z";
break;
case 1:
button = "B";
break;
case 0:
button = "A";
break;
case 15:
button = "C-Right";
break;
case 14:
button = "C-Left";
break;
case 13:
button = "C-Down";
break;
case 12:
button = "C-Up";
break;
case 11:
button = "R";
break;
case 10:
button = "L";
break;
}
}
}
}
}
void printSTR(String st, int x, int y)
{
char buf[st.length() + 1];
st.toCharArray(buf, st.length() + 1);
myOLED.print(buf, x, y);
}
void nextscreen()
{
if (button == "Press a button" && lastbutton == "START")
{
// reset button
lastbutton = "N/A";
myOLED.clrScr();
if (startscreen != 4)
startscreen = startscreen + 1;
else
{
startscreen = 1;
test = 1;
}
}
}
void loop()
{
// Get Button and analog stick
get_button();
switch (startscreen)
{
case 0: // Logo Screen
{
myOLED.print("ControllerTest", CENTER, 8);
myOLED.print("V1.0", CENTER, 18);
myOLED.drawLine(22 + 0, 28, 22 + 84, 28);
myOLED.print("2013 sanni", CENTER, 32);
myOLED.update();
delay(1500);
startscreen = 1;
myOLED.clrScr();
break;
}
case 1:
{
myOLED.print("Button Test", CENTER, 0);
myOLED.drawLine(22 + 0, 10, 22 + 84, 10);
// Print Button
printSTR(" " + button + " ", CENTER, 20);
// Print Stick X Value
String stickx = String("X: " + String(N64_status.stick_x, DEC) + " ");
printSTR(stickx, 22 + 0, 38);
// Print Stick Y Value
String sticky = String("Y: " + String(N64_status.stick_y, DEC) + " ");
printSTR(sticky, 22 + 42, 38);
//Update LCD
myOLED.update();
// go to next screen
nextscreen();
break;
}
case 2:
{
myOLED.print("Range", 22 + 52, 5);
myOLED.print("Test", 22 + 52, 15);
myOLED.drawRect(22 + 50, 0, 22 + 83, 25);
// Print Stick X Value
String stickx = String("X:" + String(N64_status.stick_x, DEC) + " ");
printSTR(stickx, 22 + 50, 28);
// Print Stick Y Value
String sticky = String("Y:" + String(N64_status.stick_y, DEC) + " ");
printSTR(sticky, 22 + 50, 38);
// Draw Axis
myOLED.drawLine(xax - zax, yax, xax + zax, yax);
myOLED.drawLine(xax, yax - zax, xax, yax + zax);
myOLED.clrPixel(xax, yax - 80 / 4);
myOLED.clrPixel(xax, yax + 80 / 4);
myOLED.clrPixel(xax + 80 / 4, yax);
myOLED.clrPixel(xax - 80 / 4, yax);
//Draw Analog Stick
if (mode == 1)
{
myOLED.setPixel(xax + N64_status.stick_x / 4, yax - N64_status.stick_y / 4);
//Update LCD
myOLED.update();
}
else
{
myOLED.drawCircle(xax + N64_status.stick_x / 4, yax - N64_status.stick_y / 4, 2);
//Update LCD
myOLED.update();
myOLED.clrScr();
}
// switch mode
if (button == "Press a button" && lastbutton == "Z")
{
if (mode == 0)
{
mode = 1;
myOLED.clrScr();
}
else
{
mode = 0;
myOLED.clrScr();
}
}
// go to next screen
nextscreen();
break;
}
case 3:
{
myOLED.print("Skipping Test", CENTER, 0);
myOLED.drawLine(22 + 0, 10, 22 + 83, 10);
myOLED.drawRect(22 + 0, 20, 22 + 83, 44);
if (N64_status.stick_x > 0)
myOLED.drawLine(22 + N64_status.stick_x, 20, 22 + N64_status.stick_x, 44);
//Update LCD
myOLED.update();
if (button == "Press a button" && lastbutton == "Z")
{
// reset button
lastbutton = "N/A";
myOLED.clrScr();
}
// go to next screen
nextscreen();
break;
}
case 4:
{
switch ( test )
{
case 0: // Display results
{
switch (results)
{
case 0:
{
anastick = "YOURS";
upx = bupx;
upy = bupy;
uprightx = buprightx;
uprighty = buprighty;
rightx = brightx;
righty = brighty;
downrightx = bdownrightx;
downrighty = bdownrighty;
downx = bdownx;
downy = bdowny;
downleftx = bdownleftx;
downlefty = bdownlefty;
leftx = bleftx;
lefty = blefty;
upleftx = bupleftx;
uplefty = buplefty;
if (button == "Press a button" && lastbutton == "A")
{
// reset button
lastbutton = "N/A";
results = 1;
}
break;
}
case 1:
{
anastick = "ORIG";
upx = 1;
upy = 84;
uprightx = 67;
uprighty = 68;
rightx = 83;
righty = -2;
downrightx = 67;
downrighty = -69;
downx = 3;
downy = -85;
downleftx = -69;
downlefty = -70;
leftx = -85;
lefty = 0;
upleftx = -68;
uplefty = 68;
if (button == "Press a button" && lastbutton == "A")
{
// reset button
lastbutton = "N/A";
results = 0;
}
break;
}
} //results
myOLED.clrScr();
printSTR(anastick, 22 + 50, 0);
myOLED.print("U:", 22 + 50, 10);
myOLED.printNumI(upy, RIGHT, 10);
myOLED.print("D:", 22 + 50, 20);
myOLED.printNumI(downy, RIGHT, 20);
myOLED.print("L:", 22 + 50, 30);
myOLED.printNumI(leftx, RIGHT, 30);
myOLED.print("R:", 22 + 50, 40);
myOLED.printNumI(rightx, RIGHT, 40);
myOLED.drawLine(xax + upx / 4, yax - upy / 4, xax + uprightx / 4, yax - uprighty / 4);
myOLED.drawLine(xax + uprightx / 4, yax - uprighty / 4, xax + rightx / 4, yax - righty / 4);
myOLED.drawLine(xax + rightx / 4, yax - righty / 4, xax + downrightx / 4, yax - downrighty / 4);
myOLED.drawLine(xax + downrightx / 4, yax - downrighty / 4, xax + downx / 4, yax - downy / 4);
myOLED.drawLine(xax + downx / 4, yax - downy / 4, xax + downleftx / 4, yax - downlefty / 4);
myOLED.drawLine(xax + downleftx / 4, yax - downlefty / 4, xax + leftx / 4, yax - lefty / 4);
myOLED.drawLine(xax + leftx / 4, yax - lefty / 4, xax + upleftx / 4, yax - uplefty / 4);
myOLED.drawLine(xax + upleftx / 4, yax - uplefty / 4, xax + upx / 4, yax - upy / 4);
myOLED.setPixel(xax, yax);
//Update LCD
myOLED.update();
break;
} //display results
case 1:// +y Up
{
myOLED.print("Hold Stick Up", CENTER, 18);
myOLED.print("then press A", CENTER, 28);
//myOLED.drawBitmap(110, 60, ana1);
if (button == "Press a button" && lastbutton == "A")
{
bupx = N64_status.stick_x;
bupy = N64_status.stick_y;
// reset button
lastbutton = "N/A";
myOLED.clrScr();
test = 2;
}
break;
}
case 2:// +y+x Up-Right
{
myOLED.print("Up-Right", CENTER, 22 );
//myOLED.drawBitmap(110, 60, ana2);
if (button == "Press a button" && lastbutton == "A")
{
buprightx = N64_status.stick_x;
buprighty = N64_status.stick_y;
test = 3;
// reset button
lastbutton = "N/A";
myOLED.clrScr();
}
break;
}
case 3:// +x Right
{
myOLED.print("Right", CENTER, 22 );
//myOLED.drawBitmap(110, 60, ana3);
if (button == "Press a button" && lastbutton == "A")
{
brightx = N64_status.stick_x;
brighty = N64_status.stick_y;
test = 4;
// reset button
lastbutton = "N/A";
myOLED.clrScr();
}
break;
}
case 4:// -y+x Down-Right
{
myOLED.print("Down-Right", CENTER, 22 );
//myOLED.drawBitmap(110, 60, ana4);
if (button == "Press a button" && lastbutton == "A")
{
bdownrightx = N64_status.stick_x;
bdownrighty = N64_status.stick_y;
test = 5;
// reset button
lastbutton = "N/A";
myOLED.clrScr();
}
break;
}
case 5:// -y Down
{
myOLED.print("Down", CENTER, 22 );
//myOLED.drawBitmap(110, 60, ana5);
if (button == "Press a button" && lastbutton == "A")
{
bdownx = N64_status.stick_x;
bdowny = N64_status.stick_y;
test = 6;
// reset button
lastbutton = "N/A";
myOLED.clrScr();
}
break;
}
case 6:// -y-x Down-Left
{
myOLED.print("Down-Left", CENTER, 22 );
//myOLED.drawBitmap(110, 60, ana6);
if (button == "Press a button" && lastbutton == "A")
{
bdownleftx = N64_status.stick_x;
bdownlefty = N64_status.stick_y;
test = 7;
// reset button
lastbutton = "N/A";
myOLED.clrScr();
}
break;
}
case 7:// -x Left
{
myOLED.print("Left", CENTER, 22 );
//myOLED.drawBitmap(110, 60, ana7);
if (button == "Press a button" && lastbutton == "A")
{
bleftx = N64_status.stick_x;
blefty = N64_status.stick_y;
test = 8;
// reset button
lastbutton = "N/A";
myOLED.clrScr();
}
break;
}
case 8:// +y+x Up-Left
{
myOLED.print("Up-Left", CENTER, 22);
//myOLED.drawBitmap(110, 60, ana8);
if (button == "Press a button" && lastbutton == "A")
{
bupleftx = N64_status.stick_x;
buplefty = N64_status.stick_y;
test = 0;
// reset button
lastbutton = "N/A";
myOLED.clrScr();
}
break;
}
}
if (test != 0)
{
myOLED.print("Benchmark", CENTER, 0);
myOLED.drawLine(22 + 0, 9, 22 + 83, 9);
}
myOLED.update();
// go to next screen
nextscreen();
break;
}
}
}

View File

@ -0,0 +1,2 @@
This is my portable N64 Controller Tester edited to run on the Cart Reader Shield.
The N64 controller's data line is connected to Arduino Mega Pin 7.

Binary file not shown.

View File

@ -0,0 +1,4 @@
Unzip and copy those into your Arduino library folder e.g. C:\Users\sanni\Documents\Arduino\libraries
You can also get the latest versions from their creators page:
Oled lib: http://www.rinkydinkelectronics.com/library.php?id=79

BIN
extras/drivers/CH341SER.ZIP Normal file

Binary file not shown.

1
extras/drivers/README.md Normal file
View File

@ -0,0 +1 @@
If you have an Arduino with CH341 USB to Serial Chip then you need to install these additional drivers.

2
extras/npsplit/README.md Normal file
View File

@ -0,0 +1,2 @@
You can use this little program to split a 4MB Nintendo Power dump into the individual roms.
Get the Java Runtimes from here in case you need them: http://www.java.com/en/download/manual.jsp

BIN
extras/npsplit/npsplit.exe Normal file

Binary file not shown.

149
extras/npsplit/npsplit.pde Normal file
View File

@ -0,0 +1,149 @@
/**********************************************************************************
Nintendo Power Splitter
Author: sanni
Date: 2016-05-02
Version: V1
Compiled with Processing 3.0.2
**********************************************************************************/
/******************************************
Variables
*****************************************/
// Define 4MB byte array that stores the file
byte[] NP = new byte[4194303];
// Define 12 byte array to store menu string
byte menuString[] = {0x4D, 0x45, 0x4E, 0x55, 0x20, 0x50, 0x52, 0x4F, 0x47, 0x52, 0x41, 0x4D};
// Menu variables
boolean npMenu = true;
byte numGames = 0;
// rom info arrays
char[][] romName = new char[8][21];
int[] romAddress = new int[8];
int[] romSize = new int[8];
char[][] romCode = new char[8][12];
boolean[] hirom = new boolean[8];
/******************************************
Setup
*****************************************/
void setup() {
// Make 500x300 pixel window with black background
size(500, 300);
background(0);
NP[4194302] = 0x66;
// Write title
text("Nintendo Power Splitter V1", 20, 20);
// File open dialog
selectInput("Select 4MB NP dump:", "fileSelected");
noLoop();
}
/******************************************
Helper Functions
*****************************************/
// Loads selected file into byte array
void fileSelected(File selection) {
if (selection != null)
NP = loadBytes(selection);
}
/******************************************
Main function
*****************************************/
void draw() {
// Wait until array is filled with the 4MB file
while (NP[4194302] == 0x66) {
delay(200);
}
// Check if menu is present
for (int i = 0; i < 12; i++) {
if (menuString[i] != NP[0x7FC0+i]) {
npMenu = false;
}
}
if (npMenu) {
// Count number of games
for (int i = 0x60000; i < 0x6E000; i += 0x2000) {
if (NP[i] == numGames )
numGames++;
}
text("Number of games: " + (numGames), 20, 60);
// Get game info
for (int i = 0; i < numGames; i++) {
// Read starting address and size
romAddress[i] = NP[0x60000 + i*0x2000 + 0x01] * 0x80000;
romSize[i] = NP[0x60000 + i*0x2000 + 0x03] * 131072;
// Read game code
for (int j = 0; j < 12; j++) {
romCode[i][j] = char(NP[0x60000 + i*0x2000 + 0x07 + j]);
}
//check if hirom
if (NP[romAddress[i]+0xFFD5] == 0x31) {
hirom[i] = true;
} else {
hirom[i] = false;
}
// Read rom name
for (int j = 0; j < 21; j++) {
if (hirom[i]) {
romName[i][j] = char(NP[romAddress[i]+0xFFC0+j]);
} else {
romName[i][j] = char(NP[romAddress[i]+0x7FC0+j]);
}
}
// Convert char array to String to be printed
String tempStr1 = new String(romName[i]);
// Convert char array to String to be printed
String tempStr2 = new String(romCode[i]);
// Clean the Strings
tempStr1 = tempStr1.trim();
tempStr1 = tempStr1.replaceAll("-$", "");
tempStr1 = tempStr1.trim();
tempStr2 = tempStr2.trim();
tempStr2 = tempStr2.replaceAll("-$", "");
tempStr2 = tempStr2.trim();
// Print all info
text("Game" + i + ": " + tempStr1 + " " + tempStr2 + " Addr: 0x" + hex(romAddress[i]) + " Size: " + romSize[i]/1024 + "KB", 20, 80+i*20);
}
// Split the rom
for (int i = 0; i < numGames; i++) {
byte[] OUT = new byte[romSize[i]];
String fileName = new String(romCode[i]);
// Clean the String
fileName = fileName.trim();
fileName = fileName.replaceAll("-$", "");
fileName = fileName.trim();
// Create the array to be written to a file
for (int j = 0; j < romSize[i]; j++) {
OUT[j] = NP[romAddress[i] + j];
}
// Write the file
saveBytes(fileName + ".bin", OUT);
}
} else {
text("NP menu not found.", 20, 60);
}
}
//******************************************
// End of File
//******************************************

Binary file not shown.

View File

@ -0,0 +1,2 @@
Saveswap Tool made by saturnu
Source: http://krikzz.com/forum/index.php?topic=2298.0

View File

@ -0,0 +1,19 @@
Hi,
here is a tool that helps you converting save files from an emulator to the ED64.
it's like always ^^ just a beta version and needs some testing :D
Howto:
after executing, select the save file. now select the filesize to what the file should be extended.
select the needed swapping options and click on "convert file".
Rename the file to your rom-filename except the file-extension.
Hint:
In the most cases you will be fine with the default settings. If it's not working, create a new save-file with the ED64 and compare it with a hexeditor to your converting results, if it somehow matches. ^^
Make sure you use exactly the same rom on the everdrive64 and your emulator.
you can take a look at this boot/save list for the correct save settings.
Features:
byte-swap
word-swap
byte appending
save backup (*.bak)

Binary file not shown.

View File

@ -0,0 +1,2 @@
A 3d model of the cart reader shield build in Sketchup.
It's not perfectly to scale and more of a mockup.

Binary file not shown.

2
extras/snesCIC/README.md Normal file
View File

@ -0,0 +1,2 @@
This is the hex file that needs to be flashed to the PIC 12F629 if you want to dump SA1 SNES games.
Source: https://github.com/mrehkopf/sd2snes/tree/master/cic

View File

@ -0,0 +1,71 @@
:020000040000FA
:1000000000000000000010280510851005110512E1
:1000100085190828000000000000000000002028CA
:10002000831285010730990000308B008316293038
:10003000850000309500803081008312051204286D
:100040004030FC2105160515C4010000051183167A
:100050000510851483120B30A1000130A20004307A
:10006000A3000F30A4000430A5000B30A60005301B
:10007000A7000730A8000F30A9000D30AA000630F5
:10008000AB000130AC000E30AD000930AE000830DE
:10009000AF000F30B1000030B2000A30B3000130C1
:1000A000B4000830B5000530B6000F30B70001309D
:1000B000B800B9000E30BA000130BB000030BC00FF
:1000C0000D30BD000E30BE000C30BF00BA30F8213C
:1000D00000000000B11905140000000005100130F7
:1000E000F821000000003118051400000000051080
:1000F0000130F82100000000B118051400000000D4
:1001000005100130F821000000003119051400002D
:10011000000005100130F8218316051485108312A4
:100120002430F8210130C3000130203E8400000853
:10013000A000A0102018A01420162011200885006F
:100140000508C200103085000522851904284418CE
:10015000C20C04160008C20604124218202800002F
:1001600000000C30F8210518022A8518022A840A9A
:100170000F300405031D97280130F821D620D62022
:10018000D6203708C4003718C928831605148510EF
:10019000CD288316051085140000831285190428C4
:1001A000C30137080F39031D9528942869210000E1
:1001B00000002F08A000013EA1072208C00021086E
:1001C000A207A20AA2092308C1000F30A305400814
:1001D0000F39A307A30A231A28294108A4072508D1
:1001E000C0002408A5072608C10040080F39083EB2
:1001F000C000401E2607A6004108013EA7072708A9
:10020000013EA8072808013EA9072908013EAA07C0
:100210002A08013EAB072B08013EAC072C08013E23
:10022000AD072D08013EAE072E08013EAF0720089E
:100230000F390F3EA0000000000000000000000089
:100240000000000000000000201E68290000DB28DC
:100250004108A3072408C0002308A4072508C100FB
:1002600040080F39083EC000401E2507A500410880
:10027000013EA6072608013EA7072708013EA8075A
:100280002808013EA9072908013EAA072A08013EBD
:10029000AB072B08013EAC072C08013EAD072D082B
:1002A000013EAE072E08013EAF0720080F390F3E72
:1002B000A00000000000000000000000000000009E
:1002C0000000000000000000201E68290000DB285C
:1002D00008003F08B000013EB1073208C0003108F5
:1002E000B207B20AB2093308C1000F30B3054008A3
:1002F0000F39B307B30A331AB8294108B4073508D0
:10030000C0003408B5073608C10040080F39083E60
:10031000C000401E3607B6004108013EB707370847
:10032000013EB8073808013EB9073908013EBA074F
:100330003A08013EBB073B08013EBC073C08013EB2
:10034000BD073D08013EBE073E08013EBF0730081D
:100350000F390F3EB0000000000000000000000058
:100360000000000000000000301E682900006B291A
:100370004108B3073408C0003308B4073508C1008A
:1003800040080F39083EC000401E3507B50041083F
:10039000013EB6073608013EB7073708013EB807E9
:1003A0003808013EB9073908013EBA073A08013E4C
:1003B000BB073B08013EBC073C08013EBD073D08AA
:1003C000013EBE073E08013EBF0730080F390F3E11
:1003D000B00000000000000000000000000000006D
:1003E0000000000000000000301E682900006B299A
:1003F000CF00CF0BF9290800CE000301F821CE0B66
:10040000FE29080085190428022A431C122A2230DA
:100410000406031D162A421C102A000009301B2A5C
:1004200006301B2A00000000000000000000000051
:0A043000000000001C2AB2000800C2
:02400E00D33F9E
:00000001FF

View File

@ -0,0 +1 @@
Use this template to cut a Super Famicom game cartridge shell to size for the N64 adapter.

Binary file not shown.

Binary file not shown.

Binary file not shown.

7
libraries/README.md Normal file
View File

@ -0,0 +1,7 @@
Unzip and copy those into your Arduino library folder e.g. C:\Users\sanni\Documents\Arduino\libraries
You can also get the latest versions from their respective github:
SD lib: https://github.com/greiman/SdFat
LCD lib: https://github.com/adafruit/Adafruit_SSD1306
RGB Tools lib: https://github.com/joushx/Arduino-RGB-Tools
SI5351 lib: https://github.com/etherkit/Si5351Arduino

BIN
libraries/RGBTools.zip Normal file

Binary file not shown.

BIN
libraries/SdFat.zip Normal file

Binary file not shown.

BIN
libraries/Si5351Arduino.zip Normal file

Binary file not shown.

7
pcb/README.md Normal file
View File

@ -0,0 +1,7 @@
Cart Reader Shield and N64 adapter:
![cartreaderpcb](https://github.com/sanni/cartreader/blob/master/pcb/cartreader.jpg)
Flashrom adapter:
![cartreaderpcb](https://github.com/sanni/cartreader/blob/master/pcb/flashadapter.jpg)
All pcbs are 10x10cm and 1.2mm thick.

7226
pcb/cartreader.GBL Normal file

File diff suppressed because it is too large Load Diff

5861
pcb/cartreader.GBO Normal file

File diff suppressed because it is too large Load Diff

1116
pcb/cartreader.GBS Normal file

File diff suppressed because it is too large Load Diff

475
pcb/cartreader.GML Normal file
View File

@ -0,0 +1,475 @@
G75*
%MOIN*%
%OFA0B0*%
%FSLAX25Y25*%
%IPPOS*%
%LPD*%
%AMOC8*
5,1,8,0,0,1.08239X$1,22.5*
%
%ADD10C,0.01000*%
%ADD11C,0.00000*%
D10*
X0013866Y0005937D02*
X0013866Y0207906D01*
X0013868Y0208030D01*
X0013874Y0208153D01*
X0013883Y0208277D01*
X0013897Y0208399D01*
X0013914Y0208522D01*
X0013936Y0208644D01*
X0013961Y0208765D01*
X0013990Y0208885D01*
X0014022Y0209004D01*
X0014059Y0209123D01*
X0014099Y0209240D01*
X0014142Y0209355D01*
X0014190Y0209470D01*
X0014241Y0209582D01*
X0014295Y0209693D01*
X0014353Y0209803D01*
X0014414Y0209910D01*
X0014479Y0210016D01*
X0014547Y0210119D01*
X0014618Y0210220D01*
X0014692Y0210319D01*
X0014769Y0210416D01*
X0014850Y0210510D01*
X0014933Y0210601D01*
X0015019Y0210690D01*
X0015108Y0210776D01*
X0015199Y0210859D01*
X0015293Y0210940D01*
X0015390Y0211017D01*
X0015489Y0211091D01*
X0015590Y0211162D01*
X0015693Y0211230D01*
X0015799Y0211295D01*
X0015906Y0211356D01*
X0016016Y0211414D01*
X0016127Y0211468D01*
X0016239Y0211519D01*
X0016354Y0211567D01*
X0016469Y0211610D01*
X0016586Y0211650D01*
X0016705Y0211687D01*
X0016824Y0211719D01*
X0016944Y0211748D01*
X0017065Y0211773D01*
X0017187Y0211795D01*
X0017310Y0211812D01*
X0017432Y0211826D01*
X0017556Y0211835D01*
X0017679Y0211841D01*
X0017803Y0211843D01*
X0050087Y0211843D01*
X0050087Y0258299D01*
X0016228Y0258299D01*
X0016228Y0276409D01*
X0026071Y0276409D01*
X0026071Y0284283D01*
X0013866Y0284283D01*
X0013866Y0325228D01*
X0016228Y0325228D01*
X0016228Y0350819D01*
X0026071Y0350819D01*
X0026071Y0358693D01*
X0013866Y0358693D01*
X0013866Y0366173D01*
X0037488Y0366173D01*
X0037488Y0374441D01*
X0383945Y0374441D01*
X0383945Y0366173D01*
X0407567Y0366173D01*
X0407567Y0326016D01*
X0394969Y0326016D01*
X0394969Y0318142D01*
X0403630Y0318142D01*
X0403630Y0305150D01*
X0393787Y0305150D01*
X0393787Y0297276D01*
X0403630Y0297276D01*
X0403630Y0277197D01*
X0407567Y0277197D01*
X0407567Y0258299D01*
X0371346Y0258299D01*
X0371346Y0211843D01*
X0394181Y0211843D01*
X0403630Y0202394D01*
X0403630Y0161843D01*
X0407567Y0152394D01*
X0407567Y0017000D01*
X0403866Y0007000D01*
X0403866Y0005937D01*
X0403864Y0005813D01*
X0403858Y0005690D01*
X0403849Y0005566D01*
X0403835Y0005444D01*
X0403818Y0005321D01*
X0403796Y0005199D01*
X0403771Y0005078D01*
X0403742Y0004958D01*
X0403710Y0004839D01*
X0403673Y0004720D01*
X0403633Y0004603D01*
X0403590Y0004488D01*
X0403542Y0004373D01*
X0403491Y0004261D01*
X0403437Y0004150D01*
X0403379Y0004040D01*
X0403318Y0003933D01*
X0403253Y0003827D01*
X0403185Y0003724D01*
X0403114Y0003623D01*
X0403040Y0003524D01*
X0402963Y0003427D01*
X0402882Y0003333D01*
X0402799Y0003242D01*
X0402713Y0003153D01*
X0402624Y0003067D01*
X0402533Y0002984D01*
X0402439Y0002903D01*
X0402342Y0002826D01*
X0402243Y0002752D01*
X0402142Y0002681D01*
X0402039Y0002613D01*
X0401933Y0002548D01*
X0401826Y0002487D01*
X0401716Y0002429D01*
X0401605Y0002375D01*
X0401493Y0002324D01*
X0401378Y0002276D01*
X0401263Y0002233D01*
X0401146Y0002193D01*
X0401027Y0002156D01*
X0400908Y0002124D01*
X0400788Y0002095D01*
X0400667Y0002070D01*
X0400545Y0002048D01*
X0400422Y0002031D01*
X0400300Y0002017D01*
X0400176Y0002008D01*
X0400053Y0002002D01*
X0399929Y0002000D01*
X0017803Y0002000D01*
X0017679Y0002002D01*
X0017556Y0002008D01*
X0017432Y0002017D01*
X0017310Y0002031D01*
X0017187Y0002048D01*
X0017065Y0002070D01*
X0016944Y0002095D01*
X0016824Y0002124D01*
X0016705Y0002156D01*
X0016586Y0002193D01*
X0016469Y0002233D01*
X0016354Y0002276D01*
X0016239Y0002324D01*
X0016127Y0002375D01*
X0016016Y0002429D01*
X0015906Y0002487D01*
X0015799Y0002548D01*
X0015693Y0002613D01*
X0015590Y0002681D01*
X0015489Y0002752D01*
X0015390Y0002826D01*
X0015293Y0002903D01*
X0015199Y0002984D01*
X0015108Y0003067D01*
X0015019Y0003153D01*
X0014933Y0003242D01*
X0014850Y0003333D01*
X0014769Y0003427D01*
X0014692Y0003524D01*
X0014618Y0003623D01*
X0014547Y0003724D01*
X0014479Y0003827D01*
X0014414Y0003933D01*
X0014353Y0004040D01*
X0014295Y0004150D01*
X0014241Y0004261D01*
X0014190Y0004373D01*
X0014142Y0004488D01*
X0014099Y0004603D01*
X0014059Y0004720D01*
X0014022Y0004839D01*
X0013990Y0004958D01*
X0013961Y0005078D01*
X0013936Y0005199D01*
X0013914Y0005321D01*
X0013897Y0005444D01*
X0013883Y0005566D01*
X0013874Y0005690D01*
X0013868Y0005813D01*
X0013866Y0005937D01*
X0087882Y0211843D02*
X0087882Y0258299D01*
X0092606Y0258299D01*
X0092606Y0216567D01*
X0328827Y0216567D01*
X0328827Y0258299D01*
X0333551Y0258299D01*
X0333551Y0211843D01*
X0087882Y0211843D01*
D11*
X0028335Y0296882D02*
X0028337Y0296963D01*
X0028343Y0297045D01*
X0028353Y0297126D01*
X0028367Y0297206D01*
X0028384Y0297285D01*
X0028406Y0297364D01*
X0028431Y0297441D01*
X0028460Y0297518D01*
X0028493Y0297592D01*
X0028530Y0297665D01*
X0028569Y0297736D01*
X0028613Y0297805D01*
X0028659Y0297872D01*
X0028709Y0297936D01*
X0028762Y0297998D01*
X0028818Y0298058D01*
X0028876Y0298114D01*
X0028938Y0298168D01*
X0029002Y0298219D01*
X0029068Y0298266D01*
X0029136Y0298310D01*
X0029207Y0298351D01*
X0029279Y0298388D01*
X0029354Y0298422D01*
X0029429Y0298452D01*
X0029507Y0298478D01*
X0029585Y0298501D01*
X0029664Y0298519D01*
X0029744Y0298534D01*
X0029825Y0298545D01*
X0029906Y0298552D01*
X0029988Y0298555D01*
X0030069Y0298554D01*
X0030150Y0298549D01*
X0030231Y0298540D01*
X0030312Y0298527D01*
X0030392Y0298510D01*
X0030470Y0298490D01*
X0030548Y0298465D01*
X0030625Y0298437D01*
X0030700Y0298405D01*
X0030773Y0298370D01*
X0030844Y0298331D01*
X0030914Y0298288D01*
X0030981Y0298243D01*
X0031047Y0298194D01*
X0031109Y0298142D01*
X0031169Y0298086D01*
X0031226Y0298028D01*
X0031281Y0297968D01*
X0031332Y0297904D01*
X0031380Y0297839D01*
X0031425Y0297771D01*
X0031467Y0297701D01*
X0031505Y0297629D01*
X0031540Y0297555D01*
X0031571Y0297480D01*
X0031598Y0297403D01*
X0031621Y0297325D01*
X0031641Y0297246D01*
X0031657Y0297166D01*
X0031669Y0297085D01*
X0031677Y0297004D01*
X0031681Y0296923D01*
X0031681Y0296841D01*
X0031677Y0296760D01*
X0031669Y0296679D01*
X0031657Y0296598D01*
X0031641Y0296518D01*
X0031621Y0296439D01*
X0031598Y0296361D01*
X0031571Y0296284D01*
X0031540Y0296209D01*
X0031505Y0296135D01*
X0031467Y0296063D01*
X0031425Y0295993D01*
X0031380Y0295925D01*
X0031332Y0295860D01*
X0031281Y0295796D01*
X0031226Y0295736D01*
X0031169Y0295678D01*
X0031109Y0295622D01*
X0031047Y0295570D01*
X0030981Y0295521D01*
X0030914Y0295476D01*
X0030845Y0295433D01*
X0030773Y0295394D01*
X0030700Y0295359D01*
X0030625Y0295327D01*
X0030548Y0295299D01*
X0030470Y0295274D01*
X0030392Y0295254D01*
X0030312Y0295237D01*
X0030231Y0295224D01*
X0030150Y0295215D01*
X0030069Y0295210D01*
X0029988Y0295209D01*
X0029906Y0295212D01*
X0029825Y0295219D01*
X0029744Y0295230D01*
X0029664Y0295245D01*
X0029585Y0295263D01*
X0029507Y0295286D01*
X0029429Y0295312D01*
X0029354Y0295342D01*
X0029279Y0295376D01*
X0029207Y0295413D01*
X0029136Y0295454D01*
X0029068Y0295498D01*
X0029002Y0295545D01*
X0028938Y0295596D01*
X0028876Y0295650D01*
X0028818Y0295706D01*
X0028762Y0295766D01*
X0028709Y0295828D01*
X0028659Y0295892D01*
X0028613Y0295959D01*
X0028569Y0296028D01*
X0028530Y0296099D01*
X0028493Y0296172D01*
X0028460Y0296246D01*
X0028431Y0296323D01*
X0028406Y0296400D01*
X0028384Y0296479D01*
X0028367Y0296558D01*
X0028353Y0296638D01*
X0028343Y0296719D01*
X0028337Y0296801D01*
X0028335Y0296882D01*
X0028335Y0311843D02*
X0028337Y0311924D01*
X0028343Y0312006D01*
X0028353Y0312087D01*
X0028367Y0312167D01*
X0028384Y0312246D01*
X0028406Y0312325D01*
X0028431Y0312402D01*
X0028460Y0312479D01*
X0028493Y0312553D01*
X0028530Y0312626D01*
X0028569Y0312697D01*
X0028613Y0312766D01*
X0028659Y0312833D01*
X0028709Y0312897D01*
X0028762Y0312959D01*
X0028818Y0313019D01*
X0028876Y0313075D01*
X0028938Y0313129D01*
X0029002Y0313180D01*
X0029068Y0313227D01*
X0029136Y0313271D01*
X0029207Y0313312D01*
X0029279Y0313349D01*
X0029354Y0313383D01*
X0029429Y0313413D01*
X0029507Y0313439D01*
X0029585Y0313462D01*
X0029664Y0313480D01*
X0029744Y0313495D01*
X0029825Y0313506D01*
X0029906Y0313513D01*
X0029988Y0313516D01*
X0030069Y0313515D01*
X0030150Y0313510D01*
X0030231Y0313501D01*
X0030312Y0313488D01*
X0030392Y0313471D01*
X0030470Y0313451D01*
X0030548Y0313426D01*
X0030625Y0313398D01*
X0030700Y0313366D01*
X0030773Y0313331D01*
X0030844Y0313292D01*
X0030914Y0313249D01*
X0030981Y0313204D01*
X0031047Y0313155D01*
X0031109Y0313103D01*
X0031169Y0313047D01*
X0031226Y0312989D01*
X0031281Y0312929D01*
X0031332Y0312865D01*
X0031380Y0312800D01*
X0031425Y0312732D01*
X0031467Y0312662D01*
X0031505Y0312590D01*
X0031540Y0312516D01*
X0031571Y0312441D01*
X0031598Y0312364D01*
X0031621Y0312286D01*
X0031641Y0312207D01*
X0031657Y0312127D01*
X0031669Y0312046D01*
X0031677Y0311965D01*
X0031681Y0311884D01*
X0031681Y0311802D01*
X0031677Y0311721D01*
X0031669Y0311640D01*
X0031657Y0311559D01*
X0031641Y0311479D01*
X0031621Y0311400D01*
X0031598Y0311322D01*
X0031571Y0311245D01*
X0031540Y0311170D01*
X0031505Y0311096D01*
X0031467Y0311024D01*
X0031425Y0310954D01*
X0031380Y0310886D01*
X0031332Y0310821D01*
X0031281Y0310757D01*
X0031226Y0310697D01*
X0031169Y0310639D01*
X0031109Y0310583D01*
X0031047Y0310531D01*
X0030981Y0310482D01*
X0030914Y0310437D01*
X0030845Y0310394D01*
X0030773Y0310355D01*
X0030700Y0310320D01*
X0030625Y0310288D01*
X0030548Y0310260D01*
X0030470Y0310235D01*
X0030392Y0310215D01*
X0030312Y0310198D01*
X0030231Y0310185D01*
X0030150Y0310176D01*
X0030069Y0310171D01*
X0029988Y0310170D01*
X0029906Y0310173D01*
X0029825Y0310180D01*
X0029744Y0310191D01*
X0029664Y0310206D01*
X0029585Y0310224D01*
X0029507Y0310247D01*
X0029429Y0310273D01*
X0029354Y0310303D01*
X0029279Y0310337D01*
X0029207Y0310374D01*
X0029136Y0310415D01*
X0029068Y0310459D01*
X0029002Y0310506D01*
X0028938Y0310557D01*
X0028876Y0310611D01*
X0028818Y0310667D01*
X0028762Y0310727D01*
X0028709Y0310789D01*
X0028659Y0310853D01*
X0028613Y0310920D01*
X0028569Y0310989D01*
X0028530Y0311060D01*
X0028493Y0311133D01*
X0028460Y0311207D01*
X0028431Y0311284D01*
X0028406Y0311361D01*
X0028384Y0311440D01*
X0028367Y0311519D01*
X0028353Y0311599D01*
X0028343Y0311680D01*
X0028337Y0311762D01*
X0028335Y0311843D01*
M02*

6104
pcb/cartreader.GTL Normal file

File diff suppressed because it is too large Load Diff

6958
pcb/cartreader.GTO Normal file

File diff suppressed because it is too large Load Diff

1054
pcb/cartreader.GTS Normal file

File diff suppressed because it is too large Load Diff

465
pcb/cartreader.TXT Normal file
View File

@ -0,0 +1,465 @@
%
M48
M72
T01C0.01600
T02C0.02362
T03C0.02756
T04C0.03150
T05C0.03346
T06C0.03543
T07C0.03740
T08C0.03937
T09C0.04000
%
T01
X58945Y58299
X65047Y84677
X65047Y104362
X75120Y139729
X107488Y173454
X113530Y176454
X116228Y155543
X83948Y189157
X73906Y186449
X94164Y192063
X171387Y262724
X181085Y271829
X185655Y270812
X190056Y272412
X184855Y275213
X183349Y282147
X188217Y283747
X181635Y288148
X188342Y293086
X200448Y293355
X208542Y288513
X196057Y272412
X173743Y274837
X157706Y279252
X151996Y276245
X124939Y296410
X125721Y307008
X112291Y309754
X97724Y302787
X97941Y280046
X61110Y267748
X25677Y267748
X25677Y334677
X121120Y325273
X135216Y333512
X137926Y329974
X144952Y327300
X149850Y323859
X148470Y317763
X159314Y319073
X132502Y340266
X140106Y343323
X144508Y343536
X171346Y343859
X188161Y339101
X203626Y335144
X234146Y334843
X265452Y321488
X270455Y318542
X285188Y331217
X298361Y343762
X348512Y358299
X376071Y358299
X399693Y358299
X399693Y334677
X399693Y291370
X399693Y267748
X364260Y267748
X332764Y267748
X316631Y252100
X262173Y258988
X255546Y255117
X242715Y252272
X232530Y251822
X244254Y266040
X234557Y287230
X227104Y289250
X260856Y286887
X364260Y202787
X344575Y159480
X324890Y159480
X301268Y159480
X277646Y159480
X261111Y147370
X256266Y149961
X253065Y158437
X238201Y152042
X230795Y162433
X211677Y179642
X207276Y179642
X202876Y179642
X183156Y187325
X198906Y155543
X234956Y190445
X288788Y136744
X313079Y120110
X319200Y93072
X312454Y91876
X350912Y102217
X353320Y128794
X357849Y129011
X362348Y130634
X366657Y132549
X358567Y140547
X351365Y137998
X229937Y38757
X226887Y42870
X225259Y51008
X223718Y57009
X155402Y41370
X21740Y76803
X383945Y9874
X395756Y9874
T02
X72921Y340583
X72921Y348457
X72921Y356331
X72921Y364205
X45362Y364205
X45362Y356331
X45362Y348457
X45362Y340583
T03
X83551Y329441
X83551Y319441
X43787Y277472
X43787Y267472
T04
X245238Y58925
X237613Y52925
X245238Y46925
X237613Y41925
T05
X233866Y12000
X243866Y12000
X253866Y12000
X263866Y12000
X273866Y12000
X283866Y12000
X303866Y12000
X313866Y12000
X323866Y12000
X333866Y12000
X343866Y12000
X353866Y12000
X363866Y12000
X373866Y12000
X223866Y12000
X213866Y12000
X193866Y12000
X183866Y12000
X173866Y12000
X163866Y12000
X153866Y12000
X143866Y12000
X133866Y12000
X123866Y12000
X127866Y202000
X137866Y202000
X147866Y202000
X157866Y202000
X167866Y202000
X177866Y202000
X193866Y202000
X203866Y202000
X213866Y202000
X223866Y202000
X233866Y202000
X243866Y202000
X253866Y202000
X263866Y202000
X283866Y202000
X293866Y202000
X303866Y202000
X313866Y202000
X323866Y202000
X333866Y202000
X343866Y202000
X353866Y202000
X117866Y202000
X107866Y202000
X97866Y202000
X87866Y202000
X30008Y296882
X30008Y311843
T06
X137882Y191291
X148118Y191291
X157961Y191291
X157961Y151291
X148118Y151291
X137882Y151291
X204575Y56252
X204575Y16252
X288472Y288181
X288472Y318181
X255598Y313614
X249693Y305740
X255598Y297866
X243787Y297866
X237882Y305740
X231976Y297866
X226071Y305740
X220165Y297866
X214260Y305740
X208354Y297866
X202449Y305740
X196543Y297866
X190638Y305740
X184732Y297866
X178827Y305740
X184732Y313614
X178827Y321488
X172921Y313614
X167016Y305740
X172921Y297866
X196543Y313614
X190638Y321488
X202449Y321488
X208354Y313614
X214260Y321488
X220165Y313614
X226071Y321488
X231976Y313614
X237882Y321488
X243787Y313614
X249693Y321488
X167016Y321488
T07
X383866Y202000
X383866Y192000
X383866Y182000
X383866Y172000
X383866Y162000
X383866Y152000
X383866Y142000
X383866Y132000
X383866Y122000
X383866Y112000
X383866Y102000
X383866Y92000
X383866Y82000
X383866Y72000
X383866Y62000
X383866Y52000
X383866Y42000
X383866Y32000
X393866Y32000
X393866Y42000
X393866Y52000
X393866Y62000
X393866Y72000
X393866Y82000
X393866Y92000
X393866Y102000
X393866Y112000
X393866Y122000
X393866Y132000
X393866Y142000
X393866Y152000
X393866Y162000
X393866Y172000
X393866Y182000
X393866Y192000
X393866Y202000
T08
X357173Y123014
X357181Y115671
X347339Y115671
X347331Y123014
X337488Y123014
X337496Y115671
X327654Y115671
X327646Y123014
X327646Y95947
X337488Y95947
X347331Y95947
X357173Y95947
X298118Y95947
X288276Y95947
X278433Y95947
X268591Y95947
X258748Y95947
X248906Y95947
X239063Y95947
X229220Y95947
X219378Y95947
X209535Y95947
X199693Y95947
X189850Y95947
X180008Y95947
X170165Y95947
X160323Y95947
X150480Y95947
X140638Y95947
X130795Y95947
X120953Y95947
X111110Y95947
X101268Y95947
X91425Y95947
X81583Y95947
X81591Y115671
X81583Y123014
X91425Y123014
X91433Y115671
X101276Y115671
X101268Y123014
X111110Y123014
X111118Y115671
X120961Y115671
X120953Y123014
X130795Y123014
X130803Y115671
X140646Y115671
X140638Y123014
X150480Y123014
X150488Y115671
X160331Y115671
X160323Y123014
X170165Y123014
X170173Y115671
X180016Y115671
X180008Y123014
X189850Y123014
X189858Y115671
X199701Y115671
X199693Y123014
X209535Y123014
X209543Y115671
X219386Y115671
X219378Y123014
X229220Y123014
X229228Y115671
X239071Y115671
X239063Y123014
X248906Y123014
X248913Y115671
X258756Y115671
X258748Y123014
X268591Y123014
X268598Y115671
X278441Y115671
X278433Y123014
X288276Y123014
X288283Y115671
X298126Y115671
X298118Y123014
X52055Y123014
X52063Y115671
X42220Y115671
X42213Y123014
X32370Y123014
X32378Y115671
X22535Y115671
X22528Y123014
X22528Y95947
X32370Y95947
X42213Y95947
X52055Y95947
T09
X23866Y12000
X23866Y22000
X23866Y32000
X23866Y42000
X23866Y52000
X23866Y62000
X33866Y62000
X43866Y62000
X43866Y52000
X33866Y52000
X33866Y42000
X43866Y42000
X43866Y32000
X33866Y32000
X33866Y22000
X33866Y12000
X43866Y12000
X43866Y22000
X53866Y22000
X53866Y12000
X63866Y12000
X63866Y22000
X63866Y32000
X53866Y32000
X53866Y42000
X53866Y52000
X63866Y52000
X63866Y42000
X73866Y42000
X73866Y52000
X83866Y52000
X83866Y42000
X93866Y42000
X93866Y52000
X93866Y62000
X103866Y62000
X113866Y62000
X113866Y52000
X103866Y52000
X103866Y42000
X113866Y42000
X113866Y32000
X103866Y32000
X93866Y32000
X83866Y32000
X73866Y32000
X73866Y22000
X73866Y12000
X83866Y12000
X83866Y22000
X93866Y22000
X93866Y12000
X103866Y12000
X103866Y22000
X113866Y22000
X113866Y12000
X123866Y27000
X123866Y37000
X123866Y47000
X123866Y57000
X163665Y56176
X163665Y38376
X189265Y38376
X189265Y56176
X294614Y51882
X294614Y41882
X304614Y41882
X304614Y51882
X314614Y51882
X314614Y41882
X324614Y41882
X324614Y51882
X334614Y51882
X334614Y41882
X344614Y41882
X344614Y51882
X354614Y51882
X354614Y41882
X364614Y41882
X364614Y51882
X364575Y61724
X354575Y61724
X344575Y61724
X238657Y172079
X227657Y172079
X324024Y189008
X334024Y189008
X77921Y202000
X67921Y202000
X57921Y202000
X47921Y202000
X37921Y202000
X27921Y202000
X17921Y202000
X63079Y173417
X72921Y173417
X72921Y163417
X63079Y163417
X63079Y153417
X72921Y153417
M30

BIN
pcb/cartreader.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

BIN
pcb/cartreader_sch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

8488
pcb/flash_adapter.GBL Normal file

File diff suppressed because it is too large Load Diff

7676
pcb/flash_adapter.GBO Normal file

File diff suppressed because it is too large Load Diff

1422
pcb/flash_adapter.GBS Normal file

File diff suppressed because it is too large Load Diff

1172
pcb/flash_adapter.GML Normal file

File diff suppressed because it is too large Load Diff

8763
pcb/flash_adapter.GTL Normal file

File diff suppressed because it is too large Load Diff

7373
pcb/flash_adapter.GTO Normal file

File diff suppressed because it is too large Load Diff

1690
pcb/flash_adapter.GTS Normal file

File diff suppressed because it is too large Load Diff

399
pcb/flash_adapter.TXT Normal file
View File

@ -0,0 +1,399 @@
%
M48
M72
T01C0.01600
T02C0.02000
T03C0.02756
T04C0.04000
T05C0.04134
T06C0.04724
%
T01
X39958Y44493
X47981Y37624
X57828Y35518
X77624Y54543
X83637Y50793
X95594Y43671
X89268Y35486
X104444Y39201
X93528Y90158
X90383Y113205
X69516Y104097
X67785Y114961
X54950Y103362
X54950Y99425
X9674Y93520
X9674Y113205
X9674Y132890
X9674Y152575
X9674Y172260
X9674Y191945
X29359Y191945
X49044Y191945
X68729Y191945
X88414Y191945
X108099Y191945
X127784Y191945
X147469Y191945
X167154Y191945
X186839Y191945
X206524Y191945
X226209Y191945
X245894Y191945
X265580Y191945
X285265Y191945
X304950Y191945
X324635Y191945
X344320Y191945
X364005Y191945
X383690Y191945
X383690Y172260
X383690Y152575
X383690Y132890
X383690Y113205
X383690Y93520
X348430Y103519
X344027Y102495
X344320Y81709
X338414Y81709
X330540Y81709
X330540Y75803
X330540Y67929
X330540Y62024
X338414Y62024
X344320Y62024
X350225Y50213
X338414Y50213
X312824Y46276
X306918Y46276
X298946Y55620
X292646Y56735
X281987Y63624
X280437Y46128
X267864Y44611
X266730Y35410
X240117Y50013
X241957Y60055
X241957Y69898
X238380Y76031
X233979Y74117
X247863Y79740
X234083Y91551
X222272Y91551
X212430Y71866
X217112Y66139
X212901Y63171
X213224Y52707
X227641Y50054
X182381Y36650
X155455Y99809
X243926Y111236
X265592Y129846
X276424Y128091
X299472Y139692
X304950Y87614
X304950Y81709
X304950Y75803
X273454Y81709
X367942Y50213
X383690Y50213
X29359Y54150
X9674Y54150
X9674Y73835
T02
X63490Y238067
X68660Y252454
X82107Y242284
X86997Y255660
X90564Y272342
X65416Y272388
X73860Y307639
X72854Y316827
X82476Y325398
X78563Y329930
X69124Y338640
X57614Y328442
X55501Y337170
X62127Y361781
X79437Y358293
X78362Y371217
X85240Y338736
X83935Y310235
X88209Y307625
X127992Y339175
X157312Y331645
X171602Y346627
X173393Y339074
X176415Y330047
X175285Y302312
X174763Y287653
X175191Y263425
X139700Y284987
X130040Y267287
X226417Y339175
X255737Y331645
X271818Y339074
X270028Y346627
X274840Y330047
X273710Y302312
X273188Y287653
X273616Y263425
X238125Y284987
X228466Y267287
X322873Y339175
X352194Y331645
X368274Y339074
X366484Y346627
X371297Y330047
X370167Y302312
X369645Y287653
X370072Y263425
X334582Y284987
X324922Y267287
X324345Y374510
X313219Y380385
X227888Y374510
X216762Y380385
X129463Y374510
X118337Y380385
T03
X285265Y80803
X285265Y70803
X358099Y66866
X358099Y76866
T04
X358769Y116669
X348769Y116669
X338769Y116669
X328769Y116669
X318769Y116669
X308769Y116669
X298769Y116669
X288769Y116669
X278769Y116669
X268769Y116669
X258769Y116669
X248769Y116669
X238769Y116669
X228769Y116669
X218769Y116669
X208769Y116669
X198769Y116669
X188769Y116669
X178769Y116669
X168769Y116669
X158769Y116669
X148769Y116669
X144595Y141236
X154595Y141236
X164595Y141236
X174595Y141236
X184595Y141236
X194595Y141236
X204595Y141236
X214595Y141236
X224595Y141236
X228769Y176669
X238769Y176669
X248769Y176669
X258769Y176669
X268769Y176669
X278769Y176669
X288769Y176669
X298769Y176669
X308769Y176669
X318769Y176669
X328769Y176669
X338769Y176669
X348769Y176669
X358769Y176669
X330501Y220567
X330501Y230567
X330501Y240567
X330501Y250567
X330501Y260567
X330501Y270567
X330501Y280567
X330501Y290567
X330501Y300567
X330501Y310567
X330501Y320567
X330501Y330567
X330501Y340567
X330501Y350567
X330501Y360567
X330501Y370567
X330501Y380567
X330501Y390567
X294044Y390567
X294044Y380567
X294044Y370567
X294044Y360567
X294044Y350567
X294044Y340567
X294044Y330567
X294044Y320567
X294044Y310567
X294044Y300567
X294044Y290567
X294044Y280567
X294044Y270567
X294044Y260567
X294044Y250567
X294044Y240567
X294044Y230567
X294044Y220567
X234044Y220567
X234044Y230567
X234044Y240567
X234044Y250567
X234044Y260567
X234044Y270567
X234044Y280567
X234044Y290567
X234044Y300567
X234044Y310567
X234044Y320567
X234044Y330567
X234044Y340567
X234044Y350567
X234044Y360567
X234044Y370567
X234044Y380567
X234044Y390567
X195619Y390567
X195619Y380567
X195619Y370567
X195619Y360567
X195619Y350567
X195619Y340567
X195619Y330567
X195619Y320567
X195619Y310567
X195619Y300567
X195619Y290567
X195619Y280567
X195619Y270567
X195619Y260567
X195619Y250567
X195619Y240567
X195619Y230567
X195619Y220567
X198769Y176669
X188769Y176669
X178769Y176669
X168769Y176669
X158769Y176669
X148769Y176669
X134595Y141236
X124595Y141236
X114595Y141236
X104595Y141236
X94595Y141236
X84595Y141236
X74595Y141236
X64595Y141236
X54595Y141236
X54595Y81236
X64595Y81236
X74595Y81236
X84595Y81236
X94595Y81236
X104595Y81236
X114595Y81236
X124595Y81236
X134595Y81236
X144595Y81236
X154595Y81236
X164595Y81236
X174595Y81236
X184595Y81236
X194595Y81236
X204595Y81236
X214595Y81236
X224595Y81236
X253769Y85803
X253769Y75803
X253769Y65803
X218769Y176669
X208769Y176669
X135619Y220567
X135619Y230567
X135619Y240567
X135619Y250567
X135619Y260567
X135619Y270567
X135619Y280567
X135619Y290567
X135619Y300567
X135619Y310567
X135619Y320567
X135619Y330567
X135619Y340567
X135619Y350567
X135619Y360567
X135619Y370567
X135619Y380567
X135619Y390567
X100265Y390567
X100265Y380567
X100265Y370567
X100265Y360567
X100265Y350567
X100265Y340567
X100265Y330567
X100265Y320567
X100265Y310567
X100265Y300567
X100265Y290567
X100265Y280567
X100265Y270567
X100265Y260567
X100265Y250567
X100265Y240567
X100265Y230567
X100265Y220567
X40265Y220567
X40265Y230567
X40265Y240567
X40265Y250567
X40265Y260567
X40265Y270567
X40265Y280567
X40265Y290567
X40265Y300567
X40265Y310567
X40265Y320567
X40265Y330567
X40265Y340567
X40265Y350567
X40265Y360567
X40265Y370567
X40265Y380567
X40265Y390567
X390501Y390567
X390501Y380567
X390501Y370567
X390501Y360567
X390501Y350567
X390501Y340567
X390501Y330567
X390501Y320567
X390501Y310567
X390501Y300567
X390501Y290567
X390501Y280567
X390501Y270567
X390501Y260567
X390501Y250567
X390501Y240567
X390501Y230567
X390501Y220567
T05
X376879Y81413
X376879Y62319
T06
X388808Y61138
X388808Y82594
M30

BIN
pcb/flashadapter.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

BIN
pcb/flashadapter_sch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

BIN
pcb/n64_adapter_sch.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

BIN
pinout.xls Normal file

Binary file not shown.

49
sd/README.md Normal file
View File

@ -0,0 +1,49 @@
####Copy these files to the root of your SD card.
####n64.txt
This file stores the N64 database which is needed because the save type and rom size are not stored inside the rom.
The CRC32 checksum is used to verify a good dump.
Example:
002c3b2a,NO7P,32,0
CRC32, game id, size in MByte, savetype
Savetypes:
0 = no save chip
1 = SRAM
4 = Flashram
5 = 4K Eeprom
6 = 16K Eeprom
####snes.txt
This file is needed for odd sized SNES games like Final Fantasy (JAP) or Tales of Symphonia. Without this file you will get overdumps. There are still a lot games missing from this list.
Example:
A172,24,48
checksum, size in Mbit, number of banks
####hirom64.map
This is a Nintendo Power mapping file that changes the mapping to a single 4MB HiRom game with 64Kbit/8KByte save. The first byte is used to specify the mapping.
Bit0-1 SRAM Size (0=2K, 1=8K, 2=32K, 3=None) ;ie. 2K SHL (N*2)
Bit2-4 ROM Size (0=512K, 2=1.5M, 5=3M, 7=4M) ;ie. 512K*(N+1)
Bit5 Zero (maybe MSB of ROM Size for carts with three FLASH chips) (set for HIROM:ALL)
Bit6-7 Mode (0=Lorom, 1=Hirom, 2=Forced HIROM:MENU, 3=Forced HIROM:ALL)
More info: http://problemkaputt.de/fullsnes.htm#snescartnintendopowerflashcard
Example:
0x5d = 0b 01 0 111 01
01 -> Hirom
0
111 -> 4M
01 -> 8K
####lorom256.map
This is a Nintendo Power mapping file that changes the mapping to a single 4MB LoRom game with 256Kbit/32 KByte save.
Example:
0x1e = 0b 00 0 111 10
00 -> Lorom
0
0b111 -> 7 -> 4M
0x10 -> 2 ->32k

BIN
sd/hirom64.map Normal file

Binary file not shown.

BIN
sd/lorom256.map Normal file

Binary file not shown.

869
sd/n64.txt Normal file
View File

@ -0,0 +1,869 @@
002c3b2a,NO7P,32,0
26360987,NO7E,32,0
75a21679,NTEP,16,1
08fe81c7,NTEA,16,1
67a789e5,NTWJ,12,0
97389efc,NNiJ,16,0
b6fa1328,NNiJ,12,0
60a680e7,NHFJ,08,0
742e31fb,NOSJ,16,0
c1bc6fd8,NO2J,16,0
dca7f4eb,NTCJ,12,5
6a2b08da,NSAP,12,5
4370d7e3,NERE,08,5
040b0046,NAGP,08,5
6ee3b932,NAGJ,08,5
f322b641,NAGJ,08,5
198b9e0e,NAGE,08,5
86df90e6,NS3J,08,0
be7e230d,NAYP,32,1
b1f18186,NAYE,32,1
c14d45ac,NABP,08,5
58fcb771,NABJ,08,5
e349cfec,ND3J,12,0
ff009c21,ND4J,16,0
996e845f,NTNP,08,5
a7dcf638,NTNE,08,5
d0de3584,NBSP,12,0
6d25b36f,NBSE,12,0
d3c29aa4,NBEP,16,0
69e88471,NBEE,16,0
4d659e85,NASE,16,0
600bc49e,NARP,16,0
5bab9100,NARD,16,0
630a19e2,NARE,16,0
1952cc87,NACE,08,0
e79048e2,NAMP,08,0
2fe786f6,NAME,08,0
79a71608,N32E,08,1
f5ce3d91,NAHE,04,0
3baf58d5,NLCP,04,0
a4374eac,NLCE,04,0
22f54a52,NBMJ,08,5
86bbc278,NBVJ,16,5
6ab7fec6,NBNJ,12,5
ef8c2f34,NBJJ,12,0
47db2246,NBJJ,12,0
8f7c9324,NBKJ,16,5
258c58d0,NB7J,32,6
525899c9,NBKP,16,5
ad429961,NBKE,16,5
fb7ffb10,NBKE,16,5
2736266a,NB7U,32,6
1ec12f5a,NB7P,32,6
bab803ef,NB7E,32,6
00da3704,NFHP,08,5
383b86ef,NVBJ,32,1
6b09092e,NB4E,12,0
35299f9c,NJQE,04,0
82a4bb8a,NJQP,04,0
6c230765,NBXE,08,0
c99c6030,NBQP,08,0
31beb053,NBQE,08,0
736f9d5c,NZOE,16,0
5b6c6e4c,NNSP,16,0
b0986539,NNSP,16,0
49e75825,NB8J,16,0
f4a97c73,NNSE,16,0
9e372e72,NNSE,15,0
3ac924bc,NMUE,12,5
2c4eb906,NBFP,16,0
dfbf448c,NBFE,16,0
4f9d569f,NB5J,64,0
4c820695,NBCP,08,5
767a95e7,NBCE,08,5
9cbbccf1,NBCE,08,5
081a3641,NBCJ,08,5
8fb41658,NBPP,16,0
c6f49764,NBPE,16,0
6a04cdae,NBHP,12,5
fabbdf02,NBHE,12,5
f97237c7,NYWJ,16,1
525339c5,NBMP,08,5
3ed0e0dc,NBME,08,5
57550007,NBVE,16,5
59e39947,NBDP,12,5
2cc2e634,NBDE,12,5
69ceabcc,NBDJ,12,5
1844c8ca,NBOE,16,0
80d70173,NOWE,08,0
e26192ab,NBLP,12,0
2ed81a65,NBLJ,12,0
8ec937db,NBLE,12,0
791881d4,NBYP,12,0
e5429094,NBYF,12,0
15a32836,NBYD,12,0
cf2ea0b6,NBYE,12,0
c285fc69,NB3E,08,0
04731bab,NBUP,08,0
9f54cd2d,NBUE,08,0
95595889,NB3P,08,0
6f6262cb,NCLE,16,0
8569f1a0,NCDX,16,0
8036f999,NCDY,16,0
10c6a0a1,NCDE,16,0
d9d76235,ND3P,12,0
8b0d3c00,ND3E,12,0
83032d97,ND3E,12,0
12ab9b45,ND4P,16,0
ab13028c,ND4E,16,0
b1d26f39,NTSP,12,0
587dd983,NCTP,12,5
6395c475,NCTJ,12,5
7fe024c9,NCTE,12,5
3b53519f,N2VP,08,0
5677eaef,NV2J,08,0
cdf26d67,N2VE,08,0
82c1d9e1,NCBP,04,0
ba4e65a8,NCBE,04,0
c1dcd7ab,NCHP,08,5
aa5d76a9,NCHE,08,5
231f9284,NCRJ,08,5
5c565ad6,NCGJ,12,5
5f75634e,NPKJ,08,0
479643e2,NP2J,16,4
8fedf4c6,NK2J,16,5
e272bdf6,NGTJ,16,0
434de656,NC2E,16,0
18f4166a,NCFE,12,0
82263e5d,NCFP,12,0
3fa647dd,NCFE,12,0
f3da8a26,NCCP,32,4
6cd0fc99,NCCD,32,4
3e9069ef,NCCE,32,4
4667cfe9,NFUP,64,6
ce8cc172,NFUE,64,6
867a2ced,NXOE,16,5
8935a8d9,NCUP,08,5
5238b727,NCUE,08,5
4655ba2d,NCUE,08,5
c3b52701,NCUE,08,5
e46ce079,NCWP,12,6
a123769f,NCWE,12,6
f2fae693,NCXJ,16,5
c8201454,NCZJ,16,6
7319d9af,NT4P,16,0
10cc5f15,NT4E,16,0
3c13fbcf,NDFJ,24,0
d2a19c71,NDKP,08,0
83fd222f,NDKE,08,0
3db8130e,NGAE,12,0
e7ef60e8,NMTF,16,0
7bfc71e0,ND6J,32,1
ffc76f35,ND6J,32,1
a9417994,NDAJ,32,1
7ad9e429,NDEP,16,0
38f1b5d9,NDEE,16,0
9e978488,CDZJ,16,1
4a13323c,NDYP,12,5
b1e87639,NDYP,12,5
eb759206,NDYE,12,5
5acca298,NDYE,12,5
7fdec270,NDQE,20,5
7737ed9e,NTAP,16,0
99c7649d,NTAF,16,0
0b0954c5,NTAD,16,0
c38ca641,NTAE,16,0
c4b0d9ea,NDQP,20,5
a28c71c6,NDOP,32,6
919f7e74,NDOJ,32,6
c83dfa15,NDPE,32,6
d44b4fc6,NDOE,32,6
d985c356,NDMP,08,0
c8f3af5b,NDMJ,08,0
5cc1ade6,NDME,08,0
1d3a17b5,NDME,08,0
154e8b33,NDRJ,08,5
0c1a0c38,ND2J,12,6
d3b68be4,N3DJ,16,6
92dfe338,N3DJ,16,6
9503e3f1,NAFJ,16,4
a4701927,NN6E,04,5
5a7e226b,NDHP,12,0
20f23dde,NDHJ,12,0
d09f4da8,NDHE,12,0
3177a905,NDUE,16,5
ea82f037,NDZP,32,1
7ecdfb28,NDZF,32,1
9a3258d7,NDZE,32,1
3275adb0,NDNP,08,0
dbfd5a53,NDNE,08,0
61a56330,NJMP,16,5
9e6579c5,NJME,16,5
be8feead,NWIP,32,1
36d368ef,NWIE,32,1
1699d2d6,NSTJ,08,0
92c3ba6f,NELE,08,0
ea3b92d8,NENE,08,0
a4fe7652,NETJ,16,0
0b881e60,NMXP,16,6
03bfd065,NMXJ,16,6
be6298b0,NNXE,16,6
fc459192,NMXE,16,6
0b71b1ea,NEGP,08,0
750dc9a7,NEGJ,08,0
04cb74ec,NEGE,08,0
1a57f416,NG2P,12,0
7c8a36da,NG2J,12,0
81a4c28b,NG2E,12,0
ed750623,NHGP,08,0
30a24d89,NHGE,08,0
bebbc6c8,NFWP,12,5
57cd299d,NFWF,12,5
0f1984dc,NFWD,12,5
f7bacbc3,NFWJ,12,5
7dc9ef2c,NFWE,12,5
803d33df,NF2P,12,6
2d6f7e8b,NFZP,16,1
6b1cef83,CFZJ,16,1
0b561fba,CFZE,16,1
2da744f5,NFRP,16,0
9fb0e6c9,NFSJ,12,0
137cb3cc,N8IP,12,0
28b1221c,N8IE,12,0
ae346df6,N8IJ,12,0
6eae1e6e,N9FP,16,0
6b2473a9,N9FE,16,0
ae2583fb,N7IP,08,0
57de7cab,N7IE,08,0
bb2563c6,NFGE,16,0
c9225511,NKAP,12,5
0cc22034,NKAF,12,5
5052168c,NKAD,12,5
f45ea789,NKAE,12,5
8a1c261e,NKAJ,12,5
4052c176,NFFP,16,0
8456841e,NFFE,16,0
c3066e59,NFDP,12,0
91bc9aeb,NFDE,12,0
5ed736d9,NFOP,08,0
9793abc2,NFOD,08,0
76c4333d,NFOE,08,0
67eaf0f3,NF9E,12,0
b0c62957,NGVE,04,5
2aa6d2a1,NSIJ,32,4
5aa63b04,NGAP,12,0
6ead2d89,NGAJ,12,0
08c41e0e,NG6J,16,0
965c4575,NGPJ,16,0
73133cd2,N3HJ,12,0
b7b3a489,NGXP,16,0
8d133db0,NGDJ,16,0
64765e82,NGXE,16,0
724ecae7,NGLJ,12,0
a43cb8e4,NX3X,32,0
6bc4a056,NX3P,32,0
87a7d099,NX3E,32,0
a7c92bea,NX2P,16,0
c545ce80,NX2E,16,0
90eceb4a,NGVP,08,5
f874571c,NGVE,08,5
52d418e1,NGME,16,0
641885df,NGNE,08,0
9ec14aeb,NGEP,12,5
a6be19dd,NGEJ,12,5
b6330846,NGEE,12,5
6dfb4747,NGCP,12,5
bc627da7,NGCE,12,5
c1d98b78,NHSJ,12,0
51228f0c,NM9J,16,0
decdc0ad,NYWE,16,1
99a427fa,NHPJ,08,5
b1954b08,NHCP,16,0
4948892b,NHCE,16,0
5369efb4,NHXP,08,0
e4821c4b,NHXD,08,0
571da09a,NHXJ,08,0
1d35e110,NHXE,08,0
b18b2734,NPGE,16,5
ba6a687e,NHKJ,12,0
bf6f67bf,NETP,16,0
d1934cf6,NETD,16,0
ae7cb69d,NK4J,32,1
a263c1b9,NK4J,32,1
f4589aa8,NK4J,32,1
6d5e1332,NK4J,32,1
850633a7,NHWP,16,0
a5c92148,NHWE,12,0
31e102e3,NHGJ,08,0
e76627ff,NHVP,16,0
e769de96,NHYJ,16,0
15b57ef8,NHVE,16,0
863ab8f3,NHTP,32,0
010f6242,NHTF,32,0
e744456f,NHTE,32,0
c1ea5d33,NH5J,12,0
a4a24517,NIMJ,12,0
9bf26065,NWBP,04,0
6a6fbd5d,NWBE,04,0
26cc1266,NWBJ,04,0
d8eb5e6e,NFHE,08,5
4978eb57,NIJE,32,5
a5163f29,NICE,16,5
bf23945d,NWSP,12,0
b85fa721,NWSE,12,0
69572558,NISX,16,0
dcd0538f,NISE,16,0
8c839268,NJPP,08,0
0ea249b9,NJPE,08,0
da443f0b,N3HE,12,0
b3181ee0,N3HP,12,0
dc0b2c8f,NDSJ,08,0
4c536dd7,NJLJ,08,0
976a2d12,NSJJ,12,0
156e705e,NSJJ,12,0
d1c1681e,NMAJ,08,0
e739947c,NJOE,04,0
9f14481b,NNiE,04,0
5bf42ec4,NCOP,16,0
2a5c9a06,NCOE,16,0
cfbed88c,NJFP,32,4
fa061b96,NJDE,32,4
6753d5a3,NJFE,32,4
0a796c3e,NGSJ,16,0
153aeb15,NPSJ,16,4
8ed60dea,NJPJ,08,0
6a9e24d7,NPEJ,16,0
351cde48,NPAJ,16,0
753706ef,NPAJ,16,0
480b953e,NP4J,12,0
40e3ac61,NP4J,12,0
feec34f6,NJ5J,16,0
d9329895,NP6J,16,0
5c721850,NWSJ,16,0
68dbcc04,NWSJ,16,0
f63f9a5e,NWSJ,16,0
3ba9e644,NJ3J,08,0
67a1a22c,NJGJ,16,0
f88ac3ce,NDWP,16,0
44b80fd7,NDWJ,16,0
494950c6,NDWE,16,0
db40a155,NFYJ,16,0
12d8f3e9,NKJE,16,4
5d0ee5d2,NKIP,12,5
31c76be7,NKIE,12,5
49ef8f2b,NKIE,12,5
0b5b5df8,NKIE,12,5
f120cc52,NSBJ,12,0
7fdc3784,N64J,12,1
5b8b89ef,NK4P,32,5
20a1c120,NK4E,32,5
b77783be,NKEP,08,0
3bc93017,NKEJ,08,0
255ee1dd,NKEE,08,0
58ce7d80,NKKP,16,0
074690d6,NKKE,16,0
1355a826,NNBP,12,6
86360bfb,NNBE,12,6
9db99881,NLLJ,12,0
9ead1608,NZSP,32,4
b428d8a7,NZSE,32,4
12836e19,NZSP,32,4
3fbd519f,NZLP,32,1
946fd0f7,NZLP,32,1
a108f6e3,NZLP,32,1
346de3ae,CZLE,32,1
cd16c529,CZLE,32,1
3fd2151e,CZLE,32,1
32120c23,CZLE,32,1
832d6449,NZLP,32,1
c744c4db,CZLE,32,1
c7d9b21c,NLGP,16,0
39407c9f,NLGE,16,0
66766469,NRGF,16,0
455a1770,NTSJ,12,0
7148251d,NLRP,08,5
1d4fb466,NLRJ,08,5
4ea07453,NLRE,08,5
c61f6bb9,NDUP,16,5
9a3425da,NFXU,12,5
50a9c0b1,NFXP,12,5
57ddede1,NMEP,12,0
d2a363a6,NMEE,12,0
fab3e50d,N8MP,12,0
42e5fafa,N8ME,12,0
ef5f997b,NMDE,12,0
245eaee8,NFLE,12,0
f573f107,N2ME,12,0
d0929942,N9MP,12,0
2eb64fc2,N9ME,12,0
af3b099e,NMTP,16,0
377f18e9,NMTD,16,0
22fe979c,NMTE,16,0
7efb2f1e,NMTJ,16,0
dbe7d51a,NMJJ,08,0
990a8e54,NMHJ,12,0
b68d596f,NMMJ,08,0
e08f7578,NKGP,16,1
2ef1ea20,NKGE,16,1
e5d723c7,NMFP,24,1
2d40abb0,NMFE,24,1
911f179a,NMFJ,24,1
faa6b083,NKTP,12,5
0248f6c3,NKTP,12,5
5d9696df,NKTJ,12,5
6ced6472,NKTJ,12,5
434389c1,NKTE,12,5
1d69ca55,NMPJ,16,0
da98a5d3,NLBP,32,5
4f1adc7b,CLBJ,32,5
4d60abe5,CLBE,32,5
dc00357a,NMWP,32,5
7457b081,NMWJ,32,5
e58a1955,NMWE,32,5
813b13f2,NMVP,32,6
3fc04053,NMVJ,32,6
b7445ddc,NMVE,32,6
bd60ca66,NMQJ,40,4
29aa5df4,NM8P,16,6
4e9560f6,NM8E,16,6
c665301d,NM8J,16,6
1bfc71f0,NM6E,32,4
2db3d3d6,NHME,16,0
bb680cbe,NWKX,16,0
1aecfc56,NMLJ,32,5
0ae51ea5,NMLP,32,5
2d4f8f1b,NMLE,32,5
10b9ff1f,NV3P,12,0
a62a2763,NV3E,12,0
e5c1fedc,NAIE,04,0
cc253cab,NMBE,12,0
c08ce624,NBRP,04,0
172fca97,NBRE,04,0
68a4f072,NTMP,08,5
7d222d3f,NTME,08,5
2c7131d6,NMIP,12,5
282a350d,NMIF,12,5
67c30a2d,NMID,12,5
2d789d98,NMII,12,5
ebb060dc,NMIS,12,5
3677a8b8,NMIE,12,5
e2bbeac1,NMGE,16,5
3f5e5830,NMGP,16,5
c8cad8f6,NMOE,08,5
4731df5c,NM3P,08,0
3fd0604d,NM3E,08,0
88c83511,NMSJ,08,0
635adeca,NM4P,16,0
b7f46516,NM4E,16,0
ea21015a,NMYP,16,0
51a07fd9,NMYE,16,0
bc04c62f,NMKP,12,0
50a99d60,NMKE,12,0
0f323d00,NMKE,12,0
bc966b10,NMRP,12,5
bea43300,NMRJ,12,5
1dc1c812,NMRE,12,5
e34c7060,NP9E,12,0
3502dbbe,NGMP,16,0
3bd9059a,NG5P,16,0
4180c296,NG5E,16,0
c44de11c,NH5P,12,0
ee8288d4,NH5E,12,0
ce361f92,NNME,04,0
02bf7c2d,NN2E,12,0
76e79cea,N9CP,12,0
3d8eb950,N9CE,12,0
a7cc4ce2,NCKE,16,4
7e6d00ae,NXGP,12,0
714cf532,NXGE,12,0
aed2700a,NBAJ,12,0
a245d737,NBAE,12,0
eab083b8,NB2E,12,0
41093b73,NB2J,12,0
a4973197,NWZP,16,0
cbb4b730,NWZE,16,0
9f95485e,NJAP,16,0
163dadf9,NJAE,16,0
90e4275b,NB9P,12,0
559cd6b1,NB9E,12,0
0e4b944c,NNLP,16,0
7c3bc95e,NNLE,16,0
a316df37,N9BP,16,0
9be0a7ac,N9BE,16,0
04b75ccc,NBAP,12,0
588e60e8,NB2P,12,0
a4e378f4,NSOE,16,0
a10a86af,NEVJ,32,6
983263d7,NRIP,12,1
528a07fa,NRIE,12,1
9bcd670f,NBZE,16,0
5d1907f7,NSZE,16,0
7f471773,NBIE,16,0
18eeb41b,NFBE,16,0
ceef5c29,NQBP,12,0
8f54f999,NQBE,12,0
6d849e17,NQCE,12,0
34a21417,NQ8P,08,0
abf0e8f2,NQ8E,08,0
f688bdf3,NQ9P,12,0
44496b26,NQ9E,12,0
f3b2aa4d,N9HP,12,0
e5df2afe,N9HE,12,0
1ee678fe,NHOE,12,0
8c0c9669,NHLP,12,0
49d86c00,NHLE,12,0
572060e0,NH9P,12,0
75f75b9d,NH9E,12,0
e272867e,NHOP,12,0
6a1eb795,NNCE,16,0
8c7c2dca,NHBJ,08,0
04c9d3b1,NALJ,16,1
13ccb98d,NALJ,16,1
433bd4a5,NALJ,16,1
03db0407,NALJ,16,1
64051ad3,NALJ,16,1
9afbfcaf,NCEP,32,0
0916ab13,NCED,32,0
d7467294,NCEE,32,0
a6800ec0,NUTJ,16,0
7b870026,NTDP,16,0
1d4a8659,NTDE,16,0
d9fe9ee7,NOFP,16,0
1a45c5ab,NOFE,16,0
845b8711,NOBJ,40,1
a05aea85,NOBE,40,1
5a805c2e,NHNP,08,0
9e98fce8,NHNJ,08,0
2d777652,NHNE,08,0
ac72a1c7,NOMJ,16,0
fb96f166,NWDP,16,0
42d06e32,NPCJ,12,0
85b3ab37,NMQP,64,4
a7f5cd7e,NMQE,40,4
f00c5053,NYPP,12,0
f27114e6,NYPE,12,0
a33146e0,NPPJ,12,0
86cc80b5,NUBJ,32,0
a1d6eb5b,NCRP,08,5
c1e57337,NCRE,08,5
7718a714,NPDP,32,6
639c0da9,NPDJ,32,6
68446ad4,NPDE,32,6
4c1677f7,NPDE,32,6
6b5ff959,NEAP,16,5
7cdfcdaa,NEAE,16,5
3f6245ae,NPGJ,16,5
c902e57c,NPWP,08,5
3d3a84a9,NPWJ,08,5
728807e7,NPWE,08,5
a091bd56,NPFJ,16,4
3139189c,CPSJ,16,4
40aa4874,CP2J,32,4
cbc3b935,NP3J,64,4
75839254,NPNP,32,4
c3aa0074,NPNF,32,4
ac543150,NPND,32,4
8b9c598f,NPNE,32,4
cdea6d4c,NPFU,16,4
f824a057,NPFP,16,4
ec843586,NPFF,16,4
10c27b3c,NPFD,16,4
63f6058a,NPFI,16,4
371b787f,NPFS,16,4
86a69756,NPFE,16,4
e22a00d0,NPHE,16,4
dc57508d,NPOP,32,4
da889668,NPOP,32,4
5dd92d4c,NPOF,32,4
9f22a945,NPOD,32,4
f155c465,NPOI,32,4
f02cd5eb,NPOS,32,4
72f66f05,NPOE,32,4
72b552e3,NPOE,32,4
6b3096c4,NP3P,64,4
e2a78066,NP3F,64,4
1146a43a,NP3D,64,4
283e7641,NP3S,64,4
a9998e09,NP3E,64,4
8dd735ef,NPXE,12,0
aec21c28,NPLJ,08,0
83590247,NPUP,12,0
a5033311,NPUE,12,0
9514da0a,NPQE,08,0
81cda888,NPMP,16,0
1f5907f9,NKMJ,08,0
d59d2794,NPTJ,12,0
355ff9de,NPYJ,08,0
ea837423,NPBJ,08,0
28c10844,NQKP,12,0
761f39d1,NQKE,12,0
82beca21,NQ2P,12,0
e6b34387,NQ2E,12,0
d75b45c6,NETE,16,0
ba73a7e4,NMGD,16,5
483129aa,NKRP,12,0
b9e53b06,NKRJ,12,0
ffa625fe,NRAJ,08,0
3edec7b0,NWQE,12,0
cdc458ec,NRPP,12,0
211119dd,NRPE,12,0
fa6e097b,N2PP,12,0
7614ee0d,N2PE,12,0
dd4fa798,NRTP,08,0
2315fea7,NRTE,08,0
169a5037,NY2P,32,0
02bb4409,NY2E,32,0
927ce621,NFQE,08,0
81d13a11,NRVP,12,0
fc0c86d0,NRVE,12,0
a69df7b3,NRDP,32,0
2a554048,NRDE,32,0
052a0e04,N22E,32,0
7c8ee011,NREP,64,1
848fbc0d,NREE,64,1
3c664a7b,NROP,32,0
600b3988,NROE,32,0
997ed5af,NRRP,12,0
e4337b92,NRRE,12,0
3b0f8061,NR7J,32,0
23bf4956,NRXP,08,0
b2cbae58,NRXE,08,0
7de5d20d,NSUP,12,5
e0399f23,NSUE,12,5
61eaee83,NRHJ,32,0
dd9ae3a8,NRZP,32,6
3c2c2d1c,NRZE,32,6
0a17da7b,NWKD,16,0
23aed3a2,NRGD,16,0
a87faf82,NRGE,16,0
3338b7c8,NRGP,16,0
cd74b07e,NRKP,16,0
a9cc2419,NRKE,16,0
30f21f89,NR2P,12,0
9eb14ea8,NR2E,12,0
4e37b6f2,NCSP,08,0
22916735,NCSE,08,0
01794d62,NSHJ,08,0
e064962a,NSFP,08,0
3e20070b,NSFE,08,0
e63b86c5,NRUP,12,0
10941439,NRUE,12,0
0d737e6f,NSYP,16,0
39068228,NSYE,16,0
cc083e34,NDCJ,12,0
8d230306,NSDP,32,0
6812d3a7,NSDF,32,0
eaf6add1,NSDD,32,0
5e20cc63,NSDE,32,0
eedc0bea,NSGX,16,0
ff7d7df0,NSGP,16,0
69983cc3,NSGE,16,0
576915d4,NIBJ,16,0
e892ed43,NTOJ,12,0
deac787f,NT3J,32,0
57767e45,NS2J,12,0
213bf381,NSKJ,08,0
30ea3fd7,NSNJ,12,0
5619a70d,NSKP,08,0
020fb906,NSKE,08,0
3a0b6214,NK2P,16,5
d0dc8a8e,NK2E,16,5
fc73fb79,NSAJ,08,5
b2c3e123,NDTP,16,0
5711e197,NDTD,16,0
7d666b9e,NDTE,16,0
ac1628eb,NCYP,16,0
6b6b1d09,NCYE,16,0
296e3525,NPRP,16,0
ccdd322a,NPRE,16,0
8cb4b948,NDKJ,08,0
60f7ff8e,NIVE,08,0
63042e36,NSVP,08,5
dcec9f8a,NSVJ,08,5
a606e8ae,NSVE,08,5
696cc2a4,NSLE,32,0
411142a7,NFXJ,12,5
b1fcaa9c,NFXE,12,5
b1b5fc46,NFXE,12,5
7ee5f51d,NS6J,12,5
ea650def,NS6E,12,5
964506ce,NJFJ,32,4
6289645f,NRSP,16,5
c88e5638,NRSP,16,5
83c225cc,NRSE,16,5
f0a191bf,NSWP,12,5
3c0837b3,NSWE,12,5
b0540688,NSWE,12,5
e8727549,NSWE,12,5
ee7643b6,NRSJ,16,5
7ce71426,NSWJ,12,5
029104fd,NNAP,32,5
99dee3c0,NNAE,32,5
e0f46629,NEPP,32,6
97c155c5,NEPJ,32,6
c53c1035,NEPE,32,6
2639dae2,NSQP,32,4
4e4c7ec9,NSQE,32,4
056d2218,NSCP,12,5
7720e5f3,NSCE,12,5
3438b1af,NR3E,12,0
5006dc88,NB6J,12,0
ba2d8b2e,NBWJ,08,0
f6ccd04a,NBWE,08,0
03048de6,NSMP,08,5
dd801954,NSMJ,08,5
3ce60709,NSME,08,5
a1e15117,NSMJ,08,5
8c9216c1,NSSJ,16,0
85df2771,NS4J,32,0
e96779fa,NALU,16,1
45a91cb1,NALP,32,1
eb97929e,NALE,16,1
0f879a70,NLCJ,04,0
cb5482ec,NSXP,16,0
094e2a48,NSXE,16,0
bca4ff8c,NSPP,08,0
437e3677,NSPE,08,0
4cd21372,NPZJ,08,0
2c02621f,NPZJ,08,0
06bd781b,NPZJ,08,0
0712c306,NTXP,12,0
7bd20931,NWKF,16,0
f128cd17,NT6J,08,0
7cb31b0f,NTPP,08,5
70a3a5ce,NTPE,08,5
135c8eb0,NL2X,12,0
d82d5736,NT9P,16,4
68c2ac8f,NT9E,16,4
e6bd65d5,NTUJ,08,0
9ea8a3b8,NTJP,12,5
6d685b83,NTJE,12,5
4b71e083,NR6P,16,0
5d73e788,NR6D,16,0
53b0cc13,NR6E,16,0
b4322403,NTTP,16,0
1c04ba12,NTTE,16,0
39e4f766,NTFP,12,0
f5c1b64f,NTFE,12,0
6182a092,NTFE,12,0
a1207132,NTQP,16,0
80aa83f3,NTQE,16,0
bae57ea7,NGBP,16,0
09b2cda1,NGBJ,16,0
6eebc26a,NGBE,16,0
0cc70580,NRCP,12,5
81aafc2b,NRCJ,12,5
f3e0ff21,NRCE,12,5
40b3bb21,NTRP,08,0
c6707cd6,NTRJ,08,0
137287f5,NGRE,08,0
cb294d39,NL2P,12,0
aa136e07,NL2J,12,0
914cf9c4,NL2E,12,0
59574cb9,NTHP,12,0
fb4bea9a,NTHF,12,0
c5e4c89f,NTHD,12,0
b9570841,NTHE,12,0
338f1d45,NTBJ,12,5
85138b5a,NOHE,16,5
785dd0f8,N3PE,16,0
ca2e5e49,NGUJ,32,5
e8525687,NTUP,08,0
c2353283,NTUP,08,0
312af877,NTUP,08,0
64631ff9,NTUD,08,0
26c4f597,NTUE,08,0
7f2476f4,NTUE,08,0
8c3bbc00,NTUE,08,0
b937874f,NRWD,08,0
82b1e116,NRWP,08,0
422872a2,NRWE,08,0
4e29b234,NTYP,12,0
1febde32,NT2X,32,0
e2d34bfe,NT2P,32,0
c07877b6,NT2D,32,0
8d5b9bd0,NTYE,12,0
ff5e7636,NT2E,32,0
98d3114c,NTKP,32,0
cb297224,NTKE,32,0
bf0c1291,NSBP,12,0
bfbcc038,NSBE,12,0
50cbe8a6,NIRJ,08,0
0735d7a2,NVLP,12,5
02475a01,NVYJ,08,5
4803075e,NVLE,08,5
0e9bb6d6,NV8P,08,0
11d23ab3,NV8F,08,0
17f63c3f,NV8D,08,0
330b73e6,NV8E,08,0
691aa971,NVGP,12,0
0293203f,NVGE,12,0
097f139f,NT2J,32,0
aae15243,NVCP,04,0
620de0b7,NVCE,04,0
9a6fb0bc,NVRP,04,0
ad628ded,NVRE,04,0
f620835d,NA2J,32,1
e6651803,NVPJ,16,1
6858759a,NWLP,16,5
6cb097b3,NWLP,16,5
ccab08d7,NWLE,16,5
c65ee122,NWLE,16,5
c73010c8,NWAP,12,0
ffacf993,NWAE,12,0
fb289893,NWRP,08,5
6c93ff83,NWRJ,08,5
74a7b725,NWRE,08,5
394948c4,NWRE,08,5
90044c4b,NWRJ,08,5
6f6dc53d,NW8P,08,0
355fb089,NW8E,08,0
442a4f5f,NWGP,08,0
485275ed,NWGJ,08,0
9781f88d,NWGE,08,0
c2678971,NWGE,08,0
5dcc2e4e,NWVE,32,0
864e066e,NWMP,16,0
f1f9b6eb,NWME,16,0
455b0830,NW3E,12,0
37f358eb,NWNP,12,0
dfbfc61f,NWNE,12,0
a74da07a,NWNE,12,0
8af0f964,NW2P,16,1
54cbaaa8,NW2E,16,1
eddc5b06,NWTP,08,0
bad08218,NWTJ,04,0
50cd1f71,NWTE,08,0
8d3efa8d,NWFE,04,0
d6136dc5,NWCJ,08,5
d35360b0,NWDJ,16,0
64c817c5,NWDE,16,0
38111048,NWPP,08,0
4888d0fe,NWPE,08,0
5e8fc436,NJ2J,08,0
79f483f7,N8WP,12,0
13930c26,N8WE,12,0
76151df6,NWOP,16,0
5e4acbfa,NWOE,16,0
6bfff27b,NWUP,12,5
5471ae3b,NADE,12,5
90a0b609,NWWP,12,0
2fbb5507,NWWE,12,0
804fe494,NTIP,32,0
ea5d8359,NTID,32,0
7a4b3686,NTIE,32,0
b79bddd8,NW4P,32,4
43ba9e7e,NW4P,32,4
b33f44f0,NW4E,32,4
baceea13,NW4E,32,4
09d710c7,NWXP,32,1
c2034d24,NWXJ,32,1
0b50b4c6,NWXE,32,1
d3932f88,NXFP,12,0
7da93999,NXFE,12,0
4538c41a,NYKJ,32,0
4f44a9ef,NYSJ,16,6
f9ffc760,NYSP,16,6
a1453e0d,NYSE,16,6
b69d3068,NTMJ,08,5
b9bf76df,NZSJ,32,4
0d33e1db,NZSJ,32,4
356c2e19,NZSJ,32,4
d423e8b0,CZLJ,32,1
26e73887,CZLJ,32,1
2b2721ba,CZLJ,32,1
8c5b90c1,CZLJ,32,1
1c6ce8cb,CZLJ,32,1
122ff261,CZLJ,32,1
756ba26d,NMZJ,12,0

2
sd/snes.txt Normal file
View File

@ -0,0 +1,2 @@
A172,24,48
B094,48,96