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