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: 33152 (0x8180) Types: TextFile Names: »PS1«
└─⟦9975dd352⟧ Bits:30005088 8" CR80 Floppy CR80FD_0043 ( CR/D/1032 PROMGEN (HBA) 790917 HBA PROMGEN BACKUP ) └─⟦69b0db55a⟧ └─ ⟦this⟧ »HBA.PS1«
%SUMMARY %LIST %WORKAREA=25000 "PAGE" \f "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" " " " MODULE NUMBER CSS/103/L-D/0100 NAME PROMGEN PROGRAM LISTING " " " " GENERAL PURPOSE PROM GENERATING PROGRAM " " " " ROVSING FH/790822 RELEASE 01 VERSION 001 " " " "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" " " " FUNCTION " " " " THE PROMGEN PROGRAM GENERATES PROMDESCRIPTIONS FROM A GIVEN " " HEXADECIMAL INPUT DISC FILE. " " THE PROMDESCRIPTIONS DEFINES THE CONTENT OF A NUMBER OF " " PROMS EACH CONTAINED IN ITS OWN DISCFILE. " " THESE DISCFILES HAVE TO BE CREATED PRIOR TO PROMGEN EXECUTION " " THE PROMDESCRIPTION IS AFTER A COPY TO A MAGNETIC TAPE , " " DIRECT USABLE AS INPUT TO A 'DATA I/O' PROM PROGRAMMER. " " PROMGEN TAKES FIXED INPUT PARAMETERS FROM A DISCFILE( " " SPECIFIED IN THE PROMGEN CALL) AND DYNAMIC PARAMETERS FROM " " THE OPERATORS CONSOLE. " " " "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" "PAGE" \f " " "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" " " " INTERFACE " " INVOCATION " " PROGRAM CALL: PROMGEN S:<PDATA> P:<PARAM> " " PROMGEN: THE ASSEMBLED PROGRAM. " " PDATA : THE HEXADECIMAL INPUTFILE TO BE PROMMED. " " PARAM : FIXED INPUT PARAMETER FILE. " " " " THE PROGRAM REQUIRES INPUT PARAMETERS FROM OC: " " " " ORIGINATED BY: <IDENTIFIER> " " PROJECT NO: <LONG INTEGER> " " DATE: <LONG INTEGER> " " FLOPPY DISC NO,CR/D/: <INTEGER> " " SOURCETEXT AND VERSION: <TEXT> " " AREASIZE: <INTEGER> " " AREASTART ADDRESS: <INTEGER> " " WHERE THE TEXT BEFORE : IS SUPPLIED BY THE PROGRAM. " " THE < > IS SUPPLIED AS AN ANSWER BY THE OPERATOR. " " " " FORMAT OF THE PARAM DISCFILE: " " " " # MODULE <TEXT> " " # WORDSIZE <INTEGER> " " # PROMSIZE <INTEGER> " " # PROMWIDTH <INTEGER> " " # PARITYPROMS <INTEGER> " " [ # <SEQNO> <PROMFILE> <PROMID> <VERSION> <PARITYBIT> ]X " " [ # <SEQNO> <PARITYFILE> <PROMID> <VERSION> ]Y " " WHERE X= NUMBER OF PROMS(PARITY PROMS EXCLUDED). " " Y= NUMBER OF PARITY PROMS. " " X AND Y ARE REPETITIONS FACTORS. " " " " OUTPUT " " " " FOR EACH GENERATED PROM , THE PROGRAM WRITES ON THE " " OPERATORS CONSOLE: " " " " PROMID: <INTEGER> VERSION: <INTEGER> " " CHECKSUM: <HEXADECIMAL NUMBER> " " " " EXIT " " THE PROGRAM RELINQUISHES CONTROL, WHEN ALL THE SPECIFIED " " PROMS ARE CREATED OR IF A PARAMETER ERROR IS FOUND. " " " "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" " " " EXCEPTIONS " " " " IF A PARAMETER IS ILLEGAL, THE PROGRAM STOPS AND " " ISSUES AN APPROPRIATE ERRORMESSAGE. " " " "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" "PAGE" \f "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" " " " PROGRAM GENERATION " " THE SOURCE PROGRAM CONSISTS OF THE FOLLOWING FILES: " " " " PMODULE : MODULE HEADER " " PREFIX : PREFIX ROUTINES " " IODEC : IO DECLARATIONS AND CONSTANTS " " PDEC : PROMGEN DECLARATIONS AND CONSTANTS " " IO : IO PROCEDURES " " PPROC : PROMGEN PROCEDURES " " PPROG : PROMGEN MAIN PROGRAM " " " " THESE SOURCE PROGRAMS ARE MERGED: " " MERGE S: PMERGE1 O:PS1 " " " " HEREAFTER THE COMPILER IS CALLED: " " COMPILE S:PS1 O:GENOBJ P:PLIST1 " " " " THE BLOCKSIZE IS CHANGED: " " CONV41 S:GENOBJ O:PROMGEN.BIN " " " "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" " " " PROGRAM STORAGE " " " " CR/D/1327 " " " "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" " " " REFERENCE DOCUMENTS " " VERSION DESCRIPTION DOCUMENT: CSS/103/VDD/0018 " " USERS MANUAL: CSS/103/USM/0025 " " LISTING : CSS/103/LST/0001 " " " "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" "PAGE" \f %NOLIST "##################################################" "CR80 SEQUENTIAL PASCAL STANDARD PREFIX. PHO-790330" "##################################################" CONST NL = '(:10:)'; FF = '(:12:)'; CR = '(:13:)'; EM = '(:25:)'; CONST NULL = '(:0:)'; SP = ' '; CONST PAGELENGTH = 256; TYPE PAGE = ARRAY [1..PAGELENGTH] OF INTEGER; CONST LINELENGTH = 132; TYPE LINE = ARRAY [1..LINELENGTH] OF CHAR; CONST IDLENGTH = 12; TYPE IDENTIFIER = ARRAY [1..IDLENGTH] OF CHAR; TYPE FILE = 1..2; TYPE ARGTAG = (NILTYPE, BOOLTYPE, INTTYPE, IDTYPE, PTRTYPE); TYPE POINTER = @BOOLEAN; TYPE ARGTYPE = RECORD CASE TAG: ARGTAG OF NILTYPE, BOOLTYPE: (BOOL: BOOLEAN); INTTYPE: (INT: INTEGER); IDTYPE: (ID: IDENTIFIER); PTRTYPE: (PTR: POINTER) END; CONST MAXARG = 10; TYPE ARGLIST = ARRAY [1..MAXARG] OF ARGTYPE; CONST S = 2; P = 3; O = 4; N = 5; D = 6; L = 7; TYPE ARGSEQ = (INP, OUT); TYPE PROGRESULT = (TERMINATED, OVERFLOW, POINTERERROR, RANGEERROR, VARIANTERROR, HEAPLIMIT, STACKLIMIT, CODELIMIT, TIMELIMIT, CALLERROR); TYPE BITPOSITION = 0..15; TYPE BITFIELDLENGTH = 0..16; TYPE BITVALUE = (LOW, HIGH); TYPE MESSAGE_BUFFER = ARRAY (.1..5.) OF INTEGER; TYPE EVENT_TYPE = (TIME_OUT, ANSWER, MESSAGE, INTERRUPT); TYPE WORD_ADDRESS = RECORD MEMORY_SECTION: INTEGER; WORD_DISPLACEMENT:INTEGER END; TYPE BYTE_ADDRESS = RECORD BYTE_DISPLACEMENT: INTEGER; WORD_ADDR: WORD_ADDRESS END; TYPE PROCESS_NAME = RECORD NAME: ARRAY [0..2] OF CHAR; NAME_IDENT:INTEGER; PROC_IDENT:INTEGER END; PROCEDURE READ(VAR C: CHAR); PROCEDURE WRITE(C: CHAR); PROCEDURE OPEN(F: FILE; ID: IDENTIFIER; VAR FOUND: BOOLEAN); PROCEDURE CLOSE(F: FILE); PROCEDURE GET(F: FILE; P: INTEGER; VAR BLOCK: UNIV PAGE); PROCEDURE PUT(F: FILE; P: INTEGER; VAR BLOCK: UNIV PAGE); PROCEDURE READARG(S: ARGSEQ; VAR ARG: ARGTYPE); PROCEDURE WRITEARG(S: ARGSEQ; ARG: ARGTYPE); PROCEDURE ACCEPT(VAR C:CHAR); PROCEDURE DISPLAY(C: CHAR); PROCEDURE MARK(VAR TOP: INTEGER); PROCEDURE RELEASE(TOP: INTEGER); PROCEDURE RUN(ID: IDENTIFIER; VAR PARAM: ARGLIST; VAR LINE: INTEGER; VAR RESULT: PROGRESULT); PROCEDURE EXIT; PROCEDURE HALT; PROCEDURE SET_TRACE(MASK: INTEGER; DEVICE:IDENTIFIER); PROCEDURE PRINT_TRACE(ON: BOOLEAN); FUNCTION IAND(MASK1, MASK2: UNIV INTEGER): INTEGER; FUNCTION IOR(MASK1, MASK2: UNIV INTEGER): INTEGER; FUNCTION XOR(MASK1, MASK2: UNIV INTEGER): INTEGER; FUNCTION INV(MASK: UNIV INTEGER): INTEGER; FUNCTION LEFTSHIFT(BITS: UNIV INTEGER; SHIFTS: INTEGER): INTEGER; FUNCTION RIGHTSHIFT(BITS: UNIV INTEGER; SHIFTS: INTEGER): INTEGER; FUNCTION GETBITS(BITS: UNIV INTEGER; LEFTMOST: BITPOSITION; FIELDLENGTH: BITFIELDLENGTH): INTEGER; PROCEDURE PUTBITS(FROM: UNIV INTEGER; VAR TO_: UNIV INTEGER; LEFTTO: BITPOSITION; FIELDLENGTH: BITFIELDLENGTH); FUNCTION TESTBIT(BITS: UNIV INTEGER; BITNUMBER: BITPOSITION): BOOLEAN; PROCEDURE SETBIT(VAR BITS: UNIV INTEGER; BITNUMBER: BITPOSITION); PROCEDURE CLEARBIT(VAR BITS: UNIV INTEGER; BITNUMBER: BITPOSITION); PROCEDURE PACK(UNPACKED, PACKED: IDENTIFIER; NO_OF_BYTES: INTEGER); PROCEDURE UNPACK(PACKED, UNPACKED: IDENTIFIER; NO_OF_BYTES: INTEGER); PROCEDURE PACK_SWAPPED(UNPACKED, PACKED: IDENTIFIER; NO_OF_BYTES: INTEGER); PROCEDURE UNPACK_SWAPPED(PACKED, UNPACKED: IDENTIFIER; NO_OF_BYTES: INTEGER); PROCEDURE RESERVE_INTERRUPT(DEVPR: INTEGER; VAR INTRPT: INTEGER); PROCEDURE RELEASE_INTERRUPT(INTRPT: INTEGER); PROCEDURE CLEAR_INTERRUPT(INTRPT: INTEGER; VAR COUNT: INTEGER); PROCEDURE WAIT_INTERRUPT(DELAY: INTEGER; INTRPT: INTEGER; VAR TIMED_OUT: BOOLEAN; VAR COUNT: INTEGER); PROCEDURE SENSE_IO(DEVICE: INTEGER; VAR STATUS: INTEGER); PROCEDURE READ_IO(DEVICE: INTEGER; VAR DATA: INTEGER); PROCEDURE CONTROL_IO(DEVICE: INTEGER; STATUS: INTEGER); PROCEDURE WRITE_IO(DEVICE: INTEGER; DATA: INTEGER); PROCEDURE SEND_MESSAGE(RECEIVER: PROCESS_NAME; MSG:UNIV MESSAGE_BUFFER; VAR EVENT: INTEGER); PROCEDURE SEND_ANSWER(ANS: UNIV MESSAGE_BUFFER; EVENT: INTEGER); PROCEDURE WAIT_ANSWER(DELAY: INTEGER; EVENT: INTEGER; VAR ANS: UNIV MESSAGE_BUFFER; VAR TIMED_OUT: BOOLEAN); PROCEDURE WAIT_MESSAGE(DELAY: INTEGER; VAR MSG: UNIV MESSAGE_BUFFER; VAR EVENT: INTEGER; VAR TIMED_OUT: BOOLEAN); PROCEDURE WAIT_EVENT(DELAY: INTEGER; INTRPT: INTEGER; VAR MSG: UNIV MESSAGE_BUFFER; VAR EVENT: INTEGER; VAR EVTTYPE: EVENT_TYPE; VAR COUNT: INTEGER; VAR TIMED_OUT: BOOLEAN); PROCEDURE RESUME_EVENT; PROCEDURE COPY(SOURCE, DEST: BYTE_ADDRESS; NO_OF_BYTES: INTEGER); PROCEDURE GET_ABS_ADDR(STRUCTURE: LINE; VAR WORD_ADDR: WORD_ADDRESS); PROCEDURE GET_ABS_ADDR1(STRUCTURE: LINE; VAR WORD_ADDR: WORD_ADDRESS); PROCEDURE GET_ABS_ADDR2(STRUCTURE: LINE; VAR WORD_ADDR: WORD_ADDRESS); FUNCTION CURRENT_LINE: INTEGER; PROCEDURE CURRENT_LEVEL(VAR LEVEL: INTEGER); PROCEDURE LONG_EXIT(LEVEL: INTEGER); PROCEDURE ASSIGNBITS(VALUE: UNIV BITVALUE; VAR P: UNIV PAGE; FIRSTBIT, NO_OF_BITS: INTEGER); PROCEDURE SKIPBITS(VALUE: UNIV BITVALUE; P: UNIV PAGE; VAR FIRSTBIT: INTEGER; NO_OF_BITS: INTEGER; VAR BITSSKIPPED: INTEGER); PROGRAM MAIN(VAR PARAM: ARGLIST); %LIST "PAGE"\f "**************************** * PASCAL I/O DECLARATIONS * ****************************" CONST TEXT_SIZE=132; TYPE TEXT=ARRAY[1..TEXT_SIZE] OF CHAR; TYPE STREAM=(INOC,OUTOC,INFILE,OUTFILE); TYPE DIRECTION=(INPUT,OUTPUT); TYPE BYTE=0..255; "**********************************************************************" " CONSTANTS " "**********************************************************************" CONST MAX_PARITY_PROMS = 4 ; "20" MAX_PROMS = 64 ; "30" STX = '(:2:)' ; "40" ETX = '(:3:)' ; "50" MIN_AREASIZE = 8 ; "60" MIN_PROMSIZE = 8 ; "80" MAX_AREASIZE = 16384 ; "70" MAX_PROMSIZE = 16384 ; "90" MIN_PROMWIDTH = 4 ; "100" MAX_PROMWIDTH = 16 ; "110" MIN_WORDSIZE = 4 ; "120" MAX_WORDSIZE = 16 ; "130" "**********************************************************************" " MAIN VARIABLES " "**********************************************************************" TYPE PROMTYPE = RECORD "10" FILE : IDENTIFIER ; "20" IDNO : INTEGER ; "30" VERSION : INTEGER ; "40" PARITY_BIT : INTEGER ; "50" CHECKSUM : LONG_INTEGER "60" END; "70" TYPE LONG1 = RECORD LSB : INTEGER ; MSB : INTEGER END; TYPE ID_RECORD_TYPE = RECORD "100" ORIGINATOR : IDENTIFIER ; "110" PROJECT_NO : LONG_INTEGER ; "120" DATE : LONG_INTEGER ; "130" MODULE : TEXT ; "140" FLOPPY_DISC_NO : INTEGER ; "150" SOURCE_TEXT : TEXT "160" END; "170" TYPE PROM_AREA_TYPE = RECORD "190" SIZE : LONG_INTEGER ; "200" START_ADDRESS : LONG_INTEGER ; "210" WIDTH : INTEGER ; "220" PARITY_BITS_IN_USE : INTEGER "230" END; "240" TYPE PHYS_PROM_TYPE = RECORD "260" SIZE : LONG_INTEGER ; "270" WIDTH : INTEGER "280" END; "290" VAR PROM : ARRAY [1..MAX_PROMS] OF PROMTYPE ; "292" ID_RECORD : ID_RECORD_TYPE ; "296" PROM_AREA : PROM_AREA_TYPE ; "298" PHYS_PROM : PHYS_PROM_TYPE ; "300" PARITY_AREA : ARRAY [0..MAX_PROMSIZE] OF INTEGER ; "310" S_IN , S_OUT : STREAM ; "320" PROM_INPUT_FILE : IDENTIFIER ; "330" PARAM_INPUT_FILE : IDENTIFIER ; "340" PROMS_PR_ROW , "350" PROMS_PR_COLOUMN , "360" NO_OF_PROMS , "370" PARITY_BITS_IN_USE , "315" NO_OF_PARITY_PROMS , "375" HEXA_PR_ROW , "380" HEXA_PR_PROM_ROW , "390" HEXA_PR_SINGLE_PROM , "400" HEXA_NO , "410" ROW_NO , "420" COLOUMN_NO , "430" I , J : INTEGER ; "440" "PAGE" \f %NOLIST "PAGE"\f "*********************** * PASCAL I/O PACKAGE * ***********************" PROCEDURE XXXERROR(T: TEXT); VAR I:INTEGER; BEGIN DISPLAY(NL); DISPLAY('?'); DISPLAY('?'); I:=1; WHILE T[I]<>NULL DO BEGIN DISPLAY(T[I]); I:=SUCC(I); END; DISPLAY(NL); HALT; END "XXXERROR"; "OPEN AND CLOSE STREAMS" "----------------------" PROCEDURE OPEN(VAR S:STREAM; NAME:TEXT; DIR:DIRECTION); CONST OC='OC '; VAR ID:IDENTIFIER; CTRL:INTEGER; ARG:ARGTYPE; BEGIN IF NOT (DIR IN [INPUT,OUTPUT]) THEN XXXERROR('ILLEGAL DIRECTION(:0:)'); FOR CTRL:=1 TO IDLENGTH DO ID[CTRL]:=' '; CTRL:=1; WHILE (NAME[CTRL]<>'(:0:)') AND (CTRL<SUCC(IDLENGTH)) DO BEGIN ID[CTRL]:=NAME[CTRL]; CTRL:=SUCC(CTRL); END; IF ID=OC THEN IF DIR=INPUT THEN S:=INOC ELSE S:=OUTOC ELSE BEGIN ARG.TAG:=IDTYPE; ARG.ID:=ID; IF DIR=INPUT THEN BEGIN S:=INFILE; WRITEARG(INP,ARG); END ELSE BEGIN S:=OUTFILE; WRITEARG(OUT,ARG); END; END; END "OPEN"; PROCEDURE CLOSE(S:STREAM); VAR ARG:ARGTYPE; BEGIN CASE S OF INOC,OUTOC: ; INFILE: READARG(INP,ARG); OUTFILE: READARG(OUT,ARG) END "CASE"; END "CLOSE"; "I/O OF BYTES (CHARACTERS)" "-------------------------" PROCEDURE OUTBYTE(S:STREAM; B:UNIV CHAR); BEGIN CASE S OF OUTOC: DISPLAY(B); OUTFILE: WRITE(B); INOC,INFILE: XXXERROR('OUTPUT TO AN INPUT STREAM(:0:)') END "CASE"; END "OUTBYTE"; PROCEDURE INBYTE(S:STREAM; VAR B:UNIV CHAR); BEGIN CASE S OF INOC: ACCEPT(B); INFILE: READ(B); OUTOC,OUTFILE: XXXERROR('INPUT FROM AN OUTPUT STREAM(:0:)') END "CASE"; END "INBYTE"; PROCEDURE OUTNL(S:STREAM); BEGIN OUTBYTE(S,NL); END "OUTNL"; PROCEDURE BACKSPACE(S:STREAM); BEGIN " UNIMPLEMENTED " END "BACKSPACE"; "I/O OF TEXT STRINGS" "-------------------" PROCEDURE INLINE(S:STREAM; VAR T:TEXT); VAR CH:CHAR; I:INTEGER; BEGIN I:=1; REPEAT INBYTE(S,CH); T[I]:=CH; I:=SUCC(I); UNTIL (CH=NL) OR (CH=EM) OR (I>=TEXT_SIZE); T[I]:=NULL; END "INLINE"; PROCEDURE OUTBYTES(S:STREAM; B:UNIV CHAR; COUNT:INTEGER); VAR CTRL:INTEGER; BEGIN FOR CTRL:=1 TO COUNT DO OUTBYTE(S,B); END "OUTBYTES"; PROCEDURE OUTSTRING(S:STREAM; T:TEXT); VAR DONE:BOOLEAN; I:INTEGER; BEGIN I:=1; DONE:=FALSE; WHILE NOT DONE DO IF T[I]<>NULL THEN IF I<=TEXT_SIZE THEN BEGIN OUTBYTE(S,T[I]); I:=SUCC(I); END ELSE DONE:=TRUE ELSE DONE:=TRUE; END "OUTSTRING"; PROCEDURE OUTTEXT(S:STREAM; T:TEXT; SIZE:INTEGER); VAR CTRL:INTEGER; BEGIN IF SIZE>TEXT_SIZE THEN XXXERROR('TEXT TOO LARGE(:0:)'); FOR CTRL:=1 TO SIZE DO OUTBYTE(S,T[CTRL]); END "OUTTEXT"; "I/O OF INTEGERS" "---------------" FUNCTION BIN_TO_ASCII(INT:INTEGER):CHAR; BEGIN IF INT<10 THEN BIN_TO_ASCII:=CHR(INT+ORD('0')) ELSE BIN_TO_ASCII:=CHR(INT-10+ORD('A')); END "BIN_TO_ASCII"; PROCEDURE OUTHEXA(S:STREAM; INT:UNIV INTEGER; WIDTH:INTEGER); VAR T:TEXT; CTRL:INTEGER; TEMP:INTEGER; BEGIN FOR CTRL:=1 TO TEXT_SIZE DO T[CTRL]:=SP; TEMP:=INT; FOR CTRL:=1 TO 4 DO BEGIN T[CTRL]:=BIN_TO_ASCII(GETBITS(TEMP,3,4)); TEMP:=RIGHTSHIFT(TEMP,4); END; T[5]:='#'; IF WIDTH<5 THEN FOR CTRL:=1 TO WIDTH DO T[CTRL]:='*'; FOR CTRL:=WIDTH DOWNTO 1 DO OUTBYTE(S,T[CTRL]); END "OUTHEXA"; PROCEDURE OUTINTEGER(S:STREAM; INT:UNIV INTEGER; WIDTH:INTEGER); VAR T:TEXT; CTRL:INTEGER; NEGATIVE:BOOLEAN; TEMP:INTEGER; BEGIN FOR CTRL:=1 TO TEXT_SIZE DO T[CTRL]:=SP; IF INT=#8000 THEN BEGIN "HANDLE SPECIAL CASE" END ELSE BEGIN TEMP:=INT; NEGATIVE:=TEMP<0; IF NEGATIVE THEN TEMP:=-TEMP; CTRL:=1; REPEAT T[CTRL]:=BIN_TO_ASCII(TEMP MOD 10); TEMP:=TEMP DIV 10; CTRL:=SUCC(CTRL); UNTIL TEMP=0; IF NEGATIVE THEN T[CTRL]:='-' ELSE CTRL:=PRED(CTRL); END; IF WIDTH<CTRL THEN FOR CTRL:=1 TO WIDTH DO T[CTRL]:='*'; FOR CTRL:= WIDTH DOWNTO 1 DO OUTBYTE(S,T[CTRL]); END "OUTINTEGER"; FUNCTION XXXDIGIT(CH:CHAR):BOOLEAN; BEGIN XXXDIGIT:=('0'<=CH) AND (CH<='9'); END "XXXDIGIT"; FUNCTION XXXHEXADIGIT(CH:CHAR):BOOLEAN; BEGIN XXXHEXADIGIT:=XXXDIGIT(CH) OR (('A'<=CH) AND (CH<='F')); END "HEXADIGIT"; FUNCTION ASCII_TO_BIN(CH:CHAR):INTEGER; BEGIN IF XXXDIGIT(CH) THEN ASCII_TO_BIN:=ORD(CH)-ORD('0') ELSE IF XXXHEXADIGIT(CH) THEN ASCII_TO_BIN:= ORD(CH)-ORD('A')+10 ELSE XXXERROR('ILLEGAL CHARACTER CONVERSION(:0:)'); END "ASCII_TO_BIN"; PROCEDURE INHEXA(S:STREAM; VAR INT:INTEGER); VAR CH:CHAR; BEGIN "SKIP INITIAL GARBAGE" REPEAT INBYTE(S,CH); IF CH=EM THEN XXXERROR('INPUT STREAM TERMINATED(:0:)'); UNTIL XXXHEXADIGIT(CH); "ASSEMBLE VALUE" INT:=0; WHILE XXXHEXADIGIT(CH) DO BEGIN INT:=LEFTSHIFT(INT,4); PUTBITS(ASCII_TO_BIN(CH),INT,3,4); INBYTE(S,CH); END; END "INHEXA"; PROCEDURE ININTEGER(S:STREAM; VAR INT:INTEGER); VAR CH:CHAR; POSITIVE:BOOLEAN; BEGIN "SKIP INITIAL GARBAGE" REPEAT INBYTE(S,CH); IF CH=EM THEN XXXERROR('INPUT STREAM TERMINATED(:0:)'); UNTIL (CH='#') OR (CH='-') OR XXXDIGIT(CH); "GO HANDLE HEXADECIMAL CASE" IF CH='#' THEN BEGIN INHEXA(S,INT); EXIT; END; "CHECK FOR SIGN" POSITIVE:=TRUE; IF CH='-' THEN BEGIN POSITIVE:=FALSE; INBYTE(S,CH); END; "ASSEMBLE VALUE" INT:=0; WHILE XXXDIGIT(CH) DO BEGIN INT:=INT*10-ASCII_TO_BIN(CH); INBYTE(S,CH); END; "REVERSE SIGN IF POSITIVE" IF POSITIVE THEN INT:=-INT; END "ININTEGER"; PROCEDURE IN_LONG_INTEGER(S: STREAM; VAR LINT: LONG_INTEGER); VAR CH: CHAR; POSITIVE: BOOLEAN; BEGIN "SKIP INITTIAL GARBAGE" REPEAT INBYTE(S,CH); IF CH=EM THEN XXXERROR('INPUT STREAM TERMINATED(:0:)'); UNTIL (CH='#') OR (CH='-') OR XXXDIGIT(CH); "HANDLE HEXADECIMAL CASE" IF CH='#' THEN BEGIN EXIT; END; "HANDLE SIGN" POSITIVE:= TRUE; IF CH='-' THEN BEGIN POSITIVE:= FALSE; INBYTE(S,CH); END; "ASSEMBLE VALUE, NEGATIVE" LINT:= 0L; WHILE XXXDIGIT(CH) DO BEGIN LINT:= LINT*10L-LONG(ASCII_TO_BIN(CH)); INBYTE(S,CH); END; "REVERSE SIGN IF POSITIVE" IF POSITIVE THEN LINT:= -LINT; END "IN_LONG_INTEGER"; PROCEDURE OUT_LONG_INTEGER(S: STREAM; LINT: LONG_INTEGER; WIDTH: INTEGER); VAR T: TEXT; I: INTEGER; NEGATIVE: BOOLEAN; TEMP: LONG_INTEGER; BEGIN FOR I:= 1 TO TEXT_SIZE DO T[I]:= SP; IF LINT=#80000000L THEN BEGIN "HANDLE SPECIAL CASE" END ELSE BEGIN TEMP:= LINT; NEGATIVE:= TEMP<0L; IF NEGATIVE THEN TEMP:= -TEMP; I:= 1; REPEAT T[I]:= BIN_TO_ASCII(SHORT(TEMP-(TEMP/10L)*10L)); TEMP:= TEMP/10L; I:= SUCC(I); UNTIL TEMP= 0L; IF NEGATIVE THEN T[I]:= '-' ELSE I:= PRED(I); END; IF WIDTH<I THEN FOR I:= 1 TO WIDTH DO T[I]:= '*'; FOR I:= WIDTH DOWNTO 1 DO OUTBYTE(S,T[I]); END "OUT_LONG_INTEGER"; %LIST "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" "PAGE" \f "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" " MAIN PROGRAM " "**********************************************************************" BEGIN "10" OPEN( S_IN , 'OC(:0:)' , INPUT ); "20" OPEN( S_OUT, 'OC(:0:)' , OUTPUT ); "30" GET_OC_PARAMS( S_IN , S_OUT ) ; "40" CLOSE( S_IN); "50" CLOSE( S_OUT ) ; "60" IF PARAM[P].TAG = IDTYPE "62" THEN PARAM_INPUT_FILE := PARAM[ P ].ID "63" ELSE PARAM_INPUT_FILE := 'OC(:0:) ' ; "65" IF PARAM[S].TAG = IDTYPE "66" THEN PROM_INPUT_FILE := PARAM[S].ID "67" ELSE PROM_INPUT_FILE := 'OC(:0:) ' ; "69" OPEN( S_IN , PARAM_INPUT_FILE , INPUT ) ; "70" GET_DISC_PARAMS( S_IN ); "80" CLOSE( S_IN ) ; "90" CHECK_PARAMS ; "95" DEFINE_CONSTANTS ; "100" FOR I:=1 TO ( NO_OF_PROMS + NO_OF_PARITY_PROMS ) DO "110" BEGIN "120" OPEN( S_IN , PROM_INPUT_FILE , INPUT ); "130" OPEN( S_OUT , PROM[I].FILE , OUTPUT ) ; "140" PRINT_ID_RECORD( S_OUT , I ); "150" IF I <= NO_OF_PROMS "162" THEN EXTRACT_PROM( S_OUT , S_IN , I ) "164" ELSE EXTRACT_PARITY_PROM( S_OUT , I); "166" CLOSE( S_IN ) ; "170" CLOSE( S_OUT ) ; "180" OC_CHECKSUM( I ); "185" END; "190" END. "200" "**********************************************************************" " END OF PROGRAM " "**********************************************************************" "PAGE" \f «eof»