-- PilotCommUtil.mesa (last edited by: BLyon on: February 10, 1981 11:53 AM)
-- Function: The implementation module for Pilot provided utilities.
-- Last Edited by: Levin, August 9, 1983 9:19 am
DIRECTORY
CommunicationInternal USING [],
CommUtilDefs USING [],
DriverDefs USING [],
PrincOpsUtils USING [COPY, LongCOPY],
Process USING [MsecToTicks, SecondsToTicks, Ticks],
PupDefs USING [], --EXPORTS Time Conversion stuff
PupStream USING [Tocks], --EXPORTS Time Conversion stuff
VM USING [
AddressForPageNumber, Allocate, Free, Interval, lowCore, PageNumberForAddress,
PagesForWords, Pin];
PilotCommUtil: MONITOR
IMPORTS PrincOpsUtils, Process, VM
EXPORTS CommunicationInternal, CommUtilDefs, DriverDefs, PupDefs, PupStream =
BEGIN
-- Heap nodes. All these are currently resident, and in first 64K
MixedIocbSize: ERROR = CODE;
-- IOCB allocation.
iocbSize: CARDINAL ← 0;
IocbType: TYPE = RECORD[next: LONG POINTER TO IocbType,
rest: SEQUENCE COMPUTED CARDINAL OF WORD];
freeIocb: LONG POINTER TO IocbType ← NIL;
AllocateIocb: PUBLIC ENTRY PROC [nwords: CARDINAL] RETURNS [i: LONG POINTER] =
BEGIN
IF iocbSize = 0 THEN iocbSize ← nwords;
IF iocbSize # nwords THEN Glitch[MixedIocbSize];
IF freeIocb # NIL
THEN { i ← freeIocb; freeIocb ← freeIocb.next }
ELSE i ← VM.lowCore.NEW[IocbType[iocbSize-SIZE[IocbType[0]]]];
END;
FreeIocb: PUBLIC ENTRY PROC [iocbPtr: LONG POINTER] =
BEGIN
i: LONG POINTER TO IocbType = LOOPHOLE[iocbPtr];
i.next ← freeIocb; freeIocb ← i;
END;
-- Clumps of pages
AllocateBuffers: PUBLIC PROC [nwords: CARDINAL] RETURNS [base: LONG POINTER] =
BEGIN
interval: VM.Interval = VM.Allocate[VM.PagesForWords[nwords]];
VM.Pin[interval];
base ← VM.AddressForPageNumber[interval.page];
END;
FreeBuffers: PUBLIC PROC [base: LONG POINTER, nwords: CARDINAL] =
BEGIN
VM.Free[[page: VM.PageNumberForAddress[base], count: VM.PagesForWords[nwords]]];
END;
-- Other goodies
Zero: PUBLIC PROC [p: POINTER, l: CARDINAL] =
BEGIN
IF l = 0 THEN RETURN;
p↑ ← 0;
PrincOpsUtils.COPY[from: p, to: p + 1, nwords: l - 1];
END;
-- TimeCoversion for Pup package
-- implement with Process.Tick = Tock
-- Code depends upon Process.MsecToTicks corectly
-- rounding up the argument before caculating the result,
-- and SecondsToTicks returning LAST[Ticks] for large seconds.
TockConversionTroubles: PUBLIC ERROR = CODE;
SecondsToTocks: PUBLIC SAFE PROC [t: CARDINAL] RETURNS [PupStream.Tocks] =
CHECKED BEGIN
tks: Process.Ticks = Process.SecondsToTicks[t];
IF tks = LAST[Process.Ticks] THEN ERROR TockConversionTroubles;
RETURN[[tks]];
END;
-- this assumes that a tock is longer than an millisecond
MsToTocks: PUBLIC SAFE PROC [t: CARDINAL] RETURNS [PupStream.Tocks] =
CHECKED BEGIN
IF t = 0 THEN ERROR TockConversionTroubles;
RETURN[[Process.MsecToTicks[t]]];
END;
-- Communication error handler
errorHandler: PROC [ERROR] ← DefaultErrorHandler;
CaptureErrors: PUBLIC PROC [proc: PROC [ERROR]] = {errorHandler ← proc};
DefaultErrorHandler: PROC [why: ERROR] =
BEGIN SIGNAL LOOPHOLE[why, SIGNAL] END;
Glitch: PUBLIC PROC [why: ERROR] = {DO errorHandler[why] ENDLOOP};
FriendOfCopyLong: PUBLIC PROC [from: LONG POINTER, nwords: CARDINAL, to: LONG POINTER] =
{PrincOpsUtils.LongCOPY[from, nwords, to]};
END.... -- PilotCommUtil module
LOG
Time: June 18, 1979 2:13 PM By: Dalal Action: conversion to Pilot 3.0.
Time: August 25, 1979 1:40 PM By: Dalal Action: made msPerTick a constant.
Time: August 31, 1979 12:34 PM By: Dalal Action: deleted AllocateHeapNode.
Time: August 11, 1980 4:53 PM By: BLyon Action: deleted ByteBlt*.