{File name:  StartCedar.mc
 Description: Cedar Emulator initialization,

 Last Edited:
  Sturgis: 16-Sep-83 10:47:37: add a patch to zero uStickyReg for Floating point,
	a Kludge added because rollBack dosn't do it.  Once rollback zeros the
	register, all is well and this patch can be removed.
  Fiala 11-Jun-86 15:40:48:  Prepare for Initial changes by inserting init for u200
	and uSDAddr; remove def'n for uStickyRegx.
  Fiala 23-Jul-86 15:36:19 Insert changes for alternate configurations from 12.0
   	product microcode; do not assume that uIOPage contains bank number in rh;
	SAx000 code gets new init of PCtl.
  Fiala 25-Jul-86  9:47:58 Removed uStickyReg and uSDAddr init to InitDLion.mc.
  Fiala 30-Jul-86 10:29:20 Cosmetic.
  Fiala  9-Sep-86 15:13:40 Move Display IOPage defn's to Dandelion.dfn.
  Fiala 18-Nov-86 14:01:33 Add assembly config switch for Dicentra.
  Fiala 30-Jan-87 17:35:57 Removed useless rhTT ←; cosmetic edits to make
  	keys up init like Pilot 12.2.
  Fiala  6-Mar-87 10:54:48 Move this module from Bank 1 to Bank 0 for new booting
  	procedure.  Move Kernel & multi-bank reserves here from CedarB0.mc.
	Changed multi-bank reserve to be [1, 7F] and [800, 801] instead of [1, 0FF].
	Changed exit to do bank cross to B1EFCHaveLink.  Put code to show 799 in
	MP in as a comment.
  Trow	20-Oct-87 22:09:46 Remove initialization of DCtl, PCtl, KCtl, IOPCtl.  Fix bank cross.
  Trow	22-Oct-87 23:13:05 Add Cedar Emulator register (constants) initialization.
  Trow	27-Oct-87 19:09:32 Convert to StartCedar.mc.
}


	Reserve[0F6F]; Reserve[0F78]; Reserve[0F7F,0FFF];	{Kernel/Bermuda}
	Reserve[1, 7F]; {ExtraBanksKernel & IOPBoot}
	Reserve[800, 801]; {Don't know why this is reserved}


{
Normal boot starts at Germ, Floppy boot at Germ+1.
Start at Go for Bermuda loaded bootfile without germ.
}

Set[xtFC0, 1] {see description of bits in Xfer};

StartAddress[Germ];
	
Germ:	TOS ← 3E, rhMDS ← 3E, CANCELBR[SetMDS,0F],		c1, at[0, 2, Germ];
Go:	TOS ← 2, rhMDS ← 2, CANCELBR[SetMDS,0F],		c1, at[1, 2, Germ];
SetMDS:	UvMDS ← TOS,						c2;
	rhT ← xtFC0,						c3;

	uXTS ← stackP ← 0,					c1;
	UvG ← 0,						c2;
	UBrkByte ← 0,						c3;

	T ← 2,							c1;
	T {200} ← T LRot8,					c2;
	u200 {200} ← T, {uAVAddr = u200}			c3;

	T {240} ← T + 40,					c1;
	uSDAddr {240} ← T,					c2;
	TT ← uSDAddr,						c3;

	T {1FF} ← LShift1 0FF, SE ← 1,				c1;
	T {3FF} ← LShift1 T, SE ← 1,				c2;
	T {7FF} ← T LShift1, SE ← 1,				c3;

	u7FF {7FF} ← T, T {FFF} ← T LShift1, SE ← 1,		c1;
	T {1FFF} ← T LShift1, SE ← 1,				c2;
	u1FFF {1FFF} ← T, T {3FFF} ← T LShift1, SE ← 1,		c3;

	u3FFF {3FFF} ← T,					c1;
	T {8000} ← RShift1 0, SE ← 1,				c2;
	u8000 {8000} ← T,					c3;

	T ← 0F,							c1;
	T {0F00} ← T LRot8,					c2;
	T {0FFC} ← T or 0FC,					c3;

	uPMask {0FFC} ← T,					c1;
	uPMask2 {0FFC} ← T,					c2;
	Noop,							c3;

	T ← 7,							c1;
	T {7000} ← T LRot12,					c2;
	uPPMask {7000} ← T,					c3;

	uPCCross ← 0,						c1;
	uPCValid ← 0,						c2;
	PC ← 1,							c3;

	uWDC ← PC, ClrIntErr,					c1;
	uWP ← 0,						c2;
	uStickyReg ← 0,						c3;

{write 799 in maintenance panel}
	TT ← uMaintPanel, {maint panel code}			c1;
	rhTT ← uIORgnHigh,					c2;
	Noop,							c3;

	TOS ← 0F,						c1;
	TOS ← TOS LRot8,					c2;
	TOS ← TOS or 31 {F31 byteswapped = 799'd},		c3;

	MAR ← [rhTT, TT + 0],					c1;
	MDR ← TOS,						c2;
	TT ← TT + 1, {maint panel down-notify mask}		c3;

	MAR ← [rhTT, TT + 0],					c1;
	Noop,							c2;
	TOS ← MD,						c3;

{TOS contains notify mask: byte-mask in high byte, byte offset in low}
	T ← uMesaProc,						c1;
	rhT ← uIORgnHigh,					c2;
	TT ← LShift1 (T + downNotifyBits),
		LOOPHOLE[niblTiming],				c3;

	MAR ← [rhT, T + notifiersLockMask],			c1;
	STK ← TOS, T ← TOS and ~0FF, CANCELBR[$,0],		c2;
	TOS ← MD, L4 ← SoftwareLockRets.StartCedar,		c3;

	rhTT ← STK, pop, XLDisp,				c1;
{the following branch is reversal of Mesa byte order to do byte-swapping for IOP}
	TT ← RShift1 (TT + rhTT), LOOPHOLE[niblTiming],
		BRANCH[LowByteMask,$,2],			c2;
	rhT ← lock.or, SetMPIntIOP, CALL[SoftwareLock],		c3;
LowByteMask:
	rhT ← lock.or, SetMPIntIOP,				c3;

	MAR ← [rhIORgn, rIORgn + iopRequestsLock],		c1;
	T ← T LRot8, CANCELBR[SoftwareLockSideDoor,0],		c2;

	MDR ← 0, CANCELBR[$,0],					c2, at[SoftwareLockRets.StartCedar,10,SoftwareLockRets];
	ClrMPIntIOP,						c3;

LastChance:
	Bank ← MSBank1,						c1;
	T ← TT + 276'b {T ← 1376'b}, GOTOABS[BxEFCHaveLink],	c2;
	Udest ← T, YDisp, L ← 0, GOTOABS[B1EFCHaveLink],	c3, at[BxEFCHaveLink];