-- File: AltoRam.mesa, Last Edit: HGM July 18, 1980 8:31 AM
DIRECTORY
PrincOps USING [zLIW, zJRAM, zPOP];
AltoRam: DEFINITIONS =
BEGIN
Shorten: PROCEDURE [LONG POINTER] RETURNS [POINTER] = MACHINE CODE
BEGIN PrincOps.zPOP; END;
-- This is a kludgy place to put this, but all the Alto drivers already use this module
GetTicks: PROCEDURE RETURNS [CARDINAL] = INLINE
BEGIN clock: POINTER TO CARDINAL = LOOPHOLE[430B]; RETURN[clock^] END;
msPerTick: CARDINAL = 39;
LoadRamAndBoot: PROCEDURE [filename: STRING];
CantFindFile: ERROR;
FileLooksCrufty: ERROR;
-- Internal things used to prevent the microcode from getting confused
-- when the bank registers are reset
LockThingsInLowMemory: PROCEDURE;
DoSilentBoot: PROCEDURE [WORD];
UnBoot: PROCEDURE;
-- Interface to Taft's microcode
-- Beware: these routines assume that the stack does not have anything extra on it when they are called. Also, PupChecksum is interruptable. It assumes that the JRAM is alpha aligned which is forced by the preceeding LIW.
ramOffset: CARDINAL = 1400B;
silentBootAddr: CARDINAL = ramOffset + 0;
SilentBoot: PROCEDURE [bootLocusVector: WORD] = MACHINE CODE
BEGIN
PrincOps.zLIW, silentBootAddr/256, silentBootAddr MOD 256;
PrincOps.zJRAM;
END;
enableEiaAddr: CARDINAL = ramOffset + 1;
EnableEia: PROCEDURE [p: POINTER] = MACHINE CODE
BEGIN
PrincOps.zLIW, enableEiaAddr/256, enableEiaAddr MOD 256;
PrincOps.zJRAM;
END;
setLineTabAddr: CARDINAL = ramOffset + 1;
SetLineTab: PROCEDURE [p: POINTER] = MACHINE CODE
BEGIN
PrincOps.zLIW, setLineTabAddr/256, setLineTabAddr MOD 256;
PrincOps.zJRAM;
END;
pupChecksumAddr: CARDINAL = ramOffset + 2;
PupChecksum: PROCEDURE [initial: WORD, where: POINTER, length: CARDINAL]
RETURNS [WORD] = MACHINE CODE
BEGIN
PrincOps.zLIW, pupChecksumAddr/256, pupChecksumAddr MOD 256;
PrincOps.zJRAM;
END;
changeControlRegAddr: CARDINAL = ramOffset + 3;
ChangeControlReg: PROCEDURE [lineTimes4: CARDINAL, changeMask: WORD] = MACHINE
CODE
BEGIN
PrincOps.zLIW, changeControlRegAddr/256, changeControlRegAddr MOD 256;
PrincOps.zJRAM;
END;
END.