mirror of
https://github.com/sanni/cartreader.git
synced 2024-12-26 13:01:52 +01:00
Merge pull request #824 from partlyhuman/support-casio-loopy
Casio Loopy Adapter
This commit is contained in:
commit
74e46f4322
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal 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
7
.gitignore
vendored
@ -28,3 +28,10 @@ fp-info-cache
|
||||
*.old
|
||||
*.old.*
|
||||
*gerber/
|
||||
|
||||
# MacOS
|
||||
.DS_Store
|
||||
._*
|
||||
|
||||
# ODS files
|
||||
.~lock*
|
@ -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"));
|
||||
|
@ -235,6 +235,13 @@
|
||||
|
||||
/****/
|
||||
|
||||
/* [ Casio Loopy -------------------------------------------------- ]
|
||||
*/
|
||||
|
||||
//#define enable_LOOPY
|
||||
|
||||
/****/
|
||||
|
||||
/*==== FIRMWARE OPTIONS ===========================================*/
|
||||
|
||||
/* [ LCD: Background Color ---------------------------------------- ]
|
||||
|
736
Cart_Reader/LOOPY.ino
Normal file
736
Cart_Reader/LOOPY.ino
Normal 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
|
216
hardware/footprints/!OSCR.pretty/Loopy_Slot.kicad_mod
Normal file
216
hardware/footprints/!OSCR.pretty/Loopy_Slot.kicad_mod
Normal 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))
|
||||
)
|
4
hardware/loopy_adapter/fp-lib-table
Normal file
4
hardware/loopy_adapter/fp-lib-table
Normal file
@ -0,0 +1,4 @@
|
||||
(fp_lib_table
|
||||
(version 7)
|
||||
(lib (name "OSCR")(type "KiCad")(uri "${KIPRJMOD}/../footprints/!OSCR.pretty")(options "")(descr ""))
|
||||
)
|
BIN
hardware/loopy_adapter/loopy_adapter.jpg
Normal file
BIN
hardware/loopy_adapter/loopy_adapter.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 187 KiB |
20353
hardware/loopy_adapter/loopy_adapter.kicad_pcb
Normal file
20353
hardware/loopy_adapter/loopy_adapter.kicad_pcb
Normal file
File diff suppressed because it is too large
Load Diff
528
hardware/loopy_adapter/loopy_adapter.kicad_pro
Normal file
528
hardware/loopy_adapter/loopy_adapter.kicad_pro
Normal 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": {}
|
||||
}
|
3095
hardware/loopy_adapter/loopy_adapter.kicad_sch
Normal file
3095
hardware/loopy_adapter/loopy_adapter.kicad_sch
Normal file
File diff suppressed because it is too large
Load Diff
BIN
hardware/loopy_adapter/loopy_adapter_gerber.zip
Normal file
BIN
hardware/loopy_adapter/loopy_adapter_gerber.zip
Normal file
Binary file not shown.
4
hardware/loopy_adapter/sym-lib-table
Normal file
4
hardware/loopy_adapter/sym-lib-table
Normal file
@ -0,0 +1,4 @@
|
||||
(sym_lib_table
|
||||
(version 7)
|
||||
(lib (name "OSCR")(type "KiCad")(uri "${KIPRJMOD}/../symbols/!OSCR.kicad_sym")(options "")(descr ""))
|
||||
)
|
@ -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))
|
||||
)
|
||||
)
|
||||
|
BIN
pinout.ods
BIN
pinout.ods
Binary file not shown.
11
sd/README.md
11
sd/README.md
@ -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
26
sd/loopy.txt
Normal 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
|
Loading…
Reference in New Issue
Block a user