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

⟦87049ac65⟧ TextFile

    Length: 14592 (0x3900)
    Types: TextFile
    Names: »PPROC«

Derivation

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

TextFile

"PAGE" \f


"**********************************************************************"
" MAIN PROCEDURES                                                      "
"**********************************************************************"

 PROCEDURE DEFINE_CONSTANTS ;                                          "10"
 VAR L  : LONG_INTEGER ;                                               "15"
     I  : INTEGER ;                                                    "16"
 BEGIN                                                                 "20"
   PROMS_PR_ROW         := PROM_AREA.WIDTH DIV PHYS_PROM.WIDTH ;       "30"
   PROMS_PR_COLOUMN     := SHORT(( PROM_AREA.SIZE /                    "40"
                                   PHYS_PROM.SIZE )  );                "45"
   NO_OF_PROMS          := PROMS_PR_ROW * PROMS_PR_COLOUMN ;           "50"
   HEXA_PR_ROW          := PROM_AREA.WIDTH DIV 4 ;                     "60"
   HEXA_PR_SINGLE_PROM  := PHYS_PROM.WIDTH DIV 4 ;                     "70"
   L                    := LONG(HEXA_PR_ROW) * PHYS_PROM.SIZE ;        "75"
   HEXA_PR_PROM_ROW     := SHORT( L );                                 "80"
   FOR I := 0 TO SHORT( PHYS_PROM.SIZE ) - 1 DO                        "82"
     PARITY_AREA[ I ] := -1 ;                                          "84"
   PARITY_BITS_IN_USE := 0 ;                                           "86"

   FOR I:= 1 TO (NO_OF_PROMS + NO_OF_PARITY_PROMS ) DO                 "100"
     PROM[ I ].CHECKSUM := 0L ;                                        "110"
 END ;                                                                 "90"

"**********************************************************************"

"PAGE" \f


 PROCEDURE READ_FROM_PARITY_AREA( LEFT_BIT ,                           "10"
                                  ROW       : INTEGER ;                "20"
                                  VAR HEXA  : CHAR ) ;                 "40"
 VAR BIN  : INTEGER ;                                                  "50"
 BEGIN                                                                 "60"
   BIN := GETBITS( PARITY_AREA[ ROW ] ,                                "70"
                   LEFT_BIT ,                                          "80"
                   4 ) ;                                               "90"
   HEXA := BIN_TO_ASCII( BIN ) ;                                       "100"
 END "READ FROM PARITY AREA" ;                                         "110"



 PROCEDURE READ_HEXA( S           : STREAM ;                           "10"
                      VAR HEXA    : CHAR ;                             "20"
                      VAR NO      : INTEGER   ) ;                      "30"
 VAR   CH    : CHAR ;                                                  "40"
 BEGIN                                                                 "50"
   IF NO MOD 32 = 0                                                    "60"
     THEN                                                              "70"
       BEGIN                                                           "80"
         REPEAT                                                        "90"
           INBYTE( S , CH );                                           "100"
         UNTIL                                                         "110"
           CH = 'L' ;                                                  "120"
       END;                                                            "130"

   REPEAT                                                              "140"
     INBYTE( S , CH )                                                  "150"
   UNTIL                                                               "160"
     XXXHEXADIGIT( CH );                                               "170"

   HEXA := CH ;                                                        "180"
   NO := NO + 1 ;                                                      "190"
 END "READ HEXA";                                                      "200"


 PROCEDURE IN_IDENT( S: STREAM  ;                                      "10"
                    VAR IDF: IDENTIFIER );                             "20"
 VAR CH: CHAR;                                                         "30"
     I : INTEGER;                                                      "40"
 BEGIN                                                                 "50"
   FOR I:= 1 TO IDLENGTH DO                                            "60"
     IDF[I] := NULL;                                                   "70"
   REPEAT                                                              "80"
     INBYTE( S , CH );                                                 "90"
   UNTIL                                                               "100"
     NOT ( (CH=NL) OR (CH=SP) OR (CH=EM)) ;                            "110"
   IDF[1] := CH ;                                                      "120"
   I:=1;                                                               "130"
   REPEAT                                                              "140"
     INBYTE( S , CH );                                                 "150"
     I:= I + 1 ;                                                       "160"
     IDF[ I ] := CH ;                                                  "170"
   UNTIL                                                               "180"
     (CH=NL) OR (CH=SP) OR (CH=EM) OR (I>=IDLENGTH) ;                  "190"
   IDF[ I ] := NULL ;                                                  "195"
 END "IN_IDENT" ;                                                      "200"



