DIRECTORY DoradoInputOutput USING [IOAddress]; ColorDisplayDorado: DEFINITIONS ~ BEGIN Base: TYPE ~ LONG BASE POINTER; base0: Base ~ LOOPHOLE[LONG[0]]; RNIL: Base RELATIVE POINTER ~ LOOPHOLE[0]; 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: BOOL _ FALSE, -- minimixer (unimplemented) vc: BOOL _ FALSE, -- vertical control hc: BOOL _ FALSE, -- horizontal control clk: BOOL _ FALSE, -- clock a: BOOL _ FALSE, -- A table b: BOOL _ FALSE, -- B table c: BOOL _ FALSE -- 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. ΐColorDisplayDorado.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Doug Wyatt, May 1, 1985 4:16:56 pm PDT Every "Base RELATIVE POINTER" below is relative to base0. ΚΑ˜codešœ™Kšœ Οmœ1™Jšœžœ ˜ š œžœžœž œžœ˜0J˜J˜J˜J˜—J˜Jšœ2˜2Jšœ1˜1Jšœ1˜1J˜š œ žœžœž œžœ˜,Jšœžœž œ˜)Jšœžœž œ˜*Jšœžœž œ˜)Jšœ˜šœžœžœž˜Jšœ˜Jšœ2žœž œ˜TJ˜Jšž˜—J˜J˜—š œ žœžœž œžœ˜)Jšœžœž œ˜)Jšœžœž œ˜*Jšœžœž œ˜)Jšœ˜šœžœžœž˜Jšœ˜Jšœ+˜+Jšœ+˜+Jšž˜—J˜J˜—K˜Kšžœ˜—…—`α