{DataTest.mc, HGM, 14-Feb-85  1:50:31}

	Reserve[0F5F, 0FFF]; {section used by the CP Kernel }
	SetTask[0]; StartAddress[Go];

RegDef[address, R, 1];
  RegDef[rhAddr, RH, 1];
RegDef[expected, R, 3];
RegDef[found, R, 4];
RegDef[maskIn, R, 5];
RegDef[maskOut, R, 6];

RegDef[echoPlug, R, 09];
RegDef[address10, R, 0A];
RegDef[address20, R, 0B];
RegDef[temp, R, 0D];
RegDef[passCount, R, 0E]; {number of good passes}


Trap:	temp ← RRot1 ErrnIBnStkp, ClrIntErr, CANCELBR[$, 0F],	c1, at[0];
	Xbus ← temp LRot0, XwdDisp,				c2;
	DISP2[TrapType],					c3;
	
Parity:	GOTO[GoToGo],						c1, at[0,4,TrapType];
Init:	GOTO[GoToGo],						c1, at[1,4,TrapType];
Stack:	GOTO[GoToGo],						c1, at[2,4,TrapType];
IB:	GOTO[GoToGo],						c1, at[3,4,TrapType];

GoToGo:
	Noop,							c2;
	Noop, GOTO[Go],						c3;

Go: 	passCount ← 0, ClrIntErr,				c1;
	ExtCtrl ← 5, {Init Incr, Zero, UnBlank}			c2;
	expected ← 0,						c3;

MainLoop:
	Noop,							c1;
	Noop,							c2;
	Noop,							c3;

{------------------------------------------------------------------------------------}

ResetEverybody:
	address ← 90,						c1;
	address ← address LRot8, {9000}				c2;
	rhAddr ← 4, {Misc: 49000}				c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	MDR ← 001, {Krock to avoid getting Booted}		c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0], {Master Interrupt Control}	c1;
	MDR ← 1, {Reset}					c2;
	Noop,							c3;

	address ← 90,						c1;
	address ← address LRot8, {9000}				c2;
	rhAddr ← 5, {EProm: 59000}				c3;

	IO ← [rhAddr, address + 0], {Master Interrupt Control}	c1;
	MDR ← 1, {Reset}					c2;
	Noop,							c3;

	address ← 10,						c1;
	address ← address LRot8, {1000}				c2;
	rhAddr ← 2, {Modem: 21000}				c3;

	IO ← [rhAddr, address + 0], {Master Interrupt Control}	c1;
	MDR ← 1, {Reset}					c2;
	Noop,							c3;

	address ← 10,						c1;
	address ← address LRot8, {1000}				c2;
	rhAddr ← 4, {Dialer0: 41000}				c3;

	IO ← [rhAddr, address + 0], {Master Interrupt Control}	c1;
	MDR ← 1, {Reset}					c2;
	Noop,							c3;

	address ← 10,						c1;
	address ← address LRot8, {1000}				c2;
	rhAddr ← 5, {Dialer1: 51000}				c3;

	IO ← [rhAddr, address + 0], {Master Interrupt Control}	c1;
	MDR ← 1, {Reset}					c2;
	Noop,							c3;

	address ← 10,						c1;
	address ← address LRot8, {1000}				c2;
	rhAddr ← 6, {Dialer2: 61000}				c3;

	IO ← [rhAddr, address + 0], {Master Interrupt Control}	c1;
	MDR ← 1, {Reset}					c2;
	Noop,							c3;

FirstLoop:
	Noop,							c1;
	Noop,							c2;
	Noop,							c3;

Misc:
	address ← 90,						c1;
	address ← address LRot8, {9000}				c2;
	rhAddr ← 4, {Misc: 49000}				c3;

	address10 ← address + 10,				c1;
	address20 ← address + 20,				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0], {Master Interrupt Control}	c1;
	MDR ← 0, {~Reset}					c2;
	Noop,							c3;

