-- PilotCommUtil.mesa (last edited by: BLyon on: February 10, 1981 11:53 AM)
-- Function: The implementation module for Pilot provided utilities.
DIRECTORY
CommunicationInternal USING [],
CommUtilDefs USING [],
DriverDefs USING [],
Environment USING [wordsPerPage],
Inline USING [COPY, LongCOPY, LowHalf],
Process USING [MsecToTicks, SecondsToTicks, Ticks],
PupDefs USING [], --EXPORTS Time Conversion stuff
PupStream USING [Tocks], --EXPORTS Time Conversion stuff
ResidentHeap USING [MakeNode, FreeNode, first64K],
Runtime USING [CallDebugger],
Space USING [
Handle, Create, defaultBase, defaultWindow, GetHandle,
PageFromLongPointer, Map, Unmap, Delete, virtualMemory,
LongPointer],
SpecialSpace USING [MakeSwappable, MakeResident],
Zone USING [Status, BlockSize, Base];
PilotCommUtil: PROGRAM
IMPORTS Inline, Process, ResidentHeap, Runtime, Space, SpecialSpace
EXPORTS CommunicationInternal, CommUtilDefs, DriverDefs, PupDefs, PupStream =
BEGIN
-- Heap nodes. All these are currently resident, and in first 64K
ResidentZoneTrouble: PUBLIC ERROR = CODE;
-- IOCB allocation.
AllocateIocbs: PUBLIC PROC [nwords: CARDINAL] RETURNS [LONG POINTER] =
BEGIN
status: Zone.Status;
p: Zone.Base RELATIVE POINTER;
[p, status] ← ResidentHeap.MakeNode[LOOPHOLE[nwords, Zone.BlockSize], a4];
IF status # okay THEN Glitch[ResidentZoneTrouble];
RETURN[@ResidentHeap.first64K[p]]; -- make into a LONG absolute
END;
FreeIocbs: PUBLIC PROC [iocbPtr: LONG POINTER] =
BEGIN
p: Zone.Base RELATIVE POINTER ← Inline.LowHalf[
iocbPtr - LOOPHOLE[ResidentHeap.first64K, LONG POINTER]];
[] ← ResidentHeap.FreeNode[p];
END;
-- Clumps of pages
AllocateBuffers: PUBLIC PROC [nwords: CARDINAL] RETURNS [base: LONG POINTER] =
BEGIN
pages: CARDINAL =
(nwords + Environment.wordsPerPage - 1)/Environment.wordsPerPage;
h: Space.Handle = Space.Create[pages, Space.virtualMemory, Space.defaultBase];
Space.Map[h, Space.defaultWindow];
base ← Space.LongPointer[h];
END;
FreeBuffers: PUBLIC PROC [base: LONG POINTER] =
BEGIN
h: Space.Handle = Space.GetHandle[Space.PageFromLongPointer[base]];
Space.Unmap[h];
Space.Delete[h];
END;
LockBuffers: PUBLIC PROC [p: LONG POINTER] =
BEGIN
SpecialSpace.MakeResident[Space.GetHandle[Space.PageFromLongPointer[p]]];
END;
UnlockBuffers: PUBLIC PROC [p: LONG POINTER] =
BEGIN
SpecialSpace.MakeSwappable[Space.GetHandle[Space.PageFromLongPointer[p]]];
END;
-- Other goodies
Zero: PUBLIC PROC [p: POINTER, l: CARDINAL] =
BEGIN
IF l = 0 THEN RETURN;
p↑ ← 0;
Inline.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 PROC [t: CARDINAL] RETURNS [PupStream.Tocks] =
BEGIN
tks: Process.Ticks = Process.SecondsToTicks[t];
IF tks = LAST[Process.Ticks] THEN ERROR TockConversionTroubles;
RETURN[LOOPHOLE[tks]];
END;
-- this assumes that a tock is longer than an millisecond
MsToTocks: PUBLIC PROC [t: CARDINAL] RETURNS [PupStream.Tocks] =
BEGIN
IF t = 0 THEN ERROR TockConversionTroubles;
RETURN[LOOPHOLE[Process.MsecToTicks[t]]];
END;
-- Communication error handler
errorHandler: PROC [ERROR] ← DefaultErrorHandler;
CaptureErrors: PUBLIC PROC [proc: PROC [ERROR]] = {errorHandler ← proc};
DefaultErrorHandler: PROC [why: ERROR] =
BEGIN Runtime.CallDebugger["CommunicationGlitch"L]; Glitch[why]; END;
Glitch: PUBLIC PROC [why: ERROR] = {errorHandler[why]};
FriendOfCopyLong: PUBLIC PROC [from: LONG POINTER, nwords: CARDINAL, to: LONG POINTER] =
{Inline.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*.