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

⟦c0f604685⟧ TextFile

    Length: 25344 (0x6300)
    Types: TextFile
    Names: »PLIST1«

Derivation

└─⟦9975dd352⟧ Bits:30005088 8" CR80 Floppy CR80FD_0043 ( CR/D/1032 PROMGEN (HBA) 790917 HBA PROMGEN BACKUP )
    └─⟦69b0db55a⟧ 
        └─ ⟦this⟧ »HBA.PLIST1« 

TextFile

\f

0001 %SUMMARY
0002 %LIST
0003 %WORKAREA=25000
0004 
0005 "PAGE" \f


0006 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
0007 "                                                                      "
0008  "  MODULE NUMBER CSS/103/L-D/0100   NAME PROMGEN PROGRAM LISTING      "
0009 "                                                                      "
0010 "   GENERAL PURPOSE PROM GENERATING PROGRAM                            "
0011 "                                                                      "
0012 "   ROVSING    FH/790822        RELEASE 01   VERSION 001               "
0013 "                                                                      "
0014 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
0015 "                                                                      "
0016 "   FUNCTION                                                           "
0017 "                                                                      "
0018 "        THE PROMGEN PROGRAM GENERATES PROMDESCRIPTIONS FROM A GIVEN   "
0019 "        HEXADECIMAL INPUT DISC FILE.                                  "
0020 "        THE PROMDESCRIPTIONS DEFINES THE CONTENT OF A NUMBER OF       "
0021 "        PROMS EACH CONTAINED IN ITS OWN DISCFILE.                     "
0022 "        THESE DISCFILES HAVE TO BE CREATED PRIOR TO PROMGEN EXECUTION "
0023 "        THE PROMDESCRIPTION IS AFTER A COPY TO A MAGNETIC TAPE ,      "
0024 "        DIRECT USABLE AS INPUT TO A 'DATA I/O' PROM PROGRAMMER.       "
0025 "        PROMGEN TAKES FIXED INPUT PARAMETERS FROM A DISCFILE(         "
0026 "        SPECIFIED IN THE PROMGEN CALL) AND DYNAMIC PARAMETERS FROM    "
0027 "        THE OPERATORS CONSOLE.                                        "
0028 "                                                                      "
0029 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
0030 "PAGE" \f


0031 "                                                                      "
0032 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
0033 "                                                                      "
0034 "   INTERFACE                                                          "
0035 "        INVOCATION                                                    "
0036 "          PROGRAM CALL:  PROMGEN S:<PDATA>  P:<PARAM>                 "
0037 "          PROMGEN: THE ASSEMBLED PROGRAM.                             "
0038 "          PDATA  : THE HEXADECIMAL INPUTFILE TO BE PROMMED.           "
0039 "          PARAM  : FIXED INPUT PARAMETER FILE.                        "
0040 "                                                                      "
0041 "        THE PROGRAM REQUIRES INPUT PARAMETERS FROM OC:                "
0042 "                                                                      "
0043 "          ORIGINATED BY: <IDENTIFIER>                                 "
0044 "          PROJECT NO: <LONG INTEGER>                                  "
0045 "          DATE: <LONG INTEGER>                                        "
0046 "          FLOPPY DISC NO,CR/D/: <INTEGER>                             "
0047 "          SOURCETEXT AND VERSION: <TEXT>                              "
0048 "          AREASIZE: <INTEGER>                                         "
0049 "          AREASTART ADDRESS: <INTEGER>                                "
0050 "        WHERE THE TEXT BEFORE : IS SUPPLIED BY THE PROGRAM.           "
0051 "        THE < > IS SUPPLIED AS AN ANSWER BY THE OPERATOR.             "
0052 "                                                                      "
0053 "        FORMAT OF THE PARAM DISCFILE:                                 "
0054 "                                                                      "
0055 "          # MODULE <TEXT>                                             "
0056 "          # WORDSIZE <INTEGER>                                        "
0057 "          # PROMSIZE <INTEGER>                                        "
0058 "          # PROMWIDTH <INTEGER>                                       "
0059 "          # PARITYPROMS <INTEGER>                                     "
0060 "          [ # <SEQNO> <PROMFILE> <PROMID> <VERSION> <PARITYBIT> ]X    "
0061 "          [ # <SEQNO> <PARITYFILE> <PROMID> <VERSION> ]Y              "
0062 "        WHERE X= NUMBER OF PROMS(PARITY PROMS EXCLUDED).              "
0063 "        Y= NUMBER OF PARITY PROMS.                                    "
0064 "        X AND Y ARE REPETITIONS FACTORS.                              "
0065 "                                                                      "
0066 "        OUTPUT                                                        "
0067 "                                                                      "
0068 "          FOR EACH GENERATED PROM , THE PROGRAM WRITES ON THE         "
0069 "          OPERATORS CONSOLE:                                          "
0070 "                                                                      "
0071 "          PROMID: <INTEGER>  VERSION: <INTEGER>                       "
0072 "          CHECKSUM: <HEXADECIMAL NUMBER>                              "
0073 "                                                                      "
0074 "        EXIT                                                          "
0075 "          THE PROGRAM RELINQUISHES CONTROL, WHEN ALL THE SPECIFIED    "
0076 "          PROMS ARE CREATED OR IF A PARAMETER ERROR IS FOUND.         "
0077 "                                                                      "
0078 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
0079 "                                                                      "
0080 "   EXCEPTIONS                                                         "
0081 "                                                                      "
0082 "        IF A PARAMETER IS ILLEGAL, THE PROGRAM STOPS AND              "
0083 "        ISSUES AN APPROPRIATE ERRORMESSAGE.                           "
0084 "                                                                      "
0085 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
0086 "PAGE" \f