"PAGE" \f


 PROCEDURE GET_OC_PARAMS( OC_IN , OC_OUT : STREAM );                   "10"
 BEGIN                                                                 "20"
   OUTNL( OC_OUT );                                                    "30"
   OUTSTRING( OC_OUT, 'ORIGINATED BY: (:0:)');                         "40"
   OUTNL( OC_OUT );                                                    "50"

   IN_IDENT( OC_IN , ID_RECORD.ORIGINATOR );                           "60"

   OUTNL(OC_OUT);                                                      "70"
   OUTSTRING( OC_OUT, 'PROJECT NO: (:0:)' );                           "80"
   OUTNL(OC_OUT);                                                      "90"
   IN_LONG_INTEGER( OC_IN , ID_RECORD.PROJECT_NO);                     "100"

   OUTNL(OC_OUT);                                                      "110"
   OUTSTRING( OC_OUT , 'DATE: (:0:)' );                                "120"
   OUTNL(OC_OUT);                                                      "130"
   IN_LONG_INTEGER( OC_IN , ID_RECORD.DATE );                          "140"

   OUTNL(OC_OUT);                                                      "150"
   OUTSTRING(OC_OUT, 'FLOPPY DISC NO, CR/D: (:0:)' );                  "160"
   OUTNL(OC_OUT);                                                      "170"
   ININTEGER( OC_IN , ID_RECORD.FLOPPY_DISC_NO );                      "180"

   OUTNL(OC_OUT);                                                      "190"
   OUTSTRING( OC_OUT ,'SOURCE TEXT AND VERSION: (:0:)' );              "200"
   OUTNL(OC_OUT);                                                      "210"
   INLINE(OC_IN , ID_RECORD.SOURCE_TEXT );                             "220"

   OUTNL(OC_OUT);                                                      "230"
   OUTSTRING( OC_OUT, 'AREASIZE: (:0:)' );                             "240"
   OUTNL(OC_OUT);                                                      "250"
   IN_LONG_INTEGER( OC_IN , PROM_AREA.SIZE );                          "260"

   OUTNL(OC_OUT);                                                      "270"
   OUTSTRING( OC_OUT, 'AREA STARTADDRESS: (:0:)' );                    "280"
   OUTNL(OC_OUT);                                                      "290"
   IN_LONG_INTEGER( OC_IN, PROM_AREA.START_ADDRESS);                   "300"

 END "GET_OC_PARAMS" ;                                                 "310"


