Replacement chip: Difference between revisions

From NeoGeo Development Wiki
Jump to navigation Jump to search
(Created page with "Dirty page for SNK chips replacements development. Reading various repair logs, it appears that dead or partially dead...")
 
Line 47: Line 47:
=Logic definitions=
=Logic definitions=


To do.
Use pin names instead of numbers ?
 
==NEO-257==
 
Verified: NO.
 
<syntaxhighlight lang="verilog">
// TODO: Reverse order of bits/pins
assign {8,9,11,12,23,24,27,28} = (35&~18) ? 17 ? {5,7,14,16,20,22,30,32} : {4,6,13,15,19,21,29,31} : 8'bzzzzzzzz;
assign {40,41,43,44,55,56,59,60} = (35&(~(33|34))) ? 17 ? {36,38,45,47,51,53,62,64} : {37,39,46,48,52,54,63,1} : 8'bzzzzzzzz;
</syntaxhighlight>
 
==NEO-273==
 
Verified: NO.
 
<syntaxhighlight lang="verilog">
reg [19:0] C_LATCH;
reg [15:0] S_LATCH;
 
assign {46,45,44,43,41,40,39,38,14,13,12,11,9,8,7,6,33,32,1,64} = C_LATCH;
assign {37,36,35,34,18,17,16,15,5,4,3,2,51,50,49,48} = S_LATCH;
assign 47 = ~46;
 
always @(posedge 23)
  C_LATCH = {27,25,59,57,55,54,53,52,31,30,29,28,22,21,20,19,63,62,61,60};
 
always @(posedge 24)
  S_LATCH = {55,54,53,52,31,30,29,28,22,21,20,19,63,62,61,60};
</syntaxhighlight>
 
==NEO-BUF==
 
Verified: NO.
 
<syntaxhighlight lang="verilog">
// A0~7 <= B0~7
assign {32,33,34,35,37,38,39,40} = (44|45) ? 8'bzzzzzzzz : {5,4,3,2,1,48,47,46};
// A8~15 <= B8~15
assign {22,23,24,26,27,28,29,30} = (44|45) ? 8'bzzzzzzzz : {16,15,14,13,10,9,8,7};
// B0~7 <= A0~7
assign {5,4,3,2,1,48,47,46} = (44|(~45)) ? 8'bzzzzzzzz : {32,33,34,35,37,38,39,40};
// B8~15 <= A8~15
assign {16,15,14,13,10,9,8,7} = (44|(~45)) ? 8'bzzzzzzzz : {22,23,24,26,27,28,29,30};
</syntaxhighlight>
 
==NEO-C1==
 
Verified: Absolutely not.
 
<syntaxhighlight lang="verilog">
// Address decoding
assign ROMZONE = |{A23I,A22I,A21,A20};                  // 000000 0FFFFF
assign WRAMZONE = |{A23I,A22I,A21,~A20};                // 100000 1FFFFF
assign PORTZONE = |{A23I,A22I,~A21,A20};                // 200000 2FFFFF
assign CTRL1ZONE = |{A23I,A22I,~A21,~A20,A19,A18,A17};  // 300000 31FFFF
assign ICOMZONE = |{A23I,A22I,~A21,~A20,A19,A18,~A17};  // 320000 33FFFF
assign CTRL2ZONE = |{A23I,A22I,~A21,~A20,A19,~A18};      // 340000 37FFFF not sure if A17 is used (up to 35FFFF only ?)
assign BITW0 = |{A23I,A22I,~A21,~A20,~A19,A18,A17};      // 380000 39FFFF ?
assign BITW1 = |{A23I,A22I,~A21,~A20,~A19,A18,~A17};    // 3A0000 3BFFFF ?
assign LSPCZONE = |{A23I,A22I,~A21,~A20,~A19,~A18};      // 3C0000 3DFFFF not sure if A17 is used (up to 3DFFFF only ?)
assign PAL = |{A23I,~A22I};                              // 400000 7FFFFF
assign CARDZONE = |{~A23I,A22I};                        // 800000 BFFFFF
assign SROMZONE = |{~A23I,~A22I,A21,A20};                // C00000 CFFFFF
assign SRAMZONE = |{~A23I,~A22I,A21,~A20};              // D00000 DFFFFF
 
assign WORDACCSS = LDS|UDS;
 
