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: 20224 (0x4f00) Types: TextFile Names: »CNPMOD«
└─⟦927b41227⟧ Bits:30005184 8" CR80 Floppy CR80FD_0181 ( CR/D/1189 (ulæseligt) ) └─⟦cac81710b⟧ └─ ⟦this⟧ »PHO.CNPMOD«
"----------------------------------------------------------------------" " 790523 HOH" " CONPAS" " ======" " CONVERTS PASCAL PROGRAMS FROM UTILITY TO DRIVER FORMAT" "----------------------------------------------------------------------" %WORKAREACLAIM=3000 %SUMMARY "##################################################" "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); "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; "----------------------------------------------------------------------" CONST SIZE_DISP = 4; PRG_DISP = 23; REF_DISP = 54; BUF_DISP = 55; CURIN_DISP = 90; NAME_DISP = 7; SHARE_TOP = #AF7; SHARE_BOTTOM = #189; REFLENGTH = 4; BUFLENGTH = 9; NEXT = 3; PG_HEADERLENGTH = 31; DRIVERHEADER = 13; "----------------------------------------------------------------------" TYPE REF_BUFFER = ARRAY(.1..REFLENGTH.) OF INTEGER; BUF_BUFFER = ARRAY(.1..BUFLENGTH.) OF INTEGER; "----------------------------------------------------------------------" VAR REF,BUF,REFS,BUFS: INTEGER; ABS_ADDRESS: INTEGER; CONSOLE, SOURCE_STREAM, OBJECT_STREAM: STREAM; FORTOLKER: BOOLEAN; SOURCE_NAME, OBJECT_NAME, PROCESSNAME: IDENTIFIER; PGHEAD: ARRAY(.0..PG_HEADERLENGTH.) OF INTEGER; WORDS: INTEGER; PG_SIZE, CONSTS, PR_SIZE, SHARE_SIZE: INTEGER; ASS_SIZE, PROCESS_SIZE, PRG, REFREF, BUFREF: INTEGER; GLCOUNT: INTEGER; "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"; PROCEDURE OUTHEX(S:STREAM; CH: UNIV CHAR; INT: UNIV INTEGER); VAR CTRL: INTEGER; BEGIN OUTBYTE(S,CH); FOR CTRL:= 4 DOWNTO 1 DO OUTBYTE(S,BIN_TO_ASCII(GETBITS(INT,4*CTRL-1,4))); END "OUTHEX"; "----------------------------------------------------------------------" PROCEDURE OUTWORD(INT: UNIV INTEGER); "----------------------------------------------------------------------" BEGIN IF ABS_ADDRESS MOD 8 = 0 THEN BEGIN OUTNL(OBJECT_STREAM); OUTHEX(OBJECT_STREAM,SP,ABS_ADDRESS); OUTSTRING(OBJECT_STREAM, 'L(:0:)'); END; OUTHEX(OBJECT_STREAM,SP,INT); ABS_ADDRESS:=ABS_ADDRESS+1; END "OUTWORD" ; "----------------------------------------------------------------------" PROCEDURE MAKE_BUFS(VAR BUF: INTEGER; VAR BUFS: INTEGER); "----------------------------------------------------------------------" VAR B: BUF_BUFFER; I: INTEGER; BEGIN WHILE BUFS > 0 DO BEGIN FOR I:= 1 TO BUFLENGTH DO B(.I.):= 0; BUF:= BUF+BUFLENGTH; BUFS:= PRED(BUFS); IF BUFS > 0 THEN B(.NEXT.):= BUF; FOR I:=1 TO BUFLENGTH DO OUTWORD(B(.I.)); END; END "MAKE_BUFS"; "----------------------------------------------------------------------" PROCEDURE MAKE_REFS(VAR REF: INTEGER; VAR REFS: INTEGER); "----------------------------------------------------------------------" VAR R:REF_BUFFER; I: INTEGER; BEGIN WHILE REFS > 0 DO BEGIN FOR I:=1 TO REFLENGTH DO R(.I.):=0; REF:= REF+REFLENGTH; REFS:= PRED(REFS); IF REFS > 0 THEN R(.NEXT.):= REF; FOR I:=1 TO REFLENGTH DO OUTWORD(R(.I.) ); END; END "MAKE_REFS"; "----------------------------------------------------------------------" PROCEDURE PRESET_INPUT(S: STREAM); "----------------------------------------------------------------------" VAR CHA: CHAR; BEGIN REPEAT INBYTE(S,CHA) UNTIL CHA = 'P'; GLCOUNT:= 0; END "PRESET_INPUT"; "----------------------------------------------------------------------" PROCEDURE RESET(VAR S:STREAM;NAME:TEXT;DIR:DIRECTION); "----------------------------------------------------------------------" BEGIN CLOSE(S); OPEN(S,NAME,DIR); PRESET_INPUT(S); END "RESET"; "----------------------------------------------------------------------" PROCEDURE CHECKTYPE(TAG:ARGTAG;PARMTYPE:ARGTAG; PARM:INTEGER); "----------------------------------------------------------------------" BEGIN IF TAG <> PARMTYPE THEN BEGIN OUTSTRING(CONSOLE,'PARAMETER (:0:)'); OUTINTEGER(CONSOLE,PARM,4); OUTSTRING(CONSOLE,' IS OF ILLEGAL TYPE(:0:)'); OUTNL(CONSOLE); HALT; END " ERROR PRINTOUT" END "CHECKTYPE"; "----------------------------------------------------------------------" PROCEDURE INWORD(S: STREAM; VAR INT: INTEGER); "----------------------------------------------------------------------" BEGIN IF GLCOUNT MOD 8 = 0 THEN INHEXA(S,INT); INHEXA(S,INT); GLCOUNT:= SUCC(GLCOUNT); END "INWORD"; "----------------------------------------------------------------------" PROCEDURE SKIP(COUNT: INTEGER); "----------------------------------------------------------------------" VAR I,INT: INTEGER; BEGIN FOR I:=1 TO COUNT DO INWORD(SOURCE_STREAM,INT); END "SKIP"; "----------------------------------------------------------------------" PROCEDURE TRANSFER(COUNT: INTEGER); "----------------------------------------------------------------------" VAR I,INT: INTEGER; BEGIN FOR I:=1 TO COUNT DO BEGIN INWORD(SOURCE_STREAM,INT); OUTWORD(INT); END END "TRANSFER" ; "----------------------------------------------------------------------" PROCEDURE READ_PARAMETERS; "----------------------------------------------------------------------" VAR I: INTEGER; BEGIN FOR I:=1 TO 7 DO BEGIN WITH PARAM(.I.) DO BEGIN CASE I OF 1: BEGIN CHECKTYPE(TAG,IDTYPE,I); IF ID(.1.) = 'F' THEN FORTOLKER :=TRUE ELSE FORTOLKER :=FALSE; END; 2: BEGIN CHECKTYPE(TAG,IDTYPE,I); SOURCE_NAME:=ID; END; 3: BEGIN CHECKTYPE(TAG,IDTYPE,I); OBJECT_NAME:=ID; END; 4: BEGIN CHECKTYPE(TAG,IDTYPE,I); PROCESSNAME:=ID; END; 5: BEGIN CHECKTYPE(TAG,INTTYPE,I); ABS_ADDRESS:= INT; END; 6: BEGIN CHECKTYPE(TAG,INTTYPE,I); BUFS:= INT; END; 7: BEGIN CHECKTYPE(TAG,INTTYPE,I); REFS:= INT; END END "CASE"; END "WITH PARAM"; END; END "READ_PARAMETERS"; "----------------------------------------------------------------------" PROCEDURE CALCULATE_DISPS; "----------------------------------------------------------------------" VAR I: INTEGER; BEGIN FOR I:=0 TO PG_HEADERLENGTH DO INWORD(SOURCE_STREAM,PGHEAD(.I.)); WORDS:=PGHEAD(.3.); PG_SIZE:= PGHEAD(.4.); IF FORTOLKER THEN CONSTS:=0 ELSE CONSTS:=PGHEAD(.31.); PR_SIZE:=PGHEAD(.11.); SHARE_SIZE:=SHARE_TOP - SHARE_BOTTOM; ASS_SIZE:= PR_SIZE-CONSTS-SHARE_SIZE; PROCESS_SIZE:= ASS_SIZE+CONSTS+WORDS+REFS*REFLENGTH+BUFS*BUFLENGTH; PRG:= PROCESS_SIZE-DRIVERHEADER; REF:= ASS_SIZE+CONSTS+WORDS-DRIVERHEADER; BUF:= REF+REFS*REFLENGTH; PGHEAD(.11.):= ASS_SIZE; END "CALCULATE_DISPS"; "----------------------------------------------------------------------" PROCEDURE GENERATE_HEADER; "----------------------------------------------------------------------" BEGIN OUTNL(OBJECT_STREAM); OUTSTRING(OBJECT_STREAM, 'Z(:0:)'); OUTHEX(OBJECT_STREAM,'0',ABS_ADDRESS); OUTSTRING(OBJECT_STREAM,' T0000(:0:)'); OUTNL(OBJECT_STREAM); OUTSTRING(OBJECT_STREAM,'P(:0:)'); OUTNL(OBJECT_STREAM); END "GENERATE_HEADER"; "----------------------------------------------------------------------" PROCEDURE WRITE_DRIVERPROCESS; " GENERATES DRIVER PROCESS PART, I.E. FROM DRIVER HEADER UNTIL PG HEADR" "----------------------------------------------------------------------" VAR I: INTEGER; BEGIN SKIP(PG_SIZE-(PG_HEADERLENGTH+1)); TRANSFER(SIZE_DISP); SKIP(1); OUTWORD(PROCESS_SIZE); TRANSFER(NAME_DISP-SIZE_DISP-1); PACK(PROCESSNAME,PROCESSNAME,6); SKIP(3); OUTWORD(PROCESSNAME(.1.)); OUTWORD(PROCESSNAME(.2.)); OUTWORD(PROCESSNAME(.3.)); TRANSFER(PRG_DISP-NAME_DISP-3); SKIP(1); OUTWORD(PRG); IF FORTOLKER THEN TRANSFER(1) ELSE BEGIN SKIP(1); OUTWORD(256) END; TRANSFER(REF_DISP-PRG_DISP-2); SKIP(2); OUTWORD(REF); OUTWORD(BUF); TRANSFER(CURIN_DISP-REF_DISP-2); SKIP(1); OUTWORD(0); TRANSFER(ASS_SIZE-CURIN_DISP-1); SKIP(SHARE_SIZE); TRANSFER(CONSTS); FOR I:=1 TO WORDS DO OUTWORD(0);; MAKE_REFS(REF,REFS); MAKE_BUFS(BUF,BUFS); END "WRITE_DRIVERPROCESS"; "----------------------------------------------------------------------" PROCEDURE WRITE_DRIVERPROGRAM; "----------------------------------------------------------------------" VAR I: INTEGER; BEGIN FOR I:= 0 TO PG_HEADERLENGTH DO OUTWORD(PGHEAD(.I.)); RESET(SOURCE_STREAM,SOURCE_NAME,INPUT); SKIP(PG_HEADERLENGTH+1); TRANSFER(PG_SIZE-(PG_HEADERLENGTH+1)); END "WRITE_DRIVERPROGRAM"; "----------------------------------------------------------------------" PROCEDURE GENERATE_TAIL; "----------------------------------------------------------------------" BEGIN OUTNL(OBJECT_STREAM); OUTSTRING(OBJECT_STREAM,'S(:0:)'); OUTNL(OBJECT_STREAM); END "GENERATE_TAIL" ; "----------------------------------------------------------------------" " MAIN PROGRAM" "----------------------------------------------------------------------" BEGIN OPEN(CONSOLE,'OC(:0:)',OUTPUT); READ_PARAMETERS; OPEN(SOURCE_STREAM,SOURCE_NAME,INPUT); OPEN(OBJECT_STREAM,OBJECT_NAME,OUTPUT); PRESET_INPUT(SOURCE_STREAM); CALCULATE_DISPS; GENERATE_HEADER; WRITE_DRIVERPROCESS; WRITE_DRIVERPROGRAM; GENERATE_TAIL; CLOSE(CONSOLE); CLOSE(SOURCE_STREAM); CLOSE(OBJECT_STREAM); END. «eof»