HEX.ob07 1.9 KB

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