0087 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
0088 "                                                                      "
0089 "   PROGRAM GENERATION                                                 "
0090 "        THE SOURCE PROGRAM CONSISTS OF THE FOLLOWING FILES:           "
0091 "                                                                      "
0092 "          PMODULE : MODULE HEADER                                     "
0093 "          PREFIX  : PREFIX ROUTINES                                   "
0094 "          IODEC   : IO DECLARATIONS AND CONSTANTS                     "
0095 "          PDEC    : PROMGEN DECLARATIONS AND CONSTANTS                "
0096 "          IO      : IO PROCEDURES                                     "
0097 "          PPROC   : PROMGEN PROCEDURES                                "
0098 "          PPROG   : PROMGEN MAIN PROGRAM                              "
0099 "                                                                      "
0100 "        THESE SOURCE PROGRAMS ARE MERGED:                             "
0101 "          MERGE S: PMERGE1 O:PS1                                      "
0102 "                                                                      "
0103 "        HEREAFTER THE COMPILER IS CALLED:                             "
0104 "          COMPILE S:PS1 O:GENOBJ P:PLIST1                             "
0105 "                                                                      "
0106 "        THE BLOCKSIZE IS CHANGED:                                     "
0107 "          CONV41 S:GENOBJ O:PROMGEN.BIN                               "
0108 "                                                                      "
0109 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
0110 "                                                                      "
0111 "   PROGRAM STORAGE                                                    "
0112 "                                                                      "
0113 "        CR/D/1327                                                     "
0114 "                                                                      "
0115 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
0116 "                                                                      "
0117 "   REFERENCE DOCUMENTS                                                "
0118 "        VERSION DESCRIPTION DOCUMENT: CSS/103/VDD/0018                "
0119 "        USERS MANUAL:                 CSS/103/USM/0025                "
0120 "        LISTING :                     CSS/103/LST/0001                "
0121 "                                                                      "
0122 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
0123 "PAGE" \f


0124 %NOLIST
0271 "PAGE"\f


0272 "****************************
0273 *  PASCAL I/O DECLARATIONS  *
0274 ****************************"
0275 
0276 CONST TEXT_SIZE=132;
0277 TYPE TEXT=ARRAY[1..TEXT_SIZE] OF CHAR;
0278 
0279 TYPE STREAM=(INOC,OUTOC,INFILE,OUTFILE);
0280 TYPE DIRECTION=(INPUT,OUTPUT);
0281 TYPE BYTE=0..255;
0282 "**********************************************************************"
0283 "   CONSTANTS                                                          "
0284 "**********************************************************************"
0285 
0286  CONST MAX_PARITY_PROMS = 4 ;                                          "20"
0287        MAX_PROMS = 64 ;                                                "30"
0288        STX = '(:2:)' ;                                                 "40"
0289        ETX = '(:3:)' ;                                                 "50"
0290        MIN_AREASIZE = 8 ;                                              "60"
0291        MIN_PROMSIZE = 8 ;                                              "80"
0292        MAX_AREASIZE = 16384 ;                                          "70"
0293        MAX_PROMSIZE = 16384 ;                                          "90"
0294        MIN_PROMWIDTH = 4 ;                                             "100"
0295        MAX_PROMWIDTH = 16 ;                                            "110"
0296        MIN_WORDSIZE = 4 ;                                              "120"
0297        MAX_WORDSIZE = 16 ;                                             "130"
0298 
0299 "**********************************************************************"
0300 " MAIN VARIABLES                                                       "
0301 "**********************************************************************"
0302 
0303  TYPE PROMTYPE = RECORD                                                "10"
0304                   FILE       : IDENTIFIER     ;                        "20"
0305                   IDNO       : INTEGER        ;                        "30"
0306                   VERSION    : INTEGER        ;                        "40"
0307                   PARITY_BIT : INTEGER        ;                        "50"
0308                   CHECKSUM   : LONG_INTEGER                            "60"
0309                  END;                                                  "70"
0310 
0311 
0312  TYPE LONG1 = RECORD
0313                 LSB : INTEGER ;
0314                 MSB : INTEGER
0315               END;
0316 
0317  TYPE ID_RECORD_TYPE = RECORD                                          "100"
0318                         ORIGINATOR          : IDENTIFIER ;             "110"
0319                         PROJECT_NO          : LONG_INTEGER ;           "120"
0320                         DATE                : LONG_INTEGER ;           "130"
0321                         MODULE              : TEXT ;                   "140"
0322                         FLOPPY_DISC_NO      : INTEGER ;                "150"
0323                         SOURCE_TEXT         : TEXT                     "160"
0324                        END;                                            "170"
0325 
0326  TYPE PROM_AREA_TYPE = RECORD                                          "190"
0327                         SIZE                : LONG_INTEGER ;           "200"
0328                         START_ADDRESS       : LONG_INTEGER ;           "210"
0329                         WIDTH               : INTEGER ;                "220"
0330                         PARITY_BITS_IN_USE  : INTEGER                  "230"
0331                        END;                                            "240"
0332 
0333  TYPE PHYS_PROM_TYPE = RECORD                                          "260"
0334                         SIZE                : LONG_INTEGER ;           "270"
0335                         WIDTH               : INTEGER                  "280"
0336                        END;                                            "290"
0337  VAR PROM            : ARRAY [1..MAX_PROMS] OF PROMTYPE ;              "292"
0338      ID_RECORD : ID_RECORD_TYPE ;                                      "296"
0339      PROM_AREA : PROM_AREA_TYPE ;                                      "298"
0340      PHYS_PROM : PHYS_PROM_TYPE ;                                      "300"
0341      PARITY_AREA   : ARRAY [0..MAX_PROMSIZE] OF INTEGER ;              "310"
0342      S_IN , S_OUT  : STREAM ;                                          "320"
0343      PROM_INPUT_FILE : IDENTIFIER ;                                    "330"
0344      PARAM_INPUT_FILE : IDENTIFIER ;                                   "340"
0345      PROMS_PR_ROW ,                                                    "350"
0346      PROMS_PR_COLOUMN ,                                                "360"
0347      NO_OF_PROMS ,                                                     "370"
0348      PARITY_BITS_IN_USE ,                                              "315"
0349      NO_OF_PARITY_PROMS ,                                              "375"
0350      HEXA_PR_ROW ,                                                     "380"
0351      HEXA_PR_PROM_ROW ,                                                "390"
0352      HEXA_PR_SINGLE_PROM ,                                             "400"
0353      HEXA_NO ,                                                         "410"
0354      ROW_NO ,                                                          "420"
0355      COLOUMN_NO ,                                                      "430"
0356      I , J           : INTEGER ;                                       "440"
0357 
0358 "PAGE" \f


