-- Copyright (C) 1983 by Xerox Corporation. All rights reserved. -- PupBooterFast.mesa, HGM, 24-Sep-83 12:20:16 DIRECTORY Inline USING [LongDivMod], Space USING [nullInterval], System USING [Pulses, GetClockPulses, PulsesToMicroseconds], EFTPDefs USING [ EFTPAbortSending, EFTPFinishSending, EFTPOpenForSending, EFTPSendBlock, EFTPSetSendTimeout, EFTPTimeOut, EFTPTroubleSending], BootServerDefs USING [WhatHappened], BootServerFriends USING [BootFile, LockFileRead, SetupSpace, UnlockFile], PupTypes USING [PupAddress]; PupBooterFast: PROGRAM IMPORTS Inline, System, EFTPDefs, BootServerFriends EXPORTS BootServerDefs = BEGIN FastBooter: PUBLIC PROCEDURE [ bf: BootServerFriends.BootFile, him: PupTypes.PupAddress] RETURNS [what: BootServerDefs.WhatHappened] = BEGIN OPEN EFTPDefs; from: LONG POINTER; wordsPerPage: CARDINAL = 256; -- Alto/EtherBoot needs this to be 1 page page, pages, bytes: CARDINAL; pulses: System.Pulses ← System.GetClockPulses[]; IF ~BootServerFriends.LockFileRead[bf] THEN RETURN[diskBusy]; EFTPSetSendTimeout[100, 5]; BEGIN EFTPOpenForSending[ him, FALSE ! EFTPTimeOut, EFTPTroubleSending => GOTO NeverStarted]; IF bf.space = Space.nullInterval THEN BootServerFriends.SetupSpace[bf]; [pages, bytes] ← Inline.LongDivMod[bf.bytes, wordsPerPage*2]; from ← bf.space.pointer; FOR page IN [0..pages) DO -- This must total about 5 seconds to keep Pilot's EtherGerm happy IF page = 1 THEN EFTPSetSendTimeout[200, 25]; EFTPSendBlock[ from, wordsPerPage*2 ! EFTPTimeOut, EFTPTroubleSending => GOTO Trouble]; from ← from + wordsPerPage; ENDLOOP; IF bytes # 0 THEN BEGIN EFTPSendBlock[ from, bytes ! EFTPTimeOut, EFTPTroubleSending => GOTO Trouble]; END; EFTPFinishSending[ ! EFTPTimeOut, EFTPTroubleSending => GOTO Trouble]; pulses ← System.Pulses[System.GetClockPulses[] - pulses]; bf.count ← bf.count + 1; bf.ms ← bf.ms + System.PulsesToMicroseconds[pulses]/1000; what ← fast; EXITS Trouble => BEGIN EFTPAbortSending["Trouble sending"L]; what ← troubles; END; NeverStarted => BEGIN EFTPAbortSending["Never started"L]; what ← neverStarted; END; END; BootServerFriends.UnlockFile[bf]; END; END.