-- Em3270StatusPack
-- Status window display for 3270 emulator

-- Last edit by:	Caro	25-May-84 16:22:07
-- Owner: Lui


DIRECTORY
  AreaDefs USING [Area, Ht, Posn, posnNil, Rt],
  DispDefs USING [
    Bm, DisplayLine, EraseRectangle, IsPosnVisibleInWn, OrBitmapInRectangle, Ptbm],
  Em3270Defs USING [Lpttrt3270schemadata],
  Em3270PrivDefs USING [EmHandle, Statusdata, wthBorder],
  Em3270StatusDefs USING [Accent, Code],
  FeatureDefs USING [features],
  Heap USING [Create],
  RgnDefs USING [Sc, Srt],
  SchemaDefs USING [Aqschrt, Lschema, Posn, Schrt],
  SchemaUtilDefs USING [RtFromRelrt],
  StandardDefs USING [Bv, Ct, Cv, Ix, Lpt],
  TraitDefs USING [MyData],
  TreeEltDefs USING [AncestorOfType],
  UtilDefs USING [bvDebug],
  ZoneMgrDefs USING [GetPredefinedMDSZone, GetPredefinedZone];

Em3270StatusPack: MONITOR
  IMPORTS DispDefs, FeatureDefs, Heap, SchemaDefs, SchemaUtilDefs, TraitDefs,
    TreeEltDefs, UtilDefs, ZoneMgrDefs
  EXPORTS Em3270StatusDefs, Em3270PrivDefs =
BEGIN
OPEN StandardDefs, SchemaDefs, Em3270StatusDefs;

-- ====================
-- PUBLIC DATA
-- ====================

htStatusArea: PUBLIC --READONLY-- Cv;

-- ====================
-- PUBLIC TYPES
-- ====================

Statusdata: PUBLIC TYPE = RECORD [ -- per-instance status area data, exported to PrivDefs
  srt: RgnDefs.Srt ← srtNil, -- the Srt we get at startup
  posn: Posn ← posnNil, -- posn of the 3270 lschema
  rgCodesOn: RgCodesOn ← ALL[FALSE], -- what codes are currently displayed
  accentSaved: Accent ← none -- current accent, saved for redisplay
  ];
LptStatusdata: --PUBLIC-- TYPE = LONG POINTER TO Statusdata;
  
-- ====================
-- PRIVATE TYPES
-- ====================

Aqbitmap: TYPE = ARRAY [0..16) OF WORD;
Bitmap: TYPE = LONG POINTER TO Aqbitmap;
Bm: TYPE = DispDefs.Bm;
Posn: TYPE = AreaDefs.Posn;
Ptbm: TYPE = DispDefs.Ptbm;
Rt: TYPE = AreaDefs.Rt;
RgCodesOn: TYPE = PACKED ARRAY Code OF Bv;
Hpos: TYPE = Cv [0..ctBitmapsPerRow);
Vpos: TYPE = Cv [0..ctRowsOfBitmaps);
Info: TYPE = RECORD [vpos: Vpos, hpos: Hpos, bitmap: Bitmap]; -- info on where & what bitmap
RgInfo: TYPE = LONG DESCRIPTOR FOR ARRAY Ix OF Info;
BugType: TYPE = {noAccent};

-- ====================
-- PRIVATE DATA
-- ====================

-- CONSTANTS

ctBitmapsPerRow: Ct = 32; -- do not change
ctRowsOfBitmaps: Ct = 2; -- do not change
htBitmap, wthBitmap: Cv = 16; -- do not change
wthBorder: Cv = Em3270PrivDefs.wthBorder; -- do not change
htBetweenVDTAndLine: Cv = 4;
thkLine: Cv = 4;
htTopMargin, htBottomMargin, htBetweenRowsOfBitmaps: Cv = 10;
srtNil: RgnDefs.Srt = [[0, 0], [0, 0]];
posnNil: AreaDefs.Posn = AreaDefs.posnNil;

-- GLOBAL VARIABLES

AqGlobals: TYPE = RECORD [
  rgAccents: ARRAY Accent OF Bitmap, -- accent bitmaps
  rgrgInfo: ARRAY Code OF RgInfo, -- rgrgInfo[code] describes the status bits for code
  bmSpace, bmX, bmBoxWithLine, bmBoxNoLine, bmLittleMan, bmLittleManInBox, bmLeftArrow,
    bmRightArrow, bmNumberSign, bmTallBlackBox, bmInvert4, bmInvert6, bmOnlineA, bmOnlineB,
    bmQuestionMark, bmQuestionInBox, bmClock, bmFlashLH, bmFlashRH, bmPlus, bmMinus,
    bmHorLine, bmKey, bmUparrow, bmChevron, bmT, bmE, bmS, bmY, bmM, bmP, bmR, bmO, bmG,
    bmf, bmN, bmU, bmGtr, bmBoxWithHorLine, bmBlackBox, bmBlackBoxWithLine,
    bmUnderbar: Bitmap];
    
