Subversion Repositories Kolibri OS

Rev

Rev 8859 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. (*
  2.     BSD 2-Clause License
  3.  
  4.     Copyright (c) 2020, Anton Krotov
  5.     All rights reserved.
  6. *)
  7.  
  8. MODULE HEX;
  9.  
  10. IMPORT WRITER, CHL := CHUNKLISTS, UTILS;
  11.  
  12.  
  13. VAR
  14.  
  15.     chksum: INTEGER;
  16.  
  17.  
  18. PROCEDURE Byte (byte: BYTE);
  19. BEGIN
  20.     WRITER.WriteByte(UTILS.hexdgt(byte DIV 16));
  21.     WRITER.WriteByte(UTILS.hexdgt(byte MOD 16));
  22.     INC(chksum, byte)
  23. END Byte;
  24.  
  25.  
  26. PROCEDURE Byte4 (a, b, c, d: BYTE);
  27. BEGIN
  28.     Byte(a);
  29.     Byte(b);
  30.     Byte(c);
  31.     Byte(d)
  32. END Byte4;
  33.  
  34.  
  35. PROCEDURE NewLine;
  36. BEGIN
  37.     Byte((-chksum) MOD 256);
  38.     chksum := 0;
  39.     WRITER.WriteByte(0DH);
  40.     WRITER.WriteByte(0AH)
  41. END NewLine;
  42.  
  43.  
  44. PROCEDURE StartCode;
  45. BEGIN
  46.     WRITER.WriteByte(ORD(":"));
  47.     chksum := 0
  48. END StartCode;
  49.  
  50.  
  51. PROCEDURE Data* (mem: ARRAY OF BYTE; idx, cnt: INTEGER);
  52. VAR
  53.     i, len: INTEGER;
  54.  
  55. BEGIN
  56.     WHILE cnt > 0 DO
  57.         len := MIN(cnt, 16);
  58.         StartCode;
  59.         Byte4(len, idx DIV 256, idx MOD 256, 0);
  60.         FOR i := 1 TO len DO
  61.             Byte(mem[idx]);
  62.             INC(idx)
  63.         END;
  64.         DEC(cnt, len);
  65.         NewLine
  66.     END
  67. END Data;
  68.  
  69.  
  70. PROCEDURE ExtLA* (LA: INTEGER);
  71. BEGIN
  72.     ASSERT((0 <= LA) & (LA <= 0FFFFH));
  73.     StartCode;
  74.     Byte4(2, 0, 0, 4);
  75.     Byte(LA DIV 256);
  76.     Byte(LA MOD 256);
  77.     NewLine
  78. END ExtLA;
  79.  
  80.  
  81. PROCEDURE Data2* (mem: CHL.BYTELIST; idx, cnt, LA: INTEGER);
  82. VAR
  83.     i, len, offset: INTEGER;
  84.  
  85. BEGIN
  86.     ExtLA(LA);
  87.     offset := 0;
  88.     WHILE cnt > 0 DO
  89.         ASSERT(offset <= 65536);
  90.         IF offset = 65536 THEN
  91.             INC(LA);
  92.             ExtLA(LA);
  93.             offset := 0
  94.         END;
  95.         len := MIN(cnt, 16);
  96.         StartCode;
  97.         Byte4(len, offset DIV 256, offset MOD 256, 0);
  98.         FOR i := 1 TO len DO
  99.             Byte(CHL.GetByte(mem, idx));
  100.             INC(idx);
  101.             INC(offset)
  102.         END;
  103.         DEC(cnt, len);
  104.         NewLine
  105.     END
  106. END Data2;
  107.  
  108.  
  109. PROCEDURE End*;
  110. BEGIN
  111.     StartCode;
  112.     Byte4(0, 0, 0, 1);
  113.     NewLine
  114. END End;
  115.  
  116.  
  117. END HEX.