home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / lilith / m2misc.mod < prev    next >
Text File  |  2020-01-01  |  12KB  |  441 lines

  1. IMPLEMENTATION MODULE KermMisc;
  2. (************************************************************************)
  3. (*  This Module contains several service routines                       *)
  4. (*  written:            08.10.85     Matthias Aebi                      *)
  5. (*  last modification:  26.02.85     Matthias Aebi                      *)
  6. (************************************************************************)
  7.  
  8. IMPORT Terminal;
  9. IMPORT V24;
  10.  
  11. FROM OutTerminal IMPORT WriteC;
  12. FROM KermParam   IMPORT Packet, LDebug;
  13. FROM TextScreen  IMPORT SetPos, ClearChars;
  14.  
  15. CONST
  16.     EOL =  36C;
  17.     FF  =  14C;
  18.     ESC =  33C;
  19.     BS  =  10C;
  20.     DEL = 177C;
  21.  
  22. VAR
  23.     numOfPacks : CARDINAL;    (* Packet counter for status display *)
  24.     numOfTries : CARDINAL;    (* Retry counter for status display *)
  25.  
  26. (************************************************************************)
  27.                             PROCEDURE ClrScr;
  28. (************************************************************************)
  29. BEGIN
  30.     Terminal.Write(FF);
  31. END ClrScr;
  32.  
  33.  
  34. (************************************************************************)
  35.                         PROCEDURE GotoXY(x,y: INTEGER);
  36. (************************************************************************)
  37. BEGIN
  38.     SetPos(y,x);
  39. END GotoXY;
  40.  
  41.  
  42. (************************************************************************)
  43.                 PROCEDURE SendChar(ch: CHAR; portNr: CARDINAL);
  44. (************************************************************************)
  45. BEGIN
  46.     V24.Write(ch); (* there is only one port on the Lilith *)
  47. END SendChar;
  48.  
  49.  
  50. (************************************************************************)
  51.            PROCEDURE RecvChar(VAR ch: CHAR; portNr: CARDINAL): BOOLEAN;
  52. (************************************************************************)
  53. VAR
  54.     gotChar : BOOLEAN;
  55.  
  56. BEGIN
  57.     V24.BusyRead(ch, gotChar);
  58.     RETURN gotChar;
  59. END RecvChar;
  60.  
  61.  
  62. (************************************************************************)
  63.              PROCEDURE ReadString(VAR s: ARRAY OF CHAR);
  64. (************************************************************************)
  65. VAR
  66.     ch : CHAR;
  67.     i  : CARDINAL;
  68.  
  69. BEGIN
  70.     i := 0;
  71.     REPEAT
  72.         Terminal.Read(ch);
  73.         IF ch = EOL
  74.         THEN
  75.             s[i] := 0C;
  76.             Terminal.Write(ch);
  77.         ELSIF ch = ESC
  78.         THEN
  79.             s[0] := 0C;
  80.             Terminal.WriteLn;
  81.         ELSIF (ch = BS) OR (ch = DEL)
  82.         THEN
  83.             IF i > 0
  84.             THEN
  85.                 DEC(i);
  86.                 Terminal.Write(ch);
  87.             END;
  88.         ELSE
  89.             s[i] := ch;
  90.             Terminal.Write(ch);
  91.             INC(i);
  92.         END;
  93.     UNTIL (ch = EOL) OR (ch = ESC) OR (i > HIGH(s));
  94. END ReadString;
  95.  
  96.  
  97. (************************************************************************)
  98.                  PROCEDURE ReadChar(VAR ch: CHAR): BOOLEAN;
  99. (************************************************************************)
  100. BEGIN
  101.     Terminal.BusyRead(ch);
  102.     IF ch = 0C
  103.     THEN
  104.         RETURN FALSE;
  105.     ELSE
  106.         RETURN TRUE;
  107.     END;
  108. END ReadChar;
  109.  
  110.  
  111. (************************************************************************)
  112.                     PROCEDURE InitPort(portNr: CARDINAL);
  113. (************************************************************************)
  114. BEGIN
  115. END InitPort;
  116.  
  117.  
  118. (************************************************************************)
  119.         PROCEDURE SetBaud(baudRate: CARDINAL; portNr: CARDINAL);
  120. (************************************************************************)
  121. VAR
  122.     value : CARDINAL;
  123.     dummy : CARDINAL;
  124.     i     : CARDINAL;
  125.  
  126. (*----------------------------------------------------------------------*)
  127.              PROCEDURE GET(channel: CARDINAL; VAR info: CARDINAL);
  128. (*----------------------------------------------------------------------*)
  129. (* input from channel to info *)
  130.     CODE 240B (* Read *)
  131. END GET;
  132.  
  133.  
  134. (*----------------------------------------------------------------------*)
  135.              PROCEDURE PUT(channel: CARDINAL; info: CARDINAL);
  136. (*----------------------------------------------------------------------*)
  137. (* output info to channel *)
  138.     CODE 241B (* Write *)
  139. END PUT;
  140.  
  141.  
  142. BEGIN (* SetBaud *)
  143.  
  144.     (* a CASE  statement would be the right thing to use here but
  145.        the compiler refused it with a 'procedure too long' error !? *)
  146.  
  147.     IF baudRate = 300
  148.     THEN
  149.         value := 80;
  150.     ELSIF baudRate = 600
  151.     THEN
  152.         value := 96;
  153.     ELSIF baudRate = 1200
  154.     THEN
  155.         value := 112;
  156.     ELSIF baudRate = 2400
  157.     THEN
  158.         value := 160;
  159.     ELSIF baudRate = 4800
  160.     THEN
  161.         value := 192;
  162.     ELSIF baudRate = 9600
  163.     THEN
  164.         value := 224;
  165.     ELSIF baudRate = 19200
  166.     THEN
  167.         value := 240;
  168.     END;
  169.  
  170.     GET(0, dummy);
  171.     FOR i:=1 TO value DO
  172.         GET(5, dummy);
  173.     END;
  174.     PUT(1,dummy);
  175. END SetBaud;
  176.  
  177.  
  178. (************************************************************************)
  179.                    PROCEDURE SendBreak(portNr: CARDINAL);
  180. (************************************************************************)
  181. BEGIN
  182.     Terminal.WriteLn;
  183.     Terminal.WriteString("Sorry, send break is not possible on the Lilith");
  184.     Terminal.WriteLn;
  185. END SendBreak;
  186.  
  187.  
  188. (************************************************************************)
  189.                         PROCEDURE WriteChar(ch: CHAR);
  190. (************************************************************************)
  191. VAR
  192.     chrNr : CARDINAL;
  193.  
  194. BEGIN
  195.     chrNr := ORD(ch);
  196.     IF chrNr < 32
  197.     THEN
  198.         Terminal.Write("^");
  199.         ch := CHR(chrNr + 64);
  200.     END;
  201.  
  202.     Terminal.Write(ch);
  203.     Terminal.Write(" ");
  204.     Terminal.Write("(");
  205.     WriteC(chrNr,1);
  206.     Terminal.Write(")");
  207. END WriteChar;
  208.  
  209.  
  210. (************************************************************************)
  211.                      PROCEDURE AddBits(ch: CHAR): CARDINAL;
  212. (************************************************************************)
  213. VAR
  214.     i     : CARDINAL;
  215.     count : CARDINAL;
  216.  
  217. BEGIN
  218.     count := 0;
  219.     FOR i:= 0 TO 7 DO
  220.         IF i IN BITSET(ch)
  221.         THEN
  222.             INC(count);
  223.         END;
  224.     END;
  225.     RETURN count;
  226. END AddBits;
  227.  
  228.  
  229. (************************************************************************)
  230.                 PROCEDURE BitAND(v1,v2: CARDINAL): CARDINAL;
  231. (************************************************************************)
  232. BEGIN
  233.     RETURN CARDINAL(BITSET(v1) * BITSET(v2));
  234. END BitAND;
  235.  
  236.  
  237. (************************************************************************)
  238.                 PROCEDURE BitOR(v1,v2: CARDINAL): CARDINAL;
  239. (************************************************************************)
  240. BEGIN
  241.     RETURN CARDINAL(BITSET(v1) + BITSET(v2));
  242. END BitOR;
  243.  
  244.  
  245. (************************************************************************)
  246.                 PROCEDURE BitXOR(v1,v2: CARDINAL): CARDINAL;
  247. (************************************************************************)
  248. BEGIN
  249.     RETURN CARDINAL(BITSET(v1) / BITSET(v2));
  250. END BitXOR;
  251.  
  252.  
  253. (************************************************************************)
  254.               PROCEDURE PrtErrPacket(pack: Packet; len: CARDINAL);
  255. (************************************************************************)
  256. BEGIN
  257.     pack[len] := 0C;
  258.     DispMsg(pack);
  259.     (* identify error msg as remote *)
  260.     Terminal.WriteString(" (Remote Kermit)");
  261. END PrtErrPacket;
  262.  
  263.  
  264. (************************************************************************)
  265.                    PROCEDURE ToChar(value: CARDINAL): CHAR;
  266. (************************************************************************)
  267. BEGIN
  268.     RETURN CHR(value + 32);
  269. END ToChar;
  270.  
  271.  
  272. (************************************************************************)
  273.                     PROCEDURE UnChar(ch: CHAR): CARDINAL;
  274. (************************************************************************)
  275. BEGIN
  276.     IF ORD(ch) >= 32
  277.     THEN
  278.         RETURN ORD(ch) - 32;
  279.     ELSE
  280.         RETURN 0;
  281.     END;
  282. END UnChar;
  283.  
  284.  
  285. (************************************************************************)
  286.                         PROCEDURE Ctl(ch: CHAR): CHAR;
  287. (************************************************************************)
  288. BEGIN
  289.     RETURN CHAR(BitXOR(CARDINAL(ch),64));
  290. END Ctl;
  291.  
  292.  
  293. (************************************************************************)
  294.              PROCEDURE IncPackNum(packNum: CARDINAL): CARDINAL;
  295. (************************************************************************)
  296. BEGIN
  297.     RETURN (packNum + 1) MOD 64;
  298. END IncPackNum;
  299.  
  300.  
  301. (************************************************************************)
  302.              PROCEDURE DecPackNum(packNum: CARDINAL): CARDINAL;
  303. (************************************************************************)
  304. BEGIN
  305.     IF packNum = 0
  306.     THEN
  307.         RETURN 63;
  308.     ELSE
  309.  
  310.         RETURN packNum - 1;
  311.     END;
  312. END DecPackNum;
  313.  
  314.  
  315. (************************************************************************)
  316.                         PROCEDURE DispInit;
  317. (************************************************************************)
  318. (* Initialize the Status Screen                                         *)
  319.  
  320. BEGIN
  321.     ClrScr;
  322.     SetPos(3,9); Terminal.WriteString("File name:");
  323.     SetPos(4,0); Terminal.WriteString("kBytes transferred:");
  324.     SetPos(6,1); Terminal.WriteString("Number of packets:");
  325.     SetPos(7,1); Terminal.WriteString("Number of retries:");
  326.     SetPos(9,6); Terminal.WriteString("Last message:");
  327.  
  328.     numOfTries := 0;
  329.     numOfPacks := 0;
  330.  
  331.     IF LDebug
  332.     THEN
  333.         SetPos(11,0); Terminal.WriteString("Receive Packet:");
  334.         SetPos(19,0); Terminal.WriteString("Send Packet:");
  335.     END;
  336. END DispInit;
  337.  
  338.  
  339. (************************************************************************)
  340.                         PROCEDURE DispTry;
  341. (************************************************************************)
  342. (* Display total number of retries                                      *)
  343.  
  344. BEGIN
  345.     INC(numOfTries);
  346.     SetPos(7,25);
  347.     ClearChars(5);
  348.     WriteC(numOfTries,5);
  349. END DispTry;
  350.  
  351.  
  352. (************************************************************************)
  353.                         PROCEDURE DispPack;
  354. (************************************************************************)
  355. (* Display total number of packets                                      *)
  356.  
  357. BEGIN
  358.     INC(numOfPacks);
  359.     SetPos(6,25);
  360.     ClearChars(5);
  361.     WriteC(numOfPacks,5);
  362. END DispPack;
  363.  
  364.  
  365. (************************************************************************)
  366.                PROCEDURE DispFile(fileName: ARRAY OF CHAR);
  367. (************************************************************************)
  368. (* Display name of file                                                 *)
  369.  
  370. BEGIN
  371.     SetPos(3,25);
  372.     Terminal.WriteString(fileName);
  373. END DispFile;
  374.  
  375.  
  376. (************************************************************************)
  377.                PROCEDURE DispMsg(message: ARRAY OF CHAR);
  378. (************************************************************************)
  379. (* Display a message in the status screen                               *)
  380.  
  381. BEGIN
  382.     SetPos(9,25);
  383.     ClearChars(54);
  384.     Terminal.WriteString(message);
  385. END DispMsg;
  386.  
  387. (************************************************************************)
  388.   PROCEDURE StringToCard(str: ARRAY OF CHAR; VAR num: CARDINAL): BOOLEAN;
  389. (************************************************************************)
  390. (* convert a numeric string to cardinal. Return TRUE if successful *)
  391. VAR
  392.     i : CARDINAL;
  393.  
  394. BEGIN
  395.     num := 0;
  396.     i   := 0;
  397.  
  398.     REPEAT
  399.         IF (str[i] >= "0") AND (str[i] <= "9")
  400.         THEN
  401.             num := 10 * num + ORD(str[i]) - ORD("0");
  402.             i := i + 1;
  403.         ELSE
  404.             num := 0;
  405.             RETURN FALSE;
  406.         END;
  407.     UNTIL (i > HIGH(str)) OR (str[i] = 0C);
  408.  
  409.     RETURN TRUE;
  410. END StringToCard;
  411.  
  412.  
  413. (************************************************************************)
  414.        PROCEDURE CardToString(num: CARDINAL; VAR str: ARRAY OF CHAR);
  415. (************************************************************************)
  416. VAR
  417.     i      : CARDINAL;
  418.     j      : CARDINAL;
  419.     revStr : ARRAY [0..31] OF CHAR;
  420.  
  421. BEGIN
  422.     i := 0;
  423.  
  424.     WHILE num > 0 DO
  425.         revStr[i] := CHR(num MOD 10 + ORD("0"));
  426.         num := num DIV 10;
  427.         INC(i);
  428.     END;
  429.  
  430.     DEC(i);
  431.  
  432.     FOR j := 0 TO i DO
  433.         str[j] := revStr[i-j];
  434.     END;
  435.  
  436.     str[i+1] := 0C;
  437.  
  438. END CardToString;
  439.  
  440. END KermMisc.
  441.