: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];