"PAGE" \f


 PROCEDURE GET_DISC_PARAMS( S: STREAM );                               "10"
 VAR I , SEQ_NO, PROM_NO,                                              "20"
     P_NO                 : INTEGER ;                                  "25"
       CH                 : CHAR ;                                     "30"
       TXT                : TEXT ;                                     "40"
       IDF                : IDENTIFIER ;                               "50"
 BEGIN                                                                 "60"
   FOR I:= 1 TO 5 DO                                                   "70"
     BEGIN                                                             "80"
       REPEAT                                                          "90"
         INBYTE( S , CH );                                             "100"
       UNTIL                                                           "110"
         CH= '#';                                                      "120"

       IN_IDENT( S , IDF ) ;                                           "130"

       CASE I OF                                                       "140"
     1:  BEGIN                                                         "150"
           IF IDF <> 'MODULE(:0:)(:0:)(:0:)(:0:)(:0:)(:0:)'            "160"
             THEN XXXERROR('MODULE PARAM(:0:)')                        "170"
             ELSE INLINE( S , ID_RECORD.MODULE );                      "180"
         END;                                                          "190"
     2:  BEGIN                                                         "200"
           IF IDF <> 'WORDSIZE(:0:)(:0:)(:0:)(:0:)'                    "210"
             THEN XXXERROR('WORDSIZE PARAM(:0:)')                      "220"
             ELSE ININTEGER( S , PROM_AREA.WIDTH );                    "230"
         END;                                                          "240"
     3:  BEGIN                                                         "250"
           IF IDF <> 'PROMSIZE(:0:)(:0:)(:0:)(:0:)'                    "260"
             THEN XXXERROR('PROMSIZE PARAM(:0:)' )                     "270"
             ELSE IN_LONG_INTEGER( S , PHYS_PROM.SIZE );               "280"
         END;                                                          "290"
     4:  BEGIN                                                         "300"
           IF IDF <> 'PROMWIDTH(:0:)(:0:)(:0:)'                        "310"
             THEN XXXERROR('PROMWIDTH PARAM(:0:)' )                    "320"
             ELSE ININTEGER( S , PHYS_PROM.WIDTH );                    "330"
         END ;                                                         "340"
     5:  BEGIN                                                         "341"
           IF IDF <> 'PARITYPROMS(:0:)'                                "342"
             THEN XXXERROR('PARITY PROM PARAM(:0:)' )                  "343"
             ELSE ININTEGER( S , NO_OF_PARITY_PROMS ) ;                "344"
         END                                                           "345"
       END "CASE";                                                     "350"
     END "FOR I";                                                      "360"
   NO_OF_PROMS := ( PROM_AREA.WIDTH DIV PHYS_PROM.WIDTH) *             "320"
             SHORT( PROM_AREA.SIZE /   PHYS_PROM.SIZE );               "380"
 PROM_NO := 0;                                                         "390"
 P_NO := 0 ;                                                           "395"

 REPEAT                                                                "400"
   PROM_NO := PROM_NO + 1 ;                                            "410"
   IF PROM_NO = NO_OF_PROMS + 1                                        "412"
     THEN P_NO := 0;                                                   "414"
   P_NO := P_NO + 1 ;                                                  "416"

   REPEAT                                                              "420"
     INBYTE( S , CH );                                                 "430"
   UNTIL                                                               "440"
     CH='#';                                                           "450"

   ININTEGER( S , SEQ_NO );                                            "460"
   IF SEQ_NO <> P_NO                                                   "470"
     THEN XXXERROR('PARAM PROM SEQUENCE ERROR(:0:)' );                 "475"
   IN_IDENT( S , PROM[ PROM_NO ].FILE );                               "480"
   ININTEGER( S, PROM[ PROM_NO ].IDNO );                               "490"
   ININTEGER( S , PROM[ PROM_NO ].VERSION );                           "500"
   IF PROM_NO <= NO_OF_PROMS                                           "504"
     THEN ININTEGER( S , PROM[ PROM_NO ].PARITY_BIT ) ;                "510"
 UNTIL                                                                 "520"
   PROM_NO >= NO_OF_PROMS + NO_OF_PARITY_PROMS ;                       "530"
 END "GET DISC PARAMS";                                                "540"

"PAGE" \f


 PROCEDURE CHECK_PARAMS;
 VAR TEST   : INTEGER ;
 BEGIN

   TEST := SHORT( PROM_AREA.SIZE ) ;                                   "40"
   IF ( TEST < MIN_AREASIZE )
       OR ( TEST > MAX_AREASIZE )
     THEN XXXERROR('AREASIZE CONTENT(:0:)' );


   TEST := SHORT( PHYS_PROM.SIZE ) ;                                   "80"
   IF ( TEST < MIN_PROMSIZE ) OR ( TEST > MAX_PROMSIZE )
   OR ( TEST > SHORT( PROM_AREA.SIZE ) )                               "100"
   OR ( SHORT( PROM_AREA.SIZE) MOD TEST <> 0 )                         "110"
     THEN XXXERROR( 'PROMSIZE CONTENT(:0:)' );


   TEST := SHORT( PROM_AREA.START_ADDRESS ) ;                          "130"
   IF ( TEST < 0 ) OR ( TEST >= SHORT( PROM_AREA.SIZE )  )             "140"
     THEN XXXERROR( ' START ADDRESS CONTENT(:0:)' );


   TEST := PROM_AREA.WIDTH ;
   IF ( TEST < MIN_WORDSIZE ) OR (TEST > MAX_WORDSIZE )
   OR (TEST MOD 4 <>0 )
     THEN XXXERROR( 'WORDSIZE CONTENT(:0:)' );

   TEST := PHYS_PROM.WIDTH ;
   IF ( TEST < MIN_PROMWIDTH ) OR (TEST > MAX_PROMWIDTH )
   OR ( TEST MOD 4 <> 0 )
   OR ( TEST > PROM_AREA.WIDTH )                                       "230"
     THEN XXXERROR( 'PROMWIDTH CONTENT(:0:)' );

 END " CHECK PARAMS";