TestMiscA:
	maskOut ← 0FF, {All 8 bits}				c1;
	maskIn ← 0FF, {All 8 bits},				c2;
	Noop,							c3;
	
	IO ← [rhAddr, address20 + 03], {Port A Direction}	c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 004, {Port A Enable}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	MDR ← expected,						c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskOut and found,					c1;
	temp ← Q,						c2;
	Q ← maskOut and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, MiscPortAInternalDataFailed],			c2;
	Noop,							c3;

	IO ← [rhAddr, address20 + 03], {Port A Direction}	c1;
	MDR ← 0FF, {Input}					c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskIn and found,					c1;
	temp ← Q,						c2;
	Q ← maskIn and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, MiscPortAFloatDataFailed],			c2;
	Noop,							c3;

TestMiscB:
	maskOut ← 01F, {Low 5 bits}				c1;
	maskIn ← 010, {Pullups on mEn work too well}		c2;
	Noop,							c3;
	
	IO ← [rhAddr, address20 + 0B], {Port B Direction}	c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 080, {Port B Enable}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	MDR ← expected,						c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskOut and found,					c1;
	temp ← Q,						c2;
	Q ← maskOut and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, MiscPortBInternalDataFailed],			c2;
	Noop,							c3;

	IO ← [rhAddr, address20 + 0B], {Port B Direction}	c1;
	MDR ← 0FF, {Input}					c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskIn and found,					c1;
	temp ← Q,						c2;
	Q ← maskIn and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, MiscPortBFloatDataFailed],			c2;
	Noop,							c3;

TestMiscC:
	maskOut ← 00E, {Only 4 bits, low bit is Boot'}		c1;
	maskIn ← 002, {Pullups on IntChan}			c2;
	Noop,							c3;
	
	IO ← [rhAddr, address + 06], {Port C Direction}		c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 010, {Port C Enable}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	MDR ← 00F and expected, {Write Enable mask}		c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskOut and found,					c1;
	temp ← Q,						c2;
	Q ← maskOut and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, MiscPortCInternalDataFailed],			c2;
	Noop,							c3;

	IO ← [rhAddr, address + 06], {Port C Direction}		c1;
	MDR ← 0F, {Input (only 4 bits)}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskIn and found,					c1;
	temp ← Q,						c2;
	Q ← maskIn and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, MiscPortCFloatDataFailed],			c2;
	Noop,							c3;

EProm:
	address ← 90,						c1;
	address ← address LRot8, {9000}				c2;
	rhAddr ← 5, {EProm: 59000}				c3;

	address10 ← address + 10,				c1;
	address20 ← address + 20,				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0], {Master Interrupt Control}	c1;
	MDR ← 0, {~Reset}					c2;
	Noop,							c3;

TestEPromA:
	maskOut ← 0FF, {All 8 bits}				c1;
	maskIn ← 03F, {Pullups on 2 high bits},			c2;
	Noop,							c3;
	
	IO ← [rhAddr, address20 + 03], {Port A Direction}	c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 004, {Port A Enable}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	MDR ← expected,						c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskOut and found,					c1;
	temp ← Q,						c2;
	Q ← maskOut and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, EPromPortAInternalDataFailed],		c2;
	Noop,							c3;

	IO ← [rhAddr, address20 + 03], {Port A Direction}	c1;
	MDR ← 0FF, {Input}					c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskIn and found,					c1;
	temp ← Q,						c2;
	Q ← maskIn and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, EPromPortAFloatDataFailed],			c2;
	Noop,							c3;

TestEPromB:
	maskOut ← 0FF, {All 8 bits}				c1;
	maskIn ← 0FF,						c2;
	Noop,							c3;
	
	IO ← [rhAddr, address20 + 0B], {Port B Direction}	c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 080, {Port B Enable}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	MDR ← expected,						c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskOut and found,					c1;
	temp ← Q,						c2;
	Q ← maskOut and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, EPromPortBInternalDataFailed],		c2;
	Noop,							c3;

	IO ← [rhAddr, address20 + 0B], {Port B Direction}	c1;
	MDR ← 0FF, {Input}					c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskIn and found,					c1;
	temp ← Q,						c2;
	Q ← maskIn and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, EPromPortBFloatDataFailed],			c2;
	Noop,							c3;