0359 %NOLIST
0736 "PAGE" \f


0737 "**********************************************************************"
0738 " MAIN PROCEDURES                                                      "
0739 "**********************************************************************"
0740 
0741  PROCEDURE DEFINE_CONSTANTS ;                                          "10"
0742  VAR L  : LONG_INTEGER ;                                               "15"
0743      I  : INTEGER ;                                                    "16"
0744  BEGIN                                                                 "20"
0745    PROMS_PR_ROW         := PROM_AREA.WIDTH DIV PHYS_PROM.WIDTH ;       "30"
0746    PROMS_PR_COLOUMN     := SHORT(( PROM_AREA.SIZE /                    "40"
0747                                    PHYS_PROM.SIZE )  );                "45"
0748    NO_OF_PROMS          := PROMS_PR_ROW * PROMS_PR_COLOUMN ;           "50"
0749    HEXA_PR_ROW          := PROM_AREA.WIDTH DIV 4 ;                     "60"
0750    HEXA_PR_SINGLE_PROM  := PHYS_PROM.WIDTH DIV 4 ;                     "70"
0751    L                    := LONG(HEXA_PR_ROW) * PHYS_PROM.SIZE ;        "75"
0752    HEXA_PR_PROM_ROW     := SHORT( L );                                 "80"
0753    FOR I := 0 TO SHORT( PHYS_PROM.SIZE ) - 1 DO                        "82"
0754      PARITY_AREA[ I ] := -1 ;                                          "84"
0755    PARITY_BITS_IN_USE := 0 ;                                           "86"
0756 
0757    FOR I:= 1 TO (NO_OF_PROMS + NO_OF_PARITY_PROMS ) DO                 "100"
0758      PROM[ I ].CHECKSUM := 0L ;                                        "110"
0759  END ;                                                                 "90"
0760 
0761 "**********************************************************************"
0762 
0763 "PAGE" \f


0764  PROCEDURE READ_FROM_PARITY_AREA( LEFT_BIT ,                           "10"
0765                                   ROW       : INTEGER ;                "20"
0766                                   VAR HEXA  : CHAR ) ;                 "40"
0767  VAR BIN  : INTEGER ;                                                  "50"
0768  BEGIN                                                                 "60"
0769    BIN := GETBITS( PARITY_AREA[ ROW ] ,                                "70"
0770                    LEFT_BIT ,                                          "80"
0771                    4 ) ;                                               "90"
0772    HEXA := BIN_TO_ASCII( BIN ) ;                                       "100"
0773  END "READ FROM PARITY AREA" ;                                         "110"
0774 
0775 
0776 
0777  PROCEDURE READ_HEXA( S           : STREAM ;                           "10"
0778                       VAR HEXA    : CHAR ;                             "20"
0779                       VAR NO      : INTEGER   ) ;                      "30"
0780  VAR   CH    : CHAR ;                                                  "40"
0781  BEGIN                                                                 "50"
0782    IF NO MOD 32 = 0                                                    "60"
0783      THEN                                                              "70"
0784        BEGIN                                                           "80"
0785          REPEAT                                                        "90"
0786            INBYTE( S , CH );                                           "100"
0787          UNTIL                                                         "110"
0788            CH = 'L' ;                                                  "120"
0789        END;                                                            "130"
0790 
0791    REPEAT                                                              "140"
0792      INBYTE( S , CH )                                                  "150"
0793    UNTIL                                                               "160"
0794      XXXHEXADIGIT( CH );                                               "170"
0795 
0796    HEXA := CH ;                                                        "180"
0797    NO := NO + 1 ;                                                      "190"
0798  END "READ HEXA";                                                      "200"
0799 
0800 
0801  PROCEDURE IN_IDENT( S: STREAM  ;                                      "10"
0802                     VAR IDF: IDENTIFIER );                             "20"
0803  VAR CH: CHAR;                                                         "30"
0804      I : INTEGER;                                                      "40"
0805  BEGIN                                                                 "50"
0806    FOR I:= 1 TO IDLENGTH DO                                            "60"
0807      IDF[I] := NULL;                                                   "70"
0808    REPEAT                                                              "80"
0809      INBYTE( S , CH );                                                 "90"
0810    UNTIL                                                               "100"
0811      NOT ( (CH=NL) OR (CH=SP) OR (CH=EM)) ;                            "110"
0812    IDF[1] := CH ;                                                      "120"
0813    I:=1;                                                               "130"
0814    REPEAT                                                              "140"
0815      INBYTE( S , CH );                                                 "150"
0816      I:= I + 1 ;                                                       "160"
0817      IDF[ I ] := CH ;                                                  "170"
0818    UNTIL                                                               "180"
0819      (CH=NL) OR (CH=SP) OR (CH=EM) OR (I>=IDLENGTH) ;                  "190"
0820    IDF[ I ] := NULL ;                                                  "195"
0821  END "IN_IDENT" ;                                                      "200"
0822 
0823 
0824 
0825 "PAGE" \f


