;I3.MAC.10, 15-Jan-77 11:56:06, Edit by ENDERIN SUBTTL I3 COMMENT ; AUTHORS: KIM WALDEN ELISABETH $LUND UPDATED AT ACADIA UNIVERSITY FOR KA10 VERSION: 4 [6,11,12,104,144,162,225,260] PURPOSE: INITIALIZE BUFFERS AND BUFFER HEADERS FOR INPUT/OUTPUT OPEN FILES INITIALIZE PUSHDOWN STACKS AND VARIBLES CALL MODULES IN PASS 3 CONTENTS: SUBROUTINES: I3L OPEN LS1 I3I OPEN IC2 I3S OPEN SOURCE CODE FILE I3X OPEN XRF I3E OPEN ATR I3LS3 OPEN LS3 I3P1 SWAP PASS 1 INTO CORE IF ^C START ENTRY: I3 NORMAL ENTRY FROM PASS 1-2 I3 -1 IF ^C REENTER NORMAL EXIT: BRANCH T3 ERROR EXIT: EXIT TO MONITOR IF NOT ENOUGH CORE PASS 3 BRANCH T3T3 IF ERROR IN OPEN,LOOKUP OR ENTER CALLED ROUTINES: E3,M3,T3E ; SEARCH SIMMAC SALL IFN QDEC20,;[225] CTITLE I3 Pass 3 initialization SEARCH SIMMC3 ;[104] IFE QDEC20,<;[225] LOC <.JBVER==137> EXP VERCOM > TWOSEG RELOC 400000 MACINIT P3INIT ;[104] ;EXTERNAL SUBROUTINES EXTERN DM ;ROUTINE FOR ERROR HANDLING EXTERN E3 ;CREATE SOURCE LIST EXTERN M3 ;CREATE REL FILE EXTERN O3RA ;[12] Read one buffer from ATR file EXTERN T3E ;OUTPUT ERROR STATISTICS EXTERN T3L ;DELETE LS1 EXTERN T3R ;DELETE REL.TMP EXTERN T3T3 ;TERMINATION ROUTINE PASS 3 EXTERN T3 EXTERN T3T ;TERMINATION ROUTINE EXTERN T3REE ;REENTER ROUTINE EXTERN O3RZ ;READ SYMBOL TABLE INTO CORE EXTERN YBHIC2,YBHLS1,YBHLS3,YBHSRC,YBHXRF,YBHEXT ;BUFFER HEADERS EXTERN YELIC2,YELLS1,YELLS3,YELSRC,YELXRF,YELEXT ;LOOKUP/ENTER BLOCKS EXTERN Y17BUF,YBRSRC,YBRBUF ;I/O BUFFER EXTERN YEXTS ;DEV OF LST FILE EXTERN Y3DEV ;DEV OF SOURCE EXTERN YESEM ;NUMBER OF SEMICOLONS ON LINE BEFORE ERROR EXTERN YDMEND ;LENGTH OF ZDM EXTERN Y3OPEN ;STATUS OF FILES EXTERN YSIMNAME ;[12] SIMULA name for global module (RADIX50) EXTERN YSWITCH ;WORD CONTAINING SWITCHES EXTERN YJOB ;JOB NUMBER EXTERN Y3LOWE ;END OF LOW SEG PASS 3 EXTERN YSTK ;PUSHDOWN STACK EXTERN .JBAPR EXTERN .JBREN EXTERN .JBSA EXTERN .JB41 ;[144] EXTERN YBEGST ;PUSHDOWN STACK BEGIN EXTERN YBEGSP ;POINTER YBEGST EXTERN Y1LOWE EXTERN Q3STSZ ;[6] Stack size for pass 3 (XPDP stack) EXTERN YATRFN ;[144] Name of ATR file (SIXBIT). Only if old EXTERN YATRPPN ;[144] file exists. YATRPPN=ppn of that file. EXTERN YATRDEV ;[144] Device of the old ATR file. EXTERN YATROFS ;[144] Offset of ATR module within ATR file ;[144] (word offset,,block number) IFN QDEC20,<;[225] EXTERN YATRJFN ;JFN EXTERN YATRSZ ;ATR file size (pages) EXTERN YEXTSZ ;EXTERNAL FILE SIZE EXTERN YEXTAD,YEXTMP,YEXTJFN EXTERN O1OJFI ;OPEN JFN for input EXTERN O1EXMP ;Maps external file pages > EXTERN YPASSNO ;[225] ;ENTRIES IN I3 INTERN I3 INTERN I3E ;OPEN FILE.ATR INTERN I3L ;OPEN LS1 INTERN I3I ;OPEN IC2 INTERN I3S ;OPEN SOURCE FILE INTERN I3X ;OPEN XRF INTERN I3LS3 ;OPEN LS3 SUBTTL LOCAL MACROS DEFINE IOER(FILE)< L X1,[ASCIZ/FILE/]> DEFINE IFCORE(FILE)< IF ;;File not in core SKIPN YEL'FILE GOTO FALSE THEN IOER FILE LOOKUP QCH'FILE,YEL'FILE GOTO I3LOER EXEC I3GBUF ST X0,YBH'FILE SETOM YBH'FILE+2 SETOFF YPO'FILE FI > SUBTTL MAIN ROUTINE edit(260) ;DELETE .TMP FILES, NO OUTPUT OF ERRORS ;REACHED FROM ALL PASSES AFTER ^C REENTER edit(11) PORTAL [L XPDP,[IOWD QSTSIZ,YSTK] ;[11] SETZM YDMEND ;SUPPRESS ERRORS BRANCH T3REE] PROC I3: PORTAL .+1 ;[11] Enter concealed mode IFG QTRACE, ;GET MORE CORE IF NOT ENOUGH edit(144) LI X0,Y3LOWE ;[144] Top addr required CORE X0, ;[144] GOTO [OUTSTR [ASCIZ /?NO CORE FOR LOW SEG PASS 3/] EXIT] ;[144] L1():! edit(225) LI 3 ;[225] ST YPASSNO ;[225] ;START ADDR OF ERROR ROUTINES ;***AUBEG LI X0,41 ;IF KA10, SET FOR UUO TRAP OF KI10 INSTRUCTIONN IFN QKI10,< L X1,[XEC DM] > IFN QKA10,< EXTERN KAUUO3 L X1,[XEC KAUUO3] > ST X1,@X0 ;***AUEND ;INIT PUSH DOWN STACK LI X1,10 L X0,[GOTO I3UF] LOOP ST X0,YSTK(X1) AS SOJGE X1,TRUE SA ;INIT TRAP HANDLING ;TAKE CARE OF PUSHDOWN OVERFLOW LI X0,200000 APRENB X0, L X0,[GOTO I3OF] ST X0,.JBAPR edit(6) MOVNI XPDP,Q3STSZ-12 ;[6] MOVSS XPDP ;[6] HRRI XPDP,YSTK+12-1 ;[6] ;SET START AND REENTER ADDRESSES LI I3-1 HRRM .JBREN LI I3P1 HRRM .JBSA IFN QDEBUG, ;INIT BEGIN PUSH DOWN STACK L X0,[XWD -QBEG,YBEGST] ST X0,YBEGSP SETOM YBEGST ;YESEM WILL BE USED BY DM IF ANY ERRORS ARE DETECTED ;IT SHOULD ALWAYS BE = 0 IN PASS 3 SETZB X3MASK,YESEM ;Reset switches SETONA NOREL EXEC O3RZ ;READ SYMBOL TABLE INTO CORE OUTSTR I3CRLF ;CR-LF to encourage the programmer IF ;TERMINATION ERROR IN PASS 1 OR 2 IFOFF YSWTRM GOTO FALSE THEN ;CHECK IF LIST IS TO BE CREATED IFOFF YSWP1 BRANCH T3T ;WRAP UP IF NO LIST WANTED FI L YBRSRC ST YBRBUF ;INITIALIZE DYNAMIC BUFFER POINTER ;IF REL FILE IS GENERATED,CONVERT FORMAT TO SUIT LINK 10 ;[144] Set standard protection on REL and LST files SETZM YEXTS+2 ;[144] SETZM YEXTS+6 ;[144] IF IFOFF YSWP1 GOTO FALSE THEN ;DELETE REL.TMP EXEC T3R ELSE EXEC M3 FI L YBRSRC ST YBRBUF EXEC I3GBUF ST X0,YBHSRC IF ;List file wanted or errors in source IFON YSWLST GOTO TRUE SKIPN YDMEND GOTO FALSE THEN ;Create a list file EXEC E3 ELSE ;DELETE LS1.TMP IF EXISTING EXEC T3L ;OUTPUT STATISTICAL INFORMATION EXEC T3E FI BRANCH T3 ;TERMINATE PASS3 EPROC SUBTTL I3E, find ATR file [12], changed v3A(144) edit(225) edit(144) edit(12) IFE QDEC20,<;[225] ;If an old ATR module with the same name exists, Pass 1 will have placed ;retrieval information in YATRDEV, YATRFN, YATRPPN, YATROFS. ;Find start of ATR module according to this information, or skip return. ;Position to first word of module I3E:: PROC L X1,YATRDEV JUMPE X1,L8 ;There was no old module according to search list LI X0,1B30+14 ;Synchronous binary input LI X2,YBHEXT OPEN QCHEXT,X0 GOTO L7 ;Look it up again L X0,YATRFN MOVSI X1,'ATR' STD X0,YELEXT SETZM YELEXT+2 L YATRPPN ST YELEXT+3 LOOKUP QCHEXT,YELEXT GOTO L8 ;on failure edit(162) ST YELEXT+3 ;[162] Restore ppn EXEC I3GBUF ;Get buffers ST YBHEXT SETZM YBHEXT+2 ;Reset byte count IF ;Library file (non-zero block no) SKIPN X1,YATROFS GOTO FALSE THEN ;Position to correct block, set flag USETI QCHEXT,(X1) SETONA INLIB FI EXEC O3RA AOS YBHEXT+2 HLRZ YATROFS ;word offset IF ;non-zero JUMPE FALSE THEN ;Adjust byte pointer, count ADDM YBHEXT+1 MOVN ADDM YBHEXT+2 FI GOTO L9 L7():! L X1,[ASCIZ/EXT/] JSP I3OPER L8():! AOS (XPDP) L9():! RETURN EPROC >;[225] SUBTTL I3E, find ATR file, DEC-20 version edit(225) IFN QDEC20,<;[225] ;If an old ATR module with the same name exists, Pass 1 will have placed ;retrieval information in YATRJFN, YATRSZ, ; YATRDEV, YATRFN, YATRPPN, YATROFS. ;Find start of ATR module according to this information, or skip return. ;Position to first word of module I3E:: PROC HRRZ X1,YATRJFN JUMPE X1,L8 ;There was no old module according to search list ST X1,YEXTJFN L X2,[^D36+OF%HER+OF%RD+OF%NWT+OF%PLN] OPENF GOTO L7 ;On failure L X3,YATROFS IF ;Non-zero offset JUMPE X3,FALSE THEN ;Convert to word offset in file HLRZ X0,YATROFS SUBI X3,1 LSH X3,7 HRRZS X3 ADD X3,X0 SETONA INLIB ;Library flag FI L YATRSZ ST YEXTSZ LI 1 ST YEXTAD EXEC O1EXMP ;Map into core GOTO L9 L7():! L X1,[ASCIZ/EXT/] JSP I3OPER L8():! AOS (XPDP) L9():! RETURN EPROC >;[225] SUBTTL Open LS1, LST I3L:: ;OPEN FILE LS1 IFCORE LS1 RETURN I3LS3:: ;OPEN FILE LST IOER LST SKIPN X3,YEXTS+10 MOVSI X3,'DSK' LI X2,0 MOVSI X4,YBHLS3 OPEN QCHLS3,X2 GOTO I3OPER edit(162) LD X0,YEXTS ;[162] Use real file name STD X0,YELLS3 LD X0,YEXTS+2 ;[162] STD X0,YELLS3+2 ;[162] ENTER QCHLS3,YELLS3 GOTO I3ENER ST X1,YELLS3 ;[162] Reset path field EXEC I3GBUF ST X0,YBHLS3 SETOM YBHLS3+2 SETON YOPLS3 RETURN SUBTTL Open IC2, SRC, XRF I3I:: ;OPEN FILE IC2 IFCORE IC2 RETURN I3S:: ;OPEN FILE SRC IOER SRC L YBHSRC ;SAVE FIRST WORD LI X2,0 SKIPN X3,Y3DEV MOVSI X3,'DSK' LI X4,YBHSRC OPEN QCHSRC,X2 GOTO I3OPER TLO 400000 ST YBHSRC ;RESTORE FIRST WORD LOOKUP QCHSRC,YELSRC GOTO I3LOER SETOM YBHSRC+2 SETON YOPSRC RETURN I3X:: ;OPEN FILE XRF IFCORE XRF RETURN SUBTTL Set up a buffer ring I3GBUF: PROC SAVE L X0,YBRBUF HLRZ X3,X0 SKIPG X3 LI X3,2 ;Standard no of buffers = 2 ADDI X0,1 HRLI X0,201 L X2,X0 WHILE SOJE X3,FALSE DO L X1,X2 ADDI X2,QBUFS+1 ST X2,(X1) OD ST X0,(X2) HRLI X0,400K LI X2,QBUFS(X2) ST X2,YBRBUF ASSERT RETURN EPROC ;O1SETB SUBTTL Error exits I3OPER: ;HERE IF ERROR IN OPEN ERRT QT,Q.TER BRANCH T3T3 I3LOER: ;HERE IF ERROR IN LOOKUP ERRT QT,Q.TER+1 BRANCH T3T3 I3ENER: ;HERE IF ERROR IN ENTER ERRT QT,Q.TER+2 BRANCH T3T3 edit(12) I3INER: ;[12] IN error ERRT QT,Q.TER+3 BRANCH T3T3 I3UF: L XPDP,[IOWD QSTSIZ-12,YSTK+12] L X1,[ASCIZ /3/] ERRT QT,Q.UFL BRANCH T3T3 I3OF: L XPDP,[IOWD QSTSIZ-12,YSTK+12] L X1,[ASCIZ /3/] ERRT QT,Q.OFL BRANCH T3T3 I3CRLF: ASCIZ / / SUBTTL Swap in PASS 1 I3P1: edit(225) TOPS10,<;[225] EDIT(260) PORTAL .+1 ;[260] L X3,[XWD 1,Y1LOWE] IFG QTRACE, SWAPPA(SIMULA,S1,0,QP1PPN) > TOPS20,;[225] SUBTTL Literals LIT edit(225) TOPS20,;[225] ENTRY POINT IN PASS1 ONLY END I3