<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BryanMcPhail.com</title>
	<atom:link href="https://www.bryanmcphail.com/wp/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>https://www.bryanmcphail.com/wp</link>
	<description>Professional software development, amateur BMW tinkering, old arcade game stuff</description>
	<lastBuildDate>Tue, 10 Jan 2023 15:34:54 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.6.1</generator>
		<item>
		<title>EPOS The Glob / Beastie Feastie / Eeekk! hardware encryption</title>
		<link>https://www.bryanmcphail.com/wp/?p=2704</link>
		<comments>https://www.bryanmcphail.com/wp/?p=2704#comments</comments>
		<pubDate>Sat, 07 Jan 2023 00:53:06 +0000</pubDate>
		<dc:creator>bmcphail</dc:creator>
				<category><![CDATA[Arcade]]></category>
		<category><![CDATA[MAME]]></category>

		<guid isPermaLink="false">http://www.bryanmcphail.com/wp/?p=2704</guid>
		<description><![CDATA[The EPOS games Glob, Super Glob, Beastie Feastie and Eeekk! run on Pacman hardware with a custom daughterboard. They use an obfuscated security system to prevent swapping the games just by burning the ROMs. Although these games are all emulated in MAME the security PAL chip for Beastie Feastie was not dumped until recently which [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>The EPOS games Glob, Super Glob, Beastie Feastie and Eeekk! run on Pacman hardware with a custom daughterboard.  They use an obfuscated security system to prevent swapping the games just by burning the ROMs.  Although these games are all emulated in MAME the security PAL chip for Beastie Feastie was not dumped until recently which meant the games couldn&#8217;t be repaired on real hardware until then (Although MAME had dumps for the PALs, they are all confirmed bad and did not work on real boards).  The Eeekk! board is very rare and can not be found to be dumped, so I was asked if it&#8217;s possible to recreate the Eeeek! PAL based on the Beastie Feastie PAL and MAME information.  And after some thought, yes&#8230;!  Let&#8217;s see how..  this will get pretty technical though&#8230;</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2023/01/Screenshot_20230106-180043_Gallery1.jpg"><img src="http://www.bryanmcphail.com/wp/wp-content/uploads/2023/01/Screenshot_20230106-180043_Gallery1-204x300.jpg" alt="Screenshot_20230106-180043_Gallery" width="204" height="300" class="alignnone size-medium wp-image-2716" /></a></p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2023/01/20230106_181439.jpg"><img src="http://www.bryanmcphail.com/wp/wp-content/uploads/2023/01/20230106_181439-227x300.jpg" alt="20230106_181439" width="227" height="300" class="alignnone size-medium wp-image-2714" /></a><br />
<strong>
<ul>
Part 1</ul>
<p></strong></p>
<p>First let&#8217;s look at the equations that come from the Beastie Feastie .JED file.  &#8216;o&#8217; means output (o19 = pin 19 on the PAL used for output).  &#8216;i&#8217; means input (i4 = pin 4 on the PAL used for input).  / means invert/negate.  * means AND.  + means OR.  Rather confusingly pin 11 is a double negative &#8211; it&#8217;s negated in the input section /i11=11 and negated everywhere it&#8217;s used in the equations. </p>
<p><code>i1=1 i2=2 i3=3 i4=4 i5=5 i6=6 i7=7 i8=8 i9=9 GND=10 /i11=11 o12=12<br />
o13=13 o14=14 o15=15 o16=16 o17=17 o18=18 o19=19 VCC=20 </p>
<p>o19 = /i4 * /i7 * /i9 * /i11<br />
    + /i5 * i7 * /i9 * /i11<br />
o18 = /i1 * /i8 * /i9 * /i11<br />
    + /i6 * i8 * /i9 * /i11<br />
o17 = i6 * /i8 * /i9 * /i11<br />
    + /i3 * i8 * /i9 * /i11<br />
o16 = /i2 * /i7 * /i9 * /i11<br />
    + i4 * i7 * /i9 * /i11<br />
o15 = /i3 * /i8 * /i9 * /i11<br />
    + i1 * i8 * /i9 * /i11<br />
o14 = i5 * /i7 * /i9 * /i11<br />
    + /i2 * i7 * /i9 * /i11<br />
/o13 = i9 * /i11<br />
o12 = /i9 * /i11</code></p>
<p>And the physical connections to the encryption PAL on the board:</p>
<p><code>PAL10H8 inputs</p>
<p>1: D7 from encrypted program ROM<br />
2: D6 from encrypted program ROM<br />
3: D4 from encrypted program ROM<br />
4: D3 from encrypted program ROM<br />
5: D1 from encrypted program ROM<br />
6: D0 from encrypted program ROM</p>
<p>7: LS193 Q0<br />
8: LS193 Q1<br />
9: LS193 Q2<br />
11: LS193 Q3</code></p>
<p>The LS193 is a 4 bit counter, that can provide a 4 bit (16 states) encryption key to the PAL.  The program code can modify the counter state, which means the encryption can change dynamically as the program executes!  In theory this means the program could be impossible to statically decrypt and run in the same amount of ROM as it can &#8216;read itself&#8217; and each byte would have 16 permutations the code could rely on (in practice we&#8217;ll see later only 4 permutations are used).  This is an interesting aspect to the original security &#8211; as to statically decrypt the 4 (or 16) states would  mean using 4 or 16 times as many ROMs which would have been cost prohibitive for a commericial pirate.</p>
<p>Most of the outputs go to a LS244 buffer chip that passes through to the Z80 CPU.</p>
<p><code>19: o19 -> LS244 1A1 -> 1Y1 -> D7 Z80<br />
17: o17 -> LS244 1A2 -> 1Y2 -> D5 Z80<br />
15: o15 -> LS244 1A3 -> 1Y3 -> D3 Z80<br />
14: o14 -> LS244 2A2 -> 2Y2 -> D2 Z80<br />
16: o16 -> LS244 2A3 -> 2Y3 -> D4 Z80<br />
18: o18 -> LS244 2A4 -> 2Y4 -> D6 Z80<br />
12: o12 -> LS10 pin 1 (3 input NAND)<br />
13: o13 -> LS10 pin 2 (3 input NAND)</code></p>
<p>So 6 of the 8 bits are decrypted by the PAL, and 2 of the bits go directly via a LS04 invertor.  Outputs 12 &#038; 13 seem to be involved in program ROM enable*, they are not involved in encryption and must be the same between all games for the enable circuit to work, so we don&#8217;t need to worry about them. (*Update from HudsonArcade &#8211; these drive the LS244 enables, the ROM select is just regular A13 from the CPU.  Thanks!).</p>
<p>Let&#8217;s look at things from the LS244 point of view</p>
<p><code>PAL o19 -> 1A1 -> 1Y1 -> D7 Z80<br />
PAL o17 -> 1A2 -> 1Y2 -> D5 Z80<br />
PAL o15 -> 1A3 -> 1Y3 -> D3 Z80<br />
(LS04 12) ->      1Y4 -> D1 Z80<br />
(LS04 10) ->      2Y1 -> D0 Z80<br />
PAL o14 -> 2A2 -> 2Y2 -> D2 Z80<br />
PAL o16 -> 2A3 -> 2Y3 -> D4 Z80<br />
PAL o18 -> 2A4 -> 2Y4 -> D6 Z80</code></p>
<p>We can rewrite the equations substituting the Z80 data lines and the key lines.  I&#8217;ll also switch to use &#8216;C&#8217; terminology (&#038;&#038; for and, || for OR, ! for negate), as I think in C++&#8230;</p>
<p><code>o14 = (D1 &#038;&#038; !KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || (!D6 &#038;&#038; KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
o15 = (!D4 &#038;&#038; !KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || (D7 &#038;&#038; KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
o16 = (!D6 &#038;&#038; !KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3)  || (D3 &#038;&#038; KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
o17 = (D0 &#038;&#038; !KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || (!D4 &#038;&#038; KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
o18 = (!D7 &#038;&#038; !KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || (!D0 &#038;&#038; KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
o19 = (!D3 &#038;&#038; !KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || (!D1 &#038;&#038; KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3)</code></p>
<p>If we remove the key bits we can see each output bit depends on two input bits</p>
<p><code>o14 = D1 || !D6<br />
o15 = !D4 || D7<br />
o16 = !D6 || D3<br />
o17 = D0 || !D4<br />
o18 = !D7 || !D0<br />
o19 = !D3 || !D1<br />
</code></p>
<p>And let&#8217;s rewrite the equations another way to show what ROM bits attach to what Z80 bits.</p>
<p><code>Z80 D0 comes from LS04 pin 12<br />
Z80 D1 comes from LS04 pin 10<br />
Z80 D2 must be D1 or !D6 from the ROM (o14 in PAL)<br />
Z80 D3 must be !D4 or D7 from the ROM<br />
Z80 D4 must be !D6 or D3<br />
Z80 D5 must be D0 or !D4<br />
Z80 D6 must be !D7 or !D0<br />
Z80 D7 must be !D3 or !D1</code></p>
<p><strong>
<ul>
Part 2</ul>
<p></strong></p>
<p>Let&#8217;s reconcile this with MAME source.  <em>machine/epos.cpp</em></p>
<p><em><code>MACHINE_START_MEMBER(pacman_state, theglobp)<br />
{<br />
	/*  Note: D2 is inverted and connected to D1, D5 is inverted and<br />
	connected to D0.  The other six data bits are converted by a<br />
	PAL10H8 driven by the counter. */</code></em></p>
<p>This matches so far &#8211; D0 and D1 are noted to be inversions (LS04) of D2 and D5 from ROM data.  D2 and D5 aren&#8217;t used by the PAL.  The counter is the LS193 chip that supplies a 4 bit input to the PAL.<br />
<em><br />
	<code>/* While the PAL supports up to 16 decryption methods, only four<br />
	are actually used in the PAL.  Therefore, we'll take a little<br />
	memory overhead and decrypt the ROMs using each method in advance. */</code></em></p>
<p>MAME notes that although the counter can supply 16 states (4 bits) only 4 states are used by the games, corresponding to counter states 0&#215;8, 0&#215;9, 0xa, 0xb</p>
<p>MAME lists the bit swizzle order for the 4 states as:<br />
<em><code><br />
		{ 3,7,0,6,4,1,2,5 },<br />
		{ 1,7,0,3,4,6,2,5 },<br />
		{ 3,0,4,6,7,1,2,5 },<br />
		{ 1,0,4,3,7,6,2,5 },</code></em></p>
<p>although confusingly this table is &#8216;backwards&#8217; with D7 first and D0 last (so the 5 at the end of the row refers to D5 connecting to D0, the 2 second most from right refers to &#8216;D2 inverted and connected to D1&#8242;).  If we can scan the columns we can see that each bit can only have 1 or 2 input bits (the first column is 3 or 1, the second column is 7 or 0).  Now we can confirm MAME data matches the PAL equations if we refer back to the Z80 form equations:</p>
<p>The first column (D7) uses only bits 1 or 3 which matches &#8216;Z80 D7 must be !D3 or !D1&#8242;<br />
The second column (D6) uses only bits 7 or 0 which matches &#8216;Z80 D6 must be !D7 or !D0&#8242;<br />
The third column (D5) uses only bits 0 or 4 which matches &#8216;Z80 D5 must be D0 or !D4&#8242;<br />
etc</p>
<p>Looking at the equations again, every output contains depends on 3 of the 4 input keys.  And the 3rd and 4th input key is identical between all outputs, so we can pretty much ignore it and say each output only depends on 2 input keys.  This is where the 4 states in MAME come from.</p>
<p>Let&#8217;s work through state 0&#215;8 which MAME notes uses this bit swizzle order &#8211; { 3,7,0,6,4,1,2,5 } and inversion (XOR) of 0xfc.  Encryption state 0&#215;8 means the key is:</p>
<p>KEY0 = 0 (low / false)<br />
KEY1 = 0 (low / false)<br />
KEY2 = 0 (low / false)<br />
KEY3 = 1 (high / true) (remember key input i11 has a double negation from part 1!)</p>
<p>Rewrite the Z80 equation for D2 with this set of input keys:</p>
<p><code>Z80 D2 IN = (D1 &#038;&#038; !KEY0 &#038;&#038; !KEY2 &#038;&#038; !!KEY3) || (!D6 &#038;&#038; KEY0 &#038;&#038; !KEY2 &#038;&#038; !!KEY3)<br />
Z80 D2 IN = (D1 &#038;&#038; !0 &#038;&#038; !0 &#038;&#038; !!0) || (!D6 &#038;&#038; 0 &#038;&#038; !0 &#038;&#038; !!0)<br />
Z80 D2 IN = (D1 &#038;&#038; 1 &#038;&#038; 1 &#038;&#038; 1) || (!D6 &#038;&#038; 0 &#038;&#038; 1 &#038;&#038; 1)<br />
Z80 D2 IN = (D1 &#038;&#038; 1 &#038;&#038; 1 &#038;&#038; 1)<br />
Z80 D2 IN = (D1)</code></p>
<p>So D2 at the Z80 is D1 from the encrypted ROM with no inversion</p>
<p>When the key state is 0xb:</p>
<p>KEY0 = 1<br />
KEY1 = 1<br />
KEY2 = 0<br />
KEY3 = 1</p>
<p><code>Z80 D2 IN = (D1 &#038;&#038; !KEY0 &#038;&#038; !KEY2 &#038;&#038; !!KEY3) || (!D6 &#038;&#038; KEY0 &#038;&#038; !KEY2 &#038;&#038; !!KEY3)<br />
Z80 D2 IN = (D1 &#038;&#038; !1 &#038;&#038; !0 &#038;&#038; !!0) || (!D6 &#038;&#038; 1 &#038;&#038; !0 &#038;&#038; !!0)<br />
Z80 D2 IN = (D1 &#038;&#038; 0 &#038;&#038; 1 &#038;&#038; 1) || (!D6 &#038;&#038; 1 &#038;&#038; 1 &#038;&#038; 1)<br />
Z80 D2 IN = (!D6 &#038;&#038; 1 &#038;&#038; 1 &#038;&#038; 1)<br />
Z80 D2 IN = !D6</code></p>
<p>So D2 is inverted D6 for this key.</p>
<p>So this matches the table in MAME (the 3rd column from the right being D2 and it contains the values 1 and 6).  The MAME xor key is used to mask the inversions.</p>
<p>All of the 6 input bits can be solved for all 4 keys in the same way.  And KEY2 and KEY3 can effectively be ignored as they are constant in all equations.</p>
<p><strong>
<ul>
Part 3</ul>
<p></strong></p>
<p>Now we can attempt to build the Eeek equations based on MAME knowledge.  The 4 swizzle tables are:</p>
<ul>
		{ 7,6,1,3,0,4,2,5 },<br />
		{ 7,1,4,3,0,6,2,5 },<br />
		{ 7,6,1,0,3,4,2,5 },<br />
		{ 7,1,4,0,3,6,2,5 },</ul>
<p>So we can break this down by walking the columns:</p>
<ul>
Z80 D7 can only ever come from ROM D7<br />
Z80 D6 can only ever come from ROM D6 or D1<br />
Z80 D5 can only ever come from ROM D1 or D4<br />
Z80 D4 can only ever come from ROM D3 or D0<br />
Z80 D3 can only ever come from ROM D0 or D3<br />
Z80 D2 can only ever come from ROM D4 or D6<br />
Z80 D0 can only ever come from ROM D2<br />
Z80 D1 can only ever come from ROM D5</ul>
<p>Based on the Beastie Feastie knowledge, we can work out what keys influence what bits.</p>
<ul>
Z80 D7 is constant &#8211; does not care what key 0 or key 1 is.<br />
Z80 D6 depends on key 0, does not care what key 1 is<br />
Z80 D5 depends on key 0, does not care what key 1 is<br />
Z80 D4 depends on key 1, does not care what key 0 is<br />
Z80 D3 depends on key 1, does not care what key 0 is<br />
Z80 D2 depends on key 0, does not care what key 1 is<br />
Z80 D1 is constant &#8211; does not care what key 0 or key 1 is.<br />
Z80 D0 is constant &#8211; does not care what key 0 or key 1 is.</ul>
<p>Put these things together, and add in the constant KEY2 and KEY3 terms (though the game will surely work if we just emit them).</p>
<ul>
Z80 D7 = (D7 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
Z80 D6 = (D6 &#038;&#038; !KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || (D1 &#038;&#038; KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
Z80 D5 = (D1 &#038;&#038; !KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || (D4 &#038;&#038; KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
Z80 D4 = (D3 &#038;&#038; !KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || (D0 &#038;&#038; KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
Z80 D3 = (D0 &#038;&#038; !KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || (D3 &#038;&#038; KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
Z80 D2 = (D4 &#038;&#038; !KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || (D6 &#038;&#038; KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
Z80 D1 = (D2 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
Z80 D0 = (D5 &#038;&#038; !KEY2 &#038;&#038; !KEY3)</ul>
<p>Now we have apply the inversion terms which MAME lists in hex for the 4 tables, but are easier to understand in binary:</p>
<ul>
key 0 &#8211; 0xfd = 1111 1101<br />
key 1 &#8211; 0xbf = 1011 1111<br />
key 2 &#8211; 0&#215;75 = 0111 0101<br />
key 3 &#8211; 0&#215;37 = 0011 0111</ul>
<p>So D7 is inverted in key states 0 and 1, and non-inverted in 2 &#038; 3.  D6 is inverted in key states 0 and 2, non-inverted in 1 &#038; 3.  So if we walk the columns we can say:</p>
<ul>
D7 inversion depends on key 1<br />
D6 inversion depends on key 0<br />
D5 inversion is constant (same for all key states)<br />
D4 inversion is constant (same for all key states)<br />
D3 inversion depends on key 1<br />
D2 inversion is constant (same for all key states)<br />
D1 inversion depends on key 0<br />
D0 inversion is constant (same for all key states)</ul>
<p>As a sanity check we can see that where there is a key dependency it matches the key influence above.</p>
<p>Rewrite the equations to add inversions:</p>
<ul>
Z80 D7 = (!D7 &#038;&#038; !KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || ( D7 &#038;&#038; KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
Z80 D6 = (!D6 &#038;&#038; !KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || (!D1 &#038;&#038; KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
Z80 D5 = ( D1 &#038;&#038; !KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || (!D4 &#038;&#038; KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
Z80 D4 = (!D3 &#038;&#038; !KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || (!D0 &#038;&#038; KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
Z80 D3 = (!D0 &#038;&#038; !KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || ( D3 &#038;&#038; KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
Z80 D2 = (!D4 &#038;&#038; !KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || ( D6 &#038;&#038; KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
Z80 D1 = (!D2 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
Z80 D0 = (!D5 &#038;&#038; !KEY2 &#038;&#038; !KEY3)</ul>
<p>Now rewrite back to the PAL&#8217;s point of view rather than the Z80, so D7 is PAL o19, D5 is pal o17, etc</p>
<ul>
PAL o19 = (!D7 &#038;&#038; !KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || ( D7 &#038;&#038; KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
PAL o18 = (!D6 &#038;&#038; !KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || (!D1 &#038;&#038; KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
PAL o17 = ( D1 &#038;&#038; !KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || (!D4 &#038;&#038; KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
PAL o16 = (!D3 &#038;&#038; !KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || (!D0 &#038;&#038; KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
PAL o15 = (!D0 &#038;&#038; !KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || ( D3 &#038;&#038; KEY1 &#038;&#038; !KEY2 &#038;&#038; !KEY3)<br />
PAL o14 = (!D4 &#038;&#038; !KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3) || ( D6 &#038;&#038; KEY0 &#038;&#038; !KEY2 &#038;&#038; !KEY3)</ul>
<p>D0 and D1 are not affected by the PAL, so we can ignore them.</p>
<p>Rewrite back to the JED format we can use with the hardware, with the mapping from before:</p>
<ul>
i1: D7 from ROM<br />
i2: D6 from ROM<br />
i3: D4 from ROM<br />
i4: D3 from ROM<br />
i5: D1 from ROM<br />
i6: D0 from ROM</p>
<p>i7: LS193 Q0 / Key 0<br />
i8: LS193 Q1 / Key 1<br />
i9: LS193 Q2 / Key 2<br />
i11: LS193 Q3 / Key 3</p>
<p>o19 = /i1 * /i8 * /i9 * /i11<br />
    +  i1 *  i8 * /i9 * /i11<br />
o18 = /i2 * /i7 * /i9 * /i11<br />
    + /i5 *  i7 * /i9 * /i11<br />
o17 =  i5 * /i7 * /i9 * /i11<br />
    + /i3 *  i7 * /i9 * /i11<br />
o16 = /i4 * /i8 * /i9 * /i11<br />
    + /i6 *  i8 * /i9 * /i11<br />
o15 = /i6 * /i8 * /i9 * /i11<br />
    +  i4 *  i8 * /i9 * /i11<br />
o14 = /i3 * /i7 * /i9 * /i11<br />
    +  i2 *  i7 * /i9 * /i11<br />
/o13 = i9 * /i11<br />
o12 = /i9 * /i11
</ul>
<p>o12 and o13 we&#8217;ll leave alone as they aren&#8217;t involved in encryption and must be the same between all games.</p>
<p><strong>Part 4</strong>
<ul>
<p>The final EQN file &#8211; this can be burned to a GAL16V8 and used on the original hardware.  The 4 jumpers on the board must also be set to match the game.  The 4 jumpers actually correspond to the default key the game boots in (from the 0&#215;8, 0&#215;9, 0xa, 0xb) counter states.  Glob boots in state 0xa (top to bottom jumpers on, off, on, off) whilst Eeekk boots in state 0&#215;9 (off, on, on, off) </p>
<p><code><br />
; JED2EQN -- JEDEC file to Boolean Equations disassembler (Version V063)<br />
; Copyright (c) National Semiconductor Corporation 1990-1993<br />
; Disassembled from BEASTIE.JED. Date: 1-5-123<br />
;$GALMODE SMALL</p>
<p>chip EEEK GAL16V8</p>
<p>i1=1 i2=2 i3=3 i4=4 i5=5 i6=6 i7=7 i8=8 i9=9 GND=10 /i11=11 o12=12<br />
o13=13 o14=14 o15=15 o16=16 o17=17 o18=18 o19=19 VCC=20 </p>
<p>@ues 0000000000000000<br />
@ptd unused</p>
<p>equations</p>
<p>o19 = /i1 * /i8 * /i9 * /i11<br />
    +  i1 *  i8 * /i9 * /i11<br />
o18 = /i2 * /i7 * /i9 * /i11<br />
    + /i5 *  i7 * /i9 * /i11<br />
o17 =  i5 * /i7 * /i9 * /i11<br />
    + /i3 *  i7 * /i9 * /i11<br />
o16 = /i4 * /i8 * /i9 * /i11<br />
    + /i6 *  i8 * /i9 * /i11<br />
o15 = /i6 * /i8 * /i9 * /i11<br />
    +  i4 *  i8 * /i9 * /i11<br />
o14 = /i3 * /i7 * /i9 * /i11<br />
    +  i2 *  i7 * /i9 * /i11<br />
/o13 = i9 * /i11<br />
o12 = /i9 * /i11</code></p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2023/01/eeekkPCB-1.jpg"><img src="http://www.bryanmcphail.com/wp/wp-content/uploads/2023/01/eeekkPCB-1-287x300.jpg" alt="eeekkPCB (1)" width="287" height="300" class="alignnone size-medium wp-image-2710" /></a></p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2023/01/20230106_181433.jpg"><img src="http://www.bryanmcphail.com/wp/wp-content/uploads/2023/01/20230106_181433-283x300.jpg" alt="20230106_181433" width="283" height="300" class="alignnone size-medium wp-image-2713" /></a></p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2023/01/EEEK.zip">Click for Eeekk! jed download (zipped)</a></p>
]]></content:encoded>
			<wfw:commentRss>https://www.bryanmcphail.com/wp/?feed=rss2&#038;p=2704</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Konami Pandora&#8217;s Palace arcade pcb repair</title>
		<link>https://www.bryanmcphail.com/wp/?p=2516</link>
		<comments>https://www.bryanmcphail.com/wp/?p=2516#comments</comments>
		<pubDate>Mon, 20 Jul 2020 15:59:41 +0000</pubDate>
		<dc:creator>bmcphail</dc:creator>
				<category><![CDATA[Arcade]]></category>

		<guid isPermaLink="false">http://www.bryanmcphail.com/wp/?p=2516</guid>
		<description><![CDATA[Board 1 Board would boot with some corrupt text, then reset.  The tilemap RAM for text tested ok, but it was just re-seating and cleaning the tilemap custom 85 that fixed the text which now read CPU A OK.  At this point CPU B is meant to kick in and run it&#8217;s own self test [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><span style="text-decoration: underline;">Board 1</span></p>
<p>Board would boot with some corrupt text, then reset.  The tilemap RAM for text tested ok, but it was just re-seating and cleaning the tilemap custom 85 that fixed the text which now read CPU A OK.  At this point CPU B is meant to kick in and run it&#8217;s own self test and report, but the board kept resetting.  A logic probe on CPU B reset line showed it pulsed very briefly then went back to being held in reset, so it didn&#8217;t have a chance to run the self test.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200626_192333.jpg"><img class="alignnone size-medium wp-image-2532" alt="20200626_192333" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200626_192333-280x300.jpg" width="280" height="300" /></a>  <a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200626_193346.jpg"><img class="alignnone size-medium wp-image-2531" alt="20200626_193346" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200626_193346-300x168.jpg" width="300" height="168" /></a></p>
<p>Things got a bit trickier at this point &#8211; the reset is controlled by a LS138 and LS259 that the main CPU can write to.  These components were removed and replaced with no change, so I fired up MAME to debug what exactly happens during the boot sequence.  It turns out both CPUs can write to the LS259 latch &#8211; CPU A performs it&#8217;s self test, enables CPU B and then sits in a tight loop until CPU B finishes and enables interrupts on CPU A at which point they both run in parallel.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200626_195152.jpg"><img class="alignnone size-medium wp-image-2533" alt="20200626_195152" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200626_195152-223x300.jpg" width="223" height="300" /></a></p>
<p>This raises the possibility that CPU B was actually resetting itself with a rogue write to the latch and causing a deadlock&#8230;  And indeed that was the problem, a corrupt program that had tested fine first time around but on a re-read showed some random bad bits.</p>
<p>The game now played with some bad sprites &#8211; other sprites were fine though, so the sprite custom chip and RAM were likely good.  Again, this was just failed eproms that needed replaced.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200627_082703.jpg"><img class="alignnone size-medium wp-image-2534" alt="20200627_082703" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200627_082703-221x300.jpg" width="221" height="300" /></a></p>
<p>Finally, lack of sound was a failed Z80 CPU on the top board &#8211; a logic probe showed it had a valid clock, reset and so on but all data and address lines were stuck high.  Putting in a fresh CPU fixed everything.</p>
<p>&nbsp;</p>
<p><span style="text-decoration: underline;">Board 2</span></p>
<p>Did not boot at all with garbage on screen and the CPU stuck in a watchdog reset.  This turned out to be straightforward as the CPU A boot eprom had completely failed.  Replacing it enabled the game to run, with some bad sprites, but like the first board this was just more failed eproms.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200627_083257.jpg"><img class="alignnone size-medium wp-image-2535" alt="20200627_083257" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200627_083257-206x300.jpg" width="206" height="300" /></a> <a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200627_125047.jpg"><img class="alignnone size-medium wp-image-2536" alt="20200627_125047" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200627_125047-300x168.jpg" width="300" height="168" /></a></p>
]]></content:encoded>
			<wfw:commentRss>https://www.bryanmcphail.com/wp/?feed=rss2&#038;p=2516</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Konami X-Men arcade pcb repair #2</title>
		<link>https://www.bryanmcphail.com/wp/?p=2510</link>
		<comments>https://www.bryanmcphail.com/wp/?p=2510#comments</comments>
		<pubDate>Mon, 20 Jul 2020 15:59:34 +0000</pubDate>
		<dc:creator>bmcphail</dc:creator>
				<category><![CDATA[Arcade]]></category>

		<guid isPermaLink="false">http://www.bryanmcphail.com/wp/?p=2510</guid>
		<description><![CDATA[Game played and passed all self tests (including mask ROM tests) but some background elements had incorrect colors or appeared completely black.  Colors ultimately come from the palette RAM but that was most likely good as the self test had passed.  A group of 3 LS157 chips arbitrate access to the palette RAM address lines [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Game played and passed all self tests (including mask ROM tests) but some background elements had incorrect colors or appeared completely black.  Colors ultimately come from the palette RAM but that was most likely good as the self test had passed.  A group of 3 LS157 chips arbitrate access to the palette RAM address lines &#8211; these can be controlled either by the main CPU, or by the 053251 priority mixer which combines all of the layers (sprites and tilemaps) to send a final output pixel to the palette lookup.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200619_193126.jpg"><img class="alignnone size-medium wp-image-2558" alt="20200619_193126" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200619_193126-300x205.jpg" width="300" height="205" /></a> <a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200619_193430.jpg"><img class="alignnone size-medium wp-image-2557" alt="20200619_193430" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200619_193430-300x224.jpg" width="300" height="224" /></a></p>
<p>All address lines seemed good with a logic probe so the problem was most likely the 053251 itself or the tilemap custom that fed it.  As other tilemap elements were fine, the 053251 was replaced with one from a scrap board and this fixed the problem.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200620_083111.jpg"><img class="alignnone size-medium wp-image-2560" alt="20200620_083111" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200620_083111-168x300.jpg" width="168" height="300" /></a> <a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200620_094439.jpg"><img class="alignnone size-medium wp-image-2559" alt="20200620_094439" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200620_094439-300x208.jpg" width="300" height="208" /></a></p>
]]></content:encoded>
			<wfw:commentRss>https://www.bryanmcphail.com/wp/?feed=rss2&#038;p=2510</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Konami Hyper Sports arcade pcb repair #2</title>
		<link>https://www.bryanmcphail.com/wp/?p=2512</link>
		<comments>https://www.bryanmcphail.com/wp/?p=2512#comments</comments>
		<pubDate>Mon, 20 Jul 2020 15:59:27 +0000</pubDate>
		<dc:creator>bmcphail</dc:creator>
				<category><![CDATA[Arcade]]></category>

		<guid isPermaLink="false">http://www.bryanmcphail.com/wp/?p=2512</guid>
		<description><![CDATA[The game logic seemed to be running but graphics were totally corrupted.  Tilemaps are usually easier to fix than sprite problems so I started there, but the relevant custom chips and RAM checked out fine.  The breakthrough came when I noticed one of the RAM chips never had the write (/W) line enabled at any [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>The game logic seemed to be running but graphics were totally corrupted.  Tilemaps are usually easier to fix than sprite problems so I started there, but the relevant custom chips and RAM checked out fine.  The breakthrough came when I noticed one of the RAM chips never had the write (/W) line enabled at any point.  The write lines should almost always be pulsing on this game as the CPU writes tile data into RAM.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200623_165105.jpg"><img class="alignnone size-medium wp-image-2565" alt="20200623_165105" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200623_165105-300x247.jpg" width="300" height="247" /></a></p>
<p>The V1DIR and V2DIR signals actually start on the top CPU board, but they travel to the bottom and are buffered by an LS241 before reaching the RAM chips.  This chip was removed and tested bad before being replaced.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/hyper.png"><img class="alignnone size-medium wp-image-2571" alt="hyper" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/hyper-300x247.png" width="300" height="247" /></a>  <a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200624_090256.jpg"><img class="alignnone size-medium wp-image-2572" alt="20200624_090256" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200624_090256-300x186.jpg" width="300" height="186" /></a></p>
<p>Which improved things somewhat &#8211; definitely recognisable now but still broken.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200624_091208.jpg"><img class="alignnone size-medium wp-image-2567" alt="20200624_091208" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200624_091208-300x254.jpg" width="300" height="254" /></a></p>
<p>I kept on debugging the tilemap RAM and found a couple of data lines were always high &#8211; I knew the RAM was good so I started to search for ways in which the data could be corrupted before getting to the RAM.  This traced back to the LS245 on the top CPU board that sends CPU data to the video board &#8211; it had failed on multiple lines so literally every byte the video board received was corrupt in some way.  Replacing this fixed everything 100%.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200624_151354.jpg"><img class="alignnone size-medium wp-image-2568" alt="20200624_151354" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200624_151354-210x300.jpg" width="210" height="300" /></a> <a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200624_152505.jpg"><img class="alignnone size-medium wp-image-2569" alt="20200624_152505" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200624_152505-300x239.jpg" width="300" height="239" /></a> <a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200624_152517.jpg"><img class="alignnone size-medium wp-image-2570" alt="20200624_152517" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200624_152517-300x245.jpg" width="300" height="245" /></a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>https://www.bryanmcphail.com/wp/?feed=rss2&#038;p=2512</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Taito Legend of Kage arcade pcb repair #2</title>
		<link>https://www.bryanmcphail.com/wp/?p=2514</link>
		<comments>https://www.bryanmcphail.com/wp/?p=2514#comments</comments>
		<pubDate>Mon, 20 Jul 2020 15:59:20 +0000</pubDate>
		<dc:creator>bmcphail</dc:creator>
				<category><![CDATA[Arcade]]></category>

		<guid isPermaLink="false">http://www.bryanmcphail.com/wp/?p=2514</guid>
		<description><![CDATA[Game just booted to a solid white screen with the CPU in a watchdog reset loop.  This game, like Bubble Bobble, uses custom package RGB DAC&#8217;s that are known to fail (and also need +12V and -5V connected to work) but it seemed the palette RAM was actually passing full white to the DACs so [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Game just booted to a solid white screen with the CPU in a watchdog reset loop.  This game, like Bubble Bobble, uses custom package RGB DAC&#8217;s that are known to fail (and also need +12V and -5V connected to work) but it seemed the palette RAM was actually passing full white to the DACs so the initial problem wasn&#8217;t there.</p>
<p>Usual test first is to check the program ROMs &#8211; and one wouldn&#8217;t read at all due to some kind of internal short.  When replaced the game ran, but without any sprites or tilemaps but at least it proved the RGB customs were working.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200619_170724.jpg"><img class="alignnone size-medium wp-image-2541" alt="20200619_170724" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200619_170724-300x242.jpg" width="300" height="242" /></a></p>
<p>RAM on the video board all tested fine, but what looked like some dirt on the board actually turned out to be a massive gouge that had broken 10-12 traces.  When patched back up the game was fine.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200619_173316.jpg"><img class="alignnone size-medium wp-image-2549" alt="20200619_173316" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200619_173316-263x300.jpg" width="263" height="300" /></a> <a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200619_171604.jpg"><img class="alignnone size-medium wp-image-2540" alt="20200619_171604" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200619_171604-285x300.jpg" width="285" height="300" /></a> <a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200619_191755.jpg"><img class="alignnone size-medium wp-image-2542" alt="20200619_191755" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200619_191755-300x266.jpg" width="300" height="266" /></a></p>
]]></content:encoded>
			<wfw:commentRss>https://www.bryanmcphail.com/wp/?feed=rss2&#038;p=2514</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Taito Frontline arcade pcb repair #2</title>
		<link>https://www.bryanmcphail.com/wp/?p=2508</link>
		<comments>https://www.bryanmcphail.com/wp/?p=2508#comments</comments>
		<pubDate>Mon, 20 Jul 2020 15:59:07 +0000</pubDate>
		<dc:creator>bmcphail</dc:creator>
				<category><![CDATA[Arcade]]></category>

		<guid isPermaLink="false">http://www.bryanmcphail.com/wp/?p=2508</guid>
		<description><![CDATA[Game played but without sound.  Diagnosing sound problems on these boards is pretty easy as all of the sound generators have test points on the top board &#8211; PSG1-4, DAOUT.  Attaching power speakers here lets you hear the individual sound outputs before they are mixed.  If they are all silent then there is most likely [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Game played but without sound.  Diagnosing sound problems on these boards is pretty easy as all of the sound generators have test points on the top board &#8211; PSG1-4, DAOUT.  Attaching power speakers here lets you hear the individual sound outputs before they are mixed.  If they are all silent then there is most likely a sound CPU problem, but for this board everything sounded great at the test points.   The sound is then mixed and sent to the two volume controls &#8211; powered speakers can also be attached directly to the right-most and center pins of the volume pots to check audio post mix.  From there it&#8217;s almost straight to the power amp, and if you can hear audio over powered speakers attached to the power amp input (pin 1) then almost certainly the power amp is dead (or is missing +12V).  In this case the MB3730 amp was replaced to fix sound.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200620_135525.jpg"><img class="alignnone size-medium wp-image-2562" alt="20200620_135525" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200620_135525-144x300.jpg" width="144" height="300" /></a></p>
]]></content:encoded>
			<wfw:commentRss>https://www.bryanmcphail.com/wp/?feed=rss2&#038;p=2508</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tecmo Knight arcade pcb repair</title>
		<link>https://www.bryanmcphail.com/wp/?p=2522</link>
		<comments>https://www.bryanmcphail.com/wp/?p=2522#comments</comments>
		<pubDate>Mon, 20 Jul 2020 15:58:59 +0000</pubDate>
		<dc:creator>bmcphail</dc:creator>
				<category><![CDATA[Arcade]]></category>

		<guid isPermaLink="false">http://www.bryanmcphail.com/wp/?p=2522</guid>
		<description><![CDATA[Game booted, but the red &#38; blue color channels were clearly stuck on.  I went hunting for palette RAM and found it on the top board, it&#8217;s a slightly unusual type &#8211; AAA16K4P-35 with one chip per RGB color.  Swapping in replacements from a Ninja Gaiden parts board restored correct colors, and I could see [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Game booted, but the red &amp; blue color channels were clearly stuck on.  I went hunting for palette RAM and found it on the top board, it&#8217;s a slightly unusual type &#8211; AAA16K4P-35 with one chip per RGB color.  Swapping in replacements from a Ninja Gaiden parts board restored correct colors, and I could see the video board problems in more detail.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200606_165823.jpg"><img class="alignnone size-medium wp-image-2526" alt="20200606_165823" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200606_165823-300x252.jpg" width="300" height="252" /></a> <a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200606_165833.jpg"><img class="alignnone size-medium wp-image-2528" alt="20200606_165833" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200606_165833-300x168.jpg" width="300" height="168" /></a></p>
<p>One tilemap layer had corruption &#8211; the game has 3 tilemap layers and each layer comes from a combination of the Tecmo 3 &amp; 4 custom chips, graphics ROM plus a pair of RAM chips.  One of the RAM chips tested bad straight away, but with that replaced there were still problems.  A logic probe on the ROM showed one of the address lines was floating &#8211; but it had continuity back to the Tecmo-4 custom.  Unfortunately this suggested the line had died inside the custom chip.  Replacing this improved things but there was still a fault with tiles being &#8216;doubled up&#8217;.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200606_174221.jpg"><img class="alignnone size-medium wp-image-2527" alt="20200606_174221" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200606_174221-300x228.jpg" width="300" height="228" /></a></p>
<p>A logic probe on the RAM chip showed the D0 data line was stuck low, and this traced back to the Tecmo-3 custom &#8211; so the doubling was because only even (0,2,4,6,etc) tiles could be selected.  This custom was also replaced with one from the Ninja Gaiden parts board and everything was fixed.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200606_174202.jpg"><img class="alignnone size-medium wp-image-2525" alt="20200606_174202" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200606_174202-300x236.jpg" width="300" height="236" /></a> <a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200607_162257.jpg"><img class="alignnone size-medium wp-image-2529" alt="20200607_162257" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200607_162257-300x201.jpg" width="300" height="201" /></a></p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200607_150125.jpg"><img class="alignnone size-medium wp-image-2564" alt="20200607_150125" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/06/20200607_150125-300x168.jpg" width="300" height="168" /></a> <a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200607_122146.jpg"><img class="alignnone size-medium wp-image-2574" alt="20200607_122146" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/07/20200607_122146-300x168.jpg" width="300" height="168" /></a></p>
]]></content:encoded>
			<wfw:commentRss>https://www.bryanmcphail.com/wp/?feed=rss2&#038;p=2522</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Taito The New Zealand Story arcade pcb repair</title>
		<link>https://www.bryanmcphail.com/wp/?p=2454</link>
		<comments>https://www.bryanmcphail.com/wp/?p=2454#comments</comments>
		<pubDate>Fri, 22 May 2020 14:20:32 +0000</pubDate>
		<dc:creator>bmcphail</dc:creator>
				<category><![CDATA[Arcade]]></category>

		<guid isPermaLink="false">http://www.bryanmcphail.com/wp/?p=2454</guid>
		<description><![CDATA[Game didn&#8217;t boot and immediately shut down the power supply.  Indeed, a meter confirmed only 2 or 3 ohms of resistance between GND and +5V at the edge connector, so something was shorted on the board.  There&#8217;s really no easy way to find a short on a board like this.  Removing all the socketed chips [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Game didn&#8217;t boot and immediately shut down the power supply.  Indeed, a meter confirmed only 2 or 3 ohms of resistance between GND and +5V at the edge connector, so something was shorted on the board.  There&#8217;s really no easy way to find a short on a board like this.  Removing all the socketed chips to eliminate them is a good first step as well as looking for physical damage, especially to capacitors that may bridge GND and +5V.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/05/tnzs1.jpg"><img class="alignnone size-medium wp-image-2484" alt="_tnzs1" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/05/tnzs1-252x300.jpg" width="252" height="300" /></a></p>
<p>Luckily I found the fault fairly quickly &#8211; when I lifted one of the legs of the ZD1 component the short was gone and the board played correctly.  I believe the design of the board is ZD1 provides some overvoltage protection by bleeding the +5V line to GND if required, however in this case it had simply failed and shorted +5V to GND.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/05/tnzs2.jpg"><img class="alignnone size-medium wp-image-2482" alt="_tnzs2" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/05/tnzs2-300x250.jpg" width="300" height="250" /></a> <a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/05/tnzs3.jpg"><img class="alignnone size-medium wp-image-2483" alt="_tnzs3" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/05/tnzs3-300x218.jpg" width="300" height="218" /></a></p>
]]></content:encoded>
			<wfw:commentRss>https://www.bryanmcphail.com/wp/?feed=rss2&#038;p=2454</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sega Afterburner arcade pcb repair</title>
		<link>https://www.bryanmcphail.com/wp/?p=2427</link>
		<comments>https://www.bryanmcphail.com/wp/?p=2427#comments</comments>
		<pubDate>Fri, 22 May 2020 14:20:30 +0000</pubDate>
		<dc:creator>bmcphail</dc:creator>
				<category><![CDATA[Arcade]]></category>

		<guid isPermaLink="false">http://www.bryanmcphail.com/wp/?p=2427</guid>
		<description><![CDATA[Game ran but sprites were garbage &#8211; bad positions and lots of corruption. I ran the self test before doing much more &#8211; and it came back with bad custom IC30.  This is actually a math coprocessor, and the main CPU uses it for maths to position all the sprites in screen space &#8211; so [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Game ran but sprites were garbage &#8211; bad positions and lots of corruption.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/04/ab1.jpg"><img class="alignnone size-medium wp-image-2491" alt="_ab1" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/04/ab1-300x207.jpg" width="300" height="207" /></a> <a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/04/ab2.jpg"><img class="alignnone size-medium wp-image-2492" alt="_ab2" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/04/ab2-300x204.jpg" width="300" height="204" /></a></p>
<p>I ran the self test before doing much more &#8211; and it came back with bad custom IC30.  This is actually a math coprocessor, and the main CPU uses it for maths to position all the sprites in screen space &#8211; so if it fails sprites will be corrupt.</p>
<p>Luckily I had a spare for this chip from a Thunderblade parts board.  Game was perfect after I swapped it in.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/04/ab4.jpg"><img class="alignnone size-medium wp-image-2494" alt="_ab4" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/04/ab4-300x204.jpg" width="300" height="204" /></a> <a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/04/ab3.jpg"><img class="alignnone size-medium wp-image-2493" alt="_ab3" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/04/ab3-300x216.jpg" width="300" height="216" /></a> <a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/04/ab5.jpg"><img class="alignnone size-medium wp-image-2495" alt="_ab5" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/04/ab5-300x168.jpg" width="300" height="168" /></a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>https://www.bryanmcphail.com/wp/?feed=rss2&#038;p=2427</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Data East Heavy Smash arcade pcb repair</title>
		<link>https://www.bryanmcphail.com/wp/?p=2478</link>
		<comments>https://www.bryanmcphail.com/wp/?p=2478#comments</comments>
		<pubDate>Fri, 22 May 2020 14:20:25 +0000</pubDate>
		<dc:creator>bmcphail</dc:creator>
				<category><![CDATA[Arcade]]></category>

		<guid isPermaLink="false">http://www.bryanmcphail.com/wp/?p=2478</guid>
		<description><![CDATA[Game didn&#8217;t boot &#8211; and physical damage was the obvious problem &#8211; the PST518A reset controller was missing from the board.  A replacement was taken from a scrap board and the game ran again. No sound &#8211; again some obvious physical damage &#8211; the power amp had been ripped from the board.  A brand new [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Game didn&#8217;t boot &#8211; and physical damage was the obvious problem &#8211; the PST518A reset controller was missing from the board.  A replacement was taken from a scrap board and the game ran again.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/05/heavy.jpg"><img class="alignnone size-medium wp-image-2489" alt="_heavy" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/05/heavy-300x214.jpg" width="300" height="214" /></a></p>
<p>No sound &#8211; again some obvious physical damage &#8211; the power amp had been ripped from the board.  A brand new MB3730A was bought on Ebay and installed and the game was perfect again.</p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/05/heavy4.jpg"><img class="alignnone size-medium wp-image-2488" alt="_heavy4" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/05/heavy4-300x195.jpg" width="300" height="195" /></a></p>
<p><a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/05/heavy3.jpg"><img class="alignnone size-medium wp-image-2487" alt="_heavy3" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/05/heavy3-300x230.jpg" width="300" height="230" /></a> <a href="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/05/heavy2.jpg"><img class="alignnone size-medium wp-image-2486" alt="_heavy2" src="http://www.bryanmcphail.com/wp/wp-content/uploads/2020/05/heavy2-300x234.jpg" width="300" height="234" /></a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>https://www.bryanmcphail.com/wp/?feed=rss2&#038;p=2478</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