globals: LONG POINTER TO AqGlobals ← NIL; 
zPerm, zSess: UNCOUNTED ZONE ← NIL;
zMDS: MDSZone ← NIL;

Bug: SIGNAL[msg: BugType] = CODE;

  
-- ====================
-- PUBLIC PROCEDURES
-- ====================

InitInstance: PUBLIC ENTRY PROC RETURNS [LptStatusdata] =
  BEGIN ENABLE UNWIND => NULL;
  lptstatusdata: LptStatusdata ← zSess.NEW[Statusdata];
  RETURN[lptstatusdata];
  END;

-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

DestroyInstance: PUBLIC ENTRY PROC [lptstatusdata: LptStatusdata] =
  BEGIN ENABLE UNWIND => NULL;
  zSess.FREE[@lptstatusdata];
  END;

-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

SetSrt: PUBLIC ENTRY PROC [lschema: SchemaDefs.Lschema, srt: RgnDefs.Srt] =
  BEGIN ENABLE UNWIND => NULL;
  lptstatusdata: LptStatusdata ← InstanceData[lschema];
  lptstatusdata.srt ← srt;
  END;

-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

DisplayCode: PUBLIC ENTRY PROC [
  lschema: Lschema, code: Code, bvOn: Bv ← TRUE, accent: Accent ← none] =
BEGIN ENABLE UNWIND => NULL;
  DisplayCodeInternal[lschema, code, bvOn, accent];
  END; -- DisplayCode
  
DisplayCodeInternal: INTERNAL PROC [
  lschema: Lschema, code: Code, bvOn: Bv ← TRUE, accent: Accent ← none] =
BEGIN
  ctbm: Ct;
  rginfo: RgInfo;
  rtBase, rt: Rt;
  lptstatusdata: LptStatusdata ← InstanceData[lschema];
  IF code = accentPlusWhat THEN {
    IF bvOn AND (accent = none) THEN {
      IF UtilDefs.bvDebug THEN SIGNAL Bug[noAccent];
      accent ← acute};
    IF bvOn THEN lptstatusdata↑.accentSaved ← accent};
  rginfo ← globals.rgrgInfo[code];
  rtBase ← Rtstatusarea[lschema, TRUE];
  ctbm ← LENGTH[rginfo];
  FOR ix: Ix IN [0..ctbm) DO
    rt.posn.area ← rtBase.posn.area;
    rt.posn.xc ← rtBase.posn.xc + wthBorder + wthBitmap*rginfo[ix].hpos;
    rt.posn.yc ← rtBase.posn.yc + htBetweenVDTAndLine + thkLine + htTopMargin +
      (htBitmap+htBetweenRowsOfBitmaps)*(rginfo[ix].vpos);
    rt.rs ← [wth: 16, ht: 16];
    DispDefs.EraseRectangle[rt];
    IF bvOn THEN {
--$      ptbm: Ptbm ← PtbmFromBitmap[rginfo[ix].bitmap];
--$      DispDefs.OrBitmapInRectangle[rt, ptbm];
--$      DestroyPtbm[ptbm]};
      bm: DispDefs.Bm ← [lpt: rginfo[ix].bitmap, cvWpl: 1];
      DispDefs.OrBitmapInRectangle[rt, @bm];};
    ENDLOOP;
  IF code = accentPlusWhat THEN { -- add the accent
    rt.posn.xc ← rtBase.posn.xc + wthBorder + wthBitmap*8; -- don't change this 8
    rt.posn.yc ← rtBase.posn.yc + htBetweenVDTAndLine + thkLine + htTopMargin;
    DispDefs.EraseRectangle[rt];
    IF bvOn THEN {
--$       ptbm: Ptbm ← PtbmFromBitmap[globals.rgAccents[accent]];
--$       DispDefs.OrBitmapInRectangle[rt, ptbm];
--$       DestroyPtbm[ptbm]}};
      bm: DispDefs.Bm ← [lpt: globals.rgAccents[accent], cvWpl: 1];
      DispDefs.OrBitmapInRectangle[rt, @bm];}};

  lptstatusdata↑.rgCodesOn[code] ← bvOn;
END; -- DisplayCodeInternal

-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

