{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;