TestEPromC:
	maskOut ← 00F, {Only 4 bits}				c1;
	maskIn ← 000, {was 007, changed for last build}		c2;
	Noop,							c3;
	
	IO ← [rhAddr, address + 06], {Port C Direction}		c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 010, {Port C Enable}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	MDR ← 00F and expected, {Write Enable mask}		c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskOut and found,					c1;
	temp ← Q,						c2;
	Q ← maskOut and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, EPromPortCInternalDataFailed],		c2;
	Noop,							c3;

	IO ← [rhAddr, address + 06], {Port C Direction}		c1;
	MDR ← 0F, {Input (only 4 bits)}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskIn and found,					c1;
	temp ← Q,						c2;
	Q ← maskIn and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, EPromPortCFloatDataFailed],			c2;
	Noop,							c3;

Modem:
	address ← 10,						c1;
	address ← address LRot8, {1000}				c2;
	rhAddr ← 2, {Modem: 21000}				c3;

	address10 ← address + 10,				c1;
	address20 ← address + 20,				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0], {Master Interrupt Control}	c1;
	MDR ← 0, {~Reset}					c2;
	Noop,							c3;

TestModemA:
	maskOut ← 000, {DSR*'}					c1;
	maskIn ← 000, {All are Input},				c2;
	Noop,							c3;
	
	IO ← [rhAddr, address20 + 03], {Port A Direction}	c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 004, {Port A Enable}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	MDR ← expected,						c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskOut and found,					c1;
	temp ← Q,						c2;
	Q ← maskOut and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, ModemPortAInternalDataFailed],		c2;
	Noop,							c3;

	IO ← [rhAddr, address20 + 03], {Port A Direction}	c1;
	MDR ← 0FF, {Input}					c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskIn and found,					c1;
	temp ← Q,						c2;
	Q ← maskIn and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, ModemPortAFloatDataFailed],			c2;
	Noop,							c3;

TestModemB:
	maskOut ← 000, {RI*'}					c1;
	maskIn ← 000, {All are Input},				c2;
	Noop,							c3;
	
	IO ← [rhAddr, address20 + 0B], {Port B Direction}	c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 080, {Port B Enable}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	MDR ← expected,						c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskOut and found,					c1;
	temp ← Q,						c2;
	Q ← maskOut and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, ModemPortBInternalDataFailed],		c2;
	Noop,							c3;

	IO ← [rhAddr, address20 + 0B], {Port B Direction}	c1;
	MDR ← 0FF, {Input}					c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskIn and found,					c1;
	temp ← Q,						c2;
	Q ← maskIn and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, ModemPortBFloatDataFailed],			c2;
	Noop,							c3;

TestModemC:
	maskOut ← 00F, {Only 4 bits}				c1;
	maskIn ← 00E, {Inputs to chips is too much load}	c2;
	Noop,							c3;
	
	IO ← [rhAddr, address + 06], {Port C Direction}		c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 010, {Port C Enable}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	MDR ← 00F and expected, {Write Enable mask}		c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskOut and found,					c1;
	temp ← Q,						c2;
	Q ← maskOut and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, ModemPortCInternalDataFailed],		c2;
	Noop,							c3;

	IO ← [rhAddr, address + 06], {Port C Direction}		c1;
	MDR ← 0F, {Input (only 4 bits)}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskIn and found,					c1;
	temp ← Q,						c2;
	Q ← maskIn and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, ModemPortCFloatDataFailed],			c2;
	Noop,							c3;

Dialer0:
	address ← 10,						c1;
	address ← address LRot8, {1000}				c2;
	rhAddr ← 4, {Dialer0: 41000}				c3;

	address10 ← address + 10,				c1;
	address20 ← address + 20,				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0], {Master Interrupt Control}	c1;
	MDR ← 0, {~Reset}					c2;
	Noop,							c3;

