Rev 8859 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
9177 | akron1 | 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 | |||
7983 | leency | 117 | END HEX.=>=>=> |