.MCALL .MODULE .MODULE LINK,VERSION=45,COMMENT= IDENT=NO,MODNAME=LNKEM,GLOBAL=.LNKEM ; Copyright (c) 1998 by Mentec, Inc., Nashua, NH. ; All rights reserved ; ; This software is furnished under a license for use only on a ; single computer system and may be copied only 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 except for use on such ; system and to one who agrees to these license terms. Title ; to and ownership of the software shall at all times remain ; in Mentec, Inc. ; ; The information in this document is subject to change without ; notice and should not be construed as a commitment by Digital ; Equipment Corporation, or Mentec, Inc. ; ; Digital and Mentec assume no responsibility for the use or ; reliability of its software on equipment which is not supplied ; by Digital or Mentec, and listed in the Software Product ; Description. .SBTTL LINKER ERROR PROCESSING .ENABL GBL ; CER,MAS,DBB ; EDIT HISTORY ; ADD MESSAGE 45 ;MAS06 ; XM OVERLAYS (ADD MESSAGE 46 AND CHANGE MESSAGE 34) ;MAS15 ; ADD /G SWITCH ;MAS18 ; ERROR MESSAGE ON SEGMENT NUMBER OVERFLOW ;MAS19 ; ERROR MESSAGES FOR /Q SWITCH ;MAS20 ; CHANGE FILE ERROR MESSAGES TO PRINT DD:FILNAM.EXT ;MAS27 ; ADD DUP SYMBOL ERROR MESSAGES AND MULTI-PART CAPABILITY ;DBB01 ; STANDARDIZE ERROR MESSAGES ;DBB02 ; ADD CROSS REFERENCE ERROR MESSAGES ;DBB03 .SBTTL MACRO DEFINITIONS ;+ ; MACRO TO DEFINE ALL THE ERROR NUMBERS FOR USE WITH THE ERROR$ ; MACRO. THE ERROR NUMBERS ARE ALL GLOBAL SYMBOLS, AND ARE ; NUMBERED IN OCTAL FROM 0 ON UP. ;- .MACRO ERR SYM .DSABL CRF NUM=0 .REPT SYM+1 .IRP FOO,<\NUM> ERR'FOO== NUM .ENDR NUM= NUM+1 .ENDR .ENABL CRF .ENDM BITPAT= 1767 ;BIT PATTERN FOR MOVES ON FILE ERROR ;MAS27+ ;+ ; BITPAT= 0 0 0 0 0 0 1 1 1 1 1 1 0 1 1 1 = 1767 ; : F I L N A M . E X T ; ; BY ROTATING THE BITS RIGHT (ASR) WHEN C=0 -> INSERT "." OR ":" INTO THE ; MESSAGE. EACH SET BIT CAUSES A MOVB TO OCCUR ON THE CHARS IN THE ; MESSAGE BUFFER. ;MAS27- ;- SPACE= 40 .PSECT DATA,D .PSECT CODE .MCALL .PRINT, .RCTRLO ; THIS OVERLAY PROCESSES ERROR MESSAGES. IT IS CALLED BY A LINKAGE ; ROUTINE IN THE ROOT SEGMENT. THIS SUPPORTS THE "ERROR$" MACRO ; WHERE THE LOW ORDER BYTE OF "ERCODE" CONTAINS THE ERROR NUMBER AND ; THE HIGH BYTE OF "ERCODE" CONTAINS THE MESSAGE TYPE WITH BIT 15 SET IF ; A FATAL ERROR MESSAGE. .SBTTL ERROVR:: ENTRY WHEN ERROR IN ROOT ;+ ; SPECIAL CODE FOR AN ERROR MESSAGE FROM THE ROOT. ; CALLED VIA: ; JSR R5,ERROVR ; .WORD ERROR CODE WORD ;- ERROVR::MOV (R5)+,ERCODE ;PICKUP ERROR CODE WORD CALL ERROVL ;PROCESS ERROR AS NORMAL RTS R5 .SBTTL ERROVL:: ERROR MESSAGE PROCESSING ROUTINE ;+ ; PRINT ERROR MESSAGES AND OPTIONAL REGISTER CONTENTS AND SYMBOLS AS ; BY THE ERROR CODE WORD "ERCODE". ; THE MESSAGE TYPES ARE: ; 0 PRINT A MESSAGE ON TERMINAL ; 1 PRINT MESSAGE PLUS THE CONTENTS OF R0 ; 2 PRINT MESSAGE AND R0 -> 2 WORD RAD50 SYMBOL TO PRINT ; 3 PRINT MESSAGE AND R0 -> 4 WORD RAD50 FILESPEC ; 4 PRINT MESSAGE AND R0 -> 1 WORD RAD50 DEVICE NAME ;- .ENABL LSB ERROVL::MOV R0,-(SP) ;SAVE R0 - R4 MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV ERCODE,R4 ;R4 = ERROR CODE WORD MOV R4,R3 ;MAKE COPY BIC #^C377,R3 ;ISOLATE MSG # BEQ 30$ ;SHOULD NOT GET MSG 0 CMP #LGMSG,R3 ;LEGAL MESSAGE # ? BLO 30$ ;NO MOV #MSG0,R2 ;FIND PROPER MESSAGE TEXT 10$: MOVB (R2)+,R1 ;FIND 0 OR 200 ;DBB01 BIC #177600,R1 ; FOR EACH ERROR MESSAGE ;DBB01 BNE 10$ DEC R3 ;R3=0 WHEN AT RIGHT MSG BNE 10$ ;R2 -> PROPER MESSAGE TEST WHEN DONE MOV #LINBUF,R1 ;R1 -> ERROR MESSAGE BUFR 20$: MOVB (R2)+,-(SP) ;COPY MESSAGE ;DBB01+ MOVB @SP,(R1)+ ; TO LINE BUFFER BICB #200,(SP)+ ;MESSAGE ENDS WITH A 0 OR 200 BNE 20$ ;NE -> NOT AT END YET DEC R1 ;BACKUP TO 0 OR 200 BYTE MOVB @R1,TERMIN ;SAVE PROPER TERMINATION CHARACTER ;DBB01- MOV R4,R3 ;MAKE COPY SWAB R3 ;ISOLATE MESSAGE TYPE BIC #^C77,R3 ;DBB01 BEQ EPRT ;MSG TYPE = 0 MOVB #SPACE,(R1)+ ;TEXT TO FOLLOW MSG SO ADD BLANK DECB R3 ;MSG TYPE = 1 ? BEQ EREG ;YES DECB R3 ;MSG TYPE = 2 ? BEQ ESYM ;YES DECB R3 ;MSG TYPE = 3 ? BEQ EFIL ;YES DECB R3 ;MSG TYPE = 4 ? BEQ EDEV ;YES ;IF WE GET HERE, NOT A LEGAL TYPE 30$: MOV #MSG0,R0 ;WHILE TRYING TO RECOVER FROM ANOTHER 40$: MOVB #'F,FORW ;INSERT F FOR FATAL BISB #FATAL$,@#USERRB ;INDICATE SEVERE ERROR OCURRED BIC #GTLIN$,@#JSW ;CLEAR GTLIN BIT IN JSW JMP ERROR ;FATAL ERROR, PRINT IT & RESTART .SBTTL EREG - PRINT MSG & CONTENTS OF R0 EREG: CALL OCTOUT ;CONVERT VALUE IN R0 TO ASCII BR 150$ .SBTTL EFIL - PRINT MSG & CURRENT INPUT FILENAME EFIL: MOV R0,R3 ;R0 MAY CONTAIN POINTER TO 4 WORD MSG ;MAS27+ BNE 50$ ;NE -> IT DOES MOV FILPT,R3 ;OTHERWISE, R3 -> CURRENT SAVESTATUS BLOCK ADD #F.LNM,R3 ;POINT TO START OF FILE NAME BLOCK (4 WORDS) 50$: ADD #6,R3 ;3 WDS BEYOND FOR SYM ROUTINE CALL R50ASC ;CONVERT DDFILNAMEXT TO ASCII ADD #4,R3 ;MUST BE ADD, SINCE R3 COULD BE ODD HERE!! CALL R50ASC ;DO 2 PASSES THRU ASCII CONVERSION ROUTINE. MOV R1,R0 ;SAVE POINTER TO END OF MESSAGE CMPB (R1)+,(R1)+ ;MOVE DOWN 2 BYTES FOR ":" AND "." CLRB @R1 ;MARK END OF MESSAGE MOV #BITPAT,R2 ;GET PATTERN FOR MOVING MESSAGE DOWN IN BUFFER 60$: ASR R2 ;SHIFT BIT INTO CARRY, C=1 -> MOVB BCC 70$ ;C=0 DONE WITH EXTENSION, INSERT "." MOVB -(R0),-(R1) ;MOVE PART OF EXTENSION DOWN IN BUFFER BR 60$ 70$: MOVB #'.,-(R1) ;INSERT "." IN BUFFER 80$: ASR R2 ;SHIFT FOR MOVING FILNAM DOWN BY 1 IN BUFFER BCC 90$ ;C=0, DONE MOVING FILNAM, INSERT ":" MOVB -(R0),-(R1) ;MOVE PART OF FILNAM DOWN IN BUFFER BR 80$ 90$: MOVB #':,-(R1) ;INSERT ":" ; NOW COMPACT SPACES CMPB -(R1),-(R1) ;BACK UP TO 2ND CHAR OF DEVICE NAME MOV R1,R0 ;COPY IT (1ST CHAR IS ALWAYS NON-ZERO) 100$: TSTB @R0 ;AT END OF MESSAGE? BEQ 150$ ;EQ -> YES CMPB #SPACE,(R0)+ ;IS IT A SPACE? BEQ 110$ ;EQ -> YES, REMOVE FROM MESSAGE TSTB (R1)+ ;NON-SPACE 110$: MOVB @R0,@R1 ;MOVE A CHAR BACK OVER A SPACE BR 100$ ;MAS27- EDEV: MOV R0,R3 ;R0 MAY CONTAIN POINTER TO 1 WORD MSG ;MAS27+ BNE 120$ ;NE -> IT DOES MOV FILPT,R3 ;OTHERWISE, R3 -> CURRENT SAVESTATUS BLOCK ADD #F.LNM,R3 ;POINT TO START OF FILE NAME BLOCK (4 WORDS) 120$: ADD #6,R3 ;3 WDS BEYOND FOR SYM ROUTINE MOV R1,-(SP) ;SAVE POINTER TO START OF DEV: CALL R50ASC ;CONVERT DEV TO ASCII DEC R1 CLRB -(R1) ;MARK END OF MESSAGE MOVB #':,-(R1) ;INSERT ":" ; NOW COMPACT SPACES MOV (SP)+,R1 ;POINT TO FIRST CHARACTER OF DEV: MOV R1,R0 130$: TSTB @R0 ;AT END OF MESSAGE? BEQ 150$ ;EQ -> YES CMPB #SPACE,(R0)+ ;IS IT A SPACE? BEQ 140$ ;EQ -> YES, REMOVE FROM MESSAGE TSTB (R1)+ ;NON-SPACE 140$: MOVB @R0,@R1 ;MOVE A CHAR BACK OVER A SPACE BR 130$ ;MAS27- .SBTTL ESYM - PRINT MSG & RAD50 SYMBOL ESYM: ADD #6,R0 ;3 WDS BEYOND SYM FOR ROUTINE MOV R0,R3 ;R3 -> SYMBOL FOR R50ASC CALL R50ASC ;SYMBOL TO PRINT ALSO 150$: MOVB TERMIN,@R1 ;PUT PROPER TERMINATOR IN BUFFER ;DBB01 .SBTTL EPRT - PRINT A MESSAGE EPRT: MOV #LINE,R0 ;R0 -> ERROR MESSAGE TO PRINT .RCTRLO ROL R4 ;FATAL ? ;DBB01+ BCS 40$ ;YES BMI 160$ ;MI -> WARNING MSG WITH PREFIX MOV #LINBUF,R0 ;R0 -> ERROR MESSAGE TO PRINT ;DBB01- 160$: MOVB #'W,FORW ;INSERT W FOR WARNING BISB #WARN$,@#USERRB ;INDICATE A WARNING MESSAGE WAS GIVEN .PRINT ;NO, PRINT IT AND RETURN TO CALLER MOV (SP)+,R4 ;RESTORE REGISTERS MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RETURN .DSABL LSB .SBTTL R50ASC: RAD50 TO ASCII CONVERSION ;+ ; INPUT: R1 -> ASCII CHAR OUTPUT AREA ; R3 -> SYMBOL TBL NODE-2 (3 WDS BEYOND WD TO CONVERT) ; USAGE: R2 & R0 = TEMPORARY ; R4 -> DIVISION TABLE ; @SP = # OF CHARACTERS TO BE OUTPUT ; OUTPUT:R3 -> SAME AS INPUT ; R1 -> NEXT FREE OUTPUT BYTE ; CLOBBERS R0 ;- R50ASC: SUB #6,R3 ;BACKUP 3 WDS TO SYMBOL MOV R4,-(SP) ;SAVE R4 & R2 MOV R2,-(SP) MOV #6,-(SP) ;# OF CHARS TO OUTPUT 10$: MOV #DIVTAB,R4 ;R4 -> DIVISION TABLE MOV (R3)+,R2 ;R2 = CURRENT INPUT WORD 20$: TST -(R4) ;NEW WORD REQUIRED YET? BEQ 10$ ;YES CLR R0 ;INITIALIZE QUOTIENT REG 30$: INC R0 ;DIVIDE BY APPROPRIATE POWER OF 50(8) SUB @R4,R2 BCC 30$ DEC R0 ADD @R4,R2 ;RESTORE DIVIDEND TST R0 ;CHARACTER IS A BLANK? BEQ 40$ ;YES CMP #33,R0 ;DOLLAR SIGN, PERIOD, OR DIGIT? BLO 50$ ;PERIOD OR DIGIT BEQ 60$ ;DOLLAR SIGN ADD #40,R0 ;ELSE ALPHA (A-Z) OR QUESTION MARK 40$: ADD #16,R0 50$: ADD #11,R0 60$: ADD #11,R0 70$: MOVB R0,(R1)+ ;STORE CONVERTED CHARACTER IN OUTPUT DEC @SP ;LOOP FOR MORE CHARS BNE 20$ ;YES CMP (SP)+,(R3)+ ;POP CTR & ADD 2 TO R3 MOV (SP)+,R2 MOV (SP)+,R4 RETURN .PSECT DPURE,D .WORD 0 ;END-OF-TABLE FLAG .WORD 1 .WORD 50 .WORD 3100 DIVTAB=. .PSECT CODE .SBTTL OCTOUT: OCTAL TO ASCII OUTPUT ;+ ; R0 = UNSIGNED # TO BE CONVERTED ; R1 -> ADDR OF AREA TO PLACE THE 6 ASCII DIGITS ; A TAB IS LEFT AFTER THE NUMBER & R1 -> TAB CHARACTER ;- OCTOUT: MOVB #30,@R1 SEC ;NOT NEEDED IF C=1 ON ENTRY 10$: ROL R0 ROLB (R1)+ MOVB #206,@R1 20$: ASL R0 BEQ 30$ ;IF 0 THEN DONE ROLB @R1 BCS 20$ BR 10$ 30$: MOVB #TAB,@R1 ;CHANGE 206 TO A TAB RETURN .SBTTL TABLE OF THE ADDRESSES OF THE ERROR MESSAGES .PSECT DATA .NLIST BEX ; THE ASCII AREA & BUFFER MUST BE TOGETHER TO BE PRINTED AS ONE LINE. TERMIN: .BLKB ;MESSAGE TERMINATOR (200 OR 0) ;DBB01 LINE: .NLCSI TYPE=I,PART=PREFIX FORW: .ASCII /F-/ ;CHANGED TO F OR W AS REQUIRED LINBUF: .BLKB 50. ;ERROR MESSAGE BUFFER .SBTTL LINKER ERROR MESSAGE TEXT .ENABL LC MSG0: .NLCSI TYPE=I,PART=PREFIX .ASCIZ "F-Internal error " ;DBB02 .DSABL CRF MSG1: .ASCIZ "Symbol table overflow" MSG2: .ASCIZ "Input error in" ;FILENAME MSG3: .ASCIZ "Default system library not found SYSLIB.OBJ" MSG4: .ASCIZ "Invalid record type in" ;FILENAME ;DBB02 MSG5: .ASCIZ "MAP write error" MSG6: .ASCIZ "SAV write error" MSG7: .ASCIZ "SAV read error" MSG10: .ASCIZ "Conflicting section attributes" ;SYMBOL MSG11: .ASCIZ "Insufficient memory" MSG12: .ASCIZ "Invalid device" ;DBB02 MSG13: .ASCIZ "File not found" ;FILENAME MSG14: .ASCIZ "ASECT too big" MSG15: .ASCIZ "Undefined globals:" MSG16: .ASCIZ "SAV device full" ;FILNAM MSG17: .ASCIZ "MAP device full" ;FILNAM MSG20: .ASCIZ "STB device full" ;FILNAM MSG21: .ASCIZ "Invalid GSD in" ;FILENAME ;DBB02 MSG22: .ASCIZ "Library list overflow, increase size with /P" MSG23: .ASCIZ "Old library format in" ;FILENAME MSG24: .ASCIZ "Multiple definition of" ;SYMBOL MSG25: .ASCIZ "Boundary section not found" ;*************************************************************************** MSG26: .ASCIZ " " ;"Invalid ASECT" MSG IS NEVER USED IN LINK ;MAS ;DBB02 ;*************************************************************************** MSG27: .ASCIZ "/H value too low" MSG30: .ASCIZ "Round section not found" MSG31: .ASCIZ "Transfer address undefined or in overlay" MSG32: .ASCIZ "Stack address undefined or in overlay" MSG33: .ASCIZ "Complex relocation divide by 0 in" ;FILENAME MSG34: .ASCIZ "STB write error" MSG35: .ASCIZ "Invalid complex relocation in" ;FILENAME MSG36: .ASCIZ "Invalid RLD in" ;FILENAME ;DBB02 MSG37: .ASCIZ "Additive reference of" ;SYMBOL MSG40: .ASCIZ "at segment #" ;NNN MSG41: .ASCIZ "Byte relocation error at" ;LOCATION MSG42: .ASCIZ "/O or /V option error, re-enter line" ;MAS15 MSG43: .ASCIZ "Invalid character" ;DBB02 MSG44: .ASCIZ "Storing text beyond high limit" MSG45: .ASCIZ "/U or /Y value not a power of 2" MSG46: .ASCIZ "Invalid RLD symbol in" ;FILENAME ;DBB02 MSG47: .ASCIZ "Size overflow of section" ;SYMBOL MSG50: .ASCIZ "Address space exceeded" MSG51: .ASCIZ "Complex relocation of" ;SYMBOL MSG52: .ASCIZ "REL write beyond EOF" MSG53: .ASCIZ "/S not allowed with STB or MAP files" MSG54: .ASCIZ "Extend section not found" ;SYMBOL MSG55: .ASCIZ "Word relocation error in" ;FILENAME ;MAS06 MSG56: .ASCIZ "Virtual overlay logical address space exceeded" ;MAS15 MSG57: .ASCIZ "Too many program segments" ;MAS18 MSG60: .ASCIZ "Library EPT too big, increase buffer with /G" ;MAS19 MSG61: .ASCIZ "Load address odd" ;MAS20+ MSG62: .ASCIZ "No load address" MSG63: .ASCIZ "Load address too low" ;SYMBOL MSG64: .ASCIZ "Load section not found" ;SYMBOL ;MAS20- MSG65: .ASCIZ "Too many virtual overlay regions" ;MAS15 MSG66: .ASCIZ "File created; protected file already exists" ;FILNM MSG67: .ASCIZ "Protected file already exists" ;FILNM MSG70: .ASCII "Duplicate symbol"<200> ;SYMBOL ;DBB01+ MSG71: .ASCIZ " is defined in non-library" ;FILNM MSG72: .ASCII "Duplicate symbol"<200> ;SYMBOL MSG73: .ASCIZ " is forced to the root" ;DBB01- MSG74: .ASCIZ "Cross reference input error" ;DBB03 MSG75: .ASCIZ "Cross reference device full" ;DBB03 MSG76: .ASCIZ "Cross reference output error" ;DBB03 MSG77: .ASCIZ "/M symbol not in D-space" MSG100: .ASCIZ "/T symbol not in I-space" MSG101: .ASCIZ "Boundary section not in D-space" MSG102: .ASCIZ "Boundary section not in I-space" MSG103: .ASCIZ "Extend section not in D-space" ;SYMBOL MSG104: .ASCIZ "Extend section not in I-space" ;SYMBOL MSG105: .ASCIZ "Round section not in D-space" MSG106: .ASCIZ "Round section not in I-space" .ENABL CRF LGMSG= 106 ;HIGHEST LEGAL MESSAGE NUMBER ;DBB03 ERR LGMSG ;DEFINE ERROR MESSAGE NUMBERS FOR ERROR$ .PSECT PATCH .BLKW 64. ;PSECT FOR PATCHES .END