-- XDisplayDefs.mesa -- Mesa 6 version (won't work on Alto) -- Last changed by Doug Wyatt, May 31, 1980 2:17 PM -- Extended memory display for AltoIIXM and D-machines XDisplayDefs: DEFINITIONS = BEGIN XDisplayError: SIGNAL; -- The Display Bank -- Alto hardware limitations require all displayed bitmaps to reside -- in the same bank. XDisplay maintains a "current display bank" which -- is initialized (to an alternate bank if possible) when an image -- is started. BankIndex: TYPE = [0..3]; LPRec: TYPE = MACHINE DEPENDENT RECORD [ptr: POINTER, unused: [0..37777B]←0, bank: BankIndex]; LPBank: PROCEDURE[lp: LONG POINTER] RETURNS[BankIndex] = INLINE { RETURN[LOOPHOLE[lp,LPRec].bank] }; LPPtr: PROCEDURE[lp: LONG POINTER] RETURNS[POINTER] = INLINE { RETURN[LOOPHOLE[lp,LPRec].ptr] }; LP: PROCEDURE[p: POINTER, b: BankIndex] RETURNS[LONG POINTER] = INLINE { RETURN[LOOPHOLE[LPRec[ptr: p, bank: b]]] }; dBank: PRIVATE BankIndex; -- the current display bank DBank: PROCEDURE RETURNS[BankIndex] = INLINE { RETURN[dBank] }; -- AllocDSegment and FreeDSegment allocate and free segments in the -- current display bank. AllocDSegment: PROCEDURE[pages: CARDINAL] RETURNS[LONG POINTER]; FreeDSegment: PROCEDURE[LONG POINTER]; -- Bitmaps BitmapDescriptor: TYPE = RECORD [ base: LONG POINTER, raster,lines: CARDINAL ]; BMPtr: TYPE = POINTER TO BitmapDescriptor; BMSize,BMDisplaySize: PROCEDURE[bm: BMPtr, width,height: CARDINAL]; AllocBitmap: PROCEDURE[BMPtr]; FreeBitmap: PROCEDURE[BMPtr]; ClearBitmap: PROCEDURE[bm: BMPtr]; -- Display management maxWidth: CARDINAL = 608; -- in bits maxHeight: CARDINAL = 808; -- in lines DcbResolution: TYPE = MACHINE DEPENDENT {high(0),low(1)}; -- (low does not work on D-machines) DcbBackground: TYPE = MACHINE DEPENDENT {white(0),black(1)}; Dcb: TYPE = PRIVATE MACHINE DEPENDENT RECORD [ next: DcbPtr ← dcbNIL, resolution: DcbResolution ← high, background: PUBLIC DcbBackground ← white, indent: PUBLIC [0..77B] ← 0, -- in words width: PUBLIC [0..377B] ← 0, -- in words, must be even bitmap: POINTER ← NIL, -- must be even tag: MACHINE DEPENDENT {short(0),long(1)} ← short, height: PUBLIC [0..77777B] ← 0, -- in double scan lines lbitmap: LONG POINTER ← NIL ]; DcbPtr: TYPE = POINTER TO Dcb; dcbNIL: DcbPtr = LOOPHOLE[0]; -- This value is hardware-dependent. Use dcbNIL rather than NIL. dcbChain: PRIVATE POINTER TO DcbPtr = LOOPHOLE[420B]; DcbArray: TYPE = PRIVATE ARRAY [0..SIZE[Dcb]+1) OF UNSPECIFIED; DcbInit: PROCEDURE[POINTER TO DcbArray] RETURNS[DcbPtr]; -- The idea is to use DcbInit as follows -- dcba: DcbArray; -- dcb: DcbPtr ← DcbInit[@dcba]; EnumerateDcbs: PROCEDURE [Proc: PROCEDURE[DcbPtr] RETURNS[BOOLEAN]] RETURNS[DcbPtr]; LinesAbove: PROCEDURE[dcb: DcbPtr] RETURNS[CARDINAL]; LinesRemaining: PROCEDURE RETURNS[CARDINAL] = INLINE { RETURN[maxHeight-LinesAbove[dcbNIL]] }; FirstDcb: PROCEDURE RETURNS[DcbPtr] = INLINE { RETURN[dcbChain↑] }; NextDcb: PROCEDURE[dcb: DcbPtr] RETURNS[DcbPtr] = INLINE { RETURN[dcb.next] }; InsertDcb: PROCEDURE[dcb,otherdcb: DcbPtr]; RemoveDcb: PROCEDURE[dcb: DcbPtr]; Displayed: PROCEDURE[dcb: DcbPtr] RETURNS[BOOLEAN]; DcbOrigin: PROCEDURE[dcb: DcbPtr] RETURNS[CARDINAL,CARDINAL] = INLINE { RETURN[16*dcb.indent,LinesAbove[dcb]] }; -- DcbOrigin returns the x,y location in screen coordinates of the -- upper left corner of a displayed bitmap. DcbBitmap: PROCEDURE[dcb: DcbPtr, bm: BMPtr] = INLINE { pDcbBitmap↑[dcb,bm] }; pDcbBitmap: PRIVATE POINTER TO PROCEDURE[DcbPtr,BMPtr]; -- BitBlt tables and such BBSourceType: TYPE = MACHINE DEPENDENT {block,complement,andgray,gray}; -- block: BBSourceType=0 Source = SourceBitmap -- complement: BBSourceType=1 Source = NOT SourceBitmap -- andgray: BBSourceType=2 Source = SourceBitmap AND GrayBlock -- gray: BBSourceType=3 Source = GrayBlock BBOperation: TYPE = MACHINE DEPENDENT {replace,paint,invert,erase}; -- replace: BBOperation=0 Destination ← Source -- paint: BBOperation=1 Destination ← Source OR Destination -- invert: BBOperation=2 Destination ← Source XOR Destination -- erase: BBOperation=3 Destination ← (NOT Source) AND Destination BBTable: TYPE = PRIVATE MACHINE DEPENDENT RECORD [ ptrs: MACHINE DEPENDENT {Alto, D0} ← Alto, -- use short (Alto) or long (D0) pointers pad: [0..777B] ← 0, sourcealt: BOOLEAN ← FALSE, -- TRUE to use alternate memory bank destalt: BOOLEAN ← FALSE, -- TRUE to use alternate memory bank sourcetype: PUBLIC BBSourceType ← gray, operation: PUBLIC BBOperation ← replace, unused: CARDINAL ← 0, dbca: POINTER ← NIL, -- destination BaseCoreAddress dbmr: CARDINAL ← 0, -- destination raster width(in words) dlx: PUBLIC CARDINAL ← 0, -- destination left x dty: PUBLIC CARDINAL ← 0, -- destination top y dw: PUBLIC CARDINAL ← 0, -- destination width dh: PUBLIC CARDINAL ← 0, -- destination height sbca: POINTER ← NIL, -- source BaseCoreAddress sbmr: CARDINAL ← 0, -- source raster width(in words) slx: PUBLIC CARDINAL ← 0, -- source left x sty: PUBLIC CARDINAL ← 0, -- source top y gray: PUBLIC ARRAY [0..4) OF CARDINAL ← [0,0,0,0], -- four words of "gray" -- used only by Long BitBlt (D-machines) slbca: LONG POINTER ← NIL, -- source long BaseCoreAddress dlbca: LONG POINTER ← NIL, -- destination long BaseCoreAddress -- not used by BitBlt; may be used for bounds checking sbmh,dbmh: CARDINAL ← 0 -- source and destination bitmap heights ]; BBPtr: TYPE = POINTER TO BBTable; BBArray: TYPE = PRIVATE ARRAY [0..SIZE[BBTable]+1) OF UNSPECIFIED; BBAPtr: TYPE = POINTER TO BBArray; BBInit: PROCEDURE[BBAPtr] RETURNS[BBPtr]; -- The idea is to use BBInit as follows -- bba: BBArray; -- bb: BBPtr ← BBInit[@bba]; BBSource: PROCEDURE[bb: BBPtr, bm: BMPtr] = INLINE { bb.sbca←LPPtr[bb.slbca←bm.base]; bb.sourcealt←LPBank[bm.base]#0; bb.sbmr←bm.raster; bb.sbmh←bm.lines; }; BBDest: PROCEDURE[bb: BBPtr, bm: BMPtr] = INLINE { bb.dbca←LPPtr[bb.dlbca←bm.base]; bb.destalt←LPBank[bm.base]#0; bb.dbmr←bm.raster; bb.dbmh←bm.lines; }; -- The following should be set before BitBlt is called -- sourcetype, operation, BBDest, dlx,dty, dw,dh (always) -- BBSource, slx,sty (if sourcetype is block, complement, or andgray) -- gray (if sourcetype is andgray or gray) BitBlt: PROCEDURE[bb: BBPtr] = INLINE { pBitBlt↑[bb,LPBank[bb.dlbca]] }; pBitBlt: PRIVATE POINTER TO PROCEDURE[BBPtr,BankIndex]; XDisplay: PROGRAM; END.