TITLE LNKWLD - SWITCH HANDLER FOR LINK SUBTTL D.M.NIXON/DMN/JLd/SRM/JBC/JNG/MCHC/PAH/DZN/PY 6-Jan-83 ;COPYRIGHT (C) 1973, 1983 BY ;DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. ; ; ;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,MACTEN,UUOSYM,SCNMAC IFN TOPS20,<SEARCH MACSYM,MONSYM> SALL ENTRY LNKWLD EXTERN LNKFIO,LNKCOR,LNKLOG,LNKMAP,TTYCHK CUSTVR==0 ;CUSTOMER VERSION DECVER==5 ;DEC VERSION DECMVR==1 ;DEC MINOR VERSION DECEVR==2026 ;DEC EDIT VERSION SEGMENT
;CALLING SEQUENCE ;PUSHJ P,LNKWLD ;RETURN ;END OF LIST NOTHING LEFT ;ALL I/O SETUP SO SOSGE LOOP WILL GET DATA ;CALLS LNKFIO TO TAKE CARE OF ALL OUTPUT FILE I/O ;OUTPUT FILES MUST BE FIRST IN LIST ;ALSO HANDLES ALL SWITCHES
SUBTTL REVISION HISTORY ;START OF VERSION 1A ;41 ADD LNKFSI MESSAGE ;45 HASH INITIAL SYMBOLS AT ASSEMBLY TIME ;46 ADD KLUDGE FEATURE ;52 ADD ASCII TEXT BLOCK ;54 ADD KIONLY D.P. INST ;60 ADD /VERSION SWITCH ;63 ADD EXTERNAL START ADDRESS IN BLOCK TYPE 7 ;65 TENEX SPEEDUPS ;71 MAKE ALL MESSAGES STANDARD FORM ;74 (11389) FIX ILL MEM REF ON FILE/SYSLIB ;103 RESTORE BOTH HALVES OF FL AFTER EDITED LOOKUP ERROR ;105 MAKE BLOCK TYPE 12 WORK ;106 REMOVE HIORG, REPLACE WITH EITHER LL.S2 OR SO.S2 ;107 REPLACE KLUDGE BY MIXFOR ;110 ILL MEM REF ON /BASKSPACE:1 ;114 MAKE /LOG WORK IF DEVICE NOT 'LOG' OR TTY ;115 MAKE /NOSYMBOLS WORK CORRECTLY ;120 /SYMSEG:HIGH WITH NO HIGH CODE GIVES ILL MEM REF ;START OF VERSION 1B ;122 (11940) ADD COPYP1 TO HANDLE /M/SSA=PROG ;124 ADD /ONLY SWITCH ;132 (12304) FIX TO EDIT 122 ;START OF VERSION 2 ;135 ADD OVERLAY FACILITY ;137 ADD SUPPORT FOR PLOT PACKAGE ;141 TURN ON AND FIX BUGS IN ASCII TEXT BLOCKS ;145 IMPLEMENT /USERLIB & /NOUSERLIB SWITCHES ;153 FIX BUG IN EDITS 122 AND 132 ;156 MAKE FOO/DEBUG WORK RIGHT ;161 ADD LANGUAGE SPECIFICATION TO /USERLIB ;167 CHANGE ARGUMENTS TO /OTSEGMENT ;170 MAKE PLOT SWITCH WORK ;201 MAKE FORDDT WORK ;216 (13559) ADD ZSV ERROR CHECK AND MESSAGE
;START OF VERSION 2B ;225 ADD SUPPORT FOR PSECT (MACRO VERSION 51) ;245 CHANGED CALLING SEQUENCE TO DVLKP. ;247 Rework the use of the DEBUGSW; set .LOCALS before main ; program is loaded. ;253 Make multiple line ASCII text blocks work ;254 Disconnect from the file spec. switches deferred until ; after the file is open so won't dispatch off of PC ; if the file spec. is edited. ;256 Add a zero entry to the key word table, incase the ; user types "/<switch>:" without a key word ;262 Make SYSLB1 a global routine to force a LIBRARY search ;272 Correctly force rehashing if /HASHSIZE seen ;277 Control stack so can continue after editing file spec. ;302 MAKE TENEX DDT WORK RIGHT ;307 MAKE LOCAL ASCII BLOCK SWITCHES WORK RIGHT ;343 INCLUDE EDITS 302,307 IN MAINTENANCE SOURCES ;353 REMOVE EDIT 225 ;377 Fix some bugs in the handling of the /SET switch. ;400 Default the PPN correctly on /DEFAULT ;406 Make DDT default for /TEST: and /DEBUG: ;411 Implement /K to correct ASCII text processing ;421 Give %LNKMSN and %LNKSSN if can't act as requested. ;431 Make the /ESTIMATE switch work. ;START OF VERSION 2C ;464 Implement the /MISSING switch. ;471 Add code for ALGOL debugging system. ;472 Update HL.S1 on the /COMMON switch, and fix the map. ;530 Define triplet flags bits correctly. ;534 Fix problems with .OSCAN and ASCII text. ;544 SOUP in LINK version 3 stuff for TOPS-20. ;551 Change /SYMBOL to /SYFILE ;557 Clean up the listing for release. ;START OF VERSION 3 ;446 CHANGE TO LOAD SYS:UDDT.EXE FOR TENEX ;START OF VERSION 3A ;560 Release on both TOPS-10 and TOPS-20 as LINK version 3A(560)
;START OF VERSION 4 ;605 Use OUTSTR's in various messages. ;610 Handle defaulting of ersatz devices correctly. ;615 Never try to load empty SCAN blocks. ;617 Fix edits 610 and 615. ;620 Don't overwrite old device when merging file specs ;621 /SAVE and /SSAVE generate an EXE file. ;653 Make /SYSLIB with an argument work. ;655 Clear start address module name on /START. ;677 Don't default to /SYMSEG:LOW if loading overlays. ;705 Wait for the file to be loaded first for /SYMSEG ;706 /SET to build RC.NTB ;714 Add psect-name as a global symbol with origin as value. ;715 Modify SYMSEG to take psect name. ;721 Implement /SYMSEG:PSECT:psectname. ;723 Add /UPTO. ;727 Adjust SYMLIM with /SET:.HIGH. /SYMSEG:HIGH & /SYMSEG:LOW. ;730 Save /DEBUG file spec for /LINK. ;731 SEARCH MACTEN,UUOSYM ;740 Remove %VERSION code. ;757 Type out RC.HL instead of RC.CV value for overlayable PSECT for /COUNTER. ;761 Clear AT.RP(relocatable PSECT bit) in /SET switch. ;763 Common code in .SET0 for creating reloc counter for block 22,24. ;765 Release on both TOPS-10 and TOPS-20 as LINK version 4(765)
;START OF VERSION 4A ;775 Make sure /DEBUG:FORTRAN loads the starting address of FORDDT. ;1002 Give undefined messages with long symbol names. ;1101 Set LSTBLK and DTAFLG correctly on new input files. ;1107 Fix bug with .SETEX routine to expand RC.TB and RC.NTB tables. ;1117 Add /NOINCLUDE switch and make /INCLUDE:args set include mode. ;1122 Remove edit 740. ;1132 Allow loading of PSECTs above the high segment. ;1142 Fix problems with /SET introduced by edit 1132. ;1144 Remember if we mapped in DDT as a result of /DEBUG:DDT on TOPS-20. ;1145 Load locals if /DEBUG:DDT on TOPS-20. Broken by edit 1144. ;1155 Store PSECT properties even if PSECT name is .HIGH. ;1157 Suppress the PSECT name global symbols to DDT typeout. ;1163 Fix edit 1155 to not mark .HIGH. as relocatable. ;1172 Don't change SYMLIM on /SET to .HIGH.. ;1173 Update RC.HL on /COMMON. ;1174 Label and clean up all error messages. ;1175 Don't lookup symbolic argument to /START until /GO, move USA message. ;1176 Disallow /SYMSEG:PSECT:name if loading overlays. ;1177 Make global /VERSION not lose local switches. ;1201 Change $SEGxxx to $SSGxxx. ;1203 Add support for extended FORTRAN. ;1204 Check for program growing too far and give LNKPTL. ;1211 Fix typo in LNKDRC. ;1217 Clean up the listings for release. ;1220 Release on both TOPS-10 and TOPS-20 as version 4A(1220). ;START OF VERSION 4B ;1225 Allow for extra argument in X macro in PROCESSORS macro. ;1230 Delete definitions of $SYM?? symbols (moved to LNKPAR) and set up ; /SYFILE: channel properly. ;1240 Fix /CPU switch to use bits instead of values. ;1241 Make /SET produce LNKZSV if no arguments. ;1246 Don't set up high segment yet if /SYMSEG:HIGH found. ;1255 Restore R in case SY.GS found references to PSECT name. ;1267 Teach /DEBUG and /TEST switches about ALGDDT. ;1270 Make /START: request the symbol in case symbol is in a library ;1300 Add /LIMIT switch and RC.LM ;1301 Change /VERBOSITY to bits. ;1304 Build RC.MAP entries along with RC.TB and RC.NTB ;1307 Add /SUPPRESS switch ;1313 Reset flag when debugger is loaded so /LINK won't be confused. ;1321 Make SIMDDT not load a file. ;1324 Use compiler type bits in /USERLIB. ;Start of Version 5 ;1423 Add support for /PVBLOCK and /PVDATA ;1431 Fix typo in /PVDATA support ;1435 PASCAL debugger support added. ;1442 /EXTEND switch added. ;1450 Remove /EXTEND ;Start of Version 5A ;1500-1677 Reserved for Maintenance ;1505 Set correct uppermost default limit for section-crossing PSECTs. ;1705 Treat PASDDT like FORDDT. ;1736 Strip unsupported FMXFOR code. ;2006 Zero ENTLEN if /START switch seen. ;2011 Add /PLTTYP to specify type of plot to produce. ;2026 Update copyright notice, clean up listings.
SUBTTL ENTER HERE FROM LNKLOD TO GET A FILE TO LOAD LNKWLD: SETZM NULSPC ;CLEAR NULL FILE SPEC FLAG SKIPE P1,F.EDIT ;DID WE JUST DO AN EDIT CORRECTION? JRST MERGE ;YES, BUILD THE TRUE FILE SPEC MOVEM P,MARKWP ;MARK STACK INCASE LOOKUP ERROR IFN .ASBLK,< SKIPE F.ASCI ;READING INCORE TEXT? JRST ASCMRG ;YES > SKIPE SWFLAG ;CHECK FOR DEFERED SWITCHES FROM LAST FILE PUSHJ P,DEFLSW ;YES, GO DO THEM FIRST SKIPE P1,F.INZR ;GET NEXT FILE SPEC JRST NXTSPC ;YES THERE IS ONE SKIPE GOTO ;NO, BUT SHOULD WE TERMINATE JRST @GOTO ;YES, DO FINAL DEFAULTS ETC. SKIPG P1,S.INZR ;JUST FINISH A /LINK SWITCH? JRST URET ;NO, RETURN TO USER MOVEM P1,F.INZR ;YES, RESTART COMMAND STRING HLLZ FL,S.LHFL ;PUT THINGS BACK AS THEY WERE HLR FL,FL ;DEFAULT SWITCHES FOR THIS FILE SETZM S.INZR ;CLEAR SPECIAL KLUDGE FLAGS SETZM S.LHFL ;.. ;HERE TO LOOK FOR SWITCHES NXTSPC: HLRZ P2,F.SWP(P1) ;GET LIST OF GLOBAL SWITCHES JUMPE P2,.+3 ;NONE THERE PUSHJ P,XCTGSW ;DO SWITCH MOVE P1,F.INZR ;RELOAD P1 HRRZ P2,F.SWP(P1) ;GET LIST OF LOCAL SWITCHES JUMPE P2,.+3 ;NONE PUSHJ P,XCTLSW ;DO SWITCH MOVE P1,F.INZR ;RELODE P1 AGAIN IFN .ASBLK,< SKIPE F.ASCI ;READING INCORE TEXT? JRST ASCRET## ;YES, FINISH IT > SKIPN NULSPC ;NULL FILE SPEC (SWITCHES ONLY) JRST DEFILL ;NO, REAL FILE SPEC HERE NOTSPC: PUSHJ P,RETFSP ;JUST A DUMMY DATA BLOCK JFCL ;INCASE NON-SKIP RETURN JRST LNKWLD ;INCASE ANY DEFERED SWITCHES
;HERE TO FILL IN DEFAULTS FOR INPUT DEVICE DEFILL: MOVE T3,F.MOD(P1) ;GET MODIFIER WORD MOVE T2,G.NAM ;DEFAULT FILE NAME SKIPN F.NAME(P1) MOVEM T2,F.NAME(P1) MOVE T2,G.EXT ;DEFAULT EXTENSION SKIPN F.EXT(P1) ;EXT SPECIFIED? TXNN T3,FX.NUL ;ONLY REPLACE NULL EXT CAIA ;NO IF 0 OR IF GIVEN MOVEM T2,F.EXT(P1) MOVE T1,F.DIR(P1) ;GET SPECIFIED [PPN] MOVE T2,G.DIR ;AND DEFAULT [PPN] TXNN T3,FX.DIR ;SKIP IF DIRECTORY SPECIFIED JRST DEFDIR ;FILL IN FULL DEFAULT DIRECTORY TLNN T1,-1 ;PROJ GIVEN? HLL T1,MYPPN ;[610] NO, USE DEFAULT TRNN T1,-1 ;PROG? HRR T1,MYPPN ;[610] NO MOVEM T1,F.DIR(P1) ;[610] STORE UPDATED UFD JRST DEFDEV ;[610]
;HERE TO DEFAULT THE DIRECTORY. MUST NOT USE DEFAULT DIRECTORY ;IF NO DIRECTORY SPECIFIED BUT DEVICE SPECIFIED WAS ERSATZ. DEFDIR: MOVE T3,F.MODM(P1) ;GET MOD MASK TXNE T3,FX.DIR ;TEST FOR [-] JRST DEFDEV ;[610] YES, LEAVE DIR ALONE AS ZERO MOVE T1,[3,,T2] ;[610] NO DIR SPECIFIED, BUT WAS MOVE T2,F.MOD(P1) ;[610] DEVICE SPECIFIED ERSATZ? TXNN T2,FX.NDV ;[610] NOT IF NO DEVICE WAS SPECIFIED! SKIPN T2,F.DEV(P1) ;[610] SHOULD BE ONE, MAKE SURE JRST DEFDR1 ;[610] NO DEVICE, USE G.DIR PATH PATH. T1, ;[610] USER TYPED A DEVICE, ERSATZ? SETZ T3, ;[610] PROBABLY NOT TXNE T3,PT.IPP ;[610] WAS THE DEVICE ERSATZ? JRST DEFDEV ;[610] YES, LEAVE THE PATH ALONE DEFDR1: HRLI T2,G.DIR ;[610] NO, FORM BLT POINTER HRRI T2,F.DIR(P1) BLT T2,F.DIR+2*.FXLND-1(P1) ;HERE TO DEFAULT THE DEVICE. CAN'T USE DEFAULT DEVICE IF IT'S ;ERSATZ AND USER GAVE AN EXPLICIT PATH. DEFDEV: MOVSI T2,'DSK' ;[617] UNIT DEFAULT DEVICE SKIPN F.DEV(P1) ;[617] NONE SPECIFIED? MOVEM T2,F.DEV(P1) ;[617] MAKE SURE THERE IS ONE MOVE T2,F.MOD(P1) ;[610] PICKUP MOD WORD TXNE T2,FX.NDV ;[610] USER TYPE AN EXPLICIT DEVICE? SKIPN T2,G.DEV ;[610] NO, BUT IS THERE A DEFAULT? JRST LDDS ;[610] EXPLICIT DEVICE OR NO DEFAULT MOVE T1,[3,,T2] ;[610] BUT IS THE DEFAULT DEVICE ERSATZ? PATH. T1, ;[610] FIND OUT VIA PATH UUO SETZ T3, ;[610] PROBABLY NOT MOVE T2,G.DEV ;[610] RESTORE CORRECT DEVICE MOVE T1,F.MODM(P1) ;[610] GET MOD MASK TXNE T1,FX.DIR ;[610] WAS A DIRECTORY SPECIFIED? TXNN T3,PT.IPP ;[610] YES, WAS THE DEVICE ERSATZ? MOVEM T2,F.DEV(P1) ;[610] NO DIR OR G.DEV NOT ERSATZ
;HERE TO GET DEVICE AND DO OPEN IF DEVICE DIFFERENT FROM LAST ONE LDDS: MOVEI T2,DC ;GET DATA CHAN CAME T2,IO.CHN ;SAME AS CURRENT? SETZM IO.CHR ;NO, SO DEVCHR MUST BE INVALID MOVEM T2,IO.CHN ;INCASE DEFERED SWITCHES MOVE T2,F.DEV(P1) ;GET DEVICE EXCH T2,FSTR ;MAKE SURE NEW STORED INCASE OF ERROR CAMN T2,FSTR ;SAME AS PREV DEVICE? JRST LDFS ;YES, BYPASS INIT SETZM FILNUM ;START AGAIN ON NEW DEVICE PUSHJ P,DVCHK.## ;SEE IF DEVICE EXISTS AND CAN SUPPORT MODE PUSHJ P,DVOPN.## ;DO OPEN LDFS: SKIPN IO.CHR ;VALID DEVCHR YET? PUSHJ P,DVCHK.## ;NO, GET IT INCASE NULL FILE NAME SKIPE F.NAME(P1) ;IF NO NAME GIVEN? JRST LDFS1 ;OK IT WAS MOVE T2,IO.CHR ;GET DEVCHR BIT TXNE T2,DV.DIR ;IF NON-DIRECTORY DEVICE JRST NOTSPC ;NO, SO NOT A FILE SPEC AOS T1,FILNUM ;GET FILE NUMBER SETZ T3, ;RECEIVE IT HERE IDIVI T1,^D10 ADDI T2,'0' ;[617] DIGITIZE LSHC T2,-6 ;SHIFT IN JUMPN T1,.-3 ;[617] UNTIL ALL DONE MOVEM T3,F.NAME(P1) ;SO WE KNOW WHICH FILE IF ERROR LDFS1: PUSHJ P,DVINP.## ;BUILD INPUT SPEC PUSHJ P,DVLKP.## ;AND LOOKUP PUSHJ P,E01FLE## ;[1174] GIVE ERROR MESSAGE SETZM LSTBLK ;[1101] ASSUME BLOCK 0 SETZM DTAFLG ;[1101] AND ON DISK (NORMAL CASE) MOVE T1,IO.CHR ;[1101] GET DEV CHARACTERISTICS TXNN T1,DV.DTA ;[1101] ON DECtape? JRST RETFSP ;RETURN SPACE SETOM DTAFLG ;[1101] ON DECtape, REMEMBER THAT SETOM LSTBLK ;[1101] FLAG FOR D.CNT IN LNKLOD JRST RETFSP ;[1101] DONE, GO RETURN SPACE
;HERE TO MERGE NEW FILE SPEC WITH PREVIOUS ONE MERGE: HLRZ T1,P1 ;GET POINTER TO FLAGS MOVE FL,(T1) ;RESTORE THEM AS THEY WERE MOVEI T2,1 ;GIVE BACK SPACE PUSHJ P,DY.RET## MOVE P2,F.INZR ;GET NEW SPEC MOVE T4,F.MOD(P2) ;GET MODIFIER WORD MOVE T1,F.DEV(P1) ;GET OLD DEVICE MOVE T2,F.MOD(P1) ;[620] OLD MOD WORD TXNE T2,FX.NDV ;[620] WAS THERE AN OLD DEVICE? JRST .+3 ;[620] NO, USE NEW ONE ALWAYS TXZE T4,FX.NDV ;[620] USER SUPPLIED NEW? MOVEM T1,F.DEV(P2) ;NO, USE PREVIOUS SKIPE F.NAME(P2) ;NEW NAME SUPPLIED? JRST MERGE0 ;YES, USE IT DGET T1,F.NAME(P1),F.NAMM(P1) ;NO, USE PREVIOUS & MASK DSTORE T1,F.NAME(P2),F.NAMM(P2) MERGE0: MOVE T1,F.EXT(P1) MOVE T2,F.MOD(P1) ;GET OLD MOD WORD TXNE T2,FX.NUL ;WAS OLD EXT VALID? JRST .+3 ;NO, USE NEW ALWAYS TXZE T4,FX.NUL ;SEE IF USER SUPPLIED NEW EXT MOVEM T1,F.EXT(P2) TXNN T4,FX.DIR ;NEW DIRECTORY? JRST [MOVE T3,F.MODM(P2) ;NO, BUT CHECK FOR [-] TXNE T3,FX.DIR ;WILL BE SET IF SO JRST MERGE1 ;YES, SO LEAVE PPN = 0 HRLZI T1,F.DIR(P1) ;NO, USE OLD PPN HRRI T1,F.DIR(P2) BLT T1,F.LEN-1(P2) ;COPY SFDS ALSO JRST MERGE1] MOVE T1,F.DIR(P1) ;GET PREVIOUS PPN MOVE T2,F.DIRM(P2) ;AND THIS MASK TLNN T2,-1 ;PROJ SPECIFIED? HLLM T1,F.DIR(P2) ;NO, USE PREV TRNN T2,-1 ;PROG SPECIFIED? HRRM T1,F.DIR(P2) ;NO
MERGE1: MOVEM T4,F.MOD(P2) ;STORE MODIFIED MOD WORD MOVE T2,P2 ;USER MAY HAVE SUPPLIED EXTRA FILE SPECS SKIPN F.NXT(T2) ;SO LOOK FOR END (0) JRST .+3 ;GOT IT MOVE T2,F.NXT(T2) ;NOT YET JRST .-3 MOVE T1,F.NXT(P1) ;GET NEXT FILE SPEC MOVEM T1,F.NXT(T2) ;LINK IN CHAIN ;NOW FOR SWITCHES ;LINK OLD SWITCHES IN FIRST SO NEW ONES CAN ;TURN THEM OFF HLRZ T1,F.SWP(P1) ;GET POINTER JUMPE T1,MERGE2 ;NONE HRRZ T2,0(T1) ;GET POINTER TO NEXT JUMPE T2,.+3 ;GOT LAST MOVE T1,T2 ;NO JRST .-3 ;KEEP TRYING HLLZ T2,F.SWP(P2) ;GET FIRST NEW SWITCH HLLM T2,0(T1) ;LINK IN HLLZ T1,F.SWP(P1) ;GET START OF CHAIN HLLM T1,F.SWP(P2) ;POINT TO NEW CHAINED LIST MERGE2: ;NOW FOR AFTER SWITCHES HRRZ T1,F.SWP(P1) ;GET POINTER JUMPE T1,MERGE3 ;NONE HRRZ T2,0(T1) ;GET POINTER TO NEXT JUMPE T2,.+3 ;GOT LAST MOVE T1,T2 ;NO JRST .-3 ;KEEP TRYING HRRZ T2,F.SWP(P2) ;GET FIRST NEW SWITCH HRRM T2,0(T1) ;LINK IN HRRZ T1,F.SWP(P1) ;GET START OF CHAIN HRRM T1,F.SWP(P2) ;POINT TO NEW CHAINED LIST MERGE3: MOVEI T1,0(P1) ;NOW REMOVE OLD MOVEI T2,F.LEN PUSHJ P,DY.RET## SETZM F.EDIT ;SO WE DON'T LOOP MOVE P,MARKWP ;RESET STACK TO POINT OF ERROR JRST LNKWLD ;NOW TRY IT
SUBTTL HERE FOR ASCII TEXT BLOCK ;ENTER HERE TO MERGE ASCII TEXT BLOCK WITH CURRENT COMMAND TREE ;THERE ARE TWO POSSIBILITIES ;IF THE FIRST BLOCK HAS NO FILE SPEC, THEN THE SWITCHES APPLY TO ;THE CURRENT FILE BEING LOADED AS IF THEY HAD BEEN TYPED AFTER ;THE FILE NAME IN THE COMMAND LINE ;IF A FILE SPEC IS SEEN THEN THE NEW TREE IS ADDED TO THE IN CORE ;ONE AFTER THE CURRENT FILE, THE GLOBAL SWITCHES OF THIS DO NOT ;APPLY TO THE CURRENT FILE BEING LOADED IFN .ASBLK,< ASCMRG: SKIPE P1,F.INZR ;ANYTHING TO DO SKIPE F.NAME(P1) ;ANY SWITCHES FOR THIS FILE? JRST ASCRET## ;NO, RETURN TO FIXUP LISTS AND STACK HRRZ T1,F.ASZR ;FIRST LINE OF .TEXT BLOCK? JUMPN T1,ASCRET## ;NO, DON'T PROCESS IT NOW MOVSS F.SWP(P1) ;FIRST MAKE THE SWITCHES LOCAL SETOM NULSPC ;MAKE SURE WE DON'T LOAD ANYTHING JRST NXTSPC ;YES, DO THEM NOW >;END IFN .ASBLK
;HERE TO RETURN FILE SPACE TO POOL ;CALLS DY.RET WITH ;T1 = ADDRESS ;T2 = LENGTH RETFSP: MOVE T2,F.NXT(P1) ;GET NEXT BLOCK MOVEM T2,F.INZR ;ADVANCE POINTER HRRZ T1,P1 ;SET ADDRESS MOVEI T2,F.LEN ;SET LENGTH PUSHJ P,DY.RET## ;GIVE BACK SPACE SKIPL S.INZR ;LAST BLOCK CONTAIN /LINK? JRST DEFGSW ;NO, PROCEED MOVE T1,F.INZR ;SAVE REST OF COMMAND LINE HRRZM T1,S.INZR ; UNTIL /LINK PROCESSING DONE MOVEM FL,S.LHFL ;SAVE GLOBAL DEFAULTS TILL LATER SETZM F.INZR ;FOR NOW, PRETEND EOL SETZM F.NXZR ; SO GOTO NON-ZERO WILL BE NOTICED ;HERE TO HANDLE DEFERED SWITCHES ;SWITCHES ARE LINKED TO SWFLAG ;SKIP RETURNS ALWAYS DEFGSW: HLRZ P2,SWFLAG ;GET SWITCHES BEFORE FILE NAME FIRST JUMPE P2,CPOPJ1 ;NONE, GIVE UP FOR NOW HRRZ T1,(P2) ;GET NEXT ADDRESS HRLM T1,SWFLAG ;REMOVE FROM LIST MOVE T2,2(P2) ;GET VALUE PUSHJ P,@1(P2) ;RETURN TO SWITCH ACTION HRRZ T1,P2 ;ADDRESS OF SWITCH BLOCK HLRZ T2,(P2) ;SIZE PUSHJ P,DY.RET## ;RESTORE SPACE TO POOL JRST DEFGSW ;SEE IF ANY MORE
;HERE FOR DEFERED SWITCHES AFTER FILE NAME ;THEY GET EXECUTED JUST BEFORE NEXT FILE SPEC IS FOUND DEFLSW: HRRZ P2,SWFLAG ;GET SWITCHES AFTER FILE NAME JUMPE P2,CPOPJ ;NONE, GIVE UP HRRZ T1,(P2) ;GET NEXT ADDRESS HRRM T1,SWFLAG ;REMOVE FROM LIST MOVE T2,2(P2) ;GET VALUE PUSHJ P,@1(P2) ;RETURN TO SWITCH ACTION HRRZ T1,P2 ;ADDRESS OF SWITCH BLOCK HLRZ T2,(P2) ;SIZE PUSHJ P,DY.RET## ;RESTORE SPACE TO POOL JRST DEFLSW ;SEE IF ANY MORE ;HERE TO GIVE GOOD RETURN ALL DONE WITH LNKFIO FOR NOW URET1: AOS (P) ;SKIP RETURN URET: MOVE T1,MAPSW ;SEE IF A MAP TO DO CAIN T1,$MAPNOW ;ONLY CASE WE CARE ABOUT PJRST LNKMAP ;YES POPJ P, ;USUAL RETURN SEQUENCE CPOPJ1: AOS (P) ;SKIP RETURN CPOPJ: POPJ P,
;HERE TO HANDLE SWITCHES ;GLOBAL SWITCHES (LHS) XCTGSW: DMOVE T1,1(P2) ;GET TOKEN # & VALUE HLRZ T1,XCTSWT(T1) ;GET JUMP ADDRESS PUSHJ P,(T1) ;DO SWITCH ACTION HRRZ T1,P2 ;SETUP ADDRESS OF THIS SWITCH HLRZ T2,(P2) ;AND SIZE HRRZ P2,(P2) ;GET NEXT SWITCH PUSHJ P,DY.RET## ;RETURN SPACE HRLM P2,F.SWP(P1) ;POINT TO NEW LINK (IN CASE REQUIRED) JUMPN P2,XCTGSW ;XCT THIS SWITCH POPJ P, ;RETURN END OF GLOBAL SWITCH CHAIN ;LOCAL SWITCHES (RHS) XCTLSW: DMOVE T1,1(P2) ;GET TOKEN # & VALUE HRRZ T1,XCTSWT(T1) ;GET JUMP ADDRESS PUSHJ P,(T1) ;DO SWITCH ACTION JUMPE P2,XCTLXX ;[730] JUMP IF NOTHING TO GIVE BACK HRRZ T1,P2 ;SETUP ADDRESS OF THIS SWITCH HLRZ T2,(P2) ;AND SIZE HRRZ P2,(P2) ;GET NEXT SWITCH PUSHJ P,DY.RET## ;RETURN SPACE HRRM P2,F.SWP(P1) ;POINT TO NEW SWITCH JUMPN P2,XCTLSW ;XCT THIS SWITCH XCTLXX: POPJ P, ;[730] RETURN END OF GLOBAL SWITCH CHAIN
;HERE TO STORE SWITCHES THAT CAN NOT BE EXECUTED UNTIL FILE IS OPENED ;THE SWITCHES ARE STORED IN LINKED LISTS ANCHORED TO SWFLAG ;SWITCHES BEFORE FILE NAME ARE IN LEFT HALF ;SWITCHES AFTER FILE NAME IN RIGHT HALF STRGSW: POP P,1(P2) ;STORE RETURN OVER TOKEN # POP P,T1 ;REMOVE RETURN ADDRESS MOVEI T2,SWFLAG ;START OF LIST MOVE T1,T2 ;SAVE LAST ADDRESS HLRZ T2,(T1) ;GET FIRST LINK ADDRESS JUMPE T2,[HRLM P2,(T1) ;LINK FIRST ONE TO LEFT HALF JRST STRGS1] ;REST TO RIGHT HALF MOVE T1,T2 ;SAVE LAST HRRZ T2,(T1) ;REST OF ADDRESS FROM RIGHT HALH JUMPN T2,.-2 ;LOOK FOR END OF LIST HRRM P2,(T1) ;LINK THIS BLOCK IN STRGS1: MOVE T1,P2 ;SAVE ADDRESS HRRZ P2,(P2) ;GET NEXT SWITCH BLOCK HRLM P2,F.SWP(P1) ;ADVANCE TO NEXT SWITCH HLLZS (T1) ;SET END OF CHAIN JUMPN P2,XCTGSW ;HANDLE THIS ONE POPJ P, ;END OF GLOBAL SWITCHES ;HERE FOR SWITCHES AFTER FILE NAME STRLSW::POP P,1(P2) ;STORE RETURN OVER TOKEN # POP P,T1 ;REMOVE RETURN ADDRESS MOVEI T2,SWFLAG ;START OF LIST MOVE T1,T2 ;SAVE LAST ADDRESS HRRZ T2,(T1) ;GET LINK ADDRESS JUMPN T2,.-2 ;LOOK FOR END OF LIST HRRM P2,(T1) ;LINK THIS BLOCK IN MOVE T1,P2 ;SAVE ADDRESS HRRZ P2,(P2) ;GET NEXT SWITCH BLOCK HRRM P2,F.SWP(P1) ;DISCONNECT FROM THIS SWITCH HLLZS (T1) ;SET END OF CHAIN JUMPN P2,XCTLSW ;HANDLE THIS ONE POPJ P, ;END OF GLOBAL SWITCHES
SUBTTL DISPATCH TABLE FOR SWITCHES ;XCTSWT IS A TABLE OF DISPATCH ADDRESSES FOR SWITCHES ;ONE WORD PER TOKEN # ;LHS=GLOBAL , RHS=LOCAL DEFINE SWMAC (A,B,C,D,E,F,G,H,I)< IF1,<BLOCK 1> IF2,< IFNDEF %'B,<EXTERN %'B> IFNB <G>,< IFNDEF .'B,<EXTERN .'B> XWD .'B,%'B > IFB <G>,< XWD %'B,%'B >>> ;***** MUST USE XWD NOT ,, SINCE ".COMMON" IS A PSEUDO-OP IN MACRO.50 EXTERN .REQUEST ;SO IS .REQUEST XALL XCTSWT: SWTCHS SALL
SUBTTL SWITCH ACTION -- /COMMON:name:len %COMNM: SIXBIT \DEFINED-BY-SWITCH\ ;AVOID FORWARD REFERENCE AT DMOVE %COMMON: PUSHJ P,STRLSW ;WAIT TIL FILE IS LOADED .COMMON: PUSHJ P,.SAVE4## ;PRESERVE P1-P4 SKIPN W2,T2 ;SYMBOL MOVE W2,['.COMM.'] ;BLANK COMMON IF NULL MOVS W3,3(P2) ;LENGTH OF COMMON TRNE W3,-1 ;[1204] MORE THAN 777777? PUSHJ P,E$$PTL## ;[1204] YES, COMPLAIN PUSHJ P,T.COMR## ;STORE IN GLOBAL TABLE POPJ P, ;WAS ALREADY THERE MOVNI T1,2*.L ;REMOVE COMMON ENTRY FROM LS AREA ADDM T1,LSYM ;T.COMR INSERTED IT, BUT WE WANT ADDM T1,LS.PT ;WANT TO PUT A FAKE TITLE BEFORE MOVEI T1,2*.L ;THE COMMON SYMBOL, SO THE MAP ADDM T1,LS.FR ;WILL COME OUT CORRECTLY MOVX W1,PT.SGN!PT.EXT!PT.TTL!PT.FAK MOVE W2,%COMNM ;FIRST 6 CHARS MOVE W3,LSYM ;POINT TO WHERE FIRST TRIPLET WILL GO ADDI W3,4*.L ;THEN TO LAST PUSHJ P,LS.ADD## ;PUT IN LOCAL TABLE MOVX W1,S.TTL!S.LST ;EXTENDED TITLE DMOVE W2,%COMNM+1 ;REST OF NAME PUSHJ P,LS.ADD## HRRZ P1,@HT.PTR ;SETUP P1 TO POINT TO SYMBOL ADD P1,NAMLOC ;IN CORE PUSH P,.L+2(P1) ;SAVE 2ND TRIPLET INFO PUSH P,.L+1(P1) PUSH P,.L+0(P1) TMOVE W1,0(P1) ;RESET FIRST SYMBOL TRIPLET PUSHJ P,LS.ADD## ;PUT IN LOCAL TABLE POP P,W1 ;GET SECONDARY POP P,W2 ;SAME NAME POP P,W3 ;LENGTH MOVE T1,SG.TB+1 ;GET LOW SEG RELOC TABLE MOVE T2,W3 ;GET A DISPOSABLE COPY ADDB T2,RC.CV(T1) ;BUMP CURRENT RC CAMLE T2,RC.HL(T1) ;[1173] NEVER DECREASE MOVEM T2,RC.HL(T1) ;[1173] UPDATE HIGHEST LOCATION IN THIS PSECT CAML T2,HL.S1 ;NEVER DECREASE HL.S1 MOVEM T2,HL.S1 ;UPDATE HIGHEST LOCATION LOADED PJRST LS.ADD## ;STORE AND RETURN
SUBTTL SWITCH ACTION -- /CORE:n IFE TOPS20,< %CORE: CAIGE T2,1000 ;IN WORDS ALREADY? LSH T2,^D10 ;NO, ASSUME K SUBI T2,1 ;GET HIGHEST ADD MOVE T1,HIORGN ;[650] HISEG ORIGIN SUBI T1,1001 ;[650] HIGHEST LEGAL (1P FOR HELPER) CAMG T2,T1 ;[650] REQUEST TOO BIG? CAMG T2,.JBREL ;[650] OR TOO SMALL? POPJ P, ;[650] YES, DON'T DO CORE UUO MOVE T1,T2 ;[650] KEEP A COPY CORE T2,UU.PHY ;[650] EXPAND, PHYSICALLY CAIA ;[650] FAILED, SEE WHY JRST E02EXP ;[1174] OK, TELL USER MOVE T2,T1 ;[650] NOW TRY VIRTUALLY PUSH P,.JBREL## ;[650] FIRST SAVE OLD SIZE CORE T2, ;[650] CAN WE GET IT? JRST [POP P,(P) ;[650] NO, CLEAR STACK POPJ P,] ;[650] AND GIVE UP POP P,T2 ;[650] NOW GIVE BACK VM PAGES CORE T2, ;[650] TO GET SOME PHYSICALLY JFCL ;[650] ?? MOVE T3,T1 ;[650] START AT USERS REQUEST CORE1: SUB T3,.PGSIZ ;[650] TRY FOR ONE LESS CAMG T3,.JBREL## ;[650] MAYBE WERE ALREADY AT LIMIT JRST CORE2 ;[650] YEP, GIVE UP MOVE T2,T3 ;[650] TEMP COPY CORE T2,UU.PHY ;[650] GET IT? JRST CORE1 ;[650] NO, TRY SMALLER CORE2: CORE T1, ;[650] GET THE REST VIRTUALLY JFCL ;[650] MONITOR BUG IF FAILS E02EXP::.ERR. (MS,.EC,V%L,L%I,S%I,EXP) ;[1174] .ETC. (COR,.EP,,,,.JBREL) MOVE T2,.JBREL ;NEW TOP OF CORE MOVEI T1,HG.TAB ;START AT TOP SKIPN TAB.LB(T1) ;AND FIND AREA IN USE SOJA T1,.-1 ;WILL FIND ONE EVENTUALLY MOVEM T2,TAB.UB(T1) ;GIVE TOP AREA ALL FREE SPACE PUSHJ P,.SAVE2## ;SAVE P1 AND P2 SETZB P1,P2 ;INDICATE JUST SHUFFLING PUSHJ P,LNKCOR## ;NOW ADJUST ALL AREAS JFCL ;NEVER FAILS POPJ P, ;RETURN > ;END OF IFE TOPS20
SUBTTL SWITCH ACTION -- /COUNTER ;/COUNTER CAUSES LINK TO PRINT A LIST OF ALL CURRENT RELOCATION COUNTERS, THEIR ;INITIAL VALUES AND THEIR CURRENT VALUES. THIS IS DONE BY USING A .ETC. MACRO ;LOOP TO PRINT EACH COUNTER LINE. %COUNTER: PUSHJ P,STRLSW ;WAIT TIL FILE LOADED .COUNTER: MOVEI R,1 ;[1174] START AT 1 (COUNTER .LOW.) E$$RLC::.ERR. (MS,.EC,V%L,L%F,S%I,RLC,<Reloc. ctr. initial value current value limit value>) ;[1300] COUNEX: .ETC. (XCT,.EC,,,,<[PUSHJ P,COUNGT]>) ;[1174] ANY MORE TO PRINT? .ETC. (JMP,.EC,,,,COUNDN) ;[1174] NO--DONE .ETC. (NLN,.EC) ;[1174] YES--NEW LINE FOR IT .ETC. (SBX,.EC!.EP,,,,W1) ;[1174] RELOCATION COUNTER NAME .ETC. (STR,.EC,,,,,< >) ;[1174] .ETC. (OCT,.EC!.EP,,,,W2) ;[1174] INITIAL VALUE .ETC. (STR,.EC,,,,,< >) ;[1174] .ETC. (OCT,.EC!.EP,,,,W3) ;[1174] CURRENT VALUE .ETC. (STR,.EC,,,,,< >) ;[1300] .ETC. (OCT,.EC!.EP,,,,R2) ;[1300] LIMIT VALUE .ETC. (JMP,.EC,,,,COUNEX) ;[1174] LOOP FOR REST COUNDN: .ETC. (STR,,,,,<>) ;[1174] JUST A DUMMY TO JUMP TO POPJ P, ;[1174] DONE ;COUNGT IS CALLED FROM THE ABOVE LNKRLC MESSAGE TO FIND THE NEXT RELOCATION ;COUNTER VALUES, IF ANY. ; ;CALL: ; R/ RELOCATION COUNTER TO CHECK ;RETURNS NON-SKIP IF NO MORE, OR SKIP WITH: ; W1/ NAME OF RELOCATION COUNTER ; W2/ INITIAL VALUE ; W3/ CURRENT VALUE ; R/ INCREMENTED FOR NEXT TIME COUNGT: CAMG R,RC.NO ;[1174] ANY MORE? SKIPN R2,@RC.TB ;[1174] .. POPJ P, ;[1174] NO--NON-SKIP RETURN MOVE W1,RC.NM(R2) ;[1174] FETCH RELOCATION COUNTER NAME MOVE W2,RC.IV(R2) ;[1174] FETCH INITIAL VALUE MOVE T1,RC.AT(R2) ;[1174] IF OVERLAID PSECT TXNE T1,AT.OV ;[1174] .. SKIPN W3,RC.HL(R2) ;[1174] THEN TRY HIGHEST SEEN SO FAR MOVE W3,RC.CV(R2) ;[1174] ELSE JUST USE CURRENT VALUE MOVE R2,RC.LM(R2) ;[1300] FETCH LIMIT VALUE AOJA R,CPOPJ1 ;[1174] ADV TO NEXT AND GIVE SKIP RETURN
SUBTTL SWITCH ACTION -- /CPU:key, /CRLF:n %CPU: MOVE T1,CPUTBL-1(T2) ;[1240] GET CPU BIT IORM T1,CPUTGT ;[1240] ADD NEW CPU POPJ P, %CRLF: PUSHJ P,STRLSW ;WAIT TILL FILE IS LOADED .CRLF: SKIPN T2 ;IS THIS END OF ASCII BLOCK? MOVE T2,FLAGS ;NO, MIDDLE OF ASCII BLOCK. ;RESET TO GLOBAL FLAGS (NEW LINE) HLLZ FL,T2 ;STORE CORRECT GLOBAL FLAGS IN FL HLR FL,FL ;LOCALS SAME AS GLOBALS SO FAR POPJ P,
SUBTTL SWITCH ACTION -- /DEBUG:name, /TEST:name .DEBUG: SETOM DEBUGSW ;SIGNAL DEBUG START SETOM EXECSW ;AND SIGNAL EXECUTION REQUIRED .TEST: SETZM S.DEBG ;[1313] RESET SO /LINK WILL WORK SOSG T1,2(P2) ;NEED TO MAKE SPECIAL CASE CHECKS SKIPE T1,DDEBUG ;TRY DEFAULT SUBI T1,1 ; FOR COBDDT AND FORDDT LSH T1,-1 ; SINCE THEY MUST BE LOADED AFTER MAIN HRRM T1,DEBUGSW ;STORE INDEX IN THE FLAG MOVE T1,DEBTBL(T1) ;NAME OF DEBUG PROGRAM CAME T1,['FORDDT'] CAMN T1,['COBDDT'] JRST SPCDDT ;ITS A SPECIAL DDT CAMN T1,['PASDDT'] ;[1435] PASCAL IS ALSO SPECIAL JRST SPCDDT ;[1705] AS FOR FORDDT DEBUG1: MOVEI T2,F.LEN ;GET A BLOCK OF SPACE FOR FILE SPECS PUSHJ P,DY.GET## ;IN DYNAMIC AREA HRRM P1,(T1) ;LINK INTO LIST TO DO HRRM T1,F.INZR ;PUT DEBUG FIRST HRLZ T2,(P2) ;GET NEXT SWITCH HLLM T2,1(P1) ;FIX LIST OF SWITCHES TO DO MOVE P1,T1 ;FORGET OTHER FILE SPEC FOR NOW MOVSI T1,'SYS' MOVEM T1,F.DEV(P1) ;COMES FROM SYS HRRZ T1,DEBUGSW ;GET INDEX TO DEBUGGER MOVE T1,DEBTBL(T1) ;PICK UP REQUIRED PROG MOVEM T1,F.NAME(P1) ;STORE NAME SETOM F.NAMM(P1) ;AND MASK MOVSI T1,'REL' ;ASSUME EXT HLLOM T1,F.EXT(P1) ;AND MASK SUB P,[2,,2] ;ADJUST STACK MOVE T1,P2 ;ADDRESS OF SWITCH BLOCK HLRZ T2,(P2) ;SIZE PUSHJ P,DY.RET## ;GIVE IT BACK MOVSI T1,L.SYM ;MAKE LOCAL SYMBOLS DEFAULT IORM T1,FLAGS PUSHJ P,.LOCALS ;TURN ON LOAD LOCAL SYMBOLS MOVE T1,F.NAME(P1) ;SEE IF ITS FORDDT CAMN T1,['FORDDT'] ;[775] SINCE IT NEED ITS SYMBOLS JRST [MOVSI T2,L.ISA ;[775] FORCE /NOSTART ON NEW LINES IORM T2,FLAGS ;[775] .. PUSHJ P,.NOSTART ;[775] AND ON THIS LINE TRZ FL,R.ISA ;[775] BUT USE FORDDT'S START JRST .+2] ;[775] LOAD FORDDT'S LOCALS PUSHJ P,%NOLOCAL ;BUT NOT FOR THIS FILE TRZ FL,R.LIB ;TURN OFF LIB SEARCH MODE IFN TOPS20,< CAMN T1,['DDT '] ;ONLY DDT IS SPECIAL JRST MAPDDT ;[1144] MAP IN UDDT RIGHT NOW > CAMN T1,['SIMDDT'] ;[1321] IS IT SIMDDT JRST ALGDDT ;[1321] YES, SPECIAL CASE LIKE ALGDDT CAME T1,['ALGDDT'] ;[1267] CHECK FOR ALGDDT JRST LNKWLD ;[1267] NOT ALGDDT ALGDDT: SETOM NULSPC ;[1321] IT'S ALGDDT - DONT LOAD ANYTHING SETZM F.NAME(P1) ;[1267] SINCE ALGDDT IS PART OF ALGOTS TRO FL,L.SYM ;[1267] TURN ON SYMBOLS JRST LNKWLD ;AND TRY AGAIN
SPCDDT: SKIPN MNTYPE ;HAVE WE LOADED A MAIN PROGRAM YET? SKIPN F.NAME(P1) ; OR NO PROGRAM IN THIS SPEC JRST DEBUG1 ;YES, SO ITS OK TO LOAD ???DDT pushj p,.locals ;load main prog with locals AOS 2(P2) ;PUT BACK TOKEN VALUE HRRZ T1,(P2) ;GET NEXT SWITCH HRLM T1,F.SWP(P1) ;INTO TABLE HRRZ T1,F.SWP(P1) ;GET NEXT RHS SWITCH HRRM T1,(P2) ;LINK IN HRRM P2,F.SWP(P1) ;AND IN SWITCH LIST HLRZ P2,F.SWP(P1) ;GET NEXT LHS SWITCH POP P,T1 ;GET RETURN OFF STACK JUMPN P2,XCTGSW ;DO IT POPJ P, ;ALL DONE %DEBUG: %TEST: PUSHJ P,.LOCALS ;GET SYMBOLS FOR PROGRAM HLRZ T2,0(P2) ;GET SPACE FOR SWITCH ADDI T2,F.LEN ;AND FILE SPEC PUSHJ P,DY.GET## ;IN DYNAMIC AREA HLLZ T2,(P2) ;GET LENGTH MOVEM T2,F.LEN(T1) ;STORE IN SWITCH DMOVE T2,1(P2) ;GET REST OF SWITCH DMOVEM T2,F.LEN+1(T1) MOVEI T2,F.LEN(T1) ;ADDRESS OF SWITCH BLOCK MOVSM T2,F.SWP(T1) ;STORE AS GLOBAL HRRZ T2,(P1) ;GET NEXT BLOCK MOVEM T2,(T1) ;PUT DEBUG BEFORE IT HRRM T1,S.DEBG ;[730] SAVE IT, IN CASE OF /LINK HRRM T1,(P1) ;LINK DEBUG IN POPJ P, ;RETURN
;HERE FOR /DEBUG:DDT ON TOPS-20. SINCE THERE IS NO .REL FILE FOR DDT ON TOPS-20, ;WE MUST MERGE UDDT.EXE RIGHT INTO THE CORE IMAGE. IN THE EVENT THAT THE PROGRAM ;LOADS INTO MEMORY, SIMPLY MAP DDT INTO LINK'S ADDRESS SPACE NOW AND IT WILL BE ;PROPERLY PLACED WHEN LOADING IS COMPLETED. IF LINK MUST (OR IS REQUESTED TO) ;WRITE AN .EXE FILE, UDDT WILL NOT BE THERE, BUT AN EXEC DDT COMMAND WILL THEN ;MERGE IN DDT. IF DDT IS ALREADY MAPPED IN, LEAVE IT ALONE. THIS HAPPENS IF LINK ;IS BEING DEBUGGED. IFN TOPS20,< MAPDDT: MOVX T1,<.FHSLF,,770>;[1144] SEE IF PAGE 770 EXISTS RPACS ;[1144] .. TXNN T2,PA%EX ;[1144] .. JRST MAPDD1 ;[1144] NO--CAN'T BE ANY DDT THERE MOVE T1,770000 ;[1144] SEE IF IT'S DDT THAT'S THERE CAMN T1,[JRST 770002];[1144] CROCK, BUT THIS IS WHAT EXEC DOES JRST MAPDD2 ;[1144] IT'S DDT--DON'T DESTROY IT MAPDD1: MOVX T1,GJ%OLD!GJ%SHT;[1144] NO DDT THERE--LOAD IT HRROI T2,[ASCIZ /SYS:UDDT.EXE/] GTJFN ;[1144] FIND UDDT ERJMP E$$DNA ;[1174] FAILED PUSH P,T1 ;[1144] SAVE JFN FOR UDDT MOVX T1,.FHSLF ;[1144] SAVE LINK'S CURRENT ENTRY VECTOR GEVEC ;[1144] .. POP P,T1 ;[1144] GET BACK JFN FOR UDDT PUSH P,T2 ;[1144] REMEMBER LINK'S ENTRY VECTOR HRLI T1,.FHSLF ;[1144] NOW BRING IN UDDT WHICH GET ;[1144] DESTROYS LINK'S ENTRY VECTOR MOVX T1,.FHSLF ;[1144] SO RESTORE LINK'S ENTRY VECTOR POP P,T2 ;[1144] .. SEVEC ;[1144] .. MAPDD2: TRO FL,L.SYM ;[1145] LOAD LOCALS (TURNED OFF EARLIER) SETOM NULSPC ;[1145] REMEMBER TO THROW AWAY THIS SPEC SETZM F.NAME(P1) ;[1144] .. SETOM DDTMAP ;[1144] REMEMBER THAT WE'VE MAPPED DDT JRST LNKWLD ;FORGET DDT REQUEST AND GET NEXT FILE E$$DNA::.ERR. (MS,,V%L,L%F,S%F,DNA,<DDT not available>) ;[1174] >
;TABLE OF NAMES OF DEBUGGING AIDS
DEFINE KEYMAC (A,B)<
 IFIDN <A><DEB>,<
  .ZZ==-1
  IRP B,<
   IFGE .ZZ,<
    IFN .ZZ&1,<
     IFNB <B>,<
	SIXBIT	\B\
     >
     IFB <B>,<
	SIXBIT	\DDT\
   >>>
   .ZZ==.ZZ+1
 >>
 PURGE .ZZ
