:Title[Misc];	*Code common to Alto and Mesa emulators

OnPage[XMiscPage];

*Common subroutine for Mesa/Alto ReadClock.  Takes 430b in T, returns
*(VM 430) in RTemp, (RM[325]) in T.

MXRClk:	PFetch1[MDS,RTemp];
	RTemp1 ← 325C;
	T ← (SStkP&NStkP) xor (377C);
	StkP ← RTemp1, RTemp1 ← T, NoRegILockOK;
	T ← (Stack) and not (77C); *Return Most Significant 10d bits
	StkP ← RTemp1, return;

SetIOBases:
	T ← (SStkP&NStkP) xor (377C);
	RTemp ← 177C; *high base for tasks 4-7
	StkP ← RTemp, RTemp ← T, NoRegILockOK;
	T ← MDShi;
	Stack ← T;
	RTemp1 ← 277C; *high base for tasks 10-13d
	StkP ← RTemp1;
	Stack ← T;
	RTemp1 ← pTimerBasehi;
	StkP ← RTemp1;
	Stack ← T;
	T ← MNBR;
	StkP ← RTemp, RTemp ← T, NoRegILockOK;
	T ← Rsh[RTemp,10], Return; *return high byte of old base


*Common subroutine for Mesa/Alto Partition instruction.
*newP in RTemp, result in T.
MXPar:	RTemp ← T, DblGotoP[GetDefPar,TrySetPar,Alu=0]; *newP = 0 => return current default
SetDefPar:
TrySetPar:	RTemp ← (RTemp) -1; *internally, partitions are 0..1, not 1..2.
	LU ← (RTemp) and not (1C);
	Skip[ALU=0];
	T ← 0C, Return; *newP is illegal.  Return 0.
	RTemp ← (RTemp) or (100000c); *Set "change" flag
GetDefPar:	RTemp1 ← 216C; *NOTE!! R address of rdcPartition register!!!
	T ← (SStkP&NStkP) xor (377C);
	StkP ← (RTemp1), RTemp1 ← T, NoRegILockOK;
	LU ← RTemp, Goto[ChangePar,R<0];
	LU ← Stack, DblGoto[ParWas1,ParWas0,R<0]; *Read without change (RTemp = 0)
ChangePar:	RTemp ← 0C, Skip[R Odd]; *test new value (0 or 1), guess that old value was 0.
	Stack ← (Stack) and not (100000C), DblGoto[ParWas1,ParWas0,R<0]; *new value = 0
	Stack ← (Stack) or (100000C), DblGoto[ParWas1,ParWas0,R<0]; *new value = 1
ParWas1:	RTemp ← 1C; *guess above was wrong. Old partition was 1, return 2.
ParWas0:	StkP ← RTemp1; *restore stkp
	T ← (RTemp) + 1, return;

:END[Misc];