Merge pull request #824 from partlyhuman/support-casio-loopy

Casio Loopy Adapter
This commit is contained in:
sanni 2023-07-11 09:53:04 +02:00 committed by GitHub
commit 74e46f4322
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 25438 additions and 47 deletions

2
.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
# Essential that the "database" files on the SD card use CRLF line endings
sd/*.txt text eol=crlf

7
.gitignore vendored
View File

@ -28,3 +28,10 @@ fp-info-cache
*.old
*.old.*
*gerber/
# MacOS
.DS_Store
._*
# ODS files
.~lock*

View File

@ -250,6 +250,7 @@ void print_STR(byte string_number, boolean newline) {
#define mode_SUPRACAN 32
#define mode_MSX 33
#define mode_POKE 34
#define mode_LOOPY 35
// optimization-safe nop delay
#define NOP __asm__ __volatile__("nop\n\t")
@ -840,11 +841,12 @@ static const char modeItem18[] PROGMEM = "Fairchild Channel F";
static const char modeItem19[] PROGMEM = "Super A'can";
static const char modeItem20[] PROGMEM = "MSX";
static const char modeItem21[] PROGMEM = "Pokemon Mini (3V)";
static const char modeItem22[] PROGMEM = "Flashrom Programmer";
static const char modeItem23[] PROGMEM = "Self Test (3V)";
static const char modeItem24[] PROGMEM = "About";
//static const char modeItem25[] PROGMEM = "Reset"; (stored in common strings array)
static const char* const modeOptions[] PROGMEM = { modeItem1, modeItem2, modeItem3, modeItem4, modeItem5, modeItem6, modeItem7, modeItem8, modeItem9, modeItem10, modeItem11, modeItem12, modeItem13, modeItem14, modeItem15, modeItem16, modeItem17, modeItem18, modeItem19, modeItem20, modeItem21, modeItem22, modeItem23, modeItem24, string_reset2 };
static const char modeItem22[] PROGMEM = "Casio Loopy";
static const char modeItem23[] PROGMEM = "Flashrom Programmer";
static const char modeItem24[] PROGMEM = "Self Test (3V)";
static const char modeItem25[] PROGMEM = "About";
//static const char modeItem26[] PROGMEM = "Reset"; (stored in common strings array)
static const char* const modeOptions[] PROGMEM = { modeItem1, modeItem2, modeItem3, modeItem4, modeItem5, modeItem6, modeItem7, modeItem8, modeItem9, modeItem10, modeItem11, modeItem12, modeItem13, modeItem14, modeItem15, modeItem16, modeItem17, modeItem18, modeItem19, modeItem20, modeItem21, modeItem22, modeItem23, modeItem24, modeItem25, string_reset2 };
// All included slots
void mainMenu() {
@ -1036,8 +1038,15 @@ void mainMenu() {
break;
#endif
#ifdef enable_FLASH
#ifdef enable_LOOPY
case 21:
setup_LOOPY();
loopyMenu();
break;
#endif
#ifdef enable_FLASH
case 22:
#ifdef ENABLE_VSELECT
setup_FlashVoltage();
#endif
@ -1046,16 +1055,16 @@ void mainMenu() {
#endif
#ifdef enable_selftest
case 22:
case 23:
selfTest();
break;
#endif
case 23:
case 24:
aboutScreen();
break;
case 24:
case 25:
resetArduino();
break;
@ -1112,7 +1121,8 @@ static const char* const consoles80Options[] PROGMEM = { consoles80Item1, consol
// 90s Consoles submenu
static const char consoles90Item1[] PROGMEM = "Super A'can";
static const char* const consoles90Options[] PROGMEM = { consoles90Item1, string_reset2 };
static const char consoles90Item2[] PROGMEM = "Casio Loopy";
static const char* const consoles90Options[] PROGMEM = { consoles90Item1, consoles90Item2, string_reset2 };
// Handhelds submenu
static const char handheldsItem1[] PROGMEM = "Virtual Boy";
@ -1353,7 +1363,13 @@ void consoles90Menu() {
break;
#endif
#ifdef enable_LOOPY
case 1:
loopyMenu();
break;
#endif
case 2:
resetArduino();
break;
@ -3596,6 +3612,12 @@ void loop() {
pokeMenu();
}
#endif
#ifdef enable_LOOPY
else if (mode == mode_LOOPY) {
loopyMenu();
}
#endif
else {
display_Clear();
println_Msg(F("Menu Error"));

View File

@ -235,6 +235,13 @@
/****/
/* [ Casio Loopy -------------------------------------------------- ]
*/
//#define enable_LOOPY
/****/
/*==== FIRMWARE OPTIONS ===========================================*/
/* [ LCD: Background Color ---------------------------------------- ]

736
Cart_Reader/LOOPY.ino Normal file
View File

@ -0,0 +1,736 @@
//******************************************
// CASIO LOOPY MODULE
//******************************************
// Loopy
// Cartridge Pinout
// 90P 2.1mm pitch connector
//
// +--------+
// +5V -| 1 90 |- D11
// -| 2 89 |- +5V
// -| 3 88 |- D9
// -| 4 87 |-
// -| 5 86 |- D7
// -| 6 85 |- D5
// -| 7 84 |- D15
// -| 8 83 |- D13
// RAMCS1 -| 9 82 |- D12
// -| 10 81 |- D1
// RAMWE -| 11 80 |-
// -| 12 79 |-
// GND -| 13 78 |- A2
// +5V -| 14 77 |- A4
// -| 15 76 |- A19
// -| 16 75 |- GND
// -| 17 74 |- A18
// -| 18 73 |- A16
// -| 19 72 |- A17
// -| 20 71 |- A14
// -| 21 70 |- A5
// A12 -| 22 69 |- A7
// A10 -| 23 68 |- A9
// A8 -| 24 67 |- A11
// A6 -| 25 66 |-
// A13 -| 26 65 |-
// A15 -| 27 64 |-
// A20 -| 28 63 |-
// +5V -| 29 62 |-
// A3 -| 30 61 |-
// A21 -| 31 60 |- CLK
// A1 -| 32 59 |-
// A0 -| 33 58 |-
// -| 34 57 |- +5V
// D0 -| 35 56 |- OE
// RESET -| 36 55 |-
// D2 -| 37 54 |- ROMCE
// D3 -| 38 53 |-
// D14 -| 39 52 |-
// D4 -| 40 51 |-
// D6 -| 41 50 |-
// D8 -| 42 49 |-
// -| 43 48 |-
// D10 -| 44 47 |- GND
// GND -| 45 46 |-
// +--------+
//
// * Blank pins have various uses depending on cartridge but are not necessary for dumping.
// IMPORTANT: All data are stored as BIG-ENDIAN. Many ROM dumps online are little endian.
// See https://github.com/kasamikona/Loopy-Tools/blob/master/ROM%20Structure.md
//
// By @partlyhuman
// Special thanks to @kasamikona
#ifdef enable_LOOPY
// SH-1 memory map locations, ROM starts here
const uint32_t LOOPY_MAP_ROM_ZERO = 0x0E000000;
const uint32_t LOOPY_MAP_SRAM_ZERO = 0x02000000;
// Control pins
const int LOOPY_ROMCE = 42;
const int LOOPY_OE = 43;
const int LOOPY_RAMWE = 6;
const int LOOPY_RAMCS1 = 7;
const int LOOPY_RESET = A7;
// The internal checksum read from the cart header at 08h, will be checked against an actual sum
uint32_t loopyChecksum;
uint32_t loopyChecksumStart;
uint32_t loopyChecksumEnd;
char loopyRomNameLong[64];
//******************************************
// SETUP
//******************************************
void setup_LOOPY() {
// Request 5V
setVoltage(VOLTS_SET_5V);
// Set Address Pins to Output
// PK1-PK7, PA1-PA7, PC0-PC3, PL0-PL3
// Take whole port and unset the exceptions later
DDRK = DDRA = DDRC = DDRL = 0xFF;
// Control pins, all active low
pinMode(LOOPY_ROMCE, OUTPUT);
pinMode(LOOPY_OE, OUTPUT);
pinMode(LOOPY_RAMWE, OUTPUT);
pinMode(LOOPY_RAMCS1, OUTPUT);
pinMode(LOOPY_RESET, OUTPUT);
digitalWrite(LOOPY_ROMCE, HIGH);
digitalWrite(LOOPY_OE, HIGH);
digitalWrite(LOOPY_RAMWE, HIGH);
digitalWrite(LOOPY_RAMCS1, HIGH);
digitalWrite(LOOPY_RESET, HIGH);
// Set Pins (D0-D15) to Input
dataIn_LOOPY();
getCartInfo_LOOPY();
mode = mode_LOOPY;
}
//******************************************
// MENU
//******************************************
// Base Menu
static const char loopyMenuItem0[] PROGMEM = "Refresh Cart";
static const char loopyMenuItem1[] PROGMEM = "Read ROM";
static const char loopyMenuItem2[] PROGMEM = "Read SRAM";
static const char loopyMenuItem3[] PROGMEM = "Write SRAM";
static const char loopyMenuItem4[] PROGMEM = "Format SRAM";
static const char* const menuOptionsLOOPY[] PROGMEM = { loopyMenuItem0, loopyMenuItem1, loopyMenuItem2, loopyMenuItem3, loopyMenuItem4, string_reset2 };
void loopyMenu() {
convertPgm(menuOptionsLOOPY, 5);
uint8_t mainMenu = question_box(F("CASIO LOOPY MENU"), menuOptions, 5, 0);
display_Clear();
display_Update();
bool waitForInput = false;
switch (mainMenu) {
case 0:
setup_LOOPY();
break;
case 1:
// Read ROM
sd.chdir("/");
readROM_LOOPY();
sd.chdir("/");
waitForInput = true;
break;
case 2:
// Read SRAM
sd.chdir("/");
println_Msg(F("Reading SRAM..."));
display_Update();
readSRAM_LOOPY();
sd.chdir("/");
waitForInput = true;
break;
case 3:
// Write SRAM
// Change working dir to root
sd.chdir("/");
fileBrowser(F("Select SAV file"));
display_Clear();
writeSRAM_LOOPY();
writeErrors = verifySRAM_LOOPY();
if (writeErrors == 0) {
println_Msg(F("SRAM verified OK"));
display_Update();
} else {
print_STR(error_STR, 0);
print_Msg(writeErrors);
print_STR(_bytes_STR, 1);
print_Error(did_not_verify_STR);
}
waitForInput = true;
break;
case 4:
// Format SRAM
println_Msg(F("Formatting SRAM..."));
display_Update();
formatSRAM_LOOPY();
waitForInput = true;
break;
case 5:
// reset
resetArduino();
break;
}
#if (defined(enable_OLED) || defined(enable_LCD))
if (waitForInput) {
// Wait for user input
println_Msg(F(""));
// Prints string out of the common strings array either with or without newline
print_STR(press_button_STR, 1);
display_Update();
wait();
}
#endif
}
//******************************************
// LOW LEVEL FUNCTIONS
//******************************************
void setAddress_LOOPY(unsigned long A) {
// PK1 A0
// PK2 A1
// PK3 A21
// PK4 A3
// PK5 A20
// PK6 A15
// PK7 A13
PORTK = (bitRead(A, 0) << 1)
| (bitRead(A, 1) << 2)
| (bitRead(A, 21) << 3)
| (bitRead(A, 3) << 4)
| (bitRead(A, 20) << 5)
| (bitRead(A, 15) << 6)
| (bitRead(A, 13) << 7);
// PA1 A2
// PA2 A4
// PA3 A19
// PA4 A18
// PA5 A16
// PA6 A17
// PA7 A14
PORTA = (bitRead(A, 2) << 1)
| (bitRead(A, 4) << 2)
| (bitRead(A, 19) << 3)
| (bitRead(A, 18) << 4)
| (bitRead(A, 16) << 5)
| (bitRead(A, 17) << 6)
| (bitRead(A, 14) << 7);
// PC0 A6
// PC1 A8
// PC2 A10
// PC3 A12
PORTC = (bitRead(A, 6))
| (bitRead(A, 8) << 1)
| (bitRead(A, 10) << 2)
| (bitRead(A, 12) << 3);
// CAUTION PORTL is shared, writing to PORTL indiscriminately will mess with CE/OE
// D42 PL7 CE
// D43 PL6 OE
// D44 PL5
// D45 PL4
// D46 PL3 A11
// D47 PL2 A9
// D48 PL1 A7
// D49 PL0 A5
digitalWrite(46, bitRead(A, 11));
digitalWrite(47, bitRead(A, 9));
digitalWrite(48, bitRead(A, 7));
digitalWrite(49, bitRead(A, 5));
// PORTL = (bitRead(A, 5))
// | (bitRead(A, 7) << 1)
// | (bitRead(A, 9) << 2)
// | (bitRead(A, 11) << 3);
}
uint16_t getWord_LOOPY() {
// A8 PK0 D0
// D22 PA0 D1
// A6 PF6 D2
// A5 PF5 D3
// A3 PF3 D4
// D40 PG1 D5
// A2 PF2 D6
// D41 PG0 D7
// A1 PF1 D8
// D3 PE5 D9
// A0 PF0 D10
// D2 PE4 D11
// D14 PJ1 D12
// D15 PJ0 D13
// A4 PF4 D14
// D4 PG5 D15
return bitRead(PINK, 0)
| (bitRead(PINA, 0) << 1)
| (bitRead(PINF, 6) << 2)
| (bitRead(PINF, 5) << 3)
| (bitRead(PINF, 3) << 4)
| (bitRead(PING, 1) << 5)
| (bitRead(PINF, 2) << 6)
| (bitRead(PING, 0) << 7)
| (bitRead(PINF, 1) << 8)
| (bitRead(PINE, 5) << 9)
| (bitRead(PINF, 0) << 10)
| (bitRead(PINE, 4) << 11)
| (bitRead(PINJ, 1) << 12)
| (bitRead(PINJ, 0) << 13)
| (bitRead(PINF, 4) << 14)
| (bitRead(PING, 5) << 15);
}
uint8_t getByte_LOOPY() {
return bitRead(PINK, 0)
| (bitRead(PINA, 0) << 1)
| (bitRead(PINF, 6) << 2)
| (bitRead(PINF, 5) << 3)
| (bitRead(PINF, 3) << 4)
| (bitRead(PING, 1) << 5)
| (bitRead(PINF, 2) << 6)
| (bitRead(PING, 0) << 7);
}
void setByte_LOOPY(uint8_t D) {
// Since D lines are spread among so many ports, this is far more legible, and only used for SRAM
digitalWrite(A8, bitRead(D, 0));
digitalWrite(22, bitRead(D, 1));
digitalWrite(A6, bitRead(D, 2));
digitalWrite(A5, bitRead(D, 3));
digitalWrite(A3, bitRead(D, 4));
digitalWrite(40, bitRead(D, 5));
digitalWrite(A2, bitRead(D, 6));
digitalWrite(41, bitRead(D, 7));
}
byte readByte_LOOPY(unsigned long myAddress) {
setAddress_LOOPY(myAddress);
// 100ns MAX
NOP;
NOP;
NOP;
NOP;
NOP;
NOP;
NOP;
return getByte_LOOPY();
}
void writeByte_LOOPY(unsigned long myAddress, byte myData) {
setAddress_LOOPY(myAddress);
digitalWrite(LOOPY_RAMWE, LOW);
// tWHZ 35
NOP;
NOP;
dataOut_LOOPY();
setByte_LOOPY(myData);
// tWP 60
NOP;
NOP;
NOP;
NOP;
digitalWrite(LOOPY_RAMWE, HIGH);
dataIn_LOOPY();
}
word readWord_LOOPY(unsigned long myAddress) {
setAddress_LOOPY(myAddress);
digitalWrite(LOOPY_ROMCE, LOW);
digitalWrite(LOOPY_OE, LOW);
// 16mhz = 62.5ns
NOP;
NOP;
word tempWord = getWord_LOOPY();
digitalWrite(LOOPY_ROMCE, HIGH);
digitalWrite(LOOPY_OE, HIGH);
return tempWord;
}
// Switch data pins to write
void dataOut_LOOPY() {
// // PA0
// DDRA |= 0x01;
// // PK0
// DDRK |= 0x01;
// // PG0, PG1, PG5 (rest unused?)
// DDRG = 0xFF;
// // PJ0-1 (rest unused?)
// DDRJ = 0xFF;
// // PE4-PE5 (rest unused?)
// DDRE = 0xFF;
// // PF0-PF6
// DDRF |= 0b0111111;
// Only bothering to change lower bits since we never write words just bytes
pinMode(A8, OUTPUT);
pinMode(22, OUTPUT);
pinMode(A6, OUTPUT);
pinMode(A5, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(40, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(41, OUTPUT);
// pinMode(A1, OUTPUT);
// pinMode(3, OUTPUT);
// pinMode(A0, OUTPUT);
// pinMode(2, OUTPUT);
// pinMode(14, OUTPUT);
// pinMode(15, OUTPUT);
// pinMode(A4, OUTPUT);
// pinMode(4, OUTPUT);
}
// Switch data pins to read
void dataIn_LOOPY() {
// // PA0
// DDRA &= ~0x01;
// // PK0
// DDRK &= ~0x01;
// // PG0, PG1, PG5 (rest unused?)
// DDRG = 0x00;
// // PJ0-1 (rest unused?)
// DDRJ = 0x00;
// // PE4-PE5 (rest unused?)
// DDRE = 0x00;
// // PF0-PF6
// DDRF &= ~0b0111111;
pinMode(A8, INPUT);
pinMode(22, INPUT);
pinMode(A6, INPUT);
pinMode(A5, INPUT);
pinMode(A3, INPUT);
pinMode(40, INPUT);
pinMode(A2, INPUT);
pinMode(41, INPUT);
pinMode(A1, INPUT);
pinMode(3, INPUT);
pinMode(A0, INPUT);
pinMode(2, INPUT);
pinMode(14, INPUT);
pinMode(15, INPUT);
pinMode(A4, INPUT);
pinMode(4, INPUT);
}
//******************************************
// CART INFO
//******************************************
// A little different than many games, loopy DB stores the checksum present in the header, so we can determine the rom name before saving, without renaming
bool setRomName_LOOPY(const char* database, char* crcStr, int stripExtensionChars = 4) {
char gamename[96];
char crc_search[9];
bool found;
sd.chdir();
if (!myFile.open(database, O_READ)) {
return false;
}
while (myFile.available()) {
get_line(gamename, &myFile, sizeof(gamename));
get_line(crc_search, &myFile, sizeof(crc_search));
skip_line(&myFile); //Skip every 3rd line
if (strcmp(crc_search, crcStr) == 0) {
found = true;
strlcpy(loopyRomNameLong, gamename, strlen(gamename) - stripExtensionChars + 1);
strcpy(romName, loopyRomNameLong);
break;
}
}
myFile.close();
return found;
}
void getCartInfo_LOOPY() {
display_Clear();
// Set control
dataIn_LOOPY();
// First word after header stored as 32-bit pointer at 0h, final word (inclusive) at 4h
// based on SH-1 memory mapped location of ROM (shift to rebase on zero)
loopyChecksumStart = (((uint32_t)readWord_LOOPY(0x0) << 16) | (uint32_t)readWord_LOOPY(0x2)) - LOOPY_MAP_ROM_ZERO;
loopyChecksumEnd = (((uint32_t)readWord_LOOPY(0x4) << 16) | (uint32_t)readWord_LOOPY(0x6)) - LOOPY_MAP_ROM_ZERO;
// Full cart size DOES include the header, don't subtract it off :)
cartSize = loopyChecksumEnd + 2;
// SRAM first and last byte locations stored at 10h and 14h, based on SH-1 memory mapped location of SRAM
uint32_t loopySramStart = (((uint32_t)readWord_LOOPY(0x10) << 16) | (uint32_t)readWord_LOOPY(0x12)) - LOOPY_MAP_SRAM_ZERO;
uint32_t loopySramEnd = (((uint32_t)readWord_LOOPY(0x14) << 16) | (uint32_t)readWord_LOOPY(0x16)) - LOOPY_MAP_SRAM_ZERO;
sramSize = loopySramEnd - loopySramStart + 1;
// TODO sanity check these values
// Get internal checksum from header
loopyChecksum = ((uint32_t)readWord_LOOPY(0x8) << 16) | (uint32_t)readWord_LOOPY(0xA);
sprintf(checksumStr, "%08lX", loopyChecksum);
// Look up in database
strcpy(loopyRomNameLong, "LOOPY");
strcpy(romName, loopyRomNameLong);
setRomName_LOOPY("loopy.txt", checksumStr);
println_Msg(F("Cart Info"));
println_Msg(F(" "));
print_Msg(F("Name: "));
println_Msg(loopyRomNameLong);
print_Msg(F("Checksum: "));
println_Msg(checksumStr);
print_Msg(F("Size: "));
print_Msg(cartSize * 8 / 1024 / 1024);
println_Msg(F(" MBit"));
print_Msg(F("Sram: "));
print_Msg(sramSize * 8 / 1024);
println_Msg(F(" KBit"));
println_Msg(F(" "));
#if (defined(enable_OLED) || defined(enable_LCD))
// Wait for user input
// Prints string out of the common strings array either with or without newline
print_STR(press_button_STR, 1);
display_Update();
wait();
#endif
}
//******************************************
// READ CODE
//******************************************
void readROM_LOOPY() {
dataIn_LOOPY();
sprintf(fileName, "%s.bin", romName);
EEPROM_readAnything(0, foldern);
sprintf(folder, "LOOPY/ROM/%d", foldern);
sd.mkdir(folder, true);
sd.chdir(folder);
display_Clear();
print_STR(saving_to_STR, 0);
print_Msg(folder);
println_Msg(F("/..."));
display_Update();
foldern = foldern + 1;
EEPROM_writeAnything(0, foldern);
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
print_FatalError(sd_error_STR);
}
draw_progressbar(0, cartSize);
const size_t sdBufferSize = 512;
uint32_t sum = 0;
digitalWrite(LOOPY_ROMCE, LOW);
for (unsigned long ptr = 0; ptr < cartSize;) {
word myWord = readWord_LOOPY(ptr);
// aggregate checksum over 16-bit words, starting at 80h, this address is stored in header but never varies
if (ptr >= loopyChecksumStart) {
sum += myWord;
}
// Store in buffer
sdBuffer[ptr++ % sdBufferSize] = (myWord >> 8) & 0xFF;
sdBuffer[ptr++ % sdBufferSize] = myWord & 0xFF;
// Flush when buffer full
if (ptr % sdBufferSize == 0) {
myFile.write(sdBuffer, sdBufferSize);
blinkLED();
// Only update progress bar every 64kb
if (ptr % 0x10000 == 0) {
draw_progressbar(ptr, cartSize);
}
}
}
// TODO this assumes size is divisible by 512
myFile.close();
digitalWrite(LOOPY_ROMCE, HIGH);
// Instead of the CRC32, check the internal integrity based on the header checksum
print_Msg(F("Header sum: "));
println_Msg(checksumStr);
print_Msg(F("Actual sum: "));
char calculatedChecksumStr[9];
sprintf(calculatedChecksumStr, "%08lX", sum);
println_Msg(calculatedChecksumStr);
if (sum == loopyChecksum) {
println_Msg(F("INTEGRITY OK :)"));
} else {
println_Msg(F("INTEGRITY FAIL! Bad dump"));
}
display_Update();
}
//******************************************
// SRAM
//******************************************
void writeSRAM_LOOPY() {
// Being nice to the SRAM and not touching the data bus except when WE is LOW
dataIn_LOOPY();
sprintf(filePath, "%s/%s", filePath, fileName);
//println_Msg(F("Writing..."));
char str[16];
sprintf(str, "Writing %ld bytes to", sramSize);
println_Msg(str);
println_Msg(filePath);
display_Update();
digitalWrite(LOOPY_ROMCE, HIGH);
digitalWrite(LOOPY_RAMCS1, LOW);
digitalWrite(LOOPY_RESET, HIGH);
digitalWrite(LOOPY_OE, LOW);
if (myFile.open(filePath, O_READ)) {
for (unsigned long currByte = 0; currByte < sramSize; currByte++) {
writeByte_LOOPY(currByte, myFile.read());
if (currByte % 512 == 0) {
blinkLED();
}
}
myFile.close();
print_STR(done_STR, 1);
display_Update();
} else {
print_FatalError(sd_error_STR);
}
digitalWrite(LOOPY_RAMCS1, HIGH);
digitalWrite(LOOPY_OE, HIGH);
dataIn_LOOPY();
}
void formatSRAM_LOOPY() {
dataIn_LOOPY();
digitalWrite(LOOPY_ROMCE, HIGH);
digitalWrite(LOOPY_RAMCS1, LOW);
digitalWrite(LOOPY_RESET, HIGH);
digitalWrite(LOOPY_OE, LOW);
for (unsigned long currByte = 0; currByte < sramSize; currByte++) {
writeByte_LOOPY(currByte, 0);
if (currByte % 512 == 0) {
blinkLED();
}
}
digitalWrite(LOOPY_RAMCS1, HIGH);
digitalWrite(LOOPY_OE, HIGH);
dataIn_LOOPY();
print_STR(done_STR, 1);
display_Update();
}
void readSRAM_LOOPY() {
dataIn_LOOPY();
sprintf(fileName, "%s.sav", romName);
EEPROM_readAnything(0, foldern);
sprintf(folder, "LOOPY/SAVE/%s/%d", romName, foldern);
sd.mkdir(folder, true);
sd.chdir(folder);
foldern = foldern + 1;
EEPROM_writeAnything(0, foldern);
if (!myFile.open(fileName, O_RDWR | O_CREAT)) {
print_FatalError(sd_error_STR);
}
digitalWrite(LOOPY_ROMCE, HIGH);
digitalWrite(LOOPY_RAMCS1, LOW);
digitalWrite(LOOPY_OE, LOW);
const size_t sdBufferSize = 512;
for (unsigned long ptr = 0; ptr < sramSize;) {
sdBuffer[ptr++ % sdBufferSize] = readByte_LOOPY(ptr);
if (ptr % sdBufferSize == 0) {
myFile.write(sdBuffer, sdBufferSize);
blinkLED();
}
}
digitalWrite(LOOPY_OE, HIGH);
digitalWrite(LOOPY_RAMCS1, HIGH);
myFile.close();
print_Msg(F("Saved to "));
print_Msg(folder);
println_Msg(F("/"));
display_Update();
}
unsigned long verifySRAM_LOOPY() {
dataIn_LOOPY();
writeErrors = 0;
digitalWrite(LOOPY_ROMCE, HIGH);
digitalWrite(LOOPY_RAMCS1, LOW);
digitalWrite(LOOPY_OE, LOW);
if (myFile.open(filePath, O_READ)) {
for (unsigned long currBuffer = 0; currBuffer < sramSize; currBuffer += 512) {
for (int currByte = 0; currByte < 512; currByte++) {
byte myByte = readByte_LOOPY(currBuffer + currByte);
sdBuffer[currByte] = myByte;
}
for (int i = 0; i < 512; i++) {
if (myFile.read() != sdBuffer[i]) {
writeErrors++;
}
}
}
myFile.close();
} else {
print_FatalError(sd_error_STR);
}
digitalWrite(LOOPY_OE, HIGH);
digitalWrite(LOOPY_RAMCS1, HIGH);
return writeErrors;
}
#endif

View File

@ -0,0 +1,216 @@
(footprint "LOOPY_EdgeConnector_Socket" (version 20221018) (generator pcbnew)
(layer "F.Cu")
(attr through_hole)
(fp_text reference "J**" (at 0 -8.6) (layer "F.SilkS")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 06747bd5-23a7-484c-b80b-aab481b0130a)
)
(fp_text value "Loopy_EdgeConnector_Socket" (at 0 7.6) (layer "F.Fab")
(effects (font (size 1 1) (thickness 0.15)))
(tstamp 3d5d3a33-edd5-4e62-bf91-f30c978a840c)
)
(fp_line (start -58 -7) (end -60 -5)
(stroke (width 0.12) (type default)) (layer "F.SilkS") (tstamp d0493910-f95e-4b68-8c07-63d9c521a5b2))
(fp_line (start 60 -5) (end 58 -7)
(stroke (width 0.12) (type default)) (layer "F.SilkS") (tstamp 667cca78-ba94-49f2-8abd-aa4b53b60091))
(fp_rect (start -60 -7) (end 60 7)
(stroke (width 0.12) (type default)) (fill none) (layer "F.SilkS") (tstamp 26e6c6a8-0208-4cbd-a8e5-0f9bfb466100))
(fp_poly
(pts
(xy 1.5 9)
(xy 0 10)
(xy -1.5 9)
)
(stroke (width 0.12) (type solid)) (fill solid) (layer "F.SilkS") (tstamp 155fa70a-7069-4363-90ad-182333d0d782))
(fp_rect (start -60 -7) (end 60 7)
(stroke (width 0.05) (type default)) (fill none) (layer "F.CrtYd") (tstamp 697d51d1-9277-46fa-b991-20c1fe4b01c9))
(pad "" np_thru_hole oval (at -55.2 0) (size 8 8) (drill 7) (layers "*.Mask")
(thermal_bridge_angle 45) (tstamp 7295b284-2a88-4792-a006-02157a96e498))
(pad "" np_thru_hole oval (at -49.2 0) (size 2 2) (drill 2) (layers "*.Mask")
(thermal_bridge_angle 45) (tstamp 57569eb1-5b76-414d-880b-e97a1fcfdd10))
(pad "" np_thru_hole oval (at 49.2 0) (size 2 2) (drill 2) (layers "*.Mask")
(thermal_bridge_angle 45) (tstamp aed6a0fa-535b-4604-814e-e0c031cabd40))
(pad "" np_thru_hole oval (at 55.2 -0.1) (size 8 8) (drill 7) (layers "*.Mask")
(thermal_bridge_angle 45) (tstamp b5eae423-3ff4-4866-bcfc-bf34ba9955a7))
(pad "1" thru_hole oval (at 46.2 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp aa10eb9b-d366-4d52-a534-b5315c368793))
(pad "2" thru_hole oval (at 44.1 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 1b3bad92-5af6-4e9f-853e-cb7a0ca1947a))
(pad "3" thru_hole oval (at 42 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 6df0be84-f5e4-4f6b-be3a-954bcad4ae4a))
(pad "4" thru_hole oval (at 39.9 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 4f9f639a-61d3-4e59-9a17-74ca72b5b3b9))
(pad "5" thru_hole oval (at 37.8 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 3dfb43db-209d-4cb9-bb31-0e0f7cb2842e))
(pad "6" thru_hole oval (at 35.7 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp ae17926d-42ce-4d8e-b233-209d3868174f))
(pad "7" thru_hole oval (at 33.6 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 5b18f7bb-bfc8-4ffb-8623-b29337433ee1))
(pad "8" thru_hole oval (at 31.5 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 3d7fb091-3fa9-4a6f-b3c8-7ef69086fed5))
(pad "9" thru_hole oval (at 29.4 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 8ae46e2d-1f34-4dd2-9b40-194bf4dc81aa))
(pad "10" thru_hole oval (at 27.3 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp eb880ead-e22d-4112-86b0-bdf824f8ae5d))
(pad "11" thru_hole oval (at 25.2 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp b917b215-e271-45eb-8653-09dcb16e35ad))
(pad "12" thru_hole oval (at 23.1 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 2e563899-d446-4358-b1cb-e361c6dc36d5))
(pad "13" thru_hole oval (at 21 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 07c8f2b7-e19a-4a9e-b75c-bbfd269f4aa9))
(pad "14" thru_hole oval (at 18.9 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 48874278-b2c7-4dab-a504-7523177d6ff8))
(pad "15" thru_hole oval (at 16.8 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 01706190-00d1-48ca-9f4a-cfb592bdf2f9))
(pad "16" thru_hole oval (at 14.7 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 8a5faade-8640-4953-a14c-2f3daf87ace9))
(pad "17" thru_hole oval (at 12.6 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 6e7b0881-aa43-4b9f-af00-987841615b50))
(pad "18" thru_hole oval (at 10.5 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp e6efbc4f-c7cc-43fa-99c7-59fc1f97db6a))
(pad "19" thru_hole oval (at 8.4 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 388d31bd-efa6-4078-ad82-0e06c64e458a))
(pad "20" thru_hole oval (at 6.3 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 1e2aa138-31b5-40ac-8021-6e97d9074c0a))
(pad "21" thru_hole oval (at 4.2 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 93d533b7-b81e-4526-a228-116bf461ddf4))
(pad "22" thru_hole oval (at 2.1 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp cfcb304e-0d0c-4b2b-8d91-d8a649c487ac))
(pad "23" thru_hole oval (at 0 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp d2f3e0f3-08ea-4ae2-b16d-c3c28c58f1c2))
(pad "24" thru_hole oval (at -2.1 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 13b5a3a0-9f2a-4bdf-a1f7-66f874b76536))
(pad "25" thru_hole oval (at -4.2 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 15bfac56-5f05-4080-9b2e-a190d08544c4))
(pad "26" thru_hole oval (at -6.3 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 3b107ef4-0dea-4fec-9aa9-1c4805e649e3))
(pad "27" thru_hole oval (at -8.4 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 81651b0d-46c1-4c2c-8601-c490d0d36886))
(pad "28" thru_hole oval (at -10.5 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp c677846c-168f-442a-a938-38e6f109e68d))
(pad "29" thru_hole oval (at -12.6 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp d5154dd2-45f3-42da-80d1-483d14eaa303))
(pad "30" thru_hole oval (at -14.7 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 62181ab5-a808-47a3-a7a6-8350c3b3e003))
(pad "31" thru_hole oval (at -16.8 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 21d5ffe3-c615-4d55-9830-f1104d1a9dd2))
(pad "32" thru_hole oval (at -18.9 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 19cff9b1-5e8b-4f38-afe4-7d65a7a991c7))
(pad "33" thru_hole oval (at -21 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 6e1de706-b2e5-46eb-a5e1-8bcc901d0c73))
(pad "34" thru_hole oval (at -23.1 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 8221f393-3ecc-473a-a2e2-164f93b190c7))
(pad "35" thru_hole oval (at -25.2 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 5a0d2aa2-c42e-48a4-bd26-be3163c90810))
(pad "36" thru_hole oval (at -27.3 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 2b00e973-02a2-41da-b79b-a3fa711bebfd))
(pad "37" thru_hole oval (at -29.4 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 6e613806-f21c-416b-b94b-7ed37aa36202))
(pad "38" thru_hole oval (at -31.5 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 7cf81623-2de7-4659-9b67-d592b8150462))
(pad "39" thru_hole oval (at -33.6 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 195d8e7c-ab13-48e3-8e79-3081789167bc))
(pad "40" thru_hole oval (at -35.7 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 0aeb4f1f-da25-44e1-ada7-0db1749dc380))
(pad "41" thru_hole oval (at -37.8 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp abc64090-c147-4c6e-98e5-69521e47028b))
(pad "42" thru_hole oval (at -39.9 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 2ba6c534-22ca-40c4-b44f-210887a48a6d))
(pad "43" thru_hole oval (at -42 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 415e0d8b-67a3-47a4-b420-3243c1100419))
(pad "44" thru_hole oval (at -44.1 -4.7) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 3f7e0c66-189d-46fe-8546-c0d867278991))
(pad "45" thru_hole oval (at -46.2 -1.55) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 75cf1d10-30de-490a-8ec9-7e9a8405148c))
(pad "46" thru_hole oval (at 46.2 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp d2559797-4f35-4281-ab49-dfd31a3cee16))
(pad "47" thru_hole oval (at 44.1 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 7b18ffe2-97a8-4ff5-9ea5-20034be47876))
(pad "48" thru_hole oval (at 42 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 0dbddf36-7943-4f62-88ee-4ed8a9b5e7ac))
(pad "49" thru_hole oval (at 39.9 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 636937d6-a57d-4f5b-9e4e-9e4033a35cf3))
(pad "50" thru_hole oval (at 37.8 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp a83468fa-7485-44bb-9228-fb68fdce4119))
(pad "51" thru_hole oval (at 35.7 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 41f59134-82a5-41d6-acf2-b8b885bf874d))
(pad "52" thru_hole oval (at 33.6 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp fb2d4f48-fb10-4a25-8765-d8ace61e2ca0))
(pad "53" thru_hole oval (at 31.5 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 1e3e038c-fd0f-4036-aa93-596ce5514e4a))
(pad "54" thru_hole oval (at 29.4 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 453fb365-7796-4e27-91d8-9ec4dcc962e5))
(pad "55" thru_hole oval (at 27.3 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp d25faacc-d530-4096-bce3-99793c9aed16))
(pad "56" thru_hole oval (at 25.2 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 7d82d0b4-b398-4907-ac73-2286b73527aa))
(pad "57" thru_hole oval (at 23.1 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp f2c597d8-9a24-4016-a721-09fac46980d2))
(pad "58" thru_hole oval (at 21 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp ed96ae2a-a801-4a12-9177-f98e8bf64474))
(pad "59" thru_hole oval (at 18.9 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp b499d3a1-c891-4510-b5b5-7608705483d7))
(pad "60" thru_hole oval (at 16.8 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp dc4dc85c-6575-46ce-88dd-cbf50629f951))
(pad "61" thru_hole oval (at 14.7 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 2f9e83bb-d1b5-40bb-bdff-b9b9d0e511b7))
(pad "62" thru_hole oval (at 12.6 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp a11b520f-fbc5-4d1f-a86c-2e4f4d24ab78))
(pad "63" thru_hole oval (at 10.5 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp d9adb757-b8d8-49e7-b2e1-cdc244d84a3e))
(pad "64" thru_hole oval (at 8.4 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 4ad5f771-a21c-46fd-b41f-a099bdae32a8))
(pad "65" thru_hole oval (at 6.3 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 2f6caf21-e7bd-41de-ad62-ff67f08a73d0))
(pad "66" thru_hole oval (at 4.2 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 1cbee837-a872-4130-b958-9d9f779f4b99))
(pad "67" thru_hole oval (at 2.1 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp d8d6ada6-8787-4467-bcc9-aad9efb8f5e8))
(pad "68" thru_hole oval (at 0 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp f96ab9c9-0ae2-4a18-95c0-30f4c433b09d))
(pad "69" thru_hole oval (at -2.1 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp d37f5e87-157a-45fe-9430-b6e9a85db6f5))
(pad "70" thru_hole oval (at -4.2 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp a8b2686a-5afc-4b4c-9732-d6c0ebeea1df))
(pad "71" thru_hole oval (at -6.3 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 89ab5ff1-5cc3-435b-a8f5-bb6af9d26d49))
(pad "72" thru_hole oval (at -8.4 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp e5bd67ff-8300-460a-86de-d534823a8aa3))
(pad "73" thru_hole oval (at -10.5 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 2ac10ef0-9b99-4a7b-91d1-1e791db39e2b))
(pad "74" thru_hole oval (at -12.6 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 8ee369b9-9b2a-4856-b251-eb5751ac8007))
(pad "75" thru_hole oval (at -14.7 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp fe34214a-6699-4d22-8507-616c9618a71c))
(pad "76" thru_hole oval (at -16.8 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp f8fcfff7-f03d-4469-847f-098619953c47))
(pad "77" thru_hole oval (at -18.9 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp b2645d57-cd50-440f-b3eb-f6b2e0c22613))
(pad "78" thru_hole oval (at -21 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 8cf5fddd-090d-4106-b9d8-23d9d691e55e))
(pad "79" thru_hole oval (at -23.1 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp e8a57044-d2eb-4335-8eb7-37d21c10b373))
(pad "80" thru_hole oval (at -25.2 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp fe1114c8-6d98-4179-9d36-7454db88d6a5))
(pad "81" thru_hole oval (at -27.3 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp dc664e9e-efb7-49a4-b0c9-e05861835c59))
(pad "82" thru_hole oval (at -29.4 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 0d67b35a-6b90-4cd0-b30d-719c89a0abea))
(pad "83" thru_hole oval (at -31.5 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 69ba89ee-c3a4-4317-a04b-24ea8de7f44c))
(pad "84" thru_hole oval (at -33.6 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 20b3ac4c-2146-4111-bc00-9adfa0a94f21))
(pad "85" thru_hole oval (at -35.7 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp a7c35e0b-9958-4da1-9700-d7d170b95987))
(pad "86" thru_hole oval (at -37.8 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp c6920759-5697-4c85-a4e5-ac6bdbd16d38))
(pad "87" thru_hole oval (at -39.9 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 3f4be141-939e-4a8d-a11f-bb82e61cc707))
(pad "88" thru_hole oval (at -42 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp 95545e69-03f3-4255-a5ec-0c50f640fc9e))
(pad "89" thru_hole oval (at -44.1 1.6) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp cc8d2c41-8c3a-452e-b006-b78eaf4061d2))
(pad "90" thru_hole oval (at -46.2 4.75) (size 2 2) (drill 1) (layers "*.Cu" "*.Mask")
(thermal_bridge_angle 45) (tstamp d79ae947-417c-4d5e-8be6-3f7d93397a7e))
)

View File

@ -0,0 +1,4 @@
(fp_lib_table
(version 7)
(lib (name "OSCR")(type "KiCad")(uri "${KIPRJMOD}/../footprints/!OSCR.pretty")(options "")(descr ""))
)

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 KiB

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,528 @@
{
"board": {
"3dviewports": [],
"design_settings": {
"defaults": {
"board_outline_line_width": 0.09999999999999999,
"copper_line_width": 0.19999999999999998,
"copper_text_italic": false,
"copper_text_size_h": 1.5,
"copper_text_size_v": 1.5,
"copper_text_thickness": 0.3,
"copper_text_upright": false,
"courtyard_line_width": 0.049999999999999996,
"dimension_precision": 4,
"dimension_units": 3,
"dimensions": {
"arrow_length": 1270000,
"extension_offset": 500000,
"keep_text_aligned": true,
"suppress_zeroes": false,
"text_position": 0,
"units_format": 1
},
"fab_line_width": 0.09999999999999999,
"fab_text_italic": false,
"fab_text_size_h": 1.0,
"fab_text_size_v": 1.0,
"fab_text_thickness": 0.15,
"fab_text_upright": false,
"other_line_width": 0.15,
"other_text_italic": false,
"other_text_size_h": 1.0,
"other_text_size_v": 1.0,
"other_text_thickness": 0.15,
"other_text_upright": false,
"pads": {
"drill": 1.0,
"height": 1.7,
"width": 1.7
},
"silk_line_width": 0.15,
"silk_text_italic": false,
"silk_text_size_h": 1.0,
"silk_text_size_v": 1.0,
"silk_text_thickness": 0.15,
"silk_text_upright": false,
"zones": {
"45_degree_only": false,
"min_clearance": 0.508
}
},
"diff_pair_dimensions": [
{
"gap": 0.0,
"via_gap": 0.0,
"width": 0.0
}
],
"drc_exclusions": [],
"meta": {
"version": 2
},
"rule_severities": {
"annular_width": "error",
"clearance": "error",
"connection_width": "warning",
"copper_edge_clearance": "error",
"copper_sliver": "warning",
"courtyards_overlap": "error",
"diff_pair_gap_out_of_range": "error",
"diff_pair_uncoupled_length_too_long": "error",
"drill_out_of_range": "error",
"duplicate_footprints": "warning",
"extra_footprint": "warning",
"footprint": "error",
"footprint_type_mismatch": "error",
"hole_clearance": "error",
"hole_near_hole": "error",
"invalid_outline": "error",
"isolated_copper": "warning",
"item_on_disabled_layer": "error",
"items_not_allowed": "error",
"length_out_of_range": "error",
"lib_footprint_issues": "warning",
"lib_footprint_mismatch": "warning",
"malformed_courtyard": "error",
"microvia_drill_out_of_range": "error",
"missing_courtyard": "ignore",
"missing_footprint": "warning",
"net_conflict": "warning",
"npth_inside_courtyard": "ignore",
"padstack": "error",
"pth_inside_courtyard": "ignore",
"shorting_items": "error",
"silk_edge_clearance": "warning",
"silk_over_copper": "warning",
"silk_overlap": "warning",
"skew_out_of_range": "error",
"solder_mask_bridge": "error",
"starved_thermal": "error",
"text_height": "warning",
"text_thickness": "warning",
"through_hole_pad_without_hole": "error",
"too_many_vias": "error",
"track_dangling": "warning",
"track_width": "error",
"tracks_crossing": "error",
"unconnected_items": "error",
"unresolved_variable": "error",
"via_dangling": "warning",
"zones_intersect": "error"
},
"rules": {
"allow_blind_buried_vias": false,
"allow_microvias": false,
"max_error": 0.005,
"min_clearance": 0.0,
"min_connection": 0.0,
"min_copper_edge_clearance": 0.0,
"min_hole_clearance": 0.0,
"min_hole_to_hole": 0.25,
"min_microvia_diameter": 0.19999999999999998,
"min_microvia_drill": 0.09999999999999999,
"min_resolved_spokes": 2,
"min_silk_clearance": 0.0,
"min_text_height": 0.7999999999999999,
"min_text_thickness": 0.08,
"min_through_hole_diameter": 0.3,
"min_track_width": 0.19999999999999998,
"min_via_annular_width": 0.049999999999999996,
"min_via_diameter": 0.39999999999999997,
"solder_mask_clearance": 0.0,
"solder_mask_min_width": 0.0,
"solder_mask_to_copper_clearance": 0.0,
"use_height_for_length_calcs": true
},
"teardrop_options": [
{
"td_allow_use_two_tracks": true,
"td_curve_segcount": 5,
"td_on_pad_in_zone": false,
"td_onpadsmd": true,
"td_onroundshapesonly": false,
"td_ontrackend": false,
"td_onviapad": true
}
],
"teardrop_parameters": [
{
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_target_name": "td_round_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_target_name": "td_rect_shape",
"td_width_to_size_filter_ratio": 0.9
},
{
"td_curve_segcount": 0,
"td_height_ratio": 1.0,
"td_length_ratio": 0.5,
"td_maxheight": 2.0,
"td_maxlen": 1.0,
"td_target_name": "td_track_end",
"td_width_to_size_filter_ratio": 0.9
}
],
"track_widths": [
0.0
],
"via_dimensions": [
{
"diameter": 0.0,
"drill": 0.0
}
],
"zones_allow_external_fillets": false,
"zones_use_no_outline": true
},
"layer_presets": [],
"viewports": []
},
"boards": [],
"cvpcb": {
"equivalence_files": []
},
"erc": {
"erc_exclusions": [],
"meta": {
"version": 0
},
"pin_map": [
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
1,
0,
1,
2
],
[
0,
1,
0,
0,
0,
0,
1,
1,
2,
1,
1,
2
],
[
0,
0,
0,
0,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
2
],
[
1,
1,
1,
1,
1,
0,
1,
1,
1,
1,
1,
2
],
[
0,
0,
0,
1,
0,
0,
1,
0,
0,
0,
0,
2
],
[
0,
2,
1,
2,
0,
0,
1,
0,
2,
2,
2,
2
],
[
0,
2,
0,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
0,
2,
1,
1,
0,
0,
1,
0,
2,
0,
0,
2
],
[
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2,
2
]
],
"rule_severities": {
"bus_definition_conflict": "error",
"bus_entry_needed": "error",
"bus_to_bus_conflict": "error",
"bus_to_net_conflict": "error",
"conflicting_netclasses": "error",
"different_unit_footprint": "error",
"different_unit_net": "error",
"duplicate_reference": "error",
"duplicate_sheet_names": "error",
"endpoint_off_grid": "warning",
"extra_units": "error",
"global_label_dangling": "warning",
"hier_label_mismatch": "error",
"label_dangling": "error",
"lib_symbol_issues": "warning",
"missing_bidi_pin": "warning",
"missing_input_pin": "warning",
"missing_power_pin": "error",
"missing_unit": "warning",
"multiple_net_names": "warning",
"net_not_bus_member": "warning",
"no_connect_connected": "warning",
"no_connect_dangling": "warning",
"pin_not_connected": "error",
"pin_not_driven": "error",
"pin_to_pin": "warning",
"power_pin_not_driven": "error",
"similar_labels": "warning",
"simulation_model_issue": "ignore",
"unannotated": "error",
"unit_value_mismatch": "error",
"unresolved_variable": "error",
"wire_dangling": "error"
}
},
"libraries": {
"pinned_footprint_libs": [],
"pinned_symbol_libs": []
},
"meta": {
"filename": "loopy_adapter.kicad_pro",
"version": 1
},
"net_settings": {
"classes": [
{
"bus_width": 12,
"clearance": 0.2,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Default",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.4,
"via_diameter": 0.8,
"via_drill": 0.4,
"wire_width": 6
},
{
"bus_width": 12,
"clearance": 0.2,
"diff_pair_gap": 0.25,
"diff_pair_via_gap": 0.25,
"diff_pair_width": 0.2,
"line_style": 0,
"microvia_diameter": 0.3,
"microvia_drill": 0.1,
"name": "Power",
"pcb_color": "rgba(0, 0, 0, 0.000)",
"schematic_color": "rgba(0, 0, 0, 0.000)",
"track_width": 0.7,
"via_diameter": 0.8,
"via_drill": 0.4,
"wire_width": 6
}
],
"meta": {
"version": 3
},
"net_colors": null,
"netclass_assignments": null,
"netclass_patterns": [
{
"netclass": "Power",
"pattern": "GND"
}
]
},
"pcbnew": {
"last_paths": {
"gencad": "",
"idf": "",
"netlist": "",
"specctra_dsn": "snes_adapter.dsn",
"step": "snes_adapter.step",
"vrml": ""
},
"page_layout_descr_file": ""
},
"schematic": {
"annotate_start_num": 0,
"drawing": {
"dashed_lines_dash_length_ratio": 12.0,
"dashed_lines_gap_length_ratio": 3.0,
"default_bus_thickness": 12.0,
"default_line_thickness": 6.0,
"default_text_size": 50.0,
"default_wire_thickness": 6.0,
"field_names": [],
"intersheets_ref_own_page": false,
"intersheets_ref_prefix": "",
"intersheets_ref_short": false,
"intersheets_ref_show": false,
"intersheets_ref_suffix": "",
"junction_size_choice": 3,
"label_size_ratio": 0.375,
"pin_symbol_size": 25.0,
"text_offset_ratio": 0.15
},
"legacy_lib_dir": "",
"legacy_lib_list": [],
"meta": {
"version": 1
},
"net_format_name": "",
"ngspice": {
"fix_include_paths": true,
"fix_passive_vals": false,
"meta": {
"version": 0
},
"model_mode": 0,
"workbook_filename": ""
},
"page_layout_descr_file": "",
"plot_directory": "",
"spice_adjust_passive_values": false,
"spice_current_sheet_as_root": false,
"spice_external_command": "spice \"%I\"",
"spice_model_current_sheet_as_root": true,
"spice_save_all_currents": false,
"spice_save_all_voltages": false,
"subpart_first_id": 65,
"subpart_id_separator": 0
},
"sheets": [
[
"9d18f126-25a0-4767-9cfe-60845c6d7acd",
""
]
],
"text_variables": {}
}

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -0,0 +1,4 @@
(sym_lib_table
(version 7)
(lib (name "OSCR")(type "KiCad")(uri "${KIPRJMOD}/../symbols/!OSCR.kicad_sym")(options "")(descr ""))
)

View File

@ -1,20 +1,20 @@
(kicad_symbol_lib (version 20211014) (generator kicad_symbol_editor)
(kicad_symbol_lib (version 20220914) (generator kicad_symbol_editor)
(symbol "FC_Slot" (in_bom yes) (on_board yes)
(property "Reference" "U" (id 0) (at -16.51 52.07 0)
(property "Reference" "U" (at -16.51 52.07 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "FC_Slot" (id 1) (at -13.97 46.99 0)
(property "Value" "FC_Slot" (at -13.97 46.99 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "!OSCR:FC_Slot" (id 2) (at 0 0 0)
(property "Footprint" "!OSCR:FC_Slot" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "" (id 3) (at 0 0 0)
(property "Datasheet" "" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "FC_Slot_0_1"
(rectangle (start -17.78 44.45) (end 17.78 -34.29)
(stroke (width 0.1524) (type default) (color 0 0 0 0))
(stroke (width 0.1524) (type default))
(fill (type none))
)
)
@ -262,16 +262,16 @@
)
)
(symbol "GBA_Slot" (in_bom yes) (on_board yes)
(property "Reference" "J" (id 0) (at -39.37 15.24 0)
(property "Reference" "J" (at -39.37 15.24 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "GBA_Slot" (id 1) (at -35.56 11.43 0)
(property "Value" "GBA_Slot" (at -35.56 11.43 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "!OSCR:GBA_Slot" (id 2) (at -19.05 15.24 0)
(property "Footprint" "!OSCR:GBA_Slot" (at -19.05 15.24 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "" (id 3) (at -19.05 15.24 0)
(property "Datasheet" "" (at -19.05 15.24 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "GBA_Slot_0_0"
@ -286,7 +286,7 @@
)
(symbol "GBA_Slot_0_1"
(rectangle (start 41.91 -6.35) (end -39.37 10.16)
(stroke (width 0.1524) (type default) (color 0 0 0 0))
(stroke (width 0.1524) (type default))
(fill (type none))
)
)
@ -421,22 +421,402 @@
)
)
)
(symbol "MD_Slot" (in_bom yes) (on_board yes)
(property "Reference" "U" (id 0) (at -1.27 39.37 0)
(symbol "Loopy_Slot" (in_bom yes) (on_board yes)
(property "Reference" "J" (at 0 1.27 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "MD_Slot" (id 1) (at 1.27 36.83 0)
(property "Value" "Loopy_Slot" (at 0 0 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "!OSCR:MD_Slot" (id 2) (at 0 0 0)
(property "Footprint" "" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "" (id 3) (at 0 0 0)
(property "Datasheet" "" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "Loopy_Slot_1_1"
(rectangle (start -7.62 0) (end 7.62 -116.84)
(stroke (width 0) (type default))
(fill (type background))
)
(pin power_in line (at -11.43 -2.54 0) (length 3.81)
(name "+5V" (effects (font (size 1.27 1.27))))
(number "1" (effects (font (size 1.27 1.27))))
)
(pin no_connect line (at -11.43 -25.4 0) (length 3.81)
(name "" (effects (font (size 1.27 1.27))))
(number "10" (effects (font (size 1.27 1.27))))
)
(pin output line (at -11.43 -27.94 0) (length 3.81)
(name "~{RAMWE}" (effects (font (size 1.27 1.27))))
(number "11" (effects (font (size 1.27 1.27))))
)
(pin no_connect line (at -11.43 -30.48 0) (length 3.81)
(name "" (effects (font (size 1.27 1.27))))
(number "12" (effects (font (size 1.27 1.27))))
)
(pin power_in line (at -11.43 -33.02 0) (length 3.81)
(name "GND" (effects (font (size 1.27 1.27))))
(number "13" (effects (font (size 1.27 1.27))))
)
(pin power_in line (at -11.43 -35.56 0) (length 3.81)
(name "+5V" (effects (font (size 1.27 1.27))))
(number "14" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -11.43 -38.1 0) (length 3.81)
(name "PA15" (effects (font (size 1.27 1.27))))
(number "15" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -11.43 -40.64 0) (length 3.81)
(name "PB1" (effects (font (size 1.27 1.27))))
(number "16" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -11.43 -43.18 0) (length 3.81)
(name "PB9" (effects (font (size 1.27 1.27))))
(number "17" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -11.43 -45.72 0) (length 3.81)
(name "PB10" (effects (font (size 1.27 1.27))))
(number "18" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -11.43 -48.26 0) (length 3.81)
(name "PB11" (effects (font (size 1.27 1.27))))
(number "19" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -11.43 -5.08 0) (length 3.81)
(name "AR" (effects (font (size 1.27 1.27))))
(number "2" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -11.43 -50.8 0) (length 3.81)
(name "PB8" (effects (font (size 1.27 1.27))))
(number "20" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -11.43 -53.34 0) (length 3.81)
(name "PB12" (effects (font (size 1.27 1.27))))
(number "21" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at -11.43 -55.88 0) (length 3.81)
(name "A12" (effects (font (size 1.27 1.27))))
(number "22" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at -11.43 -58.42 0) (length 3.81)
(name "A10" (effects (font (size 1.27 1.27))))
(number "23" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at -11.43 -60.96 0) (length 3.81)
(name "A8" (effects (font (size 1.27 1.27))))
(number "24" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at -11.43 -63.5 0) (length 3.81)
(name "A6" (effects (font (size 1.27 1.27))))
(number "25" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at -11.43 -66.04 0) (length 3.81)
(name "A13" (effects (font (size 1.27 1.27))))
(number "26" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at -11.43 -68.58 0) (length 3.81)
(name "A15" (effects (font (size 1.27 1.27))))
(number "27" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at -11.43 -71.12 0) (length 3.81)
(name "A20" (effects (font (size 1.27 1.27))))
(number "28" (effects (font (size 1.27 1.27))))
)
(pin power_out line (at -11.43 -73.66 0) (length 3.81)
(name "+5V" (effects (font (size 1.27 1.27))))
(number "29" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -11.43 -7.62 0) (length 3.81)
(name "AVCC" (effects (font (size 1.27 1.27))))
(number "3" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at -11.43 -76.2 0) (length 3.81)
(name "A3" (effects (font (size 1.27 1.27))))
(number "30" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at -11.43 -78.74 0) (length 3.81)
(name "A21" (effects (font (size 1.27 1.27))))
(number "31" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at -11.43 -81.28 0) (length 3.81)
(name "A1" (effects (font (size 1.27 1.27))))
(number "32" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at -11.43 -83.82 0) (length 3.81)
(name "A0" (effects (font (size 1.27 1.27))))
(number "33" (effects (font (size 1.27 1.27))))
)
(pin no_connect line (at -11.43 -86.36 0) (length 3.81)
(name "" (effects (font (size 1.27 1.27))))
(number "34" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at -11.43 -88.9 0) (length 3.81)
(name "D0" (effects (font (size 1.27 1.27))))
(number "35" (effects (font (size 1.27 1.27))))
)
(pin output line (at -11.43 -91.44 0) (length 3.81)
(name "~{RESET}" (effects (font (size 1.27 1.27))))
(number "36" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at -11.43 -93.98 0) (length 3.81)
(name "D2" (effects (font (size 1.27 1.27))))
(number "37" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at -11.43 -96.52 0) (length 3.81)
(name "D3" (effects (font (size 1.27 1.27))))
(number "38" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at -11.43 -99.06 0) (length 3.81)
(name "D14" (effects (font (size 1.27 1.27))))
(number "39" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -11.43 -10.16 0) (length 3.81)
(name "AL" (effects (font (size 1.27 1.27))))
(number "4" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at -11.43 -101.6 0) (length 3.81)
(name "D4" (effects (font (size 1.27 1.27))))
(number "40" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at -11.43 -104.14 0) (length 3.81)
(name "D6" (effects (font (size 1.27 1.27))))
(number "41" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at -11.43 -106.68 0) (length 3.81)
(name "D8" (effects (font (size 1.27 1.27))))
(number "42" (effects (font (size 1.27 1.27))))
)
(pin no_connect line (at -11.43 -109.22 0) (length 3.81)
(name "AGND" (effects (font (size 1.27 1.27))))
(number "43" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at -11.43 -111.76 0) (length 3.81)
(name "D10" (effects (font (size 1.27 1.27))))
(number "44" (effects (font (size 1.27 1.27))))
)
(pin power_in line (at -11.43 -114.3 0) (length 3.81)
(name "GND" (effects (font (size 1.27 1.27))))
(number "45" (effects (font (size 1.27 1.27))))
)
(pin no_connect line (at 11.43 -114.3 180) (length 3.81)
(name "" (effects (font (size 1.27 1.27))))
(number "46" (effects (font (size 1.27 1.27))))
)
(pin power_in line (at 11.43 -111.76 180) (length 3.81)
(name "GND" (effects (font (size 1.27 1.27))))
(number "47" (effects (font (size 1.27 1.27))))
)
(pin no_connect line (at 11.43 -109.22 180) (length 3.81)
(name "" (effects (font (size 1.27 1.27))))
(number "48" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 11.43 -106.68 180) (length 3.81)
(name "AGND" (effects (font (size 1.27 1.27))))
(number "49" (effects (font (size 1.27 1.27))))
)
(pin no_connect line (at -11.43 -12.7 0) (length 3.81)
(name "" (effects (font (size 1.27 1.27))))
(number "5" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 11.43 -104.14 180) (length 3.81)
(name "VSYNC" (effects (font (size 1.27 1.27))))
(number "50" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 11.43 -101.6 180) (length 3.81)
(name "VFB" (effects (font (size 1.27 1.27))))
(number "51" (effects (font (size 1.27 1.27))))
)
(pin no_connect line (at 11.43 -99.06 180) (length 3.81)
(name "" (effects (font (size 1.27 1.27))))
(number "52" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 11.43 -96.52 180) (length 3.81)
(name "RH_P56" (effects (font (size 1.27 1.27))))
(number "53" (effects (font (size 1.27 1.27))))
)
(pin output line (at 11.43 -93.98 180) (length 3.81)
(name "~{CS6}" (effects (font (size 1.27 1.27))))
(number "54" (effects (font (size 1.27 1.27))))
)
(pin no_connect line (at 11.43 -91.44 180) (length 3.81)
(name "" (effects (font (size 1.27 1.27))))
(number "55" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 11.43 -88.9 180) (length 3.81)
(name "~{OE}" (effects (font (size 1.27 1.27))))
(number "56" (effects (font (size 1.27 1.27))))
)
(pin power_in line (at 11.43 -86.36 180) (length 3.81)
(name "+5V" (effects (font (size 1.27 1.27))))
(number "57" (effects (font (size 1.27 1.27))))
)
(pin no_connect line (at 11.43 -83.82 180) (length 3.81)
(name "" (effects (font (size 1.27 1.27))))
(number "58" (effects (font (size 1.27 1.27))))
)
(pin no_connect line (at 11.43 -81.28 180) (length 3.81)
(name "" (effects (font (size 1.27 1.27))))
(number "59" (effects (font (size 1.27 1.27))))
)
(pin no_connect line (at -11.43 -15.24 0) (length 3.81)
(name "" (effects (font (size 1.27 1.27))))
(number "6" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 11.43 -78.74 180) (length 3.81)
(name "CLK" (effects (font (size 1.27 1.27))))
(number "60" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 11.43 -76.2 180) (length 3.81)
(name "PB3" (effects (font (size 1.27 1.27))))
(number "61" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 11.43 -73.66 180) (length 3.81)
(name "PB5" (effects (font (size 1.27 1.27))))
(number "62" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 11.43 -71.12 180) (length 3.81)
(name "PB7" (effects (font (size 1.27 1.27))))
(number "63" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 11.43 -68.58 180) (length 3.81)
(name "PB13" (effects (font (size 1.27 1.27))))
(number "64" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 11.43 -66.04 180) (length 3.81)
(name "PB14" (effects (font (size 1.27 1.27))))
(number "65" (effects (font (size 1.27 1.27))))
)
(pin passive line (at 11.43 -63.5 180) (length 3.81)
(name "PB15" (effects (font (size 1.27 1.27))))
(number "66" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 11.43 -60.96 180) (length 3.81)
(name "A11" (effects (font (size 1.27 1.27))))
(number "67" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 11.43 -58.42 180) (length 3.81)
(name "A9" (effects (font (size 1.27 1.27))))
(number "68" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 11.43 -55.88 180) (length 3.81)
(name "A7" (effects (font (size 1.27 1.27))))
(number "69" (effects (font (size 1.27 1.27))))
)
(pin no_connect line (at -11.43 -17.78 0) (length 3.81)
(name "" (effects (font (size 1.27 1.27))))
(number "7" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 11.43 -53.34 180) (length 3.81)
(name "A5" (effects (font (size 1.27 1.27))))
(number "70" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 11.43 -50.8 180) (length 3.81)
(name "A14" (effects (font (size 1.27 1.27))))
(number "71" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 11.43 -48.26 180) (length 3.81)
(name "A17" (effects (font (size 1.27 1.27))))
(number "72" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 11.43 -45.72 180) (length 3.81)
(name "A16" (effects (font (size 1.27 1.27))))
(number "73" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 11.43 -43.18 180) (length 3.81)
(name "A18" (effects (font (size 1.27 1.27))))
(number "74" (effects (font (size 1.27 1.27))))
)
(pin power_in line (at 11.43 -40.64 180) (length 3.81)
(name "GND" (effects (font (size 1.27 1.27))))
(number "75" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 11.43 -38.1 180) (length 3.81)
(name "A19" (effects (font (size 1.27 1.27))))
(number "76" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 11.43 -35.56 180) (length 3.81)
(name "A4" (effects (font (size 1.27 1.27))))
(number "77" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 11.43 -33.02 180) (length 3.81)
(name "A2" (effects (font (size 1.27 1.27))))
(number "78" (effects (font (size 1.27 1.27))))
)
(pin no_connect line (at 11.43 -30.48 180) (length 3.81)
(name "" (effects (font (size 1.27 1.27))))
(number "79" (effects (font (size 1.27 1.27))))
)
(pin passive line (at -11.43 -20.32 0) (length 3.81)
(name "CVID" (effects (font (size 1.27 1.27))))
(number "8" (effects (font (size 1.27 1.27))))
)
(pin no_connect line (at 11.43 -27.94 180) (length 3.81)
(name "" (effects (font (size 1.27 1.27))))
(number "80" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 11.43 -25.4 180) (length 3.81)
(name "D1" (effects (font (size 1.27 1.27))))
(number "81" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 11.43 -22.86 180) (length 3.81)
(name "D12" (effects (font (size 1.27 1.27))))
(number "82" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 11.43 -20.32 180) (length 3.81)
(name "D13" (effects (font (size 1.27 1.27))))
(number "83" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 11.43 -17.78 180) (length 3.81)
(name "D15" (effects (font (size 1.27 1.27))))
(number "84" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 11.43 -15.24 180) (length 3.81)
(name "D5" (effects (font (size 1.27 1.27))))
(number "85" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 11.43 -12.7 180) (length 3.81)
(name "D7" (effects (font (size 1.27 1.27))))
(number "86" (effects (font (size 1.27 1.27))))
)
(pin no_connect line (at 11.43 -10.16 180) (length 3.81)
(name "" (effects (font (size 1.27 1.27))))
(number "87" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 11.43 -7.62 180) (length 3.81)
(name "D9" (effects (font (size 1.27 1.27))))
(number "88" (effects (font (size 1.27 1.27))))
)
(pin power_in line (at 11.43 -5.08 180) (length 3.81)
(name "+5V" (effects (font (size 1.27 1.27))))
(number "89" (effects (font (size 1.27 1.27))))
)
(pin output line (at -11.43 -22.86 0) (length 3.81)
(name "~{CS2}" (effects (font (size 1.27 1.27))))
(number "9" (effects (font (size 1.27 1.27))))
)
(pin bidirectional line (at 11.43 -2.54 180) (length 3.81)
(name "D11" (effects (font (size 1.27 1.27))))
(number "90" (effects (font (size 1.27 1.27))))
)
)
)
(symbol "MD_Slot" (in_bom yes) (on_board yes)
(property "Reference" "U" (at -1.27 39.37 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "MD_Slot" (at 1.27 36.83 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "!OSCR:MD_Slot" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "MD_Slot_0_1"
(rectangle (start -7.62 20.32) (end 20.32 -63.5)
(stroke (width 0.1524) (type default) (color 0 0 0 0))
(stroke (width 0.1524) (type default))
(fill (type none))
)
)
@ -700,21 +1080,21 @@
)
)
(symbol "N64_Slot" (in_bom yes) (on_board yes)
(property "Reference" "J" (id 0) (at -10.16 35.56 0)
(property "Reference" "J" (at -10.16 35.56 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "N64_Slot" (id 1) (at -6.35 33.02 0)
(property "Value" "N64_Slot" (at -6.35 33.02 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "!OSCR:N64 Slot" (id 2) (at -5.08 20.32 0)
(property "Footprint" "!OSCR:N64 Slot" (at -5.08 20.32 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "" (id 3) (at -5.08 20.32 0)
(property "Datasheet" "" (at -5.08 20.32 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "N64_Slot_0_1"
(rectangle (start -10.16 31.75) (end 15.24 -34.29)
(stroke (width 0.1524) (type default) (color 0 0 0 0))
(stroke (width 0.1524) (type default))
(fill (type none))
)
)
@ -922,21 +1302,21 @@
)
)
(symbol "NES_Slot" (in_bom yes) (on_board yes)
(property "Reference" "U" (id 0) (at -16.51 44.45 0)
(property "Reference" "U" (at -16.51 44.45 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "NES_Slot" (id 1) (at -12.7 41.91 0)
(property "Value" "NES_Slot" (at -12.7 41.91 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "!OSCR:NES_Slot" (id 2) (at 0 0 0)
(property "Footprint" "!OSCR:NES_Slot" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "" (id 3) (at 0 0 0)
(property "Datasheet" "" (at 0 0 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "NES_Slot_0_1"
(rectangle (start -16.51 39.37) (end 19.05 -54.61)
(stroke (width 0.1524) (type default) (color 0 0 0 0))
(stroke (width 0.1524) (type default))
(fill (type none))
)
)
@ -1232,21 +1612,21 @@
)
)
(symbol "SMS_Slot" (in_bom yes) (on_board yes)
(property "Reference" "U" (id 0) (at -10.16 35.56 0)
(property "Reference" "U" (at -10.16 35.56 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "SMS_Slot" (id 1) (at -6.35 33.02 0)
(property "Value" "SMS_Slot" (at -6.35 33.02 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "!OSCR:SMS_Slot" (id 2) (at -6.35 33.02 0)
(property "Footprint" "!OSCR:SMS_Slot" (at -6.35 33.02 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "" (id 3) (at -6.35 33.02 0)
(property "Datasheet" "" (at -6.35 33.02 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "SMS_Slot_0_1"
(rectangle (start -11.43 30.48) (end 10.16 -35.56)
(stroke (width 0.1524) (type default) (color 0 0 0 0))
(stroke (width 0.1524) (type default))
(fill (type none))
)
)
@ -1454,21 +1834,21 @@
)
)
(symbol "SNES_Slot" (in_bom yes) (on_board yes)
(property "Reference" "J" (id 0) (at 12.7 45.72 0)
(property "Reference" "J" (at 12.7 45.72 0)
(effects (font (size 1.27 1.27)))
)
(property "Value" "SNES_Slot" (id 1) (at -11.43 45.72 0)
(property "Value" "SNES_Slot" (at -11.43 45.72 0)
(effects (font (size 1.27 1.27)))
)
(property "Footprint" "!OSCR:SNES Slot" (id 2) (at 0 44.45 0)
(property "Footprint" "!OSCR:SNES Slot" (at 0 44.45 0)
(effects (font (size 1.27 1.27)) hide)
)
(property "Datasheet" "" (id 3) (at 0 44.45 0)
(property "Datasheet" "" (at 0 44.45 0)
(effects (font (size 1.27 1.27)) hide)
)
(symbol "SNES_Slot_0_1"
(rectangle (start -16.51 44.45) (end 19.05 -46.99)
(stroke (width 0.1524) (type default) (color 0 0 0 0))
(stroke (width 0.1524) (type default))
(fill (type none))
)
)

Binary file not shown.

View File

@ -87,3 +87,14 @@ E95A3DD7,0C19,379A6FFB,12,024
Name
CRC32, internal checksum, CRC32 of header area(0xFFB0-0xFFFF), size in Mbit, number of banks (lorom needs twice as many banks as hirom for the same rom size, lorom: 32kb banks, hirom: 64kb banks)
## loopy.txt
This file stores known Casio Loopy games, including the name and the internal checksum found at 000008h in the ROM header.
Note that most ROM packs you will find are incorrectly dumped little-endian. These CRCs are for the big-endian dump, including any padding. ROMs are 2MB/16Mbit or 3MB/24Mbit.
Example:
Wanwan Aijou Monogatari.bin
D90FE762
Name
Checksum

26
sd/loopy.txt Normal file
View File

@ -0,0 +1,26 @@
Anime Land.bin
98A0597D
HARIHARI Seal Paradise.bin
7CB100B3
Dream Change.bin
F6D41645
Nigaoe Artist.bin
2046476F
Wanwan Aijou Monogatari.bin
D90FE762
PC Collection.bin
F294F931
Little Romance.bin
6A410BB2
Loopy Town no Oheya ga Hoshii.bin
8373E9DD
Lupiton's Wonder Palette.bin
6E00CE71