-- AltoScreenImpl.mesa -- Last changed by Doug Wyatt, September 2, 1980 3:22 PM -- Last changed by Doug Brotz, June 16, 1981 3:45 PM DIRECTORY AltoDevice USING [Bitmap], AltoDisplay USING [DCBHandle, LongDCB, DCBchainHead, DCBnil, LongDCBSeal, MaxWordsPerLine, MaxScanLines], Blt USING [longPointers, Handle, New, SetX, SetY, Rect, Free], FrameDefs USING [IsBound], InlineDefs USING [LowHalf], SegmentDefs USING [NewDataSegment, LongDataSegmentAddress, DefaultXMBase, DefaultMDSBase], SystemDefs USING [Even, PagesForWords]; AltoScreenImpl: PROGRAM IMPORTS Blt, FrameDefs, InlineDefs,SegmentDefs, SystemDefs EXPORTS AltoDevice = { Bitmap: TYPE = AltoDevice.Bitmap; dcbsp: ARRAY [0..SIZE[AltoDisplay.LongDCB]] OF WORD; dcb: AltoDisplay.DCBHandle_SystemDefs.Even[@dcbsp]; screenBitmap: Bitmap _ [NIL,0,0]; screenx,screeny: CARDINAL_0; ScreenBitmap: PUBLIC PROCEDURE RETURNS[Bitmap] = { IF screenBitmap.base=NIL THEN InitScreen[]; RETURN[screenBitmap]; }; InitScreen: PROCEDURE = { OPEN SegmentDefs,AltoDisplay; pnext: POINTER TO DCBHandle_DCBchainHead; w,h,words: CARDINAL; UNTIL pnext^=NIL DO dcb: DCBHandle=pnext^; screeny_screeny+2*dcb.height; pnext_@dcb.next ENDLOOP; w_MaxWordsPerLine; h_MaxScanLines-screeny; screenBitmap _ [ base: LongDataSegmentAddress[NewDataSegment[ base: IF Blt.longPointers THEN DefaultXMBase ELSE DefaultMDSBase, pages: SystemDefs.PagesForWords[words_w*h]]], raster: w, height: h ]; ClearBitmap[screenBitmap]; IF Blt.longPointers THEN { ldcb: POINTER TO LongDCB=LOOPHOLE[dcb]; ldcb^_[next: DCBnil, resolution: high, background: white, indenting: 0, width: w, height: h/2, tag: long, bitmap: LongDCBSeal, longBitmap: screenBitmap.base]; } ELSE dcb^_[next: DCBnil, resolution: high, background: white, indenting: 0, width: w, height: h/2, bitmap: InlineDefs.LowHalf[screenBitmap.base]]; pnext^_dcb; }; ClearBitmap: PROCEDURE[b: Bitmap] = { blt: Blt.Handle_Blt.New[b.base,b.raster]; Blt.SetX[blt,0,16*b.raster]; Blt.SetY[blt,0,b.height]; blt.grays[0]_125252B; blt.grays[1]_52525B; blt.grays[2]_125252B; blt.grays[3]_52525B; Blt.Rect[blt]; Blt.Free[@blt]; }; ScreenOrigin: PUBLIC PROCEDURE RETURNS[x,y: CARDINAL] = { RETURN[x: screenx, y: screeny] }; }.(670)