>
	XALL			;[1174]
DEBTBL:	KEYWORDS
	SALL			;[1174]
SUBTTL SWITCH ACTION -- /DDEBUG:name, /DEFINE:sym:val %DDEBUG:: JUMPE T2,CPOPJ ;CHECK FOR NO ARGUMENT SUBI T2,1 ;IGNORE DEFAULT MOVEM T2,DDEBUG ;SAVE VALUE POPJ P, %DEFINE: PUSHJ P,.SAVE4## ;SAVE P1-P4 MOVX W1,PT.SGN!PT.SYM SKIPN W2,T2 ;GET SYMBOL JRST E$$ZSV ;[1174] ZERO IS INVALID MOVE W3,3(P2) ;AND VALUE PJRST SY.GS## ;DEFINE SYMBOL
SUBTTL SWITCH ACTION -- /ENTRY %ENTRY: PUSHJ P,STRLSW ;WAIT TIL AFTER FILE LOADED .ENTRY: MOVE T1,[PUSHJ P,ENTNXT] ;[1174] SET UP NEXT SYMBOL ROUTINE MOVEM T1,NXTGLB ;[1174] .. MOVE W3,HT.PRM ;[1174] GET INDEX TO HASH TABLE ADDI W3,1 ;[1174] START 1 UP FOR SOSGE BELOW PUSHJ P,ENTNXT ;[1174] GET NEXT (FIRST) ENTRY POINT PJRST E01LSS ;[1174] NONE THERE--GO SAY SO E$$LSS::.ERR. (MS,.EC!.EN,V%L,L%F,S%I,LSS) ;[1174] .ETC. (STR,.EC,,,,,<Library search symbols (entry points)>) ;[1174] .ETC. (JMP,.EC,,,,.ETSAV##) ;[1174] GO PRINT SYMBOLS AND VALUES ;ENTNXT IS CALLED FROM THE ABOVE .ERR. TO RETURN THE NEXT ENTRY POINT SYMBOL AND ;VALUE. ; ;CALL: ; W3/ NEXT HASH TABLE INDEX TO LOOK AT ;RETURNS WITH NON-SKIP IF NO MORE, OTHERWISE SKIP RETURN WITH: ; W1/ NAME OF NEXT ENTRY POINT ; W2/ VALUE OF ABOVE ; W3/ UPDATED ENTNXT: PUSHJ P,.SAVE4## ;[1174] SAVE LNKLOG'S P ACS ENTLUP: SOSGE P2,W3 ;[1174] ANY MORE TABLE TO CHECK? POPJ P, ;[1174] NO--DONE WITH NON-SKIP RETURN SKIPN P3,@HT.PTR ;[1174] GET POINTER TO GS TRIPLET JRST ENTLUP ;[1174] NONE THERE--TRY NEXT POINTER ADD P3,GS.LB ;[1174] RELOCATE IN CASE IT MOVED MOVE T1,0(P3) ;[1174] DO FLAGS SAY SYMBOL AND ENTRY? TXNE T1,PT.SYM ;[1174] .. TXNN T1,PS.ENT ;[1174] .. JRST ENTLUP ;[1174] NO--TRY NEXT POINTER MOVE W1,1(P3) ;[1174] YES--A WINNER! SET UP SYMBOL NAME MOVE W2,2(P3) ;[1174] AND VALUE JRST CPOPJ1 ;[1174] DONE WITH SKIP RETURN E01LSS::.ERR. (MS,.EC,V%L,L%F,S%I,LSS) ;[1174] .ETC. (STR,,,,,,<No library search symbols (entry points)>) ;[1174] POPJ P, ;[1174] DONE
SUBTTL SWITCH ACTION -- /ESTIMATE:n, /ERRORLEVEL:n, /EXECUTE %ESTIMATE: MOVEM T2,FEST ;STORE ESTIMATED LENGTH SKIPE T1,IO.CHN ;WE MAY BE TOO LATE SKIPL T1,IO.PTR(T1) ;FILE OPENED YET? POPJ P, ;YES, GIVE IT UP MOVEM T2,I.EST(T1) ;NO, STORE IN ENTER BLOCK POPJ P, %ERRORLEVEL: MOVEM T2,ERRLVL ;STORE ERROR LEVEL POPJ P, %EXECUTE: SETOM EXECSW ;SIGNAL EXECUTION REQUIRED POPJ P,
SUBTTL SWITCH ACTION -- /FRECORE:n, /FOROTS, /FORSE %FRECORE: MOVEM T2,FRECOR POPJ P, %FOROTS: IFN FTOVERLAY,< SKIPGE LNKMAX ;CAN ONLY SET IN ROOT LINK > SETZM FORLIB ;FOROTS IS ZERO OR POSITIVE POPJ P, %FORSE: IFN FTOVERLAY,< SKIPGE LNKMAX ;CAN ONLY SET IN ROOT LINK ; AND NOT EVEN THEN IF OVERLAYS WANTED > SETOM FORLIB ;FORSE IS NEGATIVE POPJ P,
SUBTTL SWITCH ACTION -- /GO, /HASHSIZE:n %GO: MOVEI T1,GO## ;GET ADDRESS TO RETURN TO IFN FTOVERLAY,< SKIPL LNKMAX ;ANY OVERLAYS SEEN? MOVEI T1,LINKGO## ;YES, DO FINAL STUFF > MOVEM T1,GOTO ;SIGNAL TERMINATION AFTER THIS LINE ENDS POPJ P, ;RETURN %HASHSIZE: CAMG T2,HT.PRM ;SEE IF BIGGER THAN CURRENT SIZE POPJ P, ;NO, LEAVE WELL ALONE MOVEM T2,HASHSZ ;STORE NEW HASH SIZE SETOM HSPACE ;CAUSE REHASH TO TAKE PLACE POPJ P,
SUBTTL SWITCH ACTION -- /EXCLUDE:name, /INCLUDE:name, /NOINCLUDE ;INCLUDE/EXCLUDE SWITCHES ;HAVE STORED LIST OF PERM,,TEMP NAMES ;PERMANENT NAMES LAST UNTIL CLEARED OR END OR LINK ;TEMP NAMES ARE CLEARED AT END OF FILE .EXCLUDE: MOVSS EXCPTR ;SWAP PTR TO PUT PERMANENT PART INTO RH MOVSS INCPTR PUSHJ P,%EXCLUDE ;STORE NAME MOVSS EXCPTR ;SWAP BACK MOVSS INCPTR MOVEI T1,INCPTR PJRST EXCL0 ;REMOVE FROM TEMP ALSO %EXCLUDE: SKIPN W2,T2 ;GET SYMBOL IN SAFE PLACE JRST E$$ZSV ;[1174] ZERO IS INVALID MOVEI T1,EXCPTR ;GET INITIAL POINTER IFN .EXSYM,< PUSHJ P,CNTLEN ;CONVERT W2 IF LONG NAME > ;END IFN .EXSYM PUSHJ P,INCL0 ;ADD THIS SYMBOL TO TABLE MOVEI T1,INCPTR PJRST EXCL0 ;AND REMOVE FROM OTHER TABLE .INCLUDE: TDO FL,[L.INC,,R.INC] ;[1117] ALWAYS SET INCLUDE MODE SKIPN T2 ;[1117] SEE IF ANY ARGS TO STORE POPJ P, ;[1117] NO--JUST RETURN MOVSS EXCPTR ;SWAP PTR TO PUT PERMANENT PART INTO RH MOVSS INCPTR PUSHJ P,%INCLUDE ;STORE NAME MOVSS EXCPTR ;SWAP BACK MOVSS INCPTR MOVEI T1,EXCPTR PJRST EXCL0 ;REMOVE FROM TEMP ALSO %INCLUDE: TRO FL,R.INC ;TURN ON SPECIAL /INC MODE SKIPN W2,T2 ;GET SYMBOL IN SAFE PLACE POPJ P, ;DONE IF JUST FOO/INCLUDE MOVEI T1,INCPTR ;GET INITIAL POINTER IFN .EXSYM,< PUSHJ P,CNTLEN ;CONVERT W2 TO POINTER IF LONG > ;END IFN .EXSYM PUSHJ P,INCL0 ;ADD THIS SYMBOL TO TABLE MOVEI T1,EXCPTR PJRST EXCL0 ;AND REMOVE FROM OTHER TABLE
.NOINCLUDE: TDZ FL,[L.INC,,R.INC] ;[1117] TURN OFF INCLUDE MODE POPJ P, ;[1117] CAN BE TURNED ON BY LATER /INCLUDE %NOINCLUDE: TRZ FL,R.INC ;[1117] TURN OFF LOCAL INCLUDE MODE POPJ P, ;[1117] DONE
;ROUTINES TO SEARCH THE INCLUDE/EXCLUDE BLOCKS FOR A MATCH. ;CALL IS: ; MOVEI T1,ADDR OF LINK TO BLOCKS TO SEARCH ; MOVE W2,NAME OR LEN,,ADDR IF LONG ; PUSHJ P,INCL0/EXCL0/EXCL.0 ; ONLY RETURN ;USES T1-T4, EXPECTS W2 SET UP. PRESERVES ALL OTHER AC'S. ;INCL0 INSERTS THE NAME IF NOT FOUND, EXCL0 DELETES IT IF FOUND. INCL0: HRRZ T2,(T1) ;ANYTHING THERE? JUMPE T2,INCNXT ;FIRST TIME INCL1: HRRZ T1,(T1) ;GET POINTER TO NEXT BLOCK ADD T1,[-.EXC+1,,1] ;FORM AOBJN PTR INCL2: SKIPN T2,(T1) ;NOT IN TABLE IF ZERO SOJA T1,INCL3 ;JUST ENTER IFN .EXSYM,< TLNN T2,770000 ;LONG TITLE IN TABLE? JRST [TLNN W2,770000 ;YES, THIS ONE TOO? PUSHJ P,NAMCMP ;YES, CHECK MATCH JRST .+3 ;NO MATCH POPJ P,] ;MATCHES, ALREADY THERE > ;END IFN .EXSYM CAMN W2,T2 ;MATCH? POPJ P, ;YES, SO ALREADY THERE AOBJN T1,INCL2 ;TRY NEXT SUBI T1,.EXC ;BACKUP HRRZ T2,(T1) ;IF ZERO THIS IS END JUMPN T2,INCL1 ;TRY AGAIN ; JRST INCNXT ;GET NEW BLOCK INCNXT: PUSH P,T1 ;AND WHERE WE ARE MOVEI T2,.EXC ;SIZE WE NEED PUSHJ P,DY.GET## ;IN DYNAMIC AREA POP P,T2 ;BACK POINTER HRRM T1,(T2) ;LINK TO NEW HRLZM T2,(T1) ;AND BACK TO OLD INCL3: IFN .EXSYM,< TLNE W2,770000 ;NEED TO STORE A LONG NAME? JRST INCL4 ;NO, JUST STORE IT PUSH P,T1 ;YES, REMEMBER WHERE PTR GOES MOVE T2,0(W2) ;GET LENGTH OF SYMBOL ADDI T2,1 ;ACCOUNT FOR LENGTH WORD PUSHJ P,DY.GET## ;ALLOCATE SPACE HRLZ T3,W2 ;SETUP BLT PTR HRRI T3,(T1) ADDI T2,(T1) ;CALCULATE LAST DESTINATION WORD BLT T3,-1(T2) ;COPY THE SYMBOL TO NEW HOME MOVEI W2,(T1) ;UPDATE POINTER IN W2 POP P,T1 ;RESTORE WHERE POINTER GOES INCL4: > ;END IFN .EXSYM MOVEM W2,1(T1) ;AND STORE THIS NAME POPJ P,
EXCL.0:: ;ENTRY FROM T.6 EXCL0: HRRZ T2,(T1) ;ANYTHING THERE? JUMPE T2,CPOPJ ;NO EXCL1: HRRZ T1,(T1) ;GET POINTER TO NEXT BLOCK ADD T1,[-.EXC+1,,1] ;FORM AOBJN PTR EXCL2: SKIPN T2,(T1) ;NOT IN TABLE IF ZERO POPJ P, ;RETURN IFN .EXSYM,< TLNN T2,770000 ;LONG NAME? JRST [TLNN W2,770000 ;YES, TARGET LONG TOO? PUSHJ P,NAMCMP ;YES, SEE IF MATCHES JRST .+3 ;NO MATCH, CONTINUE JRST EXCL3] ;FOUND IT...GO REMOVE > ;END IFN .EXSYM CAMN W2,T2 ;MATCH? JRST EXCL3 ;YES, SO REMOVE AOBJN T1,EXCL2 ;TRY NEXT SUBI T1,.EXC ;BACKUP HRRZ T2,(T1) ;IF ZERO THIS IS END JUMPE T2,CPOPJ JRST EXCL1 ;TRY AGAIN EXCL3: HLRO T2,T1 ;GET NUMBER LEFT IN BLOCK ADDI T2,.EXC ;AND SO NUMBER USED MOVN T2,T2 ADDI T2,(T1) ;BACKUP TO LINK POINTER HRRZ T3,(T2) ;NULL LINK IS END JUMPE T3,EXCL4 ;GOT IT HRRZ T2,(T2) ;GET NEXT POINTER JRST .-3 ;LOOP
;HERE WHEN FOUND A BLANK ENTRY. EXCL4: SKIPN 2(T2) ;IF ONLY ONE NAME IN BLOCK JRST EXCL5 ;DELETE BLOCK ALSO ADD T2,[-.EXC+1,,1] ;FORM AOBJN POINTER SKIPE (T2) ;LOOK FOR NULL AOBJN T2,.-1 ;OR END MOVE T3,-1(T2) ;GET THIS MODULE NAME EXCH T3,(T1) ;OVERWRITE PREV ONE SETZM -1(T2) ;AND DELETE THIS IFN .EXSYM,< TLNE T3,770000 ;THIS A POINTER OR SYMBOL POPJ P, ;SYMBOL, JUST RETURN MOVEI T1,(T3) ;POINTER, MUST FREE BLOCK MOVE T2,(T1) ;GET ADDR IN T1 AND LEN IN T2 ADDI T2,1 ;ACCOUNT FOR LENGTH WORD PUSHJ P,DY.RET## ;FREE THE BLOCK AND RETURN > ;END IFN .EXSYM POPJ P, EXCL5: MOVE T3,1(T2) ;GET ONLY NAME IN BLOCK EXCH T3,(T1) ;OVERWRITE OLD PUSH P,T2 ;SAVE POINTER TO BLOCK TO DELETE IFN .EXSYM,< TLNE T3,770000 ;IS THIS A SYMBOL OR POINTER JRST EXCL6 ;JUST SYMBOL, DON'T DELETE SUB-BLOCK MOVEI T1,(T3) ;SET UP FOR DY.RET MOVE T2,(T1) ADDI T2,1 PUSHJ P,DY.RET## ;FREE THE SUB-BLOCK EXCL6: > ;END IFN .EXSYM POP P,T1 ;RESTORE BLOCK PTR INTO T1 HLRZ T2,(T1) ;GET BACK LINK HLLZS (T2) ;BREAK LINK MOVEI T2,.EXC ;BLOCK SIZE PJRST DY.RET## ;RETURN BLOCK
;SUBROUTINES FOR USE BY INCLUDE/EXCLUDE CODE. ;THIS ROUTINE CHECKS THE SWITCH BLOCK POINTED TO BY P2 AND ;UPDATES W2 TO CONTAIN A POINTER IF THE NAME ;GIVEN BY THE SWITCH WAS A LONG NAME. USES NO ACS. IFN .EXSYM,< CNTLEN: SKIPN 3(P2) ;IS THIS A LONG SYMBOL? POPJ P, ;NO, LEAVE W2 ALONE SKIPE LN.SWV+1(P2) ;IS THIS MAX LENGTH (NO ENDING 0) JRST [MOVSI W2,LN.SWV ;YES, SET LEN TO MAX JRST CNTLN1] ;AND RETURN NEW POINTER MOVEI W2,2(P2) ;MAKE AOBJP PTR TO TITLE NAME SKIPE (W2) ;FOUND END YET? AOBJP W2,.-1 ;NO, COUNT THIS & LOOK AT NEXT CNTLN1: HLRZM W2,1(P2) ;PUT LENGTH OVER TOKEN # MOVEI W2,1(P2) ;POINT W2 TO LEN, THEN TITLE IN SIXBIT POPJ P, ;THIS ROUTINE COMPARES THE LONG NAME POINTED AT BY T2 WITH THE ;ONE POINTED AT BY W2, AND SKIPS IF THEY ARE EQUAL. DESTROYS T2-4. NAMCMP::MOVE T3,(W2) ;GET LENGTH OF SWITCH ARG MOVE T4,(T2) ;AND LENGTH OF STORED ARG CAME T3,T4 ;NAMES THE SAME LENGTH? POPJ P, ;NO, CAN'T BE THE SAME NAME MOVNS T3 ;NEGATE LENGTHS MOVNS T4 ;SO CAN SETUP AOBJN PTRS MOVSI T3,(T3) ;NEED TO PUT MAGNITUDE IN LH MOVSI T4,(T4) ;SINCE AOBJN EXPECTS IT THERE HRRI T3,1(W2) ;MAKE AOBJN PTRS TO NAMES HRRI T4,1(T2) ;USER'S IN T3, STORED IN T4 CMPLUP: MOVE T2,(T3) ;GET NEXT PART OF NAME CAME T2,(T4) ;MATCH STORED PART? POPJ P, ;NO, NO MATCH AOBJN T3,[AOBJN T4,CMPLUP ;BOTH POINTERS BETTER JUMP POPJ P,] ;STORED ONE WAS SHORTER AOBJN T4,CPOPJ ;USER'S GONE, STORED BETTER BE TOO JRST CPOPJ1 ;FANTASTIC, A MATCH > ;END IFN .EXSYM
SUBTTL SWITCH ACTION -- /K, /LOGLEVEL:n, /MAXCORE:n %K==CPOPJ ;/K IS JUST A KOMMAND, NO ACTION %LOGLEVEL: MOVEM T2,LOGLVL ;STORE LOG FILE MESSAGE LEVEL POPJ P, %MAXCORE: CAIGE T2,1000 ;IN WORDS ALREADY? IFE TOPS20,< LSH T2,^D10 ;NO, ASSUME K > IFN TOPS20,< LSH T2,9 ;NO, ASSUME P > SUBI T2,1 ;GET HIGHEST ADDRESS MOVE T1,DY.AB ;SEE HOW MUCH WE ABSOLUTELY NEED ADD T1,GS.AB SUB T1,GS.LB ;+GLOBAL AREA ADD T1,FX.AB SUB T1,FX.LB ;+FIXUPS IFN FTOVERLAY,< ADD T1,RT.AB ;[650] SUB T1,RT.LB ;[650] +RELOCATION TABLES ADD T1,BG.AB ;[650] SUB T1,BG.LB ;[650] +BOUND GLOBALS > ;END IFN FTOVERLAY ADDI T1,2*.IPS ;SYMBOLS + LOW CODE SKIPE HC.LB ADDI T1,.IPS ;+ HIGH CODE SKIPE AS.LB ;[650] ADDI T1,.IPS ;[650] IOR. T1,.PGSIZ ;[650] CAMGE T2,T1 ;GIVE WARNING JRST E$$MTS ;[1174] AND IGNORE IF TOO SMALL MOVEM T2,MAXCOR ;STORE MAXIMUM INCORE SIZE MOVE T2,HIORGN ;GET START OF HISEG SUBI T2,1001 ;MAX LOWSEG (1P FOR HELPER) CAML T2,MAXCOR ;MAXCOR TOO BIG? POPJ P, ;NO MOVEM T2,MAXCOR ;YES, SET TO MAX ALLOWED E$$MTB::.ERR. (MS,.EC,V%L,L%W,S%W,MTB,</MAXCOR: too big, >) ;[1174] .ETC. (COR,.EC!.EP,,,,T2) .ETC. (STR,,,,,,< used>) POPJ P, E$$MTS::.ERR. (MS,.EC,V%L,L%W,S%W,MTS,</MAXCOR: too small, at least >) ;[1174] .ETC. (COR,.EC!.EP,,,,T1) .ETC. (STR,,,,,,< is required>) POPJ P,
SUBTTL SWITCH ACTION -- /MISSING %MISSING: PUSHJ P,STRLSW ;WAIT UNTIL CURRENT FILE IS LOADED .MISSING: PUSHJ P,.SAVE4## ;SAVE ALL P ACS IN CASE NEEDED HLRO P1,INCPTR ;LH LT 0 MEANS NOT AN ERROR MOVEI T1,[ASCIZ \[LNKIMM \] ;POINT TO PREFIX MISNG1::PUSH P,T1 ;SAVE PREFIX ADDRESS HRRZ T1,LOWSUB ;[605] ADDRESS OF TTY OUTSTR ROUTINE PUSHJ P,.TYOCH## ;TELL SCAN EXCH T1,0(P) ;SAVE OLD VALUE, RESTORE PREF ADDR PUSHJ P,.TSTRG## ;TYPE PREFIX MOVEI P2,(P1) ;GET ADDR OF INCLUDE CHAIN JUMPE P2,MISNG5 ;IF NO CHAIN, NO INCLUDES SETZ T1, ;INITIALIZE COUNT OF INCLUDES MOVEI T2,(P1) ;T2 POINTS TO CURRENT BLOCK MISNG2: HRRZ T3,(T2) ;GET THIS BLOCK'S LINK WORD JUMPE T3,MISNG3 ;IF NOT FULL, GO FINISH LAST BLOCK ADDI T1,.EXC-1 ;IT IS, ADD IN SIZE OF FULL BLOCK MOVEI T2,(T3) ;POINT T2 TO NEXT BLOCK JRST MISNG2 ;AND KEEP COUNTING MISNG3: TLO T2,-.EXC+1 ;MAKE AOBJN-1 POINTER TO LAST BLOCK MISNG4: SKIPE 1(T2) ;NEXT LOCATION FULL? ADDI T1,1 ;YES, BUMP COUNT ONE MORE AOBJN T2,MISNG4 ;LOOP OVER ENTIRE LAST BLOCK SKIPE P2,T1 ;UNLESS ZERO.... PUSHJ P,.TDECW## ;OUTPUT NUMBER MISSING MODULES CAILE P2,2 ;LEAVE 0 OR 1 ALONE MOVEI P2,2 ;BUT MAP GT 2 INTO 2 MISNG5: MOVE T1,MISTAB(P2) ;GET ADDR OF CORRECT MESSAGE PUSHJ P,.TSTRG## ;TYPE IT TLNE P1,-1 ;LH NON-ZERO MEANS NO FILE SPEC JRST MISNG6 ;THERE ISN'T ONE MOVEI T1,[ASCIZ \ from file \] PUSHJ P,.TSTRG## ;TYPE MORE OF MESSAGE HRRZ T1,IO.PTR+DC ;POINT TO LAST .REL FILE LOADED PUSHJ P,.TEBLK## ;TYPE OUT THE FILESPEC MISNG6: JUMPGE P1,MISNG7 ;LH NON-NEG MEANS WAS AN ERROR MOVEI T1,"]" ;OTHERWISE, JUST INFORMATIONAL PUSHJ P,.TCHAR## ;SO TYPE A "]" ;CONTINUED ON NEXT PAGE
;CONTINUED FROM PREVIOUS PAGE MISNG7: PUSHJ P,.TCRLF## ;END MESSAGE GRACEFULLY JUMPE P2,MISNGE ;DONE IF NONE MISSING TLZ P1,-1 ;OTHERWISE MUST TYPE THEM ALL MISNG8: TLO P1,-.EXC+1 ;FORM AOBJN-1 POINTER TO THIS BLOCK MISNG9: SKIPN P3,1(P1) ;PICK UP NEXT NAME OR POINTER JRST MISNGD ;ZERO?? SNH---JUST IGNORE PUSHJ P,.TTABC## ;TAB OVER FOR NAME IFN .EXSYM,< TLNE P3,770000 ;NAME OR POINTER? JRST MISNGB ;JUST A NAME -- GO TYPE IT MOVN T1,(P3) ;POINTER -- GET NEGATIVE WORD COUNT HRL P3,T1 ;SET UP AOBJN POINTER MISNGA: SKIPN T1,1(P3) ;GET NEXT PART OF NAME JRST MISNGC ;NO MORE -- STOP PUSHJ P,.TSIXN## ;PRINT IN SIXBIT AOBJN P3,MISNGA ;LOOP FOR ENTIRE LIST JRST MISNGC ;DONE -- GO PRINT CRLF >; END IFN .EXSYM MISNGB: MOVE T1,P3 ;PUT NAME IN PROPER AC PUSHJ P,.TSIXN## ;PRINT IN SIXBIT MISNGC: PUSHJ P,.TCRLF## ;END THE LINE MISNGD: AOBJN P1,MISNG9 ;LOOP FOR THE ENTIRE INCLUDE BLOCK HRRZ P1,-.EXC+1(P1) ;GET NEXT ADDRESS IF ANY JUMPN P1,MISNG8 ;ANOTHER BLOCK -- GO PROCESS MISNGE: POP P,T1 ;RESTORE OLD TYPE OUT ADDRESS PJRST .TYOCH## ;REPLACE IT AND RETURN ;TABLE OF MESSAGES, DEPENDING ON NUMBER OF MODULES MISSING MISTAB: [ASCIZ \No included modules missing\] [ASCIZ \ included module missing\] [ASCIZ \ included modules missing\]
SUBTTL SWITCH ACTION -- /MPSORT:key, /NOINITIAL %MPSORT: MOVEM T2,MAPSRT ;SAVE TYPE REQUIRED JRST @MPSTBL-1(T2) ;DISPATCH TO RIGHT FUNCTION %NOINITIAL: IFN FTOVERLAY,< SKIPL LNKMAX ;CAN ONLY SET IN ROOT LINK POPJ P, ;JUST IGNORE, ITS TOO LATE > MOVE T1,GSYM ;GET CURRENT COUNT OF GLOBAL SYMBOLS MOVE T2,LSYM ;AND LOCALS CAMN T1,@GS.LB ;TEST AGAINST INITIAL CAME T2,@LS.LB ;FOR BOTH GLOBAL & LOCAL JRST E$$TDS ;[1174] TOO LATE TO CHANGE NOW ;RESET GLOBAL SPACE MOVE T1,GS.LB ;GET BASE OF GLOBALS SETZM (T1) ;CLEAR FIRST WORD HRL T2,T1 HRRI T2,1(T1) ;FORM BLT PTR BLT T2,@GS.PT ;UP TO FREE SPACE ADDI T1,1 ;PRE-ALLOCATE FIRST WORD HRRZ T2,HT.PTR ;START OF SPACE FOR HASH TABLE SUBI T2,(T1) ;LENGTH OF ORIGINAL SYMBOL TRIPLETS PUSHJ P,GS.RET## ;RETURN IT SETZM GSYM ;NO SYMBOLS NOW MOVEI T1,I.PRM ;INITIAL SYMBOLS IMULI T1,.HS% ;HOW MUCH TO FILL IDIVI T1,^D100 MOVEM T1,HSPACE ;HASH TABLE FULL ENOUGH AT THIS POINT ;NOW FOR LOCAL SYMBOLS MOVE T1,LS.LB ;GET BASE SETZM (T1) ;CLEAR FIRST WORD HRL T2,T1 HRRI T2,1(T1) ;FORM BLT PTR BLT T2,@LS.PT ;CLEAR UPTO FREE SPACE MOVEI T2,1 ;PRE-ALLOCATE FIRST WORD MOVEM T2,(T1) MOVEM T2,LSYM ADDI T1,1 MOVEM T1,LS.PT ;NEW FREE SPACE POINTER SUB T1,LS.AB ;- FREE SPACE MOVMM T1,LS.FR ;+ POPJ P, E$$TDS::.ERR. (MS,,V%L,L%W,S%W,TDS,<Too late to delete initial symbols>) ;[1174] POPJ P,
SUBTTL SWITCH ACTION -- /LOCALS, /NOLOCAL, /NOSEARCH, /NOSTART .LOCALS: TLO FL,L.SYM ;LOAD WITH LOCAL SYMBOLS %LOCALS: TRO FL,R.SYM ;LOAD WITH LOCAL SYMBOLS (1 FILE ONLY) SKIPN NOSYMS ;IF /NOSYM FALL INTO .NOLOCAL POPJ P, .NOLOCAL: TLZ FL,L.SYM ;DON'T LOAD LOCAL SYMBOLS %NOLOCAL: TRZ FL,R.SYM ;DON'T LOAD LOCAL SYMBOLS (1 FILE ONLY) POPJ P, .NOSEARCH: TLZ FL,L.LIB ;OUT OF LIBRARY SEARCH MODE %NOSEARCH: TRZ FL,R.LIB ;OUT OF LIBRARY SEARCH MODE (1 FILE ONLY) POPJ P, .NOSTART: TLO FL,L.ISA ;IGNORE STARTING ADDRESSES %NOSTART: TRO FL,R.ISA ;IGNORE THIS STARTING ADDRESS POPJ P,
SUBTTL SWITCH ACTION -- /NOSYMBOL, /OTSEGMENT:key, /PATCHSIZE:n,/PLTTYP:(DEFAULT,PLOTTER,PRINTER) %NOSYMBOL: SETOM NOSYMS ;DON'T WANT ANY SYMBOL TABLES SETZM SYMFRM ;DON'T WANT SETZM SYMSEG ;... HRRZ T1,IO.PTR+%SC ;INCASE /SYMBOL JUMPE T1,.NOLOCAL ;NO, BUT CLEAR FLAGS SETZM IO.PTR+%SC ;SO WE DON'T OUTPUT THEM MOVEI T2,F.LEN ;GIVE BACK SPACE PUSHJ P,DY.RET## JRST .NOLOCAL ;AND CLEAR JUST INCASE %OTSEGMENT: SUBI T2,1 ;DEFAULT IS 0 CAILE T2,2 ;NEW ARGS ARE 1 & 2 SUBI T2,2 ;ALLOW FOR LOW & HIGH IFN FTOVERLAY,< SKIPGE LNKMAX ;CAN ONLY SET IN ROOT LINK > MOVEM T2,OTSEG ;STORE INDEX TO EITHER LC OR HC POPJ P, %PATCHSIZE: MOVEM T2,PATSPC ;SAVE PATCH SIZE POPJ P, %PLTTYP:: ;[2011] JUMPE T2,E$$ZSV ;[2011] CHECK FOR ZERO SWITCH MOVEM T2,PPTYPE ;[2011] STORE VALUE POPJ P, ;[2011] DONE
SUBTTL SWITCH ACTION -- /REQUIRE:sym, /RUNCORE:n, /RUNAME:sym, /SEARCH %REQUIRE: PUSHJ P,.SAVE4 ;SAVE P1-P4 MOVX W1,PT.SYM!PT.SGN ;SOME FLAGS SKIPN W2,T2 ;PUT SYMBOL IN EXPECTED AC JRST E$$ZSV ;[1174] ZERO IS INVALID SETZ W3, ;ZERO VALUE FOR DUMMY REQUEST PJRST SY.RQ## ;PUT IN REQUEST %RUNCORE: CAIGE T2,1000 ;IN WORDS ALREADY? IFE TOPS20,< LSH T2,^D10 ;NO, ASSUME K > IFN TOPS20,< LSH T2,9 ;NO, ASSUME P > SUBI T2,1 ;HIGHEST ADDRESS MOVEM T2,RUNCOR ;STORE SIZE FOR RUN UUO SKIPN T2,3(P2) ;HIGH SEG SPECIFIED? POPJ P, ;NO CAIGE T2,1000 ;IN WORDS ALREADY? IFE TOPS20,< LSH T2,^D10 ;NO, ASSUME K > IFN TOPS20,< LSH T2,9 ;NO, ASSUME P > SUBI T2,1 ;HIGHEST ADDRESS MOVEM T2,RUNCOR+1 ;STORE SIZE FOR RUN UUO POPJ P, %RUNAME: MOVEM T2,RUNAME ;STORE CORE IMAGE NAME POPJ P, .SEARCH: TLO FL,L.LIB ;ENTER LIBRARY SEARCH MODE %SEARCH: TRO FL,R.LIB ;ENTER LIBRARY SEARCH MODE (1 FILE ONLY) POPJ P,
SUBTTL SWITCH ACTION -- /NEWPAGE, /ONLY:key %NEWPAGE: PUSHJ P,STRLSW ;WAIT TIL FILE IS LOADED .NEWPAGE: HRRZ R1,HYLTBL-1(T2) ;GET SEGMENT # MOVE R1,@SG.TB ;POINT TO DATA BLOCK SKIPN T1,RC.CV(R1) ;GET CURRENT VALUE POPJ P, ;NOT YET SETUP! ADDI T1,777 ANDCMI T1,777 ;NEXT PAGE BOUND MOVEM T1,RC.CV(R1) ;WRITE IT BACK POPJ P, $HYLLOW==1 ;LOW SEG $HYLHIGH==2 ;HIGH SEG .ONLY: PUSHJ P,SETONL ;SET UP T1 AND T2 TLZ FL,(T1) ;CLEAR THESE FLAGS TLOA FL,(T2) ;AND SET THESE ;SKIP NEXT INST. %ONLY: PUSHJ P,SETONL TRZ FL,(T1) ;CLEAR TRO FL,(T2) ;SET POPJ P, SETONL: HLRZ T1,ONLTAB-1(T2) ;GET FLAGS TO CLEAR HRRZ T2,ONLTAB-1(T2) ;AND SET POPJ P, ; CLEAR SET ONLTAB: R.HSO!R.LSO,, 0 ;0 R.HSO,, R.LSO ;1 R.LSO,, R.HSO ;2
SUBTTL SWITCH ACTION -- /PVBLOCK:KEYWORD[:VALUE],/PVDATA:KEYWORD:VALUE IFN TOPS20,< %PVBLOCK: .PVBLOCK: ;[1423] SKIPE PRGPDV ;[1423] PDV EXISTS ALREADY? POPJ P, ;[1423] IGNORE REQUEST FOR ANOTHER IFN FTOVERLAY,< SKIPN OVERLW ;[1423] USER TYPE /OVERLAY? JRST %PVSG0 ;[1423] NO, PROCEED CAIE T2,$SSGNONE ;[1423] NO PDV? CAIN T2,$SSGLOW ;[1423] PDV IN LOW SEGMENT? JRST %PVSG0 ;[1423] YES, ONLY LEGIT CASE E$$OPL::.ERR. (MS,,V%L,L%W,S%W,OPL,<Overlaid program data vector must be in low segment>) ;[1423] MOVEI T2,$SSGLOW ;[1423] PUT IT IN LOW SEG %PVSG0:> CAIN T2,$SSGNONE ;[1423] NO PSECT? JRST [ SETZM PRGPDV POPJ P, ] ;[1423] THEN DON'T GIVE ONE PUSH P,T2 ;[1423] SET ASIDE KEYWORD INDEX MOVEI T2,PV.LEN+PV.SPR;[1423] ASK FOR PDV STORAGE SPACE PUSHJ P,DY.GET## ;[1423] MOVEM T2,.PVCNT(T1) ;[1423] NOTE LENGTH OF PDV POP P,T2 ;[1423] GET BACK KEYWORD INDEX CAIN T2,$SSGPSECT ;[1423] IF PSECT, SIGNAL -1 SETOM T2 ;[1423] HRL T1,T2 ;[1423] STASH KEYWORD IN LEFT HALF MOVEM T1,PRGPDV ;[1423] KEYWORD,,PDV TEMP STORAGE SKIPL T2 ;[1423] PSECT SPECIFIED? JRST %PVSG1 ;[1423] NO MOVE W2,3(P2) ;[1423] PICK UP PSECT NAME MOVEM W2,PVPNAM ;[1423] STASH AWAY FOR LATER %PVSG1: MOVE T2,T1 ;[1423] MOVE POINTER TO SAFER PLACE MOVE T1,.JBVER ;[1423] LINK'S VERSION NUMBER MOVEM T1,.PVLVR(T2) ;[1423] GOES INTO THE PDV GTAD ;[1423] GET SYSTEM DATE/TIME MOVEM T1,.PVLTM(T2) ;[1423] STORE LINK TIME INTO PDV POPJ P,
.PVDATA: %PVDATA: SKIPN T4,PRGPDV ;[1423] PICK UP PDV POINTER PUSHJ P,PVFIX ;[1423] IF NONE, CONJURE ONE UP MOVE T1,3(P2) ;[1423] PICK UP NAME CAIE T2,$PDVNAME ;[1423] A SIXBIT NAME EXPECTED? JRST PDV0 ;[1423] MUST BE SYMBOLIC OR OCTAL ADDRESS MOVEM T1,PV.LEN(T4) ;[1423] LOAD IT AFTER THE PDV TEMPORARILY POPJ P, PDV0: TLNN T1,770000 ;[1423] SIXBIT SYMBOL? JRST PDV2 ;[1423] NO, MUST BE ABSOLUTE ADDRESS MOVX W1,PT.SGN!PT.SYM!PS.GLB ;[1423] GO LOOK FOR SYMBOL MOVE W2,T1 ;[1423] PUSH P,P2 ;[1423] SAVE BLOCK POINTER PUSH P,T2 ;[1423] SAVE TOKEN PUSH P,T1 ;[1423] AND SYMBOL PUSHJ P,TRYSYM## ;[1423] GO FIND IT JRST E$$USS ;[1423] COMPLAIN JRST E$$USS ;[1423] COMPLAIN POP P,(P) ;[1423] THROW AWAY SYMBOL MOVE T1,2(P1) ;[1423] SYMBOL VALUE FOUND JRST PDV1 ;HERE IF THE SYMBOL IS UNDEFINED. E$$USS::.ERR. (MS,.EC,V%L,L%W,S%W,USS,<Undefined symbol specified for /PVDATA: >) .ETC. (SBX,.EP,,,,W2) POP P,(P) ;[1423] THROW AWAY USELESS SYMBOL SETZM T1 ;[1423] AND ZERO OUT THE VALUE PDV1: POP P,T2 ;[1423] POP P,P2 ;[1423] PDV2: CAIN T2,$PDVVERSION ;[1423] VERSION? MOVEM T1,.PVVER(T4) ;[1423] CAIN T2,$PDVSTART ;[1423] START ADDRESS? MOVEM T1,.PVSTR(T4) ;[1423] CAIN T2,$PDVPROGRAM ;[1423] PROGRAM BLOCK? MOVEM T1,.PVPRG(T4) ;[1423] CAIN T2,$PDVCBLOCK ;[1423] CUSTOMER BLOCK? MOVEM T1,.PVCST(T4) ;[1423] POPJ P, PVFIX: PUSH P,T1 ;[1423] STASH VALUE PUSH P,T2 ;[1423] ALSO KEYWORD MOVE T2,$SSGDEFAULT ;[1423] FAKE UP A /PVBLOCK:DEFAULT PUSHJ P,.PVBLOCK ;[1423] AND PROCESS IT POP P,T2 ;[1423] RESTORE KEYWORD POP P,T1 ;[1423] AND VALUE MOVE T4,PRGPDV ;[1423] SET UP T4 AS BLOCKPOINTER POPJ P, ;[1423] AND CONTINUE DOING THE /PVDATA > ;IFN TOPS20
SUBTTL SWITCH ACTION -- /SEGMENT:key .SEGMENT: PUSHJ P,SETSEG ;SET UP T1 AND T2 TLZ FL,(T1) ;CLEAR THESE FLAGS TLOA FL,(T2) ;AND SET THESE ;SKIP NEXT INST. %SEGMENT: PUSHJ P,SETSEG TRZ FL,(T1) ;CLEAR TRO FL,(T2) ;SET POPJ P, SETSEG: HLRZ T1,SEGTAB-1(T2) ;GET FLAGS TO CLEAR HRRZ T2,SEGTAB-1(T2) ;AND SET IFN FTOVERLAY,< ;***** TEMP PATCH ***** SKIPL LNKMAX ;CAN ONLY SET IN ROOT LINK CAIN T2,R.FLS ;BUT CAN SET FORCED LOW SEG CAIA ;LEAVE AS IS SETZB T1,T2 ;OTHERWISE IT CAUSES GREAT CONFUSION ;***** FIND BETTER FIX LATER ***** > POPJ P, ; CLEAR SET SEGTAB: R.FNS!R.FHS,,R.FLS ;[1201] LOW R.FNS!R.FLS,,R.FHS ;[1201] HIGH R.FLS!R.FHS,,R.FNS ;[1201] DEFAULT R.FLS!R.FHS,,R.FNS ;[1201] NONE
SUBTTL SWITCH ACTION -- /SET:name:val %SET: PUSHJ P,STRLSW ;WAIT TIL FILE LOADED .SET: DMOVE W2,2(P2) ;SYMBOL & VALUE JUMPE W2,E$$ZSV ;[1241] TEST FOR NO ARGUMENT SETZM RC.SET ;[761] 0 IF COME HERE BY /SET SWITCH SKIPA ;[761] .SET0:: MOVEM W1,RC.SET ;[763] KEEP ATTRIBUTES IN RC.SET MOVEI R1,1 ;START AT 1 (.LOW.) TLNN W3,770000 ;SYMBOLIC IF LEFT JUSTIFIED JRST SET1 ;NO, MUST BE OCTAL MOVX W1,PT.SGN!PT.SYM ;SET FLAGS (NOT PT.EXT) EXCH W2,W3 ;PUT SYMBOL IN W2 & SAVE W3 PUSHJ P,.SAVE4## ;SAVE P1-P4 PUSHJ P,TRYSYM## ;SEE IF DEFINED JRST SETUND ;[1174] NOT DEFINED JRST SETUND ;[1174] MOVE W2,W3 ;RECOVER W2 MOVE W3,2(P1) ;GET VALUE SET1: SKIPN R2,@RC.TB ;GET POINTER TO IT JRST SET3 ;NON-LEFT, JUST INSERT CAME W2,RC.NM(R2) ;ALREADY THERE? JRST SET2 ;NO CAMN W3,RC.CV(R2) ;YES, BUT SAME VALUE? POPJ P, ;YES, GIVE UP MOVE R,R2 ;SETUP RC POINTER CAML W3,RC.CV(R2) ;NO, BUT ARE WE TRYING TO DECREASE VALUE? JRST SET4 ;NO, OK TO INCREASE IT MOVE W1,RC.IV(R2) ;GET INITIAL VALUE CAMGE W3,W1 ;THIS /SET BELOW INITIAL? JRST E$$SRB ;[1174] YES, DO NOT ALLOW IT MOVE W1,RC.CV(R2) ;GET VALUE E$$DRC::.ERR. (MS,.EC,V%L,L%W,S%W,DRC,<Decreasing relocation counter >) ;[1174] .ETC. (SBX,.EC!.EP,,,,W2) .ETC. (STR,.EC,,,,,< from >) .ETC. (OCT,.EC!.EP,,,,W1) .ETC. (STR,.EC,,,,,< to >) .ETC. (OCT,.EC!.EP,,,,W3) ;[1211] .ETC. (JMP,,,,,.ETIMF##) ;[1174] JRST SET4 ;AND CONTINUE
SET2: CAMGE R1,RC.NO ;[1132] CHECKED ALL WE'VE SET UP? AOJA R1,SET1 ;NO ADDI R,1 ;[1142] NOT THERE - INSERT IN NEXT FREE SLOT SET3: PUSHJ P,.SAVE4## ;[1142] SAVE P1-P4 MOVX W1,PT.SGN!PT.SYM!PS.DDT ;[1157] SET FLAGS PUSHJ P,SY.GS## ;[714] ADD TO GLOBAL SYMBOL TABLE. CAMN W2,['.HIGH.'] ;THIS IS SPECIAL JRST [MOVE W1,W3 ;AS IT CAUSES HIGH SEG TO APPEAR PUSHJ P,SETRC## ;[1155] SETUP HIGHSEG RC BLOCK ETC. MOVEI R,2 ;[1155] GET POINTER TO NEW RC BLOCK MOVE R,@SG.TB ;[1155] .. MOVE T1,RC.SET ;[1155] GET ATTRIBUTES TXZ T1,AT.RP ;[1163] .HIGH. ALWAYS HAS AN ORIGIN MOVEM T1,RC.AT(R) ;[1155] STORE POPJ P,] ;[1155] RETURN SOSGE RC.FRE ;ANY FREE SLOTS PUSHJ P,.SETEX ;NO, ALL USED AOS R,RC.NO ;[1255] GET NEXT FREE MOVEI T2,RC.INC ;SIZE WE WANT PUSHJ P,DY.GET## ;GET IT MOVEM T1,@RC.TB ;STORE POINTER MOVEM T1,@RC.NTB ;[706] HRL R,R ;[1304] RC.NTB,,RC.TB POINTERS MOVEM R,@RC.MAP ;[1304] MAP INITIALLY TO SAME SLOT MOVE R,T1 ;R POINTS TO RC BLOCK MOVEI T1,1 ;[1142] ALL PSECTS ARE IN THE LC AREA MOVEM T1,RC.SG(R) ;[1132] SEGMENT NUMBER SET4: MOVE T1,RC.SG(R) ;[1142] FETCH SEGMENT NUMBER EXCH R,T1 ;SWAP, PUT SEG # IN R MOVE R,@SG.TB ;GET POINTER TO RC TABLE (.LOW. OR .HIGH.) MOVE T3,RC.AT(T1) ;[763] MOVE T2,T3 ;[1300] SAVE CURRENT ATTRIBUTES IOR T3,RC.SET ;[763] ACCUMULATE THE ATTRIBUTES SKIPL RC.SET ;[763] IF CURRENT ATTR INDICATED FIXED ORIGIN TXZ T3,AT.RP ;[763] THAN CLEAR RELOC-PSECT BIT IFN FTFRK2,< TLNE W3,-1 ;[1425] NONZERO SECTION? SETOM EXTFLG ;[1425] SAY WE'RE LOADING ONE SKIPN EXTFLG ;[1425] USING NONZERO SECTION? TXO T3,AT.NC ;[1425] NO? SET NOCROSS SKIPE EXTFLG ;[1425] NONZERO SECTION? TXO T3,AT.NZ ;[1425] YES! SET NONZERO > ;[1425] MOVEM T3,RC.AT(T1) ;[763] UPDATE TXNN T2,AT.RP ;[1300] PREVIOUSLY RELOCATABLE, OR SKIPN RC.NM(T1) ;SETTING UP A NEW RC? MOVEM W3,RC.IV(T1) ;YES, SET INITIAL VALUE MOVEM W2,RC.NM(T1) ;SET UP RC NAME MOVEM W3,RC.CV(T1) ;ALSO CURRENT CAMLE W3,RC.HL(T1) ;[1132] HIGHEST LOCATION SO FAR? MOVEM W3,RC.HL(T1) ;[1132] YES, STORE IT MOVE T2,RC.LB(R) ;BASE OF AREA MOVEM T2,RC.LB(T1) DGET T2,RC.WD(R),RC.PG(R) ;LOWER CORE WINDOW & UPPER CORE WINDOW DSTORE T2,RC.WD(T1),RC.PG(T1) IFE FTFRK2,< MOVSI T2,1 ;[1300] SET T2 TO 1,,0 SKIPN RC.LM(T1) ;[1300] LIMIT ALREADY SET? ADD T2,RC.IV(T1) ;[1425] NEXT SECTION MOVEM T2,RC.LM(T1) ;[1300] NO, SET DEFAULT LIMIT > ;[1425] IFE FTFRK2 ; IF THERE IS ALREADY A LIMIT, LEAVE IT ALONE. ; OTHERWISE, IF AT.NC=1, BOUND AT NEXT SECTION. ; IF AT.NC=0, BOUND AT 40,,0 IF EXTFLG SET IFN FTFRK2,< SKIPE RC.LM(T1) ;[1425] LIMIT ALREADY SET? JRST SET5 ;[1425] LEAVE IT ALONE HLLZ T2,RC.IV(T1) ;[1425] PICK UP CURRENT STARTING SECTION ADD T2,[1,,0] ;[1425] SET NEXT SECTION AS LIMIT MOVE T3,RC.AT(T1) ;[1425] CHECK BITS TXNN T3,AT.NC ;[1425] BOUND AT NEXT SECTION? MOVX T2,<40,,0> ;[1505] NOPE, END OF THE WORLD MOVEM T2,RC.LM(T1) ;[1425] NO, SET DEFAULT LIMIT SET5: > ;[1425] IFN FTFRK2 POPJ P,
SETUND: MOVEI T1,[ASCIZ /SET:/] ;[1174] SIGNAL UNDEFINED SYMBOL ERROR PJRST E$$USI ;[1174] .. E$$SRB::.ERR. (MS,.EC,V%L,L%W,S%W,SRB,<Attempt to set relocation counter >) ;[1174] .ETC. (SBX,.EC!.EP,,,,W2) .ETC. (STR,.EC,,,,,< below initial value of >) .ETC. (OCT,.EC!.EP,,,,W1) ;[1174] .ETC. (JMP,,,,,.ETIMF##) ;[1174] POPJ P, ;IGNORE SWITCH .SETEX::MOVE T2,RC.NO ;GET NUMBER IN USE - 1 ADDI T2,RC.INC+1 ;GET SOME MORE PUSH P,T2 ;[706] PUSHJ P,DY.GET## ;[706] FROM FREE SPACE HRLZ T3,RC.NTB ;[706] COPY FROM HRR T3,T1 ;[706] TO ADDI T2,(T1) ;[706] LIMIT BLT T3,-1-RC.INC(T2);[706] SUBI T2,RC.INC(T1) ;[1107] GET OLD LENGTH MOVE T3,RC.NTB ;[1107] CURRENT POSITION HRRM T1,RC.NTB ;[1107] NEW HRRZ T1,T3 ;[1107] OLD PUSHJ P,DY.RET ;[1107] RETURN SPACE MOVE T2,0(P) ;[1304] PUSHJ P,DY.GET## ;FROM FREE SPACE HRLZ T3,RC.TB ;COPY FROM HRR T3,T1 ;TO ADDI T2,(T1) ;LIMIT BLT T3,-1-RC.INC(T2) SUBI T2,RC.INC(T1) ;GET OLD LENGTH MOVE T3,RC.TB ;CURRENT POSITION HRRM T1,RC.TB ;NEW HRRZ T1,T3 ;OLD PUSHJ P,DY.RET ;[1304] RETURN SPACE POP P,T2 ;[1304] PUSHJ P,DY.GET ;[1304] GET SPACE HRLZ T3,RC.MAP ;[1304] COPY FROM HRR T3,T1 ;[1304] TO ADDI T2,(T1) ;[1304] LIMIT BLT T3,-1-RC.INC(T2) ;[1304] SUBI T2,RC.INC(T1) ;[1304] GET OLD LENGTH MOVE T3,RC.MAP ;[1304] CURRENT POSITION HRRM T1,RC.MAP ;[1304] NEW HRRZ T1,T3 ;[1304] OLD MOVEI T3,RC.INC-1 ;NUMBER NOW FREE MOVEM T3,RC.FRE PJRST DY.RET## ;RETURN SPACE %LIMIT: ;[1300] PUSHJ P,STRLSW ;[1300] WAIT TIL FILE LOADED .LIMIT: DMOVE W2,2(P2) ;[1300] SYMBOL & VALUE JUMPE W2,E$$ZSV ;[1300] TEST FOR NO ARGUMENT .LIM0:: TLNN W3,770000 ;[1300] SYMBOLIC IF LEFT JUSTIFIED JRST LIM1 ;[1300] NO, MUST BE OCTAL MOVX W1,PT.SGN!PT.SYM ;[1300] SET FLAGS (NOT PT.EXT) EXCH W2,W3 ;[1300] PUT SYMBOL IN W2 & SAVE W3 PUSHJ P,.SAVE4## ;[1300] SAVE P1-P4 PUSHJ P,TRYSYM## ;[1300] SEE IF DEFINED JRST LIMUND ;[1300] NOT DEFINED JRST LIMUND ;[1300] MOVE W2,W3 ;[1300] RECOVER W2 MOVE W3,2(P1) ;[1300] GET VALUE LIM1: MOVE R1,RC.NO ;[1300] SET UP FOR PSECT SEARCH LIM2: SKIPN R2,@RC.TB ;[1300] GET POINTER TO IT JRST LIM3 ;[1300] NON-LEFT, JUST INSERT CAMN W2,RC.NM(R2) ;[1300] ALREADY THERE? JRST LIM4 ;[1300] YES, GO PUT IN NUMBER SOJG R1,LIM2 ;[1300] NO LIM3: MOVX W1,AT.RP ;[1300] PSECT DOES NOT EXST YET PUSH P,W3 ;[1300] REMEMBER THE LIMIT SETZ W3, ;[1300] CLEAR IT SO NO LNKSRB PUSHJ P,.SET0 ;[1300] CREATE IT AS RELOCATABLE POP P,W3 ;[1300] GET IT BACK JRST LIM1 ;[1300] TRY NOW TO FIND PSECT LIM4: MOVEM W3,RC.LM(R2) ;[1300] GOT PSECT, STORE THE LIMIT POPJ P, ;[1300] AND RETURN LIMUND: MOVEI T1,[ASCIZ /LIMIT:/] ;[1300] SIGNAL UNDEFINED SYMBOL ERROR PJRST E$$USI ;[1300]
SUBTTL SWITCH ACTION -- /SEVERITY:n, /START:n %SEVERITY: MOVEM T2,SEVLVL ;SAVE SEVERITY LEVEL POPJ P, .START: TLZ FL,L.ISA ;BACK TO READING STARTING ADDRESSES %START: TRZ FL,R.ISA ;FOR THIS FILE ONLY JUMPE T2,CPOPJ ;SPECIAL IF ADDRESS GIVEN CAIN T2,.C ;CHECK FOR DEFAULT ARG POPJ P, ;AND IGNORE IT IFN TOPS20,< SETZM ENTLEN ;[2006] DEFAULT ARGUMENT LENGTH > ;IFN TOPS20 SETZ T3, ;[1175] ASSUME SYMBOL NAME IS ZERO TXNE T2,77B5 ;[1175] SYMBOL OR ADDRESS? EXCH T2,T3 ;[1175] SYMBOL, MAKE OFFSET BE ZERO DMOVEM T2,STADDR ;[1175] STORE FOR END OF LOADING SETZM STANAM ;[655] DON'T KNOW MODULE NAME PUSHJ P,.NOSTART ;[1270] AND IGNORE ALL OTHER STARTING ADDRESSES JUMPE T3,CPOPJ ;[1270] DONE IF NOT SYMBOLIC EXCH T2,T3 ;[1270] PUT SYMBOL NAME IN T2 PJRST %REQUIRE ;[1270] REQUEST SYMBOL IN CASE SEARCH %SUPPRESS: ;[1307] PUSHJ P,.SAVE4## ;[1307] SAVE ACS MOVX W1,PT.SGN!PT.SYM!PS.REQ ;[1307] GET NEW BITS SKIPN W2,T2 ;[1307] IS NAME ZERO? JRST E$$ZSV ;[1307] YES, ERROR PUSHJ P,TRYSYM ;[1307] FIND SYMBOL POPJ P, ;[1307] SYMBOL UNKNOWN POPJ P, ;[1307] SYMBOL UNDEFINED AOS USYM ;[1307] ONE MORE UNDEFINED SYMBOL MOVEM W1,0(P1) ;[1307] STORE NEW BITS SETZM 2(P1) ;[1307] ZERO ADDRESS FIELD POPJ P, ;[1307] RETURN
SUBTTL SWITCH ACTION -- /SYMSEG:name[:name], /SYSORT:key, /UPTO:n, /VERBOSITY:n %SYMSEG:PUSHJ P,STRLSW ;[705] WAIT TIL FILE LOADED .SYMSEG: ;[705] CAIN T2,$SSGDEFAULT ;[1201] /SYMSEG:DEFAULT? JRST [SETZM SYMSEG ;[1201] YES, DO IT POPJ P,] ;[1201] GET OUT IFN FTOVERLAY,< SKIPN OVERLW ;[1176] USER TYPE /OVERLAY? JRST %SYMSG ;[1176] NO, PROCEED CAIE T2,$SSGLOW ;[1201] USER WANT LOW SEGMENT? CAIN T2,$SSGNONE ;[1201] OR NO SYMBOLS? JRST %SYMSG ;[1176] YES, ONLY POSSIBILITIES WITH OVERLAYS E$$OSL::.ERR. (MS,,V%L,L%W,S%W,OSL,<Overlaid program symbols must be in low segment>) ;[1174] MOVEI T2,$SSGLOW ;[1201] PUT THEM IN LOW SEG %SYMSG:> CAIN T2,$SSGPSECT ;[1201] A PSECT SPECIFIED? JRST SYMS1 ;[721] MOVEM T2,SYMSEG ;STORE INDEX TO EITHER LC OR HC POPJ P, ;[1246] SYMS1: SETOM SYMSEG ;[721] MOVE W2,3(P2) ;[721] GET PSECT NAME MOVEM W2,SSGNAM ;[721] STORE IT AWAY POPJ P, ;[721] RETURN %SYSORT: JRST @SYSTBL-1(T2) ;DISPATCH TO RIGHT FUNCTION POPJ P, %UPTO: MOVEM T2,SYMLIM ;[723] SAVE SYMBOL TABLE UPPER LIMIT POPJ P, ;[723] %VERBOSITY: MOVE T2,VERTBL-1(T2) ;GET VALUE MOVEM T2,VERLVL ;SAVE VERBOSITY LEVEL POPJ P, $VERSHORT==M%P ;[1301] PREFIX ONLY $VERMEDIUM==M%P!M%F ;[1301] PREFIX AND FIRST LINE $VERLONG==M%P!M%F!M%C ;[1301] PREFIX, FIRST, AND CONTINUATION
SUBTTL SWITCH ACTION -- /UNDEFINED %UNDEFINED: PUSHJ P,STRLSW ;WAIT TIL AFTER FILE IS LOADED .UNDEFINED: MOVE T1,[PUSHJ P,UNDNXT] ;[1174] SET UP NEXT SYMBOL ROUTINE MOVEM T1,NXTGLB ;[1174] .. MOVE W3,HT.PRM ;[1174] SET UP INDEX TO HASH TABLE ADDI W3,1 ;[1174] SET UP BY 1 FOR SOSGE BELOW E$$UGS::.ERR. (MS,.EC!.EN,V%L,L%F,S%I,UGS) ;[1174] .ETUGS::.ETC. (XCT,.EC,,,,<[PUSHJ P,UNDHDR]>) ;[1174] PRINT HEADER AND SEE IF ANY SYMBOLS .ETC. (JMP,.EC,,,,.ETDON##) ;[1174] NO UNDEFINED SYMBOLS .ETC. (JMP,,,,,.ETSAV##) ;[1174] GO PRINT SYMBOLS AND VALUES ;UNDHDR PRINTS THE APPROPRIATE HEADER FOR THE LNKUGS MESSAGE (EITHER NO, 1 OR N ;UNDEFINED GLOBALS). THE CARDINALITY OF THE HEADER IS DETERMINED BY LOOKING AT ;USYM, WHICH SOMETIMES GETS OUT OF SYNC WITH THE ACTUAL GS TABLE. BUT UNDNXT ;(BELOW) PRINTS ALL UNDEFINED GLOBALS REGARDLESS. UNDHDR: SKIPN T1,USYM ;[1174] ANY SYMBOLS TO PRINT? JRST UNDHD1 ;[1174] NO--PRINT 'NO' INSTEAD OF '0' OUTVIA .TDECW## ;[1174] PRINT NUMBER OF UNDEFINED GLOBALS UNDHD1: MOVE T1,USYM ;[1174] GET NUMBER OF UNDEFS BACK CAILE T1,2 ;[1174] TURN MANY INTO 2 FOR HEADER MESSAGE MOVEI T1,2 ;[1174] .. MOVE T1,UNDTAB(T1) ;[1174] GET PROPER HEADER MESSAGE OUTVIA .TSTRG## ;[1174] PRINT IT PJRST UNDNXT ;[1174] RETURN, SETTING UP FIRST SYMBOL
;UNDNXT RETURNS THE NEXT UNDEFINED SYMBOL AND ITS VALUE. ; ;CALL: ; W3/ NEXT HASH TABLE INDEX TO CHECK ;RETURNS WITH A NON-SKIP RETURN IF NO MORE SYMBOLS. OTHERWISE, RETURNS WITH A ;SKIP RETURN WITH: ; W1/ SIXBIT SYMBOL NAME ; W2/ OCTAL VALUE ; W3/ UPDATED UNDNXT::PUSHJ P,.SAVE4## ;[1174] SAVE LNKLOG'S P ACS UGSLUP: SOSGE P2,W3 ;[1174] ANY MORE SYMBOLS TO CHECK? POPJ P, ;[1174] NO--NON-SKIP RETURN SKIPN P3,@HT.PTR ;[1174] ANY SYMBOL HERE? JRST UGSLUP ;[1174] NO--TRY NEXT ADD P3,GS.LB ;[1174] YES--RELOCATE SO WE CAN LOOK AT IT MOVE T1,0(P3) ;[1174] GET SYMBOL'S FLAGS TXNE T1,PT.SYM ;[1174] MUST BE A SYMBOL AND UNDEFINED TXNN T1,PS.UDF!PS.REQ;[1174] .. JRST UGSLUP ;[1174] NO--TRY NEXT MOVE W1,1(P3) ;[1174] YES--A WINNER!! SET UP SYMBOL'S NAME MOVE W2,2(P3) ;[1174] AND VALUE JRST CPOPJ1 ;[1174] DONE--GIVE SKIP RETURN UNDTAB: [ASCIZ /No undefined global symbols/] [ASCIZ / undefined global symbol/] [ASCIZ / undefined global symbols/]
SUBTTL SWITCH ACTION -- /SYSLIBRARY, /NOSYSLIBRARY %SYSLIBRARY: PUSHJ P,STRLSW ;WAIT TIL FILE IS LOADED .SYSLIBRARY: SOJE T2,SYSLB1 ;DEFAULT ACTION IF INDEX WAS 1 ; LOAD FROM LIBRARIES AND RETURN ; FROM /SYSLIBRARY (SOJ/PJUMPE) MOVE T1,LIBTBL(T2) ;GET REQUIRED BIT IORM T1,LIBPRC ;[653] REMEMBER TO SEARCH THIS LIBRARY ANDCAM T1,NOLIBS ;AND TURN OFF THIS BIT INCASE /NOSYSL POPJ P, ;AND RETURN ;WILL LOAD AT DEFAULT TIME ;ROUTINE TO CAUSE ALL SPECIFIED AND DEFAULT LIBRARIES ;TO BE SEARCHED, AND ANY MODULES WHICH MATCH TO BE LOADED. ;CALLED BY ; PUSHJ P,SYSLB1 ; RETURN ;NO PARAMETERS ARE PASSED OR RETURNED IN THE AC'S ;P1 THROUGH P4 ARE PRESERVED SYSLB1::PUSHJ P,.SAVE4## ;PRESERVE P1-P4 PUSH P,FL ;SAVE FLAGS PUSH P,F.INZR ;AND CURRENT PUSH P,F.NXZR ;AND PENDING FILE SPECS SETZM F.INZR ;CLEAR LIST SETZM F.NXZR ;SO WE JUST LOAD DEFAULTS PUSH P,GOTO ;SAVE INCASE EOL SEEN PUSH P,[LODTST##] ;FAKE RETURN TO LOAD ROUTINE PUSHJ P,LIBRARY## ;LOAD DEFAULT LIBS POP P,GOTO ;RESTORE EOL INTERCEPT POP P,F.NXZR ;RESTORE PENDING FILE SPECS POP P,F.INZR POP P,FL ;AS WE WERE POPJ P, %NOSYSLIBRARY: SOSE T2 ;DEFAULT ACTION IF WAS 1 SKIPA T1,LIBTBL(T2) ;NO SETO T1, ;YES, TURN THEM ALL OFF IORM T1,NOLIBS ;DON'T WANT THESE DEFAULT LIBS POPJ P,
SUBTTL SWITCH ACTION -- /USERLIBRARY:key %USERLIBRARY: MOVEI T2,F.LEN ;SPACE TO STORE FILE SPEC PUSHJ P,DY.GET## ADDI T2,-1(T1) ;END OF BLT HRLZI T3,1(P1) ;FROM HRRI T3,1(T1) ;TO BLT T3,(T2) ;ALL EXCEPT FIRST WORD SOSLE T2,2(P2) ;[1324] IS IT /USERLIB:ANY? SKIPA T2,LIBTBL(T2) ;[1324] NO, GET COMPILER TYPE BIT SETO T2, ;[1324] YES, SET ALL THE BITS MOVEM T2,1(T1) ;SAVE IN SWITCH FIELD EXCH T1,USEPTR ;POINT TO LATEST ENTRY MOVEM T1,@USEPTR ;AND LINK IT IN ZFPOPJ: HRLZI T1,2(P1) HRRI T1,3(P1) SETZM 2(P1) BLT T1,F.LEN-1(P1) ;ZERO FILE SPEC POPJ P,
SUBTTL SWITCH ACTION -- /NOUSERLIBRARY %NOUSERLIBRARY: MOVEI T1,USEPTR ;START OF CHAIN NOUSE1: HRL T1,T1 ;SAVE LAST HRR T1,(T1) ;GET NEXT TRNN T1,-1 ;0 IS END JRST ZFPOPJ ;NOT FOUND SKIPN F.NAME(P1) ;SPECIAL IF NO FILE NAME JRST NOUSE3 ;AS IT MEANS DELETE ALL DMOVE T2,F.DEV(T1) ;GET DEV & FILE CAMN T2,F.DEV(P1) CAME T3,F.NAME(P1) JRST NOUSE1 ;NOT SAME MOVE T2,F.EXT(T1) MOVE T3,F.DIR(T1) CAMN T2,F.EXT(P1) CAME T3,F.DIR(P1) JRST NOUSE1 MOVEI T3,F.DIR+2(T1) ;NOW FOR SFDS MOVEI T4,F.DIR+2(P1) HRLI T4,-5 NOUSE2: MOVE T2,(T3) CAME T2,(T4) JRST NOUSE1 ;DIFFERENT ADDI T3,2 ;GET NEXT ADDI T4,1 AOBJN T4,NOUSE2 ;NOT YET DONE MOVE T2,(T1) ;NOW REMOVE IT BUT FIRST MOVS T1,T1 ; LINK IN NEXT PTR MOVEM T2,(T1) HLRZ T1,T1 MOVEI T2,F.LEN PUSHJ P,DY.RET## JRST ZFPOPJ ;AND DELETE FILE SPEC NOUSE3: MOVE T2,(T1) ;NOW REMOVE IT BUT FIRST MOVS T1,T1 ; LINK IN NEXT PTR MOVEM T2,(T1) HLRZ T1,T1 MOVEI T2,F.LEN PUSHJ P,DY.RET## SKIPE USEPTR ;ANY MORE? JRST %NOUSERLIB ;YES JRST ZFPOPJ ;NO, DELETE FILE SPEC
SUBTTL SWITCH ACTION -- /VALUE:sym ;/VALUE:SYMBOL PRINTS THE VALUE OF THE SYMBOL (IF IT HAS ONE YET), ALONG WITH ;SOME STATUS INFORMATION (E.G., COMMON). %VALUE: PUSHJ P,STRLSW ;WAIT TIL FILE LOADED .VALUE: MOVX W1,PT.SGN!PT.SYM ;SET FLAGS SKIPN W2,T2 ;[1174] SET UP SYMBOL FOR TRYSYM AND CHECK FOR 0 JRST E$$ZSV ;[1174] ZERO IS INVALID SETZ W3, ;[605] VALUE 0 UNLESS LONG SYMBOL E$$VAL::.ERR. (MS,.EC,V%L,L%F,S%I,VAL,<Symbol >) ;[1174] .ETC. (SBX,.EC!.EP,,,,W2) ;[1174] .ETC. (ASC,.EC,,,,.CHTAB) ;[1174] .ETC. (XCT,,,,,<[PUSHJ P,VALOUT]>) ;[1174] THE REST IS COMPLEX POPJ P, ;[1174] DONE
;VALOUT IS CALLED FROM THE MIDDLE OF THE ABOVE .ERR. MESSAGE TO PRINT THE ;VARIABLE PORTION OF THE MESSAGE. VALOUT: PUSHJ P,.SAVE4## ;[1174] SAVE LNKLOG'S P ACX PUSHJ P,TRYSYM## ;SEE IF IN TABLE JRST VALOND ;[1174] SYMBOL NEVER DEFINED JRST VALOUN ;[1174] SYMBOL UNDEFINED MOVE T1,2(P1) ;[1174] PRINT VALUE IN OCTAL OUTVIA .TOCTW## ;[1174] .. MOVE T1,0(P1) ;[1174] CHECK FOR COMMON BLOCKS TXNE T1,PS.COM ;[1174] .. JRST VALOCM ;[1174] GO PRINT LENGTH OF COMMON MOVEI T1,[ASCIZ / defined/] ;[1174] OTHERWISE JUST ORDINARY SYMBOL VALOST: OUTVIA .TSTRG## ;[1174] PRINT STATUS OF SYMBOL POPJ P, ;[1174] DONE VALOCM: MOVEI T1,[ASCIZ / common, length /] ;[1174] START STATUS OF SYMBOL OUTVIA .TSTRG## ;[1174] .. MOVE T1,.L+2(P1) ;[1174] PRINT LENGTH IN DECIMAL OUTVIA .TDECW## ;[1174] .. MOVEI T1,[ASCIZ /./] ;[1174] A DOT TO INDICATE DECIMAL PJRST VALOST ;[1174] GO PRINT STATUS AND RETURN VALOND: MOVEI T1,[ASCIZ /unknown/] ;[1174] HAVEN'T SEEN THE SYMBOL YET PJRST VALOST ;[1174] GO PRINT STATUS AND RETURN VALOUN: MOVE T1,2(P1) ;[1174] PRINT VALUE IN OCTAL OUTVIA .TOCTW## ;[1174] .. MOVEI T1,[ASCIZ / undefined/] ;[1174] ONLY SEEN REFERENCES SO FAR PJRST VALOST ;[1174] GO PRINT STATUS AND RETURN
SUBTTL SWITCH ACTION -- /VERSION:ver %VERSION: PUSHJ P,STRLSW ;[1122] WAIT TIL FILE INITED .VERSION: MOVE T2,2(P2) ;[1122] GET VALUE SKIPE T1,IO.CHN ;[1122] GET CURRENT CHAN# CAIN T1,DC ;[1122] IF 0 OR INPUT CHAN JRST [MOVEM T2,VERNUM ;[1122] STORE VERSION NUMBER POPJ P,] ;[1122] IN CORE MOVE T1,IO.PTR(T1) ;[1122] IF OUTPUT SPEC MOVEM T2,I.VER(T1) ;[1122] SAVE IN DATA BLOCK POPJ P, ;[1122]
SUBTTL SWITCH ACTION -- /SSAVE, /SAVE IFN FTEXE,< %SSAVE: SKIPA T1,[0,,SS.SHR] %SAVE: SETZ T1, MOVEM T1,SSEXT PUSHJ P,COPYP1 ;MAKE A NEW DATA BLOCK IFN TOPS20,< SKIPN T1,F.EXT(P1) ;USER SUPPLY EXT? > ;END IFN TOPS20 MOVSI T1,'EXE' ;NO, DEFAULT EXT HLLM T1,SSEXT ;SAVE EXT HLLOM T1,F.EXT(P1) ;UPDATE EXT MOVE T1,F.NAME(P1) ;GET REAL NAME MOVEM T1,SSNAME ;AND SAVE IT PUSHJ P,DVOUT.## ;SET UP DATA BLOCK %VC,,.IODPR ;USE DUMP MODE PJRST RESTP1 ;RETURN THIS BLOCK NOW >;END OF IFN FTEXE IFE FTEXE,< %SAVE: MOVSI T1,'HGH' ;STORE NON-SHARABLE EXTENSION JRST SSAVE %SSAVE: MOVSI T1,'SHR' ;SHARABLE HIGH SEG EXT SSAVE: PUSHJ P,COPYP1 ;MAKE A NEW DATA BLOCK HLR T1,F.EXT(P1) ;INCASE USER SUPPLIED LOW EXT MOVEM T1,SSEXT ;SAVE REAL EXT FOR LATER HLLOM T1,F.EXT(P1) ;STORE DEFAULT EXT MOVE T1,F.NAME(P1) ;GET REAL NAME MOVEM T1,SSNAME ;AND SAVE IT PUSHJ P,DVOUT.## ;SETUP DATA BLOCK %VC,,.IODPR ;USE DUMP MODE PJRST RESTP1 ;RETURN THIS BLOCK NOW >;END OF IFE FTEXE
SUBTTL SWITCH ACTION -- /SYFILE:key %SYFILE: SKIPE NOSYMS ;IF NOT WANTED PJRST DEFRET ;DON'T DO IT PUSHJ P,COPYP1 ;MAKE A NEW DATA BLOCK MOVE T1,SYMTBL-1(T2) ;GET FLAG MOVEM T1,SYMFRM ;SHOW WHICH ONE MOVSI T1,'SYM' ;FILE EXT MOVEM T1,F.EXT(P1) PUSHJ P,DVOUT.## ;SET UP DATA BLOCK %SC,,.IODPR MOVE T1,IO.PTR+%SC ;[1230] USE PROPER CHANNEL FOR PROPER MOVE T2,SYMFRM ;[1230] SYMBOL FILE MOVE T2,[EXP <Z MC,>,<Z MC,>,<Z SC,>,<Z AC,>]+1(T2) ;[1230] .. MOVEM T2,I.CHN(T1) ;[1230] .. PJRST RESTP1
SUBTTL SWITCH ACTION -- /XPN, /MAP:key %XPN: PUSHJ P,COPYP1 ;MAKE A NEW DATA BLOCK MOVSI T1,'XPN' ;EXPANDED SAVE FILE MOVEM T1,F.EXT(P1) ;IE CORE IMAGE PUSHJ P,DVOUT.## ;SETUP DATA BLOCK %XC,,.IODPR PJRST RESTP1 %MAXNODE:: .MAXNODE:: CAIG T2,.DBS ;[1424] AT LEAST ^D128 MOVEI T2,.DBS ;[1424] IGNORE SILLY REQUEST HRRM T2,L.MAX ;[1424] SET MAXIMUM NUMBER OF LINKS POPJ P, ;[1424] AND RETURN %MAP: PUSHJ P,COPYP1 ;MAKE A NEW DATA BLOCK MOVE T1,MAPTBL-1(T2) ;GET CODE MOVEM T1,MAPSW ;SAVE IT JUMPGE T1,MAPOK ;-1 NOT YET AVAILABLE E$$IMA::.ERR. (MS,0,V%L,L%W,S%W,IMA,<Incremental maps not yet available>) ;[1174] MAPOK: MOVSI T1,'MAP' ;DEFAULT EXT SKIPN F.EXT(P1) ;ALREADY SET HLLOM T1,F.EXT(P1) ;NO PUSHJ P,DVOUT.## ;SET UP DATA BLOCK MC,,.IOASC PJRST RESTP1 ;RETURN, BUT DON'T LOAD THIS FILE ;ROUTINE COPYP1 - COPIES THE DATA BLOCK POINTED TO BY P1 TO A NEW BLOCK ;STORES THE OLD P1 IN LH P1 AND NEW BLOCK PTR IN RH P1 COPYP1::PUSH P,T1 ;SAVE EXT PUSH P,T2 ;SAVE ARG MOVEI T2,F.LEN ;LENGTH OF A DATA BLOCK PUSHJ P,DY.GET## HRL T1,P1 ;FORM BLT PTR MOVE P1,T1 ;SETUP P1 TO SAVE OLD AND POINT TO NEW ADDI T2,-1(T1) ;END OF BLT BLT T1,(T2) ;COPY BLOCK POP P,T2 ;RESTORE ARG POP P,T1 ;... POPJ P, ;ROUTINE RESTP1 - DELETES DATA BLOCK POINTED TO BY P1 ;AND RESTORES THE OLD P1 RESTP1::HRRZ T1,P1 ;ADDRESS OF BLOCK MOVEI T2,F.LEN ;LENGTH OF IT HLRZ P1,P1 ;RESTORE P1 SETOM NULSPC ;FAKE A NULL BLOCK (SAME AS DEFRET) PJRST DY.RET## ;GIVE BACK AND RETURN
SUBTTL SWITCH ACTION -- /LOG %LOG: PUSHJ P,.SAVE2## ;GET A SAFE AC BUT NOT P1 PUSHJ P,COPYP1 ;MAKE A NEW DATA BLOCK SETZ P2, ;ZERO IF NOT ALREADY A LOG FILE SKIPN LOGSUB ;NON-ZERO IF LOG DEVICE OTHER THAN TTY SKIPE LOGTTY ;OR TTY AS LOG SETO P2, ;-1 FOR ALREADY A LOG DEV MOVSI T1,'LOG' ;DEFAULT EXT SKIPN F.EXT(P1) ;UNLESS ALREADY SET HLLOM T1,F.EXT(P1) PUSHJ P,DVOUT.## %RC,,.IOASC PUSHJ P,DVNAM.## ;MAKE SURE NAME IS SETUP SKIPL LOGTTY ;IS CURRENT LOG DEVICE USERS TTY? JRST LOG2 ;NO MOVE T1,IO.CHR ;GET DEVCHR WORD TXNN T1,DV.TTA ;IS IT USERS TTY JRST LOG1 ;NO, TELL USER WHERE NEW LOG IS AT LOG0: MOVEI T1,%RC ;DON'T NEED THIS BLOCK NOW MOVEM T1,IO.CHN PUSHJ P,DVZAP.## ;SO REMOVE IT JRST RESTP1 ;AND RETURN LOG1: PUSHJ P,E$$CLF ;[1174] OUTPUT INFO MESSAGE SETZM LOGTTY ;CLEAR IT HLRZ T1,LOWSUB ;GET LOG SUB ADDRESS MOVEM T1,LOGSUB ;POINT TO IT PUSHJ P,.TYOCH## ;INITIALIZE JRST LOG4 ;AND DO REST OF SETUP LOG2: MOVE T1,IO.CHR ;DEVCHR WORD FOR NEW LOG DEV TXNN T1,DV.TTA ;WANTS TTY FOR LOG? JRST LOG3 ;NO PUSHJ P,DVCHN.## ;POINT T1 TO DATA BLOCK SETZM I.EXT(T1) ;CLEAR .LOG EXT FOR MESSAGE SKIPE P2 ;IF THERE WAS ALREADY A LOG FILE PUSHJ P,LOG5 ; GIVE MESSAGE SETZM LOGSUB ;CLEAR OLD LOG OUTPUT ROUTINE SETOM LOGTTY ;SIGNAL TO USE TTY HRRZ T1,LOWSUB ;GET IT PUSHJ P,.TYOCH## ;INITIALIZED JUMPL P2,E$$LFC ;[1174] BEEN INITIALIZED ONCE E$$LFI::.ERR. (MS,0,V%L,L%I,S%I,LFI,<Log file initialization>) ;[1174] PJRST LOG0 ;AND REMOVE DATA BLOCK E$$LFC::.ERR. (MS,0,V%L,L%I,S%I,LFC,<Log file continuation>) ;[1174] PJRST LOG0
LOG3: SKIPN IO.PTR+RC ;ALREADY A LOG FILE? JRST LOG4 ;NO MOVE T1,IO.PTR+RC ;YES, GET CURRENT PTR MOVE T2,IO.PTR+%RC ;AND NEW PTR MOVE T3,I.DEV(T2) ;GET DEVICE CAMN T3,I.DEV(T1) ;SEE IF SAME JRST RESTP1 ;YES, DO RENAME AT END MOVE T4,I.DEV(T1) ;NOW TRY PHYSICAL NAMES DEVNAM T3, ;SINCE LOGICAL = PHYSICAL IS OK JRST LOG4A ;UUO FAILED DEVNAM T4, JRST LOG4A CAME T3,T4 ;DO WE NOW MATCH? JRST LOG4A ;NO MOVE T3,I.DEV(T1) ;MAKE DEVICES THE SAME MOVEM T3,I.DEV(T2) ;FOR RENAME CODE JRST RESTP1 ;AND DO IT LATER LOG4A: PUSHJ P,LOG5 ;OUTPUT MESSAGE AND DELETE I/O BLOCK LOG4: MOVE T1,IO.PTR+%RC ;GET NEW PTR MOVEM T1,IO.PTR+RC SETZM IO.PTR+%RC MOVSI T2,(Z RC,) ;GET CHAN# MOVEM T2,I.CHN(T1) MOVEI T1,RC ;SETUP AGAIN MOVEM T1,IO.CHN PUSHJ P,DVCHK.## ;GET DEVCHR WORD PUSHJ P,DVOPN.## ;OPEN PUSHJ P,DVENT.## ;ENTER FILE NAME HLRZ T1,LOWSUB ;GET ADDRESS OF OUTPUT ROUTINE MOVEM T1,LOGSUB ;SAVE IT FOR LOG FILE PUSHJ P,.TYOCH## ;LET SCAN KNOW JUMPL P2,E01LFC ;[1174] BEEN INITIALIZED E01LFI::.ERR. (MS,0,V%L,L%I,S%I,LFI) ;[1174] JRST RESTP1 ;AND RETURN E01LFC::.ERR. (MS,0,V%L,L%I,S%I,LFC) ;[1174] PJRST RESTP1 LOG5: PUSHJ P,E$$CLF ;[1174] OUTPUT MESSAGE RELEASE RC, MOVEI T1,RC MOVEM T1,IO.CHN ;FOR I/O ROUTINES PJRST DVZAP.## ;REMOVE ALL TRACES OF IT E$$CLF::.ERR. (MS,.EC,V%L,L%I,S%I,CLF,<Closing log file, continuing on file >) ;[1174] .ETC. (FSP,,,,,%RC) POPJ P,
SUBTTL SWITCH ACTION -- /BACKSPACE, /REWIND .BACKSPACE: PUSHJ P,STRGSW ;WAIT TIL FILE INITED MOVEI T2,[ASCIZ /BACKSPACE/] PUSHJ P,DNSCHK ;GET CHAN# IOR T1,.MTBSF. ;FORM INST MOVE T2,2(P2) ;GET REPEAT COUNT (VALUE) PUSHJ P,CHKLSW ;SEE IF CHAN OPEN XCT T1 ;BACKSPACE 1 FILE SOJG T2,.-1 PJRST MTAPE0 %BACKSPACE: PUSHJ P,STRLSW ;WAIT TIL FILE INITED MOVEI T2,[ASCIZ /BACKSPACE/] PUSHJ P,DNSCHK ;GET CHAN# IOR T1,.MTBSF. ;FORM INST MOVE T2,2(P2) ;GET REPEAT COUNT (VALUE) PUSHJ P,CHKRSW ;SEE IF CHAN OPEN XCT T1 ;BACKSPACE 1 FILE SOJG T2,.-1 ;LOOP, ALWAYS DO ONCE PJRST MTAPE0 ;WAIT FOR POSITIONING TO FINISH .REWIND: PUSHJ P,STRGSW ;WAIT TIL FILE INITED MOVEI T2,[ASCIZ /REWIND/] PUSHJ P,DNSCHK ;GET CHAN# IOR T1,.MTREW. ;FORM INST SETZ T2, PUSHJ P,CHKLSW XCT T1 ;REWIND JRST MTAPE0 ;WAIT FOR POSITIONING TO FINISH %REWIND: PUSHJ P,STRLSW ;WAIT TIL FILE INITED MOVEI T2,[ASCIZ /REWIND/] PUSHJ P,DNSCHK ;GET CHAN# IOR T1,.MTREW. ;FORM INST SETZ T2, PUSHJ P,CHKRSW XCT T1 ;REWIND JRST MTAPE0 ;WAIT FOR POSITIONING TO FINISH
SUBTTL SWITCH ACTION -- /SKIP, /UNLOAD .SKIP: PUSHJ P,STRGSW ;WAIT TIL FILE INITED MOVEI T2,[ASCIZ /SKIP/] PUSHJ P,DNSCHK ;GET CHAN# IOR T1,.MTSKF. ;FORM INST MOVE T2,2(P2) ;GET REPEAT COUNT (VALUE) PUSHJ P,CHKLSW XCT T1 ;SKIP 1 FILE SOJG T2,.-1 ;LOOP, ALWAYS DO ONCE JRST MTAPE0 ;WAIT FOR POSITIONING TO FINISH %SKIP: PUSHJ P,STRLSW ;WAIT TIL FILE INITED MOVEI T2,[ASCIZ /SKIP/] PUSHJ P,DNSCHK ;GET CHAN# IOR T1,.MTSKF. ;FORM INST MOVE T2,2(P2) ;GET REPEAT COUNT (VALUE) PUSHJ P,CHKRSW XCT T1 ;SKIP 1 FILE SOJG T2,.-1 ;LOOP, ALWAYS DO ONCE JRST MTAPE0 ;WAIT FOR POSITIONING TO FINISH %UNLOAD: PUSHJ P,STRLSW ;WAIT TIL FILE INITED (AFTER FILE ONLY) MOVEI T2,[ASCIZ /UNLOAD/] PUSHJ P,DNSCHK ;GET CHAN# IOR T1,.MTUNL. ;FORM INST SETZ T2, PUSHJ P,CHKRSW XCT T1 ;UNLOAD FILE POPJ P,
SUBTTL SWITCH ACTION -- /MTAPE:key .MTAPE: PUSHJ P,STRGSW ;WAIT TIL FILE INITED MOVEI T2,[ASCIZ /MTAPE/] PUSHJ P,DNSCHK ;GET CHAN# MOVE T2,2(P2) ;GET KEYWORD VALUE IOR T1,MTPTBL-1(T2) ;GET FUNCTION SETZ T2, PUSHJ P,CHKLSW XCT T1 ;MTAPE CH,# JRST MTAPE0 %MTAPE: PUSHJ P,STRLSW ;WAIT TIL FILE INITED MOVEI T2,[ASCIZ /MTAPE/] PUSHJ P,DNSCHK ;GET CHAN# MOVE T2,2(P2) ;GET KEYWORD VALUE IOR T1,MTPTBL-1(T2) ;GET FUNCTION SETZ T2, PUSHJ P,CHKRSW XCT T1 ;MTAPE CH,# MTAPE0: HRRI T1,0 ;MTWAT. XCT T1 ;WAIT FOR POSITIONING TO FINISH POPJ P, ;TABLE OF MTAPE FUNCTIONS DEFINE KEYMAC (A,B)< IFIDN <A><MTP>,< IRP B,< .'B: EXP B >>> XALL MTPTBL: KEYWORDS SALL
SUBTTL SWITCH ACTION -- /ZERO %ZERO: PUSHJ P,STRGSW ;WAIT TIL FILE INITED (BEFORE FILE ONLY) MOVEI T2,[ASCIZ /ZERO/] PUSHJ P,DNSCHK ;GET CHAN# IOR T1,[UTPCLR] ;FORM INST SETZ T2, PUSHJ P,CHKLSW XCT T1 ;ZERO DIRECTORY (DTA ONLY) POPJ P, DNSCHK: SKIPN T1,IO.CHN ;GET LAST CHAN# JRST E$$DNS ;[1174] NO CHAN# NO DEVICE! MOVE T1,IO.PTR(T1) ;POINT TO DATA BLOCK MOVE T1,I.SCN(T1) ;GET SCAN MODIFIER WORD TXNE T1,FX.NDV ;SEE IF DEVICE SPECIFIED JRST E$$DNS ;[1174] NO, DON'T ALLOW DSK BY DEFAULT HRLZ T1,IO.CHN ;GET LAST I/O CHAN INITED LSH T1,5 ;INTO AC FIELD POPJ P, ;RETURN WITH CHAN# SETUP IN T1 E$$DNS::.ERR. (MS,.EC,V%L,L%F,S%F,DNS,<Device not specified for switch />) ;[1174] .ETC. (STR,.EP,,,,T2)
CHKLSW: MOVE T3,IO.CHN ;GET CHAN SKIPL IO.PTR(T3) ;NOT INITED YERT POPJ P, ;YES, JUST RET PUSH P,T2 ;STACK PUSH P,T1 MOVEI T2,3 ;NEED 3 WORDS PUSHJ P,DY.GET## POP P,1(T1) ;STACK UUO POP P,2(T2) ;STACK COUNT MOVE T2,IO.CHN ;SEE WHO FOR MOVE T2,IO.PTR(T2) MOVE T3,I.SWT(T2) ;GET SWITCHES TO DO TLNN T3,-1 JRST [HRLM T1,I.SWT(T2) JRST POPJP] HLRZ T2,T3 ;ALREADY SWITCHES TO DO MOVE T3,(T2) ;GET END OF LIST TLNE T3,-1 JRST .-3 ;NOT YET MOVEM T1,(T2) POPJP: POP P,(P) POPJ P, CHKRSW: MOVE T3,IO.CHN ;GET CHAN SKIPL IO.PTR(T3) ;NOT INITED YET POPJ P, PUSH P,T2 ;STACK PUSH P,T1 MOVEI T2,3 ;NEED 3 WORDS PUSHJ P,DY.GET## POP P,1(T1) ;STACK UUO POP P,2(T2) ;STACK COUNT MOVE T2,IO.CHN ;SEE WHO FOR MOVE T2,IO.PTR(T2) MOVE T3,I.SWT(T2) ;GET SWITCHES TO DO TRNN T3,-1 JRST [HRRM T1,I.SWT(T2) JRST POPJP] HRRZ T2,T3 ;ALREADY SWITCHES TO DO MOVE T3,(T2) ;GET END OF LIST TRNE T3,-1 JRST .-3 ;NOT YET MOVEM T1,(T2) JRST POPJP
SUBTTL	DISPATCH TABLE FOR KEY WORDS
DEFINE KEYTBL (K)<
 IRP K,<
  DEFINE KEYMAC (A,B)<
   IFIDN <K><A>,<
    IRP B,<			;GET FIRST AS DEFAULT
     EXP $'A'B			;START TABLE
     STOPI			;RESET
    >
    A'TBL:
    IRP B,<
     EXP $'A'B
  >>>
  KEYWORDS
>>
XALL
KEYTBL	<CPU,DEF,HYL,MAP,MPS,SYM,SYS,VER>
SALL
DEFINE X(A,B,C,D)<		;;[1225] ALLOW FOR EXTRA ARG
	EXP	$LIB'B
>
	XALL			;[1203] EXPAND LISTING
	EXP	$LIBDEFAULT	;[1203] -1 ENTRY
LIBTBL:	PROCESSORS		;[1203] GET LIB TABLE
	SALL			;[1203] BACK TO NORMAL
$LIBANY==$LIBDEFAULT
SUBTTL	SWITCH ACTION -- /CONTENTS:key
%CONTENT:
	CAIN	T2,1		;DEFAULT VALUE?
	JRST	[MOVE	T1,CONTAB	;YES, GET IT
		MOVEM	T1,MAPCON	;SET IT
		POPJ	P,]		;AND RETURN
	ROT	T2,-1		;CUT IN HALF
	MOVE	T1,CONTAB(T2)	;GET SWITCH TO CHANGE
	JUMPL	T2,[ANDCAM T1,MAPCON	;UNSET
		POPJ	P,]
	IORM	T1,MAPCON	;SET
	POPJ	P,
DEFINE  KEYMAC (A,B)<
 IFIDN <A><CON>,<
  IRP B,<
   IFN %%&1,<
    C%'B
   >
   %%==%%+1
>>>
	%%==0			;INITIAL VALUE
	XALL
CONTAB:	C%DEFAULT		;DEFAULT VALUE IS FIRST
	KEYWORDS
	SALL
	PURGE	%%
SUBTTL SWITCH ACTION -- /DEFAULT ;NOTE: THIS SWITCH MUST BE LAST EXECUTED ;IF IT IS NOT, RECHAIN SWITCHES SO THAT IT IS ;DEFERED SWITCHES WILL NOT BE EXECUTED ;THEREFORE /SKIP ETC. WILL HAVE NO EFFECT ;CONTROL FINALLY RETURNS TO LNKFIO TO GET NEXT FILE SPEC. .DEFAULT: POP P,T1 ;REMOVE RETURN ADDRESS HRRZ T2,(P2) ;GET NEXT LINK HRLM T2,F.SWP(P1) ;LINK IN EXCH P2,T2 ;SETUP TO XCT NEXT SWITCH HLLZS (T2) ;CLEAR LINK ADDRESS MOVEI T3,F.SWP(P1) ;ADDRESS OF RIGHT HALF CHAIN MOVE T1,T3 ;SAVE LAST HRRZ T3,(T1) ;GET NEXT ADDRESS JUMPN T3,.-2 ;LOOP TIL END OF CHAIN HRRM T2,(T1) ;LINK IN JUMPN P2,XCTGSW ;XCT NEXT GLOBAL SWITCH IF ANY POPJ P, ;OTHERWISE RETURN %DEFAULT: POP P,T1 ;REMOVE RETURN ADDRESS HRRZ T2,(P2) ;GET NEXT ADDRESS IN CHAIN HRRM T2,F.SWP(P1) ;LINK IN JUMPE T2,DEFAULT ;LAST IF ZERO EXCH P2,T2 ;SETUP TO XCT NEXT SWITCH HLLZS (T2) ;CLEAR LINK ADDRESS HRRZ T3,P2 ;GET CURRENT LINK ADDRESS MOVE T1,T3 ;SAVE LAST HRRZ T3,(T1) ;GET NEXT ADDRESS JUMPN T3,.-2 ;LOOP TIL END OF CHAIN HRRM T2,(T1) ;LINK LAST IN JRST XCTLSW ;AND XCT FIRST SWITCH IN CHAIN DEFAULT: MOVE T2,2(P2) ;LOAD T2 FROM VALUE AGAIN JRST @DEFTBL-1(T2) ;DISPATCH TO RIGHT FUNCTION
;DEFAULT $DEFINPUT: HLLZM FL,FLAGS ;SAVE AS DEFAULT GLOBAL FLAGS MOVE T2,F.MOD(P1) ;GET MODIFIER WORD MOVE T1,F.DEV(P1) ;GET NEW DEVICE TXNN T2,FX.NDV ;IGNORE NULL DEVICE (DSK BY DEFAULT) MOVEM T1,G.DEV SKIPN T1,F.NAME(P1) ;NEW FILE? JRST .+4 ;NO MOVEM T1,G.NAM MOVE T1,F.NAMM(P1) ;AND MASK MOVEM T1,G.NAMM MOVE T1,F.EXT(P1) ;EXT AND MASK TXNN T2,FX.NUL ;IGNORE NULL BUT SET ZERO IF FILE. MOVEM T1,G.EXT SKIPN T1,F.BFR(P1) ;/BEFORE? MOVEM T1,G.BFR SKIPN T1,F.SNC(P1) ;/SINCE MOVEM T1,G.SNC TXNN T2,FX.DIR ;DIRECTORY JRST [MOVE T2,F.MODM(P1) ;NO, BUT MIGHT BE [-] TXNN T2,FX.DIR ;IF THIS BIT SET JRST DEFRET ;NO, LEAVE [DIR] AS IT WAS SETZM G.DIR ;CLEAR FIRST WORD MOVE T1,[G.DIR,,G.DIR+1] JRST DFIBLT] ;AND FULL PATH MOVE T1,F.DIR(P1) ;GET PROPOSED PPN TLNN T1,-1 ;PROJECT SPECIFIED? HLL T1,MYPPN ;NO, USE DEFAULT TRNN T1,-1 ;PROGRAMMER? HRR T1,MYPPN ;NO, DEFAULT IT. MOVEM T1,F.DIR(P1) ;AND RESTORE PROPOSED PPN MOVSI T1,F.DIR(P1) ;FROM ... HRRI T1,G.DIR ;...TO DFIBLT: BLT T1,G.DIR+2*LN.DRB-1 ;UNTIL JRST DEFRET ;ALL DONE
$DEFOUTPUT: MOVE T2,F.MOD(P1) ;GET MODIFIER WORD MOVE T1,F.DEV(P1) ;GET NEW DEVICE TXNN T2,FX.NDV ;IGNORE NULL DEVICE (DSK BY DEFAULT) MOVEM T1,O.DEV SKIPN T1,F.NAME(P1) ;NEW FILE? JRST .+4 ;NO MOVEM T1,O.NAM MOVE T1,F.NAMM(P1) ;AND MASK MOVEM T1,O.NAMM MOVE T1,F.EXT(P1) ;EXT AND MASK TXNN T2,FX.NUL ;IGNORE NULL BUT SET ZERO IF FILE. MOVEM T1,O.EXT SKIPN T1,F.BFR(P1) ;/BEFORE? MOVEM T1,G.BFR SKIPN T1,F.SNC(P1) ;/SINCE MOVEM T1,G.SNC TXNN T2,FX.DIR ;DIRECTORY JRST [MOVE T2,F.MODM(P1) ;NO, BUT MIGHT BE [-] TXNN T2,FX.DIR ;IF THIS BIT SET JRST DEFRET ;NO, LEAVE [DIR] AS IT WAS SETZM O.DIR ;CLEAR FIRST WORD MOVE T1,[O.DIR,,O.DIR+1] JRST DFOBLT] ;AND FULL PATH MOVE T1,F.DIR(P1) ;GET PROPOSED PPN TLNN T1,-1 ;PROJECT SPECIFIED? HLL T1,MYPPN ;NO, USE DEFAULT TRNN T1,-1 ;PROGRAMMER? HRR T1,MYPPN ;NO, DEFAULT IT. MOVEM T1,F.DIR(P1) ;AND RESTORE PROPOSED PPN MOVSI T1,F.DIR(P1) ;FROM ... HRRI T1,O.DIR ;...TO DFOBLT: BLT T1,O.DIR+2*LN.DRB-1 ;UNTIL ; JRST DEFRET ;ALL DONE DEFRET: SETOM NULSPC ;FAKE NULL BLOCK POPJ P, ;RETSPC WILL RETURN IT
SUBTTL MAP SORTING $MPSALPHABETICAL: $MPSNUMERICAL: E$$MSN::.ERR. (MS,0,V%L,L%W,S%W,MSN,<Map sorting not yet implemented>) ;[1174] $MPSUNSORTED: POPJ P, ;SYMBOL SORTING $SYSALPHABETICAL: $SYSNUMERICAL: E$$SSN::.ERR. (MS,0,V%L,L%W,S%W,SSN,<Symbol table sorting not yet implemented>) ;[1174] $SYSUNSORTED: POPJ P,
SUBTTL ERROR MESSAGES E$$ZSV::.ERR. (MS,0,V%L,L%W,S%W,ZSV,<Zero switch value illegal>) ;[1174] POPJ P, E$$USI::.ERR. (MS,.EC,V%L,L%F,S%B,USI,<Undefined symbol >) ;[1174] .ETC. (SBX,.EC!.EP,,,,W2) ;[1174] .ETC. (STR,.EC,,,,,< illegal in switch />) ;[1174] .ETC. (STR,.EP,,,,T1) ;[1174] POPJ P, ;[1174] RETURNS IF NOT BATCH IFN FTFRK2,< ; [1442] New error messages involved in extended addressing support. E$$NHN::.ERR. (MS,,V%L,L%F,S%F,NHN,<No High Segment in Nonzero Section>) POPJ P, E$$ISR::.ERR. (MS,,V%L,L%F,S%F,ISR,<Insufficient System Resources>) POPJ P, E$$ESP::.ERR. (MS,,V%L,L%F,S%F,ESP,<Extend switch must precede program load>) POPJ P, > ;[1442] IFN FTFRK2
SUBTTL THE END WLDLIT: END