TestDialer0A:
	maskOut ← 0FF, {All are outputs}			c1;
	maskIn ← 000, {Chips pull up}				c2;
	Noop,							c3;
	
	IO ← [rhAddr, address20 + 03], {Port A Direction}	c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 004, {Port A Enable}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	MDR ← expected,						c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskOut and found,					c1;
	temp ← Q,						c2;
	Q ← maskOut and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, Dialer0PortAInternalDataFailed],		c2;
	Noop,							c3;

	IO ← [rhAddr, address20 + 03], {Port A Direction}	c1;
	MDR ← 0FF, {Input}					c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskIn and found,					c1;
	temp ← Q,						c2;
	Q ← maskIn and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, Dialer0PortAFloatDataFailed],			c2;
	Noop,							c3;

{Keep driving the data wanted below.}
	IO ← [rhAddr, address20 + 03], {Port A Direction}	c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

TestDialer0B:
	maskOut ← 000, {DI0*'}					c1;
	maskIn ← echoPlug, {Input from PortA},			c2;
	Noop,							c3;
	
	IO ← [rhAddr, address20 + 0B], {Port B Direction}	c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 084, {Port A+B Enable}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	MDR ← expected,						c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskOut and found,					c1;
	temp ← Q,						c2;
	Q ← maskOut and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, Dialer0PortBInternalDataFailed],		c2;
	Noop,							c3;

	IO ← [rhAddr, address20 + 0B], {Port B Direction}	c1;
	MDR ← 0FF, {Input}					c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskIn and found,					c1;
	temp ← Q,						c2;
	Q ← maskIn and expected,				c3;

{This checking data that has gone all the way out through the echo plug.}
	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, Dialer0PortBEchoDataFailed],			c2;
	Noop,							c3;

TestDialer0C:
	maskOut ← 00F, {Only 4 bits}				c1;
	maskIn ← 00E, {Inputs to chips is too much load}	c2;
	Noop,							c3;
	
	IO ← [rhAddr, address + 06], {Port C Direction}		c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 010, {Port C Enable}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	MDR ← 00F and expected, {Write Enable mask}		c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskOut and found,					c1;
	temp ← Q,						c2;
	Q ← maskOut and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, Dialer0PortCInternalDataFailed],		c2;
	Noop,							c3;

	IO ← [rhAddr, address + 06], {Port C Direction}		c1;
	MDR ← 0F, {Input (only 4 bits)}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskIn and found,					c1;
	temp ← Q,						c2;
	Q ← maskIn and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, Dialer0PortCFloatDataFailed],			c2;
	Noop,							c3;

Dialer1:
	address ← 10,						c1;
	address ← address LRot8, {1000}				c2;
	rhAddr ← 5, {Dialer1: 51000}				c3;

	address10 ← address + 10,				c1;
	address20 ← address + 20,				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0], {Master Interrupt Control}	c1;
	MDR ← 0, {~Reset}					c2;
	Noop,							c3;

TestDialer1A:
	maskOut ← 0FF, {All are outputs}			c1;
	maskIn ← 000, {Chips pull up}				c2;
	Noop,							c3;
	
	IO ← [rhAddr, address20 + 03], {Port A Direction}	c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 004, {Port A Enable}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	MDR ← expected,						c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskOut and found,					c1;
	temp ← Q,						c2;
	Q ← maskOut and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, Dialer1PortAInternalDataFailed],		c2;
	Noop,							c3;

	IO ← [rhAddr, address20 + 03], {Port A Direction}	c1;
	MDR ← 0FF, {Input}					c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskIn and found,					c1;
	temp ← Q,						c2;
	Q ← maskIn and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, Dialer1PortAFloatDataFailed],			c2;
	Noop,							c3;

{Keep driving the data wanted below.}
	IO ← [rhAddr, address20 + 03], {Port A Direction}	c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

TestDialer1B:
	maskOut ← 000, {DI0*'}					c1;
	maskIn ← echoPlug, {Input from PortA},			c2;
	Noop,							c3;
	
	IO ← [rhAddr, address20 + 0B], {Port B Direction}	c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 084, {Port A+B Enable}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	MDR ← expected,						c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskOut and found,					c1;
	temp ← Q,						c2;
	Q ← maskOut and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, Dialer1PortBInternalDataFailed],		c2;
	Noop,							c3;

	IO ← [rhAddr, address20 + 0B], {Port B Direction}	c1;
	MDR ← 0FF, {Input}					c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskIn and found,					c1;
	temp ← Q,						c2;
	Q ← maskIn and expected,				c3;

{This checking data that has gone all the way out through the echo plug.}
	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, Dialer1PortBEchoDataFailed],			c2;
	Noop,							c3;

TestDialer1C:
	maskOut ← 00F, {Only 4 bits}				c1;
	maskIn ← 00E, {Inputs to chips is too much load}	c2;
	Noop,							c3;
	
	IO ← [rhAddr, address + 06], {Port C Direction}		c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 010, {Port C Enable}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	MDR ← 00F and expected, {Write Enable mask}		c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskOut and found,					c1;
	temp ← Q,						c2;
	Q ← maskOut and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, Dialer1PortCInternalDataFailed],		c2;
	Noop,							c3;

	IO ← [rhAddr, address + 06], {Port C Direction}		c1;
	MDR ← 0F, {Input (only 4 bits)}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskIn and found,					c1;
	temp ← Q,						c2;
	Q ← maskIn and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, Dialer1PortCFloatDataFailed],			c2;
	Noop,							c3;

Dialer2:
	address ← 10,						c1;
	address ← address LRot8, {1000}				c2;
	rhAddr ← 6, {Dialer2: 61000}				c3;

	address10 ← address + 10,				c1;
	address20 ← address + 20,				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0], {Master Interrupt Control}	c1;
	MDR ← 0, {~Reset}					c2;
	Noop,							c3;

TestDialer2A:
	maskOut ← 0FF, {All are outputs}			c1;
	maskIn ← 000, {Chips pull up}				c2;
	Noop,							c3;
	
	IO ← [rhAddr, address20 + 03], {Port A Direction}	c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 004, {Port A Enable}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	MDR ← expected,						c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskOut and found,					c1;
	temp ← Q,						c2;
	Q ← maskOut and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, Dialer2PortAInternalDataFailed],		c2;
	Noop,							c3;

	IO ← [rhAddr, address20 + 03], {Port A Direction}	c1;
	MDR ← 0FF, {Input}					c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskIn and found,					c1;
	temp ← Q,						c2;
	Q ← maskIn and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, Dialer2PortAFloatDataFailed],			c2;
	Noop,							c3;

{Keep driving the data wanted below.}
	IO ← [rhAddr, address20 + 03], {Port A Direction}	c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

TestDialer2B:
	maskOut ← 000, {DI0*'}					c1;
	maskIn ← echoPlug, {Input from PortA},			c2;
	Noop,							c3;
	
	IO ← [rhAddr, address20 + 0B], {Port B Direction}	c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 084, {Port A+B Enable}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	MDR ← expected,						c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskOut and found,					c1;
	temp ← Q,						c2;
	Q ← maskOut and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, Dialer2PortBInternalDataFailed],		c2;
	Noop,							c3;

	IO ← [rhAddr, address20 + 0B], {Port B Direction}	c1;
	MDR ← 0FF, {Input}					c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskIn and found,					c1;
	temp ← Q,						c2;
	Q ← maskIn and expected,				c3;

{This checking data that has gone all the way out through the echo plug.}
	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, Dialer2PortBEchoDataFailed],			c2;
	Noop,							c3;

TestDialer2C:
	maskOut ← 00F, {Only 4 bits}				c1;
	maskIn ← 00E, {Inputs to chips is too much load}	c2;
	Noop,							c3;
	
	IO ← [rhAddr, address + 06], {Port C Direction}		c1;
	MDR ← ~maskOut, {Output}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 010, {Port C Enable}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	MDR ← 00F and expected, {Write Enable mask}		c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskOut and found,					c1;
	temp ← Q,						c2;
	Q ← maskOut and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, Dialer2PortCInternalDataFailed],		c2;
	Noop,							c3;

	IO ← [rhAddr, address + 06], {Port C Direction}		c1;
	MDR ← 0F, {Input (only 4 bits)}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	Q ← maskIn and found,					c1;
	temp ← Q,						c2;
	Q ← maskIn and expected,				c3;

	[] ← temp xor Q, NZeroBr,				c1;
	BRANCH[$, Dialer2PortCFloatDataFailed],			c2;
	Noop,							c3;

FirstLoopEnd:
	Noop,							c1;
	expected ← expected + 1, PgCarryBr,			c2;
	expected ← expected and 0FF, BRANCH[FirstLoop, $],	c3;

{------------------------------------------------------------------------------------}

{This isn't really what I want yet.
	Set mData, mEn and PromOE' HIGH.
	Maybe shorts to PromAd will show up. }

SecondSection:
	Noop,							c1;
	Noop,							c2;
	Noop,							c3;