assign ROMOEL = ~RW | LDS | ROMZONE;
assign ROMOEU = ~RW | UDS | ROMZONE;
assign PORTOEL = ~RW | LDS | PORTZONE;
assign PORTOEU = ~RW | UDS | PORTZONE;
assign PORTWEL = RW | LDS | PORTZONE;
assign PORTWEU = RW | UDS | PORTZONE;
assign PADRS = PORTZONE;
assign WRL = ~RW | LDS | WRAMZONE;
assign WRU = ~RW | UDS | WRAMZONE;
assign WWL = RW | LDS | WRAMZONE;
assign WWU = RW | UDS | WRAMZONE;
assign SROMOEL = ~RW | LDS | SROMZONE;
assign SROMOEU = ~RW | UDS | SROMZONE;
assign SRAMOEL = ~RW | LDS | SRAMZONE;
assign SRAMOEU = ~RW | UDS | SRAMZONE;
assign SRAMWEL = RW | LDS | SRAMZONE;
assign SRAMWEU = RW | UDS | SRAMZONE;
 
assign DIPRD0 = ? // Asks NEO-F0 for dipswitches on D0~7 ?
 
// Not sure about word access, is it LDS|UDS or LDS&UDS or nothing at all ?
assign LSPOE = ~RW | WORDACCESS | LSPCZONE;
assign LSPWE = RW | WORDACCESS | LSPCZONE;
assign CRDO = ~RW | WORDACCESS | CARDZONE;
assign CRDW = RW | WORDACCESS | CARDZONE;
assign CRDC = CRDO & CRDC;
 
// Inter-CPU comm.
// To do
 
// Inputs
// To do
 
// Wait states
// To do
 
</syntaxhighlight>


[[Category:Repairs]]
[[Category:Repairs]]
[[Category:Chips]]
[[Category:Chips]]

Revision as of 21:12, 15 January 2016

Dirty page for SNK chips replacements development.

Reading various [repair logs], it appears that dead or partially dead SNK chips are a common issue. It forces cannibalism and forcibly reduces the worldwide stock.

For preservation, it would be desirable to produce drop-in replacement chips to save original boards.

Considered solutions

Nobody likes rewiring to accomodate different pinouts, especially 80+ pins chips. Producing new ASICs is out of the question because of the price at low quantities, and because finding pin-compatible models todays would be difficult if not impossible.

The only solution would be adapter boards the size of the original chips, with castellated vias for surface mounting ? Furrtek (talk) 18:41, 15 January 2016 (CET)

  • Reconstruct the chip's logic with regular logic chips ? No: they're all too big. BGA parts aren't 5V compatible.
  • Use 2 boards on top of each other with a mezzanine connector ? No, no, no.
  • Use 1- or 2-gate SOT-23-5/6 chips ? Maybe in some cases, but would be expensive (long BOM, lots of parts to assemble).
  • Use a CPLD ? Probably the best solution. Altera's MAX3000 and Xilinx's XC9500 are 5V-tolerant and are still available at reasonable prices.

CPLD proposals

  • NEO-257: 53 I/Os, EPM3064 in TQFP100 ?
  • NEO-273: Only used in cartridges, rarely dies. A clone wouldn't be that useful ?
  • NEO-BUF: Really a pain, too small for QFP CPLDs. 74LVCH16245 in BGA56 ?
  • PRO-C0: Need pinout, quite big so EPM3128 in TQFP144 ?
  • NEO-C1: EPM3128 has enough I/Os, but too big in TQFP144.
  • NEO-D0: 55 I/Os, EPM3064 in TQFP100 ?
  • NEO-E0: 54 I/Os, EPM3064 in TQFP100 ?
  • NEO-F0: 60 I/Os, EPM3064 in TQFP100 ?
  • NEO-G0: 56 I/Os, EPM3064 in TQFP100 ?
  • NEO-I0: 56 I/Os, EPM3064 in TQFP100 ?
  • NEO-ZMC: Very small, can be found on AliExpress (January 2016). BGA ?
  • NEO-ZMC2: 71 I/Os, EPM3128 in TQFP100 ?
  • PCM: Only used in cartridges, rarely dies. 65 I/Os, EPM3064 in TQFP100 ?
  • NEO-DCR-T, NEO-SDR-T: Need pinouts, probably same problem as for NEO-C1.
  • LSPCs could be replaced but the I/O requirements directs to >$60 CPLDs.
  • Line buffers (PRO-B0, NEO-B1) could be replaced with MAX10's and level shifting ?. Might be too expensive.

Board proposals

Which board houses are castellation friendly ? Is classic 1.6mm good ?

QFP64R

QFP80R

QFP100R

Logic definitions

Use pin names instead of numbers ?

NEO-257

Verified: NO.

// TODO: Reverse order of bits/pins
assign {8,9,11,12,23,24,27,28} = (35&~18) ? 17 ? {5,7,14,16,20,22,30,32} : {4,6,13,15,19,21,29,31} : 8'bzzzzzzzz;
assign {40,41,43,44,55,56,59,60} = (35&(~(33|34))) ? 17 ? {36,38,45,47,51,53,62,64} : {37,39,46,48,52,54,63,1} : 8'bzzzzzzzz;