0826  PROCEDURE GET_OC_PARAMS( OC_IN , OC_OUT : STREAM );                   "10"
0827  BEGIN                                                                 "20"
0828    OUTNL( OC_OUT );                                                    "30"
0829    OUTSTRING( OC_OUT, 'ORIGINATED BY: (:0:)');                         "40"
0830    OUTNL( OC_OUT );                                                    "50"
0831 
0832    IN_IDENT( OC_IN , ID_RECORD.ORIGINATOR );                           "60"
0833 
0834    OUTNL(OC_OUT);                                                      "70"
0835    OUTSTRING( OC_OUT, 'PROJECT NO: (:0:)' );                           "80"
0836    OUTNL(OC_OUT);                                                      "90"
0837    IN_LONG_INTEGER( OC_IN , ID_RECORD.PROJECT_NO);                     "100"
0838 
0839    OUTNL(OC_OUT);                                                      "110"
0840    OUTSTRING( OC_OUT , 'DATE: (:0:)' );                                "120"
0841    OUTNL(OC_OUT);                                                      "130"
0842    IN_LONG_INTEGER( OC_IN , ID_RECORD.DATE );                          "140"
0843 
0844    OUTNL(OC_OUT);                                                      "150"
0845    OUTSTRING(OC_OUT, 'FLOPPY DISC NO, CR/D: (:0:)' );                  "160"
0846    OUTNL(OC_OUT);                                                      "170"
0847    ININTEGER( OC_IN , ID_RECORD.FLOPPY_DISC_NO );                      "180"
0848 
0849    OUTNL(OC_OUT);                                                      "190"
0850    OUTSTRING( OC_OUT ,'SOURCE TEXT AND VERSION: (:0:)' );              "200"
0851    OUTNL(OC_OUT);                                                      "210"
0852    INLINE(OC_IN , ID_RECORD.SOURCE_TEXT );                             "220"
0853 
0854    OUTNL(OC_OUT);                                                      "230"
0855    OUTSTRING( OC_OUT, 'AREASIZE: (:0:)' );                             "240"
0856    OUTNL(OC_OUT);                                                      "250"
0857    IN_LONG_INTEGER( OC_IN , PROM_AREA.SIZE );                          "260"
0858 
0859    OUTNL(OC_OUT);                                                      "270"
0860    OUTSTRING( OC_OUT, 'AREA STARTADDRESS: (:0:)' );                    "280"
0861    OUTNL(OC_OUT);                                                      "290"
0862    IN_LONG_INTEGER( OC_IN, PROM_AREA.START_ADDRESS);                   "300"
0863 
0864  END "GET_OC_PARAMS" ;                                                 "310"
0865 
0866 
0867 "PAGE" \f


0868  PROCEDURE GET_DISC_PARAMS( S: STREAM );                               "10"
0869  VAR I , SEQ_NO, PROM_NO,                                              "20"
0870      P_NO                 : INTEGER ;                                  "25"
0871        CH                 : CHAR ;                                     "30"
0872        TXT                : TEXT ;                                     "40"
0873        IDF                : IDENTIFIER ;                               "50"
0874  BEGIN                                                                 "60"
0875    FOR I:= 1 TO 5 DO                                                   "70"
0876      BEGIN                                                             "80"
0877        REPEAT                                                          "90"
0878          INBYTE( S , CH );                                             "100"
0879        UNTIL                                                           "110"
0880          CH= '#';                                                      "120"
0881 
0882        IN_IDENT( S , IDF ) ;                                           "130"
0883 
0884        CASE I OF                                                       "140"
0885      1:  BEGIN                                                         "150"
0886            IF IDF <> 'MODULE(:0:)(:0:)(:0:)(:0:)(:0:)(:0:)'            "160"
0887              THEN XXXERROR('MODULE PARAM(:0:)')                        "170"
0888              ELSE INLINE( S , ID_RECORD.MODULE );                      "180"
0889          END;                                                          "190"
0890      2:  BEGIN                                                         "200"
0891            IF IDF <> 'WORDSIZE(:0:)(:0:)(:0:)(:0:)'                    "210"
0892              THEN XXXERROR('WORDSIZE PARAM(:0:)')                      "220"
0893              ELSE ININTEGER( S , PROM_AREA.WIDTH );                    "230"
0894          END;                                                          "240"
0895      3:  BEGIN                                                         "250"
0896            IF IDF <> 'PROMSIZE(:0:)(:0:)(:0:)(:0:)'                    "260"
0897              THEN XXXERROR('PROMSIZE PARAM(:0:)' )                     "270"
0898              ELSE IN_LONG_INTEGER( S , PHYS_PROM.SIZE );               "280"
0899          END;                                                          "290"
0900      4:  BEGIN                                                         "300"
0901            IF IDF <> 'PROMWIDTH(:0:)(:0:)(:0:)'                        "310"
0902              THEN XXXERROR('PROMWIDTH PARAM(:0:)' )                    "320"
0903              ELSE ININTEGER( S , PHYS_PROM.WIDTH );                    "330"
0904          END ;                                                         "340"
0905      5:  BEGIN                                                         "341"
0906            IF IDF <> 'PARITYPROMS(:0:)'                                "342"
0907              THEN XXXERROR('PARITY PROM PARAM(:0:)' )                  "343"
0908              ELSE ININTEGER( S , NO_OF_PARITY_PROMS ) ;                "344"
0909          END                                                           "345"
0910        END "CASE";                                                     "350"
0911      END "FOR I";                                                      "360"
0912    NO_OF_PROMS := ( PROM_AREA.WIDTH DIV PHYS_PROM.WIDTH) *             "320"
0913              SHORT( PROM_AREA.SIZE /   PHYS_PROM.SIZE );               "380"
0914  PROM_NO := 0;                                                         "390"
0915  P_NO := 0 ;                                                           "395"
0916 
0917  REPEAT                                                                "400"
0918    PROM_NO := PROM_NO + 1 ;                                            "410"
0919    IF PROM_NO = NO_OF_PROMS + 1                                        "412"
0920      THEN P_NO := 0;                                                   "414"
0921    P_NO := P_NO + 1 ;                                                  "416"
0922 
0923    REPEAT                                                              "420"
0924      INBYTE( S , CH );                                                 "430"
0925    UNTIL                                                               "440"
0926      CH='#';                                                           "450"
0927 
0928    ININTEGER( S , SEQ_NO );                                            "460"
0929    IF SEQ_NO <> P_NO                                                   "470"
0930      THEN XXXERROR('PARAM PROM SEQUENCE ERROR(:0:)' );                 "475"
0931    IN_IDENT( S , PROM[ PROM_NO ].FILE );                               "480"
0932    ININTEGER( S, PROM[ PROM_NO ].IDNO );                               "490"
0933    ININTEGER( S , PROM[ PROM_NO ].VERSION );                           "500"
0934    IF PROM_NO <= NO_OF_PROMS                                           "504"
0935      THEN ININTEGER( S , PROM[ PROM_NO ].PARITY_BIT ) ;                "510"
0936  UNTIL                                                                 "520"
0937    PROM_NO >= NO_OF_PROMS + NO_OF_PARITY_PROMS ;                       "530"
0938  END "GET DISC PARAMS";                                                "540"
0939 
0940 "PAGE" \f


