{File name:  StartMesa.mc
 Description: Mesa Emulator initialization,
 Author: R. Johnsson,
 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.
}

{Assembly Config #	File
	  0		Mesa.db
	  1		RavenMesa.db
	  2		TridentMesa.db
	  3		TridentRavenMesa.db
	  4		MagTapeMesa.db
	  5		TridentMagTapeMesa.db
	  6		Multiport.db
	  7		Dicentra
}

{The Cedar emulator boot consists of 3 phases:
  1) ExtraBanksKernel.mc + IOPBoot.mc + LoadExtraBanks.asm
     (starts all tasks except 6, used for IM loading)
  2) Bank 1 Cedar microcode (no task starts)
  3) Bank 0 Cedar and all IO microcode + Domino (start all tasks except 6).
 After the first boot stage, the old Kernel is no longer needed, so if microstore
 were cramped, it would be possible to eliminate the upper reserve.  However,
 Burdock uses the same area, so we retain the reserves for easier debugging.
 }
	Reserve[0F6F]; Reserve[0F78]; Reserve[0F7F,0FFF];	{Kernel/Burdock}
	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 Burdock loaded bootfile without germ.
}
Set[xtFC0, 1] {see description of bits in Xfer};

SetTask[0]; 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;

	uPCValid ← 0, ClrIntErr,				c1;

IfEqual[Config, 6, SkipTo[Multiport], ];
IfGreater[Config, 3, SkipTo[MagTape], ];
IfEqual[Config, 3, SkipTo[Printer], ];
IfEqual[Config, 1, SkipTo[Printer], ];

{db}	Noop,							c2;
{db}	Noop,							c3;

SkipTo[DisplayOrPrinterOrMagTape];
Printer!
	DCtl ← 2,						c2;
	PCtl ← 3,						c3;

SkipTo[DisplayOrPrinterOrMagTape];
MagTape!
	DCtl ← 2,						c2;
	TCtl ← 1,						c3;
	
SkipTo[DisplayOrPrinterOrMagTape];
Multiport!
	DCtl ← 0,						c2;
	PCtl ← 3,						c3;			
DisplayOrPrinterOrMagTape!

{db
MoreInit:
{db}	Noop,							c1;
	UvG ← TOS ← 0,						c2;
	UBrkByte ← 0,						c3;

	rhTT ← cedarIOPageHigh,					c1;
	TT ← uIOPage,						c2;
	Noop,							c3;

{set all keys up; 2003D thru 20043 ← -1}
	uXTS ← stackP ← 0,					c1;
	Noop,							c2;
	Q ← 7,							c3;

KeyLoop:
	MAR ← [rhTT,IOPage.keyBitsm1+Q], BRANCH[$,KeyDone],	c1;
	uTickCount ← MDR ← L xor ~L, CANCELBR[$,0],		c2;
	Q ← Q - 1, ZeroBr, GOTO[KeyLoop],			c3;
db}

KeyDone:

IfGreater[Config, 1, , SkipTo[ShugartInit]];
IfEqual[Config, 4, SkipTo[ShugartInit],];
IfEqual[Config, 6, SkipTo[ShugartInit],];
{Config = 2, 3, or 5 => Trident init}
	PC ← 0+0+1, CANCELBR[$,0],				c2;
	uWDC ← PC,						c3;

	RCnt ← 0F,						c1;
	KCtl ← RCnt LRot12,					c2;
	KCmd ← U0400,						c3;
SkipTo[EitherDisk];

ShugartInit! {Config = 0, 1, 4, or 6 => SAx000 init}
{db}	Noop,							c1;
{db}	PC ← 0+0+1, CANCELBR[$, 0],				c2;
	uWDC ← PC,						c3;

EitherDisk!
	MAR ← [rhTT,IOPage.DCSB.mask+0]{display interrupt mask},	c1;
	MDR ← 0, uWP ← 0,					c2;
	T ← 88,							c3;

	MAR ← [rhTT,IOPage.DCSB.flags+0]{display flags},	c1;
	MDR ← u8000,						c2;
	T ← T LRot8,						c3;

	MAR ← [rhTT,IOPage.DCSB.border+0]{display border},	c1;
	MDR ← T or 22{8822},					c2;
	uPCCross ← 0,						c3;

{Show 799 in MP
	TT ← uIOPage,						c1;
	rhTT ← cedarIOPageHigh,					c2;
	TT ← TT + MaintenancePanelOffset,			c3;

	T ← 3,							c1;
	T ← T LRot8,						c2;
	T ← T or 37'b {799'd},					c3;

	MAR ← [rhTT, TT+0],					c1;
	MDR ← T,						c2;
}
	dY ← 0F,						c1;
	dY ← dY LRot8,						c2;
	dY ← dY or 0FC,						c3;

	uPMask ← dY,						c1; {0FFC}
	uPMask2 ← dY,						c2; {0FFC}
	dY ← 7,							c3;

	dY ← dY LRot12,						c1;
	uPPMask ← dY,						c2; {7000}
	dY ← 2,							c3;
		
	dY ← dY LRot8,						c1;
	uAVAddr {= u200} ← dY,					c2; {0200}
	dY ← dY + 40,						c3;

	uSDAddr ← dY {240'h = 1100'b},				c1; {0240 = 1100'b}
	dY ← uStickyReg ← 0, {floating point}			c2;
	TT ← uSDAddr,						c3;

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