ClearStatusArea: PUBLIC ENTRY PROC [lschema: Lschema] =
BEGIN ENABLE UNWIND => NULL;
  lptstatusdata: LptStatusdata ← InstanceData[lschema];
  amtDontErase: NATURAL ← htBetweenVDTAndLine + thkLine + htTopMargin;
  rt: Rt ← Rtstatusarea[lschema, TRUE];
  rt.posn.yc ← rt.posn.yc + amtDontErase; -- don't erase line
  rt.rs.ht ← rt.rs.ht - amtDontErase;
  DispDefs.EraseRectangle[rt];
lptstatusdata.rgCodesOn ← ALL[FALSE];
END; -- ClearStatusArea

-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

RepaintStatusArea: PUBLIC ENTRY PROC [lschema: Lschema, schrt: Schrt] =
BEGIN ENABLE UNWIND => NULL;
  -- note we are ignoring schrt, sigh
  lptstatusdata: LptStatusdata ← InstanceData[lschema];
  rt: Rt;
  posnStart, posnEnd: Posn;
  -- Erase old status area if on screen:
  lschemawn: Lschema ← TreeEltDefs.AncestorOfType[lschema, trtstdwnschema];
  IF DispDefs.IsPosnVisibleInWn[lschemawn, lptstatusdata.posn] THEN
    DispDefs.EraseRectangle[Rtstatusarea[lschema, FALSE]];
  DispDefs.EraseRectangle[rt ← Rtstatusarea[lschema, TRUE]]; -- erase the whole shebang
  posnStart ← [rt.posn.xc + wthBorder, rt.posn.yc + htBetweenVDTAndLine, rt.posn.area];
  posnEnd ← [rt.posn.xc + rt.rs.wth, rt.posn.yc + htBetweenVDTAndLine, rt.posn.area];
  DispDefs.DisplayLine[posnStart, posnEnd, thkLine, black];
  FOR code: Code IN [Ready3276..accentPlusWhat) DO
    IF lptstatusdata.rgCodesOn[code] THEN DisplayCodeInternal[lschema, code, TRUE];
    ENDLOOP;
  IF lptstatusdata.rgCodesOn[accentPlusWhat]
    THEN DisplayCodeInternal[lschema, accentPlusWhat, TRUE, lptstatusdata.accentSaved];
END; -- RepaintStatusArea

-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-- ====================
-- PRIVATE PROCEDURES
-- ====================

InstanceData: INTERNAL PROC [lschema: Lschema] RETURNS [LptStatusdata] =
  BEGIN
  data: LONG POINTER TO Em3270PrivDefs.EmHandle;
  my: Em3270Defs.Lpttrt3270schemadata ← TraitDefs.MyData[lschema, trt3270schema];
  data ← my↑.lptEmState;
  RETURN[data.status];
  END;

-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Rtstatusarea: INTERNAL PROC [lschema: Lschema, bvUpdate: Bv] RETURNS [rt: Rt] =
BEGIN
  lptstatusdata: LptStatusdata ← InstanceData[lschema];
  posn: Posn ← IF bvUpdate -- bvUpdate => get new Posn for lschema
    THEN (lptstatusdata↑.posn ← SchemaDefs.Posn[lschema])
    ELSE lptstatusdata.posn;
  -- Add our stored srt to the current or stored posn of the schema
  -- RtFromRelrt wants a SHORT pointer to a Posn and a LONG pointer to a Srt!  How bogus!
  rt ← SchemaUtilDefs.RtFromRelrt[@posn, @lptstatusdata.srt];
END; -- Rtstatusarea

-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

PtbmFromBitmap: PROC [bitmap: Bitmap] RETURNS [ptbm: Ptbm] = INLINE
BEGIN
  ptbm ← zMDS.NEW[Bm ← [lpt: bitmap, cvWpl: 1]];
END; -- BmFromBitmap

-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

DestroyPtbm: PROC [ptbm: Ptbm] = INLINE
BEGIN
  zMDS.FREE[@ptbm];
END;

-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