0941  PROCEDURE CHECK_PARAMS;
0942  VAR TEST   : INTEGER ;
0943  BEGIN
0944 
0945    TEST := SHORT( PROM_AREA.SIZE ) ;                                   "40"
0946    IF ( TEST < MIN_AREASIZE )
0947        OR ( TEST > MAX_AREASIZE )
0948      THEN XXXERROR('AREASIZE CONTENT(:0:)' );
0949 
0950 
0951    TEST := SHORT( PHYS_PROM.SIZE ) ;                                   "80"
0952    IF ( TEST < MIN_PROMSIZE ) OR ( TEST > MAX_PROMSIZE )
0953    OR ( TEST > SHORT( PROM_AREA.SIZE ) )                               "100"
0954    OR ( SHORT( PROM_AREA.SIZE) MOD TEST <> 0 )                         "110"
0955      THEN XXXERROR( 'PROMSIZE CONTENT(:0:)' );
0956 
0957 
0958    TEST := SHORT( PROM_AREA.START_ADDRESS ) ;                          "130"
0959    IF ( TEST < 0 ) OR ( TEST >= SHORT( PROM_AREA.SIZE )  )             "140"
0960      THEN XXXERROR( ' START ADDRESS CONTENT(:0:)' );
0961 
0962 
0963    TEST := PROM_AREA.WIDTH ;
0964    IF ( TEST < MIN_WORDSIZE ) OR (TEST > MAX_WORDSIZE )
0965    OR (TEST MOD 4 <>0 )
0966      THEN XXXERROR( 'WORDSIZE CONTENT(:0:)' );
0967 
0968    TEST := PHYS_PROM.WIDTH ;
0969    IF ( TEST < MIN_PROMWIDTH ) OR (TEST > MAX_PROMWIDTH )
0970    OR ( TEST MOD 4 <> 0 )
0971    OR ( TEST > PROM_AREA.WIDTH )                                       "230"
0972      THEN XXXERROR( 'PROMWIDTH CONTENT(:0:)' );
0973 
0974  END " CHECK PARAMS";
0975 
0976 "PAGE" \f


