TITLE LNKMAP - MAP MODULE FOR LINK SUBTTL D.M.NIXON/DMN/SRM/JBC/RKH/JNG/DZN/PAH/PY/HD/RJF 5-Feb-88 ;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION 1973,1986,1988. ; 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 > ;[1414] JSYS DEFINITIONS SALL ENTRY LNKMAP EXTERN LNKFIO,LNKXIT,LNKLOD,LNKLOG,LNKCOR,.TYOCH CUSTVR==0 ;CUSTOMER VERSION DECVER==6 ;DEC VERSION DECMVR==0 ;DEC MINOR VERSION DECEVR==2417 ;DEC EDIT VERSION VERSION SEGMENT SUBTTL REVISION HISTORY ;START OF VERSION 1A ;47 INTEGRATE WITH SCAN %4, ADD DATE75 HACK ;54 ADD KIONLY D.P. INST. ;55 PUT VERSION# IN .RBVER OF MAP FILE ;63 PUT MULTIPLY-DEFINED SYMBOLS IN MAP ;104 PUT FAIL BLOCKS OUT ON MAP ;START OF VERSION 2 ;135 ADD OVERLAY FACILITY ;144 (12772) FIX LOOP IF MORE THAN 1 SFD ;160 (12736) ADD WORDS FREE IN EACH SEGMENT TO MAP OUTPUT ;205 ADD NO. OF GLOBALS AND MIN. HASH SIZE TO MAP OUTPUT ;START OF VERSION 2A ;225 ADD SUPPORT FOR PSECT (MACRO VERSION 51 ONLY) ;START OF VERSION 2B ;304 FIX LOOP IN MAP OUTPUT ;344 INCLUDE EDIT 304 IN MAINTENANCE SOURCES ;353 REMOVE EDIT 225 ;363 UPDATE MINOR VERSION # ;372 Don't print an overlay path on /MAP:NOW ;START OF VERSION 2C ;452 Don't print the module name as the only line on a new page ;453 Don't repeat module names if map index is longer than one page. ;463 Fix ?ILL UUO and lost symbols on /MAP:NOW ;475 Replace calls to .TYVER with calls to .TVERW ;503 Make pages LN.LPP lines long, not LN.LPP+1. ;507 Avoid informational messages in map when using /ERR:0. ;530 Get triplet flag bit definitions right. ;532 Fix problems with title when paging heavily. ;540 Detect all cases of zero length modules correctly. ;557 Clean up the 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 ;601 Print the correct version if from /VERSION ;604 Support device NUL: correctly ;611 Support COBOL-74 ;640 Avoid additional disk overflow if possible. ;711 Fix bug in MAP when only 1 psect in a module. ;731 SEARCH MACTEN,UUOSYM instead of C. ;765 Release on both TOPS-10 and TOPS-20 as LINK version 4(765) ;START OF VERSION 5I ;1000 Long symbol name support ;START OF VERSION 4A ;1100 Don't free up a different size title buffer than we allocated. ;1112 Get words free and segment lengths in K/P right in the map. ;1120 Pring correct CPU specifications in the map for module and program. ;1161 Clean up printout of PSECT lengths. ;1164 Don't overwrite FX area in SHFSYM if no extra room. ;1174 Label and clean up all error messages. ;1203 Add support for extended FORTRAN. ;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 Account for extra argument to X macro in PROCESSORS macro. ;1322 Remove a HALT instruction, handle the case properly. ;START OF VERSION 5 ;1400 Use OVRPAR.MAC. ;1414 Add code to read native overflow file at RDVER1. ;START OF VERSION 5.1 ;1515 Remove code at TTLSRC that causes symbol typeout for empty modules. ;1533 Do not BLT LS overflow file to zero - PMAP it out instead. ;1535 Don't EXIT if /MAP:ERR seen -- return to LNKLOG instead. ;1540 Fix another case of the overflow file being zeroed. ;1541 Handle more than 400000 words of local symbols in an overlay ;1752 Have map file state if an overlay is relocatable, absolute, or writable ;2026 Update copyright and clean up listings. ;Start of version 6 ;2202 Use 30 bit addresses in calls for xx.IN and xx.OUT. ;2215 Unmap LS pages, fix off by one in 2202, don't BLT unmapped pages. ;2216 Type long symbols in the map correctly. ;2220 Type large psects and long psect and common block names correctly. ;2254 Handle new format of title segment block correctly. ;2354 Make long symbols and T1003 blocks work. ;2375 Fix bug in SHFSYM when making symbol table. ;2403 New corporate copywrite statement. ;2413 Fix map of psects if LS area paging. ;2417 Update copywrite statement to 1988. SUBTTL HEADER LINES LNKMAP: JFCL .+1 ;INCASE CCL E$$MPS::.ERR. (MS,0,V%L,L%I,S%I,MPS,) ;[1174] ZAPTMP ;CLEAR DATA AREA SETOM LS.PP ;PROHIBIT DEFAULT PAGING OF SYMBOL TABLE AOS SYMPTR ;SKIP INITIAL ZERO PUSHJ P,RDVER ;SET UP VERSION # IN MAPVER MOVEI T1,MC ;SET IO.CHN MOVEM T1,IO.CHN ;TO MAP CHAN# MOVE T1,IO.PTR+MC ;GET DATA BLOCK SKIPN T2,VERNUM ;GET VERSION FROM SWITCH SKIPA T2,MAPVER ;[601] NO SWITCH, GET VERSION FROM CORE MOVEM T2,MAPVER ;[601] STORE /VERSION FOR MAP TITLE SKIPN I.VER(T1) ;BUT NOT IF SET IN FILE MOVEM T2,I.VER(T1) ;PUT IN .RBVER SKIPN T2,I.NAM(T1) ;GET USER OR DEFAULT NAME PUSHJ P,DVNAM.## ;SET DEFAULT MOVEM T2,MAPNAM ;FOR HEADER INFO PUSHJ P,DVCHK.## ;GET DEVCHR AGAIN MOVE T2,IO.CHR ;GET DEVCHR WORD TLC T2,-1-<(DV.TTA)> ;[604] NUL: ISN'T A TTY TLCE T2,-1-<(DV.TTA)> ;[604] TXNN T2,DV.TTY ;[604] IF TTY CAIA ;[604] IT ISN'T JRST .+3 ;IGNORE INIT & ENTER PUSHJ P,DVOPN.## ;OPEN MAP DEVICE PUSHJ P,DVENT.## ;AND ENTER FILE NAME HRRZ T1,LOWSUB ;[604] ASSUME TTY IS MAP DEVICE MOVE T2,IO.PTR+MC ;[604] GET POINTER BACK SKIPE I.RNG(T2) ;[604] ARE THERE SOME BUFFERS MOVEI T1,MAPIT ;[604] YES, POINT TO SOSGE ROUTINE PUSHJ P,.TYOCH## ;INIT OUTPUT MOVEM T1,OLDDEV ;SAVE OLD .TYOCH RETURN INCASE ERROR MOVEI T1,LN.LPP ;NO OF LINES PER PAGE MOVEM T1,CNTLPP ;HERE WITH MAP FILE OPEN. PRINT HEADER LINES. LNKMP1: MOVEI T1,HEAD1 ;NORMAL HEADER MOVEM T1,PAGHDR ;FOR PAGES PUSHJ P,.TYHDR ;TYPE HEADER LINE MOVEI T1,HEAD2 PUSHJ P,.TSTRG## MOVE T2,HIORGN ;[650] GET HISEG ORIGIN MOVSI T1,. ;FIND OUT WHERE WE ARE SKIPL T1 ;SHOULD BE IN HIGH SEG SKIPA T1,.JBVER ;NO, GET LOW VERSION MOVE T1,.JBHVR(T2) ;[650] HIGH SEG VER PUSHJ P,.TVERW## ;TYPED IN VERSION FORMAT MOVEI T1,[ASCIZ \ on \] PUSHJ P,.TSTRG## PUSHJ P,.TDATN## ;DAY MOVEI T1,[ASCIZ \ at \] PUSHJ P,.TSTRG## PUSHJ P,.TTIMN## ;TIME PUSHJ P,.TYLPP ;END LINE PUSHJ P,.TYLPP ;BLANK LINE SETZ R1, ;NOW FOR PER-SEGMENT STUFF IFN FTOVERLAY,< AOS FSTPGN ;INCASE NO OVERLAYS, START ON PAGE 1 SKIPGE T2,LNKMAX ;ANY OVERLAYS? JRST SEGSTF ;NO LSH T2,-1 ADDI T2,1 ;TAKE CARE OF ODD# PUSHJ P,LOGBCK ;PUT MOVING LOWSEG MSGS IN LOG PUSHJ P,DY.GET## ;GET SPACE FOR NO. INDEX HRLI T1,T1 ;PUT T1 IN INDEX FIELD MOVEM T1,OVMIDX PUSHJ P,LOGBCK ;REST OF INFO IN MAP SETZM LNKNO. ;START AT LINK# 0 JRST OVMAP1 OVMAP0: SETZM CNTLPP ;START ON NEW PAGE MOVEI T1,HEAD1 ;RESET HEADER LINE MOVEM T1,PAGHDR PUSHJ P,.TYLPP ;NEW PAGE & HEADER LINE MOVEI T1,1 MOVEM T1,SYMPTR ;RESET SYMBOL PTR OVMAP1: MOVE P1,LNKNO. PUSHJ P,LOGBCK ;MAKE SURE ERRORS GET TO TTY PUSHJ P,RDCST## ;READ THE PREAMBLE & CS FOR THIS LINK JFCL ;NEITHER EXTTAB NOR INTTAB PUSHJ P,LOGBCK ;PUT LOG INFO OUT TO LOG MOVE T1,OV.S1 ;LENGTH HRRM T1,HL.S1 ;SO BOUNDS COME OUT RIGHT MOVEI T1,[ASCIZ \ Overlay no. \] PUSHJ P,.TSTRG## MOVE T1,LNKNO. ;GET THIS ONE PUSHJ P,.TDECW## ;LIST IN DECIMAL SKIPN PH+PH.NAM ;[1400] SEE IF NAME JRST OVMAP2 ;NO MOVEI T1,[ASCIZ \ name \] PUSHJ P,.TSTRG## MOVE T1,PH+PH.NAM ;[1400] GET NAME PUSHJ P,.TSIXN## ;IN SIXBIT OVMAP2: PUSHJ P,.TYLPP MOVEI T1,[ASCIZ/ Overlay is /] ;[1752] PUSHJ P,.TSTRG## ;[1752] MOVE W1,OVERLW ;[1752] GET FLAGS TXNE W1,$OVRELOCATABLE ;[1752] IS OVERLAY RELOCATABLE PUSHJ P,RELMAP ;[1752] YES - SAY SO IN MAPFILE TXNN W1,$OVRELOCATABLE ;[1752] IS IT ABSOLUTE? PUSHJ P,ABMAP ;[1752] YES - THEN PUT IN IN MAPFILE TXNE W1,$OVWRITABLE ;[1752] IS IT WRITABLE? PUSHJ P,WRTMAP ;[1752] YES - SAY SO IN THE MAPFILE PUSHJ P,.TYLPP ;[1752] ;SEGMENT LENGTHS SETZ R1, ;MAKE SURE R IS CORRECT SGSTF0: PUSHJ P,.TTABC## MOVEI T1,SEG0(R1) PUSHJ P,.TSTRG## MOVEI T1,SEG1 PUSHJ P,.TSTRG## HRRZ T1,PV.S1(R1) ;STARTS AT PUSHJ P,.T6OCT## MOVEI T1,SEG2 PUSHJ P,.TSTRG## HRRZ T1,OV.S1(R1) ;ENDS AT SKIPE T1 SUBI T1,1 ;ONE LESS THAN PROG BREAK ; ADD T1,LL.S1(R1) ;DON'T FORGET OFFSET PUSHJ P,.T6OCT## MOVEI T1,SEG3 PUSHJ P,.TSTRG## HRRZ T1,OV.S1(R1) HRRZ T2,PV.S1(R1) ;PREVIOUS SUB T1,T2 ;DIFFERENCE PUSH P,T1 ;SAVE IT PUSHJ P,.T6OCT## ;LENGTH IN OCTAL MOVEI T1,[ASCIZ \ = \] PUSHJ P,.TSTRG## POP P,T1 ;LENGTH BACK ADD. T1,.PGSIZ ;[1112] ROUND UP TO NEXT PAGE BOUND ANDCM. T1,.PGSIZ ;[1112] .. IFE TOPS20,< MOVE T2,.PGSIZ ;[1112] GET THIS SYSTEM'S PAGE SIZE CAIE T2,777 ;PAGES? JRST [LSH T1,-^D10 ;K PUSHJ P,.TDEC3 ;IN DECIMAL MOVEI T1,"K" JRST SGSTF1] >;END OF IFE TOPS20 LSH T1,-^D9 ;P PUSHJ P,.TDEC3 ;IN DECIMAL MOVEI T1,"P" SGSTF1: PUSHJ P,.TCHAR## PUSHJ P,.TYLPP JUMPN R1,OVMP2A ;DONE HIGH SEG ALREADY? HRRZ T1,OV.S2 ;NO, BUT IS THERE ANY HIGH SEGMENT? HRRZ T2,PV.S2 SUB T1,T2 SKIPE T1 ;NO AOJA R1,SGSTF0 ;NOW FOR HIGH SEG OVMP2A: MOVEI T1,[ASCIZ \ Control Block address is \] PUSHJ P,.TSTRG## HRRZ T1,PH+PH.CST ;[1400] PUSHJ P,.T6OCT## MOVEI T1,[ASCIZ \, length \] PUSHJ P,.TSTRG## HLRE T1,CS+CS.INT ;[1400] LENGTH OF INTTAB JUMPE T1,[HLRE T1,CS+CS.EXT ;[1400] JUMPE T1,OVMAP4 ;NEITHER IMUL T1,[-ET.LEN] ;[1400] GET LENGTH ADD T1,CS+CS.EXT ;[1400] PLUS START JRST OVMAP3] IMUL T1,[-2] ;2 WORDS PER INTTAB ADD T1,CS+CS.INT ;[1400] OVMAP3: SUB T1,PH+PH.CST ;[1400] - START TLZA T1,-1 ;RIGHT HALF ONLY OVMAP4: MOVEI T1,CS.LEN ;[1400] USE LENGTH OF CS ONLY PUSH P,T1 ;SAVE IT PUSHJ P,.T6OCT## ;LIST IN OCTAL MOVEI T1,[ASCIZ \ (octal), \] PUSHJ P,.TSTRG## POP P,T1 PUSHJ P,.TDECW## ;AND IN DECIMAL MOVEI T1,[ASCIZ \. (decimal)\] PUSHJ P,.TSTRG## PUSHJ P,.TYLPP HLRO P2,PH+PH.SYM ;[1541] LENGTH WE NEED MOVM P2,P2 SUB P2,LS.AB ;SEE IF ENOUGH ADD P2,LS.LB JUMPLE P2,OVMAP5 ;YES PUSHJ P,LOGBCK ;PUT INFO MESSAGES TO LOG FILE MOVEI P1,LS.IX PUSHJ P,LNKCOR## PUSHJ P,E$$MEF## ;[1174] PUSHJ P,LOGBCK ;BUT ALL OTHERS IN MAP OVMAP5: MOVEI T1,$MAPNOW ;GET /MAP:NOW CAME T1,MAPSW ;SKIP PATH IF SO (NOT SET UP) SKIPN LNKNO. ;LIST PATH FOR ALL BUT ROOT JRST OVMAP6 MOVEI T1,[ASCIZ \ Path is \] PUSHJ P,.TSTRG## MOVE T1,PH+PH.FPT ;[1400] GET PATH POINTER USETI OC,(T1) ;SET ON BLOCK HLRZ P1,T1 ;GET WORD NUMBER ADD P1,LS.LB ;WHERE IN CORE HRLI P1,(POINT 18) ;1/2 WORDS ;FORM IOWD AND READ IN PATH INFO FOR PRINTING MOVE T1,LS.LB SUBI T1,1 HRLI T1,-.DBS ;[650] FORM IOWD SETZ T2, IN OC,T1 CAIA PUSHJ P,[PUSHJ P,LOGBCK ;ERRORS TO TTY PJRST E$$IOV##] ;[1174] GO REPORT INPUT ERROR ILDB T1,P1 ;GET FIRST # PUSHJ P,.TDECW## ;AUGHT TO BE 0 BUTB MUST PRINT IT OVMP5A: ILDB T1,P1 ;GET NEXT JUMPE T1,OVMP5B ;DONE MOVEI T1,[ASCIZ \, \] PUSHJ P,.TSTRG## ;SEPARATOR LDB T1,P1 ;GET # BACK PUSHJ P,.TDECW## JRST OVMP5A ;GET NEXT OVMP5B: PUSHJ P,.TYLPP ;END LINE OVMAP6: MOVE T1,PH+PH.SYM ;[1400] GET BLOCK# OF SYMBOLS USETI OC,(T1) ;SET ON IT MOVE T1,LS.LB ;FORM IOWD TO READ IN SYMBOLS SUBI T1,1 HLL T1,PH+PH.SYM ;[1400] EVENTUALLY SETZB T2,USYM JUMPL T1,OVMAP7 ;[1541] ACCEPTABLE IOWD? PUSH P,T1 ;[1541] NO, SAVE THE IOWD HRLI T1,400000 ;[1541] READ IN FIRST 400K IN OC,T1 ;[1541] GET FIRST CHUNK SKIPA ;[1541] OK PUSHJ P,[PUSHJ P,LOGBCK ;[1541] ERRORS TO TTY PJRST E$$IOV##] ;[1541] INPUT ERROR POP P,T1 ;[1541] GET BACK ORIGINAL IOWD ADD T1,[400000,,400000] ;[1541] UPDATE IT OVMAP7: IN OC,T1 ;[1541] GET THE SYMBOLS SKIPA T1,LNKNO. ;OK PUSHJ P,[PUSHJ P,LOGBCK ;ERRORS TO TTY PJRST E$$IOV##] ;[1174] INPUT ERROR ROT T1,-1 ;USUAL WAY TO ADDRESS 1/2 WORD MOVE T2,PAGENO ;PAGE # OF FIRST MODULE INCASE NO INDEX MOVEM T2,FSTPGN ;SO WE CAN SEE IF INDEX REQUIRED JUMPL T1,[HRRM T2,@OVMIDX JRST .+2] HRLM T2,@OVMIDX MOVE T1,LS.LB ADD T1,LSYM ;NEXT FREE LOCATION SETZM (T1) ;CLEAR UP TO END OF LS.AB WITH A BLT HRLZI T2,0(T1) HRRI T2,1(T1) BLT T2,@LS.AB IORI T1,.IPM MOVEM T1,LS.AB ;GIVE BACK EXCESS SPACE JRST SEGDN ;MESSAGES TO TELL IF OVERLAY IS RELOCATABLE, ABSOLUTE, WRITABLE ;THEY ARE PRINTED IN THE MAP FILE. RELMAP: MOVEI T1,[ASCIZ/relocatable/] ;[1752] PUSHJ P,.TSTRG## ;[1752] POPJ P, ;[1752] ABMAP: MOVEI T1,[ASCIZ/absolute/] ;[1752] PUSHJ P,.TSTRG## ;[1752] POPJ P, ;[1752] WRTMAP: MOVEI T1,[ASCIZ/, writable/] ;[1752] PUSHJ P,.TSTRG## ;[1752] POPJ P, ;[1752] >;END OF IFN FTOVERLAY ;SEGMENT LENGTHS SEGSTF: PUSHJ P,.TTABC## MOVEI T1,SEG0(R1) PUSHJ P,.TSTRG## MOVEI T1,SEG1 PUSHJ P,.TSTRG## MOVE T1,LL.S1(R1) ;STARTS AT PUSHJ P,.T6OCT## MOVEI T1,SEG2 PUSHJ P,.TSTRG## SKIPE T1,HL.S1(R1) ;ENDS AT SUBI T1,1 ;ONE LESS THAN PROG BREAK ADD T1,LL.S1(R1) ;DON'T FORGET OFFSET PUSHJ P,.T6OCT## MOVEI T1,SEG3 PUSHJ P,.TSTRG## MOVE T1,HL.S1(R1) PUSH P,T1 PUSHJ P,.T6OCT## ;LENGTH IN OCTAL MOVEI T1,[ASCIZ \ = \] PUSHJ P,.TSTRG## POP P,T1 ;GET BACK LENGTH ADD. T1,.PGSIZ ;[1112] ROUND UP TO NEXT PAGE BOUND ANDCM. T1,.PGSIZ ;[1112] .. IFE TOPS20,< MOVE T2,.PGSIZ ;[1112] GET THIS SYSTEM'S PAGE SIZE CAIE T2,777 ;PAGES? JRST [LSH T1,-^D10 ;K PUSHJ P,.TDECW## ;IN DECIMAL MOVEI T1,"K" JRST SGSTF2] >;END OF IFE TOPS20 LSH T1,-^D9 ;P PUSHJ P,.TDECW## ;IN DECIMAL MOVEI T1,"P" SGSTF2: PUSHJ P,.TCHAR## PUSHJ P,.TYLPP SKIPN R1 ;DONE HIGH SEG ALREADY? SKIPN HL.S2 ;NO, BUT IS THERE ANY HIGH SEGMENT? JRST SEGDN ;NO AOJA R1,SEGSTF ;NOW FOR HIGH SEG ;HERE TO READ THE VERSION NUMBER IN USER LOC .JBVER RDVER: IFN FTOVERLAY,< SKIPGE LNKMAX ;ANY OVERLAYS? JRST RDVER1 ;NO PUSHJ P,LOGBCK ;I/O ERRORS TO TTY SETZB P1,LNKNO. ;NEED LINK# 0 IN CORE PUSHJ P,INPH## ;GET PREAMBLE MOVE T1,PH+PH.OVL ;[1400] BLOCK# OF JOBDAT USETI OC,(T1) ;SET ON IT MOVE T1,LC.LB SUBI T1,1 HRLI T1,-.DBS ;[650] READ FIRST BLOCK SETZ T2, IN OC,T1 SKIPA T1,.JBVER+1(T1) ;GET VERSION# PUSHJ P,E$$IOV## ;[1174] INPUT ERROR MOVEM T1,MAPVER PJRST LOGBCK ;PUT ALL MAP INFO IN MAP RDVER1: >;END OF IFN FTOVERLAY SKIPE PAG.S1 ;IF PAGING LOW SEG SKIPN LW.S1 ;AND JOBDAT NOT IN CORE JRST [MOVE T1,LC.LB ;GET START OF LOW AREA MOVE T1,.JBVER(T1) ;GET VERSION# MOVEM T1,MAPVER ;SAVE FOR HEADER LINE POPJ P,] ;RETURN PUSHJ P,LOGBCK ;[LNKEXP] MESSAGES TO TTY IFE TOPS20,< MOVEI T2,.JBDA ;NEED 140 WORDS PUSHJ P,DY.GET## ;TO HOLD JOBDAT SUBI T1,1 ;IOWD STARTS 1 BACK HRLI T1,-140 ;NO OF WORDS SETZ T2, ;TERMINATE LIST USETI LC,1 ;TO READ BLOCK 1 IN LC,T1 ;FOR FIRST 140 WORDS JRST [MOVEI T1,1(T1) ;INCR T1 MOVE T2,.JBVER(T1) ;GET VERSION # MOVEM T2,MAPVER ;SAVED MOVEI T2,.JBDA ;NOW TO RESTORE BLOCK PUSHJ P,DY.RET## ;RETURN THE CORE PJRST LOGBCK] ;AND .TYOCH AND RETURN PUSHJ P,LOGBCK ;MAKE SURE USER GETS MESSAGE E01ILC::PUSH P,[LC] ;[1174] CHAN # .ERR. (ST,,V%L,L%F,S%F,ILC) > ;[1414] IFE TOPS20 IFN TOPS20,< MOVEI T2,3*.IPS ;[1414] 3*.IPS INSURES ONE FULL PAGE PUSHJ P,DY.GET ;[1414] PUSH P,T1 ;[1414] SET ASIDE PTR TO IT ADDI T1,.IPS-1 ;[1414] FIND FIRST FULL PAGE LSH T1,-9 ;[1414] ... HRLI T1,.FHSLF ;[1414] PROCESS IS SELF MOVE T2,T1 ;[1414] ... HRLZ T1,LC.JF ;[1414] FILEJFN,,PAGE 0 MOVE T3,[PM%RWX] ;[1414] MOVE ONE PAGE FOR READING PMAP% ;[1414] ERJMP [ POP P,0(P) JRST E$$ILC## ] ;[1414] CAN'T DO IT PUSH P,T2 ;[1414] SAVE SELF,,PROCESSPAGE HRLZS T2 ;[1414] GET ADDRESS AGAIN LSH T2,9 ;[1414] ... MOVE T1,.JBVER(T2) ;[1414] FETCH VERSION NUMBER MOVEM T1,MAPVER ;[1414] STORE IT AWAY POP P,T2 ;[1414] UNMAP THE FILE PAGE SETOM T1 ;[1414] ... PMAP% ;[1414] ERJMP [ POP P,0(P) JRST E$$ILC ] ;[1414] CURSES POP P,T1 ;[1414] AREA TO GIVE BACK MOVEI T2,3*.IPS ;[1414] ... PUSHJ P,DY.RET ;[1414] ... JRST LOGBCK ;[1414] > ;[1414] IFN TOPS20 SEGDN: PUSHJ P,.TTABC## MOVE T1,HL.S1 ;GET LOW SEG BREAK ADD. T1,.PGSIZ ;[1112] ROUND UP TO NEXT P OR K ANDCM. T1,.PGSIZ ;[1112] .. SUB T1,HL.S1 ;FIND WHATS LEFT PUSHJ P,.TDECW## ;PRINT IN DECIMAL MOVEI T1,[ASCIZ \ words free in Low segment\] PUSHJ P,.TSTRG## SKIPN HL.S2 ;ANY HIGH SEGMENT JRST SEGDN1 ;NO, CLOSE OUT LINE MOVEI T1,[ASCIZ \, \] PUSHJ P,.TSTRG## ;SEPARATE MOVE T1,HL.S2 ;SAME FOR HIGH SEG ADD. T1,.PGSIZ ;[1112] ROUND UP TO NEXT P OR K ANDCM. T1,.PGSIZ ;[1112] .. SUB T1,HL.S2 PUSHJ P,.TDECW## MOVEI T1,[ASCIZ \ words free in high segment\] PUSHJ P,.TSTRG## SEGDN1: PUSHJ P,.TYLPP PUSHJ P,.TTABC## ;TAB OUT MOVE T1,GSYM ;NO. OF GLOBALS IFN FTOVERLAY,< ADD T1,BSYM ;PLUS BOUND SYMBOLS > PUSHJ P,.TDECW## ;PRINT NO. MOVEI T1,[ASCIZ \ Global symbols loaded, therefore min. hash size is \] PUSHJ P,.TSTRG## MOVE T1,GSYM ;NO. OF SYMBOLS IFN FTOVERLAY,< ADD T1,BSYM ;PLUS BOUND SYMBOLS > IMULI T1,^D100 IDIVI T1,.HS% ;HOW MUCH SPACE WE WILL NEED TO AVOID REHASH ADDI T1,1 ;JUST INCASE A PRIME NO. PUSHJ P,.TDECW## PUSHJ P,.TYLPP ;CLOSE LINE SKIPN STADDR ;IS THERE A STARTING ADDRESS JRST NOSTAD ;NO MOVEI T1,[ASCIZ \ Start address is \] PUSHJ P,.TSTRG## HRRZ T1,STADDR ;GET IT PUSHJ P,.T6OCT## SKIPN T1,STANAM ;[2354] NAME OF PROG CONTAINING ST ADDR. JRST TTLDN ;NONE, OR SET BY SWITCH TLNN T1,770000 ;[2354] Is it a long name? JRST LNGNM ;[2354] Yes MOVEI T1,[ASCIZ \, located in program \] PUSHJ P,.TSTRG## MOVE T1,STANAM ;PROGRAM NAME PUSHJ P,.TSIXN## PUSHJ P,.TYLPP JRST TTLDN NOSTAD: IFN FTOVERLAY,< SKIPL LNKMAX ;ANY OVERLAYS SKIPN LNKNO. ;YES, BUT NOT ROOT CAIA JRST TTLDN ;DON'T GIVE MESSAGE TO OTHER LINKS > MOVEI T1,[ASCIZ \ No start address\] PUSHJ P,.TSTRG## PUSHJ P,.TYLPP TTLDN: SKIPL NOSYMS ;USER SET FOR NO SYMBOLS SKIPN LS.LB ;OR NOTHING YET STORED? JRST NOMAP ;EITHER WAY PUSHJ P,SYMINI ;GET SYMBOL TABLE RE-INITIALIZED SKIPN T2,PRGNO ;GET NUMBER OF MODULE NAMES JRST TTLSRT ;NO MODULES LOADED YET MOVEM T2,MDLCNT ;HELPS TO TRAP ERRORS LSH T2,1 ;2 WORDS PER ENTRY PUSHJ P,LOGBCK ;LNKMOV MESSAGES TO LOG FILE PUSHJ P,DY.GET## ;GET SPACE TO HOLD INDEX MOVEM T1,MDLIDX ;START OF IT HRLI T1,(POINT 36) ;FORM BYTE PTR MOVEM T1,MDLPTR ;TO DEPOSIT NAMES ;AND ADDRESSES PUSHJ P,LOGBCK ;RESET OUTPUT TO MAP FILE TTLSRT: SETZB R2,R1 ;INCASE UNSORTED JRST NXTSYM ;GET NEXT SYMBOL SKIPN T1,NXTTTL ;REL POSITION ON NEXT TITLE MOVE T1,LSYM ;USE END IF LAST SUB T1,SYMPTR ;REMOVE CURRENT POSITION SUB T1,LW.LS ;INCASE ON DSK LSH T1,1 ;NEED 2 WORDS IDIVI T1,.L ;FROM TRIPLET ORIGINALLY ADD T2,T1 ;ACCOUNT FOR REMAINDER? PUSHJ P,LOGBCK ;ANY MESSAGES TO LOG FILE PUSHJ P,DY.GET## ;GET SPACE HRL T1,T2 MOVEM T1,SRTPTR ;STORE START AND SIZE PUSHJ P,LOGBCK ;BACK TO MAP FILE HRLZI T2,(POINT 36) HRR R2,T2 ;BYTE POINTER TO STORE NAMES ETC MOVE R1,MAPSRT ;INDEX TO SORT TYPE ; JRST NXTSYM ;JUMP TO SYMBOL LOOP SUBTTL SYMBOL LOOP NXTSYM: SETZM FAKE ;[2354] Clear fake title flag SETZM CASE ;[2354] Clear case flag SETZM CHRCNT ;[2354] Clear character count of symbol PUSHJ P,GETSYM ;GET FIRST SYMBOL JRST SYMDN ;ALL OVER JRST TTLBLK ;A TITLE BLOCK PUSHJ P,SYMCHK ;SEE IF WE WANT THIS SYMBOL? JRST NXTSYM ;NO JUMPN R2,STRSYM ;JUMP IF SORTING PNTSYM: MOVEM W1,SYFLAG ;SAVE PRIMARY FLAGS MOVE T1,W2 ;FIRST 6 CHARS OF NAME PUSHJ P,GOLC ;[2354] Check case sensitivity and build name MOVEM W3,VALUE ;VALUE OF SYMBOL MOVE T2,SYMPTR ;[2216] GET POINTER ADD T2,LS.LB ;[2216] RELOCATE MOVEM T2,ASTPTR ;[2216] STORE FOR FNDNAS SYMLNG: MOVX T1,S.SYM!S.LNM ;[2220] SEE IF LONG SYMBOL MOVX T4,S.COM ;[2220] STOP IF OTHER SECONDARY TYPE PUSH P,P4 ;[2354] Save the byte pointer to symblk PUSHJ P,FNDNAS ;[2216] LOOK AT THE TRIPLET JRST SYMVAL ;NO POP P,P4 ;[2354] Restore the byte pointer MOVE T1,W2 ;[2354] Get the name word from triplet PUSHJ P,GOLCS ;[2354] Go and build symbol name SKIPE T1,W3 ;[2354] More name words in this triplet? PUSHJ P,GOLCS ;[2354] Yes add them to name in symblk JRST SYMLNG ;SEE IF MORE triplets in name GOLC: MOVE P4,[POINT 7,SYMBLK] ;[2354] Build byte pointer to symblk GOLCS: PUSH P,T2 ;[2354] Save for FNDNAS PUSH P,P1 ;[2354] Save P1 MOVE P2,CASE ;[2354] What case are we currently working with MOVE T2,T1 ;[2354] Symbol to T2 GOLC1: JUMPE T2,GOHOME ;[2354] Anything left? If not then done MOVEI T1,0 ;[2354] Clear T1 LSHC T1,6 ;[2354] Get the next byte CAIN T1,'/' ;[2354] Is it a change of case? JRST GOLCU ;[2354] Yes - go to routine for lower to Upper CAIN T1,'\' ;[2354] Is it a case change? JRST GOLCL ;[2354] Yes - go change case flag ADDI T1," "-' ' ;[2354] Make it ASCII JUMPE P2,GOLC2 ;[2354] Upper case? Yes don't have to convert. CAIL T1,"A" ;[2354] Is it in the A CAILE T1,"Z" ;[2354] To Z range ? CAIA ;[2354] ADDI T1,"a"-"A" ;[2354] Yes - convert to lower case GOLC2: AOS CHRCNT ;[2354] Add one to the count of characters IDPB T1,P4 ;[2354] Store the character in symblk JRST GOLC1 ;[2354] Go back for the next character GOLCL: SETOB P2,CASE ;[2354] Change case flag to 1s for lower case JRST GOLC1 ;[2354] Go back for next character GOLCU: SETZB P2,CASE ;[2354] Change case flag to 0 for upper case JRST GOLC1 ;[2354] Go back for the next character GOHOME: POP P,P1 ;[2354] Restore P1 for FNDAS POP P,T2 ;[2354] Restore for FNDNAS POPJ P, ;[2354] Return SYMVAL: POP P,P4 ;[2354] Restore P4 to clean stack SETZ T1, ;[2354] Put a zero in T1 IDPB T1,P4 ;[2354] Add zero to end of symbol for .TSTRNG PUSHJ P,.FORMT ;[2354] Format output MOVE T1,VALUE PUSHJ P,.TFOCT## ;FULL WORD OCTAL WITH LEADING BLANKS PUSHJ P,.TTABC## MOVE W1,SYFLAG ;[2220] GET THE PRIMARY FLAGS TXNE W1,PS.ENT ;TEST FOR ENTRY POINT JRST ENTSYM ;FOUND ONE TXNE W1,PS.COM ;OR COMMON JRST COMSYM ;BOTH ARE SPECIAL CASES OF GLOBALS TXNE W1,PS.UDF ;UNDEFINED? JRST UDFSYM ;YES TXNE W1,PS.GLB JRST GLBSYM ;NORMAL GLOBAL TXNE W1,PS.LCL ;SHOULD BE LOCAL JRST LCLSYM ;IT WAS RELTST: TXNE W1,PS.MDF ;MULTIPLY-DEFINED? JRST [MOVEI T1,[ASCIZ \Multiply-defined\] JRST TSTFIN] MOVEI T1,[ASCIZ \Relocatable \] TXNN W1,PS.REL ;ASSUME IT WAS RELOCATABLE MOVEI T1,[ASCIZ \Absolute \] PUSHJ P,.TSTRG## ;OUTPUT ONE OR OTHER MOVEI T1,[ASCIZ \Suppressed\] TXNN W1,PS.DDT ;SUPPRESSED? COMRET: MOVEI T1,[ASCIZ \ \] TSTFIN: PUSHJ P,.TSTRG## ;YES CAIG T2,^D9 ;[2354] Are there more than 9 characters? SKIPE FRSTSY ;[2354] Is it the 1st or 2nd symbol of the line PUSHJ P,.TYLPA ;[2354] More than 9 chars or 2nd sym - end line SETCMM FRSTSY ;[2354] Toggle for 1st or 2nd symbol ENDSYM: JUMPE R2,NXTSYM ;IF NOT SORTING, NOW FOR NEXT POPJ P, ;SORTING .FORMT: MOVE T2,CHRCNT ;[2354] Get the character count SKIPE FRSTSY ;[2354] Is it the first symbol PUSHJ P,SECSYM ;[2354] No - handle second symbol cases PUSHJ P,.TTABC## ;[2354] Put out a tab MOVEI T1,SYMBLK ;[2354] Address of symbol name to T1 PUSHJ P,.TSTRG## ;[2354] Put name in .MAP file MOVEM T2,SYMONE ;[2354] Save count of 1st symbol MOVEI T3,^D11 ;[2354] Have 11 space to work with CAILE T2,^D9 ;[2354] If symbol longer than 9 - then put MOVEI T3,^D67 ;[2354] Have 67 spaces to work with SUB T3,T2 ;[2354] Number of places - number of characters FORMLP: PUSHJ P,.TSPAC## ;[2354] Type out appropriate number of spaces SOJG T3,FORMLP POPJ P, ;[2354] Return to handle value ect SECSYM: CAILE T2,^D16 ;[2354] If second symbol has more than 16 chars PJRST .TYLP1 ;[2354] Then start on the next line - set frstsy MOVE T3,SYMONE ;[2354] Get count of 1st symbol on line CAILE T3,^D9 ;[2354] If greater than 9 chars then start PUSHJ P,.TYLP1 ;[2354] Second symbol on new line POPJ P, ;[2354] Return ;HERE FOR ENTRY ENTSYM: MOVEI T1,[ASCIZ \Entry \] PUSHJ P,.TSTRG## JRST RELTST ;HERE FOR GLOBAL GLBSYM: MOVEI T1,[ASCIZ \Global \] PUSHJ P,.TSTRG## JRST RELTST ;HERE FOR LOCAL LCLSYM: MOVEI T1,[ASCIZ \Local \] PUSHJ P,.TSTRG## JRST RELTST ;HERE FOR UNDEFINED SYMBOL (LOCAL OR GLOBAL) UDFSYM: MOVEI T1,[ASCIZ \Undefined \] PUSHJ P,.TSTRG## JRST RELTST ;HERE FOR COMMON COMSYM: MOVEI T1,[ASCIZ \Common length \] PUSHJ P,.TSTRG## MOVX T1,S.COM ;FIND SECONDARY PUSHJ P,FNDAST JRST COMRET ;FAILED! MOVE T1,W3 ;GET LENGTH PUSHJ P,.TDSPC ;ALLIGN IT MOVE T1,W3 ;NO. AGAIN PUSHJ P,.TDECW## ;IN DECIMAL MOVEI T1,"." ;SIGNIFY DECIMAL PUSHJ P,.TCHAR## JRST COMRET ;END LINE .TYLPA: PUSHJ P,.TYLPP ;[2354] End the line SKIPN FRSTSY ;[2354] Is it the first symbol AOS (P) ;[2354] So don't toggle on return POPJ P, ;[2354] Return ;HERE TO STORE SYMBOL IN SORT BUFFER STRSYM: JRST @STRTBL(R1) ;GO TO RIGHT FUNCTION DEFINE KEYMAC (A,B)< IFIDN ,< IRP B,< STR'B >>> XALL STRTBL: KEYWORDS SALL STRALPHA: MOVS W3,SYMPTR ;RELATIVE ADDRESS NOW LSHC W2,-2 ;MAKE SPACE SO SIGNED TEST WILL WORK LSH W3,-1 ;SAME FOR 2ND WORD TXNN W2,3B3 ;IF NOT ALPHANUMERIC TXO W2,1B1 ;MAKE .,%,$ LARGER IDPB W2,R2 IDPB W3,R2 JRST NXTSYM ;GET NEXT SYMBOL STRNUMERIC: STRUNSORTED: HALT SUBTTL SYMBOL REQUIRED TEST ;HERE TO SEE IF SYMBOL SHOULD BE LISTED ;CALLED BY ; MOVE W1,FLAGS ; PUSHJ P,SYMCHK ;RETURNS ;+1 IGNORE THIS SYMBOL ;+2 PRINT THIS SYMBOL ;USES T1, T2, T3 SYMCHK: SKIPGE T1,MAPCON ;GET CONTENTS SWITCH JRST CPOPJ1 ;ALL WAS SET MOVE T2,W1 ;GET FLAGS ANDX T2,PS.GLB!PS.ENT!PS.UDF!PS.LCL!PS.COM!PS.REL TXZN T2,PS.REL ;MUST BE ABS IF NOT REL JRST %%.ABS ;SEE IF ALLOWED %%.REL: TXNN T1,C%RELOC ;IS IT ALLOWED? POPJ P, ;NO ; JRST SYMTST ;YES, TRY OTHER BITS SYMTST: JFFO T2,.+2 ;GET LEADING BIT AOSA (P) ;NO TESTS LEFT JRST @TSTTAB-%%F(T3) ;MUST WAIT TIL T3 SETUP POPJ P, DEFINE MAKSYM (A)< %%L==0 %%F==^D36 IRP A,< %%==^L IFG %%F-%%,<%%F==%%> IFL %%L-%%,<%%L==%%> STRSYM \%%,A >> DEFINE STRSYM (%%,A)< %%.'%%==%%.'A > DEFINE SYMGEN < IF1, IF2,< SYMDMP \%% %%==%%+1 >> DEFINE SYMDMP (%%)< IFDEF %%.'%%,<%%.'%%> IFNDEF %%.'%%,<0> PURGE %%.'%% > MAKSYM %%==%%F TSTTAB:REPEAT %%L-%%F+1, IF2, ;HERE FOR ABSOLUTE %%.ABS: TXNE T2,PS.COM ;HOWEVER COMMON IS NOT REALLY ABS JRST SYMTST ;SO PASS THIS TEST TXNN T1,C%ABSOLUTE POPJ P, JRST SYMTST ;HERE FOR GLOBAL %%.GLB: TXZ T2,PS.GLB ;CLEAR IT TXNN T1,C%GLOBAL POPJ P, JRST SYMTST ;HERE FOR LOCAL %%.LCL: TXZ T2,PS.LCL TXNN T1,C%LOCAL POPJ P, JRST SYMTST ;HERE FOR ENTRY %%.ENT: TXZ T2,PS.ENT!PS.GLB TXNN T1,C%ENTRY POPJ P, JRST SYMTST ;HERE FOR COMMON %%.COM: TXZ T2,PS.COM!PS.GLB TXNN T1,C%COMMON POPJ P, JRST SYMTST ;HERE FOR UNDEFINED (RH OR LH) %%.UDL:!%%.UDR:! %%.UDF: TXZ T2,PS.UDF TXNN T1,C%UNDEFINED POPJ P, JRST SYMTST ;HERE TO SORT AND PRINT SYMBOL TABLE SRTSYM: HRRZ W2,SRTPTR ;INITIAL VALUE SUBI W2,(R2) ;- NO. OF PAIRS OF WORDS LSH W2,^D17 ;CUT IN HALF AND PUT IN LHS HRR W2,SRTPTR ;-N,,ADDRESS PUSHJ P,IDXLP0 ;SORT IT HRRZ R2,SRTPTR ;POINT TO TOP OF BUFFER SRTSY1: SKIPN T1,1(R2) ;GET POINTER JRST SRTFIN ;ALL DONE LSH T1,3-^D18 ;PUT IN RHS ADD T1,LS.LB ;FIX INCORE TMOVE W1,(T1) ;GET TRIPLET AGAIN PUSHJ P,PNTSYM ;PRINT IT NOW JRST SRTSY1 SRTFIN: HRRZ T1,SRTPTR HLRZ T2,SRTPTR PUSHJ P,DY.RET## ;GIVE BACK BUFFER SKIPE ODDNESS ;NEED TO END LINE PUSHJ P,[SETCMM ODDNESS PJRST .TYLPP] ;YES MOVE T1,SYMPTR ADD T1,LS.LB TMOVE W1,(T1) ;GET BACK ORIGINAL TRIPLET POPJ P, SUBTTL TITLE ROUTINES ;HERE IF TRIPLET FOUND IS A TITLE TTLBLK: TXNE W1,PT.PSC ;IS THIS JUST THE PSECTS? JRST NXTSYM ;YES, ALREADY READ THEM IFN .NWBLK,< TXNE W1,PT.MSF ;JUST A MULT. SRC. FILE BLOCK? JRST NXTSYM ;YES, IGNORE IT (ALREADY PRINTED) > ;END IFN .NWBLK SKIPE ODDNESS ;NEED TO END LINE? PUSHJ P,[SETCMM ODDNESS PJRST .TYLPP] ;YES TXNE W1,PT.BLK ;FAIL BLOCK HEADER? JRST BTITLE ;YES MOVEM W3,NXTTTL ;SAVE POINTER TO NEXT TITLE SETZM CURPRG ;FINISHED WITH THIS PROGRAM PUSHJ P,.TYLPP ;BLANK LINE PUSHJ P,TYSTAR ;PRINT SEPARATORS PUSHJ P,.TSTP5 ;SEE IF ENOUGH SPACE ON THIS PAGE JFCL PUSHJ P,.TYLPP ;BLANK LINE MOVE T1,W2 ;FIRST 6 CHARS OF NAME MOVEM W2,CURPRG ;SAVE INCASE GOES OVER PAGE PUSHJ P,GOLC ;[2354] Check case and build name TXNE W1,PT.FAK ;ONLY A FAKE TITLE? JRST TTLFAK ;YES, NO ROOM IN INDEX MOVE T1,W2 ;NAME MOVS T2,PAGENO ;GET PAGE NUMBER LSHC T1,-2 ;SO SIGNED TEST CAN WORK LSH T2,-1 ;SAME FOR 2ND WORD OF PAIR TXNN T1,3B3 ;IF NOT ALPHANUMERIC TXO T1,1B1 ;MAKE .,%,$ LARGER IDPB T1,MDLPTR ;STORE MODIFIED NAME IDPB T2,MDLPTR ;AND PAGE NO SOSGE MDLCNT ;STILL ROOM LEFT? JRST E$$TTF ;[1174] NO, MUST BE ERROR ;CONTINUED ON NEXT PAGE TTLFAK: MOVEM W1,FAKE ;[2354] Save flags for fake TTL triplet MOVX T1,S.TTL ;SEE IF ANY MORE TO NAME MOVX T4,S.CMT!S.RLD!S.RLN!S.RLS!S.PRC!S.CRE!S.DEV!S.NAM!S.SFD!S.VER!S.SEG!PT.SYM ;[2354] STOPPERS PUSHJ P,FNDAST JRST TTLCMT ;NO, TRY COMMENT TTLLNM: MOVE T1,W2 ;GET NEXT SIX CHARS PUSHJ P,GOLCS ;[2354] Check case and build ASCII name SKIPE T1,W3 ;AND NEXT SIX PUSHJ P,GOLCS ;[2354] Check case and build ASCII name MOVX T1,S.TTL MOVX T4,S.CMT!S.RLD!S.RLN!S.RLS!S.PRC!S.CRE!S.DEV!S.NAM!S.SFD!S.VER!S.SEG!PT.SYM ;[2354] STOPPERS PUSHJ P,FNDNAS ;SEE IF ANY MORE (NOT INCLUDING THIS ONE) JRST TTLCMT ;NO JRST TTLLNM ;YES TTLCMT: IFN .NWBLK,< SETZM T1 ;[2354] Zero T1 IDPB T1,P4 ;[2354] Deposit 0 to end string MOVEI T1,SYMBLK ;[2354] Address of title string to T1 PUSHJ P,.TSTRG## ;[2354] Print Title MOVE T1,FAKE ;[2354] Get flags for TTL just processed TXNE T1,PT.FAK ;[2354] Was it a fake title just processed? JRST [PUSHJ P,.TYLPP JRST NXTSYM] ;[2354] Yes - get next symbol MOVX T1,S.TTL!S.CMT ;LOOK FOR THE ASCII COMMENT MOVX T4,S.RLD!S.RLN!S.RLS!S.PRC!S.CRE!S.DEV!S.NAM!S.SFD!S.VER!S.SEG ;STOPPERS PUSHJ P,FNDNAS ;LOOK FOR COMMENTS JRST TTLRL1 ;NONE, GO AFTER NEXT PUSHJ P,.TYLPP ;[2354] New line PUSHJ P,.TTABC## ;TYPE A TAB JRST TTLCM2 ;AND JUMP INTO MAIN LOOP TTLCM1: MOVX T1,S.TTL!S.CMT ;LOOK FOR NEXT BLOCK OF COMMENT MOVX T4,S.RLD!S.RLN!S.RLS!S.PRC!S.CRE!S.DEV!S.NAM!S.SFD!S.VER!S.SEG ;STOPPERS PUSHJ P,FNDNAS ;GO LOOK JRST TTLRLD ;DONE, GIVE UP TTLCM2: DMOVE W1,W2 ;MOVE ASCII STRING UP SETZ W3, ;MAKE ASCIZ MOVEI T1,W1 ;POINT TO THE ASCIZ STRING PUSHJ P,.TSTRG## ;TYPE IT JRST TTLCM1 ;LOOK FOR MORE TTLRLD: PUSHJ P,.TYLPP ;END LINE IF COMMENT PRINTED > ;END IFN .NWBLK ;FALL THROUGH TO PRINT .REL FILE SPEC TTLRL1: MOVX T1,S.TTL!S.RLD ;GET REL FILE DEVICE & FILENAME MOVX T4,S.RLN!S.RLS!S.PRC!S.CRE!S.DEV!S.NAM!S.SFD!S.VER!S.SEG ;STOPPERS PUSHJ P,FNDNAS JRST TTLPRC ;SKIP REST OF THIS ALSO MOVEI T1,[ASCIZ \ from \] PUSHJ P,.TSTRG## MOVE T1,W2 ;DEVICE PUSHJ P,.TSIXN## PUSHJ P,.TCOLN## PUSH P,W3 ;SAVE UFD MOVX T1,S.TTL!S.RLN ;FILE NAME & EXT MOVX T4,S.RLS!S.PRC!S.CRE!S.DEV!S.NAM!S.SFD!S.VER!S.SEG ;STOPPERS PUSHJ P,FNDNAS JRST TTLRLU MOVE T1,W2 ;FILE NAME PUSHJ P,.TSIXN## MOVEI T1,"." PUSHJ P,.TCHAR## SKIPE T1,W3 ;EXT PUSHJ P,.TSIXN## TTLRLU: POP P,W3 ;RECOVER UFD JUMPE W3,TTLPRC ;NO UFD MOVEI T1,"[" PUSHJ P,.TCHAR## MOVE T1,W3 ;GET PPN PUSHJ P,.TXWDW## ;PROG,PROJ MOVX T1,S.TTL!S.RLS ;NOW FOR POSSIBLE SFD MOVX T4,S.PRC!S.CRE!S.DEV!S.NAM!S.SFD!S.VER!S.SEG ;STOPPERS PUSHJ P,FNDNAS JRST TTLRLR ;CLOSE [DIRECTORY] TTLRLS: PUSHJ P,.TCOMA## MOVE T1,W2 PUSHJ P,.TSIXN## JUMPE W3,TTLRLR PUSHJ P,.TCOMA## MOVE T1,W3 PUSHJ P,.TSIXN## MOVX T1,S.TTL!S.RLS ;NOW FOR NEXT SFD MOVX T4,S.PRC!S.CRE!S.DEV!S.NAM!S.SFD!S.VER!S.SEG ;STOPPERS PUSHJ P,FNDNAS JRST TTLRLR ;CLOSE [DIRECTORY] JRST TTLRLS TTLRLR: MOVEI T1,"]" PUSHJ P,.TCHAR## TTLPRC: MOVX T1,S.TTL!S.PRC ;FIND PROCESSOR NAME MOVX T4,S.CMT!S.CRE!S.DEV!S.NAM!S.SFD!S.VER!S.SEG ;[2354]STOPPERS PUSHJ P,FNDNAS JRST TTLPRZ ;[2354] Go handle no processor PUSH P,W3 ;SAVE CPU BITS ECT JUMPE W2,TTLPRX ;IF NO NAME GIVEN, USE DEFAULT MOVEI T1,[ASCIZ \ created by \] PUSHJ P,.TSTRG## MOVE T1,W2 ;[2354] Sixbit name TTLPR1: PUSHJ P,.TSIXN## ;TYPE 1ST SIX CHARS OF PROCESSOR NAME MOVX T1,S.TTL!S.PRC ;LOOK FOR MORE OF PROCESSOR NAME MOVX T4,S.CRE!S.DEV!S.NAM!S.SFD!S.VER!S.SEG ;STOPPERS PUSHJ P,FNDNAS ;GET NEXT TRIPLET JRST TTLCPU ;NO MORE, GO PRINT RUNNABLE CPU'S MOVE T1,W2 ;NEXT CHARACTERS OF PROCESSOR NAME PUSHJ P,.TSIXN## ;TYPE THEM SKIPE T1,W3 ;MORE? JRST TTLPR1 ;YES TTLPRZ: MOVX T1,S.TTL!S.PRC!S.CMT ;[2354] FIND PROCESSOR NAME MOVX T4,S.CRE!S.DEV!S.NAM!S.SFD!S.VER!S.SEG ;STOPPERS PUSHJ P,FNDNAS JRST TTLCRU ;NO LUCK, GO PRINT CREATION STUFF PUSH P,W2 ;[2354] SAVE CPU BITS ETC JUMPE W3,TTLPRX ;IF NO NAME GIVEN, USE DEFAULT MOVEI T1,[ASCIZ \ created by \] PUSHJ P,.TSTRG## MOVEI T1,W3 ;[2354] SET UP PROC NAME SETZ R1, ;[2354] END WITH ZERO FOR .TSTRG TTLPR2: PUSHJ P,.TSTRG## ;[2354] TYPE 1ST SIX CHARS OF PROCESSOR NAME MOVX T1,S.TTL!S.PRC!S.CMT ;LOOK FOR MORE OF PROCESSOR NAME MOVX T4,S.CRE!S.DEV!S.NAM!S.SFD!S.VER!S.SEG ;STOPPERS PUSHJ P,FNDNAS ;GET NEXT TRIPLET JRST TTLCPU ;NO MORE, GO PRINT RUNNABLE CPU'S DMOVE W1,W2 ;[2354] NEXT CHARACTERS OF PROCESSOR NAME SETZ W3, MOVEI T1,W1 JRST TTLPR2 ;YES TTLCPU: POP P,T1 ;[1120] RESTORE CPU BITS TTLCP1: TLZ T1,-1 ;[1120] ZAP PROCESSOR TYPE BITS PUSHJ P,TYPCPU ;[1120] TYPE CPUS FOR THIS MODULE JRST TTLCRE ;GO PRINT CRE STUFF TTLPRX: POP P,W3 ;RESTORE CPU BITS JUMPE W3,TTLCRU ;UNKNOWN PROCESSOR SO SKIP MOVEI T1,[ASCIZ \ created by \] PUSHJ P,.TSTRG## HLRE T1,W3 ;GET PROCESSOR TYPE (-1 IS LINK) CAML T1,[-1] ;TOO LOW? CAILE T1,CT.LEN ;MAKE SURE IN RANGE SETZ T1, ;USE UNKNOWN TTLCRL: MOVE T1,PRCTAB(T1) ;PICKUP NAME PUSHJ P,.TSTRG## HRRZI T1,(W3) ;[1120] GET CPU BITS JRST TTLCP1 ;PRINT CPU BITS TTLCRE: MOVX T1,S.TTL!S.CRE ;LOOK FOR CREATION INFO MOVX T4,S.DEV!S.NAM!S.SFD!S.VER!S.SEG ;STOPPERS PUSHJ P,FNDNAS ;FIND THE TRIPLET JRST TTLSRC ;WHAT CAN YOU DO? JUMPE W3,TTLDAT ;DON'T PRINT A VERSION IF NONE MOVEI T1,[ASCIZ/ version /] PUSHJ P,.TSTRG## ;PROCLAIM THE DATA MOVE T1,W3 ;SET IT UP PUSHJ P,.TVERW## ;THEN LET SCAN DO ALL THE WORK TTLDAT: JUMPE W2,TTLSRC ;FORGET IT IF NOT GIVEN MOVEI T1,[ASCIZ/ on /] PUSHJ P,.TSTRG## HLRZ T1,W2 ;GET DATE PUSHJ P,.TDATE## ;TYPE IT MOVEI T1,[ASCIZ/ at /] PUSHJ P,.TSTRG## HRRZ T1,W2 ;GET TIME (SECS) IMULI T1,^D1000 ;SCAN WANTS MILLISECS PUSHJ P,.TTIME## ;TYPE AWAY JRST TTLSRC ;DONE, NOW PRINT SEGMENT STUFF TTLCRU: MOVX T1,S.TTL!S.CRE MOVX T4,S.DEV!S.NAM!S.SFD!S.VER!S.SEG ;STOPPERS PUSHJ P,FNDNAS ;SEE IF CREATION TRIPLET THERE JRST TTLSRC ;NO, FORGET THE WHOLE IDEA JUMPE W2,TTLSRC ;MUST BE SPECIFIED MOVEI T1,[ASCIZ \ created\] PUSHJ P,.TSTRG## JRST TTLDAT TTLSRC: MOVX T1,S.TTL!S.DEV ;LOOK FOR SOURCE FILE INFO MOVX T4,S.NAM!S.SFD!S.VER!S.SEG ;STOPPERS PUSHJ P,FNDNAS ;SEARCH SYMBOL TABLE JRST TTLSR1 ;[2354] NOT THERE PUSH P,W3 ;SAVE SOURCE UFD PUSHJ P,.TYLPP ;END LINE MOVEI T1,[ASCIZ/ Source file was /] TTLSR1: PUSHJ P,.TSTRG## ;TYPE HEADER MOVE T1,W2 ;DEVICE MOVX T1,S.TTL!S.NAM ;FILE NAME AND EXTENSION NEXT MOVX T4,S.SFD!S.FIL!S.VER!S.SEG ;[2354] STOPPERS PUSHJ P,FNDNAS ;SEARCH SYMBOL TABLE JRST TTLFIL ;[2354] NON-DIRECTORY DEVICE?? MOVE T1,W2 ;FILE NAME PUSHJ P,.TSIXN## ;TYPE IT MOVEI T1,"." ;A DOT PUSHJ P,.TCHAR## ;OUT IT GOES SKIPE T1,W3 ;IF AN EXTENSION EXISTS PUSHJ P,.TSIXN## ;TYPE IT TOO TTLUFD: POP P,W3 ;RESTORE UFD JUMPE W3,TTLFIL ;[2354] NONE, DON'T TYPE [0,0] MOVEI T1,"[" ;OPEN BRACKET PUSHJ P,.TCHAR## ;ZAP MOVE T1,W3 ;POSITION PPN PUSHJ P,.TXWDW## ;LET SCAN DO ALL THE WORK TTLSFD: MOVX T1,S.TTL!S.SFD ;SEARCH FOR SFD'S MOVX T4,S.VER!S.SEG ;STOPPERS PUSHJ P,FNDNAS ;SEE IF SPECIFIED JRST TTLRBK ;NO, GO CLOSE OFF [P,PN] PUSHJ P,.TCOMA## ;A COMMA TO SEPERATE MOVE T1,W2 ;SET UP FIRST ONE PUSHJ P,.TSIXN## ;TYPE IT JUMPE W3,TTLRBK ;FINISH UP IF NO MORE PUSHJ P,.TCOMA## ;A SEPARATING COMMA MOVE T1,W3 ;THERE IS, SET IT UP PUSHJ P,.TSIXN## ;TYPE IT JRST TTLSFD ;AND CONTINUE TTLRBK: PUSHJ P,.TRBRK## ;CLOSE [PATH] TTLFIL: MOVX T1,S.TTL!S.FIL ;[2354] Look for these bits MOVX T4,S.VER!S.SEG ;[2354] Stoppers PUSHJ P,FNDNAS ;[2354] Go ahead and search JRST TTLVER ;[2354] Not found go to version TTLFI2: DMOVE W1,W2 ;[2354] MOVE ASCII STRING UP SETZ W3, ;MAKE ASCIZ MOVEI T1,W1 ;POINT TO THE ASCIZ STRING PUSHJ P,.TSTRG## ;TYPE IT JRST TTLFIL ;[2354] LOOK FOR MORE TTLVER: MOVX T1,S.TTL!S.VER ;SOURCE VERSION INFO NEXT MOVX T4,S.SEG ;STOPPERS PUSHJ P,FNDNAS ;LOOK FOR IT JRST TTLNXT ;CAN'T HAVE EVERYTHING JUMPE W2,TTLCRS ;IF NO VERSION, PRINT CREATION INFO MOVEI T1,[ASCIZ/ version /] PUSHJ P,.TSTRG## ;TYPE INTRODUCTION MOVE T1,W2 ;SET UP VERSION PUSHJ P,.TVERW## ;AND LET SCAN WORRY ABOUT IT TTLCRS: JUMPE W3,TTLNXT ;FORGET IT IF NOT SPECIFIED MOVEI T1,[ASCIZ/ created on /] PUSHJ P,.TSTRG## ;USE UP DISK SPACE HLRZ T1,W3 ;PICKUP DATE PUSHJ P,.TDATE## ;TYPE IT MOVEI T1,[ASCIZ/ at /] PUSHJ P,.TSTRG## ;TYPE "AT" HRRZ T1,W3 ;GET TIME (SECONDS) IMULI T1,^D1000 ;SCAN WANTS MILLISECONDS PUSHJ P,.TTIME## ;TYPE THE TIME AS HH:MM:SS TTLNXT: SKIPL T1,NXTTTL ;IS NEXT TITLE BLOCK A MULT. SRC. FILE? JRST TTLSEG ;NO, PRINT IT NEXT TIME HRRZ T1,T1 ;YES, CLEAR FLAG IN LH SUB T1,LW.LS ;CONVERT TO PHYSICAL ADDRESS ADD T1,LS.LB ; ... ADDI T1,.L-1 ;WANT TO ACCESS LAST WORD OF TRIPLET SKIPE PAG.LS ;IF PAGING CAMGE T1,LS.AB ;AND THIS ADDRESS NOT YET IN CORE SKIPA ;NOT TRUE HALT ;GIVE UP (FOR NOW) SUBI T1,.L-1 ;BACK TO FIRST WORD OF TRIPLET MOVE T2,ASTPTR ;IN CASE FIRST TIME THROUGH, GET ASTPTR SKIPN SAVAST ;ANYTHING SAVED YET? MOVEM T2,SAVAST ;NO, JUST SAVE THE FIRST ONE MOVE T2,2(T1) ;SAVE POINTER TO TITLE AFTER THIS ONE MOVEM T2,NXTTTL ;SAVE FOR LATER ADDI T1,.L ;POINT TO 1ST 2NDARY 3RPLET OF NEW BLK MOVEM T1,ASTPTR ;SETUP TO SCAN NEW PT.MSF BLOCK MOVX T1,S.TTL!S.DEV ;LOOK FOR SOURCE DEVICE & UFD MOVX T4,S.NAM!S.SFD!S.VER!S.SEG ;STOPPERS PUSHJ P,FNDNAS ;SEARCH THE SYMBOL TABLE JRST TTLNXT ;NOT THERE, LOOK FOR MORE PUSH P,W3 ;SAVE SOURCE UFD PUSHJ P,.TYLPP ;END OLD LINE MOVEI T1,[ASCIZ/ concatenated with /] JRST TTLSR1 ;DUMP THIS BLOCK TTLSEG: IFN .NWBLK,< SKIPN T1,SAVAST ;IS THERE AN ASTPTR SAVED? JRST TTLSG0 ;NO MOVEM T1,ASTPTR ;YES, RESTORE IT SETZM SAVAST ;NOTHING THERE NOW TTLSG0:> ;END IFN .NWBLK PUSHJ P,.TYLPP ;END LINE SETOM ZERLEN ;[2254] ASSUME ZERO LENGTH MOVX T1,S.TTL!S.SEG MOVX T4,S.SHI ;[2254] STOPPERS PUSHJ P,FNDNAS ;[2254] GET LOW SEGMENT INFO JRST TTLEND SETZ R1, ;[2254] STARTING WITH LOW SEGMENT CAMGE W2,W3 ;[2254] LOW SEG EMPTY? PUSHJ P,TTLSG2 ;[2254] NO, TYPE THE SEGMENT COUNTER MOVX T1,S.TTL!S.SEG!S.SHI ;[2254] LOOKING FOR HIGH SEG COUNTERS SETZ T4, ;[2254] NO STOPPERS PUSHJ P,FNDNAS ;[2254] GET HIGH SEGMENT INFO JRST TTLEND ;[2254] NOT THERE TXZE W3,SS.PS ;[2254] DOING PSECTS? JRST TTLPSC ;[2254] YES MOVEI R1,1 ;[2254] NO, DOING HIGH SEGMENT CAMGE W2,W3 ;[2254] HIGH SEG EMPTY? PUSHJ P,TTLSG2 ;[2254] NO, TYPE THE SEGMENT COUNTER JRST TTLEND ;[2254] DONE TTLSG2: PUSHJ P,.TTABC## MOVEI T1,SEG0(R1) PUSHJ P,.TSTRG## MOVEI T1,SEG1 PUSHJ P,.TSTRG## MOVE T1,W2 ;[2254] GET STARTING ADDRESS PUSHJ P,.T6OCT## ;STARTING MOVEI T1,SEG2 PUSHJ P,.TSTRG## MOVE T1,W3 ;[2254] GET BREAK SKIPE T1 ;MIGHT NOT BE SETUP (IF 0) SUBI T1,1 ;ONE LESS THAN PROG BREAK PUSHJ P,.T6OCT## ;ENDS MOVEI T1,SEG3 PUSHJ P,.TSTRG## SUB W3,W2 ;[2254] GET SIZE IN W3 MOVE T1,W3 ;[2254] GET IT FOR TYPOUT PUSHJ P,.T6OCT## ;LENGTH MOVEI T1,[ASCIZ \ (octal),\] PUSHJ P,.TSTRG## MOVE T1,W3 ;[2254] NEED IT AGAIN PUSHJ P,.TDSPC ;ALLIGN WORD MOVE T1,W3 ;[2254] GET LENGTH BACK PUSHJ P,.TDECW## MOVEI T1,[ASCIZ \. (decimal)\] PUSHJ P,.TSTRG## PUSHJ P,.TYLPP ;END LINE SETZM ZERLEN ;[2254] NOT ZERO LENGTH MODULE POPJ P, ;[2254] FINISHED TYPING THIS LINE ;HERE TO HANDLE PSECTS TTLPSC: SPUSH ;[2413] SAVE INFO ABOUT ;[2413] CURRENT WINDOW SETZM FS.SS ;[2413] MAKE SURE NO FIXUPS ;[2413] IF WE CALL LS.IN TTLPS0: SETZM ZERLEN ;[2254] Not zero length module PUSHJ P,TTLPSR ;[2254] Set up R to point to triplet MOVEI T1,[ASCIZ / Psect /] ;[1161] PUSHJ P,.TSTRG## MOVE T1,1(R) ;NAME PUSHJ P,.TSIXB## ;[1161] TYPE WITH TRAILING BLANKS MOVE T1,(R) ;[2220] Get the flag word TTLPS1: ADDI W3,.L ;[2220] Yes, get the next triplet PUSHJ P,TTLPSR ;[2220] Set up R to point to triplet MOVE T1,(R) ;[2220] Get the flags TXNN T1,S.PSN ;[2220] Psect name? JRST TTLPS2 ;[2220] No, must be value MOVE T1,1(R) ;[2220] Yes, get the first word of the name PUSHJ P,.TSIXB## ;[2220] Type with trailing blanks SKIPE T1,2(R) ;[2220] And the second PUSHJ P,.TSIXB## ;[2220] Type with trailing blanks JRST TTLPS1 ;[2220] Try for more TTLPS2: MOVEI T1,[ASCIZ / starts at /] PUSHJ P,.TSTRG## MOVE T1,1(R) ;[2220] RC.CV PUSHJ P,.T6OCT## MOVEI T1,SEG2 PUSHJ P,.TSTRG## MOVE T1,2(R) ;[2220] PROG BREAK SUBI T1,1 PUSHJ P,.T6OCT## MOVEI T1,SEG3 ;LENGTH PUSHJ P,.TSTRG## MOVE T2,1(R) ;[2220] RC.CV MOVE T1,2(R) ;[2220] RC.HL SUB T1,T2 ;[2220] LENGTH PUSH P,T1 ;SAVE LENGTH PUSHJ P,.T6OCT## MOVEI T1,[ASCIZ / (octal),/] ;[1161] PUSHJ P,.TSTRG## MOVE T1,0(P) ;[1161] GET LENGTH AGAIN PUSHJ P,.TDSPC ;[1161] ALIGN WORD TO COME POP P,T1 ;LENGTH PUSHJ P,.TDECW## MOVEI T1,[ASCIZ /. (decimal)/] ;[1161] PUSHJ P,.TSTRG## PUSHJ P,.TYLPP ADDI W3,.L ;POINT TO NEXT MOVE W1,(R) JUMPL W1,[ TXNE W1,PT.EXT ;[711] IT'S PRIMARY JRST TTLPS0 ;[711][2413] MORE TO COME JRST TTLPS3] ;[711][2413] NO MORE TXNN W1,S.LST ;[711] NOT PRIMARY, ALL DONE? JRST TTLPS0 ;[2413] NOT YET ;YES TTLPS3: SPOP ;[2413] RESTORE OLD ;[2413] WINDOW INFO EXCH T1,LW.LS ;[2413] RESTORE LOWER WINDOW CAMN T1,LW.LS ;[2413] HAS WINDOW MOVED? JRST TTLPS4 ;[2413] NO - JUST END MOVE T1,LW.LS ;[2413] LOWER WINDOW MOVE T2,UW.LS ;[2413] UPPER WINDOW PUSHJ P,LS.IN## ;[2413] READ IN OLD WINDOW TTLPS4: SPOP ;[2413] RESTORE FIXUP TABLE PTR TTLEND: PUSHJ P,.TYLPP ;BLANK LINE MOVE T1,MAPCON ;GET MASK FOR MAP CONT SKIPGE ZERLEN ;MAKE ZERO LENGTH TEST NOW TXNE T1,C%ZERO ;SKIP IF NOT ALLOWED JRST TTLSRT ;OK, ALLOWED MOVEI T1,[ASCIZ \ Zero length module\] PUSHJ P,.TSTRG## PUSHJ P,.TYLPP PUSHJ P,GETSYM ;GET FIRST SYMBOL JRST SYMDN ;ALL OVER JRST TTLBLK ;A TITLE BLOCK JRST .-3 ;LOOP TIL NEXT TITLE OR ELSE END E$$TTF::.ERR. (MS,,V%L,L%W,S%W,TTF,) ;[1174] JRST NXTSYM ;IGNORE, BUT TRY TO COMPLETE MAP ;[2220] Here to relocate a pointer for psects, and bring into core if necessary TTLPSR: MOVE R,W3 ;[2220] Get offset to block ADD R,LS.LB ;[2220] Plus base SUB R,LW.LS ;[2220] Minus window CAMG R,LS.AB ;[2220] In core? POPJ P, ;[2220] Yes, return ;[2413] MOVE T2,R ;[2220] Put current address in T2 ;[2413] PUSHJ P,SHFPAG ;[2220] Shift window so in core ;[2413] MOVE R,T2 ;[2220] Put corrected address back in R MOVE T2,UW.LS ;[2413] GET SIZE OF CURRENT WINDOW SUB T2,LW.LS ;[2413] " " " " MOVE T1,W3 ;[2413] FILE ADDRESS WE WANT MOVE R,W3 ;[2413] SAVE IT AGAIN TRZ T1,.IPM ;[2413] PAGE BOUNDRY BELOW IT MOVEM T1,LW.LS ;[2413] NEW LOWER WINDOW ADD T2,T1 ;[2413] PLUS SIZE = UPPER WINDOW MOVEM T2,UW.LS ;[2413] STASH IT PUSHJ P,LS.IN## ;[2413] READ IN WINDOW ANDI R,.IPM ;[2413] ADDR RELATIVE TO LOWER WINDOW ADD R,LS.LB ;[2413] RELATIVE TO LOWER BOUND POPJ P, ;[2220] Return ;[2354] Handle long title name LNGNM: PUSH P,P3 ;[2354] Save P3 HLRZ P3,T1 ;[2354] Count of words MOVNS P3 ;[2354] Negative count HRLS P3 ;[2354] -Count - half of aobjn pointer HRR P3,T1 ;[2354] Addr of name string - other half AOBJN PUSHJ P,.TYLPP ;[2354] Start on a new line MOVEI T1,[ASCIZ/ located in program /] ;[2354] PUSHJ P,.TSTRG## ;[2354] Out put the message MOVE P4,[POINT 7,SYMBLK] ;[2354] Byte pointer to store name NAMLP: MOVE T1,(P3) ;[2354] Get a word of name PUSHJ P,GOLCS ;[2354] Check for case and build name AOBJN P3,NAMLP ;[2354] Anymore? - yes go get them POP P,P3 ;[2354] Finished - restore P3 SETZ T1, ;[2354] Zero to T1 IDPB T1,P4 ;[2354] End string with a zero MOVEI T1,SYMBLK ;[2354] Pointer to string to T1 PUSHJ P,.TSTRG## ;[2354] Print the string JRST TTLDN ;[2354] Go back SUBTTL FAIL BLOCK HEADER BTITLE: MOVX W1,PS.LCL ;FAKE A LOCAL SYMBOL PUSHJ P,SYMCHK ;SEE IF WE WANT THIS SYMBOL? JRST NXTSYM ;NO PUSHJ P,.TYLPP ;BLANK LINE PUSHJ P,.TTABC## ;TAB MOVEM W1,SYFLAG ;SAVE PRIMARY FLAGS MOVE T1,W2 ;FIRST 6 CHARS OF NAME HRRZM W3,VALUE ;VALUE OF SYMBOL PUSHJ P,.TSIXN## MOVEI T1,[ASCIZ \ block level \] PUSHJ P,.TSTRG## MOVE T1,VALUE PUSHJ P,.TDECW## ;LEVEL IN DECIMAL PUSHJ P,.TYLPP ;END LINE JRST NXTSYM SUBTTL SYMBOL TABLE ROUTINES ;HERE TO READ BACK SYMBOL TABLE IF ON DSK ;CALLED BY ; PUSHJ P,SYMINI SYMINI: SKIPN T1,PAG.LS ;PAGING SYMBOLS? POPJ P, ;NO MOVE T1,LW.LS ;[2202] LOWEST INCORE MOVE T2,LSYM ;[2202] HIGHEST IORI T2,.DBM ;[2202] PUT ON DSK BLOCK BOUND (NOT NECESSARY) PUSHJ P,LS.OUT## ;DUMP THEM SETZM LW.LS ;START AGAIN AT 0 PUSH P,FRECOR ;SAVE INCASE NOT 0 SETZM FRECOR ;DON'T NEED EXTRA SPACE IN MAPS PUSHJ P,FR.CNT## ;COUNT ALL OF FREE CORE CAILE T1,1000 ;[640] UNLESS THAT WOULD USE IT ALL SUBI T1,1000 ;[640] LEAVE SOME FOR OTHERS (TTLDN ETC) MOVEI P1,LS.IX ;WILL WANT TO EXPAND LS AREA MOST LIKELY MOVE P2,LSYM ;WE WANT THIS MUCH MOST LIKELY ADD P2,LS.LB ;FIND EXTRA WE NEED SUB P2,LS.AB ;REMOVING WHAT WE HAVE CAMLE P2,T1 ;MORE THAN WHATS FREE? MOVE P2,T1 ;YES, SO JUST GET WHAT WE CAN JUMPE P2,[MOVE T1,LS.AB ;MAKE SURE WE HAVE AT LEAST 2 BLOCKS SUB T1,LS.LB ;IF WE ARE NOT INCREASING CAIL T1,.IPS ;MORE THAN ONE BLOCK JRST SYMIN1 ;[640] ENOUGH ALREADY, LEAVE MOVEI P2,.IPS ;NOT ENOUGH, GET ONE MORE JRST .+1] PUSHJ P,LOGBCK ;INCASE LOG FILE OPEN PUSHJ P,LNKCOR ;GET IT ALL PUSHJ P,E$$MEF## ;[1174] CANNOT HAPPEN PUSHJ P,LOGBCK ;RESTORE MAP DEVICE SYMIN1: POP P,FRECOR ;[640] RESTORE MOVE T2,LS.AB ;[2202] RECALCULATE UW.LS SUB T2,LS.LB ;[2202] SEE HOW BIG MOVEM T2,UW.LS ;[2202] BIGGEST IN CORE SETZ T1, ;[2202] READ FROM THE BEGINNING PJRST LS.IN## ;INPUT AND RETURN ;HERE TO GET NEXT PRIMARY SYMBOL ;CALLED BY ; PUSHJ P,GETSYM ;RETURNS ;+1 END OF SYMBOL TABLE ;+2 TRIPLET IS A TITLE OR OTHER NON-SYMBOL ;+3 NORMAL SYMBOL RETURN ;USES T1 ;SETS UP W1, W2, W3 & SYMPTR GETSYM: MOVE T1,SYMPTR ;GET POINTER TO LAST PRIMARY ADD T1,LS.LB ;ADD IN OFFSET NOTPRM: ADDI T1,.L ;GET TO END OF NEXT TRIPLET CAMLE T1,LS.AB ;STILL IN CORE JRST SHFSYM ;NO, GET NEXT BLOCK OR GIVE UP SKIPL W1,-.L(T1) ;GET FLAGS JRST NOTPRM ;NOT A PRIMARY DMOVE W2,-.L+1(T1) ;LOAD REST OF TRIPLET SUB T1,LS.LB ;REMOVE OFFSET MOVEM T1,SYMPTR ;STORE POINTER AOS (P) ;AT LEAST SKIP RET TXNE W1,PT.SYM ;SEE IF SYMBOL TYPE AOS (P) ;YES, RET +3 POPJ P, ;HERE TO SHIFT NEW SYMBOL WINDOW INTO CORE ;ALL EXCEPT THE LAST 128 WORDS ARE THROWN AWAY (KEPT INCASE SYMBOL ACROSS A BOUND) ;READ IN NEW PART AND ADJUST POINTERS ;IF THERE IS MORE SPACE THAN WE NEED GIVE BACK THE EXCESS SHFSYM: SKIPN UW.LS ;PAGING? POPJ P, ;NO, ALL DONE MOVE T1,UW.LS ;LAST HIGHEST ADDI T1,1 ;NEW LOWEST CAMLE T1,LSYM ;STILL SOME SYMBOLS LEFT? POPJ P, ;NO, ALL DONE ;KEEP LAST BLOCK IN CORE AGAIN IFN TOPS20,< ;[2215] MOVE T1,LW.LS ;[2215] Get the lower bound MOVE T2,UW.LS ;[2215] And the upper PUSHJ P,LS.OUT## ;[2215] Unmap the area MOVE T1,UW.LS ;[2215] Get the last highest back ADDI T1,1 ;[2215] And get the new lowest > ;[2215] IFN TOPS20 SUBI T1,.IPS ;[2202] FIRST ADDRESS TO KEEP MOVE T2,T1 ;[2202] SUB T2,LW.LS ;DIFFERENCE = WINDOW SIZE ADDM T2,LW.LS ;FIXUP WINDOW PTRS ADDM T2,UW.LS MOVN T2,T2 ADDM T2,SYMPTR ;BACKUP SYMBOL PTR MOVM T2,T2 ;BACK POSITIVE MOVE T3,UW.LS ;GET NEXT UPPER BOUND ANDCMI T3,.IPM ;[1164] FORM FIRST FREE IN ALL BUT LAST PAGE CAMG T3,LSYM ;HAVE WE TOO MUCH ROOM NOW? JRST [ IORI T2,.IPM JRST SHFSY1] ;[2375] NO READ ALL WE CAN GET MOVE T2,LSYM ;GET UPPER WE NEED SUB T2,LW.LS ;LENGTH WE REALLY NEED IORI T2,.IPM ;[650] BLOCK BOUND MOVE T3,LSYM ;HIGHEST SYMBOL SEEN IORI T3,.IPM ;PUT ON BOUND MOVEM T3,UW.LS ;STORE AS HIGHEST WINDOW MOVE T3,LS.LB ;ACTUAL LOWER ADD T3,T2 ;NEW UPPER MOVEM T3,LS.AB ;ACTUAL BOUND IN USE IFE TOPS20,< ;[1533] SETZM 1(T3) ;CLEAR IT HRLI T3,1(T3) ADDI T3,2 ;FORM BLT PTR BLT T3,@LS.UB ;CLEAR IT ALL >;[1533] END IFE TOPS20 SHFSY1: ADD T2,T1 ;[2202] UPPER BOUND IS LOWER + SIZE PUSHJ P,LS.IN## ;READ IN NEW BLOCKS JRST GETSYM ;AND CONTINUE ;HERE TO FIND ASSOCIATED SECONDARY TRIPLET ;CALLED BY ; MOVE T1,FLAGS ; MOVE T4,"STOPPER" FLAGS (WILL NOT SCAN BEYOND THESE) ; PUSHJ P,FNDAST (FIRST TIME) ; -OR- ; PUSHJ P,FNDNAS ;RETURNS ;+1 FAILED ;+2 SUCCESS ;USES T1, T2, T3, T4 ;SETS UP W1, W2, W3 FNDAST: SKIPA T2,SYMPTR ;GET POINTER FNDNAS: SKIPA T2,ASTPTR ;ALREADY RELOCATED ADD T2,LS.LB ;FIX FNDNAT: ADDI T2,.L ;GET NEXT TRIPLET CAMLE T2,LS.AB ;STILL IN CORE? PUSHJ P,FNDNIC ;NOT IN CORE, OR FINISHED MOVEI T3,-.L(T2) ;KEEP ASTPTR UP TO DATE MOVEM T3,ASTPTR ;IN CASE FNDNIC OR ENTERED AT FNDAST SKIPGE T3,-.L(T2) ;GET FLAGS POPJ P, ;FOUND A PRIMARY (FAILED) XOR T3,T1 ;IFF ALL BITS MATCH TXZ T3,S.LST ;IGNORE THIS BIT HOWEVER TDZ T4,T1 ;GUARD AGAINST REQUESTING A STOPPER JUMPN T3,[TDNE T3,T4 ;FOUND A STOPPER? POPJ P, ;YES, QUIT JRST FNDNAT] ;NO, KEEP TRYING TMOVE W1,-.L(T2) ;LOAD TRIPLET MOVEM T2,ASTPTR ;SAVE INCASE CALLED AGAIN CPOPJ1: AOS (P) CPOPJ: POPJ P, ;HERE TO READ IN MORE OF SYMBOL TABLE IF PAGING ;LEAVES THE LAST PAGE IN CORE (IN CASE TRIPLET SPLIT ACROSS BOUND) ;BUT ADJUSTS SYMPTR ETC ;CALLED BY ; PUSHJ P,FNDNIC ; FNDNIC: SKIPN PAG.LS JRST TPOPJ ;REMOVE RETURN AND EXIT MOVE T1,UW.LS ;GET CURRENT HIGHEST ADDI T1,1 CAMLE T1,LSYM ;ANY MORE TO READ IN? JRST TPOPJ ;NO, GIVE UP SHFPAG: SUB T2,LS.LB ;[1322] REMOVE OFFSET MOVE T1,SYMPTR ;GET PTR TO CURRENT PRIMARY ANDCMI T1,.IPM ;KEEP THAT BLOCK SUB T2,T1 ;ADJUST T2 FOR NEW VALUE PUSH P,T2 ;SAVE IT FOR RETURN IFN TOPS20,< ;[1540] PUSH P,T1 ;[1540] PRESERVE T1 MOVE T1,LW.LS ;[2202] GET LOW ADDRESS MOVE T2,UW.LS ;[2202] AND END ADDRESS PUSHJ P,LS.OUT## ;[1540] MAP OUT WHOLE WINDOW POP P,T1 ;[1540] RESTORE T1 >;[1540] END OF IFN TOPS20 MOVEI T2,.IPM ANDM T2,SYMPTR ;BACKUP PRIMARY PTR ADDM T1,LW.LS ;GET NEW ADDB T1,UW.LS ;AFTER NEXT INPUT CAML T1,LSYM ;DO WE NEED ALL OF IT? PUSHJ P,REDUSM ;NO, REDUCE SIZE MOVE T1,LW.LS ;[2202] LOWEST ADDRESS MOVE T2,UW.LS ;[2202] HIGHEST PUSHJ P,LS.IN## ;READ IN AGAIN POP P,T2 ;RESTORE T2 ADD T2,LS.LB ;RESTORE OFFSET POPJ P, ;RETURN ;HERE TO REDUCE SIZE SO WE DON'T WASTE TIME LOOKING AT ZEROS ;AND SAVES READIN TIME REDUSM: SUB T1,LSYM ;GET EXCESS ANDCMI T1,.IPM ;IN THIS BLOCK MOVN T1,T1 ;AS - OFFSET ADDM T1,UW.LS ;BACKUP WINDOW ADD T1,LS.AB ;WILL BE NEW TOP LATER IFE TOPS20,< ;[1540] ;FIRST WE MUST CLEAR JUNK FROM THIS SPACE MOVEI T2,1(T1) ;FIRST FREE LOC SETZM (T2) ;CLEAR IT HRL T2,T2 ADDI T2,1 ;BLT PTR BLT T2,@LS.AB ;UP TO OLD LIMIT >;[1540] END IFE TOPS20 MOVEM T1,LS.AB ;NOW SET TOP POPJ P, TPOPJ: POP P,T1 ;REMOVE RETURN POPJ P, SUBTTL OUTPUT ROUTINES MAPIT: SOSGE MCBUF+2 ;ANY SPACE EFT JRST MAPDMP ;NO IDPB T1,MCBUF+1 ;YES POPJ P, MAPDMP: OUT MC, JRST MAPIT PUSHJ P,LOGBCK ;RESTORE LOG CHAN E$$OEM::PUSH P,[MC] ;ERROR, SAVE CHAN .ERR. (ST,,V%L,L%W,S%W,OEM,) ;[1174] CLOSE MC, JRST MAPRET ;AND RETURN ;HERE TO SWAP CURRENT OUTPUT SUBROUTINE WITH PREVIOUS ;CALLEDD BY ; PUSHJ P,LOGBCK LOGBCK: MOVE T1,OLDDEV ;RESTORE PUSHJ P,.TYOCH## MOVEM T1,OLDDEV POPJ P, ;HERE TO OUTPUT CR-LF OR CR-FF & HEADER ;CALLED BY ; PUSHJ P,.TYLPP .TYLP1: SETZM FRSTSY ;[2354] Start with first symbol on new line .TYLPP: SOSLE CNTLPP ;STILL SPACE ON THIS PAGE? PJRST .TCRLF## ;YES, JUST CRLF MOVEI T1,LN.LPP ;NO, RESET PAGE COUNT MOVEM T1,CNTLPP PUSHJ P,.TCRLF## ;CR-LF MOVEI T1,.CHFFD ;FF PUSHJ P,.TCHAR## .TYHDR: MOVE T1,PAGHDR ;HEADER AGAIN PUSHJ P,.TSTRG## MOVE T1,MAPNAM ;GET MAP FILE NAME PUSHJ P,.TSIXN## ;IN SIXBIT MOVE T1,OKCPUS ;[1120] PRINT CPUS FOR PROGRAM PUSHJ P,TYPCPU ;[1120] .. SKIPN MAPVER ;ONLY PRINT IF NOT ZERO JRST TYPAGE ;JUST PAGE NUMBER MOVEI T1,[ASCIZ \ version \] PUSHJ P,.TSTRG## MOVE T1,MAPVER ;VERSION PUSHJ P,.TVERW## TYPAGE: IFN FTOVERLAY,< SKIPL LNKMAX ;ANY OVERLAYS? SKIPG LNKNO. ;EXCEPT #0 JRST TYPAG1 ;NO MOVEI T1,[ASCIZ \ #\] PUSHJ P,.TSTRG## MOVE T1,LNKNO. PUSHJ P,.TDECW## MOVEI T1,[ASCIZ \ page \] CAIA TYPAG1: >;END OF IFN FTOVERLAY MOVEI T1,[ASCIZ \ page \] PUSHJ P,.TSTRG## AOS T1,PAGENO ;GET PAGE NUMBER PUSHJ P,.TDECW## PUSHJ P,.TYLPP MOVE T1,PAGENO ;GET PAGE NUMBER CAIN T1,1 ;BLANK LINE UNLESS PAGE 1 POPJ P, SKIPE T1,CURPRG ;GET CURRENT PROG NAME PUSHJ P,.TSIXN## ;OUTPUT IT SO WE KNOW WHERE WE ARE PJRST .TYLPP ;HERE TO TEST FOR 5 FREE LINE ON PAGE ;CALLED BY ; PUSHJ P,.TSTP5 .TSTP5: MOVEI T1,5 ;FALL INTO .TSTPG ;HERE TO SEE IF WITHIN SO MANY LINES FROM END OF PAGE ;IF SO END PAGE AND RETURN +1 ;IF NOT JUST RETURN +2 ;CALLED BY ; MOVEI T1,NO. OF LINES TO TEST FOR ; PUSHJ P,.TSTPG ;RETURNS ;+1 ON A NEW PAGE ;+2 ENOUGH SPACE ON CURRENT PAGE .TSTPG: CAMG T1,CNTLPP ;ENOUGH FREE LINES? JRST CPOPJ1 ;YES SETZM CNTLPP ;NO, FORCE END PJRST .TYLPP ;AND WRITE IT OUT ;HERE TO PRINT LINE OF STARS ;CALLED BY ; PUSHJ P,TYSTAR TYSTAR: MOVEI T1,STARS ;GET LINE PUSHJ P,.TSTRG## ;OUTPUT PJRST .TYLPP ;AND CLOSE LINE ;.TDSPC - SUBROUTINE TO PRINT ALLIGNMENT SPACES FOR DECIMAL NO. ;CALLED BY ; MOVE T1,NUMBER ; PUSHJ P,.TDSPC ;OUTPUTS ONE SPACE FOR EVERY DIGIT NOT PRINTED .TDSPC: MOVSI T2,-SPCLEN ;AOBJN WORD CAMGE T1,SPCTBL(T2) ;SEE HOW BIG AOBJN T2,.-1 ;NOT YET MOVEI T1," " ;SPACE HRRZ T2,T2 ;COUNT OF HOW MANY JUMPE T2,CPOPJ ;NONE PUSHJ P,.TCHAR## SOJG T2,.-1 ;LOOP POPJ P, SPCTBL: ^D100000 ^D10000 ^D1000 ^D100 ^D10 SPCLEN==.-SPCTBL ;.TDEC3 -- TYPE DECIMAL AT LEAST THREE DIGITS ;CALL: SAME AS .TDECW WITH T2=FILLER CHAR (" " OR "0") .TDEC3: CAILE T1,^D99 ;SEE IF TWO DIGITS OR LESS PJRST .TDECW## ;NO--JUST OUTPUT MOVEI T2," " ;SET FILLER EXCH T1,T2 ;SWAP PUSHJ P,.TCHAR## ;OUTPUT FILLER EXCH T1,T2 ;PUT BACK PJRST .TDEC2## ;OUTPUT OTHER TWO DIGITS SUBTTL HEADER MESSAGES ETC HEAD1: ASCIZ \ LINK symbol map of \ HEAD2: ASCIZ \ Produced by LINK version \ SEG0: ASCIZ \Low \ ASCIZ \High\ SEG1: ASCIZ \ segment starts at \ SEG2: ASCIZ \ ends at \ SEG3: ASCIZ \ length \ STARS: ASCIZ \ *************\ END1: ASCIZ \ [End of LINK map of \ DEFINE X (A,B,C,D)< ;;[1225] ACCOUNT FOR EXTRA ARG [ASCIZ \C\] > [ASCIZ \LINK\] XALL PRCTAB: PROCESSORS SALL ;ROUTINE TO PRINT CPUS ON WHICH A MODULE OR PROGRAM WILL RUN. IF ALL CPUS ;KNOWN TO LINK ARE ALLOWED, PRINT NOTHING. ;ON CALL: ; T1/ CP.??? BITS TYPCPU: CAIN T1,CP.MSK ;[1120] RUNNABLE ON ALL CPUS? POPJ P, ;[1120] YES--DON'T BOTHER PRINTING PUSH P,P1 ;[1120] SAVE SOME VARS PUSH P,P2 ;[1120] .. MOVE P1,T1 ;[1120] SAVE CPU BITS IN SAFE AC PUSHJ P,.TSPAC## ;[1120] SEPARATE BY A SPACE SETZ P2, ;[1120] START CHECK AT KA TYPCPL: JUMPE P1,TYPCPE ;[1120] ANY CPUS LEFT TO PRINT? MOVE T1,CPUTAB(P2) ;[1120] YES--GET ADDR OF CPU NAME TXNE P1,1B35 ;[1120] PRINT THIS CPU? PUSHJ P,.TSTRG## ;[1120] YES--PRINT IT LSH P1,-1 ;[1120] ADVANCE TO NEXT CPU AOJA P2,TYPCPL ;[1120] AND LOOP UNTIL DONE TYPCPE: POP P,P2 ;[1120] RESTORE VARS POP P,P1 ;[1120] .. POPJ P, DEFINE X(A,B)< [ASCIZ \/A\] > XALL CPUTAB: CPUS SALL SUBTTL END OF MAP SYMDN: SETZM CURPRG ;DON'T WANT LAST PROG ON UNDEF PAGES SKIPE ODDNESS ;NEED TO END LINE? PUSHJ P,[SETCMM ODDNESS PJRST .TYLPP] ;YES PUSHJ P,.TYLPP ;BLANK PUSHJ P,TYSTAR ;SEPARATE THIS AREA PUSHJ P,.TYLPP ;AND BLANK LINE SKIPN USYM ;ANY UNDEFINED SYMBOLS? JRST MULDF0 ;NO, TRY FOR MULTIPLY DEFINED UNRES0: MOVE T1,CNTLPP ;GET NUMBER OF LINES ON PAGE CAIGE T1,LN.LPP-3 ;UNLESS JUST OUTPUT HEADER SETZM CNTLPP ;START NEW PAGE PUSHJ P,.TYLPP ;START ON A NEW LINE MOVE P1,USYM ;GET NUMBER OF UNDEFS IN A PRESERVED AC MOVE T1,P1 ;WHERE SCAN EXPECTS NUMBER PUSHJ P,.TDECW## ;TYPE NO. MOVE T1,P1 ;GET UNDEFS AGAIN CAILE T1,2 ;LEAVE 0 OR 1 ALONE MOVEI T1,2 ;SET INDEX TO 0,1, OR 2 MOVE T1,UNRTAB-1(T1) ;GET ADDRESS PUSHJ P,.TSTRG## ;OUTPUT MESSAGE PUSHJ P,.TYLPP ;AND CR-LF PUSHJ P,.TYLPP MOVE P2,HT.PRM ;GET INDEX INTO HASH TABLE UNRES1: SKIPN P3,@HT.PTR ;GET POINTER TO SYMBOL JRST UNRES2 ;NO POINTER, NO SYMBOL ADD P3,GS.LB ;ADD IN BASE MOVE T1,0(P3) ;GET FLAGS TXNE T1,PT.SYM ;WE ONLY WANT SYMBOLS TXNN T1,PS.UDF!PS.REQ ;SEE IF UNDEFINED STILL JRST UNRES2 ;NO MOVE T1,1(P3) ;GET SYMBOL TLNN T1,770000 ;[2216] LONG SYMBOL? ADD T1,GS.LB ;[2216] YES, RELOCATE POINTER TO NAME PUSHJ P,.TSYMB## ;[2216] SIXBIT SYMBOL PUSHJ P,.TTABC## ;[2216] TAB MOVE T1,2(P3) ;VALUE PUSHJ P,.TOCTW## ;IN OCTAL PUSHJ P,.TYLPP ;NEW LINE IFE DEBSW,< ;IF DEBUGGING SCAN ALL OF TABLE SOJLE P1,UNRES3 ;DONE IF NO MORE UNDFS ;INCASE COUNT OFF> UNRES2: SOJGE P2,UNRES1 ;LOOP IF MORE SYMBOLS TO LOOK AT UNRES3: PUSHJ P,.TYLPP ;BLANK PUSHJ P,TYSTAR ;OUTPUT STARS ;NOW FOR MULTIPLY DEFINED SYMBOLS MULDF0: SKIPN MSYM ;ANY TO OUTPUT? JRST MAPIDX ;NO PUSHJ P,.TSTP5 ;SEE IF ENOUGH ROOM JFCL MOVE P1,MSYM ;GET NUMBER OF MULT-DEFS IN A PRESERVED AC MOVE T1,P1 ;WHERE SCAN EXPECTS NUMBER PUSHJ P,.TDECW## ;TYPE NO. MOVE T1,P1 ;GET MULT-DEFS AGAIN CAILE T1,2 ;LEAVE 0 OR 1 ALONE MOVEI T1,2 ;SET INDEX TO 0,1, OR 2 MOVE T1,MDFTAB-1(T1) ;GET ADDRESS PUSHJ P,.TSTRG## ;OUTPUT MESSAGE PUSHJ P,.TYLPP ;AND CR-LF PUSHJ P,.TYLPP MOVE P2,HT.PRM ;GET INDEX INTO HASH TABLE MULDF1: SKIPN P3,@HT.PTR ;GET POINTER TO SYMBOL JRST MULDF2 ;NO POINTER, NO SYMBOL ADD P3,GS.LB ;ADD IN BASE MOVE T1,0(P3) ;GET FLAGS TXNE T1,PT.SYM ;WE ONLY WANT SYMBOLS TXNN T1,PS.MDF ;SEE IF MULT-DEFINED JRST MULDF2 ;NO MOVE T1,1(P3) ;GET SYMBOL TLNN T1,770000 ;[2354] Is it a long symbol? ADD T1,GS.LB ;[2354] Yes - add GS offset to pointer PUSHJ P,.TSYMB## ;[2354] Type it out PUSHJ P,.TTABC## ;TAB MOVE T1,2(P3) ;VALUE PUSHJ P,.TOCTW## ;IN OCTAL PUSHJ P,.TYLPP ;NEW LINE IFE DEBSW,< ;IF DEBUGGING SCAN ALL OF TABLE SOJLE P1,MULDF3 ;DONE IF NO MORE UNDFS ;INCASE COUNT OFF> MULDF2: SOJGE P2,MULDF1 ;LOOP IF MORE SYMBOLS TO LOOK AT MULDF3: PUSHJ P,.TYLPP PUSHJ P,TYSTAR JRST MAPIDX UNRTAB: [ASCIZ / undefined global symbol/] [ASCIZ / undefined global symbols/] MDFTAB: [ASCIZ / multiply-defined global symbol/] [ASCIZ / multiply-defined global symbols/] SUBTTL MAP INDEX IDXHDR: ASCIZ \ Index to LINK symbol map of \ MAPIDX: MOVE T1,PRGNO SOJLE T1,MAPEND ;IGNORE INDEX IF ONLY ONE PROGRAM MOVE T1,PAGENO IFE FTOVERLAY,< SOJLE T1,MAPEND ;OR ONLY ONE PAGE > IFN FTOVERLAY,< SUB T1,FSTPGN ;- START OF THIS OVERLAY JUMPLE T1,MAPEND ;OR ONLY ONE PAGE > SETZM CNTLPP ;WANT NEW PAGE MOVEI T1,IDXHDR ;CHANGE HEADER MOVEM T1,PAGHDR PUSHJ P,.TYLPP ;AND FORCE IT OUT IFN FTOVERLAY,< MOVE T1,LNKNO. ROT T1,-1 ;USUAL WAY TO ADDRESS 1/2 WORD MOVE T2,PAGENO ;PAGE # OF INDEX JUMPL T1,[HRRM T2,@OVMIDX JRST .+2] HRLM T2,@OVMIDX >;END OF IFN FTOVERLAY PUSHJ P,IDXSRT ;SORT AND LIST JRST MAPEND ;ALL DONE ;NOW TO SORT INDEX ;USES W1, W2, W3 TO HOLD AOBJN POINTERS ;R1, R2 TO HOLD COUNT AND POSITION ;T1 T2 TO HOLD CURRENT NAME AND PAGE ;T3 T4 FOR EXCHANGE IDXLP0: MOVE W1,W2 ;GET RUNNING COPY DMOVE T1,0(W1) ;NAME & PAGE IDXLP1: CAMLE T1,2(W1) ;BIGGER THAN ONE FOLLOWING? JRST IDXSWP ;YES, MUST EXCH CAML T1,2(W1) ;HOWEVER IF JUST EQUAL JRST [CAMLE T2,3(W1) ;TEST 2ND WORD JRST IDXSWP ;SMALLER, SO SWAP JRST .+1] ;REALLY IS BIGGER DMOVE T1,2(W1) ;NO GET BIGGER ADDI W1,1 ;ACCOUNT FOR 2ND ENTRY IDXLP2: AOBJN W1,IDXLP1 ;AND FOR ALL NAMES IN TABLE AOBJP W2,CPOPJ ;ALL SORTED NOW SOJA W2,IDXLP0 ;TRY AGAIN IDXSWP: DMOVE T3,2(W1) ;GET NAME & PAGE DMOVEM T3,0(W1) ;AND STORE DMOVEM T1,2(W1) AOJA W1,IDXLP2 ;TRY NEXT IDXSRT: MOVN W2,PRGNO ;NO. OF NAMES AOJE W2,IDXFIN ;DON'T SORT IF SINGLE ITEM HRLZ W2,W2 HRR W2,MDLIDX ;-N+1,,INDEX PUSHJ P,IDXLP0 ;SORT BUFFER ; JRST IDXFIN ;PRINT RESULTS IDXFIN: MOVE R1,PRGNO ;INITIAL NO OF NAMES MOVE R2,MDLIDX ;INITIAL POSSITION IDXHDI: MOVE T1,R1 ;NO. OF MODULE NAMES LEFT CAILE T1,4* ;WILL IT FIT ON PAGE MOVEI T1,4* ;NO, JUST USE MAX SUBI R1,(T1) ;REDUCE COUNT NOW LEFT MOVE T3,T1 ;GET A COPY IDIVI T1,4 ;4 ACCROSS MOVSI W1,-4 ;AOBJN POINTER MOVEM T1,LCOUNT(W1) ;STORE COUNT SOSL T2 ;IF REMAINDER AOS LCOUNT(W1) ;COUNT ONE MORE AOBJN W1,.-3 ;LOOP FOR ALL 4 MOVSI W1,-4+1 ;RESET POINTER MOVE T1,R2 ;GET ADDRESS OF FIRST ITEM FOR THIS PAGE ADDI R2,(T3) ;INCREMENT FOR NEXT TIME ADDI R2,(T3) ;REMEMBER 2 WORDS PER ENTRY HRLI T1,(POINT 36) ;FORM BASIC BYTE PTR MOVEM T1,BYTEPT(W1) ;STORE IT ADD T1,LCOUNT(W1) ;GET TO NEXT ADD T1,LCOUNT(W1) ;2 WORDS PER ITEM MOVEM T1,BYTEPT+1(W1) AOBJN W1,.-3 ;FOR ALL IDXHD0: MOVSI W1,-4 ;BASIC LOOP MOVEI T1,[ASCIZ \ Name Page\] SKIPE LCOUNT(W1) ;ANYTHING TO OUTPUT FOR THIS COLUMN PUSHJ P,.TSTRG## AOBJN W1,.-3 PUSHJ P,.TYLPP ;END LINE PUSHJ P,.TYLPP ;AND BLANK LINE MOVSI W1,-4 ;NOW FOR OUTPUT IDXHD1: SOSGE LCOUNT(W1) ;ANYTHING TO DO JRST IDXHD2 ;NOT FOR THIS COLUMN PUSHJ P,.TTABC## ;SPACE ACROSS ILDB T1,BYTEPT(W1) ;GET NAME ILDB T2,BYTEPT(W1) ;AND PAGE LSH T2,1 ;NOW PUT BACK LSHC T1,2 ;AS SIXBIT AND PAGE NO PUSH P,T2 ;SAVE PAGE PUSHJ P,.TSIXN## PUSHJ P,.TTABC## POP P,T1 ;PAGE MOVS T1,T1 ;RIGHT JUSTIFIED MOVEI T2," " ;FILLER CHAR PUSHJ P,.TDEC2## ;DECIMAL IDXHD2: AOBJN W1,IDXHD1 ;LOOP ACCROSS PAGE PUSHJ P,.TYLPP ;END LINE MOVSI W1,-4 ;REINIT COUNTER SKIPLE LCOUNT(W1) ;DONE IF NOTHING LEFT ON THIS PAGE JRST IDXHD1 ;NO, OUTPUT NEXT LINE JUMPG R1,IDXHDI ;MORE TO COME POPJ P, ;ALL DONE MAPEND: SKIPN T2,PRGNO ;[1100] NOW DELETE INDEX BLOCK JRST MAPND0 ;[1100] BUT NOT IF ZERO LSH T2,1 ;[1100] TWO ENTRIES PER MODULE HRRZ T1,MDLIDX ;[1100] GET ADDRESS OF BLOCK JUMPE T1,MAPND0 ;[1100] UNLESS NO SYMBOLS PUSHJ P,DY.RET## ;[1100] AND FREE IT MAPND0: IFN FTOVERLAY,< SKIPGE LNKMAX ;ANY OVERLAYS? JRST MAPND1 ;NO AOS T1,LNKNO. CAMG T1,LNKMAX ;ALL DONE? JRST OVMAP0 ;NO SETZM CNTLPP ;WANT NEW PAGE MOVEI T1,OVXHDR ;CHANGE HEADER MOVEM T1,PAGHDR SETOB R2,LNKNO. ;START WITH LINK# 0 PUSHJ P,.TYLPP ;AND FORCE IT OUT MOVE R1,LNKMAX ;HIGHEST LINK NO. ADDI R1,1 ;INITIAL NO. OF LINKS OVXHDI: MOVE T1,R1 ;NO. OF MODULE NAMES LEFT CAILE T1,4* ;WILL IT FIT ON PAGE MOVEI T1,4* ;NO, JUST USE MAX SUBI R1,(T1) ;REDUCE COUNT NOW LEFT MOVE T3,T1 ;GET A COPY IDIVI T1,4 ;4 ACROSS MOVSI W1,-4 ;AOBJN POINTER MOVEM T1,LCOUNT(W1) ;STORE COUNT SOSL T2 ;IF REMAINDER AOS LCOUNT(W1) ;COUNT ONE MORE AOBJN W1,.-3 ;LOOP FOR ALL 4 MOVSI W1,-4+1 ;RESET POINTER MOVE T1,R2 ;GET ADDRESS OF FIRST ITEM FOR THIS PAGE ADDI R2,(T3) ;INCREMENT FOR NEXT TIME MOVEM T1,BYTEPT(W1) ;STORE IT ADD T1,LCOUNT(W1) ;GET TO NEXT MOVEM T1,BYTEPT+1(W1) AOBJN W1,.-2 ;FOR ALL OVXHD0: MOVSI W1,-4 ;BASIC LOOP MOVEI T1,[ASCIZ \ Overlay Page\] SKIPE LCOUNT(W1) ;ANYTHING TO OUTPUT FOR THIS COLUMN PUSHJ P,.TSTRG## AOBJN W1,.-3 PUSHJ P,.TYLPP ;END LINE PUSHJ P,.TYLPP ;AND BLANK LINE MOVSI W1,-4 ;NOW FOR OUTPUT OVXHD1: SOSGE LCOUNT(W1) ;ANYTHING TO DO JRST OVXHD2 ;NOT FOR THIS COLUMN PUSHJ P,.TTABC## ;SPACE ACROSS ;PRINT LINK NUMBER, WITH LEADING "#" TO DISTINGUISH FROM NUMERIC NAMES MOVEI T1,"#" ;SAVE CONFUSION, MARK LINKS WITH # PUSHJ P,.TCHAR## AOS T1,BYTEPT(W1) ;GET LINK# OF NEXT LINK PUSHJ P,.TDECW## PUSHJ P,.TTABC## MOVE T1,BYTEPT(W1) ;LINK# ROT T1,-1 ;1/2 WORD PICKUP JUMPL T1,[HRRZ T1,@OVMIDX ;GET PAGE # JRST .+2] HLRZ T1,@OVMIDX MOVEI T2," " ;FILLER CHAR PUSHJ P,.TDEC2## ;DECIMAL OVXHD2: AOBJN W1,OVXHD1 ;LOOP ACCROSS PAGE PUSHJ P,.TYLPP ;END LINE MOVSI W1,-4 ;REINIT COUNTER SKIPLE LCOUNT(W1) ;DONE IF NOTHING LEFT ON THIS PAGE JRST OVXHD1 ;NO, OUTPUT NEXT LINE JUMPG R1,OVXHDI ;MORE TO COME HRRZ T2,LNMPTR ;GET NUMBER OF NAMES JUMPE T2,MAPND1 ;NONE LSH T2,1 ;2 WORDS PER NAME PUSHJ P,LOGBCK ;PUT INFO MESSAGES ON TTY PUSHJ P,DY.GET## ;GET SPACE TO HOLD LIST SO WE CAN SORT MOVEM T1,MDLIDX HRLI T1,(POINT 36) MOVEM T1,MDLPTR PUSHJ P,LOGBCK ;PUT INDEX IN MAP FILE PUSHJ P,.TYLPP ;BLANK LINE MOVEI T1,OVNHDR ;NEW HEADER LINE MOVEM T1,PAGHDR ;INCASE NEEDED PUSHJ P,.TSTRG## ;OUTPUT IT ANYWAY MOVE T1,MAPNAM PUSHJ P,.TSIXN## SKIPE MAPVER ;ANY VERSION PUSHJ P,[MOVEI T1,[ASCIZ \ version \] PUSHJ P,.TSTRG## MOVE T1,MAPVER PJRST .TVERW##] PUSHJ P,.TYLPP ;END LINE PUSHJ P,.TYLPP ;BLANK LINE SEPARATOR ;NOW SORT INDEX OF LINK NAMES, USING IDXSRT. HLRZ T2,LNMPTR ;GET INITIAL PTR OVXHD4: MOVE T3,0(T2) ;GET NAME MOVE T2,1(T2) ;NUMBER ,, PTR HLRZ T1,T2 ;NUMBER ROT T1,-1 ;1/2 WORD PICKUP JUMPL T1,[HRLZ T4,@OVMIDX JRST .+2] HLLZ T4,@OVMIDX ;PAGE CORRESPONDING TO LINK# LSHC T3,-2 ;SO SIGNED TEST CAN WORK LSH T4,-1 ;SAME FOR 2ND WORD OF PAIR TXNN T3,3B3 ;IF NOT ALPHANUMERIC TXO T3,1B1 ;MAKE .,%,$ LARGER IDPB T3,MDLPTR ;STORE MODIFIED NAME IDPB T4,MDLPTR ;AND PAGE NO TRNE T2,-1 ;DONE? JRST OVXHD4 ;NOT YET PUSH P,PRGNO ;EASIEST WAY TO FAKE OUT IDXSRT HRRZ T1,LNMPTR MOVEM T1,PRGNO PUSHJ P,IDXSRT ;SORT AND LIST POP P,PRGNO HRRZ T1,MDLIDX ;[1100] FREE INDEX BLOCK FOR LINK NAMES HRRZ T2,LNMPTR ;[1100] LENGTH OF BLOCK LSH T2,1 ;[1100] WITH TWO WORDS PER LINK NAME PUSHJ P,DY.RET## ;[1100] DO THE WORK JRST MAPND1 OVXHDR: ASCIZ \ Index to overlay numbers of \ OVNHDR: ASCIZ \ Index to overlay names of \ >;END OF IFN FTOVERLAY MAPND1: PUSHJ P,.TYLPP ;BLANK LINE MOVEI T1,END1 ;AND FINAL MESSAGE PUSHJ P,.TSTRG## MOVE T1,MAPNAM PUSHJ P,.TSIXN## MOVEI T1,"]" PUSHJ P,.TCHAR## PUSHJ P,.TCRLF## MAPRET: PUSHJ P,LOGBCK ;RESTORE LOG DEVICE E$$EMS::.ERR. (MS,0,V%L,L%I,S%I,EMS,) ;[1174] MOVE T1,LS.LB ;NOW TO MAKE SURE LS.PT IS CORRECT ADD T1,LSYM ;BASE + LENGTH SUB T1,LW.LS ; - OFFSET MOVEM T1,LS.PT ;POINTS TO NEXT FREE SYMBOL SLOT SUB T1,LS.AB ;GET NO. OF FREE WORDS MOVMM T1,LS.FR ; IN LAST BLOCK SETZM LS.PP ;OK TO DEFAULT PAGE SYMBOLS AGAIN MOVE T1,MAPSW ;SEE WHAT SORT OF MAP IT WAS CAMN T1,[$MAPEND] ;@ END? JRST MAPXIT ;YES, FINISH OFF SKIPN UW.LS ;PAGING SYMBOLS? JRST MAPRT1 ;NO IFN TOPS20,< ;[2215] MOVE T1,LW.LS ;[2215] Get the lower bound MOVE T2,UW.LS ;[2215] And the upper SUBI T2,.IPM ;[2215] Leave the last page PUSHJ P,LS.OUT## ;[2215] Remove the pages > ;[2215] IFN TOPS20 MOVE T1,LS.AB ;TOP SUB T1,LS.LB ;LENGTH SUBI T1,.IPS ;MINUS LAST BLOCK ADDM T1,LW.LS ;ONLY KEEP LAST BLOCK IN CORE MOVE T1,LS.AB SUBI T1,.IPS ;LAST ADDRESS TO KEEP IFN TOPS20,< ;[2215] DON'T HAVE GBCK.L ZERO THE AREA HRLI T1,1 ;[2215] SINCE LS.OUT REMOVED IT'S PAGES > ;[2215] IFN TOPS20 PUSHJ P,GBCK.L## ;GIVE IT AWAY SETOM UW.LS ;INDICATE LS AREA AT END AGAIN MAPRT1: MOVE T1,MAPSW ;RESTORE T1 FROM GBCK.L CAMN T1,[$MAPNOW] ;@ NOW JRST MAPRT2 ;YES, CLOSE MAP AND DELETE BUFFERS CAME T1,[$MAPERROR] ;ON ERROR POPJ P, PUSHJ P,DVRLS.## ;CLOSE OUT MAP FILE RELEASE RC, ;AND LOG FILE POPJ P, ;[1535] AND GO BACK MAPRT2: SETZM MAPSW ;DONE WITH MAP SPEC PUSHJ P,DVRLS.## ;CLOSE FILE MOVEI T1,MC ;NOW DELETE BUFFERS MOVEM T1,IO.CHN PUSHJ P,DVZAP.## ;AND DATA BLOCK JRST LNKLOD ;GET NEXT F/S ;HERE IF SYMBOL AREA EMPTY NOMAP: MOVEI T1,[ASCIZ \ No symbols to output \] PUSHJ P,.TSTRG## JRST MAPRET ;AND GIVE UP IFE FTOVERLAY,< MAPXIT=LNKXIT > IFN FTOVERLAY,< MAPXIT: SKIPL LNKMAX ;ANY OVERLAYS? POPJ P, ;YES, RETURN TO LNKOV2 JRST LNKXIT ;NO > SUBTTL DATA STORAGE .ZZ==.TEMP U (OLDDEV) ;LOG DEVICE WHILE MAP IN USE U (CNTLPP) ;LINE PER PAGE U (PAGENO) ;PAGE NUMBER (STARTS AT 1) U (MAPNAM) ;SIXBIT NAME OF MAP FILE U (SYMPTR) ;POINTER TO CURRENT SYMBOL (REL TO LS.LB) U (ASTPTR) ;POINTER TO CURRENT ASSOCIATED TRIPLET (ABS) U (SAVAST) ;SAVE ASTPTR WHILE DOING MSF U (SYFLAG) ;TEMP W1 U (VALUE) ;TEMP W3 U (ZERLEN) ;-1 IF ZERO LENGTH PROG U (MAPVER) ;VERSION IN LOC 137 (REL TO LC.LB) U (CURPRG) ;CURRENT OUTPUT PROG NAME U (PAGHDR) ;POINTER TO PAGE HEADER U (MDLIDX) ;INDEX TO PROG NAMES U (MDLPTR) ;BYTE POINTER TO NAMES U (MDLCNT) ;RUNNING COUNT OF PROGRAM NAMES U (BYTEPT,4) ;BYTE POINTERS FOR OUTPUT U (LCOUNT,4) ;LINE COUNTS FOR OUTPUT U (OVMIDX) ;INDEX TO LINK NUMBERS U (ODDNESS) ;COLUMN COUNTER (ON/OFF) U (NXTTTL) ;REL POSITION OF NEXT TITLE U (SRTPTR,2) ;START AND SIZE OF SORT BUFFER U (FSTPGN) ;FIRST PAGE# OF THIS LINK U (FAKE) ;[2354] Fake title flag U (CASE) ;[2354] Upper or lower case U (CHRCNT) ;[2354] Count of characters in current symbol U (SYMONE) ;[2354] Count of characters in previous symbol U (FRSTSY) ;[2354] 0 for first symbol -1 for second symbol SUBTTL THE END MAPLIT: END LNKMAP