|
|
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: 8704 (0x2200)
Types: TextFile
Names: »CNPSOD«
└─⟦927b41227⟧ Bits:30005184 8" CR80 Floppy CR80FD_0181 ( CR/D/1189 (ulæseligt) )
└─⟦cac81710b⟧
└─⟦this⟧ »PHO.CNPSOD«
"----------------------------------------------------------------------"
" 790523 HOH"
" CONPAS"
" ======"
" CONVERTS PASCAL PROGRAMS FROM UTILITY TO DRIVER FORMAT"
"----------------------------------------------------------------------"
%WORKAREACLAIM=3000
%SUMMARY
$PREFIX
$IODEC
"----------------------------------------------------------------------"
CONST
SIZE_DISP = 4;
PRG_DISP = 23;
REF_DISP = 54;
BUF_DISP = 55;
CURIN_DISP = 90;
NAME_DISP = 7;
SHARE_TOP = #AF7;
SHARE_BOTTOM = #189;
REFLENGTH = 4;
BUFLENGTH = 9;
NEXT = 3;
PG_HEADERLENGTH = 31;
DRIVERHEADER = 13;
"----------------------------------------------------------------------"
TYPE
REF_BUFFER = ARRAY(.1..REFLENGTH.) OF INTEGER;
BUF_BUFFER = ARRAY(.1..BUFLENGTH.) OF INTEGER;
"----------------------------------------------------------------------"
VAR
REF,BUF,REFS,BUFS: INTEGER;
ABS_ADDRESS: INTEGER;
CONSOLE, SOURCE_STREAM, OBJECT_STREAM: STREAM;
FORTOLKER: BOOLEAN;
SOURCE_NAME, OBJECT_NAME, PROCESSNAME: IDENTIFIER;
PGHEAD: ARRAY(.0..PG_HEADERLENGTH.) OF INTEGER;
WORDS: INTEGER;
PG_SIZE, CONSTS, PR_SIZE, SHARE_SIZE: INTEGER;
ASS_SIZE, PROCESS_SIZE, PRG, REFREF, BUFREF: INTEGER;
GLCOUNT: INTEGER;
$IO
PROCEDURE OUTHEX(S:STREAM; CH: UNIV CHAR; INT: UNIV INTEGER);
VAR CTRL: INTEGER;
BEGIN
OUTBYTE(S,CH);
FOR CTRL:= 4 DOWNTO 1 DO
OUTBYTE(S,BIN_TO_ASCII(GETBITS(INT,4*CTRL-1,4)));
END "OUTHEX";
"----------------------------------------------------------------------"
PROCEDURE OUTWORD(INT: UNIV INTEGER);
"----------------------------------------------------------------------"
BEGIN
IF ABS_ADDRESS MOD 8 = 0
THEN BEGIN
OUTNL(OBJECT_STREAM);
OUTHEX(OBJECT_STREAM,SP,ABS_ADDRESS);
OUTSTRING(OBJECT_STREAM, 'L(:0:)');
END;
OUTHEX(OBJECT_STREAM,SP,INT);
ABS_ADDRESS:=ABS_ADDRESS+1;
END "OUTWORD" ;
"----------------------------------------------------------------------"
PROCEDURE MAKE_BUFS(VAR BUF: INTEGER; VAR BUFS: INTEGER);
"----------------------------------------------------------------------"
VAR B: BUF_BUFFER; I: INTEGER;
BEGIN
WHILE BUFS > 0 DO
BEGIN
FOR I:= 1 TO BUFLENGTH DO B(.I.):= 0;
BUF:= BUF+BUFLENGTH;
BUFS:= PRED(BUFS);
IF BUFS > 0 THEN B(.NEXT.):= BUF;
FOR I:=1 TO BUFLENGTH DO OUTWORD(B(.I.));
END;
END "MAKE_BUFS";
"----------------------------------------------------------------------"
PROCEDURE MAKE_REFS(VAR REF: INTEGER; VAR REFS: INTEGER);
"----------------------------------------------------------------------"
VAR R:REF_BUFFER; I: INTEGER;
BEGIN
WHILE REFS > 0 DO
BEGIN
FOR I:=1 TO REFLENGTH DO R(.I.):=0;
REF:= REF+REFLENGTH;
REFS:= PRED(REFS);
IF REFS > 0 THEN R(.NEXT.):= REF;
FOR I:=1 TO REFLENGTH DO
OUTWORD(R(.I.) );
END;
END "MAKE_REFS";
"----------------------------------------------------------------------"
PROCEDURE PRESET_INPUT(S: STREAM);
"----------------------------------------------------------------------"
VAR CHA: CHAR;
BEGIN
REPEAT
INBYTE(S,CHA)
UNTIL CHA = 'P';
GLCOUNT:= 0;
END "PRESET_INPUT";
"----------------------------------------------------------------------"
PROCEDURE RESET(VAR S:STREAM;NAME:TEXT;DIR:DIRECTION);
"----------------------------------------------------------------------"
BEGIN
CLOSE(S);
OPEN(S,NAME,DIR);
PRESET_INPUT(S);
END "RESET";
"----------------------------------------------------------------------"
PROCEDURE CHECKTYPE(TAG:ARGTAG;PARMTYPE:ARGTAG; PARM:INTEGER);
"----------------------------------------------------------------------"
BEGIN
IF TAG <> PARMTYPE
THEN BEGIN
OUTSTRING(CONSOLE,'PARAMETER (:0:)');
OUTINTEGER(CONSOLE,PARM,4);
OUTSTRING(CONSOLE,' IS OF ILLEGAL TYPE(:0:)');
OUTNL(CONSOLE);
HALT;
END " ERROR PRINTOUT"
END "CHECKTYPE";
"----------------------------------------------------------------------"
PROCEDURE INWORD(S: STREAM; VAR INT: INTEGER);
"----------------------------------------------------------------------"
BEGIN
IF GLCOUNT MOD 8 = 0 THEN INHEXA(S,INT);
INHEXA(S,INT);
GLCOUNT:= SUCC(GLCOUNT);
END "INWORD";
"----------------------------------------------------------------------"
PROCEDURE SKIP(COUNT: INTEGER);
"----------------------------------------------------------------------"
VAR I,INT: INTEGER;
BEGIN
FOR I:=1 TO COUNT DO INWORD(SOURCE_STREAM,INT);
END "SKIP";
"----------------------------------------------------------------------"
PROCEDURE TRANSFER(COUNT: INTEGER);
"----------------------------------------------------------------------"
VAR I,INT: INTEGER;
BEGIN
FOR I:=1 TO COUNT DO
BEGIN
INWORD(SOURCE_STREAM,INT);
OUTWORD(INT);
END
END "TRANSFER" ;
"----------------------------------------------------------------------"
PROCEDURE READ_PARAMETERS;
"----------------------------------------------------------------------"
VAR I: INTEGER;
BEGIN
FOR I:=1 TO 7 DO
BEGIN
WITH PARAM(.I.) DO
BEGIN
CASE I OF
1:
BEGIN CHECKTYPE(TAG,IDTYPE,I);
IF ID(.1.) = 'F' THEN FORTOLKER :=TRUE
ELSE FORTOLKER :=FALSE;
END;
2:
BEGIN CHECKTYPE(TAG,IDTYPE,I);
SOURCE_NAME:=ID;
END;
3:
BEGIN CHECKTYPE(TAG,IDTYPE,I);
OBJECT_NAME:=ID;
END;
4:
BEGIN CHECKTYPE(TAG,IDTYPE,I);
PROCESSNAME:=ID;
END;
5:
BEGIN CHECKTYPE(TAG,INTTYPE,I);
ABS_ADDRESS:= INT;
END;
6:
BEGIN CHECKTYPE(TAG,INTTYPE,I);
BUFS:= INT;
END;
7:
BEGIN CHECKTYPE(TAG,INTTYPE,I);
REFS:= INT;
END
END "CASE";
END "WITH PARAM";
END;
END "READ_PARAMETERS";
"----------------------------------------------------------------------"
PROCEDURE CALCULATE_DISPS;
"----------------------------------------------------------------------"
VAR I: INTEGER;
BEGIN
FOR I:=0 TO PG_HEADERLENGTH DO INWORD(SOURCE_STREAM,PGHEAD(.I.));
WORDS:=PGHEAD(.3.);
PG_SIZE:= PGHEAD(.4.);
IF FORTOLKER THEN CONSTS:=0 ELSE CONSTS:=PGHEAD(.31.);
PR_SIZE:=PGHEAD(.11.);
SHARE_SIZE:=SHARE_TOP - SHARE_BOTTOM;
ASS_SIZE:= PR_SIZE-CONSTS-SHARE_SIZE;
PROCESS_SIZE:= ASS_SIZE+CONSTS+WORDS+REFS*REFLENGTH+BUFS*BUFLENGTH;
PRG:= PROCESS_SIZE-DRIVERHEADER;
REF:= ASS_SIZE+CONSTS+WORDS-DRIVERHEADER;
BUF:= REF+REFS*REFLENGTH;
PGHEAD(.11.):= ASS_SIZE;
END "CALCULATE_DISPS";
"----------------------------------------------------------------------"
PROCEDURE GENERATE_HEADER;
"----------------------------------------------------------------------"
BEGIN
OUTNL(OBJECT_STREAM);
OUTSTRING(OBJECT_STREAM, 'Z(:0:)');
OUTHEX(OBJECT_STREAM,'0',ABS_ADDRESS);
OUTSTRING(OBJECT_STREAM,' T0000(:0:)');
OUTNL(OBJECT_STREAM);
OUTSTRING(OBJECT_STREAM,'P(:0:)');
OUTNL(OBJECT_STREAM);
END "GENERATE_HEADER";
"----------------------------------------------------------------------"
PROCEDURE WRITE_DRIVERPROCESS;
" GENERATES DRIVER PROCESS PART, I.E. FROM DRIVER HEADER UNTIL PG HEADR"
"----------------------------------------------------------------------"
VAR I: INTEGER;
BEGIN
SKIP(PG_SIZE-(PG_HEADERLENGTH+1));
TRANSFER(SIZE_DISP);
SKIP(1); OUTWORD(PROCESS_SIZE);
TRANSFER(NAME_DISP-SIZE_DISP-1);
PACK(PROCESSNAME,PROCESSNAME,6);
SKIP(3);
OUTWORD(PROCESSNAME(.1.));
OUTWORD(PROCESSNAME(.2.));
OUTWORD(PROCESSNAME(.3.));
TRANSFER(PRG_DISP-NAME_DISP-3);
SKIP(1); OUTWORD(PRG);
IF FORTOLKER THEN TRANSFER(1)
ELSE BEGIN SKIP(1); OUTWORD(256) END;
TRANSFER(REF_DISP-PRG_DISP-2);
SKIP(2);
OUTWORD(REF); OUTWORD(BUF);
TRANSFER(CURIN_DISP-REF_DISP-2);
SKIP(1); OUTWORD(0);
TRANSFER(ASS_SIZE-CURIN_DISP-1);
SKIP(SHARE_SIZE); TRANSFER(CONSTS);
FOR I:=1 TO WORDS DO OUTWORD(0);;
MAKE_REFS(REF,REFS);
MAKE_BUFS(BUF,BUFS);
END "WRITE_DRIVERPROCESS";
"----------------------------------------------------------------------"
PROCEDURE WRITE_DRIVERPROGRAM;
"----------------------------------------------------------------------"
VAR I: INTEGER;
BEGIN
FOR I:= 0 TO PG_HEADERLENGTH DO OUTWORD(PGHEAD(.I.));
RESET(SOURCE_STREAM,SOURCE_NAME,INPUT);
SKIP(PG_HEADERLENGTH+1);
TRANSFER(PG_SIZE-(PG_HEADERLENGTH+1));
END "WRITE_DRIVERPROGRAM";
"----------------------------------------------------------------------"
PROCEDURE GENERATE_TAIL;
"----------------------------------------------------------------------"
BEGIN
OUTNL(OBJECT_STREAM);
OUTSTRING(OBJECT_STREAM,'S(:0:)');
OUTNL(OBJECT_STREAM);
END "GENERATE_TAIL" ;
"----------------------------------------------------------------------"
" MAIN PROGRAM"
"----------------------------------------------------------------------"
BEGIN
OPEN(CONSOLE,'OC(:0:)',OUTPUT);
READ_PARAMETERS;
OPEN(SOURCE_STREAM,SOURCE_NAME,INPUT);
OPEN(OBJECT_STREAM,OBJECT_NAME,OUTPUT);
PRESET_INPUT(SOURCE_STREAM);
CALCULATE_DISPS;
GENERATE_HEADER;
WRITE_DRIVERPROCESS;
WRITE_DRIVERPROGRAM;
GENERATE_TAIL;
CLOSE(CONSOLE);
CLOSE(SOURCE_STREAM);
CLOSE(OBJECT_STREAM);
END.
«eof»