0977 
0978  PROCEDURE PROM_WORD_TREATMENT( F_OUT , F_IN : STREAM ;                "10"
0979                                 ROW,                                   "20"
0980                                 PROM_NO      : INTEGER ;               "40"
0981                                 VAR HEXA_NO  : INTEGER ) ;             "50"
0982  CONST CR = '(:10:)' ;
0983  VAR I,                                                                "60"
0984      J ,                                                               "62"
0985      ADDR ,                                                            "66"
0986      LEFT_BIT ,                                                        "68"
0987      HEXAS_OUTPUT,                                                     "70"
0988      BIN,                                                              "80"
0989      WORD,                                                             "90"
0990      P_BIT ,                                                           "95"
0991      ONES          : INTEGER ;                                         "100"
0992      HEXA          : CHAR ;                                            "110"
0993  BEGIN                                                                 "120"
0994    ADDR := SHORT( PROM_AREA.START_ADDRESS ) ;                          "130"
0995    IF ( ROW= ADDR ) AND ( ADDR > 0 ) AND ( PROM_NO <= PROMS_PR_ROW )   "135"
0996      THEN                                                              "140"
0997        BEGIN                                                           "150"
0998 
0999          I:= PHYS_PROM.WIDTH ;
1000          IF I=4 THEN WORD := #F
1001            ELSE IF I=8 THEN WORD:= #FF
1002              ELSE WORD := #FFFF ;
1003 
1004          FOR I :=0 TO (ADDR - 1 ) DO
1005            PROM[PROM_NO].CHECKSUM := PROM[PROM_NO].CHECKSUM +
1006              LONG( WORD ) ;
1007 
1008          OUTBYTE(F_OUT , STX ) ;                                       "151"
1009          OUTBYTE( F_OUT , CR ) ;                                       "152"
1010 
1011          ADDR := ADDR*HEXA_PR_SINGLE_PROM ;                            "153"
1012 
1013          FOR J := 1 TO ADDR DIV 32 DO                                  "154"
1014            BEGIN                                                       "155"
1015              FOR I:= 1 TO 32 DO                                        "156"
1016                BEGIN                                                   "157"
1017                  OUTBYTE( F_OUT , 'F' );                               "158"
1018                  IF ( I MOD HEXA_PR_SINGLE_PROM = 0 )                  "158.5"
1019                    THEN OUTBYTE( F_OUT , SP ) ;                        "159"
1020                END;                                                    "160"
1021              OUTBYTE( F_OUT , CR );                                    "161"
1022              OUTBYTES( F_OUT , NULL , 7 );                             "162"
1023            END;                                                        "163"
1024 
1025          FOR J:= 1 TO ADDR MOD 32 DO                                   "165"
1026            BEGIN                                                       "166"
1027              OUTBYTE( F_OUT , 'F' ) ;                                  "167"
1028              IF ( J MOD HEXA_PR_SINGLE_PROM = 0 )                      "168"
1029                THEN OUTBYTE( F_OUT , SP ) ;                            "169"
1030            END;                                                        "170"
1031        END;                                                            "195"
1032 
1033    WORD := 0 ;                                                         "200"
1034    FOR I:= 1 TO HEXA_PR_SINGLE_PROM DO                                 "210"
1035      BEGIN                                                             "220"
1036        IF PROM_NO > NO_OF_PROMS                                        "230"
1037          THEN                                                          "231"
1038            BEGIN                                                       "232"
1039              LEFT_BIT :=                                               "233"
1040              (PROM_NO-NO_OF_PROMS)*PHYS_PROM.WIDTH  -4*(I-1) - 1 ;     "234"
1041              READ_FROM_PARITY_AREA( LEFT_BIT , ROW , HEXA ) ;          "235"
1042            END                                                         "237"
1043          ELSE READ_HEXA( F_IN , HEXA , HEXA_NO ) ;                     "236"
1044 
1045        IF (I=1) AND (ROW=0 ) THEN                                      "240"
1046          BEGIN                                                         "250"
1047            OUTBYTE( F_OUT , STX ) ;                                    "260"
1048            OUTBYTE( F_OUT , CR );                                      "270"
1049          END;                                                          "280"
1050        OUTBYTE( F_OUT , HEXA );                                        "290"
1051        HEXAS_OUTPUT := ROW*HEXA_PR_SINGLE_PROM  +  I ;                 "300"
1052        IF ( LONG( ROW ) = PHYS_PROM.SIZE - 1L ) AND                    "310"
1053           ( I = HEXA_PR_SINGLE_PROM )                                  "320"
1054          THEN                                                          "325"
1055            BEGIN                                                       "330"
1056              OUTBYTE( F_OUT , SP ) ;                                   "335"
1057              OUTBYTE(F_OUT , ETX );                                    "350"
1058              OUTBYTES( F_OUT , NULL , 7 ) ;                            "354"
1059              OUTNL( F_OUT ) ;                                          "356"
1060            END                                                         "360"
1061          ELSE                                                          "370"
1062            BEGIN                                                       "380"
1063              IF ((HEXAS_OUTPUT MOD 32) = 0 )                           "400"
1064                THEN                                                    "410"
1065                  BEGIN                                                 "420"
1066                    OUTBYTE( F_OUT , SP ) ;                             "425"
1067                    OUTBYTE( F_OUT , CR );                              "430"
1068                    OUTBYTES( F_OUT , NULL , 7 );                       "440"
1069                  END                                                   "450"
1070                ELSE                                                    "460"
1071                  BEGIN                                                 "470"
1072                    IF HEXAS_OUTPUT MOD HEXA_PR_SINGLE_PROM = 0         "480"
1073                      THEN OUTBYTE( F_OUT , SP );                       "490"
1074                  END;                                                  "500"
1075            END;                                                        "510"
1076 
1077        BIN := ASCII_TO_BIN( HEXA ) ;                                   "520"
1078        WORD := LEFTSHIFT( WORD , 4 )  + BIN ;                          "530"
1079      END "FOR I " ;                                                    "540"
1080 
1081    PROM[ PROM_NO].CHECKSUM :=                                          "600"
1082      PROM[PROM_NO].CHECKSUM + LONG( WORD ) ;                           "610"
1083 
1084    IF PROM_NO <= NO_OF_PROMS                                           "612"
1085      THEN                                                              "613"
1086        P_BIT := PROM[ PROM_NO ].PARITY_BIT ;                           "614"
1087 
1088    IF (PROM_NO <= NO_OF_PROMS ) AND ( P_BIT >=0) AND ( P_BIT <= 15)    "620"
1089      THEN                                                              "630"
1090        BEGIN                                                           "640"
1091          ONES := 0;                                                    "650"
1092          FOR I := 0 TO PHYS_PROM.WIDTH -1 DO                           "660"
1093            IF TESTBIT( WORD , I )                                      "670"
1094              THEN ONES := ONES + 1 ;                                   "680"
1095          IF TESTBIT(PARITY_BITS_IN_USE , P_BIT )                       "690"
1096            THEN                                                        "700"
1097            BEGIN                                                       "710"
1098                IF GETBITS( ONES , 0 , 1 ) <>                           "720"
1099                   GETBITS( PARITY_AREA[ROW] , P_BIT , 1 )              "730"
1100                  THEN SETBIT( PARITY_AREA[ ROW ] , P_BIT )             "740"
1101                  ELSE CLEARBIT(PARITY_AREA[ROW ] , P_BIT )             "750"
1102              END                                                       "760"
1103            ELSE                                                        "770"
1104              BEGIN                                                     "780"
1105                IF TESTBIT( ONES , 0 )                                  "790"
1106                  THEN CLEARBIT( PARITY_AREA[ROW], P_BIT )              "800"
1107                  ELSE SETBIT( PARITY_AREA[ROW] , P_BIT )               "810"
1108              END;                                                      "820"
1109        END;                                                            "830"
1110  END "PROMWORD TREATMENT" ;                                            "840"
1111 
1112 "PAGE" \f


1113 
1114  FUNCTION SHORT1( L_INT: UNIV LONG1 ) : INTEGER ;                      "10"
1115  BEGIN                                                                 "20"
1116    SHORT1 := L_INT.LSB ;                                               "30"
1117  END;                                                                  "40"
1118 
1119 
1120 "PAGE" \f


1121 
1122  PROCEDURE EXTRACT_PARITY_PROM(   F_OUT     : STREAM ;                 "10"
1123                                   PROM_NO   : INTEGER ) ;              "20"
1124  VAR J,                                                                "30"
1125      COL : INTEGER ;                                                   "40"
1126  BEGIN                                                                 "50"
1127    COL := 16 DIV PHYS_PROM.WIDTH - PROM_NO ;                           "60"
1128    J:= 0 ;                                                             "70"
1129    REPEAT                                                              "80"
1130      PROM_WORD_TREATMENT( F_OUT , S_IN , J ,                           "110"
1131                           PROM_NO , HEXA_NO ) ;                        "115"
1132      J := J + 1 ;                                                      "120"
1133    UNTIL                                                               "130"
1134      J >=SHORT( PHYS_PROM.SIZE ) ;                                     "140"
1135 
1136    OUTNL( F_OUT ) ;                                                    "142"
1137    OUTSTRING( F_OUT , 'CHECKSUM: (:0:)' );
1138    OUTHEXA( F_OUT ,SHORT1( PROM[ PROM_NO ].CHECKSUM ) , 5 ) ;          "146"
1139    OUTNL( F_OUT ) ;
1140    OUTBYTE( F_OUT , EM );                                              "149"
1141  END " EXTRACT PARITY PROM" ;                                          "150"
1142 
1143 
1144 "PAGE" \f


