-- File: DiagnosticsImplI.mesa - last edit by: -- Paul 13-Jul-84 11:06:54 DIRECTORY DiagnosticsOps USING [PlotterType], GreenFace USING [ Command, ForceWakeups, GetAndResetStatus, GetStatus, LogCommand, LogStatus, PutCommand, SendPage, Status], Inline USING [LongCOPY], Msg USING [FeedBack], Process USING [Detach, Pause, MsecToTicks, SetTimeout], Space USING [PageFromLongPointer, ScratchMap], UserTerminal USING [GetBitBltTable], VM USING [Interval, MakeResident, MakeSwappable]; DiagnosticsImplI: MONITOR IMPORTS GreenFace, Inline, Msg, Process, Space, UserTerminal, VM EXPORTS DiagnosticsOps = BEGIN DataType: TYPE = {nthBit, count, ff00, ascii}; Enumerated: TYPE = RECORD [string: LONG STRING, value: UNSPECIFIED]; -- Variable declarations cmd: GreenFace.Command ← reset; bitStep: CARDINAL ← 1; dataType: DataType ← ff00; bufferPages: CARDINAL = 2; buffer: LONG POINTER = Space.ScratchMap[bufferPages]; vi: VM.Interval = [page: Space.PageFromLongPointer[buffer], count: bufferPages]; greenStarStatus: GreenFace.Status; GetStatus: PUBLIC PROCEDURE [plotter: DiagnosticsOps.PlotterType] RETURNS [GreenFace.Status] = {RETURN[greenStarStatus]}; SendCommand: PUBLIC PROCEDURE [ plotter: DiagnosticsOps.PlotterType, cmd: GreenFace.Command] = {SendCmd[cmd]}; PrintPattern: PUBLIC PROCEDURE [plotter: DiagnosticsOps.PlotterType] = { dataType ← ascii; SendVideo[];}; PlotPattern: PUBLIC PROCEDURE [plotter: DiagnosticsOps.PlotterType] = { dataType ← count; SendVideo[];}; PlotScreen: PUBLIC PROCEDURE [plotter: DiagnosticsOps.PlotterType] = { pID: PROCESS; Msg.FeedBack[s: "Plot invoked"L, severity: info, endWithCR: TRUE]; VM.MakeResident[vi, wait]; pID ← FORK PlotPage[plotter]; JOIN pID; VM.MakeSwappable[vi]}; PlotPage: PROCEDURE [plotter: DiagnosticsOps.PlotterType] = { screenData: LONG POINTER TO PACKED ARRAY [0..1024) OF BOOLEAN ← UserTerminal.GetBitBltTable[].src.word; Pixel: TYPE = MACHINE DEPENDENT{white(0), black(3)}; printData: LONG POINTER TO PACKED ARRAY OF Pixel = buffer; word: CARDINAL ← 0; SendCmd[reset]; Pause[1000]; AssertStatus[plotterready]; SendCmd[plot]; Zero[buffer, 512]; SendCmd[rlter]; AssertStatus[plotterready]; Msg.FeedBack[s: "screen contents..."L, severity: info, endWithCR: TRUE]; Pause[1000]; FOR k: CARDINAL IN [0..808) DO --808 visible display lines offset: CARDINAL = word * 8; FOR i: CARDINAL IN [0..1024) DO dataOffset: CARDINAL = offset + i; IF screenData[i] THEN printData[dataOffset] ← printData[dataOffset + 1056] ← black ELSE printData[dataOffset] ← printData[dataOffset + 1056] ← white; ENDLOOP; word ← word + 8; --if word = 256 then send both pages and reset word to 0 -- send a buffer GreenFace.SendPage[buffer]; IF word = 256 THEN {GreenFace.SendPage[buffer + 256]; word ← 0}; Inline.LongCOPY[from: buffer + 256, nwords: word, to: buffer]; Zero[buffer + word + 128, 4]; Zero[buffer + word + 260, 4]; screenData ← screenData + 64; ENDLOOP; SendCmd[rffed]; AssertStatus[plotterready]}; Pause: PROCEDURE [msec: CARDINAL] = {Process.Pause[Process.MsecToTicks[msec]]}; AssertStatus: PROCEDURE [expectedStatus: GreenFace.Status] = { Pause[1000]; SendCmd[sensestatus]; Pause[1000]; [] ← GreenFace.GetAndResetStatus[]; IF expectedStatus = greenStarStatus THEN RETURN; -- ok Text["Bad status -- expected "L]; GreenFace.LogStatus[expectedStatus, Text]; Text[", got "L]; GreenFace.LogStatus[greenStarStatus, Line]}; Statusproc: ENTRY PROCEDURE = { cv: CONDITION; Process.SetTimeout[@cv, 1]; Text["Status = "L]; GreenFace.LogStatus[greenStarStatus, Line]; DO status: GreenFace.Status = GreenFace.GetStatus[]; IF status = null OR status = greenStarStatus THEN {WAIT cv; LOOP}; Text["Status = "L]; GreenFace.LogStatus[greenStarStatus ← status, Line]; ENDLOOP}; DoWakeup: PROCEDURE = {GreenFace.ForceWakeups[]}; SendVideo: PROCEDURE = { bitArray: LONG POINTER TO PACKED ARRAY [0..4096) OF BOOLEAN = buffer; byteArray: LONG POINTER TO PACKED ARRAY [0..512) OF [0..256) = buffer; VM.MakeResident[vi, wait]; Text["Sending... "L]; SELECT dataType FROM count => { FOR j: CARDINAL IN [0..512) DO byteArray[j] ← (j + 1) MOD 256 ENDLOOP; Line["1, 2, ... FF, 0, 1, 2, ... FF, 0"L]}; ascii => { FOR j: CARDINAL IN [0..512) DO i: CARDINAL = j MOD 28; byteArray[j] ← SELECT i FROM 26 => 13, -- CR 27 => 10, -- LF ENDCASE => LOOPHOLE['A, CARDINAL] + i; -- A ... Z ENDLOOP; Line["A, B, C, ... Z, CR, LF, A, B, ..."L]}; ff00 => { FOR j: CARDINAL IN [0..512) DO byteArray[j] ← IF j MOD 2 = 0 THEN 255 ELSE 0 ENDLOOP; Line["FF, 00, FF, 00, ..."L]}; nthBit => {FOR j: CARDINAL IN [0..512) DO byteArray[j] ← 142b ENDLOOP}; ENDCASE => Line["BAD ENUMERATED VALUE!!!"L]; GreenFace.SendPage[buffer]; VM.MakeSwappable[vi]}; SendCmd: PROCEDURE [cmd: GreenFace.Command] = { Text["Command = "L]; IF cmd = null THEN {Line["0; not sent!"L]; RETURN}; GreenFace.PutCommand[cmd]; GreenFace.LogCommand[cmd, Line] --effective 500 milli pause-- }; Zero: PROC [lp: LONG POINTER, count: CARDINAL] = { lp↑ ← 0; Inline.LongCOPY[from: lp, nwords: count - 1, to: lp + 1]}; Text: PROC [s: LONG STRING] = { Msg.FeedBack[s: s, severity: info, endWithCR: FALSE]}; Line: PROC [s: LONG STRING] = { Msg.FeedBack[s: s, severity: info, endWithCR: TRUE]}; -- Tool routines PrintInit: PROCEDURE = { pID: PROCESS; pID ← FORK WakeUpGreenStar[]; JOIN pID;}; WakeUpGreenStar: PROCEDURE = { SendCmd[reset]; Pause[4000]; greenStarStatus ← GreenFace.GetAndResetStatus[]; Pause[1000]; SendCmd[rffed]}; Init: PROCEDURE = { PrintInit[]; Process.Detach[FORK Statusproc[]]}; END.