{Bdbinit.mc
Last edited: Purcell, 9-Feb-85 12:25:24 {%%} disabled mapinit
Last edited: don, 6-Feb-85 8:58:38 cleaned up a little -- no changes
Last edited: Purcell, 6-Feb-85 0:08:13 stall
Last edited: Purcell, 3-Feb-85 20:17:16 interface real page stays at 3 {%4}.
by cal 11-Jan-85 14:36:07
changed MAR's to Map's where appropriate 1-Feb-85 10:28:48
}
Reserve[0F6F]; Reserve[0F78]; Reserve[0F7F,0FFF]; {Kernel}
SetTask[0];
StartAddress[Germ];
Set[labelPageLow, 10]; {low 16 bits of file page number}
Set[bigVMrefFlg, 75'b];
Set[vmSizeLoc, 100'b];
RegDef[topPage, U, 0D];
RegDef[uVMFileSize, U, 6A];
Germ:
, CANCELBR[StartDBInit,0F], c1, at[0,2,Germ];
, CANCELBR[StartDBInit,0F], c1, at[1,2,Germ];
StartDBInit:
Rx ← 41, c2;
DCtl ← Rx LRot0, c3;
ClrIntErr, c1;
IOPCtl ← 1, c2;
Rx ← 040{wait 2 sec}, c3;
{Rx major, Q minor }
bLp: Noop, BRANCH[$, bL2], c1;
Noop, GOTO[bJn], c2;
bL2: Rx ← Rx - 1, ZeroBr, c2;
bJn: Q ← Q - 1, ZeroBr, BRANCH[bLp, bStallDone], c3;
bBurdock:
IOPCtl ← 1, CANCELBR[$, 0F], c1;
Rx ← 41, c2;
DCtl ← Rx LRot0, TOSH ← 0, c3;
bStallDone: CANCELBR[$],
rhRx ← 0, Rx ← 0, c1;
Q ← 0FF + 1, c2;
TT ← 60{Vacant}, c3;
initMap: {init 32mb map to vacant}
Map ← [rhRx, Rx], BRANCH[$, initfixrh], c1;
{%%} {MDR ← TT{Vacant}}, c2;
Rx ← Rx + Q, CarryBr, GOTO[initMap], c3;
initfixrh:
Rx ← rhRx + 1, PgCarryBr, LOOPHOLE[byteTiming], c2;
rhRx ← Rx LRot0, BRANCH[initMap, $], c3;
{%B}{***32MB: I/O Page back where Mesa wanted it!!!}
Rx ← ~0FF, c1;
TOS ← 2{%B 5}, c2;
rhRx ← 0, c3;
{Map[IOPageVp=0FF] ← 2 }
Map← [rhRx, Rx], c1;
{%%} {MDR ← TOS,} c2;
, c3;
{update Interface page and interpret FPTOVP}
LIa: rhTOSH← 0, c1;
TOSH← 0FF+1, c2; {base address of IOCB page}
PV ← labelPageLow, c3;
{%M MAR ← [{rDrh}rhTOSH, {rE}PV+0], c1;
, c2;
{rE}PV ← MD, c3; {read number of pages xferred}
uVMFileSize ← {rE}PV, c1;
, c2;
, c3;
%M}{pretend for now 16K pages or 8MB VM/ sysout}
PV ← 40, c1;
PV ← PV LRot8, c2;
uVMFileSize ← {rE}PV, c3;
{Map[InterfacePageVp] ← 3}
rhTT ← {6'b}INTERFACEspace, CANCELBR[$, 1], c1;
TT ← {0'b}INTERFACEbasePage, c2;
TT ← TT LRot8, c3;
Rx ← {3%M}{6}3{%4}{real interface page}, c1;
Rx{300} ← Rx LRot8, c2;
{ LVM
{rBrh}rhRx ← {rB}Rx ← {rB}Rx + 030{dirty}, c3;
}
rhRx ← 0C0, Rx ← Rx + 0C0{dirty}, c3;
LIb: Map{InterfacePage} ← [rhTT,TT], c1;
MDR ← Rx{3C0}, c2;
, c3;
MAR← [rhRx, 15'b{MachineType} + 0], c1;
MDR ← 6{\DANDELION}, c2;
Q ← uVMFileSize, c3;
{**32MB: Say we can do big VM refs (will put real switch in later)}
LIc: MAR ← [rhRx, bigVMrefFlg + 0], c1;
MDR ← 1 {true}, c2;
, c3;
MAR ← [rhRx, vmSizeLoc + 0], c1;
MDR ← Q, c2;
, c3;
{%M Q ← topPage{virtual}, c1;
Q ← Q + 40,{ map not included}{topPage was measured as if map were 32KB} c2;
Q{NRealPages} ← Q + 0FF{+1}{bank 0 was not incl but}, c3;
%M}
TT ← 09, c1;
TT ← TT LRot8, c2;
Q ← TT - 1, c3;{faking size of real mem at 1.5 mb-gap or 1.0 mb + gap}
{%M}
LId: MAR← [{rBrh}rhRx, 70'b{NRealPages} + 0], c1;
MDR ← Q{NRealPages} {← topPage}{rC{C00}}, c2;
Noop, c3;
{interpret FPTOVP setup}{assume FPTOVP doesn't cross segment}
{for i{acR} ← {{501'b=141h}}{201h}IOPage+1 to MaxRealPage{rC} }
{ unless FPTOVP[i-1]=none{-1} }
{ do MAP[FPTOVP[i-1]]:vp ← i }
MAR← [rhRx, 73'b{FPTOVPStart} + 0], c1;
, c2;
TT{F2Vpage} ← MD, c3;
Set[fpvpPageOff, Add[IOPageHigh, 1{file1=real2}]];
Set[IOPagePage, Rshift[IOPage, 8]];
{%B offset 3{dbGap} seg's}
TOS ← 3{dbGap}, c1;
TOS ← TOS LRot8, c2;
TT ← TT + TOS, c3;
{%B}
LIe: TT{F2VrealPage+IOPageHigh} ← TT + fpvpPageOff, c1;
rhTT ← TT ← TT LRot8, c2;
TT ← TT and ~0FF, c3;
TT{F2V+IOPagePage} ← TT + IOPagePage, c1;
, c2;
rhRx ← 1{MapSpace}, c3;
TOS ← IOPageHigh, c1; {***32MB: Count = 201H now}
TOS ← TOS LRot8, c2;
TOS ← TOS + IOPagePage +1, c3;
{interpret FPTOVP Loop }
{acR: FPTOVP[i-1] ptr }
{rB: FPTOVP[i-1]:vp }
{rC: i ← {{501'b=141h}}{201h}IOPage+1 }
{Q: NRealPages= C00 }
{rBrh: 10000{Map} }
{spin2: GOTO[spin2], c*;}{%%%}
f2vLp: MAR← TT ← [rhTT, TT + 0], c1;
c2;
Rx{vp} ← MD, c3;
{%B} Ybus ← Rx + 1, CarryBr{=1?}, c1;
BRANCH[$, none], c2;
rhRx ← Rx ← Rx LRot8, c3;
, c1;
TOS ← TOS LRot8, XRefBr, c2;
Ybus ← TOS + 0F, NibCarryBr{nondisplay bank?}, BRANCH[$, fvMod], c3;
{%B} Map← [rhRx, Rx], BRANCH[fvNo, $], c1;
{%%} {MDR ← TOS{i},} GOTO[none], c2;
fvNo: Noop, GOTO[none], c2;
fvMod: Map← [rhRx, Rx], BRANCH[fvMNo, $], c1;
{%%} {MDR ← TOS{i} + 70}{move over flags to "dp" bit}, GOTO[none], c2;
fvMNo: Noop, GOTO[none], c2;
none: TOS ← TOS LRot8, CANCELBR[$, 1], c3;
TOS ← TOS + 1, c1;
Ybus ← TOS xor Q{NRealPages}, ZeroBr, c2;
TT ← TT + 1, BRANCH[f2vLp, $], c3;
{%B} Rx ← ~0FF, c1;
TOS ← 2{%B 5}, c2; {***32MB: I/O Page back where Mesa wanted it!!!}
rhRx ← 0, c3;
{Map[IOPageVp=0FF] ← 2 }
Map← [rhRx, Rx], c1;
{%%} {MDR ← TOS}, c2;
, c3;
{start u register init here}
LIf: Rx{182} ← 0C1 LRot1, c1;
Rx ← Rx LRot1, c2;
uPcBreak ← Rx{304}, c3;
, c1;
Q ← rhRx, c2;
UGsave ← Q, c3;
Rx ← VALspace, c1;
uValHigh ← Rx, c2;
{stackP ← 0,} c3;
Rx ← Rx xor ~Rx, c1;
unboundPvar ← Rx, c2;
unboundFvar ← Rx, c3;
uStkLimO ← Rx, c1;
uWP ← 0, c2;
uWDC ← 0{uWDC inited by mesaInit}, c3;
Rx ← ~0FD, c1;
Rx ← Rx LRot8, c2;
uBfResidualRhmask ← Rx{2FF}, c3;
Rx ← 0A0, c1;
Rx ← Rx LRot8, c2;
uFreeStackBlock ← Rx{0A000}, c3;
Rx ← 0FF + 1, c1;
uFxNoPushReturn ← Rx{100h}, c2;
Rx ← LShift1(Rx + Rx), SE←0, c3;
uFxInCall ← Rx{400h}, c1;
Rx ← 7F, c2;
u7F ← Rx{7F}, c3;
Rx ← ~0FF, c1;{OK}
u0FF ← ~Rx{~0FF}, c2;
uFF00 ← Q ← Rx{~0FF}, c3;
Rx ← Q{0FF00} or 1, c1;
Rx ← Rx LRot8, c2;
u1FF ← Rx{1FF}, c3;
Rx ← Q{0FF00} or 3, c1;
Rx ← Rx LRot8, c2;
uTT3FF ← Rx{3FF}, c3;
Rx ← Q{0FF00} or 3, c1;
Rx ← Rx LRot8, c2;
u3FF ← Rx{3FF}, c3;
Rx ← Q{0FF00} or 0F, c1;
Rx ← Rx LRot8, c2;
u0FFF ← Rx{0FFF}, c3;
Rx ← Q{0FF00} or 1F, c1;
Rx ← Rx LRot8, c2;
u1FFF ← Rx{1FFF}, c3;
Rx ← Q{0FF00} or 3F, c1;
Rx ← Rx LRot8, c2;
uTT3FFF ← Rx{3FFF}, c3;
Rx ← Q{0FF00} or 3F, c1;
Rx ← Rx LRot8, c2;
u3FFF ← Rx{3FFF}, c3;
Rx ← Q{0FF00} or 7F, c1;
Rx ← Rx LRot8, c2;
u7FFF ← Rx{7FFF}, c3;
Rx ← Q{0FF00} or 7, c1;
Rx ← Rx LRot8, c2;
u7FF ← Rx{7FF}, c3;
, c1;
Rx ← Rx xor 1, c2;
u7FE ← Rx{7FF}, c3;
Rx ← 0, c1;
uLispOptions ← Rx, c2;
c3;
Rx ← 80, c1;
Rx ← Rx LRot8, c2;
uBFmark ← Rx{8000}, c3;
{compliance: using uSTACKspace with duplicated high byte for bind ptr}
Rx ← STACKspace, c1;
Rx ← Rx LRot8, c2;
Rx ← Rx or STACKspace, c3;
Noop, c1;
uSTACKspace ← Rx, c2;
Rx ← 0C0, c3;
Rx ← Rx LRot8, c1;
Noop, c2;
uFXmark ← Rx{C000}, c3;
Set[UFNTablePageHalf, Rshift[UFNTablebase, 9]];
Rx ← UFNTablePageHalf, c1;
Rx ← Rx LRot8, c2;
uUFNTableBaseHalf ← Rx, GOTO[dbinitthru], c3;
{ E N D }