-- 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!"];
};

}.