-- Schedule prom (Revsion D)
-- for RevB & up CP’s
-- last edited by R. Garner on August 24, 1980 6:28 PM, Update for BigDisk scheduling
-- File: ScheduleProm.mesa in [Iris]<Workstation>LH>CPPromsMesa-J.dm
--
and in [Iris]<Workstation>LH>CPProms-J.press

DIRECTORY
ImageDefs: FROM "ImageDefs"
USING [StopMesa],
PromBlowDefs: FROM "PromBlowDefs"
USING [WritePromData, WritePromList];

ScheduleProm: PROGRAM IMPORTS ImageDefs, PromBlowDefs =
BEGIN OPEN PromBlowDefs;

Size:
CARDINAL = 1024;-- number of prom locations
addrWidth:
CARDINAL = 10;-- number of prom address bits
dataWidth:
CARDINAL = 4;-- number of prom output data bits

-- Note: a "n" at the end of a name indicates it is an active low signal, i.e. assigning
FALSE means that it represents a true state.

Addr: TYPE = MACHINE DEPENDENT RECORD -- Right-justified
[pad: [0..77B],
EORound: [0..1],-- alternates ever other round when Trident HSIO board is in (creating an actual 10 click round). Is 0 when normal (SA4000) HSIO board is in.
Click: [0..7],
DPReqn: BOOLEAN,
IOPReqn: BOOLEAN,
EReqn: BOOLEAN,
KReqn: BOOLEAN,
RefReqn: BOOLEAN,
KernReqn: BOOLEAN];

Output:
TYPE = MACHINE DEPENDENT RECORD -- Left-justified
[Nt: [0..7],
NtEmu: BOOLEAN,
pad: [0..7777B]];

Prom:
ARRAY [0..Size] OF Output;
A: Addr;
Out: Output;
GenScheduleProm: PROCEDURE =
BEGIN
i: CARDINAL;

-- The tasks are numbered as:

Emulator: CARDINAL = 0;
DisplayLSEP: CARDINAL = 1;
Ether: CARDINAL = 2;
Refresh: CARDINAL = 3;
Disk: CARDINAL = 4;
IOP: CARDINAL = 5;
Kernel: CARDINAL = 7;
-- The schedule prom holds the following task-to-click allocation scheme. If an IO device is not requesting service, the emulator runs instead. The Kernel request preempts all other tasks in all clicks. The DisplayLSEP task has priority over the Refresh task, which should not be used if the display is running.

-- In Click3 the Ethernet gets even rounds and the BigDisk odd.

--
ClickTask
--
0EtherNet
--
1Disk
--
2IOP
--
3EtherNet / Disk
--
4Display / LSEP-Refresh

-- We check for requests in the click immediately before the one the task will actually run in.

FOR i IN [0..Size) DO
A ← LOOPHOLE[i];
Out.Nt ← SELECT A.Click FROM
4 => IF ~A.EReqn THEN Ether ELSE Emulator,
0 => IF ~A.KReqn THEN Disk ELSE Emulator,
1 => IF ~A.IOPReqn THEN IOP ELSE Emulator,
2 => IF ~A.EReqn AND A.EORound=0 THEN Ether
ELSE IF ~A.KReqn AND A.EORound=1 THEN Disk
ELSE Emulator,
3 => IF ~A.DPReqn THEN DisplayLSEP
ELSE IF ~A.RefReqn THEN Refresh ELSE Emulator,
ENDCASE => Kernel;-- Kernel runs if click numbers screwed up
IF ~A.KernReqn THEN Out.Nt ← Kernel;
Out.NtEmu ← Out.Nt = Emulator;
Prom[i] ← Out;
ENDLOOP;
END;


GenScheduleProm[];
WritePromData["ScheduleProm-RevD", addrWidth, dataWidth, @Prom[0]];
WritePromList["ScheduleProm-RevD", addrWidth, dataWidth, @Prom[0]];
ImageDefs.StopMesa[]

END.