|
|
DataMuseum.dkPresents historical artifacts from the history of: CR80 Hard and Floppy Disks |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CR80 Hard and Floppy Disks Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 6400 (0x1900)
Types: TextFile
Names: »IO«
└─⟦8c5bcce80⟧ Bits:30005186 8" CR80 Floppy CR80FD_0183 ( CR/D/0436 PASCAL UTILITIES HPH Date 790524 Copy of CR/D/0958 )
└─⟦12c79cc2c⟧
└─⟦this⟧ »BLK.IO«
└─⟦9975dd352⟧ Bits:30005088 8" CR80 Floppy CR80FD_0043 ( CR/D/1032 PROMGEN (HBA) 790917 HBA PROMGEN BACKUP )
└─⟦69b0db55a⟧
└─⟦this⟧ »HBA.IO«
"PAGE"\f
"***********************
* PASCAL I/O PACKAGE *
***********************"
PROCEDURE XXXERROR(T: TEXT);
VAR I:INTEGER;
BEGIN
DISPLAY(NL);
DISPLAY('?');
DISPLAY('?');
I:=1;
WHILE T[I]<>NULL DO
BEGIN
DISPLAY(T[I]);
I:=SUCC(I);
END;
DISPLAY(NL);
HALT;
END "XXXERROR";
"OPEN AND CLOSE STREAMS"
"----------------------"
PROCEDURE OPEN(VAR S:STREAM; NAME:TEXT; DIR:DIRECTION);
CONST OC='OC ';
VAR ID:IDENTIFIER; CTRL:INTEGER; ARG:ARGTYPE;
BEGIN
IF NOT (DIR IN [INPUT,OUTPUT]) THEN
XXXERROR('ILLEGAL DIRECTION(:0:)');
FOR CTRL:=1 TO IDLENGTH DO
ID[CTRL]:=' ';
CTRL:=1;
WHILE (NAME[CTRL]<>'(:0:)') AND
(CTRL<SUCC(IDLENGTH)) DO
BEGIN
ID[CTRL]:=NAME[CTRL];
CTRL:=SUCC(CTRL);
END;
IF ID=OC THEN
IF DIR=INPUT
THEN S:=INOC
ELSE S:=OUTOC
ELSE
BEGIN
ARG.TAG:=IDTYPE;
ARG.ID:=ID;
IF DIR=INPUT THEN
BEGIN
S:=INFILE;
WRITEARG(INP,ARG);
END
ELSE
BEGIN
S:=OUTFILE;
WRITEARG(OUT,ARG);
END;
END;
END "OPEN";
PROCEDURE CLOSE(S:STREAM);
VAR ARG:ARGTYPE;
BEGIN
CASE S OF
INOC,OUTOC:
;
INFILE:
READARG(INP,ARG);
OUTFILE:
READARG(OUT,ARG)
END "CASE";
END "CLOSE";
"I/O OF BYTES (CHARACTERS)"
"-------------------------"
PROCEDURE OUTBYTE(S:STREAM; B:UNIV CHAR);
BEGIN
CASE S OF
OUTOC:
DISPLAY(B);
OUTFILE:
WRITE(B);
INOC,INFILE:
XXXERROR('OUTPUT TO AN INPUT STREAM(:0:)')
END "CASE";
END "OUTBYTE";
PROCEDURE INBYTE(S:STREAM; VAR B:UNIV CHAR);
BEGIN
CASE S OF
INOC:
ACCEPT(B);
INFILE:
READ(B);
OUTOC,OUTFILE:
XXXERROR('INPUT FROM AN OUTPUT STREAM(:0:)')
END "CASE";
END "INBYTE";
PROCEDURE OUTNL(S:STREAM);
BEGIN
OUTBYTE(S,NL);
END "OUTNL";
PROCEDURE BACKSPACE(S:STREAM);
BEGIN
" UNIMPLEMENTED "
END "BACKSPACE";
"I/O OF TEXT STRINGS"
"-------------------"
PROCEDURE INLINE(S:STREAM; VAR T:TEXT);
VAR CH:CHAR; I:INTEGER;
BEGIN
I:=1;
REPEAT
INBYTE(S,CH);
T[I]:=CH;
I:=SUCC(I);
UNTIL (CH=NL) OR (CH=EM) OR (I>=TEXT_SIZE);
T[I]:=NULL;
END "INLINE";
PROCEDURE OUTBYTES(S:STREAM; B:UNIV CHAR; COUNT:INTEGER);
VAR CTRL:INTEGER;
BEGIN
FOR CTRL:=1 TO COUNT DO
OUTBYTE(S,B);
END "OUTBYTES";
PROCEDURE OUTSTRING(S:STREAM; T:TEXT);
VAR DONE:BOOLEAN; I:INTEGER;
BEGIN
I:=1; DONE:=FALSE;
WHILE NOT DONE DO
IF T[I]<>NULL THEN
IF I<=TEXT_SIZE THEN
BEGIN
OUTBYTE(S,T[I]);
I:=SUCC(I);
END
ELSE DONE:=TRUE
ELSE DONE:=TRUE;
END "OUTSTRING";
PROCEDURE OUTTEXT(S:STREAM; T:TEXT; SIZE:INTEGER);
VAR CTRL:INTEGER;
BEGIN
IF SIZE>TEXT_SIZE THEN
XXXERROR('TEXT TOO LARGE(:0:)');
FOR CTRL:=1 TO SIZE DO
OUTBYTE(S,T[CTRL]);
END "OUTTEXT";
"I/O OF INTEGERS"
"---------------"
FUNCTION BIN_TO_ASCII(INT:INTEGER):CHAR;
BEGIN
IF INT<10
THEN BIN_TO_ASCII:=CHR(INT+ORD('0'))
ELSE BIN_TO_ASCII:=CHR(INT-10+ORD('A'));
END "BIN_TO_ASCII";
PROCEDURE OUTHEXA(S:STREAM; INT:UNIV INTEGER; WIDTH:INTEGER);
VAR T:TEXT; CTRL:INTEGER; TEMP:INTEGER;
BEGIN
FOR CTRL:=1 TO TEXT_SIZE DO
T[CTRL]:=SP;
TEMP:=INT;
FOR CTRL:=1 TO 4 DO
BEGIN
T[CTRL]:=BIN_TO_ASCII(GETBITS(TEMP,3,4));
TEMP:=RIGHTSHIFT(TEMP,4);
END;
T[5]:='#';
IF WIDTH<5 THEN
FOR CTRL:=1 TO WIDTH DO
T[CTRL]:='*';
FOR CTRL:=WIDTH DOWNTO 1 DO
OUTBYTE(S,T[CTRL]);
END "OUTHEXA";
PROCEDURE OUTINTEGER(S:STREAM; INT:UNIV INTEGER; WIDTH:INTEGER);
VAR T:TEXT; CTRL:INTEGER;
NEGATIVE:BOOLEAN; TEMP:INTEGER;
BEGIN
FOR CTRL:=1 TO TEXT_SIZE DO
T[CTRL]:=SP;
IF INT=#8000 THEN
BEGIN
"HANDLE SPECIAL CASE"
END
ELSE
BEGIN
TEMP:=INT;
NEGATIVE:=TEMP<0;
IF NEGATIVE THEN TEMP:=-TEMP;
CTRL:=1;
REPEAT
T[CTRL]:=BIN_TO_ASCII(TEMP MOD 10);
TEMP:=TEMP DIV 10;
CTRL:=SUCC(CTRL);
UNTIL TEMP=0;
IF NEGATIVE
THEN T[CTRL]:='-'
ELSE CTRL:=PRED(CTRL);
END;
IF WIDTH<CTRL THEN
FOR CTRL:=1 TO WIDTH DO
T[CTRL]:='*';
FOR CTRL:= WIDTH DOWNTO 1 DO
OUTBYTE(S,T[CTRL]);
END "OUTINTEGER";
FUNCTION XXXDIGIT(CH:CHAR):BOOLEAN;
BEGIN
XXXDIGIT:=('0'<=CH) AND (CH<='9');
END "XXXDIGIT";
FUNCTION XXXHEXADIGIT(CH:CHAR):BOOLEAN;
BEGIN
XXXHEXADIGIT:=XXXDIGIT(CH) OR
(('A'<=CH) AND (CH<='F'));
END "HEXADIGIT";
FUNCTION ASCII_TO_BIN(CH:CHAR):INTEGER;
BEGIN
IF XXXDIGIT(CH) THEN
ASCII_TO_BIN:=ORD(CH)-ORD('0')
ELSE IF XXXHEXADIGIT(CH)
THEN ASCII_TO_BIN:= ORD(CH)-ORD('A')+10
ELSE XXXERROR('ILLEGAL CHARACTER CONVERSION(:0:)');
END "ASCII_TO_BIN";
PROCEDURE INHEXA(S:STREAM; VAR INT:INTEGER);
VAR CH:CHAR;
BEGIN
"SKIP INITIAL GARBAGE"
REPEAT
INBYTE(S,CH);
IF CH=EM THEN XXXERROR('INPUT STREAM TERMINATED(:0:)');
UNTIL XXXHEXADIGIT(CH);
"ASSEMBLE VALUE"
INT:=0;
WHILE XXXHEXADIGIT(CH) DO
BEGIN
INT:=LEFTSHIFT(INT,4);
PUTBITS(ASCII_TO_BIN(CH),INT,3,4);
INBYTE(S,CH);
END;
END "INHEXA";
PROCEDURE ININTEGER(S:STREAM; VAR INT:INTEGER);
VAR CH:CHAR; POSITIVE:BOOLEAN;
BEGIN
"SKIP INITIAL GARBAGE"
REPEAT
INBYTE(S,CH);
IF CH=EM THEN XXXERROR('INPUT STREAM TERMINATED(:0:)');
UNTIL (CH='#') OR (CH='-') OR XXXDIGIT(CH);
"GO HANDLE HEXADECIMAL CASE"
IF CH='#' THEN
BEGIN
INHEXA(S,INT);
EXIT;
END;
"CHECK FOR SIGN"
POSITIVE:=TRUE;
IF CH='-' THEN
BEGIN
POSITIVE:=FALSE;
INBYTE(S,CH);
END;
"ASSEMBLE VALUE"
INT:=0;
WHILE XXXDIGIT(CH) DO
BEGIN
INT:=INT*10-ASCII_TO_BIN(CH);
INBYTE(S,CH);
END;
"REVERSE SIGN IF POSITIVE"
IF POSITIVE THEN INT:=-INT;
END "ININTEGER";
PROCEDURE IN_LONG_INTEGER(S: STREAM; VAR LINT: LONG_INTEGER);
VAR
CH: CHAR;
POSITIVE: BOOLEAN;
BEGIN
"SKIP INITTIAL GARBAGE"
REPEAT
INBYTE(S,CH);
IF CH=EM THEN XXXERROR('INPUT STREAM TERMINATED(:0:)');
UNTIL (CH='#') OR (CH='-') OR XXXDIGIT(CH);
"HANDLE HEXADECIMAL CASE"
IF CH='#' THEN
BEGIN
EXIT;
END;
"HANDLE SIGN"
POSITIVE:= TRUE;
IF CH='-' THEN
BEGIN
POSITIVE:= FALSE;
INBYTE(S,CH);
END;
"ASSEMBLE VALUE, NEGATIVE"
LINT:= 0L;
WHILE XXXDIGIT(CH) DO
BEGIN
LINT:= LINT*10L-LONG(ASCII_TO_BIN(CH));
INBYTE(S,CH);
END;
"REVERSE SIGN IF POSITIVE"
IF POSITIVE THEN
LINT:= -LINT;
END "IN_LONG_INTEGER";
PROCEDURE OUT_LONG_INTEGER(S: STREAM; LINT: LONG_INTEGER; WIDTH: INTEGER);
VAR
T: TEXT;
I: INTEGER;
NEGATIVE: BOOLEAN;
TEMP: LONG_INTEGER;
BEGIN
FOR I:= 1 TO TEXT_SIZE DO
T[I]:= SP;
IF LINT=#80000000L THEN
BEGIN
"HANDLE SPECIAL CASE"
END
ELSE
BEGIN
TEMP:= LINT;
NEGATIVE:= TEMP<0L;
IF NEGATIVE THEN
TEMP:= -TEMP;
I:= 1;
REPEAT
T[I]:= BIN_TO_ASCII(SHORT(TEMP-(TEMP/10L)*10L));
TEMP:= TEMP/10L;
I:= SUCC(I);
UNTIL TEMP= 0L;
IF NEGATIVE THEN
T[I]:= '-'
ELSE
I:= PRED(I);
END;
IF WIDTH<I THEN
FOR I:= 1 TO WIDTH DO
T[I]:= '*';
FOR I:= WIDTH DOWNTO 1 DO
OUTBYTE(S,T[I]);
END "OUT_LONG_INTEGER";
«eof»