DataMuseum.dk

Presents historical artifacts from the history of:

CR80 Hard and Floppy Disks

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about CR80 Hard and Floppy Disks

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦cdc35eb46⟧ TextFile

    Length: 8704 (0x2200)
    Types: TextFile
    Names: »CNPSOD«

Derivation

└─⟦927b41227⟧ Bits:30005184 8" CR80 Floppy CR80FD_0181 ( CR/D/1189 (ulæseligt) )
    └─⟦cac81710b⟧ 
        └─ ⟦this⟧ »PHO.CNPSOD« 

TextFile

"----------------------------------------------------------------------"
" 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»