-- MicroSample.mesa GMcD December 3, 1980 3:04 PM -- This module implents MicroSampleDefs.Mesa. Basically, it provides a Mesa interface to the microcode Pc-sampling feature of the Dorado. This module does not provide analysis facilities. DIRECTORY BcplOps USING[ CleanupReason], ImageDefs USING[AddCleanupProcedure, CleanupItem, CleanupProcedure, RemoveCleanupProcedure], -- InlineDefs USING[LongCOPY], MicroSampleDefs USING[setMicroPcSampling, sizeMicroPcData, tlprMicroPcData], SegmentDefs USING [DataSegmentHandle, DefaultXMBase, DeleteDataSegment, GetMemoryConfig, LongSegmentAddress, NewDataSegment], StreamDefs USING [Append, NewWordStream, StreamHandle, Write] ; microsample: PROGRAM IMPORTS ImageDefs, --InlineDefs,-- ms: MicroSampleDefs, seg: SegmentDefs, strm: StreamDefs EXPORTS MicroSampleDefs = BEGIN lpHistData: PUBLIC ms.tlprMicroPcData← NIL; dsh: seg.DataSegmentHandle; cleanup: ImageDefs.CleanupItem; notRunningOnDorado: PUBLIC SIGNAL=CODE; noAllocatedMicroPcBuffer: PUBLIC SIGNAL=CODE; startMicroSampling: PUBLIC PROCEDURE= BEGIN IF ~ onDorado[] THEN SIGNAL notRunningOnDorado; dsh← seg.NewDataSegment[seg.DefaultXMBase, (ms.sizeMicroPcData+255)/256]; lpHistData← seg.LongSegmentAddress[dsh]; longZero[lpHistData, ms.sizeMicroPcData]; cleanup.proc← cleanupMicroPc; cleanup.mask← 177777B; ImageDefs.AddCleanupProcedure[@cleanup]; ms.setMicroPcSampling[lpHistData]; END; saveMicroSamples: PUBLIC PROCEDURE= BEGIN saveMicroSamplesOnFile["MicroSamples.Counts"]; END; saveMicroSamplesOnFile: PUBLIC PROCEDURE[n: STRING]= BEGIN s: StreamDefs.StreamHandle; s← strm.NewWordStream[n, strm.Write+strm.Append]; FOR i: CARDINAL IN [0..ms.sizeMicroPcData) DO s.put[s, LOOPHOLE[(lpHistData+i), LONG POINTER TO WORD]↑]; ENDLOOP; s.destroy[s]; END; stopMicroSampling: PUBLIC PROCEDURE= BEGIN ms.setMicroPcSampling[NIL]; ImageDefs.RemoveCleanupProcedure[@cleanup]; IF dsh#NIL THEN { seg.DeleteDataSegment[dsh]; dsh← NIL; }; lpHistData← NIL; END; pauseMicroSampling: PUBLIC PROCEDURE= BEGIN IF ~ onDorado[] THEN SIGNAL notRunningOnDorado; ms.setMicroPcSampling[NIL]; ImageDefs.RemoveCleanupProcedure[@cleanup] END; resumeMicroSampling: PUBLIC PROCEDURE= BEGIN IF ~ onDorado[] THEN SIGNAL notRunningOnDorado; IF lpHistData#NIL THEN {ImageDefs.AddCleanupProcedure[@cleanup]; ms.setMicroPcSampling[lpHistData]} ELSE SIGNAL noAllocatedMicroPcBuffer; END; resetMicroPcData: PUBLIC PROCEDURE= BEGIN IF lpHistData=NIL THEN SIGNAL noAllocatedMicroPcBuffer ELSE longZero[lpHistData, ms.sizeMicroPcData]; END; onDorado: PUBLIC PROCEDURE RETURNS[BOOLEAN]= BEGIN RETURN [seg.GetMemoryConfig[].AltoType=Dorado]; END; longZero: PUBLIC PROCEDURE[lp: LONG POINTER, count: CARDINAL]= BEGIN IF lp=NIL THEN ERROR; lp↑←0; FOR i: CARDINAL IN [0..count] DO LOOPHOLE[lp+i, LONG POINTER]↑← 0; ENDLOOP; -- InlineDefs.LongCOPY[from: lp, to: lp+1, nwords: count-1]; END; cleanupMicroPc: ImageDefs.CleanupProcedure= BEGIN SELECT why FROM InLd,Restart,Continue => IF lpHistData#NIL THEN ms.setMicroPcSampling[lpHistData] ELSE SIGNAL noAllocatedMicroPcBuffer; ENDCASE=> ms.setMicroPcSampling[NIL]; END; END.