home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
037.lha
/
DU
/
MyType.mod
< prev
next >
Wrap
Text File
|
1987-05-16
|
8KB
|
305 lines
IMPLEMENTATION MODULE MyType;
(*$S-*)(*$T-*)(*$A+*)
(*
Written by Greg Browne from ideas in duIII.c - many thanks to
Chris Nicotra, Dave Jobusch, Ed Alford, and many others whose
names I have not seen on the source files who have worked on
the development and extension of that fine directory utility program.
PURPOSE A self-contained, IMPORTable pair of procedures to allow
a screen display - or printer copy - in Hex or ASCII of
any disk files.
CHANGES 1/24/87 Built original.
4/25/87 Added Backspace for Restart option
*)
FROM SYSTEM IMPORT ADR,ADDRESS,CODE;
FROM Strings IMPORT InitStringModule,Concat,Assign;
FROM DOSFiles IMPORT FileHandle,ModeOldFile,ModeNewFile,Close,
Open,Read,Write,Lock,Unlock,AccessRead,
FileLock;
FROM DOSLibrary IMPORT DOSName,DOSBase;
FROM Libraries IMPORT OpenLibrary,CloseLibrary;
(*COMMENTS*)
(* This module tries to open the DOSLibrary for use in case it is not open.
IT DOES NOT CLOSE IT. The user is left with that chore. *)
(* All constants and variables are internal. Nothing but PROCEDURES
are available to the user. *)
CONST
dot = ".";
VAR
HexCh : ARRAY [0..16] OF CHAR;
Diskhandle,
Displayhandle : FileHandle;
fp : ARRAY[0..3] OF CARDINAL;
c : CHAR;
len,len2,
i,
top,
linecount,
nextout : CARDINAL;
Result : LONGINT;
OnScreen,
Quit : BOOLEAN;
t2 : ARRAY[1..20] OF CHAR;
iobuffer : ARRAY[0..512] OF CHAR;
nam : ARRAY[0..60] OF CHAR;
pfeed : CHAR;
Hbuf : ARRAY[0..1] OF CHAR;
(* INTERNAL PROCEDURES - NOT IN .def FILE AND NOT IMPORTABLE *)
(* Following are CODE equivalents of pause messages. Done this way
to save space over variables and allow static inclusion of <ESC>
which a constant won't do.
*)
(*$P-*)
PROCEDURE expl;
BEGIN
CODE(1B5BH,3333H,6D3CH,4253H,3E1BH,5B32H,6D3DH,7265H);
CODE(7769H,6E64H,201BH,5B33H,336DH,3C43H,523EH,1B5BH);
CODE(326DH,3D6CH,696EH,6520H,1B5BH,3333H,6D3CH,5350H);
CODE(4143H,453EH,1B5BH,326DH,3D70H,6167H,6520H,1B5BH);
CODE(3333H,6D3CH,4553H,433EH,1B5BH,326DH,3D61H,626FH);
CODE(7274H,201BH,5B30H,6D00H);
END expl;
(* above is code for this with added color change stuff *)
(* <BS>=rewind <CR>=line <SPACE>=page <ESC>=abort "; LENGTH = 87*)
(*$P-*)
PROCEDURE wipe;
BEGIN
CODE(0D20H);
CODE(2020H,2020H,2020H,2020H,2020H,2020H,2020H,2020H);
CODE(2020H,2020H,2020H,2020H,2020H,2020H,2020H,2020H);
CODE(2020H,2020H,2020H,2020H,2020H,2020H,2020H,2020H);
CODE(2020H,2020H,2020H,2020H,2020H,2020H,2020H,2020H);
CODE(2020H,0D00H);
END wipe;
(* above is code for <CR> + 67 spaces + <CR> LENGTH = 69*)
(*$P-*)
PROCEDURE last;
BEGIN
CODE(1B5BH,3333H,6D44H,6F6EH,6521H,2050H);
CODE(7265H,7373H,203CH,5350H,4143H,453EH);
CODE(201BH,5B30H,6D00H);
END last;
(* above is code for this with color changes *)
(* Done! Press <SPACE> LENGTH = 29 *)
(*$P+ *)
PROCEDURE MyOpen(VAR ufn:ARRAY OF CHAR):BOOLEAN;
VAR i:CARDINAL;lk:FileLock;
BEGIN
Assign(nam,ufn);
linecount := 0;
Quit := FALSE;
Diskhandle := Open(ufn,ModeOldFile);
IF Diskhandle = 0 THEN
RETURN FALSE
ELSE
IF OnScreen THEN
Concat("RAW:0/0/640/200/Listing of: ",nam,iobuffer);
ELSE
iobuffer := "PRT:"
END;
Displayhandle := Open(iobuffer,ModeNewFile);
IF Displayhandle = 0 THEN
Close(Diskhandle); (* if here - Disk is open *)
RETURN FALSE
ELSE
Quit := FALSE;
RETURN TRUE
END
END
END MyOpen;
(* read (with wait) single character from 'f' (here it is keyboard) *)
PROCEDURE ReadChar(f:FileHandle;VAR c:CHAR);
BEGIN
Result := Read(f,ADR(c),1);
IF Result < 1 THEN c := 0C END
END ReadChar;
(* Press Space message and wait for continue-nextline-cancel *)
PROCEDURE Pause;
BEGIN
IF OnScreen THEN
linecount := 1;
Result := Write(Displayhandle,ADDRESS(expl),LONGCARD(87));
REPEAT
ReadChar(Displayhandle,c);
IF c = CHR(27) THEN
Quit := TRUE;
ELSIF c = CHR(13) THEN
linecount := 21
ELSIF (c = 10C) THEN
Close(Diskhandle);
Diskhandle := Open(nam,ModeOldFile);
len2 := 1000;
END
UNTIL (Quit) OR (c = 15C) OR (c = 40C) OR (c = 10C);
Result :=Write(Displayhandle,ADDRESS(wipe),LONGCARD(69));
END;
END Pause;
(* End - press space message & wait for space *)
PROCEDURE Finish;
BEGIN
IF OnScreen THEN
Result := Write(Displayhandle,ADDRESS(last),LONGCARD(29));
REPEAT ReadChar(Displayhandle,c) UNTIL (c = 40C);
ELSE
Result := Write(Displayhandle,ADR(pfeed),LONGCARD(1))
END;
END Finish;
(* Closes the disk file and screen (or printer) - NOT DOS Library *)
PROCEDURE CloseTheFile;
BEGIN
IF (Displayhandle <> 0) THEN Close(Displayhandle) END;
IF (Diskhandle <> 0) THEN Close(Diskhandle) END;
END CloseTheFile;
(* internal procedure for the HexDisplay *)
(* Converts a character to a 3 byte (null terminated 3d byte) string *)
(* in hex format with leading '0' *)
PROCEDURE ToHex(c:CHAR);
VAR v:CARDINAL;
BEGIN
v := CARDINAL(ORD(c));
Hbuf[0] := HexCh[v DIV 16];
Hbuf[1] := HexCh[v MOD 16];
END ToHex;
(* kludge to quickly convert a 4 byte (artificial LONGCARD) thingy into
an increasing file position - used 4 byte since very big files should
really be taken into account - as if anyone is going to dump a file
that long - oh, well, it will address it properly if they do *)
PROCEDURE MakeHexAddr;
VAR i,j:CARDINAL;
BEGIN
j := 7;
FOR i := 0 TO 3 DO
ToHex(CHR(fp[i]));
iobuffer[j] := Hbuf[1];iobuffer[j-1] := Hbuf[0];
DEC(j,2);
END;
INC(fp[0],16);
FOR i := 0 TO 2 DO
IF fp[i] = 256 THEN INC(fp[i+1]); fp[i] := 0 END;
END;
IF fp[3] = 256 THEN fp[i] := 0 END;
END MakeHexAddr;
(* FINALLY THE FIRST IMPORTABLE PROCEDURE *)
(* SET ToScreen FALSE to go to PRT: device *)
PROCEDURE DisplayASCII(VAR filnam:ARRAY OF CHAR;ToScreen:BOOLEAN);
BEGIN
OnScreen := ToScreen;
IF MyOpen(filnam) THEN
REPEAT
len := CARDINAL(Read(Diskhandle,ADR(iobuffer),512));
len2 := 0;
WHILE (NOT Quit) AND (len2 < len) DO
i := len2;
WHILE (i < 511) AND (iobuffer[i] <> 12C) DO INC(i) END;
Result := Write(Displayhandle,ADR(iobuffer[len2]),LONGCARD(i-len2+1));
len2 := i + 1;
INC(linecount);
IF (linecount > 21) AND (iobuffer[i] = 12C) THEN Pause END;
END;
UNTIL (len <> 512) OR (Quit);
Finish;
END; (* IF NOT Quit *)
CloseTheFile;
END DisplayASCII;
PROCEDURE DisplayHex(VAR filnam:ARRAY OF CHAR;ToScreen:BOOLEAN);
VAR ad:ARRAY[0..7] OF CHAR;
BEGIN
OnScreen := ToScreen;
IF MyOpen(filnam) THEN
FOR i := 0 TO 3 DO fp[i] := 0 END;
REPEAT
FOR i := 0 TO 70 DO iobuffer[i] := 40C END;
top := CARDINAL(Read(Diskhandle,ADR(t2),16));
nextout := 10;
IF top > 0 THEN
FOR i := 1 TO top DO
ToHex(t2[i]);
iobuffer[nextout] := Hbuf[0];
iobuffer[nextout+1] := Hbuf[1];
INC(nextout,2);
IF (i MOD 4)=0 THEN INC(nextout) END;
END;
nextout := 48; (* 39 IF i MOD 8 is left in *)
FOR i := 1 TO top DO
IF (t2[i]>177C) OR (t2[i]<40C) THEN
iobuffer[nextout] := dot
ELSE
iobuffer[nextout] := t2[i]
END;
INC(nextout);
END;
iobuffer[69] := 12C;
iobuffer[70] := 0C;
MakeHexAddr;
Result := Write(Displayhandle,ADR(iobuffer),70);
INC(linecount);
IF (linecount > 21) THEN
Pause;
IF (c = 10C) THEN
FOR i := 0 TO 3 DO
fp[i] := 0
END
END;
END;
END; (* IF top > 0 *)
UNTIL (top < 16) OR (Quit);
Finish
END;
CloseTheFile
END DisplayHex;
(* Initialization items *)
BEGIN
IF DOSBase = 0 THEN DOSBase := OpenLibrary(DOSName,0) END;
InitStringModule;
HexCh := "0123456789ABCDEF";
pfeed := 14C;
END MyType.