{File name: InitDLion.mc
Description: Mesa Emulator initialization,
Last Edited by Jim Frandeen: August 20, 1981 3:58 PM: Change for new assembler
Last Edited by Jim Frandeen: April 1, 1981 2:09 PM: initialize UtbFlags
Author: Sandman,
}
Reserve[0F6F]; Reserve[0F78]; Reserve[0F7F,0FFF];{Kernel}
Set[xtFC0, 1] {see description of bits in Xfer};
Set[IOPage, 40];
Set[IOPageHigh, 1];
{Display constants}
Set[IOPage.DCSB, 0EB];
Set[DCSB.cursorMap, 5];
Set[DCSB.border, 0];
Set[DCSB.flags, 1];
Set[PicLenShifted, 0CA]; {PicLength = 328’x = 808’d. PicLenShifted = RShift2 PicLength}
SetTask[0];
OnceOnlyInit:
T ← LShift1 0FF, SE←1, CANCELBR[$,0F],c1;
T ← LShift1 T, SE←1,c2;
u3FF ← T, T ← T LShift1, SE←1,c3;
MCtl ← T + 1,c1;
u7FF ← T, T ← T LShift1, SE←1,c2;
T ← T LShift1, SE←1,c3;
u1FFF ← T, T ← T LShift1, SE←1,c1;
u3FFF ← T,c2;
T ← 64,c3;
T ← T LRot8,c1;
UtbFlags ← T,c2;
T ← 0F,c3;
T ← T LRot8, Refresh,c1;
T ← T or 0FC,c2;
uPMask ← T,c3;
uPMask2 ← T, ClrIntErr,c1;
T ← 7,c2;
T ← T LRot12,c3;
uPPMask ← T, Refresh,c1;
T ← 0FF + 1,c2;
T ← T LShift1,c3;
u200 ← T, Refresh,c1;
T ← T + 40,c2;
uSDAddr ← T,c3;
Noop,c1;
T ← RShift1 0, SE ← 1,c2;
u8000 ← T,c3;
G ← 0, Refresh,c1;
TOS ← 0,c2;
TT ← IOPage,c3;
TT ← TT LRot8, Refresh,c1;
TT ← TT or IOPageHigh, rhTT ← IOPageHigh,c2;
uIOPage ← TT,c3;
{clear I/O page, TOS = 0}
IOPageLoop:
MAR ← [rhTT, TOS+0],c1;
MDR ← G{=0}, TOS ← TOS + 1, PgCrOvDisp,c2;
BRANCH[IOPageLoop,$,1],c3;
EtherInit:
Refresh,c1;
E ← 55,c2;
E ← E LRot8 or E,c3;
uEPreamble ← E, Refresh,c1;
E ← E or 0C0,c2;
uELastPreamble ← E,c3;
DisplayInit:
rhdY ← uIOPage, Refresh,c1;
dX ← uIOPage,c2;
dX ← dX - 1,c3;
dX ← dX + IOPage.DCSB,c1;
uDCBLoc ← dX,c2;
dX ← dX + DCSB.cursorMap,c3;
uInitCurMapAddr ← dX, Refresh,c1;
Line ← PicLenShifted,c2;
dX ← Line LRot8,c3;
uInitCurBufAddr ← dX, Refresh,c1;
Line ← LRot1 Line,c2;
Line ← LRot1 Line, rhLine ← 0,c3;
uInitPicLength ← Line {328’x}, ClrDPRq,c1;
uClockBits ← 0,c2;
Noop,c3;
DiskInit:
{initialize 16 bit const used to clear mem errorflags}
RCnt ← CClearMemError,c1;
RCnt ← RCnt LRot8,c2;
U0C00 ← RCnt,c3;
{form top byte of status mask, bottom byte depends on drive connected}
RAdr ← CHeadMsk,c1;
RAdr ← RAdr LRot8,c2;
Xbus ← KStatus, XwdDisp,c3;
RCnt ← CSA1MaxSectTst, BRANCH[SetSA1Const, SetSA4Const,2],c1;
SetSA4Const:
{sector test number}
RCnt ← CSA4MaxSectTst, c2, at[3,4,SetSA1Const];
UMaxSectTst ← RCnt,c3;
{synchronization word and error mask}
RCnt ← RCnt xor ~RCnt,c1;
RAdr ← RAdr or CSA4ErrMsk, GOTO[SetURegs],c2;
SetSA1Const:
UMaxSectTst ← RCnt,c2, at[2,4,SetSA4Const];
RCnt ← CAddrMkHi,c3;
{address mark and error mask}
RCnt ← RCnt LRot8,c1;
RAdr ← RAdr or CSA1ErrMsk,c2;
SetURegs:RCnt ← RCnt or CAddrMkLo,c3;
{save sync word or address mark; set status mask}
USyncAdrMk ← RCnt, Refresh,c1;
UStatusMsk ← RAdr,c2;
GOTO[DoneOnceOnlyInit],c3;