SecondMisc:
	address ← 90,						c1;
	address ← address LRot8, {9000}				c2;
	rhAddr ← 4, {Misc: 49000}				c3;

	address10 ← address + 10,				c1;
	address20 ← address + 20,				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	MDR ← 0FF,						c2;
	Noop,							c3;

	IO ← [rhAddr, address20 + 03], {Port A Direction}	c1;
	MDR ← 000, {Output}					c2;
	Noop,							c3;

	IO ← [rhAddr, address20 + 0B], {Port B Direction}	c1;
	MDR ← 0E0, {Top 3 bits are input}			c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	MDR ← 0FF, {mEn}					c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	MDR ← 00F, {Beware of Boot'}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 06], {Port C Direction}		c1;
	MDR ← 0F, {Output}					c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 094, {Enable Ports A, B, and C}			c2;
	Noop,							c3;

SecondEprom:
	address ← 90,						c1;
	address ← address LRot8, {9000}				c2;
	rhAddr ← 5, {EProm: 59000}				c3;

	address10 ← address + 10,				c1;
	address20 ← address + 20,				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0F], {Port C Data}		c1;
	MDR ← 00F, {Beware of Boot'}				c2;
	Noop,							c3;

	IO ← [rhAddr, address + 06], {Port C Direction}		c1;
	MDR ← 0F, {Output}					c2;
	Noop,							c3;

	IO ← [rhAddr, address + 01], {Master Config/Control}	c1;
	MDR ← 094, {Enable Ports A, B, and C}			c2;
	Noop,							c3;

SecondLoop:
	Noop,							c1;
	Noop,							c2;
	Noop,							c3;

TestPromAddr:
	IO ← [rhAddr, address20 + 03], {Port A Direction}	c1;
	MDR ← 000, {All Output}					c2;
	Noop,							c3;

	IO ← [rhAddr, address20 + 0B], {Port B Direction}	c1;
	MDR ← 000, {All Output}					c2;
	temp ← expected LRot8,					c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	MDR ← temp,						c2;
	Noop,							c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	MDR ← expected,						c2;
	Noop,							c3;

	IO ← [rhAddr, address20 + 03], {Port A Direction}	c1;
	MDR ← 03F, {2 high bits have pullups}			c2;
	Noop,							c3;

	IO ← [rhAddr, address20 + 0B], {Port B Direction}	c1;
	MDR ← 0FF, {All Input (float)}				c2;
	temp ← expected LRot8,					c3;

	IO ← [rhAddr, address + 0D], {Port A Data}		c1;
	Noop,							c2;
	found ← MD,						c3;

	IO ← [rhAddr, address + 0E], {Port B Data}		c1;
	found ← found LRot8,					c2;
	found ← found or MD,					c3;

	[] ← found xor expected, NZeroBr,			c1;
	BRANCH[$, PromAddrMashed],				c2;
	Noop,							c3;

SecondLoopEnd:
	Noop,							c1;
	expected ← expected + 1, CarryBr,			c2;
	expected ← expected, BRANCH[SecondLoop, $],		c3;

	ExtCtrl ← 3, {Gets Bumped on rising edge} 		c1;
	ExtCtrl ← 7,						c2;
	passCount ← passCount + 1, GOTO[MainLoop],		c3;
	

{------------------------------------------------------------------------------------}


	
MiscPortAInternalDataFailed:	GOTO[Restart],			c3;
MiscPortAFloatDataFailed:	GOTO[Restart],			c3;
MiscPortBInternalDataFailed:	GOTO[Restart],			c3;
MiscPortBFloatDataFailed:	GOTO[Restart],			c3;
MiscPortCInternalDataFailed:	GOTO[Restart],			c3;
MiscPortCFloatDataFailed:	GOTO[Restart],			c3;
	
EPromPortAInternalDataFailed:	GOTO[Restart],			c3;
EPromPortAFloatDataFailed:	GOTO[Restart],			c3;
EPromPortBInternalDataFailed:	GOTO[Restart],			c3;
EPromPortBFloatDataFailed:	GOTO[Restart],			c3;
EPromPortCInternalDataFailed:	GOTO[Restart],			c3;
EPromPortCFloatDataFailed:	GOTO[Restart],			c3;
	
ModemPortAInternalDataFailed:	GOTO[Restart],			c3;
ModemPortAFloatDataFailed:	GOTO[Restart],			c3;
ModemPortBInternalDataFailed:	GOTO[Restart],			c3;
ModemPortBFloatDataFailed:	GOTO[Restart],			c3;
ModemPortCInternalDataFailed:	GOTO[Restart],			c3;
ModemPortCFloatDataFailed:	GOTO[Restart],			c3;
	
Dialer0PortAInternalDataFailed:	GOTO[Restart],			c3;
Dialer0PortAFloatDataFailed:	GOTO[Restart],			c3;
Dialer0PortBInternalDataFailed:	GOTO[Restart],			c3;
Dialer0PortBEchoDataFailed:	GOTO[Restart],			c3;
Dialer0PortCInternalDataFailed:	GOTO[Restart],			c3;
Dialer0PortCFloatDataFailed:	GOTO[Restart],			c3;

Dialer1PortAInternalDataFailed:	GOTO[Restart],			c3;
Dialer1PortAFloatDataFailed:	GOTO[Restart],			c3;
Dialer1PortBInternalDataFailed:	GOTO[Restart],			c3;
Dialer1PortBEchoDataFailed:	GOTO[Restart],			c3;
Dialer1PortCInternalDataFailed:	GOTO[Restart],			c3;
Dialer1PortCFloatDataFailed:	GOTO[Restart],			c3;

Dialer2PortAInternalDataFailed:	GOTO[Restart],			c3;
Dialer2PortAFloatDataFailed:	GOTO[Restart],			c3;
Dialer2PortBInternalDataFailed:	GOTO[Restart],			c3;
Dialer2PortBEchoDataFailed:	GOTO[Restart],			c3;
Dialer2PortCInternalDataFailed:	GOTO[Restart],			c3;
Dialer2PortCFloatDataFailed:	GOTO[Restart],			c3;
	
PromAddrMashed:	GOTO[Restart],					c3;
	
Restart:
	Q ← 0FF,						c1;
	Noop,							c2;
RestartLoop:
	Noop,							c3;

	Q ← Q - 1, ZeroBr,					c1;
	BRANCH[RestartLoop, $],					c2;
	GOTO[Go],						c3;

{------------------------------------------------------------------------------------}