|
|
DataMuseum.dkPresents historical artifacts from the history of: CR80 Hard and Floppy Disks |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about CR80 Hard and Floppy Disks Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - download
Length: 14592 (0x3900)
Types: TextFile
Names: »PPROC«
└─⟦9975dd352⟧ Bits:30005088 8" CR80 Floppy CR80FD_0043 ( CR/D/1032 PROMGEN (HBA) 790917 HBA PROMGEN BACKUP )
└─⟦69b0db55a⟧
└─⟦this⟧ »HBA.PPROC«
"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»