NEO-273

Verified: NO.

reg [19:0] C_LATCH;
reg [15:0] S_LATCH;

assign {46,45,44,43,41,40,39,38,14,13,12,11,9,8,7,6,33,32,1,64} = C_LATCH;
assign {37,36,35,34,18,17,16,15,5,4,3,2,51,50,49,48} = S_LATCH;
assign 47 = ~46;

always @(posedge 23)
  C_LATCH = {27,25,59,57,55,54,53,52,31,30,29,28,22,21,20,19,63,62,61,60};

always @(posedge 24)
  S_LATCH = {55,54,53,52,31,30,29,28,22,21,20,19,63,62,61,60};

NEO-BUF

Verified: NO.

// A0~7 <= B0~7
assign {32,33,34,35,37,38,39,40} = (44|45) ? 8'bzzzzzzzz : {5,4,3,2,1,48,47,46};
// A8~15 <= B8~15
assign {22,23,24,26,27,28,29,30} = (44|45) ? 8'bzzzzzzzz : {16,15,14,13,10,9,8,7};
// B0~7 <= A0~7
assign {5,4,3,2,1,48,47,46} = (44|(~45)) ? 8'bzzzzzzzz : {32,33,34,35,37,38,39,40};
// B8~15 <= A8~15
assign {16,15,14,13,10,9,8,7} = (44|(~45)) ? 8'bzzzzzzzz : {22,23,24,26,27,28,29,30};

NEO-C1

Verified: Absolutely not.

// Address decoding
assign ROMZONE = |{A23I,A22I,A21,A20};                   // 000000 0FFFFF
assign WRAMZONE = |{A23I,A22I,A21,~A20};                 // 100000 1FFFFF
assign PORTZONE = |{A23I,A22I,~A21,A20};                 // 200000 2FFFFF
assign CTRL1ZONE = |{A23I,A22I,~A21,~A20,A19,A18,A17};   // 300000 31FFFF
assign ICOMZONE = |{A23I,A22I,~A21,~A20,A19,A18,~A17};   // 320000 33FFFF
assign CTRL2ZONE = |{A23I,A22I,~A21,~A20,A19,~A18};      // 340000 37FFFF not sure if A17 is used (up to 35FFFF only ?)
assign BITW0 = |{A23I,A22I,~A21,~A20,~A19,A18,A17};      // 380000 39FFFF ?
assign BITW1 = |{A23I,A22I,~A21,~A20,~A19,A18,~A17};     // 3A0000 3BFFFF ?
assign LSPCZONE = |{A23I,A22I,~A21,~A20,~A19,~A18};      // 3C0000 3DFFFF not sure if A17 is used (up to 3DFFFF only ?)
assign PAL = |{A23I,~A22I};                              // 400000 7FFFFF
assign CARDZONE = |{~A23I,A22I};                         // 800000 BFFFFF
assign SROMZONE = |{~A23I,~A22I,A21,A20};                // C00000 CFFFFF
assign SRAMZONE = |{~A23I,~A22I,A21,~A20};               // D00000 DFFFFF

assign WORDACCSS = LDS|UDS;

assign ROMOEL = ~RW | LDS | ROMZONE;
assign ROMOEU = ~RW | UDS | ROMZONE;
assign PORTOEL = ~RW | LDS | PORTZONE;
assign PORTOEU = ~RW | UDS | PORTZONE;
assign PORTWEL = RW | LDS | PORTZONE;
assign PORTWEU = RW | UDS | PORTZONE;
assign PADRS = PORTZONE;
assign WRL = ~RW | LDS | WRAMZONE;
assign WRU = ~RW | UDS | WRAMZONE;
assign WWL = RW | LDS | WRAMZONE;
assign WWU = RW | UDS | WRAMZONE;
assign SROMOEL = ~RW | LDS | SROMZONE;
assign SROMOEU = ~RW | UDS | SROMZONE;
assign SRAMOEL = ~RW | LDS | SRAMZONE;
assign SRAMOEU = ~RW | UDS | SRAMZONE;
assign SRAMWEL = RW | LDS | SRAMZONE;
assign SRAMWEU = RW | UDS | SRAMZONE;

assign DIPRD0 = ? // Asks NEO-F0 for dipswitches on D0~7 ?

// Not sure about word access, is it LDS|UDS or LDS&UDS or nothing at all ?
assign LSPOE = ~RW | WORDACCESS | LSPCZONE;
assign LSPWE = RW | WORDACCESS | LSPCZONE;
assign CRDO = ~RW | WORDACCESS | CARDZONE;
assign CRDW = RW | WORDACCESS | CARDZONE;
assign CRDC = CRDO & CRDC;

// Inter-CPU comm.
// To do

// Inputs
// To do

// Wait states
// To do