// Initialization for Micro
// last edited December 21, 1979 1:42 PM
// Copyright Xerox Corporation 1979
get "micdecl.d"
get "streams.d"
get "altofilesys.d"
external
[ // O.S.
Closes; Endofs; Gets; MoveBlock; OpenFile; Puts; Resets
fpComCm; fpSysDir
dsp
// MDI
LookupEntries
// GP
SetupReadParam; ReadParam
// BcplRuntime
InitBcplRuntime
RamImage
// LoadRam
LoadRam
// TimeIO
CONVUDT
]
let micinit(mbfile) = valof
[ if LoadRam(RamImage) eq 0 then InitBcplRuntime()
lchan = dsp
lversion()
let infile = vec filenamelength
let lsfile = vec filenamelength
let erfile = vec filenamelength
let stfile = vec filenamelength
let rsfile = vec filenamelength
let xlistf,binf,ltof,rsf,ucf,stf,lllflag = false,true,false,false,false,true,nil
let fels = "LS"
let feer = "ER"
let fest = "ST"
let femc = "MC"
let fixname = "Micro.fixups"
ttochan = dsp
ettchan = ttochan
rv infile = 0
rv lsfile = 0
rv erfile = 0
rv mbfile = 0
rv stfile = 0
rv rsfile = 0
comchan = OpenFile(0, ksTypeReadOnly, charItem, 0, fpComCm)
if comchan eq 0 then error("No Com.Cm")
let arg, option = vec filenamelength, vec 30
SetupReadParam(arg, option, comchan, option)
for i = 1 to option!0 do
switchon option!i‰ into
[ case $L: xlistf = true; endcase
case $N: binf = false; endcase
case $O: stf = false; endcase
case $U: ucf = true; endcase
]
let sources = 0
let lsource = lv sources
let nfiles = 5
[ if ReadParam($P, -1, arg, option) eq -1 break
let src = true
let ucf = false
for i = 1 to option!0 do
[ switchon option!i & #137 into
[ case $B:
binf = true
copyfile(mbfile,arg)
endcase
case $L:
xlistf = true
copyfile(lsfile,arg)
endcase
case $E:
copyfile(erfile,arg)
endcase
case $S:
stf = true
copyfile(stfile,arg)
endcase
case $R:
rsf = true
copyfile(rsfile,arg)
endcase
case $U:
ucf = true
loop
default:
loop
]
src = false
]
if src then
[ copyfile(infile,arg)
filext(arg,arg,femc)
src = alloc((length(arg) rshift 1)+3+lFP)
@src = 0
src!1 = ucf
copyfile(src+(2+lFP), arg)
@lsource = src
lsource = src
nfiles = nfiles+1
]
] repeat
if sources eq 0 then error("No source files")
if length(rsfile) ne 0 then filext(rsfile, nil, fest)
if length(mbfile) eq 0 then
[ filext(mbfile, infile, "")
mbfile>>BS.length = mbfile>>BS.length-1 // remove '.'
]
filext(erfile,mbfile,feer)
if xlistf then filext(lsfile,mbfile,fels)
filext(stfile,mbfile,fest)
let namevec = alloctemp(nfiles)
let prvec = alloctemp(nfiles*lDV)
namevec!0 = (length(rsfile) eq 0? 0, rsfile)
namevec!1 = fixname
namevec!2 = erfile
namevec!3 = (length(lsfile) eq 0? 0, lsfile)
namevec!4 = (stf? stfile, 0)
let p = sources
for j = 5 to nfiles-1 do
[ namevec!j = p+(2+lFP)
p = @p
]
// Call LookupEntries with the largest possible buffer
let dir = OpenFile(0, ksTypeReadOnly, wordItem, 0, fpSysDir)
let bot, top = fslim, fstop+fsbot
LookupEntries(dir, namevec, prvec, nfiles, true, bot, top-bot)
Closes(dir)
// Set up error streams first
erlchan = OpenFile(erfile, ksTypeWriteOnly, charItem, verLatestCreate, prvec+(2*lDV+1))
let est = alloc(lST)
est>>ST.par1 = ttochan
est>>ST.par2 = erlchan
est>>ST.puts = putboth
ettchan = est
lchan = erlchan
lversion()
Resets(comchan)
let ch = nil
until Endofs(comchan) do
[ ch = Gets(comchan)
lchr(ch)
]
if ch ne $*N then lcrlf()
lcrlf()
Closes(comchan)
test length(rsfile) eq 0
ifso inchan = 0
ifnot
[ inchan = OpenFile(rsfile, ksTypeReadOnly, wordItem, verLatest, prvec+1)
if inchan eq 0 then
error("/R FILE DOES NOT EXIST")
]
fixchan = OpenFile(fixname, ksTypeReadWrite, wordItem, verLatestCreate, prvec+(lDV+1))
lstchan = (length(lsfile) eq 0? ttochan, OpenFile(lsfile, ksTypeWriteOnly, charItem, verLatestCreate, prvec+(3*lDV+1)))
symchan = (stf? OpenFile(stfile, ksTypeWriteOnly, wordItem, verLatestCreate, prvec+(4*lDV+1)), 0)
p = sources
for j = 5 to nfiles-1 do
[ MoveBlock(p+2, prvec+j*lDV+1, lFP)
p = @p
]
xlistflag = xlistf
binflag = binf
ltoflag = ltof
ucflag = ucf
lllflag = length(lsfile) ne 0
errcnt = 0
lllength = (lllflag? 82, 72)
dalloctemp(prvec)
dalloctemp(namevec)
resultis sources
]
and lversion() be
[ llstr("*NMicro of ")
ldec(version rshift 12)
lchr($-)
ldec((version & 7777b)/100)
lchr($-)
ldec((version & 7777b) rem 100)
lcrlf()
let dts = vec 10
CONVUDT(dts, 0)
llstr(" at ")
lstr(dts)
lcrlf()
]