-- AltoHardware.Mesa Edited by Sandman on June 30, 1980 9:21 AM
-- Copyright Xerox Corporation 1979, 1980
AltoHardware: DEFINITIONS =
BEGIN
WordLength: CARDINAL = 16;
CharLength: CARDINAL = 8;
PageSize: CARDINAL = 256;
-- Extended Memory
BankRegister: TYPE = MACHINE DEPENDENT RECORD [
undefined: [0..7777B], normal, alternate: BankNumber];
BankNumber: TYPE = CARDINAL [0..3];
BankRegisters: POINTER TO ARRAY Task OF BankRegister = LOOPHOLE[177740B];
Task: TYPE = {
Emulator, OrbitSlot, unused2, Trident3, KSEC, Tape5, Tape6, ETHER, MRT, DWT,
CURT, DHT, DVT, PART, KWD, Trident17};
Maxc2MemoryInterface: Task = Task[Trident17];
-- Display Controller
DCBchainHead: POINTER TO DCBHandle = LOOPHOLE[420B];
DIW: POINTER TO WORD = LOOPHOLE[421B];
DCB: TYPE = MACHINE DEPENDENT RECORD [
next: DCBHandle,
resolution: Resolution,
background: Background,
indenting: [0..77B], -- in units of 16 bits
width: [0..377B], -- likewise; must be even
bitmap: POINTER, -- must be even
height: CARDINAL]; -- in double scan lines
DCBHandle: TYPE = POINTER TO DCB;
Resolution: TYPE = {high, low};
Background: TYPE = {white, black};
CursorBits: TYPE = ARRAY [0..16) OF WORD;
CursorHandle: TYPE = POINTER TO CursorBits;
Cursor: CursorHandle = LOOPHOLE[431B];
Coordinate: TYPE = MACHINE DEPENDENT RECORD [x, y: INTEGER];
CursorXY: POINTER TO Coordinate = LOOPHOLE[426B];
-- Keyboard
KBDAD: POINTER TO KeyboardBits = LOOPHOLE[177034B];
KeyboardBits: TYPE = MACHINE DEPENDENT RECORD [
Five, Four, Six, E, Seven, D, U, V, Zero, K, Dash, P, Slash, BackSlash, LF,
BS: UpDown,
Three, Two, W, Q, S, A, Nine, I, X, O, L, Comma, Quote, RightBracket, Spare2,
Spare1: UpDown,
One, ESC, TAB, F, Ctrl, C, J, B, Z, LeftShift, Period, SemiColon, Return,
Arrow, DEL, FL3: UpDown,
R, T, G, Y, H, Eight, N, M, Lock, Space, LeftBracket, Equal, RightShift,
Spare3, FL4, FR5: UpDown];
UpDown: TYPE = {down, up};
-- Mouse, Keyset, UtilIn and UtilOut
UtilInBits: TYPE = MACHINE DEPENDENT RECORD [
util: [0..377B], -- Diablo, Versatec, etc.
key0: UpDown, -- left-most
key1: UpDown,
key2: UpDown,
key3: UpDown,
key4: UpDown, -- right-most
redMouse: UpDown,
blueMouse: UpDown,
yellowMouse: UpDown];
UtilIn: POINTER TO UtilInBits = LOOPHOLE[177030B];
UtilOut: POINTER TO WORD = LOOPHOLE[177016B];
-- Parity Error Stuff
ParityErrorData: TYPE = MACHINE DEPENDENT RECORD [
DCBR: POINTER, -- Disk control block fetch pointer
KNMAR: POINTER, -- Disk word fetch/store pointer
DWA: POINTER, -- Display word fetch address
CBA: POINTER, -- Display control block fetch address
PC: POINTER, -- Current program counter in Alto emulator
SAD: POINTER]; -- Temporary register for indirection in Alto emulator
ParityErrorDataLoc: POINTER TO ParityErrorData = LOOPHOLE[614B];
MemoryErrorAddressRegister: POINTER TO POINTER = LOOPHOLE[177024B];
MemoryErrorStatus: TYPE = MACHINE DEPENDENT RECORD [
hammingCode: [0..77B],
parityError: [0..1],
memoryParity: [0..1],
syndrome: [0..77B],
bankNumber: BankNumber];
MemoryErrorStatusRegister: POINTER TO POINTER = LOOPHOLE[177025B];
MemoryErrorControl: TYPE = MACHINE DEPENDENT RECORD [
spare1: [0..17B],
testHammingCode: [0..177B],
testMode: [0..1],
interruptSingleBitErrors: [0..1],
interruptDoubleBitErrors: [0..1],
noErrorCorrection: [0..1],
spare2: [0..1]];
MemoryErrorControlRegister: POINTER TO POINTER = LOOPHOLE[177026B];
-- Disk Controller
NextDiskCommand: POINTER TO KCBHandle = LOOPHOLE[521B];
DiskStatus: POINTER TO DS = LOOPHOLE[522B];
LastDiskAddress: POINTER TO DA = LOOPHOLE[523B];
SectorInterrupts: POINTER TO WORD = LOOPHOLE[524B];
-- physical disk address
DA: TYPE = MACHINE DEPENDENT RECORD [
sector: [0..17B], track: [0..777B], head, disk: [0..1], restore: [0..1]];
-- DAs with special meaning
InvalidDA: DA = DA[17B, 777B, 1, 1, 1];
-- disk header
DH: TYPE = MACHINE DEPENDENT RECORD [packID: CARDINAL, diskAddress: DA];
-- file identifier
FID: TYPE = MACHINE DEPENDENT RECORD [
version: CARDINAL, serial: LONG UNSPECIFIED];
-- disk label
DL: TYPE = MACHINE DEPENDENT RECORD [
next, prev: DA,
blank: UNSPECIFIED,
bytes: CARDINAL,
page: CARDINAL,
fileID: FID];
-- disk final status
DFS: TYPE = {CommandComplete, HardwareError, CheckError, IllegalSector};
-- disk status word
DS: TYPE = MACHINE DEPENDENT RECORD [
sector: [0..17B],
done: [0..17B],
seekFailed: [0..1],
seekInProgress: [0..1],
notReady: [0..1],
dataLate: [0..1],
noTransfer: [0..1],
checksumError: [0..1],
finalStatus: DFS];
-- disk subcommands
DSC: TYPE = {DiskRead, DiskCheck, DiskWrite, DiskWriteAlso};
-- hardware disk command
DC: TYPE = MACHINE DEPENDENT RECORD [
seal: [0..377B], header, label, data: DSC, seek, exchange: [0..1]];
KCBHandle: TYPE = POINTER TO KCB;
-- disk command block (label, page, and zone added)
KCB: TYPE = MACHINE DEPENDENT RECORD [
nextCB: KCBHandle,
status: DS,
command: DC,
headerAddress: POINTER,
labelAddress: POINTER,
dataAddress: POINTER,
normalWakeups: WORD,
errorWakeups: WORD,
unused: UNSPECIFIED,
diskAddress: DA];
-- Ethernet Controller
EPLoc: POINTER TO EthernetDeviceBlock = LOOPHOLE[600B];
EthernetDeviceBlock: TYPE = MACHINE DEPENDENT RECORD [
postData: EthernetPost,
interruptBit: WORD,
wordsLeft: CARDINAL,
retransmissionMask: WORD,
inputBuffer: WordBlockDescriptor,
outputBuffer: WordBlockDescriptor,
hostNumber: WORD];
WordBlockDescriptor: TYPE = MACHINE DEPENDENT RECORD [
count: CARDINAL, pointer: POINTER];
EthernetPost: TYPE = MACHINE DEPENDENT RECORD [
microcodeStatus: EthernetMicrocodeStatus,
hardwareStatus: EthernetHardwareStatus];
EthernetMicrocodeStatus: TYPE = RECORD [[0..377B]];
inputDone: EthernetMicrocodeStatus = [0];
outputDone: EthernetMicrocodeStatus = [1];
inputBufferOverflow: EthernetMicrocodeStatus = [2];
outputLoadOverflow: EthernetMicrocodeStatus = [3];
zeroLengthBuffer: EthernetMicrocodeStatus = [4];
hardwareReset: EthernetMicrocodeStatus = [5];
interfaceBroken: EthernetMicrocodeStatus = [6];
EthernetHardwareStatus: TYPE = MACHINE DEPENDENT RECORD [
unused: [0..2],
inputDataLate: [0..1],
collision: [0..1],
badInputCRC: [0..1],
inputCommandIssued: [0..1],
outputCommandIssued: [0..1],
incompleteTransmission: [0..1]];
-- Other
RealTimeClock: POINTER TO CARDINAL = LOOPHOLE[430B];
END.