-- Auxiliary Hardware Functions
-- MESA Implementation Module
-- Anthony West, September 29, 1981 5:19 PM
-- This interface allows MESA programmers to access:
-- a) DES encryption and decryption hardware.
-- b) Random Number hardware.
-- c) Electronic Stable Storage hardware.
-- d) External Parallel I/O interface.
DIRECTORY
AuxDefs,
AltoDefs USING[ BYTE ],
InlineDefs USING[ LowHalf, BITSHIFT, BITXOR, BITAND ],
IODefs USING[ WriteString, WriteLine ],
RandomCard USING[ Random ],
TimeDefs USING[ ReadClock ];
AuxImpl: PROGRAM
IMPORTS
InlineDefs,
IODefs,
RandomCard,
TimeDefs
EXPORTS AuxDefs =
{
ECBEncrypt: PUBLIC PROC [ encryptionKey: AuxDefs.DESKEY,
numberOfBlocks: CARDINAL,
from: LONG POINTER,
to: LONG POINTER ] =
{
NotImplementedYet["ECBEncrypt"];
};
ECBDecrypt: PUBLIC PROC [ decryptionKey: AuxDefs.DESKEY,
numberOfBlocks: CARDINAL,
from: LONG POINTER,
to: LONG POINTER ] =
{
NotImplementedYet["ECBDecrypt"];
};
CBCEncrypt: PUBLIC PROC [ encryptionKey: AuxDefs.DESKEY,
initVector: AuxDefs.DESVECTOR,
numberOfBlocks: CARDINAL,
from: LONG POINTER,
to: LONG POINTER ] =
{
NotImplementedYet["CBCEncrypt"];
};
CBCDecrypt: PUBLIC PROC [ decryptionKey: AuxDefs.DESKEY,
initVector: AuxDefs.DESVECTOR,
numberOfBlocks: CARDINAL,
from: LONG POINTER,
to: LONG POINTER ] =
{
NotImplementedYet["CBCDecrypt"];
};
GetRandomDESKey: PUBLIC PROC RETURNS [ key: AuxDefs.BLOCK ] =
{
i: CARDINAL;
j: CARDINAL;
b: AuxDefs.BIT;
parity: AuxDefs.BIT;
FOR i IN [0..7]
DO
parity ← 0;
FOR j IN [0..6]
DO
b ← GetUnbiassedBit[];
key[i] ← InlineDefs.BITSHIFT[key[i],1] + b;
parity ← InlineDefs.BITXOR[parity, b];
ENDLOOP;
key[i] ← InlineDefs.BITSHIFT[key[i],1] + parity;
ENDLOOP;
};
----------------------------------------------------------------
-- Random Numbers
----------------------------------------------------------------
GetBiassedBit: PUBLIC PROC RETURNS [ AuxDefs.BIT ] =
{
RETURN[ InlineDefs.BITAND[RandomCard.Random[],1] ];
};
GetUnbiassedBit: PUBLIC PROC RETURNS [ AuxDefs.BIT ] =
{
bitPair: CARDINAL;
DO
OPEN InlineDefs;
bitPair ← BITSHIFT[GetBiassedBit[],1] + GetBiassedBit[];
SELECT bitPair FROM
0 => LOOP;
1 => RETURN[0];
2 => RETURN[1];
3 => LOOP;
ENDCASE;
ENDLOOP;
};
GetRandom8: PUBLIC PROC RETURNS [ n: UNSPECIFIED ] =
{
i: CARDINAL ← 0;
n ← 0;
FOR i IN [0..7]
DO
n ← InlineDefs.BITSHIFT[n, 1] + GetUnbiassedBit[];
ENDLOOP;
};
GetRandom16: PUBLIC PROC RETURNS [ n: UNSPECIFIED ] =
{
i: CARDINAL ← 0;
n ← 0;
FOR i IN [0..15]
DO
n ← InlineDefs.BITSHIFT[n, 1] + GetUnbiassedBit[];
ENDLOOP;
};
GetRandom32: PUBLIC PROC RETURNS [ LONG UNSPECIFIED ] =
{
i: CARDINAL ← 0;
word: PACKED ARRAY[0..1] OF UNSPECIFIED;
word[0] ← GetRandom16[];
word[1] ← GetRandom16[];
RETURN[ LOOPHOLE[word] ];
};
GetRandom64: PUBLIC PROC RETURNS [ AuxDefs.BLOCK ] =
{
i: CARDINAL ← 0;
word: PACKED ARRAY[0..3] OF UNSPECIFIED;
word[0] ← GetRandom16[];
word[1] ← GetRandom16[];
word[2] ← GetRandom16[];
word[3] ← GetRandom16[];
RETURN[ LOOPHOLE[word] ];
};
----------------------------------------------------------------
-- Electronic Stable Storage
----------------------------------------------------------------
SSRead: PUBLIC PROC [ address: CARDINAL ]
RETURNS [ UNSPECIFIED ] =
{
NotImplementedYet["SSRead"];
RETURN[0];
};
SSWrite: PUBLIC PROC [ address: CARDINAL,
data: UNSPECIFIED ] =
{
NotImplementedYet["SSWrite"];
};
GetSSSize: PUBLIC PROC RETURNS [ CARDINAL ] = -- KWords
{
NotImplementedYet["GetSSSize"];
RETURN[16];
};
----------------------------------------------------------------
-- External Parallel I/O
----------------------------------------------------------------
ExtRead: PUBLIC PROC [ Address: CARDINAL ]
RETURNS [ UNSPECIFIED ] =
{
NotImplementedYet["ExtRead"];
RETURN[0];
};
ExtWrite: PUBLIC PROC [ Address: CARDINAL,
data: UNSPECIFIED ] =
{
NotImplementedYet["ExtWrite"];
};
ExtWait: PUBLIC PROC [ AuxDefs.CHANNEL ] =
{
NotImplementedYet["ExtWait"];
};
ExtPost: PUBLIC PROC [ AuxDefs.CHANNEL ] =
{
NotImplementedYet["ExtPost"];
};
NotImplementedYet: PROC [ s: STRING ] =
{
IODefs.WriteString["Sorry, "];
IODefs.WriteString[s];
IODefs.WriteLine[" in module AuxImpl is not implemented yet!"];
};
}.