DIRECTORY Basics USING [LongDivMod, LongMult], ColorDisplayFace USING [Color, DisplayType, Mode], DeviceCleanup USING [Await, Item, Reason], D0InputOutput USING [ControllerNumber, ControllerType, GetNextController, IOPage, nullControllerNumber, Output], PrincOps USING [PageCount, PageNumber, wordsPerPage], ProcessorFace USING [GetClockPulses, microsecondsPerHundredPulses]; ColorDisplayHeadD0: PROGRAM IMPORTS Basics, DeviceCleanup, D0InputOutput, ProcessorFace EXPORTS ColorDisplayFace = { ErrorHalt: PROC = {ERROR}; Base: TYPE = LONG BASE POINTER; RPtr: TYPE = Base RELATIVE POINTER; -- relative to absolute address 0 rpNIL: RPtr = LOOPHOLE[0]; Mode: TYPE = ColorDisplayFace.Mode; Color: TYPE = ColorDisplayFace.Color; DisplayType: TYPE = ColorDisplayFace.DisplayType; screenwidth: CARDINAL = 640; -- pixels per line screenheight: CARDINAL = 481; -- scan lines (part of last line is not visible) wordsPerLine: CARDINAL = screenwidth/4; screenSize: LONG CARDINAL = Basics.LongMult[wordsPerLine,screenheight]; ColorData: TYPE = MACHINE DEPENDENT RECORD [ addr: [0..17B], r,g,b,unused: BOOLEAN _ FALSE, data: [0..377B]]; ColorEntry: TYPE = MACHINE DEPENDENT RECORD [r,g,b: ColorData]; ColorTable: TYPE = MACHINE DEPENDENT RECORD [ front: ARRAY [0..2) OF CARDINAL _ ALL[0], array: ARRAY [0..16) OF ColorEntry, back: ARRAY [0..10) OF CARDINAL _ ALL[0] ]; tableSize: CARDINAL = ((SIZE[ColorTable]+15)/16)*16; -- round up to multiple of 16 CSBState: TYPE = MACHINE DEPENDENT RECORD [ bitmap: LONG POINTER, -- must be a multiple of 16 table: LONG POINTER TO ColorTable -- must be a multiple of 16 ]; colorControllerType: D0InputOutput.ControllerType = 257B; colorControllerNumber: D0InputOutput.ControllerNumber _ D0InputOutput.nullControllerNumber; csb: LONG POINTER TO CSBState _ NIL; globalStateSize: PUBLIC NAT _ 0; -- for Initialize displayType: PUBLIC DisplayType _ none; -- display type pixelsPerInch: PUBLIC NAT _ 0; -- Size of a pixel width,height: PUBLIC NAT _ 0; -- Dimensions of current raster in pixels baseA,baseB: PUBLIC LONG POINTER _ NIL; -- bitmap addresses bplA,bplB: PUBLIC NAT _ 0; -- bitmap bits per line initialized: BOOLEAN _ FALSE; -- control blocks are allocated connected: BOOLEAN _ FALSE; -- bitmaps and tables are allocated, globals are set turnedon: BOOLEAN _ FALSE; -- display is on, bitmaps and tables are resident fullmode: BOOLEAN _ FALSE; -- connected in 24 bit per pixel mode mapmode: BOOLEAN _ FALSE; -- connected in a mapped mode showA: BOOLEAN _ FALSE; -- to be shown table: LONG POINTER TO ColorTable _ NIL; Initialize: PUBLIC PROC [globalState: LONG POINTER] = { initialized _ TRUE; }; Lg: TYPE = [0..4); -- logarithm base 2 lg1: Lg = 0; lg2: Lg = 1; lg4: Lg = 2; lg8: Lg = 3; PagesForWords: PROC[words: LONG CARDINAL] RETURNS[CARDINAL] = INLINE { q,r: CARDINAL; [q,r] _ Basics.LongDivMod[words,PrincOps.wordsPerPage]; RETURN[IF r>0 THEN q+1 ELSE q] }; WordsForPages: PROC[pages: CARDINAL] RETURNS[LONG CARDINAL] = INLINE { RETURN[Basics.LongMult[pages,PrincOps.wordsPerPage]] }; LPFromPage: PROC[page: PrincOps.PageNumber] RETURNS[LONG POINTER] = INLINE { RETURN[LOOPHOLE[Basics.LongMult[page, PrincOps.wordsPerPage]]] }; HasMode: PUBLIC PROC[mode: Mode] RETURNS[BOOLEAN] = { IF displayType = none THEN RETURN[FALSE]; IF mode.full OR mode.useB THEN RETURN[FALSE]; RETURN[mode.useA AND mode.lgBitsPerPixelA=lg4]; }; PagesForMode: PUBLIC PROC[mode: Mode] RETURNS[PrincOps.PageCount] = { RETURN[PagesForWords[tableSize + screenSize]]; }; Connect: PUBLIC PROC [mode: Mode, firstPage: PrincOps.PageNumber, nPages: PrincOps.PageCount] = { alloc: LONG POINTER _ LPFromPage[firstPage]; -- next available word Alloc: PROC[words: LONG CARDINAL] RETURNS[LONG POINTER] = INLINE { p: LONG POINTER _ alloc; alloc _ alloc + words; RETURN[p] }; wpl: CARDINAL = screenwidth/4; -- words per scan line IF NOT initialized OR NOT HasMode[mode] OR connected THEN ErrorHalt[]; IF nPages { state _ csb^; IF state.bitmap#NIL THEN { csb.bitmap _ NIL; Wait[]; HardwareOff[] }; }; turnOn => { csb^ _ state; IF state.bitmap#NIL THEN HardwareOn[]; }; ENDCASE; ENDLOOP; }; Start: PROC = { OPEN D0InputOutput; colorControllerNumber _ GetNextController[colorControllerType,nullControllerNumber]; IF colorControllerNumber#nullControllerNumber THEN { displayType _ ramtek525; pixelsPerInch _ 72; -- *** Is this right? *** csb _ LOOPHOLE[@IOPage[colorControllerNumber]]; csb^ _ [bitmap: NIL, table: NIL]; }; }; Start[]; }. TColorDisplayHeadD0.mesa Last edit by Doug Wyatt on 21-Dec-81 9:40:49 Last edit by Levin on 26-Feb-82 13:12:24 Last edit by Maxwell on December 9, 1983 8:31 am Interface variables The following are valid as soon as the module start code has run (see Start) Internal globals The following globals are valid when initialized=TRUE (see Initialize) (none for D0) -- The following globals are valid when connected=TRUE (see Connect) Note: both the following pointers must be multiples of 16. table is a multiple of 16, since it starts at a page boundary baseA is a multiple of 16, since tableSize is a multiple of 16 Also, the color table must not cross a 64K boundary; should be OK here since table starts at a page boundary and tableSize˜QJ˜—Jšœ œ'˜5Jšœœ0˜CJ˜—Jšœ˜Jšœ5˜™>JšœA™AJšœF™FJ˜J˜J˜Jšœœœ˜0šœœœ ˜Jšœ œ ˜1Jšœ œ ˜1Jšœ œ ˜1Jšœ˜—J˜Jšœœ˜ Jšœ œ˜J˜J˜—šž œœœ˜Jšœ œ ˜Jšœ œ˜J˜Jšœœ ˜Jšœœ˜ Jšœ œ˜J˜J˜—šžœœœ˜Jš œœ œ œœ˜+Jšœœ&˜3Jšœ œ˜J˜J˜—šžœœœ˜Jšœœ œœ˜Jšœœœ˜:Jšœ œ˜J˜J˜J˜—šžœœœœ˜#Jšœ œœ˜J˜ Jšœœ œœ˜Jšœœ%˜2Jšœœ˜1J˜J˜—Jšœ)™)J˜š žœœœœœ˜Hšœ œ˜Jšœœ˜J˜'JšœE˜KJ˜—Jšœœ˜J˜J˜—šžœœœœ˜@šœ œ˜Jšœœ˜J˜$J˜$J˜$J˜—J˜J˜—Jš ž œœœ œœ˜FJš ž œœœ œœ˜HJš ž œœœ œœ˜GJ˜Jšž œœœ˜,Jšž œœœ˜.Jšž œœœ˜-J˜Jšœ™J˜JšœœŸ&˜=šœœœŸ˜7šœœŸœ Ÿœ˜KJšœœ5˜:J˜——š žœœœ œœ"˜OJšœAœœ˜SJ˜—šž œœœ˜˜(J˜4J˜——šž œœœ˜˜(J˜4J˜——šžœœœœ˜6J˜ J˜J˜š˜J˜Jš œœœœŸ>˜Xšœ˜˜Jšœœœœ˜EJ˜—˜Jšœœœ˜&J˜—Jšœ˜—Jšœ˜—J˜J˜—Jšœ™J˜šžœœ˜Jšœ˜J˜Tšœ,œ˜4J˜JšœŸ˜-Jšœœ!˜/Jšœœ œ˜!J˜—J™J˜—J˜˜J˜—J˜J˜J˜—…—š*M