TITLE LINK 10/20 - INITIALIZATION MODULE SUBTTL D.M.NIXON/DMN/RKH/SRM/JBC/JNG/DZN/PY/PAH/HD 2-OCT-85 ;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1973,1984,1986. ALL RIGHTS RESERVED. ; ; ;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED AND COPIED ;ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE AND WITH THE ;INCLUSION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE OR ANY OTHER ;COPIES THEREOF MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY ;OTHER PERSON. NO TITLE TO AND OWNERSHIP OF THE SOFTWARE IS HEREBY ;TRANSFERRED. ; ; ;THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT NOTICE ;AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT ;CORPORATION. ; ;DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS ;SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. SEARCH LNKPAR,LNKLOW,OVRPAR,MACTEN,UUOSYM,SCNMAC IFN TOPS20,< SEARCH MONSYM > ;[1407] SALL ENTRY LINK EXTERN LNKSCN,LNKCOR,LNKLOG,.TYOCH CUSTVR==0 ;CUSTOMER VERSION DECVER==6 ;DEC VERSION DECMVR==0 ;DEC MINOR VERSION DECEVR==2340 ;DEC EDIT VERSION VERSION SEGMENT LOC .JB41 JSR UUOTRAP RELOC .JBHSA==:0 ;STARTING ADDRESS STORED IN HIGH SEGMENT .JB41==:41 ;ACCUMULATORS R==R1 ;MUST MATCH LNKLOD DEFINITION SUBTTL REVISION HISTORY ;START OF VERSION 1A ;41 ADD PHYSICAL ONLY GETSEG ;45 HASH INITIAL SYMBOLS AT ASSEMBLY TIME ;46 ADD KLUDGE FEATURE ;64 HANDLE RUN LINK ALL OF CORE PROBLEM ;65 TENEX SPEEDUP ;71 MAKE ALL MESSAGE STANDARD FORM ;106 REMOVE HIORG & ONESEG ;107 CHANGE KLUDGE TO MIXFOR ;START OF VERSION 2 ;135 ADD OVERLAY FACILITY ;145 IMPLEMENT USER LIBRARIES ;157 (12640) MAKE VALUE OF FORLIB BE -2 IF .FORLB =-1 ;161 ADD LANGUAGE DEPENDENCY TO /USERLIB ;202 REMOVE CORE UUO BEFORE GETSEG ;START OF VERSION 2B ;225 ADD SUPPORT FOR PSECT (MACRO VERSION 51) ;230 ADD CHECK THAT LOW SEG DATA BASE IS SAME SIZE IN ALL SEGMENTS ;302 HANDLE TENEX IDDT CORRECTLY ;333 Add code to handle sucessful GETTAB return of zero ;346 INCLUDE EDIT 302 IN MAINTENANCE SOURCES. LABEL EDIT 230. ;353 REMOVE EDIT 225 ;START OF VERSION 2C ;444 Don't lose libraries defined with the USELIB macro. ;530 Define triplet flags correctly and use TXxx macros. ;557 Clean up listing for release. ;START OF VERSION 3A ;560 Release on both TOPS-10 and TOPS-20 as LINK version 3A(560) ;START OF VERSION 4 ;600 Put phased lowseg code at PHAZLO; start DY area at .JBFF ;604 Support device NUL: correctly ;607 Reserve page 377 on TOPS-20 for HELPER so /HELP will work ;635 Initialize ARSIZE to .ARS. ;636 Make TTYIT and LOGIT preserve T1. ;650 Use VM on TOPS-10 if available. ;674 GETSEG other segments correctly if LINK is run from an SFD. ;677 Don't set /SYMSEG:LOW by default if loading overlays. ;706 Setup RC.NTB ;727 Set defualt symbol limt to .SYLIM ;731 SEARCH MACTEN,UUOSYM instead of C. ;732 Initialize lowest location to 400000,,0. ;750 Initialize LC.AB to LC.LB+.IWM ;765 Release on both TOPS-10 and TOPS-20 as LINK version 4(765) ;START OF VERSION 4A ;1120 Initialize OKCPUS to all known CPUs. ;1124 Make TTYIT return to a potentially execute-only high segment again. ;1126 Use ACs for GETSEG args if all 7.01 GETTABs are not available. ;1132 Initialize .LOW.'s RC.AT and RC.HL. ;1150 Call proper LNKFIO routines if a log file is opened at start-up time. ;1151 Add .JBEDV. ;1172 Don't initialize SYMLIM. ;1174 Label and clean up all error messages. ;1217 Clean up the listings for release. ;1220 Release on both TOPS-10 and TOPS-20 as version 4A(1220). ;START OF VERSION 4B ;1254 Update MAKLIB internal macro ;1300 Add code to initialize RC.LM in .ABS. and .LOW. ;1301 Do GETTAB to determine initial verbosity. ;1304 Initialize RC.MAP ;1315 Use bits for compiler type in MAKLIB definition. ;START OF VERSION 5 ; Maintanence edits 1221-1377 ;1400 Use OVRPAR.MAC. ;1407 Streamline initialization code on Tops20. ;1436 Use connected directory, not logged in directory PPN on TOPS-20. ;START OF VERSION 5.1 ;1500-1677 Reserved for maintenance. ;1546 Use bit not compiler code at SETUSE+17. ;1736 Strip unsupported FMXFOR code. ;1744 supress loading attempt if compilation errors occurred during ; EXECUTE command. ;2026 Update copyright and cleanup listings. ;2050 Make question mark in loading suppressed message be in column 1. ;2070 Check only right half of .JBERR - Conditionalize .SGNAM ;2075 Eliminate .SGNAM, .SGPPN, .SGDEV and add fatal error if GETTAB fails. ;Start of version 6 ;2207 Initialize RC.MAP with internal psect indices 0 and 1. ;2247 Create an inferior fork. ;2254 Use new format of segment table if fake JOBDAT title. ;2300 Remove F40 and FTFORK code. ;2306 Get TOPS-20 format date and time for PDV. ;2337 Trap CFORK% JSYS errors. ;2340 Update copyright statement. SUBTTL INITIALIZE ;HERE AFTER START, RUN, EXECUTE, LOAD OR RUN UUO LINK: PORTAL .+2 ;EXECUTE ONLY PORTAL .+2 ;CCL TDZA P1,P1 ;CLEAR OFFSET MOVEI P1,1 ;SET OFFSET RESET ;RESET ANY EXTERNAL I/O JUMPE P1,F1 ;[1744] IF NOT CCL SKIP COMP ERROR ;CHECK AND DON'T OUPUT MESSAGE HRRZ T1,.JBERR ;[2070] get any compilation errors JUMPG T1,LOASUP ;[2070] go suppress loading if any errors OUTSTR CCLMES ;TELL THE WORLD WHO IS NOW RUNNING F1: MOVEI T2,EZCOR+AD.FRC ;WE NEED AT LEAST THIS MUCH CORE CAMG T2,.JBREL ;SEE IF WE HAVE IT JRST .+3 ;YES CORE T2, ;NO, BUT GET IT JRST E$$IMI ;[1174] YOU LOSE MOVEM P1,OFFSET ;SAFE TO STORE OFFSET NOW MSTIME T1, ;GET INITIAL TIME (MORE OR LESS) MOVEM T1,TIMEON ;SAVE FOR LOG FILE IFN TOPS20,< ;[2306] GTAD% ;[2306] GET TOPS-20 FORMAT DATE AND TIME MOVEM T1,DATIME ;[2306] SAVE IT >;[2306] IFN TOPS20 MOVE T1,[ZCOR,,ZCOR+1] SETZB FL,ZCOR ;CLEAR FLAGS AND CORE BLT T1,EZCOR ;DO NOT CLEAR REST OF CORE SINCE MONITOR WILL DO IT ;ON FIRST TIME, AND RESTART LOGIC ON SUBSEQUENT TIMES ;THIS IS ESPECIALLY IMPORTANT IN V/M IF RUNNING IN LARGE LOW SEG MOVE P,[IOWD LN.EPD,EPDP+1] ;ESTABLISH PUSH-DOWN LIST MOVEM P,EPDP ;FOR EMMERGENCY WORK SKIPN OFFSET ;IF NOT CCL MODE SETZM .JBERR ;CLEAR COMPILER ERRORS IFE FTSINGLE,< MOVSI T1,HICODE ;NOW FOR PHASED CODE HRRI T1,PHAZLO ;INTO DYNAMIC AREA BLT T1,HIEND ;FOR GETSEGS ETC MOVEI T1,SEGCOD ;ADDRESS OF GETSEG ROUTINE MOVEM T1,NXTSEG ;WHERE OTHER SEGMENTS CAN USE IT MOVEI T1,PRVSEG ;SAME BUT FOR LAST SEGMENT MOVEM T1,LSTSEG ;NOW TRY TO GET WHERE WE CAME FROM (INCLUDING SFD'S) VIA GETTAB. ;IF UNAVAILABLE (OLD MONITOR), USE INFO SET UP ABOVE. MOVSI T1,-<.PTMAX-.PTSFD-1> ;NUMBER OF SFD'S HRROI T2,.GTRS0 ;GETTAB FOR RUN FROM SFD, THIS JOB SFDLUP: MOVE T3,T2 ;[1126] SET UP FOR NEXT SFD GETTAB T3, ;GET IT JRST NOSFD ;[1126] GETTAB FAILED, SEE WHY MOVEM T3,SEGPTH+.PTSFD(T1) ;STORE THIS SFD ADDI T2,1 ;INCREMENT GETTAB ARG AOBJN T1,SFDLUP ;[1126] LOOP FOR ALL SFD'S JRST GETUFD ;[1126] GOT ALL SFDS, NOW FOR UFD ;HERE WHEN A GETTAB TO GET AN SFD FAILED. SEE IF THE MONITOR IS TOO OLD. NOSFD: TRNE T1,-1 ;[1126] FAIL FIRST TIME? JRST GETUFD ;[1126] NO, GOT SOME SFDS, USE NEW DATA MOVEI T1,<&RH.ALF>;[1126] USE DATA ABOVE HRRM T1,NGTSEG ;[1126] BUT NEED TO REPLACE GETSEGS HRRM T1,EGTSEG ;[1126] TO REPLACE PHYSICAL ONLY BIT JRST GETHSO ;[1126] GETSEG INFO DONE, PROCEED ;HERE IF THE 7.01 GETTABS WORK. FILL IN THE REST OF THE DATA. GETUFD: SETZM SEGPTH+.PTSFD(T1) ;FORCE A ZERO AFTER THE LAST SFD HRROI T1,.GTRDI ;UFD OF PATH WE WERE RUN FROM GETTAB T1, ;GET IT JRST E$$GTF ;[2075] CAN'T SKIPN T1 ;THERE? JRST GETHSO ;NO, GIVE UP MOVEM T1,SEGPTH+.PTPPN ;STORE UFD TO FINISH PATH BLOCK HRROI T1,.GTRDV ;GET DEVICE WE WERE RUN FROM GETTAB T1, ; . . . JRST E$$GTF ;[2075] CAN'T SKIPN T1 ;AVAILABLE? JRST E$$GTF ;[2075] NEED A DEVICE MOVEM T1,SEGBLK ;YES, STORE DEVICE MOVEM T1,ERRBLK ;FOR LNK999 ALSO HRROI T1,.GTRFN ;[1126] THE FILE NAME WE CAME FROM GETTAB T1, ;[1126] GET IT JRST E$$GTF ;[2075] CAN'T SKIPN T1 ;[1126] RETURN ANYTHING? JRST E$$GTF ;[2075] CAN'T MOVEM T1,FSTSEG ;[1126] OK, STORE IT MOVEM T1,SEGBLK+1 ;[1126] FOR GETSEGS TOO MOVEI T1,SEGPTH ;NOW POINT GETSEG BLOCKS TO PATH BLOCK MOVEM T1,SEGBLK+4 ;NORMAL GETSEG BLOCK MOVEM T1,ERRBLK+4 ;AND LNK999'S COPY >;END OF IFE FTSINGLE GETHSO: IFE TOPS20,< MOVE T1,[-2,,.GTUPM] ;[650] ORIGIN OF HIGH SEG GETTAB T1, ;GET START OF HIGH SEGMENT MOVSI T1,%HISEG ;ASSUME USER KNOWS WHERE IT STARTS SKIPN T1 ;RETURNS ZERO IF NOT IMPLEMENTED MOVSI T1,%HISEG ;USE ASSEMBLY VALUE HLRZ T1,T1 ANDCMI T1,777 ;ONLY ON A FULL PAGE HRRZM T1,HIORGN ;[650] SAVE HISEG ORIGIN FOR EVERYBODY > ;[1407] IFE TOPS20 IFN TOPS20,< MOVEI T1,%HISEG ;[1407] PICK UP HISEG ORIGIN MOVEM T1,HIORGN ;[1407] SAVE FOR EVERYBODY > ;[1407] IFN TOPS20 IFE FTSINGLE,< ADDI T1,.JBHDA## ;ADD OFFSET NOW HRRZM T1,SEGPGN ;SAVE PAGE NUMBER > ;END OF IFE FTSINGLE MOVE T1,[JRST UUOHANDLER] MOVEM T1,UUOTRAP+1 ;FIELD UUOS IFN FTVM,< SETOM USEVM ;[650] ASSUME VM AVAILABLE MOVSI T1,.PAGCA ;[650] CHECK ACCESS OF PAGE 0 PAGE. T1, ;[650] TO SEE IF PAGE. UUO'S WORK SETZM USEVM ;[650] NOPE, VM NOT AVAILABLE MOVEI T1,.PAGEM ;[650] PAGE. UUO FUNCTION MOVEM T1,PAGFUN ;[650] STORE FOR MONITOR > ;END IFN FTVM IFE TOPS20,< MOVE T1,[PTHLEN-1,,PTHARG] SETOM PTHARG ;-1 MEANS RETURN DEFAULT PATH PATH. T1, ;GET DEFAULT PATH SETZM PTHARG ;IF ERROR, CLEAR ARGUMENT GETPPN T1, ;DETERMINE THIS JOB'S PPN JFCL ;(IN CASE OF JACCT) MOVEM T1,MYPPN ;SAVE FOR THE FUTURE SKIPN PTHDIR ;SEE IF PATH. UUO WORKED MOVEM T1,PTHDIR ;NO, SIMULATE IT > ;[1407] IFE TOPS20 IFN TOPS20,< SETOM T1 ;[1407] TELL US ABOUT OURSELVES MOVE T2,[ XWD -21,.TEMP ] ;[1407] PUT DETAILS IN TEMP AREA SETZM T3 ;[1511] GETJI% ;[1407] DONE JFCL ;[1407] SO WE DON'T EXIST, EH? MOVEI T4,.TEMP ;[1407] BASE OF JOB INFO BLOCK MOVE T1,.JIDNO(T4) ;[1407] [1436] NOW WHO ARE WE? STPPN% ;[1407] [1436] MAKE CONNECTED DIRECTORY A PPN MOVEM T2,MYPPN ;[1407] AND REMEMBER IT MOVEM T2,PTHDIR ;[1407] ... SKIPE .JIBAT(T4) ;[1407] RUNNING UNDER BATCH? SETOM BATCH ;[1407] YES MOVE T1,.JIJNO(T4) ;[1407] JOB NUMBER? MOVEM T1,JOBNUM ;[1407] REMEMBER IT. > ;[1407] IFN TOPS20 IFE TOPS20,< MOVNI T1,1 ;STANDARD AOBJN TEST FOR KI-10 AOBJN T1,.+1 ;TESTS FOR HALF-WORD ADDER JUMPN T1,KSET ;KA-10 IF CARRY >;END OF IFE TOPS20 AOS CPUHST ;KI, KL, TOPS-20 BECOMES 1 IFE TOPS20,< MOVE T1,[115,,.GTCNF] GETTAB T1, ;PAGE SIZE SKIPA T1,[%CNVER] ;FAILED, USE GETTAB FOR MONITOR VERSION SOJA T1,GSET ;GET MASK FOR PAGE SIZE GETTAB T1, SETZ T1, ;NOT 5.06 FOR SURE HRRZ T1,T1 ;ONLY WANT DEC HALF CAIGE T1,50511 ;TEST FOR 5.06 OR LATER JRST KSET ;NO, USES 1K BOUNDS PSET: SKIPA T1,[777] ;AND STORE SIZE KSET: MOVEI T1,1777 ;KA-10 PAGE SIZE GSET: MOVEM T1,.PGSIZ ;USED TO MAKE SAVE FILES ETC >;END OF IFE TOPS20 ;HERE WHEN PAGE SIZE KNOWN. DO OTHER MISC. SETUP IFE TOPS20,< HRROI T1,.GTLIM ;JOB'S TIME LIMIT AND BATCH STATUS GETTAB T1, JRST .+3 ;CANNOT BE BATCH JOB TXNE T1,JB.LBT ;TEST FOR BATCH CONTROL SETOM BATCH ;YES, IT IS PJOB T1, ;GET JOB NUMBER HRRZM T1,JOBNUM ;SAVE IN RIGHT HALF > ;[1407] IFE TOPS20 IFN TOPS20,< MOVE T1,JOBNUM ;[1407] JOBNUM ALREADY HAS JOB NUMBER > ;[1407] IFN TOPS20 MOVEI T4,3 ;PICK UP 3 CHARS PJLOOP: IDIVI T1,^D10 ;ONE AT A TIME ADDI T2,'0' ;MAKE SIXBIT LSHC T2,-6 ;SAVE CHAR SOJG T4,PJLOOP HLLM T3,JOBNUM ;SAVE SIXBIT FOR TMP FILES MOVSI T1,'DSK' ;SET UP GLOBAL DEFAULTS MOVEM T1,G.DEV ;INITIAL SETTINGS HRLOI T1,'REL' MOVEM T1,G.EXT MOVEI T3,AD.FRC ;DEFAULT VALUE MOVEM T3,FRECOR ;OF SPACE TO BE LEFT IN TABLES MOVE T1,HIORGN ;MAKE SURE WE NEVER EXPAND INTO HISEG SUBI T1,1001 ;[607] RESERVE A PAGE FOR HELPER MOVEM T1,MAXCOR ; IF USER DOES NOT SET A VALUE IFN TOPS20,< CORE T1, ;GET ALL CORE IN LOW SEGMENT JRST E$$IMI ;[1174] SHOULD NEVER HAPPEN > IFE TOPS20,< SUBI T3,3 ;INCASE IT IS EXACTLY A BOUND IDIVI T3,4 ;NUMBER OF TABLES SETUP INITIALLY ADDI T3,.IPM ;MAKE INTO BLOCK BOUND ANDCMI T3,.IPM MOVE P2,T3 ;SAFER PLACE MOVX T1,.INFIN ;[1172] INITIALIZE LOWEST LOCATION MOVEM T1,LOWLOC ;[732] > ;[2247] ;HERE TO SETUP RELOCATION TABLES ETC ;THE MAIN TABLE RC.TB CONSISTS OF POINTERS TO INDIVIDUAL CODE BLOCKS ;RC.TB GROWS AS REQUIRED. THE INDIVIDUAL BLOCKS CONTAIN ;RC.SG SEGMENT NUMBER (INDEX TO SG.TB) ;RC.NM 6-BIT NAME OF R.C. ;RC.IV INITIAL VALUE OF R.C. ;RC.CV CURRENT VALUE OF R.C. (THIS IS WHAT IS ADDED TO RELOCATABLE WORD) ;RC.OF OFFSET TO LOCATION IN CORE RELATIVE TO LC.LB OR HC.LB ; ;RC.HL HIGHEST LOCATION LOADED INTO (NEXT R.C. AT END) ;RC.LB WHICH SEGMENT (EITHER LC.LB OR HC.LB ADDRESS) ;RC.WD POINTER TO START OF CODE WINDOW (LW.S1 OR LW.S2) ;RC.PG POINTER TO END OF CODE WINDOW (LW.S1 OR LW.S2) ;RC.LM UPPER LIMIT OF PSECT+1 (FIRST ILLEGAL ADDRESS FOR PSECT LOADING) [1300] CORINI: MOVEI T1,RC.INC-2 ;JUST A RANDOM NUMBER MOVEM T1,RC.FRE ;NUMBER OF FREE SLOTS MOVEI T1,1 ;FIRST ONE IS SET NOW MOVEM T1,RC.NO HRRZ P1,.JBFF ;GET START OF DYNAMIC AREA SETOM .JBFF ;STOP ANY ONE USING .JBFF UNTIL AUTHORISED MOVEI T1,SG.TB ;MAKE SEG TAB POINT TO TABLES LIKE RC.TB HRLI T1,R MOVEM T1,SG.TB ;SO WE CAN REFERENCE IT THE SAME WAY MOVEM P1,DY.LB ;STORE START OF DYNAMIC AREA HRR P,P1 ;SETUP REAL PUSHDOWN STACK HRLI P,-LN.PDL ;IN DYNAMIC AREA SO WE CAN MOVE IT MOVEM P,PDP ;SAVE SO WE CAN RESET ON I/O ERRORS ADDI P1,LN.PDL+1 MOVEM P1,IO.EMG ;USED FOR OPEN/ENTER WHEN CORE FULL ADDI P1,LN.IO ;RESERVE SPACE BEFORE IT'S TOO LATE HRLI P1,R ;PUT (R) IN INDEX FIELD MOVEM P1,RC.MAP ;[1304] SETUP MAP FOR LOCAL PSECT NUMBERS ADDI P1,RC.INC ;[1304] SAME LENGTH AS RC.TB MOVEM P1,RC.NTB ;[706] SETUP PSECT ORDER TABLE ADDI P1,RC.INC ;[706] SAME LENGTH AS RC.TB MOVEM P1,RC.TB ;AND POINT TO TABLE OF POINTERS SETZ R, ;START AT SLOT #0 HRRZS P1 ADDI P1,RC.INC MOVEM P1,@RC.TB ;POINT TO SLOT #0 MOVEM P1,@RC.NTB ;[706] MOVEI T2,1 ;[1132] SET TO LC AREA MOVEM T2,RC.SG(P1) ;[1132] MOVEM T2,@RC.MAP ;[2207] SET UP MAP FOR BLANK PSECT (0) MOVEI T2,.JBDA ;[1132] INIT H?.S0 TO SHOW JOBDAT LOADED MOVEM T2,HC.S0 ;[1132] HIGHEST LOCATION NON-ZERO MOVEM T2,HL.S0 ;[1132] HIGHEST LOCATION SEEN MOVX T1,<1,,0> ;[1300] END OF MEMORY MOVEM T1,RC.LM(P1) ;[1300] MOVE T2,['.ABS. '] ;NAME OF IT MOVEM T2,RC.NM(P1) ;NOW BUILD .LOW. RELOCATION COUNTER ADDI P1,RC.INC ;NOW FOR SLOT #1 (0') ADDI R,1 MOVEM R,@RC.MAP ;[2207] SET UP MAP FOR .LOW. MOVEM P1,@RC.TB ;POINT TO SLOT #1 MOVEM P1,@RC.NTB ;[706] MOVEM P1,@SG.TB ;AND IN SEGMENT TABLE MOVEM R,RC.SG(P1) ;POINT TO SEG #1 (0 UPWARDS) MOVE T2,['.LOW. '] ;NAME OF IT MOVEM T2,RC.NM(P1) SETZM RC.IV(P1) ;INITIAL VALUE OF 0 MOVEI T2,.JBDA ;PRESET TO 140 MOVEM T2,RC.CV(P1) ;CURRENT VALUE MOVEM T2,RC.HL(P1) ;[1132] ALSO HIGHEST LOADED SO FAR MOVX T2,AT.RP ;[2247] GET THE RELOCATABLE ATTRIBUTE MOVEM T2,RC.AT(P1) ;[2247] SET AS A RELOCATABLE PSECT SETZM RC.OF(P1) ;ZERO RELATIVE TO LC.LB MOVX T2,<1,,0> ;[1300] END OF MEMORY MOVEM T2,RC.LM(P1) ;[1300] MOVEI T2,LC.LB ;POINT TO LOW SEGMENT MOVEM T2,RC.LB(P1) MOVEI T2,LW.S1 ;POINTER TO BASE OF CORE WINDOW IN PAGING MOVEM T2,RC.WD(P1) MOVEI T2,UW.S1 ;END OF WINDOW (PAGING IF NON-ZERO) MOVEM T2,RC.PG(P1) ADDI P1,RC.INC MOVEM P1,DY.PT ;POINTER TO NEXT FREE LOCATION IN DY IFE TOPS20,< ADDI P1,1000 ;LEAVE SOME BUFFER SPACE > IORI P1,.IPM ;GET TO A GOOD BREAK MOVEM P1,DY.AB ;ACTUAL TOP IN USE MOVE T2,P1 ;CALCULATE FREE SPACE SUB T2,DY.PT ;ABOVE DY.PT MOVEM T2,DY.FR ;AND STORE IFE TOPS20, IFN TOPS20, MOVEM P1,DY.UB ;TOP OF DYNAMIC AREA (FOR NOW) ADDI P1,1 ;START OF CORE AREA ;HERE TO SETUP ALL OTHER AREA BOUNDS, POINTERS ETC MOVEM P1,LC.LB IORI P1,.IWM ;[750] ALLOCATE FOR JOBDAT AREA MOVEM P1,LC.AB IFE TOPS20, IFN TOPS20, MOVEM P1,LC.UB ADDI P1,1 MOVEM P1,LS.LB ;START OF LOCAL SYMBOL AREA ADDI P1,ENDSYM-LSTBL+1 ;NUMBER OF LOCAL SYMBOL LOCATIONS MOVEM P1,LS.PT ;POINTS TO NEXT FREE LOCATION IORI P1,.IPM ;NEXT BLOCK BOUND MOVEM P1,LS.AB MOVE T1,P1 SUB T1,LS.PT ;CALCULATE FREE SPACE IN LAST BLOCK MOVEM T1,LS.FR IFE TOPS20, IFN TOPS20, MOVEM P1,LS.UB ADDI P1,1 MOVEM P1,GS.LB ;GLOBAL SYMBOL AREA ADDI P1,ENDSYM-GSTBL+1 ;END OF SYMBOLS MOVSI T1,(POINT 18,0) ;RELATIVE PTR TO PRIME TABLE MOVEM T1,PRMPTR ;SETUP PRIME NUMBER TABLE PTR MOVEI T2,I.PRM ;INITIAL NUMBER MOVEM T2,HT.PRM ;SET SIZE MOVEI T2,</.L*.L> ;ALLOCATE SPACE IN MULTIPLES OF .L ;SO REHASHING DOES NOT WASTE SPACE HRLI P1,P2 ;INDEX USED IN TRYSYM COMPARES MOVEM P1,HT.PTR ;STORE POINTER ADDI P1,(T2) ;RESERVE SPACE FOR TABLE HRRZS P1 MOVEM P1,GS.PT ;NEXT FREE LOCATION IORI P1,.IPM ;NEXT BLOCK BOUND MOVEM P1,GS.AB ;MARK THIS AS TAKEN MOVE T2,P1 SUB T2,GS.PT ;SEE HOWMUCH ACTUALLY FREE MOVEM T2,GS.FR ;SAVE IT IFE TOPS20,< ADDI P1,(P2) ;SOME FREE SPACE MOVEM P1,GS.UB ;UPPER BOUND FOR NOW CAMGE P1,.JBREL ;SEE IF ENOUGH JRST .+3 ;YES CORE P1, ;NO, TRY FOR MORE JRST E$$IMI ;[1174] YOU LOSE >;END IFE TOPS20 HRRZ P1,.JBREL ;GET TOP OF LOW SEGMENT MOVEM P1,GS.UB ;AS TOP OF GLOBAL SYMBOLS ;NOW TO STORE INITIAL SYMBOLS MOVEI T1,ENDSYM-LSTBL+1 ;NUMBER OF LOCAL SYMBOL LOCATIONS MOVE P1,LS.LB ;BASE OF LOCAL SYMBOLS MOVEM T1,LSYM ;REQUIRED UNLESS /NOINITIAL MOVEM T1,(P1) ;STORE IN FIRST WORD (UNUSED) HRLI T1,LSTBL ;FORM BLT POINTER HRRI T1,1(P1) BLT T1,ENDSYM-LSTBL(P1) ;MOVE IN MOVEI T1,/.L ;NUMBER OF GLOBAL SYMBOLS MOVE P1,GS.LB ;BASE OF GLOBAL SYMBOLS MOVEM T1,GSYM ;REQUIRED UNLESS /NOINITIAL MOVEM T1,(P1) ;STORE IN FIRST WORD (UNUSED) HRLI T1,GSTBL ;FORM BLT POINTER HRRI T1,1(P1) BLT T1,ENDSYM-GSTBL(P1) ;MOVE IN HRLI T1,HSTBL ;FORM BLT POINTER HRRZ P1,HT.PTR ;BASE OF HASH TABLE HRR T1,P1 BLT T1,ENDHSH-HSTBL-1(P1) ;MOVE HASH TABLE MOVEI T1,.HS% ;GET % TO FILL TABLE MOVEM T1,HSFACT MOVE T1,HT.PRM ;GET CURRENT HASH SIZE IMULI T1,.HS% ;SEE HOW MUCH TO FILL IDIVI T1,^D100 SUB T1,GSYM ;MINUS INITIAL NO. MOVEM T1,HSPACE ;HASH TABLE FULL ENOUGH AT THIS POINT ;HERE TO INIT LOG FILE IF POSSIBLE LOGINI: MOVEI T1,TTYIT ;LINE BUFFERING ROUTINE FOR OUTCHRS MOVEM T1,TTYSUB PUSHJ P,.TYOCH## ;INCASE NO LOG FILE MOVEI T1,L%W ;GET TTY ERROR CUTOFF MOVEM T1,ERRLVL ;INCASE NOT SET BY USER MOVEI T1,S%C ;[1174] SET UP DEFAULT SEVERITY SKIPE BATCH ;HOWEVER IN BATCH MODE MOVEI T1,S%B ;U LOSE MUCH SOONER MOVEM T1,SEVLVL MOVEI T1,L%W ;[604] NORMAL LOG FILE CUTOFF MOVEM T1,LOGLVL MOVE T1,[LOGIT,,TTYIT] ;[1174] IN CASE /LOG LATER MOVEM T1,LOWSUB ;[1174] SO WE CAN FIND ROUTINES HRROI T1,.GTWCH ;[1301] GET THE DEFAULT /MESSAGE GETTAB T1, ;[1301] FROM THE MONITOR SETZ T1, ;[1301] NO GETTAB LDB T1,[POINTR T1,JW.WMS] ;[1301] GET THE USEFUL BITS SKIPN T1 ;[1301] IS THERE A DEFAULT? MOVX T1,M%P!M%F ;[1301] NO, USE /VERB:MEDIUM TXNE T1,M%C ;[1301] CONTINUATION ASKED FOR? TXO T1,M%F ;[1301] YES, GIVE FIRST TOO MOVEM T1,VERLVL ;[1301] SET THE VERBOSITY LEVEL MOVSI T1,'LOG' ;SEE IF WE ALREADY HAVE A LOG DEVICE DEVCHR T1, ;SKIP IF ASSIGNED JUMPE T1,NOLOG ;NOT YET SETZM LOGLVL ;[604] ASSUME USER WANTS ALL IF ASSIGNED LOG DEVICE TXNE T1,DV.TTA ;YES, BUT IS IT USERS TTY? JRST [SETOM LOGTTY ;YES, NOT REALLY A LOG DEVICE JRST LOGMSG] ;[1174] GO PRINT START OF LOG MSG MOVEI T2,LN.IO ;SPACE WE NEED PUSHJ P,DY.GET## ; FOR ENTER BLOCK MOVEM T1,IO.PTR+RC ;STORE ADDRESS IN I/O TABLE MOVEI T2,RC ;[1150] SET UP LOG FILE CHANNEL MOVEM T2,IO.CHN ;[1150] .. MOVX T2, ;[1150] AND IN FORM WE CAN IOR INTO UUOS MOVEM T2,I.CHN(T1) ;[1150] .. MOVEI T2,.IOASC ;ASCII MODE MOVEM T2,I.MOD(T1) MOVSI T2,'LOG' ;DEVICE MOVEM T2,I.DEV(T1) MOVEI T2,RCBUF ;BUFFER HEADER MOVSM T2,I.BUF(T1) ;OUTPUT ONLY MOVEI T2,LN.RIB-1 ;EXTENDED ENTER MOVEM T2,I.RIB(T1) MOVSI T2,'LOG' ;EXTENSION MOVEM T2,I.EXT(T1) PUSHJ P,DVNAM.## ;[1150] SET UP DEFAULT FILE NAME PUSHJ P,DVCHK.## ;[1150] MAKE SURE DEVICE CAN HANDLE I/O MODE PUSHJ P,DVOPN.## ;[1150] OPEN THE LOG FILE PUSHJ P,DVENT.## ;[1150] ENTER THE FILE ;HERE WITH LOG FILE OPENED AND ENTERED. ALLOW LINK TO USE IT FOR LOGGING. MOVEI T1,LOGIT ;NOW WE CAN POINT TO IT MOVEM T1,LOGSUB ;SET NON-ZERO PUSHJ P,.TYOCH ; ALWATS EXCEPT WHEN IN SCAN LOGMSG: E$$LFB::.ERR. (MS,.EC,V%L,L%I,S%I,LFB,) ;[1174] .ETC. (DAT) ;[1174] ; JRST NOLOG ;NOW DO OTHER THINGS ;HERE TO INITIALIZE OTHER ODD ITEMS NOLOG: E$$LIN::.ERR. (MS,,V%L,L%I,S%I,LIN,) ;[1174] NO POINT TIL NOW MOVEI T1,OPENBL ;PUT ADDRESS OF INPUT I/O BLOCK MOVEM T1,IO.PTR+DC ;IN I/O VECTOR INCASE OF ERRORS MOVEI T1,.IOBIN ;MODE 14 MOVEM T1,OPENBL ;FOR INPUT DEVICE MOVEI T1,DCBUF ;INPUT BUFFER HEADER MOVEM T1,FSTR+1 ;IN OPEN BLOCK MOVSI T1,(Z DC,) ;GET CHAN# IN AC FIELD MOVEM T1,OPENBL+I.CHN ;FOR OPEN/LOOKUP ETC MOVE T1,[C%DEFAULT] ;DEFAULT MAP CONTENTS MOVEM T1,MAPCON ;INCASE NO USER SWITCHES MOVEI T1,CP.MSK ;[1120] START PROG RUNNABLE ON ALL CPU TYPES MOVEM T1,OKCPUS ;[1120] .. IFN FTOVERLAY,< MOVEI T1,.SPA ;SET DEFAULT FOR LINK 0 MOVEM T1,SPACE ;IN CASE USER DOES'NT MOVEI T1,PH.LEN ;[1400] LENGTH OF PREAMBLE MOVEM T1,PH+PH.HDR ;[1400] FOR LINK FILES MOVX T1,<.ARS,,.ARS> ;[635] SET DEFAULT /ARSIZE MOVEM T1,ARSIZE ;[635] IN CASE NO /ARSIZE SWITCH SETOM LNKMAX ;SO WE CAN TELL LINK #0 > IFN TOPS20,< MOVSI T1,L.SYM ;ALWAYS LOAD SYMBOLS IF TENEX MOVEM T1,FLAGS ;REMEMBER OVER CR-LF > MOVEI T1,START ;RESTART CODE HRRM T1,.JBSA## ;SO WE GET CORRECT SEGMENT IFN DEBSW,< MOVE T1,[JRST %DDT%] ;ENTER DDT IF LOADED > IFE DEBSW,< MOVSI T1,(POPJ P,) ;NO DDT > MOVEM T1,ENTDDT ;WILL HANDLE DEBUG RIGHT IFN TOPS20,< ;[2247] ;[2247] Here to set up the inferior fork. MOVX T1,CR%CAP ;[2247] Give inferior some privs CFORK% ;[2247] Create it ERNAM CFORK% ;[2337] Catch errors MOVEM T1,LC.JF ;[2247] Store the fork handle SETZB T1,LW.LC ;[2247] Map from page zero MOVE T2,LC.AB ;[2247] Get the top SUB T2,LC.LB ;[2247] Minus bottom is size MOVEM T2,UW.LC ;[2247] Store size PUSHJ P,LC.IN## ;[2247] Map it in (section 0 always exists) >;[2247] IFN TOPS20 MOVEI T2,USELEN ;ANY USER LIBS TO SETUP? JUMPE T2,LNKSCN ;NO, SCAN FIRST COMMAND LINE SUBTTL SETUP USER LIBRARIES SETUSE: PUSHJ P,DY.GET## ;GET SPACE WE NEED MOVEM T1,USEPTR ;SETUP POINTER MOVE T3,T1 HRLI T3,LIBTBL ;SETUP BYTE POINTER MOVE T4,T1 ADDI T4,-1(T2) ;CALCULATE END BLT T3,(T4) ;MOVE LIST SUBI T2,F.LEN ;ANY MORE? JUMPLE T2,LNKSCN ;NO, GO TO SCANNER ADDI T1,F.LEN MOVEM T1,-F.LEN(T1) ;POINT TO NEXT JRST .-4 ;TRY AGAIN DEFINE MAKLIB (LANGUAGE,DEVICE,FILE,EXT,PRJ,PRG,SFD) < .ZZT==0 ;[1315] ACCUMULATE LANGUAGE BITS .ZZZ==. ;REMEMBER CURRENT POSITION EXP 0 ;ZERO LINK WORD (NEXT LIB) DEFINE X (A,B,C,D)< IFIDN ,,< .ZZT==.ZZT!1B ;[1546] USE FOR USER DEFINED LIBRARY >> IFIDN ,< .ZZT==-1 ;;[1315] USE FOR ALL LANGUAGES > IFB ,< .ZZT==-1 ;;[1315] USE FOR ALL LANGUAGES > PROCESSORS IFE .ZZT, EXP .ZZT ;[1315] PROCESSOR BITS IFNB ,<> IFB ,< SIXBIT /SYS/> EXP -1 IFNB ,<!777777> IFB ,<!777777> IFNB , IFB , EXP 0 XWD PRJ,PRG IFNB , IFB , IRP SFD,< ;GENERATE ANY SFDS EXP -1 > REPEAT F.BFR+.ZZZ-.,< ;FILL IN BLANK SFDS EXP 0 > REPEAT F.LEN+.ZZZ-.,< ;NOW FILL IN SWITCHES (-1) EXP -1 > > ;DEFINE USER LIBRARIES BY ;MAKLIB DEVICE,FILE,EXT,PRJ,PRJ, LIBTBL: ;LIST OF LIBRARIES USELIB USELEN==.-LIBTBL SUBTTL ERROR MESSAGES CCLMES: ASCIZ \LINK: Loading \ LOASUP: OUTSTR [ASCIZ/LINK: ?LNKSUP Loading suppressed /] ;[2050] EXIT E$$GTF: .OERR. [ASCIZ/?LNKGTF GETTAB failed while trying to get program information /] ;[2075] EXIT ;[2075] E$$IMI::.OERR. [ASCIZ \?LNKIMI Insufficient memory to initialize LINK \] EXIT CPOPJ: POPJ P, ;SOMEWHERE TO PUT IT SUBTTL INITIAL SYMBOLS DEFINE SYMBOL (F,S1,S2,V)< IFB ,< PT.SGN!PT.SYM!PS.GLB > IFNB ,< PT.SGN!PT.SYM!PS.GLB!'F > SIXBIT \S1\ IFB ,< IFNDEF S2, EXP S2 > IFNB ,< EXP V >> DEFINE .JB (F,S,V)< .%%'S: SYMBOL F,.JB'S,.JB'S,V HASH .JB,S > DEFINE JOB (F,S,V)< %%%'S: SYMBOL F,JOB'S,.JB'S,V HASH JOB,S > SALL ;ZERO ALL REQUIRED SYMBOLS IF1,< DEFINE GETSYM (N) <.%'N=0> N=0 REPEAT I.PRM, ;NOW FOR HASH MACRO (PASS1 ONLY) DEFINE HASH (J,S)<> >;END IF1 ;ALL WORK DONE ON PASS 2 IF2 ,< DEFINE HASH (J,S)< IFIDN <.JB>,< %%%=.%%'S PURGE .%%'S > IFDIF <.JB>,< %%%=%%%'S PURGE %%%'S > HT=() IFN HT-''J'',&<-1-<''J''&HT>>> Q=HT/I.PRM R=HT-Q*I.PRM IFGE Q-I.PRM, IFE Q, TRY=1 ITEM Q,\R IFL I.PRM-TRY, > DEFINE ITEM (QT,RM) < IFN .%'RM,< R=R+Q IFL I.PRM-R, IFGE I.PRM-,< ITEM Q,\R >> IFE .%'RM,<.%'RM=HT,,%%%-GSTBL+1> > >;END IF2 LSTBL: ;TITLE SYMBOLS (LOCAL FILE ONLY) PT.SGN!PT.EXT!PT.TTL!PT.FAK 'JOBDAT' ENDSYM-LSTBL+1 S.TTL '-INITI' 'AL-SYM' S.TTL 'BOLS ' 0 S.TTL!S.LST!S.SEG .JBDA ;[2254] LOW SEG ORIGIN .JBDA ;[2254] LOW SEG BREAK GSTBL: ;OLD STYLE JOBDAT SYMBOLS I.E. JOBXXX IFN .OSJOB,< ;DON'T WASTE SPACE ON OLD SYMBOLS JOB ,41 JOB ,APR JOB ,BLT JOB ,CHN IFN FTCN6,< JOB ,CN6 > JOB ,CNI JOB ,COR JOB ,DA JOB ,DDT JOB ,ERR JOB ,FF JOB PS.DDT,HDA JOB PS.DDT,HGH JOB PS.DDT,HNM JOB ,HRL JOB PS.DDT,HSM JOB PS.DDT,HVR JOB ,INT JOB ,OPC JOB ,PFI JOB ,REL JOB ,REN JOB ,SA JOB ,SYM JOB ,TPC JOB ,USY JOB ,UUO JOB ,VER >;END OF IFN .OSJOB %%%BDT: SYMBOL PS.DDT,%JOBDT,%JOBDT HASH %JO,BDT ;NEW STYLE SYMBOLS .JBXXX .JB ,41 .JB ,APR .JB ,BLT .JB ,CHN IFN FTCN6,< .JB ,CN6 > .JB ,CNI .JB ,COR .JB ,CST .JB ,DA .JB ,DDT .JB ,EDV,112 ;[1151] VALUE HERE FOR ASSEMBLY WITH 6.03A .JB ,ERR .JB ,FF .JB PS.DDT,H41 .JB PS.DDT,HCR .JB PS.DDT,HDA .JB PS.DDT,HGA .JB PS.DDT,HGH .JB PS.DDT,HNM .JB ,HRL .JB PS.DDT,HRN .JB PS.DDT,HSA .JB PS.DDT,HSM .JB PS.DDT,HVR .JB ,INT .JB ,OPC .JB ,OPS .JB ,OVL .JB ,PFH .JB ,PFI .JB ,REL .JB ,REN .JB ,SA .JB ,SYM .JB ,TPC .JB ,USY .JB ,UUO .JB ,VER ENDSYM:! SUBTTL HASH TABLE HSTBL: IF1, IF2,< DEFINE SETVAL (N) < EXP .%'N PURGE .%'N > .XCREF N=0 REPEAT I.PRM,< SETVAL \N N=N+1 > PURGE TRY,%%%,Q,R,N,HT .CREF >;END IF2 ENDHSH:! SUBTTL GETSEG CODE IFE FTSINGLE,< HICODE: PHASE PHAZLO ;TOP OF FIXED DATA AREA ;HERE TO DO A GETSEG TO REQUIRED SEGMENT ;ENTERS WITH REQUIRED NAME IN T1 ;GETSEG ERROR WILL CALL SEGMENT LNK999 TO HANDLE ERROR ;IF THAT FAILS A SHORT MESSAGE WILL BE OUTPUT ON TTY SEGCOD: SETZM SGFLAG ;GOING FORWARDS EXCH T1,SEGBLK+1 ;SAVE SEGMENT NAME MOVEM T1,OLDSEG ;SAVE IN SGCOD1: SETZM SEGBLK+2 ;CLEAR EXTENSION SETZM SEGBLK+3 ;AND OTHER PARAMS SETZM SEGBLK+5 ;AND CORE SIZE MOVEM FL,SAVEAC ;NEED TO SAVE FLAGS MOVEM P,SAVEAC+P ;AND P ;******************** ;REMOVE WHEN MONITOR BUG IS FIXED MOVSI T1,1 ;GET RID OF HIGH SEGMENT FIRST CORE T1, ; TO BE SURE WE HAVE ENOUGH ROOM JFCL ;CAN NOT HAPPEN ;******************** MOVEI T1,SEGBLK ;ADDRESS OF DATA NGTSEG: GETSEG T1,UU.PHY ;GET THE REQUIRED SEGMENT JRST SEGERR ;FAILED SEGGOT: MOVE P,SAVEAC+P ;RESTORE P MOVE FL,SAVEAC ;AND FLAGS MOVE T1,OFFSET ;NORMAL OR CCL MOVE T2,GTUPM ;ARG FOR GETTAB GETTAB T2, ;TO FIND HIGH SEG ORIGIN MOVSI T2,%HISEG ;ASSUMED TO BE AT 400000 SKIPN T2 ;NO NEED FOR DEFAULT ENTRY ADDRESS ; IF NON-ZERO MOVSI T2,%HISEG ;SET UP DEFAULT ADDRESS HLRZ T2,T2 ANDCMI T2,777 ;ONLY SAVE PAGE NUMBER HRRZM T2,HIORGN ;[650] SAVE FOR EVERYBODY ADDI T2,.JBHDA## ;PLUS OFFSET MOVEM T2,SEGPGN ;STORE IT MOVEI T3,EZCOR ;SO WE CAN CHECK IF NEXT SEG IS SAME SIZE SKIPN SGFLAG ;FORWARDS? JRST %%ST(T2) ;YES, GO TO START CODE SKIPA T3,.+1 SAVEAC+P1,,P1 BLT T3,16 ;RESTORE ACCS JRST %%RET(T2) ;GO TO START CODE GTUPM: -2,,.GTUPM OLDSEG:! 0 ;STORE OLD SEG NAME SGFLAG:! 0 ;-1 IF OLDSEG WANTED SEGPGN:! 0 ;PAGE NO. OF START OF HIGH SEG PRVSEG: SETOM SGFLAG ;GOING BACK MOVE T1,OLDSEG ;GET NAME MOVEM T1,SEGBLK+1 ;STORE JRST SGCOD1 ;REJOIN COMMON CODE SEGERR: HRRM T1,SEGBLK+2 ;STORE ERROR CODE IN GETSEG BLOCK ;******************** ;REMOVE WHEN MONITOR BUG IS FIXED MOVSI T1,1 ;GET RID OF HIGH SEGMENT FIRST CORE T1, ; TO BE SURE WE HAVE ENOUGH ROOM JFCL ;CAN NOT HAPPEN ;******************** MOVEI T1,ERRBLK ;TRY AGAIN EGTSEG: GETSEG T1,UU.PHY HALT ;LET MONITOR PRINT MESSAGE JRST SEGGOT ;WE GOT LNK999, GO TO IT ;GETSEG BLOCK FOR LNK999 ERRBLK: .-. ;DEVICE 'LNK999' ;FILE NAME EXP 0,0,0,0 ;EXT, CORE ETC >;END IFE FTSINGLE SUBTTL RESTART CODE IFE FTSINGLE,< ;DO A RUN UUO ON FIRST SEGMENT START: MOVE T1,FSTSEG ;[600] GET NAME OF INITIAL SEGMENT CAMN T1,SEGBLK+1 ;[600] ALREADY IN THE RIGHT SEGMENT? JRST START1 ;[600] RIGHT SEGMENT MOVEM T1,SEGBLK+1 ;STORE NAME SETZM SEGBLK+2 ;CLEAR EXT SETZM SEGBLK+3 SETZM SEGBLK+5 SKIPA T1,.+1 ;GET RID OF HIGH AND REST OF LOW SEG 1,,.+5 CORE T1, ; TO BE SURE WE HAVE ENOUGH ROOM JFCL ;CAN NOT HAPPEN MOVEI T1,SEGBLK ;NORMAL START ADDRESS RUN T1, HALT ;TOO BAD >;END IFE FTSINGLE SUBTTL UUO TRAP UUOHANDLER: MOVEM T1,SAVEAC+T1 ;GET AN ACC MOVE T1,.JBUUO ;GET UUO TLNN T1,776000 ;ONLY UUO 1 IS VALID IFE FTSINGLE,< JRST @SEGPGN ;ENTER HIGH SEG > IFN FTSINGLE,< JRST %%UUO## ;WE KNOW WHERE IT IS > E$$IUU::.OERR. [ASCIZ /?LNKIUU Illegal user UUO at PC /] ;[1174] SOS T2,UUOTRAP ;PC+1 HRLO T2,T2 ;PC IN LEFT FLAG IN RIGHT SETZ T1, ;RECEIVING ACC LSHC T1,3 ;GET NEXT CHAR ADDI T1,"0" ;TURN INTO ASCII OUTCHR T1 TRNE T2,-1 ;ZERO RH WHEN DONE JRST .-5 EXIT SUBTTL ENTER DDT IFN DEBSW,< %DDT%: IFE TOPS20,< SKIPN .JBDDT ;DDT LOADED? POPJ P, ;NO > POP P,.JBOPC ;SAVE PC PUSH P,T1 ;GET AN ACC OUTSTR %DDT1 MOVE T1,@.JBOPC ;GET STRING PTR OUTSTR @T1 ;OUTPUT IT OUTSTR %DDT2 HRRZ T1,.JBDDT ;GET DDT ADDRESS IFN TOPS20,< SKIPN T1 ;REAL DDT? MOVEI T1,770000 ;NO, USE IDDT > EXCH T1,0(P) ;SWAP WITH CONTENTS OF T1 POPJ P, ;GO TO DDT %DDT1: ASCIZ \ DDT: Called from \ %DDT2: ASCIZ \ \ > SUBTTL TTY OUTPUT LINE BUFFERING SUBROUTINE ;ROUTINE TO LOG A CHARACTER TO THE USER'S TERMINAL. USES A LINE BUFFER ;FOR SPEED. TTYIT IS THE ENTRY POINT. SAVES T1. TTYDMP: PUSHJ P,TTYOUT ;[1124] OUTPUT LINE TTYIT: SOSGE TTYBUF+2 ;ANY SPACE LEFT JRST TTYDMP ;NO, FORCE OUTPUT IDPB T1,TTYBUF+1 ;DEPOSIT IN LINE BUFFER CAIG T1,.CHFFD ;SEE IF END-OF-LINE CHAR CAIGE T1,.CHLFD SKIPA ;[1124] NO--JUST RETURN PUSHJ P,TTYOUT ;[1124] YES--DUMP THE LINE FIRST IFE FTSINGLE,< TTYRET: PUSH P,T1 ;[1124] SAVE CHAR IN T1 MOVE T1,SEGPGN ;[1124] GET SEGMENT ORIGIN ADDI T1,%%RET ;[1124] POINT TO WHERE WE WANT TO GO EXCH T1,0(P) ;[1124] SAVE GOTO ADDR, RESTORE T1 > POPJ P, ;[1124] RETURN ;LOCAL ROUTINE TO DUMP THE TERMINAL BUFFER WHEN FULL OR END-OF-LINE ;CHARACTER IS SEEN. SAVES T1. TTYOUT: PUSH P,T1 ;[1124] SAVE PENDING CHAR SETZ T1, IDPB T1,TTYBUF+1 ;END WITH NULL OUTSTR LINBUF ;OUTPUT LINE MOVEI T1,LN.CPL ;RESET MOVEM T1,TTYBUF+2 ;CCHAR COUNT SKIPA T1,.+1 POINT 7,LINBUF MOVEM T1,TTYBUF+1 ;AND BYTE PTR POP P,T1 ;[1124] RESTORE PENDING CHAR POPJ P, ;[1124] RETURN SUBTTL LOG FILE OUTPUT SUBROUTINE LOGIT: SOSGE RCBUF+2 ;ANY SPACE LEFT JRST LOGDMP ;NO IDPB T1,RCBUF+1 ;YES IFE FTSINGLE,< JRST TTYRET ;INCASE EXECUTE ONLY > IFN FTSINGLE,< POPJ P, > LOGDMP: OUT RC, ;OUTPUT THIS BUFFER JRST LOGIT ;NO ERRORS MOVSI T1,(POINT 0) ;NULL BYTE POINTER HLLM T1,RCBUF+1 ;INCASE CALLED AGAIN HRLOM T1,RCBUF+2 ;VERY LARGE WORD COUNT RELEASE RC, ;SAVE WHAT WE HAVE E01OEL::.OERR. .EROEL ;[1174] LNKOEL IFE FTSINGLE,< JRST TTYRET > IFN FTSINGLE,< POPJ P, > .EROEL: .ASCIZ <%LNKOEL Output error on log file, file closed, load continuing > IFE FTSINGLE,< HIEND==.-1 DEPHASE IFL LN.PLC-,< PRINTX ?PHASED LOWSEG AREA TOO SMALL, INCREASE LN.PLC IN LNKPAR > >;END IFE FTSINGLE SUBTTL HIGH SEGMENT PART OF RESTART CODE ;HERE TO RESTART SINGLE SEGMENT VERSION OR WHEN RESTARTING ;MULTI-SEG VERSION AND RIGHT SEGMENT IS STILL IN CORE IFN FTSINGLE,< START:: > START1: MOVEI T1,EZCOR ;GET RID OF JUNK IN LOW SEG CORE T1, ;EASY WAY JFCL ;CANNOT FAIL SKIPA T1,.+1 %LOW,,%LOW+1 SETZM %LOW ;CLEAR LOW SEG DATA BLT T1,@.JBREL MOVEI T1,LINK ;GET ORIGINAL START ADDRESS HRRM T1,.JBSA ;RESET IT JRST (T1) ;AND START AGAIN SUBTTL THE END INILIT: END LINK