InitBitmaps: PROC =
BEGIN OPEN globals↑;
  bmSpace ← zPerm.NEW[Aqbitmap ← ALL[0]];
  bmX ← zPerm.NEW[Aqbitmap ← [100010B, 140030B, 160070B, 170170B, 74360B, 36740B, 17700B, 7600B, 7600B, 17700B, 36740B, 74360B, 170170B, 160070B, 140030B, 100010B]];
  bmBoxWithLine ← zPerm.NEW[Aqbitmap ← [100000B, 140000B, 160000B, 70000B, 34000B, 177774B, 107004B, 103404B, 101604B, 100704B, 177774B, 160B, 70B, 34B, 14B, 4]];
  bmBoxNoLine ← zPerm.NEW[Aqbitmap ← [0, 0, 0, 0, 0, 177774B, 100004B, 100004B, 100004B, 100004B, 177774B, 0, 0, 0, 0, 0]];
  bmLittleMan ← zPerm.NEW[Aqbitmap ← [0, 7400B, 4400B, 4400B, 7400B, 3000B, 3000B, 177760B, 3000B, 3000B, 3000B, 7400B, 14600B, 30300B, 60140B, 140060B]];
  bmLittleManInBox ← zPerm.NEW[Aqbitmap ← [177760B, 107420B, 104420B, 104420B, 107420B, 103020B, 103020B, 177760B, 103020B, 103020B, 103020B, 107420B, 114620B, 130320B, 160160B, 177760B]];
  bmLeftArrow ← zPerm.NEW[Aqbitmap ← [0, 0, 0, 400B, 1400B, 3400B, 7776B, 7776B, 3400B, 1400B, 400B, 0, 0, 0, 0, 0]];
  bmRightArrow ← zPerm.NEW[Aqbitmap ← [0, 0, 0, 200B, 300B, 340B, 77760B, 77760B, 340B, 300B, 200B, 0, 0, 0, 0, 0]];
  bmNumberSign ← zPerm.NEW[Aqbitmap ← [0, 0, 31400B, 31400B, 177700B, 177700B, 31400B, 31400B, 177700B, 177700B, 31400B, 31400B, 0, 0, 0, 0]];
  bmTallBlackBox ← zPerm.NEW[Aqbitmap ← [0, 77700B, 77700B, 77700B, 77700B, 77700B, 77700B, 77700B, 77700B, 77700B, 77700B, 77700B, 77700B, 0, 0, 0]];
  bmInvert4 ← zPerm.NEW[Aqbitmap ← [177760B, 177760B, 177760B, 176360B, 175360B, 173360B, 167360B, 160160B, 177360B, 177360B, 177360B, 177360B, 177760B, 177760B, 0, 0]];
  bmInvert6 ← zPerm.NEW[Aqbitmap ← [177760B, 177760B, 170360B, 167560B, 167760B, 167760B, 160360B, 167560B, 167560B, 167560B, 170360B, 177760B, 177760B, 177760B, 0, 0]];
  bmOnlineA ← zPerm.NEW[Aqbitmap ← [600B, 600B, 1700B, 1100B, 3140B, 2040B, 7760B, 4020B, 14030B, 10010B, 10010B, 0, 0, 77776B, 77776B, 0]];
  bmOnlineB ← zPerm.NEW[Aqbitmap ← [0, 7700B, 4040B, 4040B, 4040B, 7700B, 4040B, 4040B, 4040B, 4040B, 7700B, 0, 0, 77776B, 77776B, 0]];
  bmQuestionMark ← zPerm.NEW[Aqbitmap ← [0, 0, 3700B, 4040B, 4040B, 4040B, 100B, 200B, 400B, 400B, 400B, 0, 400B, 400B, 0, 0]];
  bmQuestionInBox ← zPerm.NEW[Aqbitmap ← [77774B, 40004B, 43704B, 44044B, 44044B, 44044B, 40104B, 40204B, 40404B, 40404B, 40404B, 40004B, 40404B, 40404B, 40004B, 77774B]];
  bmClock ← zPerm.NEW[Aqbitmap ← [600B, 14630B, 14030B, 0, 60146B, 60346B, 700B, 140603B, 140603B, 600B, 60606B, 60606B, 600B, 14030B, 14630B, 600B]];
  bmFlashLH ← zPerm.NEW[Aqbitmap ← [0, 0, 0, 10000B, 14000B, 6000B, 3000B, 77777B, 601B, 302B, 144B, 57B, 0, 0, 0, 0]];
  bmFlashRH ← zPerm.NEW[Aqbitmap ← [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 177600B, 0, 0, 0, 0]];
  bmPlus ← zPerm.NEW[Aqbitmap ← [0, 0, 400B, 400B, 400B, 400B, 400B, 37770B, 400B, 400B, 400B, 400B, 400B, 0, 0, 0]];
  bmMinus ← zPerm.NEW[Aqbitmap ← [0, 0, 0, 0, 0, 0, 0, 3770B, 0, 0, 0, 0, 0, 0, 0, 0]];
  bmHorLine ← zPerm.NEW[Aqbitmap ← [0, 0, 0, 0, 0, 0, 0, 177777B, 0, 0, 0, 0, 0, 0, 0, 0]];
  bmKey ← zPerm.NEW[Aqbitmap ← [0, 0, 0, 0, 34000B, 42000B, 43774B, 42164B, 34164B, 4, 0, 0, 0, 0, 0, 0]];
  bmUparrow ← zPerm.NEW[Aqbitmap ← [0, 0, 400B, 1200B, 2100B, 4040B, 10020B, 16160B, 2100B, 2100B, 2100B, 2100B, 2100B, 3700B, 0, 0]];
  bmChevron ← zPerm.NEW[Aqbitmap ← [0, 0, 400B, 1600B, 3700B, 7340B, 16160B, 14060B, 10020B, 0, 0, 0, 0, 0, 0, 0]];
  bmT ← zPerm.NEW[Aqbitmap ← [0, 0, 77700B, 2000B, 2000B, 2000B, 2000B, 2000B, 2000B, 2000B, 2000B, 2000B, 2000B, 0, 0, 0]];
  bmE ← zPerm.NEW[Aqbitmap ← [0, 0, 77600B, 40000B, 40000B, 40000B, 40000B, 77000B, 40000B, 40000B, 40000B, 40000B, 77600B, 0, 0, 0]];
  bmS ← zPerm.NEW[Aqbitmap ← [0, 0, 37400B, 40200B, 40000B, 20000B, 14000B, 3000B, 400B, 200B, 200B, 40200B, 37400B, 0, 0, 0]];
  bmY ← zPerm.NEW[Aqbitmap ← [0, 0, 40100B, 20200B, 10400B, 5000B, 2000B, 2000B, 2000B, 2000B, 2000B, 2000B, 2000B, 0, 0, 0]];
  bmM ← zPerm.NEW[Aqbitmap ← [0, 0, 40100B, 60300B, 50500B, 45100B, 42100B, 42100B, 40100B, 40100B, 40100B, 40100B, 40100B, 0, 0, 0]];
  bmP ← zPerm.NEW[Aqbitmap ← [0, 0, 76000B, 41000B, 40400B, 40400B, 40400B, 41000B, 76000B, 40000B, 40000B, 40000B, 40000B, 0, 0, 0]];
  bmR ← zPerm.NEW[Aqbitmap ← [0, 0, 76000B, 41000B, 40400B, 40400B, 41400B, 76000B, 50000B, 44000B, 42000B, 41000B, 40400B, 0, 0, 0]];
  bmO ← zPerm.NEW[Aqbitmap ← [0, 0, 17400B, 20200B, 40100B, 40100B, 40100B, 40100B, 40100B, 40100B, 40100B, 20200B, 17400B, 0, 0, 0]];
  bmG ← zPerm.NEW[Aqbitmap ← [0, 0, 17400B, 20200B, 40000B, 40000B, 40000B, 40000B, 41700B, 40200B, 40200B, 20200B, 17400B, 0, 0, 0]];
  bmf ← zPerm.NEW[Aqbitmap ← [0, 7000B, 10400B, 10400B, 10000B, 76000B, 10000B, 10000B, 10000B, 10000B, 10000B, 10000B, 10000B, 0, 0, 0]];
  bmN ← zPerm.NEW[Aqbitmap ← [0, 0, 40100B, 60100B, 50100B, 44100B, 42100B, 41100B, 40500B, 40300B, 40100B, 40100B, 40100B, 0, 0, 0]];
  bmU ← zPerm.NEW[Aqbitmap ← [0, 0, 20200B, 20200B, 20200B, 20200B, 20200B, 20200B, 20200B, 20200B, 20200B, 20200B, 17400B, 0, 0, 0]];
  bmGtr ← zPerm.NEW[Aqbitmap ← [0, 0, 40000B, 60000B, 30000B, 14000B, 6000B, 3000B, 3000B, 6000B, 14000B, 30000B, 60000B, 40000B, 0, 0]];
  bmBoxWithHorLine ← zPerm.NEW[Aqbitmap ← [0, 0, 0, 0, 0, 177774B, 100004B, 100004B, 177774B, 100004B, 100004B, 177774B, 0, 0, 0, 0]];
  bmBlackBox ← zPerm.NEW[Aqbitmap ← [0, 0, 0, 0, 0, 177774B, 177774B, 177774B, 177774B, 177774B, 177774B, 0, 0, 0, 0, 0]];
  bmBlackBoxWithLine ← zPerm.NEW[Aqbitmap ← [100000B, 140000B, 160000B, 70000B, 34000B, 177774B, 177774B, 177774B, 177774B, 177774B, 177774B, 160B, 70B, 34B, 14B, 4]];
  bmUnderbar ← zPerm.NEW[Aqbitmap ← [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37774B]];
  
  rgAccents[acute] ← zPerm.NEW[Aqbitmap ← [0, 400B, 1000B, 2000B, 4000B, 10000B, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]];
  rgAccents[grave] ← zPerm.NEW[Aqbitmap ←[0, 10000B, 4000B, 2000B, 1000B, 400B, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]];
  rgAccents[circumflex] ← zPerm.NEW[Aqbitmap ← [0, 2000B, 5000B, 10400B, 20200B, 40100B, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]];
  rgAccents[umlaut] ← zPerm.NEW[Aqbitmap ← [0, 0, 14300B, 14300B, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]];
  rgAccents[cedilla] ← zPerm.NEW[Aqbitmap ← [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1000B, 1000B, 1000B, 400B, 4200B, 3400B]];
  rgAccents[none] ← bmSpace;
