// TInit.Sr
// Last modified November 2, 1979 7:45 PM by Taft
get "BRAVO1.DF";
get "HEAP.DF";
get "DISPLAY.DF";
get "CHAR.DF";
get "MEASURE.DF";
get "AltoFileSys.D";
get "OM.DF";
get "SysDefs.d";
get "VM.Df";
get "State.Df";
// Incoming Procedures
external [
ult;
errhlta
CommandProcessor;
chuckinit;
move;
ActOnPages;
WritePages;
trims;
array
movestack
swat;
initkbd;
addbp
hpinit
opens
hplay;
ugt
setmacfp;
sbwsize;
getchar;
endofkeystream;
initom;
chuckinitselect;
findomspace;
CallersFrame;
Junta;
pjinit1;
CounterJunta;
movec;
OutSims;
EnuSimInit;
fnalloc;
creates;
updatedisplay;
selectwholeww;
activateomseq;
PreJuntaInit
LoadRam
InitBcplRuntime
SwappedOut
];
// Incoming Statics
external [
freet;
freee;
vpzone;
mpfnof;
fillInDA;
eofDA;
DCread;
dnbp;
voverlay;
macbp
ozone
pzone
vup
Saved335
vdcborig;
SavedFinish
SavedKeyProcess;
vwaitproc;
vyorig;
vmeasurestatus;
diskKd;
buffer
lvUserFinishProc
vfn
ozonel
fpSysDir
vcwFontFixed
vfontFixed
vfddlFixed
vfIniting
vllDcb
selmain
tsread
vbttoti;
vbttotd;
vcpagehc;
vtodstart;
ReadCalendar;
// BravoRamImage
RamImage
relocTable
];
// Outgoing Procedures
external [
init;
initsb;
stperm;
markcc;
// dumpcore;
counterjunta;
SeekTo
// bravoFinish;
doDc
];
// Outgoing Statics
external [
begofopsys;
vkcb;
macfda;
curfda;
vcwaitfd;
vcfreemin;
vputomfixedstor;
// vputsbomseq;
// vputmsbomseq;
SavedDiskKd;
vRtcVertInt
vcaCode
vwaCode
vbbs
cfaSysDirEnd
vswitch
]
// Local Statics
static [
begofopsys;
vkcb;
macfda;
curfda;
vcwaitfd;
vcfreemin;
vputomfixedstor;
// vputsbomseq;
// vputmsbomseq;
SavedDiskKd;
vRtcVertInt
vcaCode
vwaCode
vbbs
cfaSysDirEnd
vswitch
OsGetFrame
]
// Local manifests
manifest [
DISKRO = 0;
maxcpage = 128;
AdrAdrFinish=#353 //Holds address of finish code
KeyProcess=13
interruptVector = #500
ParityProcess=1
evenmask = #177776
nextDiskCommand = #521;
DCseekOnly=#44002
keystreaml = 100; // LOCAL IN XKBD.SR TOO!!!
IN = 16;
OUT = 17;
FIRST = 15;
LIMIT = 18;
// pGetFrame = #370
]
// I N I T
let init(blv,upe,cfaEndRes) be
[
let bbs = table [ 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0 ]
let rtc = table [ 0; 0 ]
let vecCfa = table [ 0; 0; 0; 0; 0; 0; 0; 0 ]
vbttoti = table [ 0; 0 ];
vbttotd = table [ 0; 0 ];
vcpagehc = 0;
vtodstart = table [ 0; 0 ];
ReadCalendar(vtodstart);
vRtcVertInt = rtc
let mcOK = false
if LoadRam(RamImage) eq 0 then [ mcOK = true; InitBcplRuntime() ]
PreJuntaInit(bbs, blv, upe, cfaEndRes, vecCfa)
Junta((mcOK? levFilePointers, levBcpl),pjinit)
]
// P J I N I T
and pjinit() be
[
// rv #335 = begofopsys-stackl;
let stacktop = CallersFrame()
// vputmsbomseq = "GIJQTLK";
// vputsbomseq = "GIJQT";
// @lvUserFinishProc = bravoFinish
pjinit1(stacktop);
let baseInit = pjinit1
// Here we change all the statics for initialization procedures to point to
// SwappedOut, mainly so that they won't confuse Swat's symbolic
// address printouts.
let relocTableLcl = relocTable // 'cause its static gets clobbered!
for i = 1 to relocTableLcl!0 do @(relocTableLcl!i) = SwappedOut
let shrinkamount = baseInit-(vpzone >> ZONE.min- (vup ? 0,hpbuf));
shrinkamount = shrinkamount+vcwFontFixed;
if shrinkamount << odd then shrinkamount = shrinkamount+1;
hplay(shrinkamount,true);
unless ozonel eq 0 then errhlta(50)
vfontFixed = baseInit;
ozone = baseInit+vcwFontFixed
vfddlFixed = 0;
vfIniting = false
updatedisplay();
@#420 = vllDcb
selectwholeww(selmain,2);
CommandProcessor();
CounterJunta(PostJunta);
]
// P O S T J U N T A
and PostJunta() be
[ finish
]
// I N I T M C
// and InitMc() be
// [
// if LoadRam(RamImage) eq 0 then InitBcplRuntime();
//
// if LoadRam(BravoRamImage, false) ne 0 then // load, don't boot
// errhlta(250); // < 0 => hardware error; > 0 => bad mc constants
// fix up GetFrame code to use ram:
// OsGetFrame = rv pGetFrame;
// rv pGetFrame = BravoGetFrame;
// ] // end InitMc
// B R A V O F I N I S H
//
// and bravoFinish() be
// [
// rv pGetFrame = OsGetFrame;
// (mpfnof ! fnDiskDesc)>>OF.wf = true
// dumpcore(fnDiskDesc,diskKd,(lKDHeader+diskBTsize) lshift 1)
// ]
// D U M P C O R E
//
// and dumpcore(fn,ca,bytec) be
// [ let of = mpfnof ! fn;
// unless of >> OF.wf do errhlta(51);
// let cpage = bytec << PCD.p+1;
// if of >> OF.macfp le cpage then setmacfp(fn,cpage+2);
// of = mpfnof ! fn;
// let numcharslast = bytec << PCD.rc ;
// let rgda = lv (of >> OF.rgda);
// let fileid = lv (of >> OF.fileid);
// if (rgda ! 1 eq fillInDA) % (rgda ! 1 eq eofDA) then
// if ActOnPages(0,rgda,fileid,0,0,DCread,0,0,dnbp ! bpbuff,0) then errhlta(52);
// let rgca = vec maxcpage+1;
// for i = 0 to cpage-2 do
// [ rgca ! i = ca;
// ca = ca+#400;
// ]
// rgca ! (cpage-1) = dnbp ! bpbuff;
// move(ca,dnbp ! bpbuff,(numcharslast+1) rshift 1);
// if numcharslast eq #1000 then
// [ numcharslast = 0;
// rgca ! cpage = dnbp ! bpbuff;
// cpage = cpage+1;
// ]
// WritePages(rgca-1,rgda,fileid,1,cpage,0,0,numcharslast,0);
// of >> OF.macpos = bytec;
// trims(fn);
// ]
// L O A D C O R E
//
// and loadcore(fn,fp,cwords,ca) be
// [ fp = fp+1
// let rgca = vec maxcpage;
// let cbytes = cwords lshift 1
// let cpage = (cbytes+#777) << PCD.p;
// let numcharslast = (cbytes << PCD.rc);
// if numcharslast eq 0 then numcharslast = #1000
// for i = 0 to cpage-2 do
// [ rgca ! i = ca;
// ca = ca+#400;
// ]
// rgca ! (cpage-1) = dnbp ! bpbuff;
// let of = mpfnof ! fn;
// let rgda = lv (of >> OF.rgda);
// let fileid = lv (of >> OF.fileid);
// let fplastread = ActOnPages(rgca-fp,rgda,fileid,fp,fp+cpage-1,DCread,0,0,0,0);
// unless fplastread eq fp+cpage-1 do errhlt("ncp");
// move(dnbp ! bpbuff,ca,(numcharslast+1) rshift 1);
// ]
// C J F I N I S H
//
// and cjfinish() be
// [
// errhlt = boot+4;
// rv vdcborig = 0;
// move(mpfnof ! fnopsys,ozone,ofsiz+129);
// mpfnof ! fnopsys = ozone;
// @#335=ozone+ofsiz+129;
// movestack(counterjunta, begofopsys-1)
// loadcore(fnopsys,0,((mpfnof ! fnopsys) >> OF.macpos+1)rshift 1,begofopsys);
// move(diskKd,SavedDiskKd,lKDHeader+diskKd >> KD.diskBTsize);
// diskKd = SavedDiskKd;
// diskKd>>KD.bitTableChanged = true;
// rv LASTSN1 = lastSN ! 0;
// rv LASTSN2 = lastSN ! 1;
// move(diskBitTable, BITTABLE, diskBTsize);
// move(begofopsys, osmachinecode, osmachinecodel);
// movestack(counterjunta,stackroot)
// USERNAME = SavedUsername;
// @#335=Saved335
// rv vdcborig = vdcbsys;
// rv vdcborig = vdcbsys;
// let tmax = KEYS ! LIMIT-KEYS !FIRST
// let tvec = vec keystreaml;
// let i = 0;
// until endofkeystream() do
// [ tvec ! i = getchar();
// i = i+1;
// ]
// if i ge tmax then i = tmax-1
// DisableInterrupts()
// @AdrAdrFinish=SavedFinish
// @(interruptVector+KeyProcess) = SavedKeyProcess
// @(interruptVector+ParityProcess) = SavedParityProcess
// until endofkeystream() do
// PutItem(getchar());
// KEYS ! OUT = KEYS ! FIRST;
// KEYS ! IN = KEYS ! FIRST+i
// move(tvec,KEYS ! FIRST,i);
// EnableInterrupts()
// finish
// ]
// S E E K T O
//
and SeekTo(da) be
[ doDc(da,DCseekOnly,0);
]
// D O D C
//
and doDc(da,dc,label) be
[ movec(vkcb,vkcb+lnkcb-1,0);
vkcb >> KCB.headerAddress = lv (vkcb >> KCB.header);
vkcb >> KCB.labelAddress = label;
vkcb >> KCB.dataAddress = dnbp ! bpbuff;
if da eq eofDA % da eq fillInDA then errhlta(54);
vkcb >> KCB.diskAddress = da;
vkcb >> KCB.command = dc;
if (rv nextDiskCommand) ne 0 then errhlta(53)
rv nextDiskCommand = vkcb;
]