Subversion Repositories Kolibri OS

Rev

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.