"PAGE" \f



 PROCEDURE PROM_WORD_TREATMENT( F_OUT , F_IN : STREAM ;                "10"
                                ROW,                                   "20"
                                PROM_NO      : INTEGER ;               "40"
                                VAR HEXA_NO  : INTEGER ) ;             "50"
 CONST CR = '(:10:)' ;
 VAR I,                                                                "60"
     J ,                                                               "62"
     ADDR ,                                                            "66"
     LEFT_BIT ,                                                        "68"
     HEXAS_OUTPUT,                                                     "70"
     BIN,                                                              "80"
     WORD,                                                             "90"
     P_BIT ,                                                           "95"
     ONES          : INTEGER ;                                         "100"
     HEXA          : CHAR ;                                            "110"
 BEGIN                                                                 "120"
   ADDR := SHORT( PROM_AREA.START_ADDRESS ) ;                          "130"
   IF ( ROW= ADDR ) AND ( ADDR > 0 ) AND ( PROM_NO <= PROMS_PR_ROW )   "135"
     THEN                                                              "140"
       BEGIN                                                           "150"

         I:= PHYS_PROM.WIDTH ;
         IF I=4 THEN WORD := #F
           ELSE IF I=8 THEN WORD:= #FF
             ELSE WORD := #FFFF ;

         FOR I :=0 TO (ADDR - 1 ) DO
           PROM[PROM_NO].CHECKSUM := PROM[PROM_NO].CHECKSUM +
             LONG( WORD ) ;

         OUTBYTE(F_OUT , STX ) ;                                       "151"
         OUTBYTE( F_OUT , CR ) ;                                       "152"

         ADDR := ADDR*HEXA_PR_SINGLE_PROM ;                            "153"

         FOR J := 1 TO ADDR DIV 32 DO                                  "154"
           BEGIN                                                       "155"
             FOR I:= 1 TO 32 DO                                        "156"
               BEGIN                                                   "157"
                 OUTBYTE( F_OUT , 'F' );                               "158"
                 IF ( I MOD HEXA_PR_SINGLE_PROM = 0 )                  "158.5"
                   THEN OUTBYTE( F_OUT , SP ) ;                        "159"
               END;                                                    "160"
             OUTBYTE( F_OUT , CR );                                    "161"
             OUTBYTES( F_OUT , NULL , 7 );                             "162"
           END;                                                        "163"

         FOR J:= 1 TO ADDR MOD 32 DO                                   "165"
           BEGIN                                                       "166"
             OUTBYTE( F_OUT , 'F' ) ;                                  "167"
             IF ( J MOD HEXA_PR_SINGLE_PROM = 0 )                      "168"
               THEN OUTBYTE( F_OUT , SP ) ;                            "169"
           END;                                                        "170"
       END;                                                            "195"

   WORD := 0 ;                                                         "200"
   FOR I:= 1 TO HEXA_PR_SINGLE_PROM DO                                 "210"
     BEGIN                                                             "220"
       IF PROM_NO > NO_OF_PROMS                                        "230"
         THEN                                                          "231"
           BEGIN                                                       "232"
             LEFT_BIT :=                                               "233"
             (PROM_NO-NO_OF_PROMS)*PHYS_PROM.WIDTH  -4*(I-1) - 1 ;     "234"
             READ_FROM_PARITY_AREA( LEFT_BIT , ROW , HEXA ) ;          "235"
           END                                                         "237"
         ELSE READ_HEXA( F_IN , HEXA , HEXA_NO ) ;                     "236"

       IF (I=1) AND (ROW=0 ) THEN                                      "240"
         BEGIN                                                         "250"
           OUTBYTE( F_OUT , STX ) ;                                    "260"
           OUTBYTE( F_OUT , CR );                                      "270"
         END;                                                          "280"
       OUTBYTE( F_OUT , HEXA );                                        "290"
       HEXAS_OUTPUT := ROW*HEXA_PR_SINGLE_PROM  +  I ;                 "300"
       IF ( LONG( ROW ) = PHYS_PROM.SIZE - 1L ) AND                    "310"
          ( I = HEXA_PR_SINGLE_PROM )                                  "320"
         THEN                                                          "325"
           BEGIN                                                       "330"
             OUTBYTE( F_OUT , SP ) ;                                   "335"
             OUTBYTE(F_OUT , ETX );                                    "350"
             OUTBYTES( F_OUT , NULL , 7 ) ;                            "354"
             OUTNL( F_OUT ) ;                                          "356"
           END                                                         "360"
         ELSE                                                          "370"
           BEGIN                                                       "380"
             IF ((HEXAS_OUTPUT MOD 32) = 0 )                           "400"
               THEN                                                    "410"
                 BEGIN                                                 "420"
                   OUTBYTE( F_OUT , SP ) ;                             "425"
                   OUTBYTE( F_OUT , CR );                              "430"
                   OUTBYTES( F_OUT , NULL , 7 );                       "440"
                 END                                                   "450"
               ELSE                                                    "460"
                 BEGIN                                                 "470"
                   IF HEXAS_OUTPUT MOD HEXA_PR_SINGLE_PROM = 0         "480"
                     THEN OUTBYTE( F_OUT , SP );                       "490"
                 END;                                                  "500"
           END;                                                        "510"

       BIN := ASCII_TO_BIN( HEXA ) ;                                   "520"
       WORD := LEFTSHIFT( WORD , 4 )  + BIN ;                          "530"
     END "FOR I " ;                                                    "540"

   PROM[ PROM_NO].CHECKSUM :=                                          "600"
     PROM[PROM_NO].CHECKSUM + LONG( WORD ) ;                           "610"

   IF PROM_NO <= NO_OF_PROMS                                           "612"
     THEN                                                              "613"
       P_BIT := PROM[ PROM_NO ].PARITY_BIT ;                           "614"

   IF (PROM_NO <= NO_OF_PROMS ) AND ( P_BIT >=0) AND ( P_BIT <= 15)    "620"
     THEN                                                              "630"
       BEGIN                                                           "640"
         ONES := 0;                                                    "650"
         FOR I := 0 TO PHYS_PROM.WIDTH -1 DO                           "660"
           IF TESTBIT( WORD , I )                                      "670"
             THEN ONES := ONES + 1 ;                                   "680"
         IF TESTBIT(PARITY_BITS_IN_USE , P_BIT )                       "690"
           THEN                                                        "700"
           BEGIN                                                       "710"
               IF GETBITS( ONES , 0 , 1 ) <>                           "720"
                  GETBITS( PARITY_AREA[ROW] , P_BIT , 1 )              "730"
                 THEN SETBIT( PARITY_AREA[ ROW ] , P_BIT )             "740"
                 ELSE CLEARBIT(PARITY_AREA[ROW ] , P_BIT )             "750"
             END                                                       "760"
           ELSE                                                        "770"
             BEGIN                                                     "780"
               IF TESTBIT( ONES , 0 )                                  "790"
                 THEN CLEARBIT( PARITY_AREA[ROW], P_BIT )              "800"
                 ELSE SETBIT( PARITY_AREA[ROW] , P_BIT )               "810"
             END;                                                      "820"
       END;                                                            "830"
 END "PROMWORD TREATMENT" ;                                            "840"

"PAGE" \f



 FUNCTION SHORT1( L_INT: UNIV LONG1 ) : INTEGER ;                      "10"
 BEGIN                                                                 "20"
   SHORT1 := L_INT.LSB ;                                               "30"
 END;                                                                  "40"


"PAGE" \f



 PROCEDURE EXTRACT_PARITY_PROM(   F_OUT     : STREAM ;                 "10"
                                  PROM_NO   : INTEGER ) ;              "20"
 VAR J,                                                                "30"
     COL : INTEGER ;                                                   "40"
 BEGIN                                                                 "50"
   COL := 16 DIV PHYS_PROM.WIDTH - PROM_NO ;                           "60"
   J:= 0 ;                                                             "70"
   REPEAT                                                              "80"
     PROM_WORD_TREATMENT( F_OUT , S_IN , J ,                           "110"
                          PROM_NO , HEXA_NO ) ;                        "115"
     J := J + 1 ;                                                      "120"
   UNTIL                                                               "130"
     J >=SHORT( PHYS_PROM.SIZE ) ;                                     "140"

   OUTNL( F_OUT ) ;                                                    "142"
   OUTSTRING( F_OUT , 'CHECKSUM: (:0:)' );
   OUTHEXA( F_OUT ,SHORT1( PROM[ PROM_NO ].CHECKSUM ) , 5 ) ;          "146"
   OUTNL( F_OUT ) ;
   OUTBYTE( F_OUT , EM );                                              "149"
 END " EXTRACT PARITY PROM" ;                                          "150"


"PAGE" \f


 PROCEDURE EXTRACT_PROM( F_OUT,F_IN : STREAM ;                         "10"
                         PROM_NO     : INTEGER );                      "20"

 VAR ROW , COL , I , S            : INTEGER ;                          "30"
     HEXA                         : CHAR ;                             "40"
     START,J ,OFFSET_NO           : LONG_INTEGER ;                     "50"
 BEGIN                                                                 "60"
   HEXA_NO := 0 ;                                                      "70"
   ROW := ( PROM_NO - 1 ) DIV PROMS_PR_ROW ;                           "80"
   COL := ( PROM_NO - 1 ) MOD PROMS_PR_ROW ;                           "90"

   IF ROW=0                                                            "110"
     THEN START := PROM_AREA.START_ADDRESS                             "120"
     ELSE START := 0L ;                                                "130"

   IF ROW >= 1                                                         "140"
     THEN                                                              "150"
       BEGIN                                                           "160"
         J := PHYS_PROM.SIZE - PROM_AREA.START_ADDRESS ;               "170"
   " ROW POSITIONING "                                                 "175"
         OFFSET_NO := J * LONG( HEXA_PR_ROW )                          "180"
                      + LONG( HEXA_PR_PROM_ROW * ( ROW-1 ) );          "185"
         J := 0L ;                                                     "190"
         REPEAT                                                        "200"
           J:= J + 1L ;                                                "205"
           READ_HEXA( F_IN , HEXA , HEXA_NO ) ;                        "210"
         UNTIL                                                         "215"
           J >= OFFSET_NO ;                                            "218"
       END " ROW > 1 " ;                                               "220"

   J := START ;                                                        "230"
   WHILE                                                               "235"
     J < PHYS_PROM.SIZE DO                                             "240"
       BEGIN                                                           "245"
         "POSITION IN THE PROMAREA WORD "                              "250"
         FOR S := 1 TO COL*HEXA_PR_SINGLE_PROM DO                      "260"
           READ_HEXA( F_IN , HEXA , HEXA_NO );                         "270"

         PROM_WORD_TREATMENT(                                          "280"
           F_OUT , F_IN , SHORT(J) , PROM_NO , HEXA_NO );              "285"

         " SKIP THE REST OF THE LINE "                                 "290"
         FOR S := 1 TO                                                 "300"
           (PROMS_PR_ROW - COL - 1 )* HEXA_PR_SINGLE_PROM DO           "305"
           READ_HEXA( F_IN , HEXA, HEXA_NO );                          "310"
         J := J + 1L ;                                                 "320"
       END;                                                            "330"
   OUTNL( F_OUT ) ;                                                    "331"
   OUTSTRING( F_OUT , 'CHECKSUM: (:0:)' );                             "332"
   OUTHEXA( F_OUT ,SHORT1( PROM[ PROM_NO ].CHECKSUM ) , 5 ) ;          "334"
   OUTNL( F_OUT ) ;                                                    "336"
   OUTBYTE( F_OUT , EM ) ;                                             "340"

   I := PROM[ PROM_NO ].PARITY_BIT ;                                   "342"
   IF ( I>=0) AND ( I<=15 )                                            "344"
     THEN SETBIT( PARITY_BITS_IN_USE , I ) ;                           "346"
 END " EXTRACT PROM" ;                                                 "350"

"PAGE" \f


 PROCEDURE PRINT_ID_RECORD(  S: STREAM;                                "10"
                             PROM_NO: INTEGER );                       "20"
 BEGIN                                                                 "30"
   OUTNL(S);                                                           "40"
   OUTSTRING( S , 'ORIGINATED BY: (:0:)' );                            "50"
   OUTSTRING( S , ID_RECORD.ORIGINATOR );                              "60"

   OUTNL(S);                                                           "70"
   OUTSTRING( S , 'PROJECT NO: (:0:)' );                               "80"
   OUT_LONG_INTEGER( S , ID_RECORD.PROJECT_NO , 8 );                   "90"

   OUTNL(S);                                                           "100"
   OUTSTRING( S , 'DATE: (:0:)' );                                     "110"
   OUT_LONG_INTEGER( S , ID_RECORD.DATE , 8 );                         "120"

   OUTNL( S ) ;                                                        "130"
   OUTSTRING( S , 'MODULE: (:0:)' );                                   "140"
   OUTTEXT( S , ID_RECORD.MODULE , 60 ) ;                              "150"

   OUTNL(S);                                                           "160"
   OUTSTRING( S , 'FLOPPY DISC NO CR/D/(:0:)' );                       "170"
   OUTINTEGER( S , ID_RECORD.FLOPPY_DISC_NO , 4 );                     "180"

   OUTNL(S);                                                           "190"
   OUTSTRING( S, 'SOURCE TEXT AND VERSION: (:0:)' );                   "200"
   OUTTEXT( S ,  ID_RECORD.SOURCE_TEXT ,60 );                          "210"

   OUTNL(S);                                                           "220"
   OUTSTRING( S , 'AREASIZE: (:0:)' );                                 "230"
   OUT_LONG_INTEGER( S , PROM_AREA.SIZE , 7 );                         "240"

   OUTNL(S);                                                           "250"
   OUTSTRING( S , 'AREA START ADDRESS: (:0:)' );                       "260"
   OUT_LONG_INTEGER( S , PROM_AREA.START_ADDRESS , 7 );                "270"

   OUTNL(S);                                                           "280"
   OUTSTRING( S , 'PROMSIZE: (:0:)' );                                 "290"
   OUT_LONG_INTEGER( S , PHYS_PROM.SIZE , 6) ;                         "300"

   OUTNL(S);                                                           "310"
   OUTSTRING( S , 'PROMWIDTH: (:0:)' );                                "320"
   OUTINTEGER( S , PHYS_PROM.WIDTH , 4 );                              "330"

   OUTNL(S);                                                           "340"
   OUTSTRING( S , 'PROM FILE: (:0:)' );                                "350"
   OUTSTRING( S , PROM[ PROM_NO ].FILE );                              "360"

   OUTNL(S);                                                           "370"
   OUTSTRING( S , 'PROMID: (:0:)' );                                   "380"
   OUTINTEGER( S ,PROM[ PROM_NO ].IDNO , 5 );                          "390"

   OUTSTRING( S , '  VERSION: (:0:)' );                                "400"
   OUTINTEGER( S , PROM[ PROM_NO ].VERSION , 3 );                      "410"

   IF PROM_NO <= NO_OF_PROMS                                           "420"
     THEN                                                              "422"
       BEGIN                                                           "423"
         OUTSTRING( S , '  PARITY BIT: (:0:)' );                       "424"
         OUTINTEGER( S , PROM[ PROM_NO ].PARITY_BIT , 2 );             "425"
       END;                                                            "427"

   OUTNL(S);                                                           "440"
   OUTSTRING( S , 'PROM INPUT FILE: (:0:)' );                          "450"
   OUTTEXT( S ,  PROM_INPUT_FILE , IDLENGTH ) ;                        "460"

   OUTNL( S );                                                         "465"
   OUTSTRING( S , 'PARAM INPUT FILE: (:0:)' );                         "470"
   OUTTEXT( S , PARAM_INPUT_FILE , IDLENGTH ) ;                        "480"

   OUTNL(S);                                                           "540"
 END "PRINT_ID_RECORD";                                                "550"


"PAGE" \f


 PROCEDURE OC_CHECKSUM( PROM_NO : INTEGER ) ;                          "10"
 VAR S : STREAM ;                                                      "15"
 BEGIN                                                                 "20"
   OPEN( S , 'OC(:0:)' , OUTPUT ) ;                                    "30"
   OUTNL(S);                                                           "500"
   OUTSTRING( S , 'PROMID: (:0:)' );                                   "380"
   OUTINTEGER( S ,PROM[ PROM_NO ].IDNO , 5 );                          "390"

   OUTSTRING( S , '  VERSION: (:0:)' );                                "400"
   OUTINTEGER( S , PROM[ PROM_NO ].VERSION , 3 );                      "410"
   OUTNL(S);                                                           "370"
   OUTSTRING( S , 'CHECKSUM: (:0:)' );                                 "520"
   OUTHEXA( S , SHORT1( PROM[ PROM_NO ].CHECKSUM ) , 5 ) ;             "530"

   OUTNL( S ) ;                                                        "535"
   CLOSE( S ) ;                                                        "536"
 END "OC CHECKSUM" ;                                                   "540"
«eof»