END; -- InitBitmaps

-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

InitRgrginfo: PROC =
BEGIN OPEN globals↑;
   lpt: Lpt;
   lpt ← zPerm.NEW[ARRAY [0..1) OF Info ← [[0, 0, bmInvert6]]];
   rgrgInfo[Ready3276] ← DESCRIPTOR[lpt, 1];
   lpt ← zPerm.NEW[ARRAY [0..1) OF Info ← [[0, 0, bmInvert4]]];
   rgrgInfo[Ready3274] ← DESCRIPTOR[lpt, 1];
   lpt ← zPerm.NEW[ARRAY [0..1) OF Info ← [[1, 0, bmOnlineA]]];
   rgrgInfo[onlineA] ← DESCRIPTOR[lpt, 1];
   lpt ← zPerm.NEW[ARRAY [0..1) OF Info ← [[1, 0, bmOnlineB]]];
   rgrgInfo[onlineB] ← DESCRIPTOR[lpt, 1];
   lpt ← zPerm.NEW[ARRAY [0..1) OF Info ← [[0, 1, bmTallBlackBox]]];
   rgrgInfo[myJob] ← DESCRIPTOR[lpt, 1];
   lpt ← zPerm.NEW[ARRAY [0..1) OF Info ← [[1, 1, bmLittleManInBox]]];
   rgrgInfo[systemOperator] ← DESCRIPTOR[lpt, 1];
   lpt ← zPerm.NEW[ARRAY [0..1) OF Info ← [[0, 1, bmQuestionInBox]]];
   rgrgInfo[unowned] ← DESCRIPTOR[lpt, 1];
   lpt ← zPerm.NEW[ARRAY [0..4) OF Info ← [[0, 1, bmT], [0, 2, bmE], [0, 3, bmS], [0, 4, bmT]]];
   rgrgInfo[test] ← DESCRIPTOR[lpt, 4];
   lpt ← zPerm.NEW[ARRAY [0..3) OF Info ← [[0, 5, bmX], [0, 6, bmSpace], [0, 7, bmClock]]];
   rgrgInfo[time] ← DESCRIPTOR[lpt, 3];
   lpt ← zPerm.NEW[ARRAY [0..8) OF Info ← [[1, 5, bmX], [1, 6, bmSpace], [1, 7, bmS], [1, 8, bmY], [1, 9, bmS], [1, 10, bmT], [1, 11, bmE], [1, 12, bmM]]];
   rgrgInfo[systemLock] ← DESCRIPTOR[lpt, 8];
   lpt ← zPerm.NEW[ARRAY [0..3) OF Info ← [[0, 5, bmX], [0, 6, bmSpace], [0, 7, bmBoxWithLine]]];
   rgrgInfo[machineCheck] ← DESCRIPTOR[lpt, 3];
   lpt ← zPerm.NEW[ARRAY [0..4) OF Info ← [[0, 5, bmX], [0, 6, bmSpace], [0, 7, bmFlashLH], [0, 8, bmFlashRH]]];
   rgrgInfo[communicationCheck] ← DESCRIPTOR[lpt, 4];
   lpt ← zPerm.NEW[ARRAY [0..6) OF Info ← [[0, 5, bmX], [0, 6, bmSpace], [0, 7, bmP], [0, 8, bmR], [0, 9, bmO], [0, 10, bmG]]];
   rgrgInfo[programCheck] ← DESCRIPTOR[lpt, 6];
   lpt ← zPerm.NEW[ARRAY [0..4) OF Info ← [[0, 5, bmX], [0, 6, bmSpace], [0, 7, bmQuestionMark], [0, 8, bmPlus]]];
   rgrgInfo[what] ← DESCRIPTOR[lpt, 4];
   lpt ← zPerm.NEW[ARRAY [0..4) OF Info ← [[0, 5, bmX], [0, 6, bmSpace], [0, 7, bmMinus], [0, 8, bmf]]];
   rgrgInfo[minusFunction] ← DESCRIPTOR[lpt, 4];
   lpt ← zPerm.NEW[ARRAY [0..3) OF Info ← [[0, 5, bmX], [0, 6, bmSpace], [0, 7, bmKey]]];
   rgrgInfo[securityKey] ← DESCRIPTOR[lpt, 3];
   lpt ← zPerm.NEW[ARRAY [0..5) OF Info ← [[0, 5, bmX], [0, 6, bmSpace], [0, 7, bmBoxNoLine], [0, 8, bmHorLine], [0, 9, bmBoxWithLine]]];
   rgrgInfo[printerNotWorking] ← DESCRIPTOR[lpt, 5];
   lpt ← zPerm.NEW[ARRAY [0..6) OF Info ← [[0, 5, bmX], [0, 6, bmSpace], [0, 7, bmBoxNoLine], [0, 8, bmHorLine], [0, 9, bmBoxNoLine], [0, 10, bmClock]]];
   rgrgInfo[printerBusy] ← DESCRIPTOR[lpt, 6];
   lpt ← zPerm.NEW[ARRAY [0..7) OF Info ← [[0, 5, bmX], [0, 6, bmSpace], [0, 7, bmBoxNoLine], [0, 8, bmHorLine], [0, 9, bmBoxNoLine], [0, 10, bmClock], [0, 11, bmClock]]];
   rgrgInfo[printerVeryBusy] ← DESCRIPTOR[lpt, 7];
   lpt ← zPerm.NEW[ARRAY [0..4) OF Info ← [[0, 5, bmX], [0, 6, bmSpace], [0, 7, bmLittleMan], [0, 8, bmX]]];
   rgrgInfo[operatorUnauthorized] ← DESCRIPTOR[lpt, 4];
   lpt ← zPerm.NEW[ARRAY [0..5) OF Info ← [[0, 5, bmX], [0, 6, bmSpace], [0, 7, bmLeftArrow], [0, 8, bmLittleMan], [0, 9, bmRightArrow]]];
   rgrgInfo[goElsewhere] ← DESCRIPTOR[lpt, 5];
   lpt ← zPerm.NEW[ARRAY [0..4) OF Info ← [[0, 5, bmX], [0, 6, bmSpace], [0, 7, bmLittleMan], [0, 8, bmGtr]]];
   rgrgInfo[moreThan] ← DESCRIPTOR[lpt, 4];
   lpt ← zPerm.NEW[ARRAY [0..6) OF Info ← [[0, 5, bmX], [0, 6, bmSpace], [0, 7, bmLittleMan], [0, 8, bmN], [0, 9, bmU], [0, 10, bmM]]];
   rgrgInfo[nonNumeric] ← DESCRIPTOR[lpt, 6];
   lpt ← zPerm.NEW[ARRAY [0..5) OF Info ← [[0, 5, bmX], [0, 6, bmSpace], [0, 7, bmLittleMan], [0, 8, bmNumberSign], [0, 9, bmQuestionMark]]];
   rgrgInfo[whatNumber] ← DESCRIPTOR[lpt, 5];
   lpt ← zPerm.NEW[ARRAY [0..5) OF Info ← [[0, 5, bmX], [0, 6, bmSpace], [0, 7, bmLittleMan], [0, 8, bmBoxWithHorLine], [0, 9, bmQuestionMark]]];
   rgrgInfo[questionableCard] ← DESCRIPTOR[lpt, 5];
   lpt ← zPerm.NEW[ARRAY [0..5) OF Info ← [[0, 5, bmX], [0, 6, bmSpace], [0, 7, bmLittleMan], [0, 9, bmPlus], [0, 10, bmQuestionMark]]]; -- locn 8 blank for accent
   rgrgInfo[accentPlusWhat] ← DESCRIPTOR[lpt, 5];
   lpt ← zPerm.NEW[ARRAY [0..4) OF Info ← [[0, 5, bmX], [0, 6, bmSpace], [0, 7, bmMinus], [0, 8, bmS]]];
   rgrgInfo[minusSymbol] ← DESCRIPTOR[lpt, 4];
   lpt ← zPerm.NEW[ARRAY [0..5) OF Info ← [[0, 5, bmX], [0, 6, bmSpace], [0, 7, bmBoxNoLine], [0, 8, bmLeftArrow], [0, 9, bmLittleMan]]];
   rgrgInfo[messageReceived] ← DESCRIPTOR[lpt, 5];
   lpt ← zPerm.NEW[ARRAY [0..2) OF Info ← [[1, 10, bmFlashLH], [1, 11, bmFlashRH]]];
   rgrgInfo[communicationReminder] ← DESCRIPTOR[lpt, 2];
   lpt ← zPerm.NEW[ARRAY [0..3) OF Info ← [[1, 10, bmBoxNoLine], [1, 11, bmLeftArrow], [1, 12, bmLittleMan]]];
   rgrgInfo[reserved] ← DESCRIPTOR[lpt, 3];
   lpt ← zPerm.NEW[ARRAY [0..3) OF Info ← [[0, 20, bmN], [0, 21, bmU], [0, 22, bmM]]];
   rgrgInfo[numeric] ← DESCRIPTOR[lpt, 3];
   lpt ← zPerm.NEW[ARRAY [0..1) OF Info ← [[0, 23, bmUparrow]]];
   rgrgInfo[upshift] ← DESCRIPTOR[lpt, 1];
   lpt ← zPerm.NEW[ARRAY [0..1) OF Info ← [[0, 24, bmChevron]]];
   rgrgInfo[insert] ← DESCRIPTOR[lpt, 1];
   lpt ← zPerm.NEW[ARRAY [0..3) OF Info ← [[1, 20, bmBoxNoLine], [1, 21, bmHorLine], [1, 22, bmBoxNoLine]]];
   rgrgInfo[printerAssignment] ← DESCRIPTOR[lpt, 3];
   lpt ← zPerm.NEW[ARRAY [0..5) OF Info ← [[1, 20, bmBoxNoLine], [1, 21, bmHorLine], [1, 22, bmBoxNoLine], [1, 23, bmQuestionMark], [1, 24, bmQuestionMark]]];
   rgrgInfo[whatPrinter] ← DESCRIPTOR[lpt, 5];
   lpt ← zPerm.NEW[ARRAY [0..3) OF Info ← [[1, 20, bmBoxNoLine], [1, 21, bmHorLine], [1, 22, bmBlackBox]]];
   rgrgInfo[printerPrinting] ← DESCRIPTOR[lpt, 3];
   lpt ← zPerm.NEW[ARRAY [0..3) OF Info ← [[1, 20, bmBoxNoLine], [1, 21, bmHorLine], [1, 22, bmBlackBoxWithLine]]];
   rgrgInfo[printerFailure] ← DESCRIPTOR[lpt, 3];
   lpt ← zPerm.NEW[ARRAY [0..5) OF Info ← [[1, 20, bmBoxNoLine], [1, 21, bmHorLine], [1, 22, bmBoxNoLine], [1, 23, bmUnderbar], [1, 24, bmUnderbar]]];
   rgrgInfo[assignPrinter] ← DESCRIPTOR[lpt, 5];
