Subversion Repositories Kolibri OS

Rev

Rev 7983 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7983 Rev 8097
Line 5... Line 5...
5
    All rights reserved.
5
    All rights reserved.
6
*)
6
*)
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
MODULE HEX;
8
MODULE HEX;
Line 9... Line -...
9
 
-
 
10
IMPORT FILES, WRITER, CHL := CHUNKLISTS;
9
 
11
 
-
 
12
 
-
 
13
PROCEDURE hexdgt (n: BYTE): BYTE;
-
 
14
BEGIN
-
 
15
    IF n < 10 THEN
-
 
Line 16... Line 10...
16
        n := n + ORD("0")
10
IMPORT WRITER, CHL := CHUNKLISTS, UTILS;
17
    ELSE
-
 
Line 18... Line 11...
18
        n := n - 10 + ORD("A")
11
 
19
    END
12
 
20
 
13
VAR
21
    RETURN n
14
 
22
END hexdgt;
15
    chksum: INTEGER;
23
 
16
 
Line 24... Line 17...
24
 
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);
25
PROCEDURE Byte (file: FILES.FILE; byte: BYTE);
27
BEGIN
26
BEGIN
28
    Byte(a);
27
    WRITER.WriteByte(file, hexdgt(byte DIV 16));
29
    Byte(b);
28
    WRITER.WriteByte(file, hexdgt(byte MOD 16));
30
    Byte(c);
29
    INC(file.chksum, byte);
31
    Byte(d)
30
END Byte;
32
END Byte4;
Line 31... Line 33...
31
 
33
 
32
 
34
 
33
PROCEDURE NewLine (file: FILES.FILE);
35
PROCEDURE NewLine;
34
BEGIN
36
BEGIN
35
    Byte(file, (-file.chksum) MOD 256);
37
    Byte((-chksum) MOD 256);
Line 36... Line 38...
36
    file.chksum := 0;
38
    chksum := 0;
37
    WRITER.WriteByte(file, 0DH);
39
    WRITER.WriteByte(0DH);
38
    WRITER.WriteByte(file, 0AH)
40
    WRITER.WriteByte(0AH)
Line 39... Line 41...
39
END NewLine;
41
END NewLine;
40
 
42
 
41
 
43
 
42
PROCEDURE StartCode (file: FILES.FILE);
44
PROCEDURE StartCode;
43
BEGIN
-
 
44
    WRITER.WriteByte(file, ORD(":"));
-
 
45
    file.chksum := 0
45
BEGIN
46
END StartCode;
-
 
47
 
46
    WRITER.WriteByte(ORD(":"));
48
 
47
    chksum := 0
49
PROCEDURE Data* (file: FILES.FILE; mem: ARRAY OF BYTE; idx, cnt: INTEGER);
48
END StartCode;
50
VAR
49
 
51
    i, len: INTEGER;
50
 
52
 
51
PROCEDURE Data* (mem: ARRAY OF BYTE; idx, cnt: INTEGER);
53
BEGIN
52
VAR
54
    WHILE cnt > 0 DO
53
    i, len: INTEGER;
Line 55... Line 54...
55
        len := MIN(cnt, 16);
54
 
56
        StartCode(file);
55
BEGIN
57
        Byte(file, len);
56
    WHILE cnt > 0 DO
58
        Byte(file, idx DIV 256);
57
        len := MIN(cnt, 16);
59
        Byte(file, idx MOD 256);
-
 
60
        Byte(file, 0);
-
 
61
        FOR i := 1 TO len DO
-
 
62
            Byte(file, mem[idx]);
58
        StartCode;
63
            INC(idx)
59
        Byte4(len, idx DIV 256, idx MOD 256, 0);
64
        END;
60
        FOR i := 1 TO len DO
65
        DEC(cnt, len);
61
            Byte(mem[idx]);
66
        NewLine(file)
62
            INC(idx)
Line 67... Line 63...
67
    END
63
        END;
68
END Data;
64
        DEC(cnt, len);
69
 
65
        NewLine
Line 70... Line 66...
70
 
66
    END
71
PROCEDURE ExtLA* (file: FILES.FILE; LA: INTEGER);
67
END Data;
72
BEGIN
68
 
73
    ASSERT((0 <= LA) & (LA <= 0FFFFH));
69
 
74
    StartCode(file);
70
PROCEDURE ExtLA* (LA: INTEGER);
75
    Byte(file, 2);
71
BEGIN
76
    Byte(file, 0);
72
    ASSERT((0 <= LA) & (LA <= 0FFFFH));
77
    Byte(file, 0);
73
    StartCode;
78
    Byte(file, 4);
74
    Byte4(2, 0, 0, 4);
79
    Byte(file, LA DIV 256);
75
    Byte(LA DIV 256);
80
    Byte(file, LA MOD 256);
76
    Byte(LA MOD 256);
81
    NewLine(file)
77
    NewLine
82
END ExtLA;
-
 
83
 
-
 
84
 
78
END ExtLA;
85
PROCEDURE Data2* (file: FILES.FILE; mem: CHL.BYTELIST; idx, cnt, LA: INTEGER);
-
 
86
VAR
79
 
87
    i, len, offset: INTEGER;
80
 
88
 
81
PROCEDURE Data2* (mem: CHL.BYTELIST; idx, cnt, LA: INTEGER);
89
BEGIN
82
VAR
90
    ExtLA(file, LA);
83
    i, len, offset: INTEGER;
91
    offset := 0;
84
 
92
    WHILE cnt > 0 DO
85
BEGIN
93
        ASSERT(offset <= 65536);
86
    ExtLA(LA);
94
        IF offset = 65536 THEN
87
    offset := 0;
Line 95... Line 88...
95
            INC(LA);
88
    WHILE cnt > 0 DO
96
            ExtLA(file, LA);
89
        ASSERT(offset <= 65536);
97
            offset := 0
90
        IF offset = 65536 THEN
98
        END;
91
            INC(LA);
99
        len := MIN(cnt, 16);
-
 
100
        StartCode(file);
-
 
101
        Byte(file, len);
-
 
102
        Byte(file, offset DIV 256);
92
            ExtLA(LA);
103
        Byte(file, offset MOD 256);
93
            offset := 0
Line 104... Line 94...
104
        Byte(file, 0);
94
        END;
105
        FOR i := 1 TO len DO
95
        len := MIN(cnt, 16);