home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / draco / draco-1.ark / HEDIT.DRC < prev    next >
Text File  |  1986-11-12  |  18KB  |  858 lines

  1. #util.g
  2. #crt.g
  3.  
  4. word BUFFSIZE = 1024;
  5.  
  6. ushort
  7.     FILECOL = 2,
  8.     ROCOL = 17,
  9.     POSCOL = 22,
  10.     HEXCOL = 29,
  11.     ERRORCOL = 34;
  12.  
  13. ushort NLines, NCols;
  14.  
  15. file(BUFFSIZE) Fyle;
  16. channel input binary Chin;
  17. channel output binary Chout;
  18. channel output text CRTOut;
  19.  
  20. *char FileName;
  21.  
  22. word FilePos, WindowPos, EndPos;
  23. ushort FilePosHigh, WindowPosHigh, EndPosHigh;
  24.  
  25. ushort CursorLine, CursorColHex, CursorColChar;
  26.  
  27. bool ReadOnly, Binary, HadError;
  28.  
  29. proc nonrec err(*char message)void:
  30.  
  31.     CRT_Move(NLines - 1, ERRORCOL);
  32.     CRT_EnterHighLight();
  33.     write(CRTOut; message);
  34.     CRT_ExitHighLight();
  35.     HadError := true;
  36. corp;
  37.  
  38. proc nonrec abort(*char message)void:
  39.  
  40.     CRT_Move(NLines - 1, ERRORCOL);
  41.     CRT_EnterHighLight();
  42.     write(CRTOut; message, ' ', ioerror(Chin), ' ', ioerror(Chout));
  43.     CRT_ExitHighLight();
  44.     CRT_Scroll();
  45.     CRT_Abort();
  46. corp;
  47.  
  48. proc nonrec endOfFile()void:
  49.  
  50.     err("End of file");
  51. corp;
  52.  
  53. proc nonrec startOfFile()void:
  54.  
  55.     err("Beginning of file");
  56. corp;
  57.  
  58. proc nonrec displayPos()void:
  59.  
  60.     CRT_Move(NLines - 1, POSCOL);
  61.     write(CRTOut; FilePosHigh : x : -2, FilePos : x : -4);
  62. corp;
  63.  
  64. proc nonrec displayStatus()void:
  65.     ushort i;
  66.  
  67.     HadError := false;
  68.     CRT_ClearLine(NLines - 1);
  69.     for i from 0 upto NCols - 2 do
  70.     write(CRTOut; '-');
  71.     od;
  72.     CRT_Move(NLines - 1, FILECOL);
  73.     write(CRTOut; FileName);
  74.     if ReadOnly then
  75.     CRT_Move(NLines - 1, ROCOL);
  76.     write(CRTOut; "[RO]");
  77.     fi;
  78.     displayPos();
  79.     CRT_Move(NLines - 1, HEXCOL);
  80.     write(CRTOut; if Binary then "hex-" else "char" fi);
  81. corp;
  82.  
  83. proc nonrec clearError()void:
  84.     ushort i;
  85.  
  86.     if HadError then
  87.     HadError := false;
  88.     CRT_Move(NLines - 1, ERRORCOL);
  89.     for i from ERRORCOL + 2 upto NCols do
  90.         write(CRTOut; '-');
  91.     od;
  92.     fi;
  93. corp;
  94.  
  95. proc nonrec getChar1()char:
  96.     char ch;
  97.  
  98.     while
  99.     ch := CRT_GetChar();
  100.     ch = '\e'
  101.     do
  102.     od;
  103.     ch
  104. corp;
  105.  
  106. proc nonrec getChar()char:
  107.     char ch;
  108.  
  109.     ch := getChar1();
  110.     clearError();
  111.     ch
  112. corp;
  113.  
  114. proc nonrec ASCIIPut(byte b)void:
  115.  
  116.     write(CRTOut; if b + '\e' >= ' ' and b + '\e' <= '~' then
  117.               b + '\e'
  118.           else
  119.               '.'
  120.           fi);
  121. corp;
  122.  
  123. proc nonrec seek(ushort posHigh; word pos)void:
  124.  
  125.     if not SeekIn(Chin, posHigh, pos) then
  126.     abort("Seek failed");
  127.     fi;
  128. corp;
  129.  
  130. proc nonrec unCursor()void:
  131.     byte b;
  132.  
  133.     seek(FilePosHigh, FilePos);
  134.     read(Chin; b);
  135.     CRT_Move(CursorLine, CursorColHex);
  136.     write(CRTOut; b : x : -2);
  137.     CRT_Move(CursorLine, CursorColChar);
  138.     ASCIIPut(b);
  139. corp;
  140.  
  141. proc nonrec putCursor()void:
  142.     byte b;
  143.  
  144.     seek(FilePosHigh, FilePos);
  145.     read(Chin; b);
  146.     CRT_EnterHighLight();
  147.     CRT_Move(CursorLine, CursorColHex);
  148.     write(CRTOut; b : x : -2);
  149.     CRT_Move(CursorLine, CursorColChar);
  150.     ASCIIPut(b);
  151.     CRT_ExitHighLight();
  152. corp;
  153.  
  154. proc nonrec displayScreen()void:
  155.     word pos;
  156.     ushort posHigh, l, c;
  157.     [16] byte buff;
  158.  
  159.     CRT_Move(0, 0);
  160.     posHigh := WindowPosHigh;
  161.     pos := WindowPos;
  162.     l := 0;
  163.     seek(WindowPosHigh, WindowPos);
  164.     while read(Chin; buff[0]) and l ~= NLines - 1 do
  165.     l := l + 1;
  166.     write(CRTOut; posHigh : x : -2, pos : x : -4, ":  ",
  167.           buff[0] : x : -2, ' ');
  168.     pos := pos + 1;
  169.     for c from 1 upto 15 do
  170.         read(Chin; buff[c]);
  171.         write(CRTOut; buff[c] : x : -2, ' ');
  172.         pos := pos + 1;
  173.     od;
  174.     pos := pos - 16;
  175.     write(CRTOut; " *");
  176.     for c from 0 upto 15 do
  177.         ASCIIPut(buff[c]);
  178.         pos := pos + 1;
  179.     od;
  180.     if pos = 0x0000 then
  181.         posHigh := posHigh + 1;
  182.     fi;
  183.     write (CRTOut; "*\r\n");
  184.     od;
  185.     pretend(ioerror(Chin), void);
  186.     while l ~= NLines - 1 do
  187.     CRT_ClearLine(l);
  188.     l := l + 1;
  189.     od;
  190.     putCursor();
  191. corp;
  192.  
  193. proc nonrec scroll()void:
  194.     word pos;
  195.     ushort posHigh, c;
  196.     [16] byte buff;
  197.  
  198.     pos := WindowPos + make(NLines - 1, word) * 16;
  199.     posHigh :=
  200.     if pos < WindowPos then WindowPosHigh + 1 else WindowPosHigh fi;
  201.     if EndPosHigh > posHigh or EndPosHigh = posHigh and EndPos > pos then
  202.     CRT_ClearLine(NLines - 1);
  203.     seek(posHigh, pos);
  204.     write(CRTOut; posHigh : x : -2, pos : x : -4, ":  ");
  205.     for c from 0 upto 15 do
  206.         read(Chin; buff[c]);
  207.         write(CRTOut; buff[c] : x : -2, ' ');
  208.     od;
  209.     write(CRTOut; " *");
  210.     for c from 0 upto 15 do
  211.         ASCIIPut(buff[c]);
  212.     od;
  213.     write(CRTOut; "*\r\n");
  214.     WindowPos := WindowPos + 16;
  215.     if WindowPos = 0x0000 then
  216.         WindowPosHigh := WindowPosHigh + 1;
  217.     fi;
  218.     if CursorLine = 0 then
  219.         FilePos := FilePos + 16;
  220.         if FilePos = 0x0000 then
  221.         FilePosHigh := FilePosHigh + 1;
  222.         fi;
  223.         putCursor();
  224.     else
  225.         CursorLine := CursorLine - 1;
  226.     fi;
  227.     displayStatus();
  228.     else
  229.     endOfFile();
  230.     fi;
  231. corp;
  232.  
  233. proc nonrec cursorForward()void:
  234.  
  235.     if FilePos & 0x000f = 0x000f and CursorLine = NLines - 2 then
  236.     scroll();
  237.     fi;
  238.     if FilePosHigh ~= EndPosHigh or FilePos ~= EndPos - 1 then
  239.     unCursor();
  240.     if FilePos = 0xffff then
  241.         FilePos := 0;
  242.         FilePosHigh := FilePosHigh + 1;
  243.     else
  244.         FilePos := FilePos + 1;
  245.     fi;
  246.     if FilePos & 0x000f = 0x0000 then
  247.         CursorLine := CursorLine + 1;
  248.         CursorColHex := 9;
  249.         CursorColChar := 59;
  250.     else
  251.         CursorColHex := CursorColHex + 3;
  252.         CursorColChar := CursorColChar + 1;
  253.     fi;
  254.     putCursor();
  255.     displayPos();
  256.     else
  257.     endOfFile();
  258.     fi;
  259. corp;
  260.  
  261. proc nonrec cursorBackward()void:
  262.  
  263.     if FilePos ~= 0 or FilePosHigh ~= 0 then
  264.     unCursor();
  265.     if FilePos = 0 then
  266.         FilePos := 0xffff;
  267.         FilePosHigh := FilePosHigh - 1;
  268.     else
  269.         FilePos := FilePos - 1;
  270.     fi;
  271.     if FilePos & 0x000f = 0x000f then
  272.         CursorColHex := 9 + 30 + 15;
  273.         CursorColChar := 59 + 15;
  274.         if CursorLine = 0 then
  275.         if WindowPos = 0 then
  276.             WindowPos := 0xfff0;
  277.             WindowPosHigh := WindowPosHigh - 1;
  278.         else
  279.             WindowPos := WindowPos - 16;
  280.         fi;
  281.         CRT_ClearScreen();
  282.         displayScreen();
  283.         displayStatus();
  284.         else
  285.         CursorLine := CursorLine - 1;
  286.         fi;
  287.     else
  288.         CursorColHex := CursorColHex - 3;
  289.         CursorColChar := CursorColChar - 1;
  290.     fi;
  291.     putCursor();
  292.     displayPos();
  293.     else
  294.     startOfFile();
  295.     fi;
  296. corp;
  297.  
  298. proc nonrec cursorUp()void:
  299.  
  300.     if FilePosHigh ~= 0 or FilePos >= 16 then
  301.     unCursor();
  302.     if FilePos <= 0x000f then
  303.         FilePosHigh := FilePosHigh - 1;
  304.     fi;
  305.     FilePos := FilePos - 16;
  306.     if CursorLine = 0 then
  307.         if WindowPos = 0 then
  308.         WindowPos := 0xfff0;
  309.         WindowPosHigh := WindowPosHigh - 1;
  310.         else
  311.         WindowPos := WindowPos - 16;
  312.         fi;
  313.         CRT_ClearScreen();
  314.         displayScreen();
  315.         displayStatus();
  316.     else
  317.         CursorLine := CursorLine - 1;
  318.     fi;
  319.     putCursor();
  320.     displayPos();
  321.     else
  322.     startOfFile();
  323.     fi;
  324. corp;
  325.  
  326. proc nonrec cursorDown()void:
  327.  
  328.     if CursorLine = NLines - 2 then
  329.     scroll();
  330.     fi;
  331.     if FilePosHigh ~= EndPosHigh or FilePos < EndPos - 16 then
  332.     unCursor();
  333.     FilePos := FilePos + 16;
  334.     if FilePos <= 0x000f then
  335.         FilePosHigh := FilePosHigh + 1;
  336.     fi;
  337.     CursorLine := CursorLine + 1;
  338.     putCursor();
  339.     displayPos();
  340.     else
  341.     endOfFile();
  342.     fi;
  343. corp;
  344.  
  345. proc nonrec cursorHome()void:
  346.     bool redraw;
  347.  
  348.     unCursor();
  349.     redraw := WindowPosHigh ~= 0 or WindowPos ~= 0;
  350.     FilePosHigh := 0;
  351.     FilePos := 0;
  352.     WindowPosHigh := 0;
  353.     WindowPos := 0;
  354.     CursorLine := 0;
  355.     CursorColHex := 9;
  356.     CursorColChar := 59;
  357.     if redraw then
  358.     CRT_ClearScreen();
  359.     displayScreen();
  360.     displayStatus();
  361.     putCursor();
  362.     else
  363.     putCursor();
  364.     displayPos();
  365.     fi;
  366. corp;
  367.  
  368. proc nonrec pageForward()void:
  369.     word pos, old;
  370.     ushort posHigh;
  371.  
  372.     pos := WindowPos + make(NLines - 3, word) * 16;
  373.     posHigh :=
  374.     if pos < WindowPos then WindowPosHigh + 1 else WindowPosHigh fi;
  375.     if EndPosHigh > posHigh or EndPosHigh = posHigh and EndPos > pos then
  376.     WindowPos := pos;
  377.     WindowPosHigh := posHigh;
  378.     old := FilePos;
  379.     FilePos := FilePos + make(NLines - 3, word) * 16;
  380.     if FilePos < old then
  381.         FilePosHigh := FilePosHigh + 1;
  382.     fi;
  383.     if FilePosHigh > EndPosHigh or
  384.         FilePosHigh = EndPosHigh and FilePos >= EndPos then
  385.         CursorLine := (EndPos - WindowPos) / 16 - 1;
  386.         CursorColHex := 9 + 30 + 15;
  387.         CursorColChar := 59 + 15;
  388.         FilePosHigh := EndPosHigh;
  389.         FilePos := EndPos - 1;
  390.     fi;
  391.     CRT_ClearScreen();
  392.     displayScreen();
  393.     displayStatus();
  394.     else
  395.     endOfFile();
  396.     fi;
  397. corp;
  398.  
  399. proc nonrec pageBackward()void:
  400.     word old;
  401.  
  402.     if WindowPosHigh ~= 0 or WindowPos ~= 0 then
  403.     if WindowPosHigh ~= 0 or WindowPos >= make(NLines - 1,word) * 16 then
  404.         old := WindowPos;
  405.         WindowPos := WindowPos - make(NLines - 3, word) * 16;
  406.         if WindowPos > old then
  407.         WindowPosHigh := WindowPosHigh - 1;
  408.         fi;
  409.         old := FilePos;
  410.         FilePos := FilePos - make(NLines - 3, word) * 16;
  411.         if FilePos > old then
  412.         FilePosHigh := FilePosHigh - 1;
  413.         fi;
  414.     else
  415.         FilePos := FilePos - WindowPos;
  416.         FilePosHigh := 0;
  417.         WindowPos := 0;
  418.         WindowPosHigh := 0;
  419.     fi;
  420.     CRT_ClearScreen();
  421.     displayScreen();
  422.     displayStatus();
  423.     else
  424.     startOfFile();
  425.     fi;
  426. corp;
  427.  
  428. proc nonrec getHex()byte:
  429.     char ch;
  430.  
  431.     while
  432.     ch := getChar1();
  433.     not (ch >= '0' and ch <= '9' or
  434.          ch >= 'a' and ch <= 'f' or
  435.          ch >= 'A' and ch <= 'F' or
  436.          ch = '\r' or ch = '\b')
  437.     do
  438.     od;
  439.     if ch >= 'A' and ch <= 'F' then
  440.     ch - 'A' + 10
  441.     elif ch >= 'a' and ch <= 'f' then
  442.     ch - 'a' + 10
  443.     elif ch = '\r' then
  444.     255
  445.     elif ch = '\b' then
  446.     254
  447.     else
  448.     ch - '0'
  449.     fi
  450. corp;
  451.  
  452. proc nonrec gotoDisplay(ushort posHigh; word pos; bool redraw)void:
  453.  
  454.     if not redraw then
  455.     unCursor();
  456.     CursorLine := CursorLine + (pos / 16 - FilePos / 16);
  457.     fi;
  458.     FilePosHigh := posHigh;
  459.     FilePos := pos;
  460.     CursorColHex := (FilePos & 0x000f) * 3 + 9;
  461.     CursorColChar := (FilePos & 0x000f) + 59;
  462.     if redraw then
  463.     CRT_ClearScreen();
  464.     CursorLine := 0;
  465.     displayScreen();
  466.     displayStatus();
  467.     else
  468.     displayPos();
  469.     fi;
  470.     putCursor();
  471. corp;
  472.  
  473. proc nonrec goto()void:
  474.     word pos, endPos;
  475.     byte b;
  476.     ushort posHigh, endPosHigh, p, q;
  477.     [6] byte buff;
  478.  
  479.     err("Enter location to go to");
  480.     CRT_Move(NLines - 1, POSCOL);
  481.     write(CRTOut; "      ");
  482.     CRT_Move(NLines - 1, POSCOL);
  483.     p := 0;
  484.     while
  485.     while
  486.         b := getHex();
  487.         b = 0 and p = 0
  488.     do
  489.     od;
  490.     b ~= 255
  491.     do
  492.     if b = 254 then
  493.         if p ~= 0 then
  494.         p := p - 1;
  495.         write(CRTOut; "\b \b");
  496.         fi;
  497.     elif p = 6 then
  498.         write(CRTOut; '\(0x07)');
  499.     else
  500.         write(CRTOut; if b < 10 then b + '0' else b - 10 + 'a' fi);
  501.         buff[p] := b;
  502.         p := p + 1;
  503.     fi;
  504.     od;
  505.     if p = 0 then
  506.     clearError();
  507.     err("OK - no goto done");
  508.     displayPos();
  509.     else
  510.     q := 6;
  511.     while p ~= 0 do
  512.         p := p - 1;
  513.         q := q - 1;
  514.         buff[q] := buff[p];
  515.     od;
  516.     while q ~= 0 do
  517.         q := q - 1;
  518.         buff[q] := 0;
  519.     od;
  520.     posHigh := buff[0] << 4 + buff[1];
  521.     pos := (make(buff[2], word) << 12) +
  522.            (make(buff[3], word) << 8) +
  523.            (make(buff[4], word) << 4) +
  524.             make(buff[5], word);
  525.     if posHigh = FilePosHigh and pos = FilePos then
  526.         ;
  527.     elif posHigh < FilePosHigh or
  528.         posHigh = FilePosHigh and pos < FilePos then
  529.         if posHigh < WindowPosHigh or
  530.             posHigh = WindowPosHigh and pos < WindowPos then
  531.         WindowPosHigh := posHigh;
  532.         WindowPos := pos & 0xfff0;
  533.         gotoDisplay(posHigh, pos, true);
  534.         else
  535.         gotoDisplay(posHigh, pos, false);
  536.         fi;
  537.     else
  538.         if posHigh > EndPosHigh or
  539.             posHigh = EndPosHigh and pos >= EndPos then
  540.         endOfFile();
  541.         posHigh := EndPosHigh;
  542.         pos := EndPos - 1;
  543.         fi;
  544.         endPos := WindowPos + make(NLines - 1, word) * 16;
  545.         endPosHigh :=
  546.         if endPos < WindowPos then
  547.             WindowPosHigh + 1
  548.         else
  549.             WindowPosHigh
  550.         fi;
  551.         if posHigh > endPosHigh or
  552.             posHigh = endPosHigh and pos >= endPos then
  553.         WindowPosHigh := posHigh;
  554.         WindowPos := pos & 0xfff0;
  555.         gotoDisplay(posHigh, pos, true);
  556.         else
  557.         gotoDisplay(posHigh, pos, false);
  558.         fi;
  559.     fi;
  560.     clearError();
  561.     fi;
  562. corp;
  563.  
  564. proc nonrec toDec()void:
  565.     word num;
  566.     ushort p;
  567.     byte b;
  568.  
  569.     err("Enter hex value to convert");
  570.     CRT_Move(NLines - 1, POSCOL);
  571.     write(CRTOut; "-    -");
  572.     CRT_Move(NLines - 1, POSCOL + 1);
  573.     num := 0;
  574.     p := 0;
  575.     while
  576.     while
  577.         b := getHex();
  578.         b = 0 and p = 0
  579.     do
  580.     od;
  581.     b ~= 255
  582.     do
  583.     if b = 254 then
  584.         if p ~= 0 then
  585.         num := num >> 4;
  586.         p := p - 1;
  587.         write(CRTOut; "\b \b");
  588.         fi;
  589.     elif p = 4 then
  590.         write(CRTOut; '\(0x07)');
  591.     else
  592.         write(CRTOut; if b < 10 then b + '0' else b - 10 + 'a' fi);
  593.         num := (num << 4) + b;
  594.         p := p + 1;
  595.     fi;
  596.     od;
  597.     clearError();
  598.     if p ~= 0 then
  599.     err("Decimal value is ");
  600.     CRT_Move(NLines - 1, ERRORCOL + 17);
  601.     CRT_EnterHighLight();
  602.     write(CRTOut; num : u);
  603.     CRT_ExitHighLight();
  604.     fi;
  605.     displayPos();
  606. corp;
  607.  
  608. proc nonrec toHex()void:
  609.     word num;
  610.     ushort p;
  611.     char ch;
  612.  
  613.     err("Enter decimal value to convert");
  614.     CRT_Move(NLines - 1, POSCOL);
  615.     write(CRTOut; "     -");
  616.     CRT_Move(NLines - 1, POSCOL);
  617.     num := 0;
  618.     p := 0;
  619.     while
  620.     while
  621.         while
  622.         ch := getChar1();
  623.         not (ch >= '0' and ch <= '9' or
  624.              ch = '\r' or ch = '\b')
  625.         do
  626.         od;
  627.         ch = '0' and p = 0
  628.     do
  629.     od;
  630.     ch ~= '\r'
  631.     do
  632.     if ch = '\b' then
  633.         if p ~= 0 then
  634.         num := num / 10;
  635.         p := p - 1;
  636.         write(CRTOut; "\b \b");
  637.         fi;
  638.     elif p = 5 then
  639.         write(CRTOut; '\(0x07)');
  640.     else
  641.         write(CRTOut; ch);
  642.         num := (num * 10) + (ch - '0');
  643.         p := p + 1;
  644.     fi;
  645.     od;
  646.     clearError();
  647.     if p ~= 0 then
  648.     err("Hex value is ");
  649.     CRT_Move(NLines - 1, ERRORCOL + 13);
  650.     CRT_EnterHighLight();
  651.     write(CRTOut; num : x : -4);
  652.     CRT_ExitHighLight();
  653.     fi;
  654.     displayPos();
  655. corp;
  656.  
  657. proc nonrec helpScreen()void:
  658.  
  659.     CRT_ClearScreen();
  660.     write(CRTOut;
  661.         "\n"
  662.         "\n"
  663.         "\n"
  664.         "\n"
  665.         "\t\tCommands are:\r\n"
  666.         "\n"
  667.         "\tESC - exit\r\n"
  668.         "\tarrow keys - move cursor\r\n"
  669.         "\tHOME - move to beginning of file\r\n"
  670.         "\tRETURN - scroll screen\r\n"
  671.         "\tCNTL-Q - page forward\r\n"
  672.         "\tCNTL-S - page backward\r\n"
  673.         "\tCNTL-G - go to specific location\r\n"
  674.         "\tCNTL-T - toggle hex/char mode\r\n"
  675.         "\tCNTL-R - redraw screen\r\n"
  676.         "\tCNTL-X - convert decimal value to hex\r\n"
  677.         "\tCNTL-D - convert hex value to decimal\r\n"
  678.         "\tnon-control - replace char when not Read-Only"
  679.     );
  680.     CRT_Continue();
  681.     CRT_ClearScreen();
  682.     displayScreen();
  683.     displayStatus();
  684. corp;
  685.  
  686. proc nonrec writeByte(byte b)void:
  687.  
  688.     if not SeekOut(Chout, FilePosHigh, FilePos) then
  689.     abort("Write seek failed");
  690.     fi;
  691.     write(Chout; b);
  692.     cursorForward();
  693. corp;
  694.  
  695. proc nonrec edit()void:
  696.     byte b, b2;
  697.     char cmd;
  698.  
  699.     EndPos := GetInMax(Chin, &EndPosHigh);
  700.     displayScreen();
  701.     while
  702.     CRT_Move(CursorLine,
  703.          if Binary then CursorColHex else CursorColChar fi);
  704.     cmd := getChar();
  705.     cmd ~= '\(0x1b)'
  706.     do
  707.     case cmd
  708.     incase '\(0x06)':
  709.         cursorForward();
  710.     incase '\(0x15)':
  711.     incase '\(0x08)':
  712.         cursorBackward();
  713.     incase '\(0x1a)':
  714.         cursorUp();
  715.     incase '\(0x0a)':
  716.         cursorDown();
  717.     incase '\(0x01)':
  718.         cursorHome();
  719.     incase '\(0x0d)':
  720.         scroll();
  721.     incase '\(0x11)':
  722.         pageForward();
  723.     incase '\(0x13)':
  724.         pageBackward();
  725.     incase '\(0x07)':
  726.         goto();
  727.     incase '\(0x12)':
  728.         CRT_Reset();
  729.         CRT_ClearScreen();
  730.         displayScreen();
  731.         displayStatus();
  732.     incase '\(0x14)':
  733.         CRT_Move(NLines - 1, HEXCOL);
  734.         if Binary then
  735.         Binary := false;
  736.         write(CRTOut; "char");
  737.         else
  738.         Binary := true;
  739.         write(CRTOut; "hex-");
  740.         fi;
  741.     incase '\(0x04)':
  742.         toDec();
  743.     incase '\(0x18)':
  744.         toHex();
  745.     incase '\(0x1c)':
  746.         helpScreen();
  747.     default:
  748.         if cmd >= ' ' and cmd <= '~' then
  749.         if ReadOnly then
  750.             err("Modifications not allowed");
  751.         elif Binary then 
  752.             if cmd >= '0' and cmd <= '9' or
  753.                 cmd >= 'a' and cmd <= 'f' or
  754.                 cmd >= 'A' and cmd <= 'F' then
  755.             b :=
  756.                 if cmd >= '0' and cmd <= '9' then
  757.                 cmd - '0'
  758.                 elif cmd >= 'a' and cmd <= 'f' then
  759.                 cmd - 'a' + 10
  760.                 else
  761.                 cmd - 'A' + 10
  762.                 fi;
  763.             CRT_EnterHighLight();
  764.             write(CRTOut;
  765.                   if b >= 10 then b - 10 + 'a' else b + '0' fi);
  766.             CRT_ExitHighLight();
  767.             b2 := getHex();
  768.             if b2 = 255 then
  769.                 writeByte(b);
  770.             elif b2 = 254 then
  771.                 putCursor();
  772.             else
  773.                 writeByte(b << 4 + b2);
  774.             fi;
  775.             else
  776.             err("Bad hexadecimal digit");
  777.             fi;
  778.         else
  779.             write(CRTOut; cmd);
  780.             CRT_Move(CursorLine, CursorColHex);
  781.             write(CRTOut; cmd - '\e' : x : -2);
  782.             writeByte(cmd - '\e');
  783.         fi;
  784.         else
  785.         err("Invalid; CNTL-\\ for help");
  786.         fi;
  787.     esac;
  788.     od;
  789.     if not ReadOnly then
  790.     close(Chout);
  791.     fi;
  792.     close(Chin);
  793. corp;
  794.  
  795. proc nonrec badUse()void:
  796.  
  797.     writeln("Use is: hedit [-w] file1.typ ... filen.typ");
  798.     exit(1);
  799. corp;
  800.  
  801. proc nonrec main()void:
  802.     *char par;
  803.  
  804.     ReadOnly := true;
  805.     Binary := true;
  806.     par := GetPar();
  807.     if par ~= nil and par* = '-' then
  808.     while
  809.         par := par + 1;
  810.         par* ~= '\e'
  811.     do
  812.         case par*
  813.         incase 'W':
  814.         ReadOnly := false;
  815.         default:
  816.         badUse();
  817.         esac;
  818.     od;
  819.     par := GetPar();
  820.     fi;
  821.     if par = nil then
  822.     badUse();
  823.     fi;
  824.     CRT_AbortDisable();
  825.     NLines := CRT_NLines();
  826.     NCols := CRT_NCols();
  827.     open(CRTOut, CRT_PutChar);
  828.     while par ~= nil do
  829.     FilePosHigh := 0;
  830.     WindowPosHigh := 0;
  831.     FilePos := 0;
  832.     WindowPos := 0;
  833.     CursorLine := 0;
  834.     CursorColHex := 9;
  835.     CursorColChar := 59;
  836.     CRT_ClearScreen();
  837.     FileName := par;
  838.     if open(Chin, Fyle, FileName) then
  839.         displayStatus();
  840.         if not ReadOnly then
  841.         ReOpen(Chin, Chout);
  842.         fi;
  843.         if not SeekIn(Chin, 0, 0) then
  844.         err("File is empty - press a key");
  845.         pretend(getChar(), void);
  846.         else
  847.         edit();
  848.         fi;
  849.     else
  850.         displayStatus();
  851.         err("File doesn't exist - press a key");
  852.         pretend(getChar(), void);
  853.     fi;
  854.     par := GetPar();
  855.     od;
  856.     CRT_Abort();
  857. corp;
  858.