-- Copyright (C) 1981, 1982, 1983 by Xerox Corporation. All rights reserved.
-- PilotBootToEtherBoot.mesa
-- HGM, 8-Jan-83 11:34:20
-- Bruce, 23-Sep-81 13:14:23
-- Johnsson, 20-Dec-82 12:19:20
-- Operation: This is a small program that converts a Pilot boot file into a pseudo Alto format boot file, suitable for use by a Pup Boot server. All that is necessary to do this is to prefix the Pilot boot file with a page containing some header information (time stamp). The EtherGerm (or microcode booter) must discard the leader page.
-- Usage: PilotBootToEtherBoot can only be invoked from the command line with the following:
-- PilotBootToEtherBoot outputEtherBootFile ← inputPilotBootFile
DIRECTORY
Environment USING [Byte, bytesPerPage, wordsPerPage],
Exec USING [
AddCommand, ExecProc, FreeTokenString, GetToken, Outcome, OutputProc],
Format USING [Line, StringProc],
Inline USING [HighHalf, LowHalf],
MFile USING [Acquire, dontRelease, Error, Handle, Release],
MStream USING [Create],
Stream USING [Delete, GetBlock, Handle, PutBlock, SetInputOptions],
String USING [Empty, Equal],
Time USING [Packed, Current];
PilotBootToEtherBoot: PROGRAM
IMPORTS Exec, Format, Inline, MFile, MStream, Stream, String, Time =
BEGIN
CopyFile: Exec.ExecProc =
BEGIN
bytesPerPage: CARDINAL = Environment.bytesPerPage;
page: ARRAY [0..Environment.wordsPerPage) OF WORD ← ALL[0];
buffer: LONG POINTER TO PACKED ARRAY [0..0) OF Environment.Byte =
LOOPHOLE[LONG[@page]];
now: Time.Packed = Time.Current[];
output: Format.StringProc = Exec.OutputProc[h];
outName, separater, inName, switches: LONG STRING ← NIL;
in, out: Stream.Handle ← NIL;
inFile, outFile: MFile.Handle;
Cleanup: PROC [s: STRING] =
BEGIN
Format.Line[output, s];
outName ← Exec.FreeTokenString[outName];
separater ← Exec.FreeTokenString[separater];
inName ← Exec.FreeTokenString[inName];
IF in # NIL THEN Stream.Delete[in];
IF out # NIL THEN Stream.Delete[out];
END;
[outName, switches] ← Exec.GetToken[h];
switches ← Exec.FreeTokenString[switches];
[separater, switches] ← Exec.GetToken[h];
switches ← Exec.FreeTokenString[switches];
[inName, switches] ← Exec.GetToken[h];
switches ← Exec.FreeTokenString[switches];
IF String.Empty[outName] THEN {
Cleanup["Output filename is empty."L]; RETURN[error]};
IF String.Empty[inName] THEN {
Cleanup["Input filename is empty."L]; RETURN[error]};
IF ~String.Equal[separater, "←"L] THEN {
Cleanup["Separater must be ""←""."L]; RETURN[error]};
inFile ← MFile.Acquire[
name: inName, access: readOnly, release: MFile.dontRelease !
MFile.Error =>
IF code = noSuchFile THEN
BEGIN Cleanup["Can't find Input File"L]; GOTO GetOutOfHere; END];
outFile ← MFile.Acquire[
name: outName, access: writeOnly, release: MFile.dontRelease !
MFile.Error =>
BEGIN
MFile.Release[inFile];
Cleanup["Can't Access Output File"L];
GOTO GetOutOfHere;
END];
in ← MStream.Create[inFile, [NIL, NIL]];
out ← MStream.Create[outFile, [NIL, NIL]];
output["Copying boot file..."L];
-- Write prefix blocks to make this look like an Alto Boot file:
-- The first 5 words must agree with the format of an Alto boot file
page[0] ← 1; -- microcode booter version number (probably doesn't matter)
page[1] ← 0; -- or else boot file will get reformated
page[3] ← Inline.HighHalf[now]; -- BCPL format
page[4] ← Inline.LowHalf[now];
-- We should probably put a version stamp and our version stamp in here
Stream.PutBlock[
out, [blockPointer: buffer, startIndex: 0, stopIndexPlusOne: bytesPerPage]];
-- Copy the Pilot boot file to the output file:
Stream.SetInputOptions[in, [FALSE, FALSE, FALSE, FALSE, FALSE, FALSE]];
DO
inBytes: CARDINAL;
[inBytes, ] ← Stream.GetBlock[
in, [
blockPointer: buffer, startIndex: 0, stopIndexPlusOne: bytesPerPage]];
SELECT inBytes FROM
0 => EXIT;
bytesPerPage =>
Stream.PutBlock[
out, [
blockPointer: buffer, startIndex: 0, stopIndexPlusOne: bytesPerPage]];
ENDCASE =>
BEGIN
-- This isn't supposed to happen.
-- Finish the copy anyway since the output file is already trashed.
Stream.PutBlock[
out, [
blockPointer: buffer, startIndex: 0, stopIndexPlusOne: inBytes]];
Cleanup["Input file ends in a partial page."L];
RETURN[warning];
END;
ENDLOOP;
Cleanup["Done"L];
RETURN[normal];
EXITS GetOutOfHere => RETURN[error];
END;
Init: PROC = {Exec.AddCommand["PilotBootToEtherBoot.~"L, CopyFile]};
Init[];
END.
LOG
January 22, 1980 8:46 AM Knutsen Created file.
February 5, 1980 4:12 PM HGM Layer of fixups.
May 20, 1980 10:01 AM Forrest Mesa 6 argument order
11-May-81 20:48:28 HGM, Munge to (Pre)Cascade
23-Sep-81 12:01:05 Bruce, Convert to 8.0c
26-Oct-81 18:16:32 HGM, Bug fix, cleanup
17-Nov-81 16:08:40 HGM, Convert to MFile/MStream
21-Dec-81 20:42:06 HGM, Another FALSE for Stream.SetInputOptions