1145  PROCEDURE EXTRACT_PROM( F_OUT,F_IN : STREAM ;                         "10"
1146                          PROM_NO     : INTEGER );                      "20"
1147 
1148  VAR ROW , COL , I , S            : INTEGER ;                          "30"
1149      HEXA                         : CHAR ;                             "40"
1150      START,J ,OFFSET_NO           : LONG_INTEGER ;                     "50"
1151  BEGIN                                                                 "60"
1152    HEXA_NO := 0 ;                                                      "70"
1153    ROW := ( PROM_NO - 1 ) DIV PROMS_PR_ROW ;                           "80"
1154    COL := ( PROM_NO - 1 ) MOD PROMS_PR_ROW ;                           "90"
1155 
1156    IF ROW=0                                                            "110"
1157      THEN START := PROM_AREA.START_ADDRESS                             "120"
1158      ELSE START := 0L ;                                                "130"
1159 
1160    IF ROW >= 1                                                         "140"
1161      THEN                                                              "150"
1162        BEGIN                                                           "160"
1163          J := PHYS_PROM.SIZE - PROM_AREA.START_ADDRESS ;               "170"
1164    " ROW POSITIONING "                                                 "175"
1165          OFFSET_NO := J * LONG( HEXA_PR_ROW )                          "180"
1166                       + LONG( HEXA_PR_PROM_ROW * ( ROW-1 ) );          "185"
1167          J := 0L ;                                                     "190"
1168          REPEAT                                                        "200"
1169            J:= J + 1L ;                                                "205"
1170            READ_HEXA( F_IN , HEXA , HEXA_NO ) ;                        "210"
1171          UNTIL                                                         "215"
1172            J >= OFFSET_NO ;                                            "218"
1173        END " ROW > 1 " ;                                               "220"
1174 
1175    J := START ;                                                        "230"
1176    WHILE                                                               "235"
1177      J < PHYS_PROM.SIZE DO                                             "240"
1178        BEGIN                                                           "245"
1179          "POSITION IN THE PROMAREA WORD "                              "250"
1180          FOR S := 1 TO COL*HEXA_PR_SINGLE_PROM DO                      "260"
1181            READ_HEXA( F_IN , HEXA , HEXA_NO );                         "270"
1182 
1183          PROM_WORD_TREATMENT(                                          "280"
1184            F_OUT , F_IN , SHORT(J) , PROM_NO , HEXA_NO );              "285"
1185 
1186          " SKIP THE REST OF THE LINE "                                 "290"
1187          FOR S := 1 TO                                                 "300"
1188            (PROMS_PR_ROW - COL - 1 )* HEXA_PR_SINGLE_PROM DO           "305"
1189            READ_HEXA( F_IN , HEXA, HEXA_NO );                          "310"
1190          J := J + 1L ;                                                 "320"
1191        END;                                                            "330"
1192    OUTNL( F_OUT ) ;                                                    "331"
1193    OUTSTRING( F_OUT , 'CHECKSUM: (:0:)' );                             "332"
1194    OUTHEXA( F_OUT ,SHORT1( PROM[ PROM_NO ].CHECKSUM ) , 5 ) ;          "334"
1195    OUTNL( F_OUT ) ;                                                    "336"
1196    OUTBYTE( F_OUT , EM ) ;                                             "340"
1197 
1198    I := PROM[ PROM_NO ].PARITY_BIT ;                                   "342"
1199    IF ( I>=0) AND ( I<=15 )                                            "344"
1200      THEN SETBIT( PARITY_BITS_IN_USE , I ) ;                           "346"
1201  END " EXTRACT PROM" ;                                                 "350"
1202 
1203 "PAGE" \f


1204  PROCEDURE PRINT_ID_RECORD(  S: STREAM;                                "10"
1205                              PROM_NO: INTEGER );                       "20"
1206  BEGIN                                                                 "30"
1207    OUTNL(S);                                                           "40"
1208    OUTSTRING( S , 'ORIGINATED BY: (:0:)' );                            "50"
1209    OUTSTRING( S , ID_RECORD.ORIGINATOR );                              "60"
1210 
1211    OUTNL(S);                                                           "70"
1212    OUTSTRING( S , 'PROJECT NO: (:0:)' );                               "80"
1213    OUT_LONG_INTEGER( S , ID_RECORD.PROJECT_NO , 8 );                   "90"
1214 
1215    OUTNL(S);                                                           "100"
1216    OUTSTRING( S , 'DATE: (:0:)' );                                     "110"
1217    OUT_LONG_INTEGER( S , ID_RECORD.DATE , 8 );                         "120"
1218 
1219    OUTNL( S ) ;                                                        "130"
1220    OUTSTRING( S , 'MODULE: (:0:)' );                                   "140"
1221    OUTTEXT( S , ID_RECORD.MODULE , 60 ) ;                              "150"
1222 
1223    OUTNL(S);                                                           "160"
1224    OUTSTRING( S , 'FLOPPY DISC NO CR/D/(:0:)' );                       "170"
1225    OUTINTEGER( S , ID_RECORD.FLOPPY_DISC_NO , 4 );                     "180"
1226 
1227    OUTNL(S);                                                           "190"
1228    OUTSTRING( S, 'SOURCE TEXT AND VERSION: (:0:)' );                   "200"
1229    OUTTEXT( S ,  ID_RECORD.SOURCE_TEXT ,60 );                          "210"
1230 
1231    OUTNL(S);                                                           "220"
1232    OUTSTRING( S , 'AREASIZE: (:0:)' );                                 "230"
1233    OUT_LONG_INTEGER( S , PROM_AREA.SIZE , 7 );                         "240"
1234 
1235    OUTNL(S);                                                           "250"
1236    OUTSTRING( S , 'AREA START ADDRESS: (:0:)' );                       "260"
1237    OUT_LONG_INTEGER( S , PROM_AREA.START_ADDRESS , 7 );                "270"
1238 
1239    OUTNL(S);                                                           "280"
1240    OUTSTRING( S , 'PROMSIZE: (:0:)' );                                 "290"
1241    OUT_LONG_INTEGER( S , PHYS_PROM.SIZE , 6) ;                         "300"
1242 
1243    OUTNL(S);                                                           "310"
1244    OUTSTRING( S , 'PROMWIDTH: (:0:)' );                                "320"
1245    OUTINTEGER( S , PHYS_PROM.WIDTH , 4 );                              "330"
1246 
1247    OUTNL(S);                                                           "340"
1248    OUTSTRING( S , 'PROM FILE: (:0:)' );                                "350"
1249    OUTSTRING( S , PROM[ PROM_NO ].FILE );                              "360"
1250 
1251    OUTNL(S);                                                           "370"
1252    OUTSTRING( S , 'PROMID: (:0:)' );                                   "380"
1253    OUTINTEGER( S ,PROM[ PROM_NO ].IDNO , 5 );                          "390"
1254 
1255    OUTSTRING( S , '  VERSION: (:0:)' );                                "400"
1256    OUTINTEGER( S , PROM[ PROM_NO ].VERSION , 3 );                      "410"
1257 
1258    IF PROM_NO <= NO_OF_PROMS                                           "420"
1259      THEN                                                              "422"
1260        BEGIN                                                           "423"
1261          OUTSTRING( S , '  PARITY BIT: (:0:)' );                       "424"
1262          OUTINTEGER( S , PROM[ PROM_NO ].PARITY_BIT , 2 );             "425"
1263        END;                                                            "427"
1264 
1265    OUTNL(S);                                                           "440"
1266    OUTSTRING( S , 'PROM INPUT FILE: (:0:)' );                          "450"
1267    OUTTEXT( S ,  PROM_INPUT_FILE , IDLENGTH ) ;                        "460"
1268 
1269    OUTNL( S );                                                         "465"
1270    OUTSTRING( S , 'PARAM INPUT FILE: (:0:)' );                         "470"
1271    OUTTEXT( S , PARAM_INPUT_FILE , IDLENGTH ) ;                        "480"
1272 
1273    OUTNL(S);                                                           "540"
1274  END "PRINT_ID_RECORD";                                                "550"
1275 
1276 
1277 "PAGE" \f


