-- Copyright (C) 1983 by Xerox Corporation. All rights reserved. -- FixBootFileDates.mesa, HGM, 6-Nov-84 13:53:25 DIRECTORY FormSW USING [ AllocateItemDescriptor, ClientItemsProcType, CommandItem, newLine, ProcType, StringItem], Heap USING [systemZone], MFile USING [Error, Handle, ReadWrite], MSegment USING [Address, Create, Delete, Handle], Runtime USING [GetBcdTime], String USING [AppendString], Time USING [Append, Current, Unpack], Tool USING [Create, MakeSWsProc, MakeFormSW], ToolWindow USING [TransitionProcType], UserTerminal USING [BlinkDisplay], Window USING [Handle], PupWireFormat USING [BcplLongNumber, MesaToBcplLongNumber]; FixBootFileDates: PROGRAM IMPORTS FormSW, Heap, MFile, MSegment, Runtime, String, Time, Tool, UserTerminal, PupWireFormat = BEGIN z: UNCOUNTED ZONE = Heap.systemZone; filename: LONG STRING ← NIL; form: Window.Handle; BootFileHeader: TYPE = RECORD [ -- disk boot loader is first page other: ARRAY [0..3) OF WORD, timeStamp: PupWireFormat.BcplLongNumber]; Init: PROCEDURE = BEGIN herald: STRING = [100]; String.AppendString[herald, "FixBootFileDates of "L]; Time.Append[herald, Time.Unpack[Runtime.GetBcdTime[]]]; [] ← Tool.Create[ name: herald, makeSWsProc: MakeSWs, clientTransition: ClientTransition]; END; Smash: FormSW.ProcType = BEGIN bfh: LONG POINTER TO BootFileHeader; creation: LONG POINTER TO PupWireFormat.BcplLongNumber; file: MFile.Handle ← NIL; seg: MSegment.Handle; buffer: LONG POINTER; file ← MFile.ReadWrite[filename, [], binary ! MFile.Error => CONTINUE]; IF file = NIL THEN BEGIN UserTerminal.BlinkDisplay[]; RETURN; END; seg ← MSegment.Create[file, [], 0, 1]; buffer ← MSegment.Address[seg]; bfh ← LOOPHOLE[buffer]; creation ← LOOPHOLE[buffer + 10]; IF creation↑ = [0, 0] THEN creation↑ ← bfh.timeStamp; -- hack to remember when microcode was built bfh.timeStamp ← PupWireFormat.MesaToBcplLongNumber[Time.Current[]]; MSegment.Delete[seg]; END; MakeSWs: Tool.MakeSWsProc = BEGIN form ← Tool.MakeFormSW[window: window, formProc: MakeForm]; END; MakeForm: FormSW.ClientItemsProcType = BEGIN nParams: CARDINAL = 2; items ← FormSW.AllocateItemDescriptor[nParams]; items[0] ← FormSW.CommandItem[ tag: "Smash"L, proc: Smash, place: FormSW.newLine]; items[1] ← FormSW.StringItem[tag: "Filename"L, string: @filename, inHeap: TRUE]; RETURN[items, TRUE]; END; ClientTransition: ToolWindow.TransitionProcType = BEGIN SELECT TRUE FROM old = inactive => filename ← z.NEW[StringBody[10]]; new = inactive => z.FREE[@filename]; ENDCASE; END; Init[]; END.