ColorDisplayDorado.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Doug Wyatt, May 1, 1985 4:16:56 pm PDT
DIRECTORY
DoradoInputOutput USING [IOAddress];
ColorDisplayDorado: DEFINITIONS
~ BEGIN
Base: TYPE ~ LONG BASE POINTER;
base0: Base ~ LOOPHOLE[LONG[0]];
RNIL: Base RELATIVE POINTER ~ LOOPHOLE[0];
Every "Base RELATIVE POINTER" below is relative to base0.
csb: Base RELATIVE POINTER TO ColorCSB ~ LOOPHOLE[177414B];
ColorCSB: TYPE ~ MACHINE DEPENDENT RECORD[ -- "controller status block"
mcb: Base RELATIVE POINTER TO MonitorControlBlock
];
MonitorControlBlock: TYPE ~ MACHINE DEPENDENT RECORD[ -- 5 words
seal: CARDINAL ← mcbSeal,
flags: Flags,
channelA: Base RELATIVE POINTER TO ChannelControlBlock,
channelB: Base RELATIVE POINTER TO ChannelControlBlock,
color: Base RELATIVE POINTER TO ColorControlBlock
];
mcbSeal: CARDINAL ~ 177456B;
Flags: TYPE ~ MACHINE DEPENDENT RECORD [
unused: [0..777B] ← 0,
m: BOOLFALSE, -- minimixer (unimplemented)
vc: BOOLFALSE, -- vertical control
hc: BOOLFALSE, -- horizontal control
clk: BOOLFALSE, -- clock
a: BOOLFALSE, -- A table
b: BOOLFALSE, -- B table
c: BOOLFALSE -- C table
];
ChannelControlBlock: TYPE ~ MACHINE DEPENDENT RECORD[ -- 8 words
link: Base RELATIVE POINTER TO ChannelControlBlock ← RNIL, -- next control block
wordsPerLine: CARDINAL, -- words per scan line
address: LONG POINTER, -- frame buffer address (must be even)
linesPerField: CARDINAL, -- scan lines per field (height / 2)
pixelsPerLine: CARDINAL, -- pixelsPerLineOffset + visible pixels/scanline
leftMargin: CARDINAL, -- left margin + marginOffset[monitortype]
scanControl: ScanControl -- scan control word (see below)
];
pixelsPerLineOffset: CARDINAL ~ 400B; -- offset for pixelsPerLine
ScanControl: TYPE ~ MACHINE DEPENDENT RECORD[
unused: [0..77B] ← 0,
mode24: BOOL, -- 24 bit per pixel mode
aChannelOnly: BOOL, -- if TRUE, disable B channel
bBypass: BOOL, -- B channel bypassed to BTable
pixelMode: PixelMode, -- 10 bit pixel value is aaaaaaaabb or aaaaaabbbb
resolution: Resolution, -- scan resolution
bitsPerPixel: [0..17B] -- bits per pixel; must be 1, 2, 4, or 8
];
PixelMode: TYPE ~ MACHINE DEPENDENT {a6b4(0), a8b2(1)};
Resolution: TYPE ~ MACHINE DEPENDENT {quarter(0), unused(1), half(2), full(3)};
ColorControlBlock: TYPE ~ MACHINE DEPENDENT RECORD[ -- 16 words
tableA: LONG POINTER TO ATable, -- color table A [set mcb.flags.a to load]
tableB: LONG POINTER TO BCTable, -- color table B [flags.b]
tableC: LONG POINTER TO BCTable, -- color table C [flags.c]
miniMixer: LONG POINTER TO MiniMixerTable ← NIL, -- MiniMixer table [flags.m]
vc: VerticalControl, -- vertical control information [flags.vc]
hc: HorizontalControl, -- horizontal control [flags.hc]
clk: ClockControl, -- clock control [flags.clk]
reserved: CARDINAL ← 0
];
VerticalControl: TYPE ~ MACHINE DEPENDENT RECORD[
VBtoVS: [0..377B], VStoVS: [0..377B],
VStoVB: CARDINAL,
VisibleLines: CARDINAL
];
HorizontalControl: TYPE ~ MACHINE DEPENDENT RECORD[
HRamMaxAddr: CARDINAL,
HBLeadLength: [0..377B], HSTrailAddr: [0..377B],
HBTrailLength: CARDINAL
];
ClockControl: TYPE ~ MACHINE DEPENDENT RECORD[
zero: [0..17B] ← 0, mul: [0..377B], div: [0..17B]
];
ATable: TYPE ~ ARRAY AIndex OF AEntry;
AIndex: TYPE ~ [0..1024);
AEntry: TYPE ~ MACHINE DEPENDENT RECORD[
zeroL(0:0..3): [0..17B] ← 0, -- always zero
redL(0:4..7): [0..17B], -- low order 4 bits of red value
blue(0:8..15): [0..377B], -- blue value
zeroH(1:0..3): [0..17B] ← 0, -- always zero
green(1:4..11): [0..377B], -- green value
redH(1:12..15): [0..17B] -- high order 4 bits of red value
];
BCTable: TYPE ~ ARRAY BCIndex OF BCEntry;
BCIndex: TYPE ~ [0..256);
BCEntry: TYPE ~ MACHINE DEPENDENT RECORD[
zero(0:0..7): [0..377B] ← 0, -- always zero
value(0:8..15): [0..377B] -- table value
];
MiniMixerTable: TYPE ~ ARRAY MiniMixerIndex OF MiniMixerEntry;
MiniMixerIndex: TYPE ~ [0..256);
MiniMixerEntry: TYPE ~ MACHINE DEPENDENT RECORD[
address(0:0..7): [0..377B],
data(0:8..15): [0..377B]
];
mixerRegister: DoradoInputOutput.IOAddress ~ 361B;
bMapRegister: DoradoInputOutput.IOAddress ~ 365B;
cMapRegister: DoradoInputOutput.IOAddress ~ 362B;
MixerDatum: TYPE ~ MACHINE DEPENDENT RECORD[
keep: MACHINE DEPENDENT {T(0), F(1)} ← F,
write: MACHINE DEPENDENT {T(0), F(1)} ← F,
load: MACHINE DEPENDENT {F(0), T(1)} ← F,
unused: [0..1] ← 0,
body: SELECT COMPUTED * FROM
null => [x: [0..7777B] ← 0],
addr => [x: [0..1] ← 0, addr: [0..1777B], select: MACHINE DEPENDENT {lo(0), hi(1)}],
data => [data: [0..7777B]],
ENDCASE
];
BCDatum: TYPE ~ MACHINE DEPENDENT RECORD[
keep: MACHINE DEPENDENT {T(0), F(1)} ← F,
write: MACHINE DEPENDENT {T(0), F(1)} ← F,
load: MACHINE DEPENDENT {F(0), T(1)} ← F,
unused: [0..1] ← 0,
body: SELECT COMPUTED * FROM
null => [x: [0..7777B] ← 0],
addr => [x: [0..17B] ← 0, addr: [0..377B]],
data => [x: [0..17B] ← 0, data: [0..377B]],
ENDCASE
];
END.