HEX.ob07 2.1 KB

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