forked from KolibriOS/kolibrios
127 lines
2.4 KiB
Plaintext
127 lines
2.4 KiB
Plaintext
|
(*
|
||
|
BSD 2-Clause License
|
||
|
|
||
|
Copyright (c) 2020, Anton Krotov
|
||
|
All rights reserved.
|
||
|
*)
|
||
|
|
||
|
MODULE HEX;
|
||
|
|
||
|
IMPORT FILES, WRITER, CHL := CHUNKLISTS;
|
||
|
|
||
|
|
||
|
PROCEDURE hexdgt (n: BYTE): BYTE;
|
||
|
BEGIN
|
||
|
IF n < 10 THEN
|
||
|
n := n + ORD("0")
|
||
|
ELSE
|
||
|
n := n - 10 + ORD("A")
|
||
|
END
|
||
|
|
||
|
RETURN n
|
||
|
END hexdgt;
|
||
|
|
||
|
|
||
|
PROCEDURE Byte (file: FILES.FILE; byte: BYTE);
|
||
|
BEGIN
|
||
|
WRITER.WriteByte(file, hexdgt(byte DIV 16));
|
||
|
WRITER.WriteByte(file, hexdgt(byte MOD 16));
|
||
|
INC(file.chksum, byte);
|
||
|
END Byte;
|
||
|
|
||
|
|
||
|
PROCEDURE NewLine (file: FILES.FILE);
|
||
|
BEGIN
|
||
|
Byte(file, (-file.chksum) MOD 256);
|
||
|
file.chksum := 0;
|
||
|
WRITER.WriteByte(file, 0DH);
|
||
|
WRITER.WriteByte(file, 0AH)
|
||
|
END NewLine;
|
||
|
|
||
|
|
||
|
PROCEDURE StartCode (file: FILES.FILE);
|
||
|
BEGIN
|
||
|
WRITER.WriteByte(file, ORD(":"));
|
||
|
file.chksum := 0
|
||
|
END StartCode;
|
||
|
|
||
|
|
||
|
PROCEDURE Data* (file: FILES.FILE; mem: ARRAY OF BYTE; idx, cnt: INTEGER);
|
||
|
VAR
|
||
|
i, len: INTEGER;
|
||
|
|
||
|
BEGIN
|
||
|
WHILE cnt > 0 DO
|
||
|
len := MIN(cnt, 16);
|
||
|
StartCode(file);
|
||
|
Byte(file, len);
|
||
|
Byte(file, idx DIV 256);
|
||
|
Byte(file, idx MOD 256);
|
||
|
Byte(file, 0);
|
||
|
FOR i := 1 TO len DO
|
||
|
Byte(file, mem[idx]);
|
||
|
INC(idx)
|
||
|
END;
|
||
|
DEC(cnt, len);
|
||
|
NewLine(file)
|
||
|
END
|
||
|
END Data;
|
||
|
|
||
|
|
||
|
PROCEDURE ExtLA* (file: FILES.FILE; LA: INTEGER);
|
||
|
BEGIN
|
||
|
ASSERT((0 <= LA) & (LA <= 0FFFFH));
|
||
|
StartCode(file);
|
||
|
Byte(file, 2);
|
||
|
Byte(file, 0);
|
||
|
Byte(file, 0);
|
||
|
Byte(file, 4);
|
||
|
Byte(file, LA DIV 256);
|
||
|
Byte(file, LA MOD 256);
|
||
|
NewLine(file)
|
||
|
END ExtLA;
|
||
|
|
||
|
|
||
|
PROCEDURE Data2* (file: FILES.FILE; mem: CHL.BYTELIST; idx, cnt, LA: INTEGER);
|
||
|
VAR
|
||
|
i, len, offset: INTEGER;
|
||
|
|
||
|
BEGIN
|
||
|
ExtLA(file, LA);
|
||
|
offset := 0;
|
||
|
WHILE cnt > 0 DO
|
||
|
ASSERT(offset <= 65536);
|
||
|
IF offset = 65536 THEN
|
||
|
INC(LA);
|
||
|
ExtLA(file, LA);
|
||
|
offset := 0
|
||
|
END;
|
||
|
len := MIN(cnt, 16);
|
||
|
StartCode(file);
|
||
|
Byte(file, len);
|
||
|
Byte(file, offset DIV 256);
|
||
|
Byte(file, offset MOD 256);
|
||
|
Byte(file, 0);
|
||
|
FOR i := 1 TO len DO
|
||
|
Byte(file, CHL.GetByte(mem, idx));
|
||
|
INC(idx);
|
||
|
INC(offset)
|
||
|
END;
|
||
|
DEC(cnt, len);
|
||
|
NewLine(file)
|
||
|
END
|
||
|
END Data2;
|
||
|
|
||
|
|
||
|
PROCEDURE End* (file: FILES.FILE);
|
||
|
BEGIN
|
||
|
StartCode(file);
|
||
|
Byte(file, 0);
|
||
|
Byte(file, 0);
|
||
|
Byte(file, 0);
|
||
|
Byte(file, 1);
|
||
|
NewLine(file)
|
||
|
END End;
|
||
|
|
||
|
|
||
|
END HEX.
|