Subversion Repositories Kolibri OS

Rev

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.