END; -- InitRgrginfo

-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Init: PROC =
  BEGIN
  -- set up exported variable even if 3270 disabled in case somebody uses it
  htStatusArea ← htBetweenVDTAndLine + thkLine + htTopMargin + htBitmap +
    htBetweenRowsOfBitmaps + htBitmap + htBottomMargin;
  -- only allocate storage if 3270 emulation is enabled in product factoring bits
  IF FeatureDefs.features.bv3270Emulation THEN {
--+!+    zPerm ← ZoneMgrDefs.GetPredefinedZone[permanent];
    zPerm ← Heap.Create[7]; --+!+
    zSess ← ZoneMgrDefs.GetPredefinedZone[session];
    zMDS ← ZoneMgrDefs.GetPredefinedMDSZone[short];
    globals ← zPerm.NEW[AqGlobals];
    InitBitmaps[];
    InitRgrginfo[]};
  END; -- Init

-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

-- ====================
-- MAINLINE CODE
-- ====================

Init[]; 

END. -- Em3270StatusPack

LOG
19-Feb-82 - Weissman - Created
 3-Mar-82 - Weissman - Mods for change to schemadata containing an Srt instead of an Rt
11-Mar-82 - Weissman - Don't erase line when clearing status area, fix htStatusArea
16-Mar-82 - Weissman - Move systemLock down to 2nd row, fix bmS
17-Mar-82 - Weissman - Fix bmClock to be bolder
12-Apr-82 - Weissman - Move all per-instance data to hyperspace
13-Apr-82 - Weissman - Work on fixing scrolling of status area
19-Apr-82 - Weissman - MONITORize, make critical procs ENTRYs
 4-Jan-83 - Weissman - Check product factoring before allocating storage;
 	move globals to hyperspace
30-Nov-83 - Pettit - eliminate compiler warnings by initializing zones to NIL
 9-Apr-84 14:58:33 - Caro - Fix bitmap ineffieciencies in DisplayCodeInternal 
26-Apr-84 13:57:03 - Caro - Implemented fixes for DisplayCodeInternal
25-May-84 16:22:14 - Caro - Changed zPerm to private zone.