I/(*#CO*) (*T-*) (* DO NOT PUT T+ UNTIL AFTER UTILITY ROUTINES *) / B/LIBNUC/ICL9LP/ T/CONST/ TC/CHARACTER CODE / TS/CCPASSUBSYS/ R/ISO/EBC/ TC/HEAP MANAGEMENT / TS/HEAPMXSZWD/ I/ HEAPMINSZB = 1024;/// T+1 I/ HEAPMXSZB = MXBINSGMT;/// T/TYPE/ TS/ADDRESS = / I/ LONGINT = RECORD UH, LH : INTEGER END;/// T/VAR/ TC/JOURNAL ACCESS/ I/ (**** GLOBAL VARIABLES FOR COMPILER LISTING FILE :- ****) (**** --------------------------------------------- ****) CTLISTFV : FVAR; CTLISTFP : TEXTPT; / TC/ERROR HANDLING/ ?INS S/CONTING/ HEXDIGITS : PACKED ARRAY[0..15] OF CHAR; ? TC/TIME ROUTINES/ ?ALT S/CLOCKSTART : / STARTPROCTIME : LONGINT; ? TS/(**** SPECS. FOR SPECIALLY / PS/(**** EDINBURGH INTERFACE / I/ (**** SFL GENERAL SUPPORT ROUTINES :- ****) (**** ------------------------------- ****) PROCEDURE ICL9LPLONGISB (LI1,LI2 : LONGINT; VAR LI2ISBLI1 : LONGINT) ; EXTERN ; PROCEDURE ICL9LPLONGIDIV (LI1,LI2 : LONGINT; VAR LI2IDVLI1 : LONGINT); EXTERN; (**** SFL CTM INTERFACE ROUTINES :- ****) (**** ----------------------------- ****) PROCEDURE ICL9LPCTMLOG (MESSAGEDESC : STRDESC); EXTERN ; PROCEDURE ICL9LPCTMPROCTIME (VAR PROCTIME : LONGINT); EXTERN ; PROCEDURE ICL9LPCTMRMLD (CODEADDRESS : ADDRESS; VAR MODNAME : ALFA; VAR IIN : POSINT; VAR OFFSET : SGMTRNGB ); EXTERN ; (**** SFL CTSUPPORT ROUTINES :- ****) (**** ------------------------- ****) PROCEDURE ICL9LPCTNOMINATEERRPROC (CONTINGENCYMESSAD, REGISTERSAD : ADDRESS) ; EXTERN ; (**** SFL RT SUPPORT ROUTINES :- ****) (**** -------------------------- ****) FUNCTION ICL9LPRTTIDYPROCDESC : PROCDESC ; EXTERN ; FUNCTION ICL9LPRTGETICL9HERRADDR : ADDRESS ; EXTERN ; (**** PASCAL CT SUPPORT ROUTINES :- ****) (**** ------------------------------ ****) PROCEDURE ICL9LPCTGETVSAREA (AREANAMEDR : STRDESC; SIZEB : SGMTRNGB; MODEOFUSE : VSUMD; VAR AREAAD : ADDRESS ) ; EXTERN ; PROCEDURE ICL9LPCTDATEANDTIME (VAR DATE, TIME : ALFA8) ; EXTERN ; PROCEDURE ICL9LPCTABORT (COMPILERFAIL : BOOLEAN) ; EXTERN ; / ?ALT /FUNCTION ICL9CEZCOMREG / PROCEDURE ICL9CEZINIT(LANG, LNBVAL : WORD ; DIAGPROC : PROCDESC; PADDING1, PADDING2 : WORD) ; ? T/PROCEDURE GETVSAREA/ B/GET/RT/ G I/ / R/WD/B/ G I/ / I/ MODEOFUSE : VSUMD;/// D/ / TS/SIZEB : / P+1 TS/SIZEB := / P+1 R/VSDENSE/MODEOFUSE/ TS/(**** C H A R/ T/PROCEDURE INITCHARCODECON/ TS/CCUSRPRG :=/ R/ISO/EBC/ TS/(**** J O U R N A L A C C E S S / I/ (**** C O M P I L E R L I S T I N G F I L E ****) (**** ----------------------------------------- ****) (*#E-*) PROCEDURE INITCTLISTFILE ; BEGIN P77FDEC(CTLISTFV,TYPECONV(BALFA8,'*CTLIST '),TRUE,TRUE, CTLIST,FNULLCHN,TXOPBFLENB); CTLISTFP := TYPECONV(TEXTPT,ADDRESSOF(CTLISTFV)); REWRITE(CTLISTFP@); END (* INITCTLISTFILE *); / T/PROCEDURE JRNLDIRECTMSGLN/ ?ALT S/P77SENDMESSAGE/ ICL9LPCTMLOG(MSGD); ? T/PROCEDURE JRNLSTARTMSG / P/PROCEDURE JRNLFINISHMSG/ #ALT S/WRITE/ - S/END (*/ WRITELN(JRNLFP@,'PASCAL PROGRAM RUN ENDED, REQUIRING :'); WRITELN(JRNLFP@,ROUND(CLOCK/1000):8,' OCP SECONDS,'); WRITELN(JRNLFP@,(MAXHEAPBYTESUSED/1024):8:3, ' KILOBYTES OF HEAP STORAGE (HEAPSIZE) .'); END (* JRNLFINISHMSG *); # TS/(**** T I M E I N F O / ?INS S/(*#E+*)/ (*#E-*) FUNCTION OCPTIME : INTEGER; VAR CURRENTPROCTIME, MICROSECUSED, MILLISECUSED : LONGINT; LONGINT1000 : LONGINT; BEGIN ICL9LPCTMPROCTIME(CURRENTPROCTIME); ICL9LPLONGISB(STARTPROCTIME,CURRENTPROCTIME,MICROSECUSED); LONGINT1000.UH := 0; LONGINT1000.LH := 1000; ICL9LPLONGIDIV(LONGINT1000,MICROSECUSED,MILLISECUSED); OCPTIME := MILLISECUSED.LH; END (* OCPTIME *); PROCEDURE RTDATEANDTIME (VAR DATE, TIME : ALFA8); VAR DTIS, TMIS : IMPSTR; I : ALFA8RNGB; EDRSP : RESPONSE; BEGIN DTIS[0] := IMPSTRLENB; TMIS[0] := IMPSTRLENB; EDRSP := ICL9CEZDATEANDTIME(DTIS,TMIS); FOR I := 1 TO ALFA8LENB DO BEGIN DATE[I] := CHR(CCTTPTB[CCSYSINTNL,CCUSRPRG]@ [DTIS[I+2]]); (* NO "19" *) TIME[I] := CHR(CCTTPTB[CCSYSINTNL,CCUSRPRG]@ [TMIS[I]]); END; END (* RTDATEANDTIME *); PROCEDURE DATEANDTIME (VAR DATE, TIME : ALFA8); BEGIN IF ATCOMPILETIME THEN ICL9LPCTDATEANDTIME(DATE,TIME) ELSE RTDATEANDTIME(DATE,TIME); END (* DATEANDTIME *); ?ALT S/P77CLOCK := / P77CLOCK := OCPTIME; ?ALT S/DTIS,/ - S/EDRSP : / DATE, TIME : ALFA8; ?ALT S/DTIS [0]/ - S/(* ".../ DATEANDTIME(DATE,TIME); ?ALT S/DTIS,/ - S/EDRSP : / DATE, TIME : ALFA8; ?ALT S/DTIS [0]/ - S/TIME [I] / DATEANDTIME(DATE,TIME); ?ALT S/CLOCKSTART :=/ ICL9LPCTMPROCTIME(STARTPROCTIME); ? TS/(**** H E A P M A N A G E M E N T / #INS /PROCEDURE INITHEAPMANAGEMENT / PROCEDURE CTALLOCHEAP (VAR HEAPAD : ADDRESS; VAR HEAPLENB : SGMTRNGB); CONST CTHEAPAREANAME = 'ICL9LPHEAPCT'; CTHEAPSIZEB = HEAPMXSZB; BEGIN ICL9LPCTGETVSAREA(DEREFWITHBND(CTHEAPAREANAME),CTHEAPSIZEB,VSDENSE, HEAPAD); HEAPLENB := CTHEAPSIZEB; END (* CTALLOCHEAP *); PROCEDURE RTALLOCHEAP (VAR HEAPAD : ADDRESS; VAR HEAPLENB : SGMTRNGB); CONST RTSIZEJSVNM = 'ICL9LPRHEAP'; RTHEAPAREANAME = 'ICL9LPHEAPRT'; VAR SIZEB : SGMTRNGB; BEGIN SIZEB := INTJSVVALUE(DEREFWITHBND(RTSIZEJSVNM)) * 1024; IF SIZEB < HEAPMINSZB THEN SIZEB := HEAPMINSZB ELSE IF SIZEB > HEAPMXSZB THEN SIZEB := HEAPMXSZB; RTGETVSAREA(DEREFWITHBND(RTHEAPAREANAME),SIZEB,VSDENSE,HEAPAD); HEAPLENB := SIZEB; END (* RTALLOCHEAP *); PROCEDURE ALLOCHEAP (VAR HEAPAD : ADDRESS; VAR HEAPLENB : SGMTRNGB); BEGIN IF ATCOMPILETIME THEN CTALLOCHEAP(HEAPAD,HEAPLENB) ELSE RTALLOCHEAP(HEAPAD,HEAPLENB); END (* ALLOCHEAP *); #ALT S/CONST/ - S/SIZEWD : / VAR SIZEB : SGMTRNGB; #ALT S/IF ATCOMPILETIME/ - S/GETVSAREA (/ ALLOCHEAP(HEAPBASEAD,SIZEB); # DEL S/LASTADINHEAP := / #INS S/MAXFREEHEAPAD := / LASTADINHEAP := BASEFREEHEAPAD + (SIZEB - BINWD); # TS/(**** I N I T I A L I S A T I O N / T/(*#E+*)/ I/(*#E-*) PROCEDURE BASICINIT ; / P/PROCEDURE P77INIT/ PS/VAR/ T+3 I/ I : 0..15;/// TS/BEGIN/./(/ P.E G P+1 TS/INITCHARCODECON/ I/ FOR I := 0 TO 9 DO HEXDIGITS[I] := CHR(ORD('0') + I); FOR I := 10 TO 15 DO HEXDIGITS[I] := CHR(ORD('A') + (I-10)); / TC/USER LIBNUC'S/ D/USER / TC/USER PROGRAM/ PS/INITHEAPMA/ TS/INITERRORHANDLING/ P+1 TS/JRNLSTARTMSG/ PS/END/ R/P77/BASIC/ G I/ PROCEDURE INITGLOBALAREA (GLOBALAREAP : GLOBALAREAPT; BASELNBVAL : ADDRESS ) ; BEGIN WITH GLOBALAREAP@ DO BEGIN BASELNBTPANDBND := DETPWDVC + MXINTINBND; BASELNBAD := BASELNBVAL; SRCELNNO := 0 ; END; END (* INITGLOBALAREA *); PROCEDURE RTINIT (GLOBALP : GLOBALAREAPT; GLOBALLENWD : SGMTRNGWD; MAINPRGLNBVAL : ADDRESS ); BEGIN ATCOMPILETIME := FALSE; IF GLOBALLENWD < GLOBALAREAMINLENWD THEN EHINITERRSTOP(EHIGLBLLEN); BASICINIT; INITRTERRORHANDLING(GLOBALP,GLOBALLENWD,MAINPRGLNBVAL); ICL9CEZINIT(5,MAINPRGLNBVAL,NILDESC,0,0); END (* RTINIT *); / P-200 PS/(**** I N I T / P/(*#E+*)/ TS/VAR/ T+2 L PS/BEGIN/ G PS/MAINPRGLNBVAL :=/ T+2 PS/(* MASK FLOATING / I/ IF CALLFROMCOMPILER THEN INITGLOBALAREA(GLOBALAREAP,MAINPRGLNBVAL) ELSE RTINIT(GLOBALAREAP,GLOBALAREALENWD,MAINPRGLNBVAL); / ?INS /PROCEDURE P77FINSH/ PROCEDURE ICL9LPINITCTSUPPORT (VAR LISTFILEP, DIAGFILEP, JRNLFILEP : TEXTPT; VAR ETOITTP, ITOETTP : CCTTPT; CDIAG : CDIAGTYPE ); VAR COMPLNBVAL : ADDRESS; BEGIN ATCOMPILETIME := TRUE; BASICINIT; COMPLNBVAL := ANDX(WORDAT(CURLOCALNAMEBASEAD),?I FFFFFFFC) ; INITCTERRORHANDLING(COMPLNBVAL,CDIAG); INITCTLISTFILE; LISTFILEP := CTLISTFP; DIAGFILEP := DIAGFP; JRNLFILEP := JRNLFP; ETOITTP := CCTTPTB[CCEBC,CCISO]; ITOETTP := CCTTPTB[CCISO,CCEBC]; END (* ICL9LPINITCTSUPPORT *); ? T/PROCEDURE P77FINSH / I/(*#E-*) / R/P77/RT/ B/SH/I/ TS/END (*/ R/P77/RT/ B/SH/I/ T/PROCEDURE P77TIDY / I/(*#E+*) PROCEDURE P77FINSH ; BEGIN IF NOT ATCOMPILETIME THEN RTFINISH; END (* P77FINSH *); / B/P77/ / T/PROCEDURE P77HALT / I/(*#E-*) PROCEDURE HALT ; BEGIN IF ATCOMPILETIME THEN ICL9LPCTABORT(FALSE) ELSE RTFINISH ; END (* HALT *); (*#E+*) / ?ALT S/P77FINSH/ HALT ; ? TELE