|
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: 25344 (0x6300) Types: TextFile Names: »PLIST1«
└─⟦9975dd352⟧ Bits:30005088 8" CR80 Floppy CR80FD_0043 ( CR/D/1032 PROMGEN (HBA) 790917 HBA PROMGEN BACKUP ) └─⟦69b0db55a⟧ └─ ⟦this⟧ »HBA.PLIST1«
\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: