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