1278  PROCEDURE OC_CHECKSUM( PROM_NO : INTEGER ) ;                          "10"
1279  VAR S : STREAM ;                                                      "15"
1280  BEGIN                                                                 "20"
1281    OPEN( S , 'OC(:0:)' , OUTPUT ) ;                                    "30"
1282    OUTNL(S);                                                           "500"
1283    OUTSTRING( S , 'PROMID: (:0:)' );                                   "380"
1284    OUTINTEGER( S ,PROM[ PROM_NO ].IDNO , 5 );                          "390"
1285 
1286    OUTSTRING( S , '  VERSION: (:0:)' );                                "400"
1287    OUTINTEGER( S , PROM[ PROM_NO ].VERSION , 3 );                      "410"
1288    OUTNL(S);                                                           "370"
1289    OUTSTRING( S , 'CHECKSUM: (:0:)' );                                 "520"
1290    OUTHEXA( S , SHORT1( PROM[ PROM_NO ].CHECKSUM ) , 5 ) ;             "530"
1291 
1292    OUTNL( S ) ;                                                        "535"
1293    CLOSE( S ) ;                                                        "536"
1294  END "OC CHECKSUM" ;                                                   "540"
1295 "PAGE" \f


1296 "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
1297 "   MAIN PROGRAM                                                       "
1298 "**********************************************************************"
1299 
1300  BEGIN                                                                 "10"
1301    OPEN( S_IN , 'OC(:0:)' , INPUT );                                   "20"
1302    OPEN( S_OUT, 'OC(:0:)' , OUTPUT );                                  "30"
1303    GET_OC_PARAMS( S_IN , S_OUT ) ;                                     "40"
1304    CLOSE( S_IN);                                                       "50"
1305    CLOSE( S_OUT ) ;                                                    "60"
1306    IF PARAM[P].TAG = IDTYPE                                            "62"
1307      THEN PARAM_INPUT_FILE := PARAM[ P ].ID                            "63"
1308      ELSE PARAM_INPUT_FILE := 'OC(:0:)         ' ;                     "65"
1309    IF PARAM[S].TAG = IDTYPE                                            "66"
1310      THEN PROM_INPUT_FILE := PARAM[S].ID                               "67"
1311      ELSE PROM_INPUT_FILE := 'OC(:0:)         ' ;                      "69"
1312    OPEN( S_IN , PARAM_INPUT_FILE , INPUT ) ;                           "70"
1313    GET_DISC_PARAMS( S_IN );                                            "80"
1314    CLOSE( S_IN ) ;                                                     "90"
1315    CHECK_PARAMS ;                                                      "95"
1316    DEFINE_CONSTANTS ;                                                  "100"
1317    FOR I:=1 TO ( NO_OF_PROMS + NO_OF_PARITY_PROMS ) DO                 "110"
1318      BEGIN                                                             "120"
1319        OPEN( S_IN  , PROM_INPUT_FILE , INPUT );                        "130"
1320        OPEN( S_OUT , PROM[I].FILE , OUTPUT ) ;                         "140"
1321        PRINT_ID_RECORD( S_OUT , I );                                   "150"
1322        IF I <= NO_OF_PROMS                                             "162"
1323          THEN EXTRACT_PROM(  S_OUT , S_IN , I )                        "164"
1324          ELSE EXTRACT_PARITY_PROM( S_OUT , I);                         "166"
1325        CLOSE( S_IN ) ;                                                 "170"
1326        CLOSE( S_OUT ) ;                                                "180"
1327        OC_CHECKSUM( I );                                               "185"
1328      END;                                                              "190"
1329  END.                                                                  "200"

SUMMARY

COMPILER RELEASE:  2     
PROGRAM PART:      7363  
DATA PART:         6407  
PASCAL CODE SIZE:  7106  
OVERLAY AREA SIZE: 0     
SYSTEM AREA SIZE:  2820  
LINE STATISTICS:   2660  
SIZE OF CONSTANTS: 927   
WORK AREA CLAIM:   25000 
PROGRAM STATE:     REENTRANT
"190"
1329  END.                                                                  "200"

SUMMARY

COMPILER RELEASE: