ߋtv ?B-NO BOOT ON VOLUME @w p@w wP׭ ׭ w f& fwW#w v   @ @wP  @& 7 "  BLOCK@   IS BAD   -̂@ &   # p@ zw 7 P7 R & B g wD ѕ  Rì     s   p x] \Z 1  d s  -2&w* vLpIkQ<.;MOakQ! .;MPakQ .;MkQ .;MQakQ$ .;MRakQ.;MSakQ% .jL0ukQ .jLXukQ" .jLukQ .jLukQ.jLukQ .xekQ .f;dkQ$ .x kQ .0kQ #/}kQ.}kQ .}kQ .}kQ .rrXkQ.rrXkQ.rrXkQ.rrXkQ.rrXkQ.c.%v(c.%v(c.%v(c.%v(c.%v(c.%v(c.%v(c.%v(c.   (rXz:c.bT  (   )]  +'jL^c+f  ,M0kQ ,"cw  {Qcw C-Krcw C-3cw  -}}  -Q$:  -jLp  -  -oQ  -cw #.cw  #. Ncw #.'jL^c./TRANSFER ADDRESS = / .LIST BEX .SBTTL MISCELLANEOUS MACRO DEFINITIONS .MACRO ERROR MSG JSR R0,ERROR .ASCIZ "?'MSG'?" .EVEN .ENDM .MACRO PRINT MSG JSR R5,PR00 .WORD MSG .ENDM .MACRO LERROR MSG,REG .CSECT CHAR CHARPT=. .ASCIZ "MSG" .CSECT MAIN .IF NB REG MOV REG,R0 JSR R5,LERROR .IFF JSR R5,LERROR+2 .ENDC .WORD CHARPT .ENDM .MACRO LERRA MSG .CSECT CHAR CHARPT=. .ASCIZ "MSG" .CSECT MAIN JSR R5,LERRA .WORD CHARPT .ENDM .CSECT MAIN ;ROOT CODE .GLOBL EPTSER,LOOKUP,PR00,LERROR,LERRA,SAVREG .GLOBL BYTE,NEWBLK,GT1BYT,GETBYT,NEWBUF,SKPBLK .GLOBL POST,PASS1 .GLOBL OBUF,EOBUF,INIO,ERROR,PRINT,SEGNUM .GLOBL TSTP,OCTOUT,DECODE,DMP0,DMPA,LDAOUT .GLOBL START1,RPACK,CLOSE,SSWIT,LIBDIR,RESLIB .GLOBL GETLIB,NEWBF1,TDMP0 ;### .IF DF FB .GLOBL WRTREL,RELWRD,RELBUF,RELERR .ENDC .SBTTL OUTPUT BUFFERS OBUF: .BLKW 256. EOBUF: .SBTTL START AND EPT SEARCH ROUTINES ; ENTER HERE TO CALL START OVERLAY BR RESTRT START: MOV #STK,SP ;INIT THE STACK JMP START1 RESTRT: .RCTRLO .PRINT #CRLF CLR R0 .WAIT 0 .WAIT 3 .SRESET .UNLOCK BR START ; ENTRY POINT SEARCH ROUTINE - CALLED BY PASS1,PASS2,AND PASS3 ; SEARCH THE ENTRY POINT ABLE FOR A MATCH OF THE ; INDICATED SYMBOL. ; INTERFACE: ; R0 - DESTROYED ; R1 - POINTS TO SYMBOL TO BE SEARCHED FOR ; R2 - DESTROYED ; R4 - POINTS TO EPT SYMBOL HEAD ; R5 - POINTS TO END OF INPUT BUFFER ;RETURN INTERFACE: ; C BIT = 0 - SYMBOL FOUND ; C BIT = 1 - SYMBOL NOT FOUND ; R4 - POINTS TO END OF EPT IF SYMBOL NOT FOUND. ; OTHERWISE, IT POINTS TO THE SYMBOL AFTER THE ; FOUND SYMBOL, AND R3 POINTS TO THE FOUND SYMBOL ; BUFSWT = -1 - EPT HDR BUFFER SWITCHED ; BUFSWT = 0 - EPT HDR IN CURRENT INPUT BUFFER EPTSER: MOV #LINBUF,R0 MOV R1,-(SP) ;SAVE UNDEF SYMBOL PTR 1$: MOV R0,R3 MOV #8.,R2 2$: MOVB (R4)+,(R0)+ ;MOVE EPT ENTRY TSTB SSWIT ;LIBR DIR RES ? BEQ 3$ ;YES CMP R4,R5 ;END OF INPUT BUFFER ? BLO 3$ MOV R0,-(SP) CLRB BUFSWT ;INSURE SWITCH NEGATIVE JSR PC,NEWBF1 ;READ LIBR DIRECTORY MOV (SP)+,R0 COMB BUFSWT ;IND NOT AT EPT HEAD 3$: DEC R2 ;EPT MOVED ? BNE 2$ MOV R3,R0 INC R2 4$: CMP (R1)+,(R3)+ ;SYMBOL MATCH ? BNE 10$ DEC R2 ;CHECK 2ND HALF OF SYMBOL ? BEQ 4$ MOV R0,R3 ;PT TO FOUND SYMBOL CLC ;IND SYMBOL FOUND BR SEREXT 10$: TST @R4 ;END OF EPT? BEQ 12$ MOV @SP,R1 ;RESTORE UNDEF SYMBOL PTR BR 1$ 12$: SEC ;IND SYMBOL NOT FOUND SEREXT: MOV (SP)+,R1 RTS PC .SBTTL LIBRARY DIRECTORY RESIDENT ROUTINE ; RESLIB - MAKE THE LIBRARY DIRECTORY RESIDENT ; INTERFACE - ; R4 - POINTER TO START OF LIBRARY IN INPUT BUFFERS ; RETURN INTERFACE: ; SSWIT - (0) LIBR DIR MADE RESIDENT ; SSWIT - (+1) LIBR DIR NOT RESIDENT RESLIB: MOV R0,-(SP) ;[HJ/17-NOV-74] MOV R1,-(SP) MOV R2,-(SP) MOV EPTALO-6(R4),R1 ;GET EPT ENTRIES ALLOC. MOV DIREND,R0 ;R0 - END OF DIR BUFFER MOV LIBDIR,R2 ;GET PTR TO CORE AREA SUB R2,R0 ;HOW BIG IS IT ? ADD #2,R1 ;+ ONE WORD FOR END CMP R0,R1 ;WILL DIR FIT IN BUFFER ? BLO 1$ ADD R1,R2 ;PT TO END OF LIB DIR CLR (R2)+ ;CLEAR END OF DIR AREA CLR (R2)+ CLR R0 ;INDICATE BLOCK 0 ROR R1 ;AND GET WORD COUNT FOR READ .READW 3,LIBDIR,R1 ;READ THE EPT BCC 2$ ;BRANCH UNLESS ERROR 1$: INCB SSWIT ;INDICATE NON-RES 2$: MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RTS PC .SBTTL LIBRARY I/O ROUTINE ; GETLIB - READS THE LIBRARY FILE IN SINGLE BUFFERED ; INSTEAD OF DOUBLE BUFFERED MODE. (NOTE - 512 WORD BUFFER ) GETLIB: MOV IBUF1,R4 ;GET LIBRARY BUFFER PTR MOV LIBBLK,R0 ;GET BLK # TO READ .READW 3,R4,#512. ;READ LIBRARY FILE BCC 1$ TSTB @#ERRBYT ;FATAL I/O ERRORS BEQ 1$ ;NO JMP HARDER 1$: MOV EIBUF2,R5 ;IND END OF BUFFER ADR TST -(R5) ;MAKE BUF RIGHT SIZE MOV R5,R0 CLR (R0)+ ;CLEAR END OF BUFFER CLR (R0)+ RTS PC .SBTTL SYMBOL TABLE SEARCH ROUTINE ; ENTER WITH R3 POINTING TO 1ST WORD OF SYMBOL TO BE LOOKED UP ; (SYMBOL MUST BE TWO WORDS IN RAD50 NOTATION) ; RETURN WITH R0 POINTING TO SYMBOL TABLE ENTRY ; AND R3 POINTING TO 2ND WORD OF ARGUMENT. LOOKUP: MOV R5,-(SP) MOV (R3)+,R0 ;1ST RAD50 WORD BNE 3$ MOV MODCNT,R0 ;USE MODULE COUNT FOR BLANK CSECT NAME ASL R0 ASL R0 MOV R0,-2(R3) 3$: ADD @R3,R0 ;ADD 2ND WORD OF SYMBOL MOV STDIV,R5 ;NORMALIZED SYMBOL TABLE SIZE 1$: CMP R5,R0 ;CAN SUBTR BE DONE? BHI 2$ SUB R5,R0 2$: CLC ROR R5 ;SHIFT DIVISOR CMP R0,STSIZE ;SMALLER THAN TABLE SIZE? BHIS 1$ ASL R0 ASL R0 ASL R0 ADD SYMM6,R0 ;CALC ADDR OF TABLE ENTRY MOV STSIZE,R5 ;NUMBER OF ENTRIES TO SEARCH 4$: TST -(R3) TST @R0 ;EMPTY CELL? BEQ 8$ CMP (R3)+,(R0)+ BEQ 6$ 5$: DEC R5 BEQ LOOKNO ;ERROR: SYMBOL TABLE FILLED ADD STINCR,R0 ;INCREMENT SEARCH POINTER CMP R0,SYMEND BLO 4$ SUB STLEN,R0 BR 4$ 6$: CMP @R3,@R0 BNE 5$ ;AT THIS POINT HAVE FOUND SYMBOL @R0 7$: ADD #4,R0 ;POINT TO LAST WORD OF NODE MOV (SP)+,R5 RTS PC ;HAVE FOUND AN EMPTY LOCATION 8$: MOV (R3)+,(R0)+ MOV @R3,@R0 BR 7$ LOOKNO: ERROR ;ROUTINE TO PRINT AN ASCIZ MESSAGE IN THE OUTPUT FILE. ; ENTER WITH R1 = OUTPUT BUFFER POINTER ; R5 ARGUMENT AND RETURN POINTER ; EIBUF1 IS END OF BUFFER ; R2 IS DESTROYED PR00: MOV (R5)+,R2 ;PICK UP MSG ADDRESS 1$: MOVB (R2)+,(R1)+ ;BEGIN MOVING MESSAGE BEQ 2$ CMP R1,EIBUF1 ;END OF BUFFER? BLO 1$ JSR PC,PRINT ;DUMP PRINT BUFFER CONTENTS BR 1$ 2$: DEC R1 ;BACK UP OUTPUT PTR JSR PC,TSTP ;TEST REMAINING BUFFER SPACE RTS R5 .SBTTL LISTING ERROR HANDLERS .ENABL LSB LERROR: BR 5$ ;ENTRY TO PRINT REG & MSG JSR R1,SAVREG MOV #7$,R4 ;JUST PRINT MSG BR 6$ 5$: JSR R1,SAVREG MOV #OCTOUT,R4 BR 6$ LERRA: JSR R1,SAVREG ;ENTRY TO PRINT MSG & RAD50 SYMBOL MOV #DECODE,R4 MOV R0,R3 ;ADDR OF SYMBOL NODE 6$: MOV (R5)+,R2 ;PICK UP ADDR OF MSG MOV #LINBUF,R1 1$: MOVB (R2)+,(R1)+ ;COPY MSG TO BUFFER BNE 1$ DEC R1 MOVB #40,(R1)+ ;FOLLOW WITH A SPACE JSR PC,@R4 ;CALL CONVERSION ROUTINE CLRB -(R1) ;DELETE FINAL CHAR TST MDBLK ;MAP FILE AVAILABLE? BEQ 2$ MOVB #CR,(R1)+ MOVB #LF,(R1)+ CLRB (R1)+ SUB #LINBUF,R1 ;CALC BYTE COUNT ASR R1 ;NOW WORD COUNT .WAIT 1 .WRITW 1,#LINBUF,R1,PBLOCK BCS 3$ INC PBLOCK RTS PC 2$: .PRINT #LINBUF 7$: RTS PC 3$: ERROR .DSABL LSB SAVREG: MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) JSR PC,@R1 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 RTS R5 .SBTTL INPUT FILE HANDLERS ; ROUTINE TO GET NEXT INPUT BYTE INTO R0 BYTE: CMP R4,R5 ;END OF INPUT BUFFER? BLO 1$ JSR PC,NEWBUF 1$: MOVB (R4)+,R0 RTS PC ; ROUTINE TO GET NEXT FORMATTED BINARY BLOCK FOR INPUT ; ENTER WITH R4 POINTING TO CURRENT BUFFER POSITION ; R5 POINTING TO THE BYTE AFTER THE LAST BYTE ; OF THE CURRENT INPUT BUFFER ; CURBUF POINTING TO THE BEGINNING OF CURRENT BUFFER ; CURBLK RELATIVE BLOCK NUMBER OF BLOCK BEING READ. ;RETURNS WITH R4 POINTING TO 1ST DATA WORD OF NEW BLOCK ; R2 = NUMBER OF DATA BYTES IN THE BLOCK. ; R1 AND R3 ARE DESTROYED ; R0 = TYPE CODE OF THE BLOCK NEWBLK: CMP R4,R5 BLO 1$ JSR PC,NEWBUF 1$: TSTB (R4)+ BEQ NEWBLK ;SKIP ALL NULL BYTES CMPB -(R4),#1 BNE MODERR ;MODE ERROR, NOT FB BLOCK MOV #2,R0 MOV #TEMP,R3 JSR PC,GETBYT ;SKIP 2 BYTES & PUT 3RD IN TEMP JSR PC,GT1BYT ;NEXT BYTE IN TEMP+1 MOV -(R3),R2 ;PICK UP ASSEMBLED LENGTH OF BLOCK SUB #6,R2 ;CALC CORRECTED LEN JSR PC,GT1BYT ;GET TYPE BYTE JSR PC,BYTE ;SKIP NULL BYTE MOVB -(R3),R0 RTS PC MODERR: INC R4 ;SKIP CHARS CAUSING MODE ERR BR NEWBLK ; ROUTINE TO SKIP NUMBER OF BYTES SPECIFIED BY R0, ;AND THEN PLACE THE NEXT BYTE IN R0 AND AT (R3)+. GT1BYT: CLR R0 ;ENTRY TO MAKE R0=0 GETBYT: MOV R0,-(SP) 1$: CMP R4,R5 BLO 2$ JSR PC,NEWBUF 2$: MOVB (R4)+,R0 DEC @SP BPL 1$ MOVB R0,(R3)+ TST (SP)+ RTS PC ; ROUTINE TO SWAP INPUT BUFFERS ; UPDATES R4, R5, CURBUF, CURBLK ; DESTROYS R0!!! NEWBUF: TSTB ONEPT ;LIBRARY I/O ? BEQ NEWBF1 ;NO ADD #2,LIBBLK ;IND NEXT BLK TO READ JSR PC,GETLIB ;READ LIBRARY FILE BR NBF4 NEWBF1: MOV CURBUF,R0 ;ADDR OF CURRENT BUFFER MOV #1,-(SP) ;BEGIN SETTING UP READ CALL MOV #256.,-(SP) MOV @R0,-(SP) MOV -(R0),R5 ;STATUS OF OTHER BUFFER BEQ 1$ ;NORMAL CASE BMI NBF2 ;END OF PASS ; BUFFER BEGINS AN OVERLAY SECTION SO SET IT UP CLR @R0 ;RESET BUFFER STAT ASL R5 ;R5 POINTS TO OVERLAY BLOCK TSTB PASS ;DECIDE PASS(0=PASS1) BEQ 2$ TST (R5)+ MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) JSR PC,DMP0 ;UNLOAD LAST TXT BLK MOV @(R5)+,SEGBAS ;BASE ADDR OF OVERLAY LEVEL SUB #2,SEGBAS ;ALLOW FOR ID WORD MOV (R5)+,R4 ;SECTION ID # .IF DF FB INC RELOVL ;INC REL BLK # MOV R4,RELID1 ;SAVE SECTION ID # .ENDC MOV (R5)+,SEGBLK ;BASE BLOCK ON OUTPUT FILE MOV R5,ABWMAP ;SET UP NEW BIT MAP MOV SEGBAS,TXTBLK MOV R4,TXTBLK+2 ;SECTION ID # MOV #4,TXTLEN JSR PC,DMPA ;OUTPUT LAST OBUF OF OLD LEVEL ;AND BEGIN NEW OVERLAY LEVEL MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 .IF DF FB MOV OBLK,RLSTRT ;IND START OF OVL FOR REL BLK .ENDC BR 1$ 2$: MOV #.OVR,OVFLG ;SET OVERLAY FLAG MOV R5,ENDOL ;START NEW SYMTAB LIST FOR OVERLAY 1$: MOV @-(R0),R4 ;ADDR OF OTHER BUFFER MOV @R0,BUFADR ;IND BUFFER PTR MOV @-(R0),R5 ;END ADDR OF OTHER BUFFER MOV CURBLK,R0 INC CURBLK .WAIT 3 BCC 5$ JMP ODDRD1 5$: EMT 203 ;READ CHAN 3 BCC NBF3 JMP ODDRD NBF3: MOV BUFADR,CURBUF NBF4: RTS PC NBF2: CLR @R0 ;CLEAR BUFFER STATUS ADD #8.,SP ;CLEAR THE STACK TSTB PASS ;DECIDE PASS BNE 10$ JMP EOP1 ;GO FINISH UP PASS1 ;END OF PASS2; FINISH UP THIS LINK 10$: JSR PC,TDMP0 ;OUTPUT LAST TXT BLOCK ;### TST ODBLK ;SAVE FILE DESIRED? BEQ 2$ ;NO .IF DF LDA TSTB LSWIT ;LDA OUTPUT? BEQ 4$ ;NO CLR R2 ;YES, PREPARE TO OUTPUT LAST BUFF CLR R3 MOV #BEGBLK+8.,R1 ;CREATE A TRANFER BLOCK JSR PC,LDAOUT MOV LDAPTR,R2 ;GET OUTPUT PTR CMP R2,#OBUF ;BLOCK EMPTY? BEQ 6$ ;YES, DONE 3$: CLRB (R2)+ ;CLEAR REMAINDER OF BUFFER CMP R2,#EOBUF BLO 3$ MOV OBLK,R0 BR 5$ 4$: .ENDC .WRITW 0,#OBUF,#256.,OBLK ;WRITE FINAL BUFFER LOAD BCS HARDER .IF DF FB JSR PC,ENDREL ;TERMINATE PREVIOUS REL IF FB LINK .ENDC CLR R0 .READW 0,#OBUF,#256. ;READ BLK 0 BCS HARDER MOV #BWMAP,R1 MOV #OBUF+360,R2 ;CORE CNTRL BLOCK MOV #8.,R3 1$: MOV (R1)+,(R2)+ ;MOVE BIT MAP TO BLK 0 DEC R3 BNE 1$ .IF DF FB TSTB RSWIT ;FOREGROUND LINK ? BEQ 15$ ;NO MOV RSIZ1,R0 MOV #OBUF+RSIZE,R2 MOV R0,(R2)+ ;IND ROOT SIZE OF PGM MOV OVSIZ1,R4 SUB R0,R4 MOV R4,(R2)+ ;IND SUMS OF LARGEST OVL REGIONS MOV RELEXT,(R2)+ ;IND REL FILE ID MOV NXTBLK,R4 ASR R4 MOV R4,(R2)+ ;IND REL BLK ADR 15$: .ENDC CLR R0 TST OVFLG ;TEST IF OVERLAYED BEQ 5$ BIS #1000,OBUF+44 ;SET OVERLAY BIT IN JSW 5$: .WRITW 0,#OBUF,#256. ;REWRITE BLOCK BCS HARDER 6$: .CLOSE 0 ;CLOSE BINARY FILE BCS HARDER 2$: .CLOSE 1 ;AND CLOSE MAP FILE BCS HARDER JMP RESTRT ;BEGIN AGAIN .IF DF FB ENDREL: TSTB RSWIT ;FOREGROUND LINK ? BEQ 15$ ;NO MOV #177776,@RELPTR JSR PC,WRTREL ;WRITE REL BUFFER 15$: RTS PC .ENDC ; READ/WRITE ERROR RECOVERY ODDRD1: ADD #6,SP ;CLEAN UP STACK AFTER WAIT ERR ODDRD: TSTB @#ERRBYT ;TEST THE MONITER ERROR BYTE BNE HARDER CLOSE: .CLOSE 3 BCS HARDER MOV R5,-(SP) MOV R1,-(SP) ;SAVE REGS MOV BUFADR,R5 MOV FILPT,R1 ;PTR TO LAST OPEN FILE SUB #16.,R1 ;POINT TO NXT FILE MOV R1,R0 ;FOR RESTORE LATER TST -(R1) ;IS THIS THE END ? BMI 2$ ;YES MOV R0,FILPT ;UPDATE FILE PTR TST -(R1) MOV -(R1),-(R5) ;SET OVERLAY PTR IN BUFFER STATUS .REOPEN 3 ;REOPEN CHAN 3 BCS HARDER ;CAN'T HAPPEN **************** MOV (SP)+,R1 ;RESTORE R1 MOV (SP)+,R5 CLR CURBLK ;RESET RELATIVE BLK COUNTER JMP NEWBUF ;AND GO READ FROM NEW FILE 2$: TSTB PAS1.5 ;PASS 1.5 ? BLE 3$ CMP (SP)+,(SP)+ ;POP STACK BR STP1.5 3$: MOV #-1,-(R5) ;END OF INPUT INDICATOR 4$: MOV (SP)+,R1 ;RESTORE R1 MOV (SP)+,R5 JMP NBF3 ;RETURN TO USE FINAL BUFFER LOAD HARDER: ERROR EOP1: TST (SP)+ ;POP RETURN ADDR TSTB PAS1.5 ;PASS 1.5 REQUIRED FOR LIBR ? BLE EOP1.5 ;NO STP1.5: BISB #200,PAS1.5 ;MARK END OF PASS 1.5 NXT TIME ; PASS 1.5 SPECIAL PROCESSING ; IN ORDER TO CORRECTLY PLACE THE UNDEFINED SYMBOLS INTO ; THE ROOT SEGMENT, ALL THE DEFINED SYMBOLS IN THE ; SYMBOL TABLE MUST HAVE THEIR LINKS ZEROED. PASS 1.5 THEN ; SCANS THE INPUT MODULES AND LIBRARIES, AND PLACES THE RE- ; SOLVED LIBRARY SYMBOLS INTO THE ROOT SEGMENT. ;(NOTE - ENDOL,PTR TO END OF SYMTAB,MUST BE RESET TO PT ; TO THE 1ST SYMBOL) MOV #ASECT,R1 ;PT TO ROOT SECTION BLK MOV R1,R4 MOV @R1,R1 ;GET 1ST SYMB PTR MOV R1,R5 BR 30$ 1$: MOV R1,R4 ;SAVE SECTION BLK ADR MOV @R1,R1 ;GET REL SYMBOL ADR 2$: BIC #100007,R1 ;MASK OFF SYM PTR INDICATORS BEQ 3$ ;END OF CHAIN ? ADD SYMM20,R1 ;CALC. PTR TO SYMB NODE 30$: MOV @R1,R3 ;SAVE REL SYM PTR CLR -(R1) ;CLEAR VALUE WORD TST (R1)+ CLR @R1 ;CLEAR REL PTR WORD MOV R3,R1 ;RESTORE REL SYM PTR BR 2$ 3$: MOV R4,R1 ADD #26.,R1 ;PT TO NXT SECT BLK ON LVL ADR MOV @R1,R1 ;ANOTHER SECTION BLK ? BNE 1$ ;YES TST (R4)+ MOV @R4,R4 ;GET OVL LVL BLK ADR SUB #6,R4 MOV @R4,R4 ;GET NXT LVL BLK ADR BEQ 10$ ;NO - MORE LVL BLKS ? SUB #4,R4 MOV @R4,R1 ;GET SECT BLKS THIS LVL ADR BR 1$ 10$: MOV R5,ENDOL ;RESET END OF LIST PTR MOV #.CSECT,@R5 ;SET CSECT BIT IN ASECT CLR OVFLG ;RESET OVERLAY INDICATOR JMP PASS1 ;CALL PASS 1.5 EOP1.5: JMP POST ;GO TO POST PASS1 ROUTINE ; ROUTINE TO SKIP FB BLOCKS ON INPUT ; ENTER WITH POINTER TO BLOCK IN R4 ; END OF CURRENT INPUT BUFFER IN R5 ; AND LENGTH OF BLOCK IN R2. ; DESTROYS R0!!! SKPBLK: INC R2 ;INCLUDE CHECKSUM BYTE 1$: ADD R2,R4 CMP R4,R5 BLO 2$ MOV R4,R2 SUB R5,R2 JSR PC,NEWBUF BR 1$ 2$: RTS PC INIO: MOV R0,FILPT .REOPEN 3 MOV #IBUF1,CURBUF CLR CURBLK CLR IBUF1-2 CLR IBUF2-2 JSR PC,NEWBUF JSR PC,NEWBUF MOV #1,MODCNT RTS PC ; ;CHECK IF TEXT BLOCK IS ON ODD BOUNDARY, IF SO-MOVE IT BACK ;THEN OUTPUT IT. TEXT WAS MOVED AT DMPTXT. ;USES R1,R2,R3,R0 (CALLS DMP0) ; OTHER AREAS AFFECTED BY THIS FIX ARE LOC PA2RLD IN LNKOV4. ; LOC PA2RLD IN LNKOV5 ; LOC DMPTXT IN LNKOV5 ; LOC NBF2 IN LINK0 ; LOC DMPTXT IN LNKOV4 ; TDMP0: MOV #TXTBLK,R1 ;ADDR OF TXTBLK ;### BIT #1,(R1)+ ;IS PROG ADDR IN TXTBLK ODD? ;### BEQ 7$ ;IF EQ-NO ;### MOV TXTLEN,R2 ;YES-PUT LENGTH IN R2 ;### 8$: MOVB 1(R1),(R1)+ ;MOVE TXT BACK A BYTE(LOWER) ;### DEC R2 ;MOVED ALL? ;### BGE 8$ ;IF GE-NO ;### 7$: JMP DMP0 ;YES-OUTPUT TEXT BLOCK ;### ERROR: .PRINT JMP RESTRT .SBTTL DUMP TEXT SUBROUTINE (ROOT SEGMENT) ; COME HERE TO UNLOAD CONTENTS OF TEXT BUFFER ; THERE ARE FIVE POSSIBLE CASES: ; 1. ALL TXT FALLS BEFORE OBUF WINDOW (A) ; 2. PART OF TXT FALLS BEFORE OBUF (B) ; 3. ALL OF TXT FALLS WITHIN OBUF (C) ; 4. PART OF TXT FALLS AFTER OBUF (D) ; 5. ALL OF TXT FALLS AFTER OBUF (A) ; THIS ROUTINE DISTINGUISHES THE CASES, AND MOVES THE ; WINDOW IF NECESSARY IN ORDER TO DUMP THE CONTENTS OF TXTBLK DMP0: MOV TXTLEN,R2 ;AND GET LEN OF OLD BLK SUB #2,R2 BLE 2$ ;EXIT IF NO TXT MOV R2,R3 MOV #TXTBLK,R1 ;ADDR OF WORD ALIGNED TEXT .IF DF LDA TSTB LSWIT BEQ 10$ JMP LDAOUT 10$: .ENDC MOV (R1)+,R0 ;R0 = FINAL ABS ADR OF TEXT SUB PADDR,R0 ;MAKE RELATIVE TO WINDOW BLO DMPBA ;BRANCH IF CASE A OR B ADD R0,R3 ;ADD LENGTH OF TEXT BLK SUB #512.,R3 ;MINUS LENGTH OF WINDOW BHI DMPDA ;BRANCH IF CASE A OR D ADD #OBUF,R0 ;ENTIRE TXT BLK FITS INTO OBUF 1$: MOVB (R1)+,(R0)+ ;MOVE TXT BLK TO OUTPUT BUFFER DEC R2 BNE 1$ 2$: CLR TXTLEN ;MARK BLOCK EMPTY RTS PC ;RETURN DMPBA: ADD R0,R3 ;ANY OF TXT WITHIN WINDOW ? BCC DMPA ;BRANCH IF NOT (CASE A) BEQ DMPA ;ALSO MIGHT BE ZERO NEG R0 ;LAST PART OF TXT FITS INTO OBUF MOV R0,TXTLEN ;STORE LEN OF PART THAT DOEN'T FIT ADD R0,R1 MOV #OBUF,R0 BR DMP4 ;GO MOVE PORTION THAT FITS DMPDA: CMP R0,#512. ;ANY OF TXT WITHIN WINDOW BHIS DMPA ;NO MOV R3,TXTLEN ;1ST PART OF TXT FITS INTO OBUF SUB R3,R2 ;CALC LEN OF PART THAT FITS ADD #OBUF,R0 ;AND ITS ADDR 3$: MOVB (R1)+,(R0)+ ;MOVE PORTION THAT FITS DEC R2 BNE 3$ MOV #TXTBLK,R0 ;NOW MOVE UP REMAINING TXT MOV PADDR,R2 ADD #512.,R2 MOV R2,(R0)+ ;STORE ABS ADR OF REMAINING TXT DMP4: MOVB (R1)+,(R0)+ DEC R3 BNE DMP4 ADD #2,TXTLEN ;ALLOW FOR ADDR WORD DMPA: TST ODBLK BEQ 1$ .WRITE 0,#OBUF,#256.,OBLK ;WRITE OUT OBUF BCC 1$ .IF DF FB TSTB RSWIT ;FOREGROUND LINK ? BEQ 10$ JMP RELERR 10$: .ENDC ERROR 1$: MOV TXTBLK,R1 ;ABS ADDR OF CURRENT TXT SUB SEGBAS,R1 ;SEGBAS=0 FOR ROOT SEGMENT BCS DMPBAD ;OVERLAY ATTEMPTS TO STORE TXT ;OUTSIDE ITS AREA BIC #000777,R1 ;FIND NEAREST BLK BOUNDARY MOV R1,PADDR ;PROG ADR OF NEW OBUF CONTENTS ADD SEGBAS,PADDR ;(ABSOLUTE) CLRB R1 ;NOW CALC DEV BLK NUMBER SWAB R1 ;ALSO CLEARS CARRY BIT ROR R1 MOV R1,R0 ;PREVENT BIT TABLE OVERFLOW ADD SEGBLK,R1 ;BLK 0 FOR ROOT SEGMENT MOV R1,OBLK ;REL BLOCK # OF NEW OBUF MOV R0,R1 ASR R1 ;NOW ADDR THE BLOCK BIT MAP ASR R1 ASR R1 ADD ABWMAP,R1 ;ADDR OF BYTE WITHIN MAP BIC #177770,R0 ;BIT WITHIN BYTE CLR R2 SEC 7$: RORB R2 DEC R0 BPL 7$ MOV #256.,R0 CLR -(SP) BITB R2,@R1 ;BIT ALREADY SET FOR NEW BLK ? BNE DMREAD ;YES, GO READ BLK FIRST BISB R2,@R1 ;SET BIT NOW DMREAD: MOV R0,-(SP) ;WORD COUNT (0 IF SEEK ONLY) MOV #OBUF,-(SP) MOV OBLK,R0 .WAIT 0 EMT 200 ;READ OR SEEK NEXT BLK JMP DMP0 ;GO TRY AGAIN TO UNLOAD TXT .SBTTL LDA OUTPUT ROUTINES .IF DF LDA LDAOUT: JSR PC,FBSTRT ;START A FOMATTED BINARY BLK ADD #2,R3 1$: MOVB (R1)+,R0 ;NEXT BYTE TO BE OUTPUT JSR PC,LDABYT ;WRITE TO OUTPUT DEC R3 ;DECREMENT COUNT BNE 1$ JSR PC,FBFIN ;CLOSE FORMATTED BINARY BLK RTS PC FBSTRT: ADD #6,R2 ;CALC ACTUAL LENGHT OF BLK MOV R2,-(SP) ;SAVE LENGTH MOV LDAPTR,R2 ;SET UP BUFFER POINTER CLR CKSUM ;INIT THE CHECKSUM MOV #1,R0 ;FLAG BEGINNING OF FB BLK JSR PC,LDABYT CLR R0 JSR PC,LDABYT MOV @SP,R0 JSR PC,LDABYT MOV (SP)+,R0 SWAB R0 JSR PC,LDABYT RTS PC FBFIN: MOV CKSUM,R0 NEG R0 JSR PC,LDABYT MOV R2,LDAPTR ;SAVE FINAL BUFFER PT RTS PC LDABYT: BIC #177400,R0 ;BYTE TO BE OUTPUT ADD R0,CKSUM TST R2 ;LDA OUTPUT FILE ? BEQ 10$ ;NO MOVB R0,(R2)+ ;MOVE TO OUTPUT BUFFER CMP R2,#EOBUF ;BUFFER FULL ? BHIS 1$ ;YES 10$: RTS PC 1$: MOV #OBUF,R2 .WRITW 0,R2,#256.,OBLK BCS 2$ INC OBLK RTS PC 2$: ERROR .ENDC ;LDA DMPBAD: JSR PC,SEGNUM ;CALC SEGMENT # LERROR ,R0 ;OVERLAY ATTEMPTS TO STORE BIN ;TXT OUTSIDE ITSELF (ASECT PROB) CLR TXTLEN RTS PC SEGNUM: MOV R1,-(SP) MOV RELID1,R1 ;GET OVERLAY ID NUMBER CLR R0 1$: INC R0 ;OVERLAY # IS THE NUMBER * 6, SUB #6,R1 ;THEREFORE TO GET THE ID # , BGE 1$ ;DIVIDE BY 6 DEC R0 MOV (SP)+,R1 RTS PC .SBTTL MOD40 AND OCTAL PRINT ROUTINES ; MOD40 UNPACKER ; ENTER WITH R1 POINTING TO ASCII CHAR AREA ; R3 POINTING TO SYMBOL TABLE NODE-2 TO BE UNPACKED ; RO THROUGH R3 ARE CHANGED BY THIS ROUTINE DECODE: MOV R4,-(SP) CMP -(R3),-(R3) MOV #EXPAND,R4 ;ADDR OF LIST OF DIVISORS MOV (R3)+,R2 CMP R2,@R4 BLO 8$ ;PRINT NAME OF BLANK CSECT AS BLNK 2$: CLR R0 3$: CMP R2,@R4 BLO 4$ SUB @R4,R2 INC R0 BR 3$ 1$: MOV R2,R0 MOV (R3)+,R2 4$: TSTB R0 ;BLNK ? BEQ 5$ CMPB R0,#33 ;DOLLAR SIGN ? BEQ 7$ BGT 6$ ;DIGIT ADD #40,R0 ;LETTER 5$: ADD #16,R0 6$: ADD #11,R0 7$: ADD #11,R0 MOVB R0,(R1)+ TST -(R4) ;MOVE ON TO NEXT DIVISOR BGT 2$ BEQ 1$ ;START NEW WORD 9$: MOV (SP)+,R4 BR OCT4 ; "NAME" OF BLANK CSECT CAN PRINT UP TO 7 CHARS IF DESIRED. ; MOVE AS MANY CHARS (UP TO 7) AS YOU WISH TO (R1)+ OR CALL ; PRINT (NOT .PRINT) TO DO IT FOR YOU AT LABEL "8$:" 8$: CMP (R3)+,(R3)+ BR 9$ ; OCTOUT ROUTINE ; PRINT THE NUMBER IN R0 IN OCTAL FORM AT THE LOCATION POINTED ; TO BY R1. RO AND R2 DESTROYED. A TAB IS LEFT AFTER TE NUMBER OCTOUT: MOVB #30,@R1 ;P00001 SEC 1$: ROL R0 ROLB (R1)+ MOVB #206,@R1 2$: ASL R0 BEQ OCT4 ROLB @R1 BCS 2$ BR 1$ OCT4: MOVB #11,(R1)+ ;OUTPUT A TAB TSTP: MOV EIBUF1,R2 SUB #12,R2 CMP R1,R2 ;END OF BUFFER ? BLO OCT6 PRINT: MOV IBUF1,R1 ;ENTER HERE TO PRINT BUF CONT MOV #256.,R2 TST MDBLK ;MAP DESIRED ? BEQ 4$ .WRITW 1,R1,R2,PBLOCK ; WRITE TO MAPOUT FILE BCC 4$ ERROR 4$: INC PBLOCK 5$: CLR (R1)+ DEC R2 BGT 5$ MOV IBUF1,R1 OCT6: RTS PC ; RPACK SUBROUTINE ; ENTER WITH R5 = NUMBER OF CHARACTERS TO ACCEPT (MAX) ; R4 = POINTER TO WHER RESULT IS TO BE PLACED ; R0,R1 ARE DESTROYED ; N CH@RACTERS ARE ACCEPTED FROM THE TTY AND CONVERTED TO ; RAD50 AND STORED IN THE RESULT LOCATION. RPACK: MOV R3,-(SP) 11$: MOV #3,R3 CLR R1 ;CLEAR RAD 50 WORD 5$: .TTYIN ;GET NEXT CHAR CMPB R0,#CR ;END OF LINE ? BEQ 9$ CMPB R0,#40 ;BLANK ? BEQ 2$ CMPB R0,#'$ BEQ 4$ CMPB R0,#'A BLO 3$ SUB #40,R0 2$: SUB #16,R0 3$: SUB #11,R0 4$: SUB #11,R0 7$: MOV R1,-(SP) ;NOW MULT PREV BY 50 ASL R1 ASL R1 ADD (SP)+,R1 ;5 * R1 ASL R1 ASL R1 ASL R1 ;50 * R1 ADD R0,R1 ;INCLUDE CURRENT CHAR DEC R3 BLE 6$ DEC R5 ;DONE REQUIRED CHARS ? BGT 5$ 10$: CLR R0 ;YES FINISH CURENT WORD ONLY BR 7$ 6$: MOV R1,(R4)+ ;STORE A COMPLETED RAD50 WORD DEC R5 ;DONE ? BGT 11$ 8$: .TTYIN ;SEARCH FOR A LINE TERM CMPB R0,#LF BNE 8$ MOV (SP)+,R3 RTS PC 9$: CLR R5 ;FOUND CR, FINISH CURRENT WORD BR 10$ .END START .TITLE LNKOV1 V04-03 RTLINK START & INITIALIZATION LOGIC ; RT-11 LINKER ; ; DEC-11-ORLLA-E ; ; MAY 16,1974 ; ; EP/ ENHANCED BY JG ; ; COPYRIGHT (C) 1974,1975 ; ; DIGITAL EQUIPMENT CORPORATION ; MAYNARD, MASSACHUSETTS 01754 ; ; 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 DIGITAL. ; ; 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. .PAGE .SBTTL SYMBOLIC CONSTANTS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 TAB= 11 LF= 12 FF= 14 CR= 15 SPAC= 40 PER= 56 GSD= 1 ;OBJECT MODULE CODES TXT= 3 RLD= 4 MODEND= 6 LBR= 7 ;LIBRARY MODULE CODE LBREND= 10 ;LIBRARY END CODE BYTBLK= 512. ;BYTE BLOCK SIZE BEGIN= 40 ;DISPS INTO SYS JOB DATA AREA JSTACK= 42 ;JOB'S INITIAL STACK POINTER JSTATS= 44 ;JOB STATUS WORD USRLOC= 46 ;ADDR OF SWAPPING USR HIGH= 50 ;HIGHEST LOC USED BY USER ERRBYT= 52 ;MONITOR ERROR INDICATOR MONLOW= 54 ;ADDR OF RMON LOWER LIMIT RSIZE= 52 ;ROOT SIZE OF PGM OVSIZE= 54 ;SUMS OF THE LARGEST OVERLAY REGIONS RELID= 56 ;F/B IDENTIFIER ADR RELBLK= 60 ;ADR OF REL BLK (BLOCK #) .CSECT= 2 ;LINKER SYMBOL TABLE FLAGS .OVR= 4 $DEFIN= 10 ;GSD FLAGS $RELOC= 40 ; OFFSETS INTO ENTRY POINT TABLE EPTALO= 30 ;EPT ENTRIES ALLOCATED(BYTES) LHEND= 44 ;REL END OF LBR HEADER ;OFFSETS INTO OVERLAY SECTION BLOCK LEVPTR= 2 ;POINTER TO LEVEL BLOCK IDNO= 4 ;OVERLAY SECTION ID NUMBER BASBLK= 6 ;BASE BLOCK OF SECTION ON OUTPUT SECLEN= 30 ;SECTION LENGTH NXSPTR= 32 ;POINTER TO NEXT SECTION SAME LEVEL LVLN= -8. ;OFFSETS INTO OVERLAY LEVEL BLOCK LVLP= -6 SECP= -4 OVJOB= 1000 ;BIT IN JSTATS WORD TO INDICATE ;AN OVERLAY JOB ; USEFUL EMT INSTRUCTIONS LKEMT= EMT+20 ;LOOKUP EMT SSEMT= EMT+120 ;SAVESTATUS EMT WEMT= EMT+240 ;WAIT EMT SEVENK= 20700 ;MIN CORE NEEDED TO START LINKER ELEVNK= 40700 ;CORE NEEDED TO MAKE FORLIB DIRECTORY ; /RESIDENT (JUST UNDER 11 K) FOURK= 20000 ;MAX SIZE OF FORLIB DIRECTORY LMLMAX= 4000 ;MAX SIZE OF LIBRARY MOD LIST .MCALL ..V1.. ..V1.. .MCALL .CSISPC,.CSIGEN,.SETTOP,.LOCK,.UNLOCK .MCALL .FETCH,.LOOKUP,.PRINT,.TTYIN,.WAIT,.ENTER .MCALL .CLOSE,.SRESET,.READW,.WRITW,.WRITE .MCALL .REOPEN,.RCTRLO,.QSET,.DATE,.EXIT LDA= 0 ;TURN ON LDA FEATURE FB= 0 ;TURN ON FB .NLIST BEX .NLIST CND .SBTTL MISCELLANEOUS MACRO DEFINITIONS .MACRO ERROR MSG JSR R0,ERROR .ASCIZ "?'MSG'?" .EVEN .ENDM .MACRO PRINT MSG JSR R5,PR00 .WORD MSG .ENDM .MACRO LERROR MSG,REG .CSECT CHAR1 CHARPT=. .ASCIZ "MSG" .CSECT MAIN1 .IF NB REG MOV REG,R0 JSR R5,LERROR .IFF JSR R5,LERROR+2 .ENDC .WORD CHARPT .ENDM .MACRO LERRA MSG .CSECT CHAR1 CHARPT=. .ASCIZ "MSG" .CSECT MAIN1 JSR R5,LERRA .WORD CHARPT .ENDM .SBTTL START & INITIALIZATION MESSAGES .CSECT CHAR1 ABS: .RAD50 /. ABS./ STKMSG: .ASCIZ /STACK ADDRESS = / IMSG: .ASCIZ /LIBRARY SEARCH: / .EVEN DEFLIB: .RAD50 /SY / .RAD50 /FOR/ .RAD50 /LIB/ .RAD50 /OBJ/ OIGN: .ASCIZ "/O IGNORED" BSWI: .ASCII "BAD " BSWIC: .ASCIZ " SWITCH IGNORED" .SBTTL SYMBOL TABLE INITIALIZATION ; ENTER WITH R3 POINTING TO FIRST LOCATION OF AVAILABLE SPACE .CSECT MAIN1 .GLOBL INIT,START1,BSWIT,BEGLML .GLOBL STLEN,SYMEND,STSIZE,STINCR,STDIV,SYMM12 .GLOBL SYMM6,SYMM20,SYMM22,LOOKUP,ASECT .GLOBL BEGBLK,ENDOL,ISWIT,TEMP,RPACK .GLOBL FILPT1,STK,IMPURE,IMPURT,BEGBLK,LERROR .GLOBL BWMAP,ABWMAP,DOLB,DOSB,BOTTOM,ODBLK .GLOBL DEFEXT,ERROR,CRLF,TAM,CSWIT,ASWIT .GLOBL MSWIT,SEGBLK,NXTBLK,OBLK,LSWIT,LDAEXT .GLOBL FSWIT,SECNUM .GLOBL OBUF,LDAPTR,MDBLK,LIMIT,INIO,OVSPTR .GLOBL PASS1,SSWIT,LIBDIR,LERRA,DIREND,IBUF1 .GLOBL STKBLK,STLML,LMLSWT,PA2LML,EIBUF1,EIBUF2 .IF DF FB .GLOBL RSWIT,RELEXT,RELID1,OVLNUM .ENDC INIT: ADD #5,R3 ;ROUND R3 TO NEXT MULT OF 8 BIC #7,R3 ADD #2,R3 ;PLUS TWO MOV @#MONLOW,R0 ;LOW LIMIT OF MONITOR MOV R0,R1 MOV 266(R0),R0 ;PT TO USR BIT #1000,300(R1) ;SET USR NOSWAP ? BNE 20$ ;YES - DON'T INCLUDE USR AREA ADD #7776,R0 ;PT TO TOP OF USR 20$: BIC #7,R0 ;NEXT MULT OF 8 ADD #2,R0 ;PLUS TWO 8$: CMP R3,R0 BLO 9$ JMP NOCORE 9$: MOV R0,R1 SUB R3,R1 BPL 1$ ;LIMIT SIZE OF SYMBOL TABLE TO MOV #77760,R1 ;16K WORDS MOV R3,R0 ADD R1,R0 1$: SUB #10,R1 BIT #10,R1 ;MUST BE AN ODD NUMBER OF ENTRIES BNE 2$ SUB #10,R0 BR 8$ 2$: MOV R1,STLEN ;TABLE LENGTH IN BYTES .SETTOP R0 ;SET TO TOP OF FREE CORE MOV R0,SYMEND ;ADR OF 1ST FREE LOCATION AFTER TABLE MOV R1,R0 ASR R1 ASR R1 ASR R1 MOV R1,STSIZE ;SYMBOL TABLE SIZE (# OF ENTRIES) MOV #40000,R1 3$: CMP R1,R0 BLOS 4$ ASR R1 BR 3$ 4$: ASR R1 ASR R1 CMP R1,#8. ;MAKE SURE INCR IS AT LEAST 8 BHIS 5$ MOV #8.,R1 5$: SUB #2,R1 MOV R1,STINCR ;SYMBOL TABLE INCREMENT = ;GREATEST POWER OF 2 <= STLEN/4 6$: ASL R0 BPL 6$ MOV R0,STDIV ;TO USE FOR DIVISIONS IN LOOKUP ;NOW SET UP HEADCELL OF UNDEFINED SYMBOLS, ETC... CLR (R3)+ CLR (R3)+ MOV R3,R0 MOV R3,SYMM12 ;SAVE FOR LATER ADD #2,R0 MOV R0,(R3)+ ;POINT HEADCELL TO MOV #177767,(R3)+ ;ITSELF TO START MOV R3,SYMM6 MOV R3,R0 SUB #12,R3 MOV R3,SYMM20 SUB #2,R3 MOV R3,SYMM22 MOV SYMEND,R1 7$: CLR (R0)+ ;SET SYMBOL TABLE TO ZEROS CMP R0,R1 BLO 7$ MOV #ABS,R3 ;ENTER THE ASECT INTO TABLE JSR PC,LOOKUP MOV R0,ASECT ;AND SET UP POINTERS TO IT MOV #.CSECT,@R0 ;SET CSECT BIT IN ASECT MOV #1,BEGBLK ;MODCNT OF ASECT MOV R0,ENDOL ; /I SWITCH MODIFICATIONS START HERE TSTB ISWIT ;INCLUDE GLOBALS ? BEQ NGLOB1 ;NO-BRANCH ; REQUEST THE USER TO ENTER THE GLOBALS TO BE SEARCHED ; FROM THE LIBRARY .PRINT #IMSG ;REQUEST USER SPECIFICATION MOV #TEMP,R4 ;IND INPUT PTR TO RPACK RTN 15$: MOV R4,R3 ;SAVE INPUT PTR CLR (R4)+ ;INITIALIZE GLOBAL INPUT AREA CLR @R4 MOV R3,R4 MOV #6,R5 ;INDICATE MAX # OF CHARS JSR PC,RPACK ;GET USER INPUT MOV R3,R4 ;RESTORE INPUT PTR TST @R4 ;MORE GLOBAL INPUT ? BEQ NGLOB1 ;NO BRANCH ; THE FOLLOWING CODE CREATES A SYMBOL TABLE ENTRY IN THE ; UNDEFINED SYMBOL TABLE LIST. (THE USE HAS SPECIFIED ; THE CSECT NAMES THAT ARE PLACED IN THE UNDEFINED ; SYMBOL TABLE) JSR PC,LOOKUP ;PUT UNDEF IN SYM. TAB. MOV SYMM12,R1 ;GET SYMMTAB-12 PTR MOV @R1,-(SP) ;SAVE PTR TO HEAD OF LIST MOV R0,@R1 ;ADR OF SYM TAB IN UNDEF LIST MOV #177767,@R0 ;POINT TO LIST HEAD MOV R0,R1 SUB SYMM20,R1 ;CREATE NEXT ENTRY ADR COM R1 ;IND UNDEFINED SYMBOL MOV (SP)+,-(R0) ;IND BKWD PTR TO HEAD UNDEF LIST MOV R1,@(R0)+ ;UNDEF ADR IN WRD 6 OF SYM. ENTRY BR 15$ ;LOOK FOR MORE GLOBALS TO LNK ; END OF /I SWITCH MODIFICATIONS NGLOB1: JMP PASS1 ;CALL PASS1 OVERLAY .SBTTL PROGRAM START START1: MOV #IMPURE,R1 ;ADDR OF IMPURE AREA TO BE CLEARED MOV #IMPURT,R2 ;END OF AREA 20$: CLR (R1)+ CMP R1,R2 BLO 20$ BIS #20000,@#JSTATS ;MARK LINKER RESTARTABLE MOV #DOSB,OVSPTR MOV #1,BEGBLK MOV ABS,BEGBLK+2 MOV ABS+2,BEGBLK+4 MOV #1,BEGBLK+8. ;INITIAL TRANSFER ADDRESS MOV #BWMAP,ABWMAP ;POINTER TO BIT MAP MOV #DOLB,DOSB+LEVPTR MOV #DOSB,DOLB+SECP MOV #1000,BOTTOM ;INITIAL BOTTOM ADDRESS .SETTOP #SEVENK .IF DF FB CMP @#HIGH,#SEVENK-2 ;REQUEST GRANTED ? BHIS FB1 ; FATAL CORE ERROR - LINKER CAN NOT START FB0: LERROR .EXIT ;RETURN TO COMMAND MODE FB1: .ENDC MOV @#MONLOW,R0 ;GET LOW LIMIT OF MONITOR CMP 266(R0),#SEVENK ;UNLOCK USR ? BHI 1$ BR FB0 1$: .LOCK ;NOT OVER USR, THEREFORE LOCK IT MOV #ODBLK,R1 .CSISPC R1,#DEFEXT,#0 ;REQUEST 1ST COMMAND MOV LIMIT+2,R3 ;TOP OF ASSEMBLED CODE .ENABL LSB .QSET R3,#2 ;ADD 2 ITEMS TO I/O QUEUE MOV R0,R3 ;UPDATE FREE CORE POINTER TST @R1 ;ANY BINOUT FILE? BEQ 11$ ;NO 10$: .FETCH R3,R1 ;FETCH BINOUT HANDLER BCS ERFETC ;ERROR IN FETCH MOV R0,R3 ;UPDATE POINTER 11$: ADD #10.,R1 TST @R1 ;ANY MAPOUT? BEQ 2$ ;NO 1$: .FETCH R3,R1 BCS ERFETC MOV R0,R3 2$: ADD #10.,R1 TST @R1 ;ANOTHER OUTPUT FILE? BEQ 5$ ERROR ERFETC: ERROR 5$: MOV #3,R5 ;INITIAL INPUT CHANNEL ADD #2,R1 3$: ADD #8.,R1 ;POINT TO NEXT INPUT FILE TST @R1 ;ANY FILE BEQ 4$ ;NO .FETCH R3,R1 ;YES, FETCH HANDLER BCS ERFETC MOV R0,R3 MOV R1,R0 ;BEGIN LOOKUP MOV #LKEMT,R4 ;LOOKUP EMT ADD R5,R4 ;PLUS CHANNEL NUMBER MOV R4,@PC ;AND STORE INTO INSTR STREAM EMT 23 ;LOOKUP - MODIFIED AT RUNTIME BCC 4$ ERROR 4$: INC R5 ;NEXT CHANNEL CMP R5,#8. ;LAST CHANNEL? BLOS 3$ MOV (SP)+,R2 ;GET SWITCH COUNT FROM CSI BNE SWLOOP ;PROCESS SWITCHES JMP SWEND ;NO SWITCHES .DSABL LSB ; PROCESS 1ST COMMAND STRING SWITCHES SWLOOP: CMPB @SP,#'T ;TRANSFER ADDR SW? BNE 3$ ;NO TST (SP)+ ;VALUE GIVEN? BMI 4$ ;YES .PRINT #TAM+3 ;TYPE "TRANSFER ADDRESS = " MOV #BEGBLK+2,R4 ;LOCATION TO ASSEMBLE TRANSFER SYMBOL MOV #6,R5 ;CHAR COUNT CLR BEGBLK+4 JSR PC,RPACK ;GO GET BEGIN SYMBOL FROM TTY CLR BEGBLK+8. ;INDICATE BEGIN SYMBOL HAS BEEN SEEN JMP SWEN0 4$: MOV (SP)+,BEGBLK+8. ;SAVE OCTAL ADDR JMP SWEN0 3$: CMPB @SP,#'B ;BOTTOM SWITCH? BNE 7$ TST (SP)+ ;MUST HAVE VALUE BPL 9$ ;ERROR - NO VALUE BIT #1,@SP ;MUST NOT BE ODD BEQ 11$ ERROR 11$: INCB BSWIT ;IND BOTTOM SWITCH MOV (SP)+,BOTTOM BR SWEN0 9$: ERROR 7$: CMPB @SP,#'C ;CONTINUE SWITCH? BNE 14$ INCB CSWIT BR SWEN1 14$: CMPB @SP,#'A ;/A (ALPHABETICAL LISTING)? BNE 16$ INCB ASWIT BR SWEN1 16$: CMPB @SP,#'M ;STACK MODIFICATION SWITCH ? BNE 15$ TST (SP)+ ;VALUE GIVEN ? BMI 17$ ;YES .PRINT #STKMSG+3 ;REQUEST USER TO ENTER STACK ADDRESS MOV #STKBLK,R4 ;LOCATION TO ASSEMBLE STACK SYMBOL MOV #6,R5 ;CHARACTER COUNT JSR PC,RPACK ;GET STACK PTR FROM USER BR SWEN0 17$: BIT #1,@SP ;ODD STACK ADR ? BEQ 18$ ERROR 18$: MOV (SP)+,STKBLK+4 ;GET USER IND STACK ADR BR SWEN0 15$: .IF DF LDA CMPB @SP,#'L ;LDA SWITCH? BNE 21$ INCB LSWIT ;SET FLAG CMP DEFEXT+2,ODBLK+6 ;IS OUTPUT EXTENSION = 'SAV' BNE SWEN1 MOV LDAEXT,ODBLK+6 ;SUBSTITUTE 'LDA' BR SWEN1 .ENDC 21$: CMPB @SP,#'I ;I SWITCH ? BNE 22$ ;NO INCB ISWIT ;SET I SWITCH FOUND BR SWEN1 22$: CMPB @SP,#'F ;F SWITCH ? BNE 23$ INCB FSWIT ;IND FORTRAN LIBR DEFAULT BR SWEN1 23$: CMPB @SP,#'S ;S SWITCH ? BNE 24$ INCB SSWIT ;IND LIBR DIR NOT RESIDENT BR SWEN1 24$: .IF DF FB CMPB @SP,#'R ;FOREGROUND SWITCH BNE BASWT TSTB BSWIT ;BOTTOM SWITCH ? BNE BASWT TSTB LSWIT ;LDA SWITCH ? BNE BASWT INCB RSWIT ;IND FOREGROUND LINK CLR BOTTOM ;INSURE CORRECT RELOCATION INC NXTBLK ;LEAVE ROOM FOR REL CONTRL BLK INC OBLK ;IND OUTPUT TO START AT BLK 1 INC SEGBLK MOV #RELEXT,R4 MOV #ODBLK+6,R5 CMP DEFEXT+2,@R5 ;OUTPUT EXTENSION = 'SAV' ? BNE SWEN1 MOV @R4,@R5 ;IND FB FILE BR SWEN1 .ENDC BASWT: ERROR SWEN1: TST (SP)+ ;REMOVE SWITCH BPL SWEN0 TST (SP)+ ;REMOVE VALUE SWEN0: DEC R2 ;COUNT DOWN SWITCHES BEQ SWEND JMP SWLOOP SWEND: CLR R5 ;OVERLAY SECTION BLK POINTER MOV #SEVENK,R4 ;POINT TO TOP OF 7K SWPRO: MOV #WEMT+3,R1 ;GET A WAIT EMT MOV #SSEMT+3,R2 ;AND A SAVESTATUS EMT 1$: MOV R1,@PC .WAIT 3 ;WAIT MODIFIED AT RUNTIME BCS 2$ ;NO FILE THIS CHAN SUB #10.,R4 ;POINT INTO NEW FILEBLK MOV R4,R0 MOV R2,@PC ;MOVE SAVESTATUS INTO POSITION EMT 123 ;SAVESTATUS THE FILE CLR -(R4) ;ENTER REMAINING 3 WORDS OF BLK CLR -(R4) MOV R5,-(R4) ;OVERLAY POINTER(IF ANY) CLR R5 CMP R4,R3 BHI 2$ JMP NOCORE 2$: INC R1 INC R2 CMP R1,#WEMT+8. ;DONE THIS COMMAND? BLOS 1$ DECB FSWIT ;FORTRAN LIBR DEFAULT ? BMI 8$ .LOOKUP 8.,#DEFLIB ;LIBR PRESENT ? BCC 4$ ERROR 4$: DEC R1 ;PUT FORLIB ON CHANNEL 8 DEC R2 CLRB FSWIT BR 1$ 8$: DECB CSWIT ;ANY MORE COMMAND STRINGS?? BMI DIADUN ;INITIAL DIALOGUE COMPLETE .CSIGEN R3,#DEFEXT,#0 ;CALL GENERAL MODE CSI MOV R0,R3 ;POINT TO CORE OVER LOADED HANDLERS MOV (SP)+,R2 ;SWITCH COUNT NXTSW: BEQ SWPRO ;NONE CMPB @SP,#'O ;OVERLAY SWITCH? BNE 10$ TST (SP)+ ;VALUE? BPL 2$ ;ERROR - /O NO VALUE CMP @SP,OVLNUM ;OVERLAY ORDER ASCENDING ? BLT 2$ ;NO INDICATE ERROR MOV @SP,OVLNUM ;SAVE LAST OVERLAY NUMBER MOV (SP)+,R0 ;OVERLAY LEVEL NUMBER BLE 2$ ;ERROR - INVALID OVERLAY LEVEL TST R5 ;PREVIOUS /O THIS COMMAND .IF DF LDA BNE 2$ ;YES, ERROR TSTB LSWIT ;LDA OUTPUT? .ENDC BEQ 3$ ;NO, OKAY 2$: .PRINT #OIGN ;WARNING: /O IGNORED BR 14$ 3$: MOV R4,-(SP) MOV #DOLB,R1 ;POINTER TO OVERLAY LEVEL LIST 4$: CMP R0,LVLN(R1) ;MATCH?? BEQ 5$ ;YES, R1 POINTS TO LEVEL BLK MOV R1,R4 ;SAVE POINTER MOV LVLP(R1),R1 ;LINK TO NEXT LEVEL BNE 4$ ;IF THERE IS ONE ; CREATE A NEW LEVEL BLOCK MOV R0,(R3)+ ;LEVEL # CLR (R3)+ ;PTR TO NEXT LEVEL BLK CLR (R3)+ ;PTR TO SECTIONS THIS LEVEL CLR (R3)+ ;SECTION LENGTH(SET LATER) MOV R3,LVLP(R4) ;LINK NEW BLK INTO LIST MOV R3,R1 ;SAVE ADDR OF NEW BLK CLR (R3)+ ;ADDR OF LEVEL AREA(SET LATER ; CREATE A NEW SECTION BLOCK 5$: MOV R1,R0 ;SAVE PTR TO LEVEL BLK ADD #SECP,R1 ;POINT TO SECTION POINTER BR 7$ 6$: ADD #NXSPTR,R1 ;POINT TO SECTION PTR 7$: MOV R1,R4 ;SAVE PTR MOV @R1,R1 ;GET LINK TO NEXT SECTION BNE 6$ ;UNTIL END OF LIST IS FOUND MOV R3,@R4 ;LINK NEW SECTION INTO LIST MOV R3,R5 ;AND SAVE SECTION PTR CLC ROR R5 ;SIGN BIT MUST BE OFF CLR (R3)+ ;SYMBOL TABLE PTR(SET LATER) MOV R0,(R3)+ ;POINT TO LEVEL BLK ADD #6,SECNUM ;INCREMENT SECTION ID NUMBER MOV SECNUM,(R3)+ ;AND STORE IT MOV #11.,R0 8$: CLR (R3)+ ;CLEAR REMAINDER OF BLK DEC R0 BNE 8$ MOV (SP)+,R4 ;RESTORE R4 BR 14$ 10$: CMPB @SP,#'C BNE 12$ INCB CSWIT BR 13$ 12$: MOVB @SP,BSWIC ;BAD SWITCH CHAR .PRINT #BSWI ;WARNING: BAD SWITCH IGNORED 13$: TST (SP)+ BPL 14$ TST (SP)+ 14$: DEC R2 ;COUNT DOWN SWITCHES BR NXTSW .ENABL LSB DIADUN: CMP R4,#SEVENK BLO 1$ ERROR 1$: SUB #16.,R4 BIS #100000,4(R4) ;SET END OF INPUT BIT CMP R4,R3 BHI 2$ NOCORE: ERROR 2$: MOV (R4)+,(R3)+ ;MOVE ONE FILE BLK CMP R4,#SEVENK ;DONE? BLO 2$ MOV R3,R0 ;POINTER TO 1ST FILE BLOCK SUB #10.,R0 ;POINT TO SAVESTATUS INFO MOV R0,FILPT1 ;AND SAVE FOR PASS 2 MOV #512.,R2 ;SET UP FOR I/O BUFFERS MOV #EIBUF1,R4 CMP (R3)+,(R3)+ ;ROOM FOR LINK MAP PROCESSOR MOV R3,R1 ADD R2,R1 ;IND BUF1 END ADR MOV R1,@R4 MOV R3,-(R4) ;IND HEAD OF BUF1 ADR CLR -(R4) ;INIT BUF1 STATUS TST (R1)+ MOV R1,R3 ;INIT BUF #2 MOV #EIBUF2,R4 ADD R2,R1 ;IND BUF2 END ADR MOV R1,@R4 MOV R3,-(R4) ;IND HEAD OF BUF2 ADR CLR -(R4) ;INIT BUF2 STATUS MOV R1,R3 ;UPDATE CORE PTR TST (R3)+ ;IND NEXT TABLE ARE MOV #LMLSWT,R4 TSTB SSWIT ;MAKE LIBR DIR RESIDENT ? BNE 10$ ;NO MOV #ELEVNK+LMLMAX,R1 MOV @#MONLOW,R2 5$: CMP R2,R1 ;ROMM FOR FORLIB DIR & LML TABLE ? BHI 15$ TSTB @R4 ;LML CHECKED ? BMI 12$ DECB @R4 ;IND LML MAX SIZE OF 256 WORDS SUB #LMLMAX,R1 BR 5$ 12$: INCB -(R4) ;IND LIBR DIR NOT RES INC R4 ;PT TO LMLSWT BR 10$ 14$: ADD #256.,R3 ;IND MIN SIZE OF LML BR 16$ 10$: DECB @R4 ;IND LML SIZE IS 256 WORDS BR 20$ 15$: .SETTOP R1 ;REQUEST ENOUGH CORE FOR DIRECTORY TST -(R1) CMP R1,@#HIGH ;REQUEST FULFILLED ? BHI 12$ MOV R3,LIBDIR ;PT TO LIBR DIRECTORY ADD #FOURK,R3 ;IND SYMBOL TABLE AREA MOV R3,DIREND ;IND DIRECTORY END TST (R3)+ 20$: MOV #BEGLML,R1 MOV R3,(R1)+ ;POINT TO START OF LML LIST MOV R3,(R1)+ MOV R3,PA2LML TSTB @R4 ;BIG LML ? BMI 14$ ;NO ADD #LMLMAX,R3 16$: MOV R3,@R1 ;POINT TO END OF LML CLRB @R4 ;INIT LML SWITCH FOR PASS1 MOV -(R1),R1 ;GET START OF LML AREA 18$: CLR (R1)+ ;SET LML TO ZEROES CMP R1,R3 ;DONE INITIALIZATION ? BLO 18$ .IF DF LDA TSTB LSWIT ;LDA PUTPUT? BEQ 4$ ;NO TST ODBLK ;OUTPUT WANTED? BEQ 4$ MOV #OBUF,LDAPTR ;INIT THE LDA BUFFER POINTER .ENTER 0,#ODBLK,ODBLK+8. ;AND ENTER LDA FILE 4$: .ENDC TST MDBLK ;ANY MAPOUT? BEQ UNLK ;NO .ENTER 1,#MDBLK,MDBLK+8. ;YES, ENTER IT UNLK: .UNLOCK JMP INIT .DSABL LSB .END .TITLE LNKOV2 V04-03 RTLINK ; RT-11 LINKER ; ; DEC-11-ORLLA-E ; ; MAY 16, 1974 ; EP / ENHANCED BY JG ; ; COPYRIGHT (C) 1974,1975 ; ; DIGITAL EQUIPMENT CORPORATION ; MAYNARD, MASSACHUSETTS 01754 ; ; 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 DIGITAL. ; ; 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. ; .SBTTL SYMBOLIC CONSTANTS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 TAB= 11 LF= 12 FF= 14 CR= 15 SPAC= 40 PER= 56 GSD= 1 ;OBJECT MODULE CODES TXT= 3 RLD= 4 MODEND= 6 LBR= 7 ;LIBRARY MODULE CODE LBREND= 10 ;LIBRARY END CODE BYTBLK= 512. ;BYTE BLOCK SIZE BEGIN= 40 ;DISPS INTO SYS JOB DATA AREA JSTACK= 42 ;JOB'S INITIAL STACK POINTER JSTATS= 44 ;JOB STATUS WORD USRLOC= 46 ;ADDR OF SWAPPING USR HIGH= 50 ;HIGHEST LOC USED BY USER ERRBYT= 52 ;MONITOR ERROR INDICATOR MONLOW= 54 ;ADDR OF RMON LOWER LIMIT RSIZE= 52 ;ROOT SIZE OF PROGRAM OVSIZE= 54 ;SUMS OF THE LARGEST OVERLAY REGIONS RELID= 56 ;FB IDENTIFIER ADR RELBLK= 60 ;ADDRESS OF REL .CSECT= 2 ;LINKER SYMBOL TABLE FLAGS .OVR= 4 $DEFIN= 10 ;GSD FLAGS $RELOC= 40 ; OFFSETS INTO ENTRY POINT TABLE EPTALO= 30 ;EPT ENTRIES ALLOCATED(BYTES) LHEND= 44 ;REL END OF LBR HEADER ;OFFSETS INTO OVERLAY SECTION BLOCK LEVPTR= 2 ;POINTER TO LEVEL BLOCK IDNO= 4 ;OVERLAY SECTION ID NUMBER BASBLK= 6 ;BASE BLOCK OF SECTION ON OUTPUT SECLEN= 30 ;SECTION LENGTH NXSPTR= 32 ;POINTER TO NEXT SECTION SAME LEVEL LVLN= -8. ;OFFSETS INTO OVERLAY LEVEL BLOCK LVLP= -6 SECP= -4 OVJOB= 1000 ;BIT IN JSTATS WORD TO INDICATE ;AN OVERLAY JOB ; USEFUL EMT INSTRUCTIONS LKEMT= EMT+20 ;LOOKUP EMT SSEMT= EMT+120 ;SAVESTATUS EMT WEMT= EMT+240 ;WAIT EMT .MCALL ..V1.. ..V1.. .MCALL .CSISPC,.CSIGEN,.SETTOP,.LOCK,.UNLOCK .MCALL .FETCH,.LOOKUP,.PRINT,.TTYIN,.WAIT,.ENTER .MCALL .CLOSE,.SRESET,.READW,.WRITW,.WRITE .MCALL .REOPEN,.RCTRLO,.QSET,.DATE LDA= 0 ;TURN ON LDA FEATURE FB= 0 ;TURN ON FB .NLIST BEX .NLIST CND .SBTTL MISCELLANEOUS MACRO DEFINITIONS .MACRO ERROR MSG JSR R0,ERROR .ASCIZ "?'MSG'?" .EVEN .ENDM .MACRO PRINT MSG JSR R5,PR00 .WORD MSG .ENDM .MACRO LERROR MSG,REG .CSECT CHAR2 CHARPT=. .ASCIZ "MSG" .CSECT MAIN2 .IF NB REG MOV REG,R0 JSR R5,LERROR .IFF JSR R5,LERROR+2 .ENDC .WORD CHARPT .ENDM .MACRO LERRA MSG .CSECT CHAR2 CHARPT=. .ASCIZ "MSG" .CSECT MAIN2 JSR R5,LERRA .WORD CHARPT .ENDM .SBTTL PASS1 TABLES .CSECT CHAR2 LMLFIL: .RAD50 /SY / ;LIBRARY MODULE LIST (TEMP FIL) .RAD50 /LML/ ;IN CASE OF OVERFLOW TO DISK .RAD50 /TMP/ .RAD50 /TMP/ .SBTTL PASS1 EXEC .CSECT MAIN2 .GLOBL PASS1,RESLIB,RSWIT,CLOSE,CURBUF,FILPT1 .GLOBL NEWBLK,MODCNT,ISWIT,SYMM12,SKPBLK,INIO .GLOBL TXTBLK,NEWBUF,NEWBF1,ERROR,PAS1.5,CURBLK .GLOBL ONEPT,EPTSER,BUFSWT,FILPT,ASECT .GLOBL LOOKUP,CSECT,SYMM22,SYMM20,ENDOL,OVFLG .GLOBL LERRA,ASWIT,BEGBLK,BYTE,SSWIT,LIBDIR .GLOBL BEGLML,ENDLML,STLML,LMLBLK,ORDLIB,HARDER .GLOBL LIBN3B,LMLSWT,ORLIB1,ADLML1,PA2LML,GETLIB .GLOBL LIBBLK,IBUF1,IBUF2 PASS1: MOV FILPT1,R0 ;GET 1ST INPUT FILE ADR JSR PC,INIO ;INITIALIZE I/O PA11: JSR PC,NEWBLK ;ENTER HERE TO START NEW FB BLK CMP R0,#LBR ;LIBRARY MODULE ? BEQ LIBRA1 CMP R0,#GSD BEQ PA12 3$: CMP R0,#MODEND ;END OF OBJ MOD? BNE PA11A ;NO INC MODCNT ;YES, INC COUNT OF MODS 5$: BITB #10,ISWIT ;PROC LIB OBJ MOD ? BEQ PA11A ;NO ; END OF CURRENT OBJ. MOD FROM LIBRARY ; CHECK LML FOR MORE LIBRARY OBJ MODULES JMP LIBN3B ; PROCESS PASS1 GSD PA11A: JSR PC,SKPBLK BR PA11 PA12: MOV #8.,R0 ;ENTER HERE TO START NEW GSD ITEM SUB R0,R2 MOV #TXTBLK,R3 MOV R3,R1 13$: CMP R4,R5 BLO 14$ MOV R0,-(SP) JSR PC,NEWBUF MOV (SP)+,R0 14$: MOVB (R4)+,(R1)+ DEC R0 BGT 13$ MOVB TXTBLK+5,R0 ;TEST FLAGS ASL R0 ;TIMES 2 CMP R0,#PA1TBE-PA1TBL ;INSIDE TABLE? BHIS 15$ ;ERROR - BAD GSD CODE MOV PA1TBL(R0),PC ;JUMP TO ROUTINE 15$: ERROR .CSECT DPUR2 PA1TBL: .WORD MODNAM .WORD SECNAM .WORD ISDNAM .WORD TADDR .WORD SYMNAM .WORD PA1NXT ;IGNORED .WORD PA1NXT ;PROG ID (IGNORED) PA1TBE: .CSECT MAIN2 .PAGE ; LIBRARY SEARCH ROUTINE ; THIS ROUTINE CHECKS FOR UNDEFINED SYMBOLS. ; IF UNDEFINED SYMBOLS EXIST, THE FOLLOWING IS DONE: ; (A) THE LIBRARY DIRECTORY IS BROUGHT INTO CORE. ; (B) THE UNDEFINED SYMBOLS ARE MATCHED WITH A ; LIBRARY ENTRY. ; (C) THE LIBRARY MODULE LIST IS BUILT ; (D) MORE UNDEFINED SYMBOL RESOLUTION IS ATTEMPTED. ; (E) AFTER ALL UNDEF. SYMBOLS HAVE BEEN PLACED ; IN THE LML, THE LML IS ORDERED. ; (F) LIBRARY MODULES ARE BROUGHT INTO CORE ; ACCORDING TO THE LML. ; OTHERWISE THE LIBRARY FILE IS CLOSED ; AND NO LIBRARY PROCESSING IS PERFORMED. ;INTERFACE REQUIREMENTS: ; (1) R0,R1,R3 ARE DESTROYED ; (2) R4 PTS TO FIRST DATA WRD OF NEW BUFFER ; (3) R5 PTS TO THE END OF THE BUFFER .ENABL LSB LIBRA1: MOV #ONEPT,R2 CLRB @R2 MOV #PAS1.5,R3 INCB @R3 ;IND PROCESSING LIBRARIES TSTB @R3 ;IN PASS 1.5 ? BMI LIBRAR ;YES JMP LIBEN6 ;NO LIBRAR: DECB (R2)+ ;IND LIBR I/O TSTB @R2 ;MAKE LIBR DIR RES BNE 8$ ;NO JSR PC,RESLIB 8$: MOV SYMM12,R1 ;GET PTR TO UNDEF SYMBOL LIST JSR PC,UDFSYM ;CALL UNDEF SYMBOL SUBR BCS LIBEN1 ;NO MORE UNDEF SYM IN LIBRARY MOV #ISWIT,R0 BITB #10,@R0 ;PROC LIB. OBJ. MOD. ? BNE LIBEN2 ;YES BRANCH MOVB #10,@R0 ;IND LIB FILE TO LINKER LIBRA2: TSTB @R2 ;LIBR DIR RES ? BNE 9$ ;NO LIBRA3: MOV LIBDIR,R4 ;GET RES LIBR ADR BR 21$ 9$: ADD #LHEND-8.,R4 ;PT TO 1ST EPT ENTRY 19$: MOV R4,-(SP) 20$: MOV R2,-(SP) JSR PC,EPTSER ;SEARCH FOR SYMBOL MATCH MOV (SP)+,R2 BCC 4$ ;YES - SYMBOL FOUND ? 24$: CMP (R1)+,(R1)+ ;PT TO BKWD PTR JSR PC,UDFSYM ;CALL UNDEF SYMBOL SUBR BCS LIBEN3 ;NO MORE UNDEF SYM IN LIBRARY 35$: TSTB @R2 ;LIBR DIR RES ? BEQ 22$ ;YES TSTB BUFSWT ;IN EPT HDR BUFFER ? BPL 22$ ;YES CLR CURBLK ;IND EPT HDR BLK # JSR PC,NEWBF1 ;GET EPT HDR BLK INTO BUFFER JSR PC,NEWBF1 CLRB BUFSWT ;RESET BUFFER SWITCH TST (SP)+ 21$: ADD #LHEND-2,R4 ;PT TO 1ST EPT ENTRY BR 19$ 22$: MOV @SP,R4 ;PT TO EPT HEAD BR 20$ ; THE UNDEFINED SYMBOL (FROM LINKER'S UNDEFINED SYMBOL ; LIST) HAS BEEN FOUND AT THE CURRENT ENTRY POINT TABLE ; THE ASSOCIATED MODULE'S ADDRESS AND BLOCK # ; ARE PLACED IN THE LML. 4$: JSR PC,LMLBLD ;PLACE MOD ADR IN LML BR 24$ ;GET NEXT UNDEF SYMBOL ; THE END OF AN OBJECT MODULE HAS BEEN REACHED, AND THERE ; ARE STILL MORE UNDEFINED SYMBOLS TO BE RESOLVED. THERE- ; FORE, THE LIBRARY HEADER AND DIRECTORY MUST BE BROUGHT ; BACK INTO THE CURRENT BUFFER. LIBEN2: TSTB @R2 ;LIBR DIR RES ? BEQ LIBRA3 LIBN2A: CLR CURBLK ;IND LIBR HDR BLK # JSR PC,NEWBF1 ;GET LIB HDR BLK JSR PC,NEWBF1 ;PT BUF PTR TO CORRECT BLK BR 21$ .DSABL LSB ; END OF LIBRARY SEARCH ; ORDER THE LML AND READ MODULES FROM ; THE LIBRARY LIBEN3: TST (SP)+ JMP ORDLIB ;ORDER THE LIBRARY LML LIBN3B: ; READ LML MODULES FROM LIBRARY 1$: MOV #BEGLML,R2 MOV @R2,R1 ;GET CURRENT LML PTR CMP R1,ENDLML ;END OF LML ? BLO 5$ ;NO MOV PA2LML,R1 ;PT TO BUFFER AREA .READW 2,R1,#256.,LMLBLK ;READ LML BCC 3$ JMP HARDER 3$: INC LMLBLK ;IND TO READ NEXT BLK 5$: MOV #LIBBLK,R4 TSTB SSWIT ;LIB DIR IN CORE ? BNE 6$ ;NO - NO BLK OPTIMIZATION CMP @R1,@R4 ;REQUESTED MOD IN BUF ? BEQ 15$ ;YES BLO 6$ ;NO MOV @R1,R0 DEC R0 BEQ 6$ ;MOD IMMEDIATELY FOLLOWS EPT ; /OF 1 BLK (SPECIAL CONSIDERATION) CMP R0,@R4 ;REQUESTED MOD IN NEXT BLK ? BEQ 18$ ;YES 6$: MOV (R1)+,@R4 ;IND BLK # OF LIBR OBJ MOD BMI LIBEN1 ;YES - TERMINATE LIBRARY ? JSR PC,GETLIB ;GET LIBR OBJ MOD 7$: ADD (R1)+,R4 ;INDEX TO PROPER BYTE IN LIBR BLOCK MOV R1,@R2 ;UPDATE LML PTR BR LIBEN8 ;PROCESS LIBRARY'S OBJ MOD 15$: MOV IBUF1,R4 ;PT TO START OF BUFFER 16$: TST (R1)+ ;PT TO BYTE ADR IN LML BR 7$ 18$: MOV IBUF2,R4 ;PT TO START OF 2ND BUFFER TST -(R4) BR 16$ ; TERMINATE LIBRARY ROUTINE LIBEN1: MOV #BEGLML,R4 MOV #STLML,R5 MOV #ISWIT,R0 MOV #100,R2 BITB R2,@R0 ;MORE UNDEF'S & NON RES BEQ 1$ ;LIBR DIRECTORY ? - NO BICB R2,@R0 ;RESET ADDITIVE LML SWITCH ASL R2 BISB R2,@R0 ;SET 2NDARY LML ORDER MOV SYMM12,R1 ;GET PTR TO UNDEF SYM LIST MOV #SSWIT,R2 MOV @R4,@R5 ;SAVE LML PTR MOV R0,-(SP) JSR PC,UDFSYM ;CHECK FOR UDEF SYM MOV (SP)+,R0 BCC LIBN2A ;BUILD 2NDARY LML 1$: CLRB @R0 CLR LIBBLK ;INITIALIZE LIB BLK CTR ADD #2,@R4 ;INDEX OVER LIBR END MARK IN LML MOV @R4,@R5 ;UPDATE STLML CLRB ONEPT ;RESET LIBRARY I/O SWITCH LIBEN6: MOV @CURBUF,R4 ;RESET INPUT BUFFER PTR .WAIT 3 ;QUIET I/O IN PROGRESS JSR PC,CLOSE ;GET NEXT FILE JSR PC,NEWBUF ;READ NEXT FILE LIBEN8: JMP PA11 ;CALL PASS1 ; ROUTINE TO PLACE THE ADDRESS OF A LIBRARY MODULE ; INTO THE LIBRARY MODULE LIST(LML) ; INTERFACE: ; R3 - POINTER TO FOUND MODULE NAME IN LIBRARY LMLBLD: MOV R1,-(SP) MOV R2,-(SP) MOV R4,-(SP) CMP (R3)+,(R3)+ ;PT TO BLK ADR IN EPT MOV (R3)+,R4 ;GET BLK ADR & PT TO BYTE DISP BPL 10$ ;NO - CLEAR MOD NAME FLAG ? BIC #100000,R4 ;CLEAR MOD NAME FLAG 10$: MOV BEGLML,R1 ;GET LML PTR CMP R1,ENDLML ;END OF LML ? BLO 18$ ; THE LML HAS OVERFLOWED! A TEMPORARY FILE MUST ; NOW BE CREATED ON DISK TO PROCESS THE USER'S ; LIBRARY REQUESTS. (THE FILE IS CREATED ON ; CHANNEL 2, AND IS TEMPORARY). MOV PA2LML,R1 ;PT TO START OF LML MOV #LMLBLK,R2 TST @R2 ;TEMP FILE CREATED ? BNE 14$ ;YES DECB LMLSWT ;IND LML IS ON DISK .ENTER 2,#LMLFIL,#0 ;CREAT TEMP FILE BCC 14$ ;YES - ENOUGH SPACE ? ERROR 14$: .WRITW 2,R1,#256.,@R2 ;WRITE TO TEMP FILE BCC 17$ ;NO - OUTPUT ERRORS ? JMP HARDER ;TERMINATE LINK DUE TO I/O ERROR 17$: INC @R2 ;IND NEXT BLK ADR ; PLACE LIBRARY MODULE ADR IN LML 18$: MOV R4,(R1)+ ;PLACE BLK ADR IN LML MOV @R3,R4 ;GET BYTE DISP ADR BIC #177000,R4 ;ISOLATE BYTE DIS MOV R4,(R1)+ ;PLACE BYTE ADR IN LML DEC @R1 ;SET IN CASE LIBR END CLR 2(R1) ;CLEAR NXT WORD IN CASE NO ; /ENTRIES FROM NXT LIBR MOV R1,BEGLML ;UPDATE LML PTR MOV (SP)+,R4 MOV (SP)+,R2 MOV (SP)+,R1 RTS PC ; ROUTINE TO GET AN UNDEFINED SYMBOL FROM ; THE UNDEFINED SYMBOL TABLE LIST ; INTERFACE: ; R1 - PTR TO UNDEFINED SYMBOL LIST ; RETURN INTERFACE: ; R1 - PTR TO NEXT UNDEFINED SYMBOL ; C BIT = O - R1 PTS TO NEW UNDEF SYMBOL ; C BIT = 1 - NO MORE UNDEF SYMBOLS FOR THIS LIBRARY UDFSYM: MOV (R1)+,R0 ;GET ADR OF UNDEF SYMBOL CMP R1,R0 ;UNDEFINED SYMBOL ? BEQ 5$ ;NO 1$: MOV @R1,R1 COM R1 ;GET REAL PTR BIC #100007,R1 ;ISOLATE REL ADR ADD SYMM20,R1 ;GET PHYSICAL ADR SUB #6,R1 ;POINT TO SYMBOL TST @R1 ;END UDF SYMB LIST ? BNE 10$ ;NO 5$: SEC ;IND NO MORE UNDEF SYMBOLS BR UDFEND 10$: CLC ;IND SYMBOL ADR RETURNED UDFEND: RTS PC ;RETURN TO CALLER .SBTTL CONTROL SECTION NAME SECNAM: JSR PC,LOOKUP MOV R0,CSECT MOV @R0,R1 BEQ SECENT ;BRANCH IF BRAND NEW SYMBOL BLT SECULK ;BRANCH IF ALREADY IN UNDEF LIST ;AT THIS POINT SYMBOL WAS ALREADY DEFINED, MUST BE CSECT BIT R1,#.CSECT BNE 1$ JMP SYMDBL ;NOT CSECT SO ERROR 1$: CMP -(R0),TXTBLK+6 ;COMPARE LENGTHS BHIS PABR ;BRANCH TO PA1NXT MOV TXTBLK+6,@R0 ;SAVE NEW LENGTH BR PABR ;BRANCH TO PAINXT SECULK: MOV R1,@-(R0) ;UNLINK FROM UNDEFINED LIST COM R1 ADD SYMM22,R1 MOV (R0)+,@R1 CLR @R0 SECENT: MOV R0,R1 SUB SYMM20,R1 ;CREATE 12 BIT POINTER TO NEW NODE BIC #077770,@ENDOL ;INSURE PTR CLEARED IF LIBR SEARCH BIS R1,@ENDOL ;ENDOL POINTS TO CURRENT END OF LIST MOV R0,ENDOL ;MAKE NEW END OF LIST BIS #.CSECT,@R0 ;SET CSECT BIT BIS OVFLG,@R0 ;AND OVERLAY BIT IF NECESSARY MOV TXTBLK+6,-(R0) ;LENGTH BITB #10,ISWIT ;IS THIS A LIBR FILE ? BEQ PABR JSR PC,ADDLML ;CHECK FOR LML ADDITION PABR: JMP PA1NXT .SBTTL ROUTINE TO ADD LML ENTRIES ADDLML: TSTB SSWIT ;LIBR DIR RESIDENT ? BEQ 1$ ;YES BISB #100,ISWIT ;IND TO ADD TO LML LATER BR ADLML2 1$: TST -(R0) ;PT TO SYMBOL MOV R0,R1 MOV R2,-(SP) MOV R4,-(SP) MOV R5,-(SP) MOV LIBDIR,R4 ;GET RES LIBR DIR ADR ? 5$: ADD #LHEND-2,R4 ;PT TO 1ST EPT ENTRY JSR PC,EPTSER ;SEARCH FOR SYMBOL IN LIBR DIR BCS ADLML1 ;NO - SYMBOL FOUND ? MOV #BEGLML,R2 ;PT TO LML MOV @R2,R1 MOV R1,-(SP) ;SAVE ORIGINAL LML PTR 6$: TST (R1)+ ;FIND LAST ENTRY BPL 6$ ;NO - LAST ENTRY ? TST -(R1) ;BACKSPACE TO END INDICATOR MOV R1,@R2 JSR PC,LMLBLD ;PLACE SYMBOL IN LML MOV @SP,(R2)+ ;RESTORE ORIG LML PTR MOV (SP)+,@R2 JSR PC,ORLIB2 ;ORDER LML FROM 2NDARY LEVEL ADLML1: MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R2 ADLML2: RTS PC .SBTTL SECONDARY LML ORDER ROUTINE ORLIB2: 4$: MOV STLML,R1 ;PT TO START OF LML MOV R1,BEGLML ;UPDATE LML START ADR 15$: MOV (R1)+,R4 ;GET BLOCK ADDRESS BMI ORLIBE MOV (R1)+,R5 ;GET BYTE ADR 16$: CMP R4,(R1)+ ;CORRECT ORDER ? BEQ 18$ ;YES - IDENTICAL MOD CALL ? BLO 19$ ;YES - CORRECT ORDER ? 17$: TST -(R1) MOV R1,R3 CMP -(R3),-(R3) ;PT TO OUT OF ORDER ADR MOV (R1)+,(R3)+ ;ORDER THE LIBRARY ADR MOV @R1,(R3)+ ;EXCHANGE PLACES IN LML MOV R4,(R3)+ MOV R5,@R3 TST -(R3) BR 4$ 18$: CMP R5,@R1 ;MOD APPEAR MORE THAN ONCE IN LML BEQ 30$ ;YES - DUPLICATE MOD ADR ? BHI 17$ ;YES - MOD OUT OF ORDER ? 19$: TST -(R1) ; BR 15$ ;MODULE IN CORRECT ORDER 30$: MOV R1,R0 CMP -(R1),-(R0) ;PT TO NEXT LML ENTRY CMP -(R1),-(R1) ;POSITION TO LML TO OVLY MOV R1,-(SP) ;SAVE SORT ADR 32$: MOV (R0)+,(R1)+ ;OVLY DUPLICATE MOD ADR BPL 32$ MOV (SP)+,R1 ;RESTORE SORT ADR BR 15$ ;RECALL SORT ORLIBE: RTS PC ;EXIT .SBTTL GLOBAL SYMBOL SYMNAM: JSR PC,LOOKUP BIT #$DEFIN,TXTBLK+4;DEFINED HERE? BEQ SYMUDF ;NO MOV @R0,R1 ;DEFINED BEFORE? BEQ 1$ ;NOT PRESENT IN TABLE BGT SYMDBL ;MULTIPLY DEFINED SYMBOL MOV R1,@-(R0) ;PRESENT, BUT IN UNDEF LIST COM R1 ;SO UNLINK IT ADD SYMM22,R1 MOV (R0)+,@R1 CLR @R0 1$: MOV #OVFLG,R1 BIS @R1,@R0 ;SET OVERLAY BIT IF NECESSARY ADD (R1)+,@R1 ;AND ADD TO OVERLAY COUNT MOV R0,R1 SUB SYMM20,R1 MOV R1,-(SP) MOV R0,-(SP) MOV TXTBLK+6,-(R0) ;SYMBOL VALUE MOV @R0,-(SP) BIT #$RELOC,TXTBLK+4;ASECT? BNE SYMREL ;NO MOV ASECT,R1 BR SYMN2 SECOVR: SYMDBL: TST -(R0) LERRA ;PRINT SYMBOL ALSO BR PA1NXT SYMREL: MOV CSECT,R1 SYMN2: MOV @R1,R0 BIC #100007,R0 ;ISOLATE PTR PART BEQ 5$ ADD SYMM20,R0 BIT #.CSECT,@R0 BNE 4$ TSTB ASWIT ;ALPHABETICAL LISTING??? BNE 3$ ;YES CMP -2(R0),@SP ;LARGER ADDRESS? BHI 4$ 3$: MOV R0,R1 BR SYMN2 4$: SUB SYMM20,R0 TST (SP)+ BIS R0,@(SP)+ ;MOVE POINTER INTO NEW NODE 6$: BIC #077770,@R1 BIS (SP)+,@R1 BR PA1NXT 5$: TST (SP)+ MOV @SP,ENDOL INC @(SP)+ BR 6$ ;PROCESS UNDEFINED SYMBOL REF SYMUDF: TST @R0 BNE PA1NXT MOV SYMM12,R1 MOV @R1,-(SP) ;GET PTR TO HEAD OF UDEF LIST MOV R0,@R1 MOV #177767,@R0 ;POINT TO LIST HEAD MOV R0,R1 SUB SYMM20,R1 COM R1 MOV (SP)+,-(R0) MOV R1,@(R0)+ BITB #10,ISWIT ;LIBRARY FILE ? BEQ PA1NXT ;NO CMP -(R0),-(R0) ;CORRECT UDEF SYM PTR JSR PC,ADDLML ;ADD TO LML FROM 2NDARY LEVEL BR PA1NXT .SBTTL TRANSFER ADDRESS BLOCK TADDR: MOV BEGBLK+8.,R0 ;CURRENT TRANSFER ADDR ROR R0 BCC PA1NXT ;WE ALREADY HAVE AN EVEN ONE MOV #BEGBLK,R1 MOV MODCNT,(R1)+ ;SAVE MODCNT FOR LOOKUP LATER MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV (R3)+,(R1)+ MOV @R3,@R1 ; BR PA1NXT ; FALL THRU .SBTTL FINISH PASS1 GSD ITEM MODNAM: ISDNAM: PA1NXT: TST R2 BLE 1$ JMP PA12 1$: JSR PC,BYTE ;GET CHECKSUM BYTE ;COULD CHECK THE BLOCK CHECKSUM HERE JMP PA11 ;GO BEGIN NEW DATA BLOCK .END .TITLE LNKV2B V04-03 RTLINK ; RT -11 LINKER ; ; DEC-11-ORLLA-E ; ; JEG ; ; COPYRIGHT (C) 1974,1975 ; ; DIGITAL EQUIPMENT CORPORATION ; MAYNARD, MASSACHUSETTS 01754 ; ; 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 DIGITAL. ; ; 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. ; .SBTTL SYMBOLIC CONSTANTS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 .SBTTL ORDER LIBRARY MODULE LIST .CSECT MAIN2B .MCALL ..V1.. ..V1.. .MCALL .READW,.WRITW .GLOBL BEGLML,ENDLML,STLML,LMLBLK,ORDLIB,PA2LML .GLOBL LIBN3B,HARDER,LMLSWT,ORLIB1,ADLML1 .ENABL LSB ORLIB1: MOV #-1,-(SP) ;IND SECONDARY RETURN BR ORLIB2 ORDLIB: CLR -(SP) ;IND NORMAL RETURN ORLIB2: MOV LMLBLK,R2 ;LML ON DISK ? BEQ 4$ ;NO SWAB R2 ;CALCULATE # WORDS IN LML CLR R0 MOV #LMLBUF,R1 MOV R1,-(SP) .READW 2,R1,R2 ;READ LML BCC 15$ 1$: JMP HARDER ;FATAL I/O ERROR 4$: MOV STLML,R1 ;PT TO START OF LML TST @R1 ;LML HAVE ENTRIES ?? BNE 5$ ;YES DEC @R1 ;IND END OF LML 5$: MOV R1,BEGLML ;UPDATE LML START ADR 15$: MOV (R1)+,R4 ;GET BLOCK ADDRESS BMI 20$ ;YES - END OF LIBRARY ? MOV (R1)+,R5 ;GET BYTE ADR 16$: CMP R4,(R1)+ ;CORRECT ORDER ? BEQ 18$ ;YES - IDENTICAL MOD CALL ? BLO 19$ ;YES - CORRECT ORDER ? 17$: TST -(R1) MOV R1,R3 CMP -(R3),-(R3) ;PT TO OUT OF ORDER ADR MOV (R1)+,(R3)+ ;ORDER THE LIBRARY ADR MOV @R1,(R3)+ ;EXCHANGE PLACES IN LML MOV R4,(R3)+ MOV R5,@R3 TST -(R3) BR 4$ ;RECALL SORT 18$: CMP R5,@R1 ;MOD APPEAR MORE THAN ONCE IN LML ? BEQ 30$ ;YES - DUPLICATE MOD ADR ? BHI 17$ ;YES - MOD OUT OF ORDER ? 19$: TST -(R1) BR 15$ ;MODULE IN CORRECT ORDER 20$: TST R2 ;LML ON DISK ? BEQ 25$ ;NO MOV (SP)+,R1 ;RESTORE LML BUFFER ADR .WRITW 2,R1,R2 ;WRITE LML BCS 1$ TSTB LMLSWT ;LML CORE RESIDENT ? BPL 25$ ;YES .READW 2,PA2LML,#256.,#0 ; READ BLK 0 OF LML BCS 1$ ;YES - I/O ERROR ? MOV #1,LMLBLK ;INIT LML BLK COUNT 25$: TST (SP)+ ;SECONDARY RETURN ? BPL 26$ ;NO JMP ADLML1 ;RETURN TO SUBR AFTER1ST LIB SEARCH 26$: JMP LIBN3B ;CALL SEARCH LIBRARY RTN 30$: MOV R1,R0 ;PT TO NEXT LML ENTRY CMP -(R1),-(R0) CMP -(R1),-(R1) ;POSITION TO LML TO OVLY MOV R1,-(SP) ;SAVE SORT ADR 32$: MOV (R0)+,(R1)+ ;OVLY DUPLICATE MOD ADR BPL 32$ MOV (SP)+,R1 ;RESTORE SORT ADR BR 15$ ;RECALL SORT .DSABL LSB LMLBUF: .END .TITLE LNKOV3 V04-04 RTLINK ; RT-11 LINKER ; ; DEC-11-ORLLA-E ; ; MAY 16,1974 ; EP / ENAHNCED BY JG ; ; COPYRIGHT (C) 1974,1975 ; ; DIGITAL EQUIPMENT CORPORATION ; MAYNARD, MASSACHUSETTS 01754 ; ; 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 DIGITAL. ; ; 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. .PAGE .SBTTL SYMBOLIC CONSTANTS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 TAB= 11 LF= 12 FF= 14 CR= 15 SPAC= 40 PER= 56 GSD= 1 ;OBJECT MODULE CODES TXT= 3 RLD= 4 MODEND= 6 LBR= 7 ;LIBRARY MODULE CODE LBREND= 10 ;LIBRARY END CODE BYTBLK= 512. ;BYTE BLOCK SIZE BEGIN= 40 ;DISPS INTO SYS JOB DATA AREA JSTACK= 42 ;JOB'S INITIAL STACK POINTER JSTATS= 44 ;JOB STATUS WORD USRLOC= 46 ;ADDR OF SWAPPING USR HIGH= 50 ;HIGHEST LOC USED BY USER ERRBYT= 52 ;MONITOR ERROR INDICATOR MONLOW= 54 ;ADDR OF RMON LOWER LIMIT RSIZE= 52 ;ROOT SIZE OG PROGRAM OVSIZE= 54 ;SUMS OF THE LARGEST OVERLAY REGIONS RELID= 56 ;FB IDENTIFIER ADR RELBLK= 60 ;ADDRESS O REL .CSECT= 2 ;LINKER SYMBOL TABLE FLAGS .OVR= 4 $DEFIN= 10 ;GSD FLAGS $RELOC= 40 ; OFFSETS INTO ENTRY POINT TABLE EPTALO= 30 ;EPT ENTRIES ALLOCATED(BYTES) LHEND= 44 ;REL END OF LBR HEADER ;OFFSETS INTO OVERLAY SECTION BLOCK LEVPTR= 2 ;POINTER TO LEVEL BLOCK IDNO= 4 ;OVERLAY SECTION ID NUMBER BASBLK= 6 ;BASE BLOCK OF SECTION ON OUTPUT SECLEN= 30 ;SECTION LENGTH NXSPTR= 32 ;POINTER TO NEXT SECTION SAME LEVEL LVLN= -8. ;OFFSETS INTO OVERLAY LEVEL BLOCK LVLP= -6 SECP= -4 OVJOB= 1000 ;BIT IN JSTATS WORD TO INDICATE ;AN OVERLAY JOB ; USEFUL EMT INSTRUCTIONS LKEMT= EMT+20 ;LOOKUP EMT SSEMT= EMT+120 ;SAVESTATUS EMT WEMT= EMT+240 ;WAIT EMT .MCALL ..V1.. ..V1.. .MCALL .CSISPC,.CSIGEN,.SETTOP,.LOCK,.UNLOCK .MCALL .FETCH,.LOOKUP,.PRINT,.TTYIN,.WAIT,.ENTER .MCALL .CLOSE,.SRESET,.READW,.WRITW,.WRITE .MCALL .REOPEN,.RCTRLO,.QSET,.DATE LDA= 0 ;TURN ON LDA FEATURE FB= 0 ;TURN ON FB .NLIST BEX .NLIST CND .SBTTL MISCELLANEOUS MACRO DEFINITIONS .MACRO ERROR MSG JSR R0,ERROR .ASCIZ "?'MSG'?" .EVEN .ENDM .MACRO PRINT MSG JSR R5,PR00 .WORD MSG .ENDM .MACRO LERROR MSG,REG .CSECT CHAR3 CHARPT=. .ASCIZ "MSG" .CSECT MAIN3 .IF NB REG MOV REG,R0 JSR R5,LERROR .IFF JSR R5,LERROR+2 .ENDC .WORD CHARPT .ENDM .MACRO LERRA MSG .CSECT CHAR3 CHARPT=. .ASCIZ "MSG" .CSECT MAIN3 JSR R5,LERRA .WORD CHARPT .ENDM .SBTTL POST PASS TABLES AND MESSAGES .CSECT DPUR3 DECTBL: ; .WORD 10000. ;CAN GIVE THE EXTRA DIGIT ; .WORD 1000. ; .WORD 100. .WORD 10. ;PRINT 2 DIGITS .WORD 1 .WORD 0 ;ZERO IS END INDICATOR .CSECT CHAR3 MTITLE: .ASCII /RT-11 LINK V04-04/ .ASCII / LOAD MAP / .ASCII .BYTE 0 MTITL1: .ASCII /SECTION ADDR SIZE / .ASCII /ENTRY ADDR ENTRY ADDR ENTRY ADDR/ .BYTE CR,LF,0 HLM: .ASCIZ /HIGH LIMIT = / UGM: .ASCIZ /UNDEFINED GLOBALS:/ UGMW: .ASCIZ /UNDEF GLBLS/ OVSMSG: .ASCIZ /OVERLAY REGION / OVSMS2: .ASCIZ /SEGMENT / CLTTT: .BYTE CR,LF,TAB,TAB,TAB,0 DATTBL: .ASCIZ /JAN/ .ASCIZ /FEB/ .ASCIZ /MAR/ .ASCIZ /APR/ .ASCIZ /MAY/ .ASCIZ /JUN/ .ASCIZ /JUL/ .ASCIZ /AUG/ .ASCIZ /SEP/ .ASCIZ /OCT/ .ASCIZ /NOV/ .ASCIZ /DEC/ .SBTTL CLEAN UP AFTER PASS1 .CSECT MAIN3 .GLOBL POST .GLOBL ASECT,IBUF1,PR00,ODBLK,BOTTOM .GLOBL OVFLG,SECNUM,SYMM20,COLCT,OVSPTR .GLOBL NXTBLK,OVLVL,OVSEC .GLOBL SYMM12,BEGBLK,MODCNT,LOOKUP .GLOBL LERROR,OBUF,EOBUF,LSWIT,ERROR,ABWMAP .GLOBL OVFLG,TXTBLK,OVLV1,TAM,TXTLEN .GLOBL PADDR,OBLK,SEGBAS,SEGBLK,EXPAND,EIBUF1 .GLOBL MDBLK,PBLOCK .GLOBL OVCOUN,HLRT,HGHLIM,PASS2,LDAPTR .GLOBL CKSUM,RPACK,TSTP,PRINT,OCTOUT,LDAOUT .GLOBL DMP0,DMPA,DECODE,STKBLK .IF DF FB .GLOBL FBOVL2,RSWIT,FBTXT,RSIZ1,OVSIZ1 .GLOBL RELID1,RELERR .ENDC POST: MOV ASECT,R3 MOV IBUF1,R1 ;USE IBUF1 FOR PRINT OUTPUT BUFFER MOV #256.,R0 2$: CLR (R1)+ ;SET BUF TO NULLS DEC R0 BGT 2$ MOV IBUF1,R1 PRINT MTITLE ;PRINT LOAD MAP TITLE ; MODIFICATIONS TO LOAD MAP HEADER FOR V02 MOV R3,-(SP) ;SAVE R3 ON STACK MOV #ODBLK+6,R3 ;GET BINOUT ADDRESS TST -6(R3) ;OUTPUT FIEL SPECIFIED ? BEQ 25$ JSR PC,DECODE ;UNPACK FILE NAME 1$: TSTB -(R1) ;BLANK SUPPRESS ? BEQ 1$ MOVB #PER,(R1)+ ;IND EXTENSION DIVIDER MOV #ODBLK+10.,R3 ;IND FNAM EXTENSION ADR JSR PC,DECODE ;UNPACK THE EXTENSION SUB #3,R1 ;BLANK OUT OPTIONAL SIZE MOVB #SPAC,(R1)+ MOVB #SPAC,(R1)+ MOVB #SPAC,(R1)+ 25$: .DATE ;GET CURRENT DATE TST R0 ;IS THERE A DATE ? BEQ 4$ ;NO TST -6(R3) ;OUTPUT FILE SPECIFIED ? BEQ 6$ MOV #12,R4 30$: MOVB #SPAC,(R1)+ ;POS BUFFER PTR TO DATE AREA DEC R4 BNE 30$ 6$: JSR PC,CDATE ;CONVERT OCTAL DATE SUBR 4$: PRINT MTITL1 ;PRINT 2ND HALF OF LOAD MAP MOV BOTTOM,R4 ;GET SPECIFIED BOTTOM ADDRESS MOV (SP)+,R3 ;RESTORE R3 FROM STACK ; END OF LOAD MAP V02 MODIFICATIONS. CMP R4,-(R3) ;COMPARE TO SIZE OF ASECT BHIS 3$ MOV @R3,R4 ;USE SIZE OF ASECT MOV R4,BOTTOM ;AS BOTTOM ADDRESS 3$: .IF DF FB TSTB RSWIT ;FOREGROUND LINK ? BEQ 7$ ;NO TST @R3 ;ASECT PRESENT ? BEQ 5$ ;NO TST OVFLG ;ASECT IN OVERLAY ? BNE FBERR1 ;FOREGROUND RESTRICTION CMP #BYTBLK,@R3 ;ASECT GREATER THAN 1 BLK ? BLT FBERR1 ;YES 5$: CLR R4 ;INSURE BASE OF ZERO FOR FOREGROUND 7$: .ENDC TST OVFLG ;ANY OVERLAYS? BEQ 9$ ;NO ADD #$OVRHE-$OVRH,R4;GET LENGTH OF OVERLAY HANDLER MOV OVCOUN,R2 ;NO. OF ENTRIES ASL R2 ADD R2,R4 ADD SECNUM,R4 ;R4 NOW CONTAINS TOTL OVERHEAD ;FOR INCLUDING OVERLAYS 9$: CLR R5 BR POST6 .IF DF FB FBERR1: ERROR ;IND ILL FB LINK .ENDC POST5: ADD SYMM20,R3 ;CALC PTR TO NEXT NODE BIT #.CSECT,@R3 ;NEW CSECT? BEQ POST7 ;NO ADD R4,R5 ;CALC NEW BASE ADDR INC R5 BIC #1,R5 ;MAKE NEW BASE EVEN MOV -(R3),R4 ;GET LENGTH OF NEW SECTION BEQ NOPRT ;DONT PRINT ZERO-LEN SECTS POST6: MOV R5,@R3 ;STORE BASE ADDR MOVB #15,(R1)+ MOVB #12,(R1)+ JSR PC,DECODE ;GO PRINT RAD50 NAME MOV R5,R0 ;SECTION BASE ADDR JSR PC,OCTOUT ;PRINT IN OCTAL MOV R4,R0 ;SECTION LENGTH JSR PC,OCTOUT MOV #4,COLCT BR POSTN NOPRT: MOV R5,(R3)+ ;DON'T PRINT INFO FROM ZERO- BR POSTN ;LENGTH CSECTS POST7: ADD R5,-(R3) ;CALC ABS ADDRESS OF SYMBOL .IF DF FB TSTB RSWIT ;FOREGROUND LINK ? BNE 6$ ;YES - PRINT ZERO LEN SYMBOLS .ENDC TST R4 ;ZERO-LENGTH CSECT? BEQ NOPRT 6$: DEC COLCT BGT 8$ PRINT CLTTT ; MOV #3,COLCT 8$: JSR PC,DECODE ;PRINT RAD50 SYMBOL MOV -2(R3),R0 ;ADDR OF SYM JSR PC,OCTOUT POSTN: MOV @R3,R3 ;MOVE DOWN LINKED CHAIN BIC #100007,R3 BNE POST5 .SBTTL DONE SECTION OF SYMTAB - PROCESS OVERLAYS ADD R4,R5 ;CALC HIGH LIM FOR ALL PRECEEDING INC R5 BIC #1,R5 ;ROUND UP IF ODD .IF DF FB MOV #RSIZ1,R4 TST @R4 ;ROOT SIZE OF PGM CALC ? BNE 7$ ;YES MOV R5,@R4 ;IND ROOT SIZE OF PGM 7$: .ENDC CLR R4 MOV OVSPTR,R3 ;GET PTR TO OVERLAY SECT BLK ADD R5,SECLEN(R3) ;CALC LENGTH OF SECTION MOV LEVPTR(R3),R2 ;GET PTR TO LEVEL BLK CMP -(R2),R5 ;> PREV HIGH LIM FOR LEVEL??? BHIS 9$ ;NO MOV R5,@R2 ;YES, UPDATE LEVEL HIGH LIM .IF DF FB MOV R5,OVSIZ1 ;CALC. SUMS OF LARGEST OVL REGIONS .ENDC 9$: MOV SECLEN(R3),R0 INC R0 ;ALLOW FOR BLK OVFLW ON ID WORD ADD #511.,R0 ;NOW CALC # OF BLKS IN OUTPUT CLRB R0 SWAB R0 ROR R0 ADD R0,NXTBLK ;AND CALC NEXT AVAILABLE BLK MOV NXSPTR(R3),R3 ;ANOTHER SECTION THIS LEVEL?? BNE 10$ ;YES MOV @R2,R5 ;GET BASE FOR NEXT LEVEL MOV -4(R2),R3 ;LINK TO NEXT LEVEL BLK BEQ DOUDFS ;NONE LEFT, GO DO UNDEFINES ADD #2,R5 ;LEAVE SPACE FOR ID WORD MOV R5,@R3 ;SET BASE FOR LEVEL CLR -(R3) ;CLEAR HIGH LIMIT INITIALLY MOV -(R3),R3 ;GET PTR TO 1ST SECT BLK FOR LEVEL INC OVLVL 10$: MOV R3,OVSPTR ;UPDATE PTR PRINT OVSMSG ;PRINT OVERLAY SECTION MESSAGE MOV OVLVL,R0 JSR PC,OCTOUT ;PRINT OVERLAY LEVEL PRINT OVSMS2 ;NOW FINISH IT INC OVSEC ;INCREMENT SECTION COUNT MOV OVSEC,R0 JSR PC,OCTOUT ;PRINT SECTION # 13$: MOV @LEVPTR(R3),R5 ;SET BASE ADDR FOR SECTION NEG R5 MOV R5,SECLEN(R3) ;LENGTH NEG R5 MOV NXTBLK,BASBLK(R3) ;AND BASE BLOCK BR POSTN .SBTTL FINISH LOAD MAP (UNDEFINES, ETC.) ; DONE OVERLAY PROCESSING, COME HERE TO PRINT UNDEFINES. .ENABL LSB DOUDFS: MOV SYMM12,R0 MOV (R0)+,R3 ;GET POINTER TO LIST OF CMP R0,R3 ;UNDEFINED SYMBOLS BEQ 5$ ;THERE ARE NONE MOV R0,-(SP) ;SAVE ADDR OF HEADER BLK .PRINT #UGMW ;WARN USER ON TTY PRINT UGM ;UNDEFINED GLOBALS MESSAGE 8$: COM @R3 ;RESTORE WORD AT R3 MOV -(R3),-(SP) ;GET PTR TO NEXT CLR @R3 ;CLEAR ADDR OF CURRENT MOVB #15,(R1)+ MOVB #12,(R1)+ JSR PC,DECODE ;PRINT RAD50 SYMBOL MOV (SP)+,R3 CMP @SP,R3 ;DONE? BLO 8$ ;NOT YET TST (SP)+ 5$: MOV #BEGBLK,R3 MOV (R3)+,MODCNT JSR PC,LOOKUP TST @R0 ;ERROR IF UNDEF TRANS ADDR BEQ 13$ BIT @R0,#.OVR ;ERROR IF BEG ADDR IN OVERLAY BEQ 14$ 13$: LERROR MOV #1,BEGBLK+8. BR 15$ 14$: MOV -(R0),R0 ADD R0,BEGBLK+8. ;CALC TRANSFER ADDRESS 15$: MOV #OBUF,R2 12$: CLR (R2)+ ;CLEAR THE OUTPUT BUFFER CMP R2,#EOBUF BLO 12$ MOV BEGBLK+8.,OBUF+BEGIN ;PROG START ADDR 16$: MOV #STKBLK,R3 ;GET USER SUPLIED STK SYM ADR TST @R3 ;SYMBOL SUPPLIED ? BEQ 22$ ;NO JSR PC,LOOKUP ;LOOKUP SYMBOL IN SYM TAB TST @R0 ;ERROR IF UNDEF STACK ADR BEQ 17$ BIT @R0,#.OVR ;ERROR IF STK ADR IN OVERLAY BEQ 18$ 17$: LERROR BR 22$ 18$: MOV -(R0),STKBLK+4 ;GET SYMBOL ADDRESS 22$: MOV #OBUF+JSTACK,R0 MOV STKBLK+4,@R0 ;IND USER SUPPLIED STK ADR BNE 20$ ;YES - STACK ADR SUPPLIED ? 19$: MOV BOTTOM,@R0 ;IND DEFAULT STACK ADR 20$: MOV R5,OBUF+HIGH ;HIGH LIMIT .IF DF FB TSTB RSWIT ;FOREGROUND LINK ? BEQ 1$ ;NO MOV NXTBLK,FBTXT ;IND STARTING REL BLK ADR ASL NXTBLK ;IND MAX SIZE OF FB REL FILE CLR BOTTOM 1$: .ENDC .IF DF LDA TSTB LSWIT BEQ 24$ JMP NOOVLY 24$: .ENDC MOV #ODBLK,R0 ;ADDR OF OUTPUT FILE BLK TST @R0 ;BINOUT REQUESTED? BEQ 2$ ;NO .ENTER 0,R0,NXTBLK ;ENTER BINOUT ON CHAN 0 BCC 2$ ERROR 2$: BISB #200,@ABWMAP ;MARK BLOCK 0 WRITTEN TST OVFLG ;ANY OVERLAYS? BEQ NOOVLY ;NO BIS #OVJOB,OBUF+JSTATS ;INDICATE OVERLAY JOB .IF DF FB TSTB RSWIT ;FOREGROUND LINMK ? BEQ DOUDFB JSR PC,RCTRLB ;WRITE REL CONTROL BLOCK DOUDFB: .ENDC MOV #TXTBLK,R4 MOV BOTTOM,R2 ;ADDR OF OVERLAY HANDLER IN MOV R2,(R4)+ ;THE USER'S PROGRAM ADD #<$OVRHE-$OVRH>-6,R2 ;RELOCATE ADDR IN MOV R2,$OVRHA+2 ;OVERLAY HANDLER MOV HLRT,$HROOT ;SET HIGH LIM OF ROOT INTO HANDLER MOV R5,$HOVLY ;SET HIGH LIM OF OVERLAYS MOV #$OVRH,R2 ;ADDR OF HANDLER CODE DOUDFX: MOV (R2)+,(R4)+ ;MOVE HANDLER TO TXT AREA CMP R2,#$OVRHE ;ALL MOVED? BLO DOUDFX MOV #<$OVRHE-$OVRH>+2,TXTLEN ;LENGTH .DSABL LSB ; NOW CREATE $OVTAB - 3 WORDS PER ENTRY OVTAB: MOV OVLV1,R2 ;PTRS TO OVERLAY STRUCTURE 23$: MOV SECP(R2),R3 ;SECTION PTR 24$: MOV @R2,R0 ;PICK UP CORE ADDR OF OVERLAY SUB #2,R0 JSR PC,WDPUT ;AND WRITE IT MOV BASBLK(R3),R0 ;REL BLK # IN OUTPUT FILE JSR PC,WDPUT MOV SECLEN(R3),R0 ;SECTION LENGTH (IN BYTES) INC R0 CLC ROR R0 ;CONVERT TO WORDS INC R0 ;PLUS ONE FOR ID WORD JSR PC,WDPUT MOV NXSPTR(R3),R3 ;LINK TO NEXT SECTION THIS LEVEL BNE 24$ MOV LVLP(R2),R2 ;LINK TO NEXT LEVEL BNE 23$ ; NEXT CREATE DUMMY SUBROUTINE FOR EACH ENTRY POINT MOV OVLV1,R3 ;PTR TO OVERLAY STRUCTURE 25$: MOV SECP(R3),R3 ;R3 POINTS TO SECTION BLK 26$: MOV @R3,R2 ;CSECT POINTER 27$: BIC #100007,R2 ;GET POINTER PART BEQ 28$ ;END OF THIS SECTION ADD SYMM20,R2 ;+ BASE OF SYMBOL TABLE BIT #.CSECT,@R2 ;CSECT NAMES ARE NOT OVERLAY- BNE 29$ ;ENTRY POINTS!!! MOV #4537,R0 ;JSR R5,$OVRH JSR PC,WDPUT ;WRITE JSR INSTR MOV BOTTOM,R0 ;ADDR OF OVERLAY HANDLER JSR PC,WDPUT MOV IDNO(R3),R0 ;OVERLAY ID NUMBER JSR PC,WDPUT MOV -(R2),R0 ;ACTUAL ENTRY POINT JSR PC,WDPUT MOV R4,R0 ;ADDR IN TXTBLK SUB #TXTBLK+8.+2,R0 ;CALC REL ADDR ADD TXTBLK,R0 ;ADD BASE ADDR OF BLOCK MOV R0,(R2)+ ;CHANGE ADDR IN SYMBOL TABLE 29$: MOV @R2,R2 ;LINK TO NEXT ENTRY IN SYMBOL TABLE BR 27$ 28$: MOV R3,R2 ;SAVE SECTION PTR TEMPORARILY MOV NXSPTR(R3),R3 ;LINK TO NEXT SECTION BNE 26$ MOV LEVPTR(R2),R3 ;POINT TO LEVEL BLK MOV LVLP(R3),R3 ;LINK TO NEXT LEVEL BNE 25$ NOOVLY: PRINT TAM ;TRANSFER ADDRESS MSG MOV BEGBLK+8.,R0 ;PICK UP TRANS ADDR JSR PC,OCTOUT PRINT HLM ;HIGH LIMIT MSG MOV R5,R0 ;BASE OF LAST SECTION JSR PC,OCTOUT MOVB #FF,-(R1) ;FORM FEED JSR PC,PRINT ;AND DUMP LAST BUFFER MOV R5,HGHLIM .IF DF FB TSTB RSWIT ;FB LINK ? BEQ 1$ ;NO TST OVFLG ;REL FILE OVERLAY ? BNE 5$ ;YES - REL CNTRL BLK ALREADY WROTE JSR PC,RCTRLB ;WRITE REL CONTROL BLK 5$: JMP FBOVL2 ;CALL PASS2 FB OVERLAY 1$: .ENDC JMP PASS2 ;CALL PASS2 OVERLAY .IF DF FB RCTRLB: TST ODBLK ;REL FILE OUTPUT ? BEQ RCTRLE .WRITW 0,#OBUF,#256.,#0 ;WRITE REL CNTRL BLK BCC RCTRLE JMP RELERR RCTRLE: RTS PC .ENDC .SBTTL THE RUN-TIME OVERLAY HANDLER ; THE FOLLOWING CODE IS INCLUDED IN THE USER'S PROGRAM BY THE ; LINKER WHENEVER OVERLAYS ARE REQUESTED BY THE USER. ; 56.8 MICROSECONDS (APPROX) IS ADDED TO EACH REFERENCE OF ; A RESIDENT OVERLAY SEGMENT. ; THE RUN-TIME OVERLAY HANDLER IS CALLED BY A DUMMY ; SUBROUTINE OF THE FOLLOWING FORM: ; JSR R5,$OVRH ;CALL TO COMMON CODE ; .WORD ;# OF DESIRED SEGMENT ; .WORD ;ACTUAL CORE ADDR ; ONE DUMMY ROUTINE OF THE ABOVE FORM IS STORED IN THE RESIDENT ; PORTION OF THE USER'S PROGRAM FOR EACH ENTRY POINT TO ; AN OVERLAY SEGMENT. ALL REFERENCES TO THE ENTRY POINT ARE ; MODIFIED BY THE LINKER TO INSTEAD BE REFERENCES TO THE APPRO- ; PRIATE DUMMY ROUTINE. EACH OVERLAY SEGMENT IS CALLED INTO ; CORE AS A UNIT AND MUST BE CONTIGUOUS IN CORE. AN OVERLAY ; SEGMENT MAY HAVE ANY NUMBER OF ENTRY POINTS, TO THE LIMITS ; OF CORE MEMORY. ONLY ONE SEGMENT AT A TIME MAY OCCUPY AN ; OVERLAY REGION. ; RESTRICTIONS: ; SINCE REFERENCES TO OVERLAY SEGMENTS ARE AUTOMATICALLY TRANS- ; LATED BY THE LINKER INTO REFERENCES TO DUMMY SUBROUTINES, ; THE PROGRAMMER MUST NOT ATTEMPT TO REFERENCE DATA IN AN OVER- ; LAY BY USING GLOBAL SYMBOLS. $OVTAB=1000+$OVRHE-$OVRH $OVRH: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) $OVRHB: ; MOV (R5)+,R0 ;PICK UP OVERLAY NUMBER BR $FIRST ;FIRST CALL ONLY * * * MOV R0,R1 $OVRHA: ADD #$OVTAB-6,R1 ;CALC TABLE ADDR MOV (R1)+,R2 ;GET CORE ADDR OF OVERLAY REGION CMP R0,@R2 ;IS OVERLAY ALREADY RESIDENT? BEQ $ENTER ;YES, BRANCH TO IT .READW 17,R2,(R1)+,(R1)+ ;READ FROM OVERLAY FILE BCS $ERR $ENTER: MOV (SP)+,R2 ;RESTORE USER'S REGS MOV (SP)+,R1 MOV (SP)+,R0 MOV @R5,R5 ;GET ENTRY ADDRESS RTS R5 ;ENTER OVERLAY ROUTINE AND ;RESTORE USER'S R5 $FIRST: MOV #12500,$OVRHB ;RESTORE SWITCH INSTR MOV (PC)+,R1 ;START ADDR FOR CLEAR OPERATION $HROOT: .WORD 0 ;HIGH ADDR OF ROOT SEGMENT MOV (PC)+,R2 ;COUNT $HOVLY: .WORD 0 ;HIGH LIMIT OF OVERLAYS 1$: CLR (R1)+ ;CLEAR ALL OVERLAY REGIONS CMP R1,R2 BLO 1$ BR $OVRHB ;AND RETURN TO CALL IN PROGRESS $ERR: EMT 376 ;SYSTEM ERROR 10 (OVERLAY I/O) .BYTE 0,373 $OVRHE: ; OVERLAY SEGMENT TABLE FOLLOWS: ; $OVTAB: .WORD ,, ; THREE WORDS PER ENTRY, ONE ENTRY PER OVERLAY SEGMENT. ; ALSO, THERE IS ONE WORD PREFIXED TO EACH OVERLAY REGION ; THAT IDENTIFIES THE SEGMENT CURRENTLY RESIDENT IN THAT REGION. ; THIS WORD IS AN INDEX INTO THE $OVTAB TABLE. ; SUBROUTINE TO CREATE TXT BLOCKS ; ENTER WITH WORD TO BE OUTPUT IN R0, TXTBLK POINTER IN R4 ; CALLS DMP0 SUBROUTINE WHEN TXTBLK FILLS UP. WDPUT: MOV R0,(R4)+ ;OUTPUT WORD TO TXT BLOCK ADD #2,TXTLEN CMP R4,#TXTBLK+<60.*2> ;BLOCK FULL? BHI 1$ ;YES RTS PC 1$: MOV TXTBLK,-(SP) ;SAVE ADDR OF CURRENT BLOCK MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) JSR PC,DMP0 ;DUMP TXT TO OUTPUT MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV #2,TXTLEN ;INDICATE EMPTY BLOCK MOV #TXTBLK+2,R4 ;RESET R4 POINTER ADD #<60.*2>,@SP ;CALC ADDR OF NEW BLOCK MOV (SP)+,TXTBLK RTS PC .PAGE .SBTTL DATE CONVERSION SUBROUTINE ;SUBROUTINE TO CONVERT THE OCTAL DATE TO DECIMAL ; INTERFACE REQUIREMENTS: ; R0 - CONTAINS THE OCTAL DATE FROM .DATE MACRO ; R1 - WHERE TO PUT THE CONVERTED DATE ; R2 - WORK REGISTER (PREVIOUS CONTENTS DESTROYED) CDATE: MOV R0,-(SP) ;PUSH DATE ONTO STACK ROL R0 ;ISOLATE THE DAY ROL R0 ; IN THE LOW- ROL R0 ;ORDER BITS OF SWAB R0 ;R0 BIC #177740,R0 JSR PC,DECOUT ;CONVERT # IN RO TO DECIMAL MOVB #'-,(R1)+ MOV @SP,R0 ;RESTORE DATE FROM STACK SWAB R0 BIC #177703,R0 ;SET UP THE MONTH ADD #DATTBL-4,R0 1$: MOVB (R0)+,(R1)+ ;MOVE IN MONTH NAME BNE 1$ MOVB #'-,-1(R1) MOV (SP)+,R0 ;RESTORE THE DATE BIC #177740,R0 ADD #72.,R0 ;SET UP THE YEAR JSR PC,DECOUT RTS PC ;RETURN TO CALLER .PAGE .SBTTL DECIMAL TO ASCII ; INPUT VALUE IN R0, STRING POINTER IN R1. ; OUTPUTS LEADING ZEROES. ; USES REGS R0,R1,R2, AND R3. DECOUT: MOV #DECTBL,R2 ;POINT TO TABLE OF DIVISORS ; ENTER AT CONVRT WITH ALTERNATE TABLE POINTER IN R0 FOR ; ANOTHER RADIX OR FORMAT. CONVRT: MOV #'0-1,R3 ;FORM DIGIT IN R3 1$: INC R3 SUB @R2,R0 ;SUBTRACT DIVISOR BPL 1$ ;UNTIL REMAINDER IS NEGATIVE ADD (R2)+,R0 ;RE-ADD THE DIVISOR(CORRECT THE REMAINDER) MOVB R3,(R1)+ ;OUTPUT THE NEXT DIGIT TST @R2 ;DONE ? BNE CONVRT ;NO, DO NEXT DIGIT RTS PC .END .TITLE LNKOV4 V04-03 RTLINK ; RT-11 LINKER ; ; DEC-11-ORLLA-E ; ; MARCH 11, 1974 ; EP / ENHANCED BY JG ; ; COPYRIGHT (C) 1974,1975 ; ; DIGITAL EQUIPMENT CORPORATION ; MAYNARD, MASSACHUSETTS 01754 ; ; 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 DIGITAL. ; ; 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. ; .PAGE .SBTTL SYMBOLIC CONSTANTS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 TAB= 11 LF= 12 FF= 14 CR= 15 SPAC= 40 PER= 56 GSD= 1 ;OBJECT MODULE CODES TXT= 3 RLD= 4 MODEND= 6 LBR= 7 ;LIBRARY MODULE CODE LBREND= 10 ;LIBRARY END CODE BYTBLK= 512. ;BYTE BLOCK SIZE BEGIN= 40 ;DISPS INTO SYS JOB DATA AREA JSTACK= 42 ;JOB'S INITIAL STACK POINTER JSTATS= 44 ;JOB STATUS WORD USRLOC= 46 ;ADDR OF SWAPPING USR HIGH= 50 ;HIGHEST LOC USED BY USER ERRBYT= 52 ;MONITOR ERROR INDICATOR MONLOW= 54 ;ADDR OF RMON LOWER LIMIT .CSECT= 2 ;LINKER SYMBOL TABLE FLAGS .OVR= 4 $DEFIN= 10 ;GSD FLAGS $RELOC= 40 ; OFFSETS INTO ENTRY POINT TABLE EPTALO= 30 ;EPT ENTRIES ALLOCATED(BYTES) LHEND= 44 ;REL END OF LBR HEADER ;OFFSETS INTO OVERLAY SECTION BLOCK LEVPTR= 2 ;POINTER TO LEVEL BLOCK IDNO= 4 ;OVERLAY SECTION ID NUMBER BASBLK= 6 ;BASE BLOCK OF SECTION ON OUTPUT SECLEN= 30 ;SECTION LENGTH NXSPTR= 32 ;POINTER TO NEXT SECTION SAME LEVEL LVLN= -8. ;OFFSETS INTO OVERLAY LEVEL BLOCK LVLP= -6 SECP= -4 OVJOB= 1000 ;BIT IN JSTATS WORD TO INDICATE ;AN OVERLAY JOB ; USEFUL EMT INSTRUCTIONS LKEMT= EMT+20 ;LOOKUP EMT SSEMT= EMT+120 ;SAVESTATUS EMT WEMT= EMT+240 ;WAIT EMT FOURK=20000 .MCALL ..V1.. ..V1.. .MCALL .CSISPC,.CSIGEN,.SETTOP,.LOCK,.UNLOCK .MCALL .FETCH,.LOOKUP,.PRINT,.TTYIN,.WAIT,.ENTER .MCALL .CLOSE,.SRESET,.READW,.WRITW,.WRITE .MCALL .REOPEN,.RCTRLO,.QSET,.DATE LDA= 0 ;TURN ON LDA FEATURE .NLIST CND .SBTTL MISCELLANEOUS MACRO DEFINITIONS .MACRO ERROR MSG JSR R0,ERROR .ASCIZ "?'MSG'?" .EVEN .ENDM .MACRO PRINT MSG JSR R5,PR00 .WORD MSG .ENDM .MACRO LERROR MSG,REG .CSECT CHAR4 CHARPT=. .ASCIZ "MSG" .CSECT MAIN4 .IF NB REG MOV REG,R0 JSR R5,LERROR .IFF JSR R5,LERROR+2 .ENDC .WORD CHARPT .ENDM .MACRO LERRA MSG .CSECT CHAR4 CHARPT=. .ASCIZ "MSG" .CSECT MAIN4 JSR R5,LERRA .WORD CHARPT .ENDM .SBTTL PASS2 - LIBRARY PROCESING ROUTINE .CSECT MAIN4 .GLOBL PASS2,DMP0,DMPA,ONEPT,LIBDIR,SEGNUM .GLOBL CSECT,FILPT,SYMM20,EPTSER,CURBLK .GLOBL NEWBUF,ISWIT,BUFSWT,NEWBLK,SKPBLK,FILPT1 .GLOBL INIO,PASS,MODCNT,BYTE,TXTBLK,ERROR .GLOBL LERRA,BASE,TEMP,GT1BYT,LERROR,BOTTOM .GLOBL HGHLIM,TXTLEN,LSWIT,PADDR,OBUF,OBLK .GLOBL ODBLK,SEGBAS,SEGBLK,ABWMAP,LDAPTR,CKSUM .GLOBL EOBUF,LOOKUP,CLC,SSWIT,RESLIB .GLOBL LMLSWT,BEGLML,STLML,ENDLML,LMLBLK,HARDER .GLOBL PA2LML,GETLIB,LIBBLK,IBUF1,IBUF2 .GLOBL TDMP0 ;### ; THIS ROUTINE INSURES THAT THE LINKER,DURING PASS2, ; PROCESSES THE LIBRARY OBJECT MODULES EXACTLY AS THEY ; WERE ENCOUNTERED DURING PASS1. ; .ENABL LSB LIBPA2: MOV #SSWIT,R2 DECB ONEPT ;IND LIBRARY I/O TSTB (R2)+ ;LIBRARY DIRECTORY AREA EXIST ? BNE LIBPA5 ;NO TSTB @R2 ;LML ON DISK ? BMI LIBPA8 ;YES LIBPA3: MOV BEGLML,R1 ;GET PTR TO START OF LML MOV #LIBBLK,R4 TSTB SSWIT ;LIB DIR IN CORE ? BNE LIBPA4 ;NO - NO BLK OPTIMIZATION CMP @R1,@R4 ;REQUESTED MOD IN BUFFER ? BEQ 15$ BLO LIBPA4 ;NO MOV @R1,R0 DEC R0 BEQ LIBPA4 ;MOD IMMEDIATELY FOLLOWS EPT ; /OF 1 BLK (SPECIAL CONSIDERATION) CMP R0,@R4 ;REQUESTED MOD IN NXT BUFFER ? BEQ 18$ LIBPA4: MOV (R1)+,@R4 ;IND MOD BLK ADR BMI LENPA0 ;YES - END OF LIBRARY ? MOV (R1)+,R3 ;GET BYTE ADR WITHIN BLK JSR PC,GETLIB ;GET THE CORRECT BLK # 7$: ADD R3,R4 ;PT TO CORRECT BYTE IN BLK MOV R1,BEGLML ;UPDATE LML PTR BISB #100,ISWIT ;IND PROCESSING LIBR FILE BR PA2NXT ; CALL MAIN PROCESSING ROUTINE 15$: MOV IBUF1,R4 16$: TST (R1)+ ;MOD IN BUFFER 1 MOV (R1)+,R3 BR 7$ 18$: MOV IBUF2,R4 ;PT TO 2ND BUFFER TST -(R4) BR 16$ .DSABL LSB LIBPA5: TSTB @R2 ;LML CORE RESIDENT ? BPL LIBPA3 ;YES MOV STLML,R1 ;PT TO START OF LML MOV #256.,R2 MOV LMLBLK,R0 LIBPA6: .READW 2,R1,R2,R0 ;READ LML BCC 2$ ;ERRORS ? JMP HARDER ;TERMINATE FOR I/O ERROR 2$: INC LMLBLK ;IND NEXT BLK BR LIBPA4 LIBPA8: MOV LIBDIR,R1 ;READ LML OVER LIBR DIR MOV #FOURK,R2 ;SPECIFY MAX DIR SIZE ROR R2 ;CALC. # OF WORDS CLR R0 BR LIBPA6 ; ALL THE CSECTS IN THE LIBRARY HAVE BEEN PROCESSED. ; RESET ALL POINTERS, TERMINATE THE LIBRARY FILE ; AND GO BACK TO IN LINE PROCESSING. LENPA0: MOV R1,BEGLML ;UPDATE LML PTR CLR @R4 ;RESET LIB BLK # FOR NXT LIBR CLRB ONEPT .WAIT 0 .WAIT 3 .CLOSE 3 ;TERMINATE LIBRARY FILE CLRB ISWIT ;RESET LIB SWITCHES BR PASS2A ;RECALL PASS2 .SBTTL PASS2 - PRODUCE SAVE IMAGE FILE PASS2: MOV FILPT1,R0 ;RESET FILE POINTER MOV PA2LML,BEGLML ;INIT FOR LIBRARY PROCESSING CLR LMLBLK JSR PC,INIO ;INIT I/O MOVB #2,PASS ;SET PASS SWITCH BR PA2NXT PASS2A: JSR PC,NEWBUF JSR PC,NEWBUF ;READ NXT FILE BR PA2NXT PA2SKP: JSR PC,SKPBLK PA2NXT: JSR PC,NEWBLK ;ENTER MAIN PASS2 LOOP HERE CMP R0,#LBR ;PROCESSING A LIBR. ? BNE 1$ JMP LIBPA2 1$: CMP R0,#TXT BNE 5$ JMP DMPTXT 5$: CMP R0,#RLD BEQ PA2RLD CMP R0,#MODEND ;END OF THIS OBJ MOD? BNE PA2SKP ;NO INC MODCNT BITB #100,ISWIT ;LIBR PROCESSING ? BEQ PA2SKP CLRB ONEPT BR LIBPA2 .SBTTL PROCESS RLD'S PA2RLD: JSR PC,BYTE ;GET 1ST BYTE OF RLD CLR -(SP) MOVB R0,@SP ;STORE THE COMMAND BYTE JSR PC,BYTE CLR R1 BISB R0,R1 ;GET RELATIVE REFERENCE IN R1 MOV R1,R3 ADD #TXTBLK-2,R1 ;LOC OF TARGET IN TXTBLK BIT #1,TXTBLK ;IS TXT BLK ON ODD BOUNDARY? ;### BEQ 1$ ;IF EQ-NO ;### INC R1 ;YES-INCR RELATIVE REFERENCE, ;### ;SINCE BLK WAS SHIFTED BY A ;### ;BYTE AT LOC. DMPTXT. ;### 1$: ADD TXTBLK,R3 ;PROG ADDR OF TARGET ;### SUB #2,R3 ;CURRENT LOC+2 (YES, SUBTRACT) NEG R3 ;MINUS CURR LOC + 2 SUB #2,R2 ;SUBTRACT FROM LEN OF RLD BLK MOV @SP,R0 ;GET COMMAND BYTE ASLB R0 CMP R0,#RLDTBE-RLDTBL BHI RLDERR ;ERROR: INVALID RLD COMMAND MOV RLDTBL(R0),PC .CSECT DPUR4 RLDTBL: .WORD RLDERR .WORD RLDIR ;INTERNAL RELOCATION .WORD RLDGR ;GLOBAL RELOCATION .WORD RLDIDR ;INTERNAL DISPLACED RELOCATION .WORD RLDGDR ;GLOBAL DISPLACED RELOCATION .WORD RLDGAR ;GLOBAL ADDITIVE RELOCATION .WORD RLDGAD ;GLOBAL ADDITIVE DISPLACED REL .WORD RLDLCD ;LOCATION COUNTER DEFINITION .WORD RLDLCM ;LOCATION COUNTER MODIFICATION .WORD RLDSPL ;SET PROGRAM LIMITS .WORD RLDGR .WORD RLDERR .WORD RLDGDR .WORD RLDGAR RLDTBE: .WORD RLDGAD .CSECT MAIN4 RLDERR: ERROR RLDGR: CLR R3 RLDGDR: JSR PC,RLDLK BR RLDST RLDGAR: CLR R3 RLDGAD: JSR PC,RLDLK BIT 2(R0),#.OVR ;OVERLAY ENTRY? BEQ RLDIDR ;NO, SO OKAY BIT 2(R0),#.CSECT ;CSECT IN OVERLAY ? BNE RLDIDR ;YES - OKAY MOV R3,-(SP) MOV R0,-(SP) JSR PC,GETDIS ;GET GLOBAL DISPLACEMENT MOV (SP)+,R0 TST R3 ;DISP MUST BE ZERO ? BEQ RLDID0 LERRA ;PRINTS SYMBOL JSR PC,SEGNUM ;GET SEG # LERROR ,R0 BR RLDID0 RLDIR: MOV BASE,R3 ;ADD SECTION BASE RLDIDR: MOV R3,-(SP) JSR PC,GETDIS ;GET GLOBAL DISP RLDID0: ADD (SP)+,R3 SUB #2,R2 ;SUB FROM LENGTH OF BLOCK .ENABL LSB RLDST: TSTB (SP)+ ;TEST IF BYTE COMMAND BPL 1$ ;NO, GO STORE WORD MOVB R3,@R1 ;STORE BYTE BIT R3,#177400 ;FITS IN 8 BITS? BEQ RLDNXT ;YES MOV #177600,R0 ;TEST IF MINUS BIC R3,R0 BEQ RLDNXT ;YES, OKAY LERROR ,R1 BR RLDNXT 1$: ROR R1 BCS RLDERR ;CAN'T HAPPEN ************************* ROL R1 MOV R3,@R1 RLDNXT: TST R2 BGT PA2RLD BNE RLDERR ;CAN'T HAPPEN ************************* JSR PC,BYTE JPA2NX: JMP PA2NXT ;### .DSABL LSB RLDLCD: CLR R3 JSR PC,RLDLK ;LOOKUP CSECT NAME MOV R3,BASE ;SET UP NEW CSECT BASE RLD2: MOV #CLC,R1 ;WILL STORE RESULT INTO CLC BR RLDIDR RLDLCM: MOV BASE,R3 ;LOCATION COUNTER MODIFICATION BR RLD2 RLDSPL: MOV BOTTOM,(R1)+ ;SET PROGRAM LIMITS MOV HGHLIM,@R1 BR RLDNXT GETDIS: MOV #TEMP,R3 JSR PC,GT1BYT ;GET DISP CONSTANT JSR PC,GT1BYT MOV -(R3),R3 ;PLACE DISP IN R3 RTS PC .SBTTL WRITE TEXT TO OUTPUT FILE ; ; MODIFIED BY BC TO HANDLE TXT BLKS WHICH ARE ON AN ODD BOUNDARY. ; IF SUCH A BLK IS FOUND, THE DATA BYTES (BUT NOT THE ADDRESS!) ; ARE SHIFTED DOWN IN MEMORY (HIGHER) BY ONE BYTE WHEN THE BLOCK ; IS FIRST READ IN, AND SHIFTED BACK UP WHEN THE BLOCK IS OUTPUT. ; OTHER AREAS AFFECTED BY THIS FIX ARE LOC PA2RLD IN LNKOV4. ; LOC PA2RLD IN LNKOV5 ; LOC DMPTXT IN LNKOV5 ; LOC NBF2 IN LINK0 ; LOC TDMP0 IN LINK0 ; DMPTXT: MOV R2,-(SP) ;SAVE LENGTH OF NEW BLOCK 7$: JSR PC,TDMP0 ;GET RID OF OLD BLOCK ;### MOV (SP)+,R2 ;GET LEN OF NEW BLK MOV R2,TXTLEN ;AND ESTABLISH AS CURRENT MOV #TXTBLK,R3 MOV R3,R1 ;COPY ADDR OF TXTBLK ;### 2$: CMP R4,R5 ;CHECK IF ANY MORE BYTES TO MOVE BLO 3$ JSR PC,NEWBUF ;READ A NEW INPUT BUFFER LOAD 3$: MOVB (R4)+,(R3)+ ;MOVE TXT BLOCK INCLUDING CKSUM DEC R2 BGE 2$ ADD BASE,(R1) ;ADD BASE TO GIVE ABS LOAD ADDR ;### BIT #1,(R1)+ ;IS PROG ADDR OF TXTBLK ODD? ;### BEQ 5$ ;IF EQ-NO ;### 4$: MOVB -(R3),1(R3) ;YES-MOVE BLK DOWN IN MEMORY(HIGHER);### CMP R3,R1 ;DONE WHOLE BLOCK? ;### BNE 4$ ;IF NE-NO ;### 5$: BR JPA2NX ;YES-GO ON ;### .SBTTL RLD SYMBOL LOOKUP ROUTINE ; SUBROUTINE TO LOOK UP THE SYMBOL IN THE CURRENT RLD ITEM, ; AND ADD ITS VALUE TO R3. RLDLK: MOV R3,-(SP) ;SAVE CURRENT R3 MOV #TEMP,R3 1$: CMP R4,R5 BLO 2$ JSR PC,NEWBUF 2$: MOVB (R4)+,(R3)+ ;GET 4 BYTES OF SYMBOL NAME CMP R3,#TEMP+4 BLO 1$ MOV #TEMP,R3 JSR PC,LOOKUP TST @R0 ;SYMBOL MUST HAVE BEEN DEFINED BEQ 3$ ;CAN'T HAPPEN************************ MOV -(R0),R3 ;GET SYMBOL'S VALUE ADD (SP)+,R3 ;ADD FORMER R3 VAL SUB #4,R2 ;SUBTRACT FROM LENGTH OF BLOCK RTS PC 3$: JMP RLDERR ;BAD RLD .END .TITLE LNKOV5 FB V04-03 RTLINK ; RT-11 LINKER ; ; DEC-11-ORLLA-E ; ; MAY 17, 1974 ; JG/BC ; ; COPYRIGHT (C) 1974,1975 ; ; DIGITAL EQUIPMENT CORPORATION ; MAYNARD, MASSACHUSETTS 01754 ; ; 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 DIGITAL. ; ; 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. .PAGE .SBTTL SYMBOLIC CONSTANTS R0=%0 R1=%1 R2=%2 R3=%3 R4=%4 R5=%5 SP=%6 PC=%7 TAB= 11 LF= 12 FF= 14 CR= 15 SPAC= 40 PER= 56 GSD= 1 ;OBJECT MODULE CODES TXT= 3 RLD= 4 MODEND= 6 LBR= 7 ;LIBRARY MODULE CODE LBREND= 10 ;LIBRARY END CODE BYTBLK= 512. ;BYTE BLOCK SIZE RSIZE= 52 ;ROOT SIZE OF PGM OVSIZE= 54 ;SUMS OF THE LARGEST OVERLAY REGIONS BEGIN= 40 ;DISPS INTO SYS JOB DATA AREA JSTACK= 42 ;JOB'S INITIAL STACK POINTER JSTATS= 44 ;JOB STATUS WORD USRLOC= 46 ;ADDR OF SWAPPING USR HIGH= 50 ;HIGHEST LOC USED BY USER ERRBYT= 52 ;MONITOR ERROR INDICATOR MONLOW= 54 ;ADDR OF RMON LOWER LIMIT RELBLK= 60 ;ADDRESS OF REL RELID= 56 ;FB IDENTIFIER ADR .CSECT= 2 ;LINKER SYMBOL TABLE FLAGS .OVR= 4 $DEFIN= 10 ;GSD FLAGS $RELOC= 40 ; OFFSETS INTO ENTRY POINT TABLE EPTALO= 30 ;EPT ENTRIES ALLOCATED(BYTES) LHEND= 44 ;REL END OF LBR HEADER ;OFFSETS INTO OVERLAY SECTION BLOCK LEVPTR= 2 ;POINTER TO LEVEL BLOCK IDNO= 4 ;OVERLAY SECTION ID NUMBER BASBLK= 6 ;BASE BLOCK OF SECTION ON OUTPUT SECLEN= 30 ;SECTION LENGTH NXSPTR= 32 ;POINTER TO NEXT SECTION SAME LEVEL LVLN= -8. ;OFFSETS INTO OVERLAY LEVEL BLOCK LVLP= -6 SECP= -4 OVJOB= 1000 ;BIT IN JSTATS WORD TO INDICATE ;AN OVERLAY JOB ; USEFUL EMT INSTRUCTIONS LKEMT= EMT+20 ;LOOKUP EMT SSEMT= EMT+120 ;SAVESTATUS EMT WEMT= EMT+240 ;WAIT EMT FOURK = 20000 .MCALL ..V1.. ..V1.. .MCALL .CSISPC,.CSIGEN,.SETTOP,.LOCK,.UNLOCK .MCALL .FETCH,.LOOKUP,.PRINT,.TTYIN,.WAIT,.ENTER .MCALL .CLOSE,.SRESET,.READW,.WRITW,.WRITE .MCALL .REOPEN,.RCTRLO,.QSET,.DATE LDA= 0 ;TURN ON LDA FEATURE .SBTTL MISCELLANEOUS MACRO DEFINITIONS .MACRO ERROR MSG JSR R0,ERROR .ASCIZ "?'MSG'?" .EVEN .ENDM .MACRO PRINT MSG JSR R5,PR00 .WORD MSG .ENDM .MACRO LERROR MSG,REG .CSECT CHAR5 CHARPT=. .ASCIZ "MSG" .CSECT MAIN5 .IF NB REG MOV REG,R0 JSR R5,LERROR .IFF JSR R5,LERROR+2 .ENDC .WORD CHARPT .ENDM .MACRO LERRA MSG .CSECT CHAR5 CHARPT=. .ASCIZ "MSG" .CSECT MAIN5 JSR R5,LERRA .WORD CHARPT .ENDM .SBTTL PASS2 - LIBRARY PROCESING ROUTINE .CSECT MAIN5 .GLOBL DMPA,DMP0,WRTREL,RELWRD,RELBUF,TDMP0 ;### .GLOBL PASS2,FBOVL2,RSWIT,RELPTR,FBTXT .GLOBL DOSB,OVSPTR,OVLNUM,RELOVL,ASECT .GLOBL CSECT,FILPT,SYMM20,EPTSER,CURBLK .GLOBL NEWBUF,ISWIT,BUFSWT,NEWBLK,SKPBLK,FILPT1 .GLOBL INIO,PASS,MODCNT,BYTE,TXTBLK,ERROR .GLOBL LERRA,BASE,TEMP,GT1BYT,LERROR,BOTTOM .GLOBL HGHLIM,TXTLEN,LSWIT,PADDR,OBUF,OBLK .GLOBL ODBLK,SEGBAS,SEGBLK,ABWMAP,LDAPTR,CKSUM .GLOBL EOBUF,LOOKUP,CLC,CURBUF,RELADR,PNRELO .GLOBL ONEPT,LIBDIR,SSWIT,RESLIB,RELERR,OVLCDE .GLOBL SEGNUM,RLSTRT,IBUF1,IBUF2,GETLIB,LIBBLK .GLOBL OVFLG,OVLV1,RSIZ1,OVSIZ1,RELID1,PA2LML .GLOBL LMLSWT,BEGLML,STLML,ENDLML,LMLBLK,HARDER ; THIS ROUTINE INSURES THAT THE LINKER,DURING PASS2, ; PROCESSES THE LIBRARY OBJECT MODULES EXACTLY AS THEY ; WERE ENCOUNTERED DURING PASS1. ; .ENABL LSB LIBPA2: MOV #SSWIT,R2 DECB ONEPT ;IND LIBRARY I/O TSTB (R2)+ ;LIBRARY DIR AREA EXIST ? BNE LIBPA5 ;NO TSTB @R2 ;LML ON DISK ? BMI LIBPA8 ;YES LIBPA3: MOV BEGLML,R1 MOV #LIBBLK,R4 TSTB SSWIT ;LIB DIR IN CORE ? BNE LIBPA4 ;NO - NO BLK OPTIMIZATION CMP @R1,@R4 ;REQUESTED MOD IN BUFFER ? BEQ 15$ ;YES BLO LIBPA4 ;NO MOV @R1,R0 ; DEC R0 BEQ LIBPA4 ;MOD IMMEDIATELY FOLLOWS EPT ; /OF 1 BLK (SPECIAL CONSIDERATION) CMP R0,@R4 ;REQUESTED MOD IN NXT BUFFER ? BEQ 18$ ;YES LIBPA4: MOV (R1)+,@R4 ;IND MOD BLK ADR BMI LENPA0 ;YES - END OF LIBRARY MOV (R1)+,R3 ;GET BYTE ADR WITHIN BLK JSR PC,GETLIB ;GET THE CORRECT LIB BLK 7$: ADD R3,R4 ;PT TO CORRECT BYTE WITHIN BLK MOV R1,BEGLML ;UPDATE LML PTR BISB #100,ISWIT ;IND PROCESSING LIBR FILE JMP PA2NXT ;CALL MAIN PROCESSING RTN 15$: MOV IBUF1,R4 ;MOD IN BUFFER 1 16$: TST (R1)+ MOV (R1)+,R3 BR 7$ 18$: MOV IBUF2,R4 ;PT TO 2ND BUFFER TST -(R4) BR 16$ .DSABL LSB LIBPA5: TSTB @R2 ;LML CORE RESIDENT ? BPL LIBPA3 ;YES MOV STLML,R1 ;PT TO START OF LML MOV #256.,R2 MOV LMLBLK,R0 LIBPA6: .READW 2,R1,R2,R0 ;READ LML BCC 2$ ;ERRORS ? JMP HARDER ;TERMINATE FOR I/O ERRORS 2$: INC LMLBLK ;IND NEXT BLK BR LIBPA4 LIBPA8: MOV LIBDIR,R1 ;READ LML OVER LIB DIR MOV #FOURK,R2 ;SPECIFY MAX DIR SIZE ROR R2 ;CALC. # OF WORDS CLR R0 BR LIBPA6 ; ALL THE CSECTS IN THE LIBRARY HAVE BEEN PROCESSED. ; RESET ALL POINTERS, TERMINATE THE LIBRARY FILE, ; AND GO BACK TO IN LINE PROCESSING. LENPA0: MOV R1,BEGLML ;UPDATE LML PTR CLR @R4 ;RESET LIBBLK # FOR NXT LIBR CLRB ONEPT .WAIT 0 .WAIT 3 .CLOSE 3 ;TERMINAT LIBRARY FILE CLRB ISWIT ;RESET LIB SWITCHES BR PASS2A .SBTTL F/B PASS2 - PRODUCE REL IMAGE FILE FBOVL2: MOV #DOSB,OVSPTR ;PT TO 1ST OVERLAY SECTION BLK MOV PA2LML,BEGLML ;INIT FOR LIBR PROCESSING CLR LMLBLK CLR RELID1 MOV #RELBUF,R4 MOV R4,RELPTR ;INITIALIZE REL BUFFER PTR MOV #1,OVLNUM ;INITIALIZE OVERLAY REL COUNTER 1$: CLR (R4)+ ;CLEAR REL BUFFER CMP R4,#EORLBF ;BUFFER CLEARED ? BLO 1$ CLR RELOVL TST OVFLG ;OVERLAY LINK ? BEQ NOVLRL ; AN OVERLAY FOREGROUND LINK IS TAKING PLACE. ; THEREFORE THE FOLLOWING LOCATIONS OF THE OVERLAY ; HANDLER MUST HAVE RELS POINTING TO THEM ; (0) LOCATION 14 - ADD #$OVTAB-6,R1 ; (1) LOCATION 62 - $HROOT (HIGH ADR OF ROOT SEGMENT) ; (2) LOCATION 66 - $HOVLY (HIGH LIMIT OF OVERLAYS ) ; (3) $OVTAB - THE 1ST WORD (CORE ADR) OF EACH ENTRY ; IN THE OVERLAY SEGMENT TABLE. ; (4) DUMMY SUBROUTINE TABLE - $OVRH AND THE ENTRY ADR OF EACH ; SUBROUTINE CALL. CLR R0 ;POSITIVE RELOCATION MOV #16,R3 ;ADD #$OVTAB-6,R1 REL JSR PC,BLDREL MOV #64,R3 ;$HROOT REL GENERATION JSR PC,BLDREL MOV #70,R3 ;$HOVLY REL GENERATION JSR PC,BLDREL ; $OVTAB REL GENERATION MOV #104,R3 ;IND 1ST REL PTR OVTABF: MOV OVLV1,R2 ;PT TO OVERLAY STRUCTURE 1$: MOV SECP(R2),R4 ;GET SECTION BLK PTR 2$: ADD #2,R3 ;SET UP FOR REL SUBR JSR PC,BLDREL ;OUTPUT REL ADD #4,R3 ;PT TO NEXT ENTRY MOV NXSPTR(R4),R4 ;LINK TO NEXT SECTION THIS LEVEL BNE 2$ MOV LVLP(R2),R2 ;LINK TO NEXT LEVEL BNE 1$ ; DUMMY SUBROUTINE REL GENERATION MOV OVLV1,R4 ;PT TO OVERLAY STRUCTURE 10$: MOV SECP(R4),R4 ;GET SECTION BLK PTR 11$: MOV @R4,R2 ;GET CSECT PTR 12$: BIC #100007,R2 ;ISOLATE REL ADR BEQ 20$ ;END OF THIS SECTION ADD SYMM20,R2 ;CALC SYMBOL ADR BIT #.CSECT,@R2 ;CSECT NAMES ARE NOT OVERLAYABLE BNE 19$ ;ENTRY POINTS ADD #4,R3 ;SET UP FOR REL SUBR JSR PC,BLDREL ;REL FOR JSR R5,$OVRH ADD #4,R3 JSR PC,BLDREL ;REL FOR ENTRY ADR 19$: MOV @R2,R2 ;LINK TO NEXT ENTRY IN SYM TAB BR 12$ 20$: MOV R4,R2 ;SAVE SECTION PTR MOV NXSPTR(R4),R4 ;LINK TO NEXT SECTIN BNE 11$ MOV LEVPTR(R2),R4 ;POINT TO LEVEL BLK MOV LVLP(R4),R4 ;LINK TO NEXT LEVEL BNE 10$ ; END OF OVERLAY HANDLER REL GENERATION NOVLRL: CLR R3 MOV FILPT1,R0 ;RESET FILE PTR JSR PC,INIO ;INIT I/O MOVB #2,PASS ;SET PASS SWITCH BR PA2NXT PASS2A: JSR PC,NEWBUF JSR PC,NEWBUF ;READ NXT FILE BR PA2NXT PA2SKP: JSR PC,SKPBLK PA2NXT: JSR PC,NEWBLK ;ENTER MAIN PASS2 LOOP HERE CMP R0,#LBR ;PROCESSING A LIBR. ? BNE 1$ JMP LIBPA2 1$: CMP R0,#TXT BNE 5$ JMP DMPTXT 5$: CMP R0,#RLD BEQ PA2RLD CMP R0,#MODEND ;END OF THIS OBJ MOD? BNE PA2SKP ;NO INC MODCNT BITB #100,ISWIT ;LIBR PROCESSING ? BEQ PA2SKP CLRB ONEPT JMP LIBPA2 .SBTTL PROCESS RLD'S PA2RLD: JSR PC,BYTE ;GET 1ST BYTE OF RLD CLR -(SP) MOVB R0,@SP ;STORE THE COMMAND BYTE JSR PC,BYTE CLR R1 BISB R0,R1 ;GET RELATIVE REFERENCE IN R1 MOV R1,R3 ADD #TXTBLK-2,R1 ;LOC OF TARGET IN TXTBLK BIT #1,TXTBLK ;IS TXT BLK ON ODD BOUNDARY? ;### BEQ 1$ ;IF EQ-NO ;### INC R1 ;YES-INCR RELATIVE REFERENCE, ;### ;SINCE BLK WAS SHIFTED BY A ;### ;BYTE AT LOC. DMPTXT. ;### 1$: ADD TXTBLK,R3 ;PROG ADDR OF TARGET ;### SUB #2,R3 ;CURRENT LOC+2 (YES, SUBTRACT) MOV R3,RELADR ;IND REL CODE ADR NEG R3 ;MINUS CURR LOC + 2 SUB #2,R2 ;SUBTRACT FROM LEN OF RLD BLK MOV @SP,R0 ;GET COMMAND BYTE ASLB R0 CMP R0,#RLDTBE-RLDTBL BHI RLDERR ;ERROR: INVALID RLD COMMAND MOV RLDTBL(R0),PC .CSECT DPUR5 RLDTBL: .WORD RLDERR .WORD RLDIR ;INTERNAL RELOCATION .WORD RLDGR ;GLOBAL RELOCATION .WORD RLDIDR ;INTERNAL DISPLACED RELOCATION .WORD RLDGDR ;GLOBAL DISPLACED RELOCATION .WORD RLDGAR ;GLOBAL ADDITIVE RELOCATION .WORD RLDGAD ;GLOBAL ADDITIVE DISPLACED REL .WORD RLDLCD ;LOCATION COUNTER DEFINITION .WORD RLDLCM ;LOCATION COUNTER MODIFICATION .WORD RLDSPL ;SET PROGRAM LIMITS .WORD RLDGR .WORD RLDERR .WORD RLDGDR .WORD RLDGAR RLDTBE: .WORD RLDGAD .CSECT MAIN5 RLDERR: ERROR RLDCHK: MOV #177777,-(SP) ;IND SUBROUTINE RETURN BR RLDGR0 RLDGR: CLR -(SP) ;IND NON SUBR RETURN RLDGR0: MOV RELADR,-(SP) ;SAVE PROG ADR OF TARGET CLR R3 RLDGR1: JSR PC,RLDLK ;LOOKUP SYMBOL IN SYM TAB MOV R3,TEMP ;SAVE ABS ENTRY ADR (VALUE) MOV R0,TEMP+2 ;SAVE SYMBOL ADR SUB #4,R0 ;PT TO SYMBOL JSR PC,CHKABS ;CHECK FOR ABSOLUTE SYMBOL TST R0 ;GLOBAL ABSOLUTE ? BMI 10$ ;YES TSTB PNRELO ;NEGATIVE RELOCATION ? BMI 12$ ;YES 5$: MOV (SP)+,R3 ;IND PROG ADR OF TARGET JSR PC,BLDREL ;PLACE ENTRY IN REL 7$: MOV TEMP,R3 ;RESTORE ABS ENTRY ADR MOV TEMP+2,R0 ;RESTORE SYMBOL ADR CLRB PNRELO TST (SP)+ ;SUBROUTINE RETURN ? BMI RLDSUB BR RLDST 10$: TSTB PNRELO ;NEGATIVE RELOCATION ? BMI 5$ ;YES 12$: TST (SP)+ ;IGNORE REL FOR THIS ENTRY BR 7$ RLDSUB: RTS PC RLDGR3: MOV #177777,-(SP) RLDGR4: MOV RELADR,-(SP) DECB PNRELO ;IND (-) RELOC BR RLDGR1 RLDGDR: CLR -(SP) ;IND NON SUBR RETURN BR RLDGR4 RLDGAR: JSR PC,RLDCHK BR RLDGR5 RLDGAD: JSR PC,RLDGR3 RLDGR5: BIT 2(R0),#.OVR ;OVERLAY ENTRY? BEQ RLDDR0 ;NO, SO OKAY BIT 2(R0),#.CSECT ;CSECT IN OVERLAY ? BNE RLDDR0 ;YES - OKAY MOV R3,-(SP) MOV R0,-(SP) JSR PC,GETDIS ;GET GLOBAL DISP MOV (SP)+,R0 TST R3 ;DISP MUST BE ZERO BEQ RLDID0 LERRA ;PRINTS SYMBOL JSR PC,SEGNUM ;GET SEGMENT # LERROR ,R0 BR RLDID0 RLDIR: CLR R0 ;IND + RELOCARION MOV RELADR,R3 JSR PC,BLDREL ;PLACE ENTRY IN REL MOV BASE,R3 ;ADD SECTION BASE BR RLDDR0 RLDIDR: MOV #177777,R0 ;IND - RELOCATION MOV R3,-(SP) MOV RELADR,R3 JSR PC,BLDREL ;PLACE ENTRY IN REL MOV (SP)+,R3 RLDDR0: MOV R3,-(SP) JSR PC,GETDIS ;GET GLOBAL DISP RLDID0: ADD (SP)+,R3 SUB #2,R2 ;SUB FROM LENGTH OF BLOCK .ENABL LSB RLDST: TSTB (SP)+ ;TEST IF BYTE COMMAND BPL 1$ ;NO, GO STORE WORD MOVB R3,@R1 ;STORE BYTE BIT R3,#177400 ;FITS IN 8 BITS? BEQ CHKOVL ;YES MOV #177600,R0 ;TEST IF MINUS BIC R3,R0 BEQ CHKOVL ;YES, OKAY LERROR ,R1 BR RLDNXT 1$: ROR R1 BCS RLDERR ;CAN'T HAPPEN ************************* ROL R1 MOV R3,@R1 CHKOVL: TST OVLCDE ;PLACE RELOC CODE IN OVL REL ? BEQ RLDNXT ;NO MOV RELPTR,R0 JSR PC,RELWRD ;PLACE RELOCATED CODE IN REL MOV R0,RELPTR ;UPDATE REL PTR CLR OVLCDE RLDNXT: TST R2 BGT 10$ BEQ 5$ JMP RLDERR ;CAN'T HAPPEN ************************* 5$: JSR PC,BYTE JMP PA2NXT 10$: JMP PA2RLD .DSABL LSB RLDLCD: CLR R3 JSR PC,RLDLK ;LOOKUP CSECT NAME MOV R3,BASE ;SET UP NEW CSECT BASE RLD2: MOV #CLC,R1 ;WILL STORE RESULT INTO CLC BR RLDDR0 RLDLCM: MOV BASE,R3 ;LOCATION COUNTER MODIFICATION BR RLD2 RLDSPL: MOV R1,-(SP) MOV #2,R1 MOV RELADR,R3 RLDSP0: CLR R0 JSR PC,BLDREL ;PLACE ENTRY IN REL TST (R3)+ TST SEGBAS ;OVERLAY REL ? BEQ 1$ ;NO ADD #2,RELPTR ;INDEX REL PTR 1$: DEC R1 ;2ND REL OF LIMITS WRITTEN ? BNE RLDSP0 ;NO MOV (SP)+,R1 MOV BOTTOM,(R1)+ ;SET PROGRAM LIMITS MOV HGHLIM,@R1 BR RLDNXT GETDIS: MOV #TEMP,R3 JSR PC,GT1BYT ;GET DISP CONSTANT JSR PC,GT1BYT MOV -(R3),R3 ;PLACE DISP IN R3 RTS PC .SBTTL BUILD REL BLOCK ROUTINE ; THIS ROUTINE BUILDS THE RESIDENT REL BLOCK, AND THE OVERLAY ; REL BLOCK. THE RELS CONSIST OF POINTERS, RELATIVE ADDRESS FROM ; START OF ROOT, TO THE RELOCATED CODE IN THE TEXT BLOCK. ; (NOTE: THE ADDRESS IS SHIFTED RIGHT ONE BIT, AND BIT 15 ; IS EITHER 0 OR 1.,E.G. 1 = NEGATIVE RELOCATION, ; 0 = ADDITIVE RELOCATION ) ; INTERFACE: ; R3 - CONTAINS THE PROGRAM ADDRESS OF THE CODE IN THE ; TEXT BLOCK. ; RELPTR - CONTAINS A POINTER TO THE CURRENT ; POSITION IN THE REL BUFFER. ; RO = (-), PERFORM NEGATIVE RELOCATION ; RO = (+), PERFORM POSITIVE RELOCATION ; RETURN: ; RO THROUGH R5 ARE SAVED BLDREL: MOV R0,-(SP) MOV R1,-(SP) MOV R2,-(SP) MOV R3,-(SP) MOV R4,-(SP) MOV R5,-(SP) CLR R2 SUB #2,R3 ;CORRECT PGM TXT ADR FOR REL TST SEGBAS ;OVERLAY REL ? BNE OVLREL ;YES BLDRL1: TST R0 ;POSITIVE RELOCATION ? BPL 1$ ;YES SEC ;SET C BIT 1$: ROR R3 ;IND RELOCATION TYPE MOV RELPTR,R0 ;GET REL PTR JSR PC,RELWRD ;PLACE REL IN BUFFER MOV R0,RELPTR ;UPDATE REL PTR TST R2 ;OVERLAY REL ? BMI 5$ ;YES BR BLDEXT ;EXIT 5$: RTS PC OVLREL: CMP RELOVL,OVLNUM ;NEW OVERLAY ? BLO OVLRL1 ;NO MOV R0,-(SP) MOV R3,-(SP) MOV RELPTR,R0 ;GET REL PTR MOV #177777,R3 ;IND START OF OVERLAY REL BLK JSR PC,RELWRD MOV RLSTRT,R3 ;IND REL BLK ADR JSR PC,RELWRD MOV RELID1,R2 ;GET OVERLAY ID MOV OVSPTR,R4 ;PT TO SECTION BLK 1$: ADD #IDNO,R4 ;PT TO SECTION ID CMP R2,@R4 ;AT CORRECT OVERLAY ? BEQ 10$ ;YES ADD #NXSPTR-4,R4 ;PT TO NEXT SECT BLK ON LVL ADR MOV @R4,R5 ;ANOTHER SECTION BLK ? BNE 8$ ;YES MOV -SECLEN(R4),R4 ;GET OVL LVL BLK PTR MOV LVLP(R4),R4 ;GET NEXT OVL LVL BLK PTR TST (R4)+ ;GET PTR TO SECTION BLK BR 1$ 8$: MOV R5,R4 ;IND NEW SECTION BLK SAME LVL BR 1$ 10$: MOV -(R4),R2 ;GET PTR TO START ADR OF OVL LVL MOV SECLEN-2(R4),R4 ;GET HIGH CORE LIMIT OF SECTION ASR R4 ;CALC. # OF WORDS IN OVERLAY INC R4 ;INCLUDE OVERLAY ID WORD MOV R4,R3 ;IND OVERLAY LNTH IN REL BLK INC OVLNUM ;INC OVERLAY COUNTER JSR PC,RELWRD MOV R0,RELPTR ;UPDATE REL PTR MOV (SP)+,R3 MOV (SP)+,R0 OVLRL1: CLR R2 DEC R2 DEC OVLCDE ;IND TO PLACE RELOC CODE IN OVL REL SUB SEGBAS,R3 ;MAKE REL RELATIVE TO OVERLAY JSR PC,BLDRL1 ;OUTPUT REL BLDEXT: MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 MOV (SP)+,R0 RTS PC ; PLACE THE WORD IN R3 INTO THE REL BUFFER .ENABL LSB RELWRD: CMP R0,#EORLBF ;END OF REL BUFFER ? BLO 5$ ;NO WRTREL: TST ODBLK ;REL FILE OUTPUT ? BEQ 1$ ;NO .WRITW 0,#RELBUF,#256.,FBTXT ;WRITE REL BCC 1$ RELERR: ERROR 1$: INC FBTXT ;UPDATE REL BLK ADR MOV #RELBUF,R0 MOV R0,RELPTR ;RESET REL PTR 5$: MOV R3,(R0)+ ;OUTPUT REL WORD RELEXT: RTS PC .DSABL LSB ; OUTPUT BUFFER FOR THE REL AND OVERLAY REL BLOCKS RELBUF: .BLKW 256. EORLBF: .SBTTL CHECK FOR ABSOLUTE SYMBOL ; THIS SUBROUTINE DETERMINES WHETHER OR NOT A SYMBOL WAS ; DEFINED AS ABSOLUTE. ; INTERFACE: ; R0 - POINTER TO THE SYMBOL ; RETURN: ; R0 = (-), SYMBOL IS ABSOLUTE ; R0 = (+),SYMBOL IS RELOCATABLE CHKABS: MOV R1,-(SP) MOV R2,-(SP) MOV ASECT,R1 ;GET 1ST SYMBOL ADDRESS MOV R0,R2 ;SAVE SYMBOL PTR BR CHKAB2 CHKAB1: BIT #.CSECT,@R1 ;END OF ABSOLUTE SYMBOLS ? BNE CHKPOS ;YES - SYMBOL RELOCATABLE CHKAB2: SUB #6,R1 ;PT TO SYMBOL IN ABS LIST CMP (R0)+,(R1)+ ;1ST HALF SYMBOL MATCH ? BNE CHKIX2 ;NO CMP (R0)+,(R1)+ ;2ND HALF SYMBOL MATCH ? BNE CHKIX1 BR CHKNEG CHKIX2: TST (R1)+ ;PT TO VALUE OF SYMBOL CHKIX1: TST (R1)+ ;PT TO REL ADR PTR MOV @R1,R1 ;GET REL ADR WORD BIC #100007,R1 ;MASK OFF SYMBOL INDICATOR BEQ CHKPOS ;YES - END OF SYMBOL CHAIN ? ADD SYMM20,R1 ;PT TO NEXT SYMBOL MOV R2,R0 ;RESTORE SYMBOL PTR BR CHKAB1 CHKNEG: CLR R0 DEC R0 ;IND SYMBOL IS ABSOLUTE BR CHKEXT CHKPOS: CLR R0 ;IND SYMBOL IS RELOCATABLE CHKEXT: MOV (SP)+,R2 MOV (SP)+,R1 RTS PC .SBTTL WRITE TEXT TO OUTPUT FILE ; ; MODIFIED BY BC TO HANDLE TXT BLKS WHICH ARE ON AN ODD BOUNDARY. ; IF SUCH A BLK IS FOUND, THE DATA BYTES (BUT NOT THE ADDRESS!) ; ARE SHIFTED DOWN IN MEMORY (HIGHER) BY ONE BYTE WHEN THE BLOCK ; IS FIRST READ IN, AND SHIFTED BACK UP WHEN THE BLOCK IS OUTPUT. ; OTHER AREAS AFFECTED BY THIS FIX ARE LOC PA2RLD IN LNKOV4. ; LOC PA2RLD IN LNKOV5 ; LOC DMPTXT IN LNKOV4 ; LOC NBF2 IN LINK0 ; LOC TDMP0 IN LINK0 ; DMPTXT: MOV R2,-(SP) ;SAVE LENGTH OF NEW BLOCK JSR PC,TDMP0 ;GET RID OF OLD BLOCK ;### MOV (SP)+,R2 ;GET LEN OF NEW BLK MOV R2,TXTLEN ;AND ESTABLISH AS CURRENT MOV #TXTBLK,R3 MOV R3,R1 ;COPY ADDR OF TXTBLK ;### 2$: CMP R4,R5 ;CHECK IF ANY MORE BYTES TO MOVE BLO 3$ JSR PC,NEWBUF ;READ A NEW INPUT BUFFER LOAD 3$: MOVB (R4)+,(R3)+ ;MOVE TXT BLOCK INCLUDING CKSUM DEC R2 BGE 2$ ADD BASE,(R1) ;ADD BASE TO GIVE ABS LOAD ADDR ;### BIT #1,(R1)+ ;IS PROG ADDR OF TXTBLK ODD? ;### BEQ 5$ ;IF EQ-NO ;### 4$: MOVB -(R3),1(R3) ;YES-MOVE BLK DOWN IN MEMORY(HIGHER);### CMP R3,R1 ;DONE WHOLE BLOCK? ;### BNE 4$ ;IF NE-NO ;### 5$: JMP PA2NXT ;YES-GO ON ;### .SBTTL RLD SYMBOL LOOKUP ROUTINE ; SUBROUTINE TO LOOK UP THE SYMBOL IN THE CURRENT RLD ITEM, ; AND ADD ITS VALUE TO R3. RLDLK: MOV R3,-(SP) ;SAVE CURRENT R3 MOV #TEMP,R3 1$: CMP R4,R5 BLO 2$ JSR PC,NEWBUF 2$: MOVB (R4)+,(R3)+ ;GET 4 BYTES OF SYMBOL NAME CMP R3,#TEMP+4 BLO 1$ MOV #TEMP,R3 JSR PC,LOOKUP TST @R0 ;SYMBOL MUST HAVE BEEN DEFINED BEQ 3$ ;CAN'T HAPPEN************************ MOV -(R0),R3 ;GET SYMBOL'S VALUE ADD (SP)+,R3 ;ADD FORMER R3 VAL SUB #4,R2 ;SUBTRACT FROM LENGTH OF BLOCK RTS PC 3$: JMP RLDERR ;BAD RLD .END .TITLE RTLIBR V03-03-01 ROOT CODE ; RT-11 LIBRARIAN ; ; DEC-11-ORLBA-E ; ; J.E.G. ; ; COPYRIGHT (C) 1975 ; ; DIGITAL EQUIPMENT CORPORATION ; MAYNARD, MASSACHUSETTS 01754 ; ; 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 DIGITAL. ; ; 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. ; .SBTTL LIBRARIAN MACRO DEFINITIONS .MACRO PUSH,PUSH1 MOV PUSH1,-(SP) .ENDM .MACRO POP,POP1 MOV (SP)+,POP1 .ENDM .SBTTL SYMBOLIC DEFINITIONS R0= %0 R1= %1 R2= %2 R3= %3 R4= %4 R5= %5 SP= %6 PC= %7 ; FORM CONTROL CHARACTERS SPAC= 40 TAB= 11 LF= 12 FF= 14 CR= 15 ; COMMONLY USED CONSTANTS BYTBLK= 512. ;BYTE BLOCK SIZE BLK= 256. ;WORD BLOCK SIZE (I/O) PTR1= 2 PTR= 4 HICORE= 50 ;HIGHEST LIBRARIAN FREE CORE ADR RMON= 54 ;START OF RESIDENT MONITOR ADR USRLD= 266 ;START OF USR AREA ERRBYT= 52 ; MONITOR ERROR CODE ADDRESS LKEMT= EMT+20 ;LOOKUP EMT CODE SSEMT= EMT+120 ;SAVESTATUS EMT WEMT= EMT+240 ;WAIT EMT JSW= 44 ;JOB STATUS WORD ADDRESS RESTRT= 020000 ;JSW REENTER BIT ; OFFSETS INTO LIBRARY FILE EPT1= 20 ;EPT STARTING RELATIVE ADDRESS EPTALO= 30 ;EPT ENTRIES ALLOCATED (BYTES) NXTINS= 34 ;NEXT INSERT REL BLK # NXTBYT= 36 ;NEXT INSERT REL BYTE # EPT3= 24 ;EPT ENTRIES AVAILABLE LHEND= 32 ;REL END OF LIBR HEADER LBREPT= 42 ;1ST EPT ENTRY OF LIBRARY ; LIBRARY FILE IDENTIFICATION CODES ENTPNT= 002150 ;ENTRY PNT FLAG BYTE CODE FBHDR= 1 ;FORMATTED BINARY BLK HEADER FBLNTH= 56 ;FB MAXIMUM LENGTH LBRVER= 303 ;CURRENT LIBRARY VERSION # GSD= 1 ;GLOBAL SYMBOL DIRECTORY CODE GSDEND= 2 ;GSD TERMINATION CODE MODEND= 6 ;MODULE TERMINATION CODE LBR= 7 ;LIBRARY FILE IDENTIFIER LBRFIN= 10 ;LIBRARY FILE TERMINATION CODE .MCALL ..V1.. ..V1.. .MCALL .CLOSE,.CSISPC,.CSIGEN,.DATE,.DELETE,.ENTER .MCALL .FETCH,.LOOKUP,.PRINT,.QSET .MCALL .RCTRLO,.READ,.READW,.REOPEN,.SETTOP,.SRESET,.TTYIN .MCALL .WAIT,.WRITE,.WRITW ; .MCALL ...CM1,...CM2,...CM3,...CM4 .SBTTL LIBRARIAN BUFFERS,STORAGE AREAS AND VARIABLES .ASECT .=44 .WORD 400 ;SET CHAIN BIT .CSECT MONARG ;THIS CSECT MUST BE FIRST .GLOBL DEFEXT,LBREND,CHKSUM ; DO NOT CHANGE THE ORDER OF THE FOLLOWING WORDS ; CSI DEFAULT EXTENSIONS FOLLOW DEFEXT: .RAD50 /OBJ/ ;INPUT FILE EXT .RAD50 /OBJ/ ;LIBR OUTPUT FILE EXT .RAD50 /LLD/ ;LISTING FILE EXT .WORD 0 ; DO NOT CHANGE THE ORDER OF THE FOLLOWING WORDS ; LIBRARY END FB BLK LBREND: .WORD FBHDR ;LIBRARY END FB BLK .WORD 8. ;LENGTH OF LIBR END BLK .WORD 10 ;LIBR. END CODE .WORD 0 CHKSUM: .BYTE 357 ;LIBEND CHECKSUM .CSECT IMPUR1 .GLOBL IMPURE,STACK,LIBFIL,DIRFIL,LIBINP,SWIT1 .GLOBL SWIT3,SWIT5,SWIT7,SWIT9,SWIT11,PASS .GLOBL OUTBFH,OUTBF1,MODCNT,PA2BLK,OUTBLK,INSBYT .GLOBL CCOUNT,CUROBJ,TEMP,LURBLK,CURBLK,CURBUF .GLOBL ALTBUF,CORADR,SVSTAT,CURFIL,REPLPT,UPDPTR .GLOBL ENDCOR,DELADR,EPTADR,EPTBLK,LISFIL,OUTBUF .GLOBL BLKDIS,BYTDIS,BUFSWT,EOF,IMPEND,ENDEPT .GLOBL SWIT2,SWIT4,SWIT6,SWIT8,SWIT10,SWIT12 IMPURE: ; EVERYTHING IN THIS CSECT IS CLEARED AT START .BLKW 100 ; LIBRARIAN STACK AREA STACK: ; THE FOLLOWING AREAS ARE USED BY THE CSI AS READ-IN ; AREAS. DO NOT CHANGE THEIR ORDER !!! LIBFIL: .BLKW 5 ;LIBRARY FILE SPECIFIER DIRFIL: .BLKW 5 ;LIBRARY OUTPUT FILE SPECIFIER LIBINP: .BLKW 40 ;LIBRARY INPUT FILE SPECIFIER ; END CSI READ -IN AREAS SWIT1: .BYTE ;LIBRARY SWITCH INDICATORS SWIT2: .BYTE SWIT3: .BYTE SWIT4: .BYTE SWIT5: .BYTE SWIT6: .BYTE SWIT7: .BYTE SWIT8: .BYTE SWIT9: .BYTE SWIT10: .BYTE SWIT11: .BYTE SWIT12: .BYTE PASS: .BLKW ;PASS1 = 0; PASS2 = 1 ENDEPT: .BLKW ;END OF EPT ADDRESS OUTBFH: .BLKW ;INTERNAL PTR TO HEAD OF OUT.BUF. OUTBF1: .BLKW ;INTERNAL PTR TO OUT. BUF.LOCATION MODCNT: .BLKW ;COUNT OF OBJ MOD PROCESSED PA2BLK: .BLKW ;COUNT OF PASS2 BLKS PROCESSED OUTBLK: .BLKW ;CURRENT OUTPUT BLK INSBYT: .BLKW ;NEXT BYTE INSERT REL ADR CCOUNT: .BLKW ;COUNT OF CSECTS IN LIBRARY CUROBJ: .BLKW ;CUR PROC OBJ. MOD HDR ADR TEMP: .BLKW ;TEMPORARY STORAGE AREA LURBLK: .BLKW ;BLKS WRITTEN(ONLY USED IF CORE WAS FILED) CURBLK: .BLKW ;CURRENT INPUT BLK # CURBUF: .BLKW ;CURRENT INPUT BUFFER ADR ALTBUF: .BLKW ;ALTERNATE BUFFER SWITCH CORADR: .BLKW ;ADDRESS OF FREE CORE SVSTAT: .BLKW ;1ST SAVESTATUS BLK ADR CURFIL: .BLKW ;PTR TO 1ST INPUT FILE INFO REPLPT: .BLKW ;REPLACE FILE ASSOCIATION AREA UPDPTR: .BLKW ;UPDATE FILE ASSOC AREA ADR ENDCOR: .BLKW ;MAX FREE CORE ADR DELADR: .BLKW ;USER REQUESTED MOD TO DELETE ADR EPTADR: .BLKW ;USER REQUESTED EPT TO DELETE ADR EPTBLK: .BLKW ;# OF BLKS IN EPT LISFIL: .BLKW ;LIST BUFFER ADR OUTBUF: .BLKW ;PTR TO HEAD OF DATA TO BE WRITTEN BLKDIS: .BLKW ;OBJ MOD BLK DISP INTO LIBR BYTDIS: .BLKW ;OBJ MOD BYTE DISP INTO LIBR BUFSWT: .BYTE ;BUFFER SWITCHED INDICATOR EOF: .BYTE ;EOF = -1 IMPEND: .CSECT MSGBUF .GLOBL ABS,CRLF,DEVFUL,CSETER,INPERR,OUTPER .GLOBL CMDER,DEVER,FILER,ILLDEL,NOCORE,ERLIBR .GLOBL ILLINS,REPL,BADOBJ,RPLLIB,DELMSG,EPTMSG .GLOBL LISHDR,LISBLK,LISHD1,TEMPBF,BUFFR1,ENBUF1 .GLOBL BUFFR2,ENBUF2 .NLIST BEX ABS: .RAD50 /. ABS./ CRLF: .BYTE CR,LF,0 DEVFUL: .ASCIZ /?DEV FULL?/ CSETER: .ASCIZ /?CSECT ERR?/ INPERR: .ASCIZ /?IN ERR?/ OUTPER: .ASCIZ /?OUT ERR?/ CMDER: .ASCIZ /?ILL CMD?/ DEVER: .ASCIZ /?ILL DEV?/ FILER: .ASCIZ /?FIL NOT FND?/ ILLDEL: .ASCIZ /ILL DEL/ NOCORE: .ASCIZ /?NO CORE?/ ERLIBR: .ASCIZ /?BAD LIBR?/ ILLINS: .ASCIZ /ILL INS/ REPL: .ASCIZ /ILL REPL/ BADOBJ: .ASCIZ /?BAD OBJ?/ RPLLIB: .ASCIZ /?LIBR FIL ILL REPL?/ DELMSG: .ASCIZ /MOD NAME: / EPTMSG: .ASCIZ /ENTRY POINT: / LISHDR: .ASCIZ /RT-11 LIBRARIAN V03-03 / LISBLK: .ASCIZ / BLOCKS/ LISHD1: .ASCIZ %MODULE ENTRY/CSECT ENTRY/CSECT ENTRY/CSECT% .LIST BEX ; INPUT BUFFERS .EVEN TEMPBF: .BLKW 30 ;TEMPORARY BUFFER AREA .WORD ENBUF2 .WORD BUFFR2 BUFFR1: .BLKW 256. ;BUFFER # 1 ENBUF1: .WORD ENBUF1 .WORD BUFFR1 BUFFR2: .BLKW 256. ;BUFFER # 2 ENBUF2: .CSECT TABSTO .GLOBL FILCNT,DECTB0,DECTBL,DATTBL,EXPAND,LIMIT ; CONTAINS TABLES AND INITIALLIZED STORAGE AREAS LIMIT: .LIMIT FILCNT: .WORD 3 ;COUNT OF FILES PROCESSED DECTB0: .WORD 10000. ;CAN GIVE THE EXTRA DIGIT .WORD 1000. .WORD 100. DECTBL: .WORD 10. ;PRINT 2 DIGITS .WORD 1. .WORD 0 ;ZERO IS END INDICATOR .NLIST BEX DATTBL: .ASCIZ /JAN/ .ASCIZ /FEB/ .ASCIZ /MAR/ .ASCIZ /APR/ .ASCIZ /MAY/ .ASCIZ /JUN/ .ASCIZ /JUL/ .ASCIZ /AUG/ .ASCIZ /SEP/ .ASCIZ /OCT/ .ASCIZ /NOV/ .ASCIZ /DEC/ .LIST BEX .WORD -1 ;TERMINAL .WORD 0 ;END OF WORD SIGNAL .WORD 50 ;DIVISOR .WORD 3100 ;DIVISOR .WORD 0 ;END OF WORD SIGNAL .WORD 50 ;DIVISOR EXPAND: .WORD 3100 ;DIVISOR .PAGE .SBTTL REENTER & START LIBRARIAN ROUTINE .CSECT LIBR0 .GLOBL REENTR,DELETE,DELEPT,CREATE,LIST,INITIO .GLOBL FILBUF,FIL1BF,WRITBF,WRITWT,GETMD1,ENDMD3 .GLOBL EPTSER,EPTSR1,PRLIST,SKPBLK,NEWBLK,BYTE .GLOBL OERROR,FULDEV,ERCORE,BADMOD,START1,RPACK .GLOBL DELENT,PRINT,ERROR ; THIS ROUTINE ALLOWS THE USER TO REENTER THE LIBRARIAN ; AFTER A CONTROL C ABORT. REENTR: MOV #3,FILCNT ;INITIALIZE FILE COUNT .RCTRLO ;OVERRIDE CNTRL O MOV #CRLF,R0 ;INDICATE TO UPSPACE CTY JSR PC,PRINT CLR R0 .WAIT 0 .WAIT 1 .WAIT 3 .SRESET ;RESET SYSTEM AREAS BR START BR REENTR START: JMP START1 .SBTTL DELETE MODULE,ENTRY POINT ROUTINE ; THIS ROUTINE BUILDS LISTSOF THE SPECIFIED ENTRY POINTS ;, AND MODULES TO BE DELETED FROM THE USER 'S LIBRARY FILE. ; THE DELETE LIST FORMAT IS: ; ; WHERE THERE ARE TWO WORDS OF .RAD50 SYMBOL FOLLOWED BY ; A FLAG WORD .ENABL LSB DELETE: MOV CORADR,R4 ;IND DELETE INPUT ADR MOV R4,DELADR MOV R4,R1 ;SAVE INPUT ADR MOV #DELMSG,R0 ;REQUEST USER TO DELETE MOD NAMES JSR PC,PRINT BR 1$ DELEPT: MOV CORADR,R4 ;IND EPT INPUT ADR MOV R4,EPTADR MOV R4,R1 MOV #EPTMSG,R0 ;REQUEST USER TO DEL ENT POINTS JSR PC,PRINT 1$: MOV #6,R5 ;IND MAX # CHARS PUSH R1 JSR PC,RPACK ;GET USER INPUT POP R1 CLR (R4)+ ;INITIALIZE FLAG FOR SYMBOL TST @R1 ;END OF TTY INPUT ? BNE 2$ CLR (R4)+ CLR (R4)+ MOV R4,CORADR ;OPDATE FREE CORE PTR BR DLEXT2 2$: MOV R4,R1 BR 1$ DLEXT2: RTS PC .DSABL LSB ; THIS ROUTINE INDICATES IF THE SYMBOL POINTED TO BY ; R1, MATCHES THE LIST POINTED TO BY R4: ; C = 0 ; NO MATCH ; C = 1 ; MATCH ; FLAG WORD = (-) ; SYMBOL ALREADY DELETED DELENT: PUSH R0 PUSH R2 PUSH R3 PUSH R1 MOV R4,R3 ;SAVE START OF DELETE LIST 6$: MOV #4,R0 7$: MOV R4,R2 8$: CMPB (R1)+,(R4)+ ;SYMBOL MATCH ? BNE 10$ DEC R0 BNE 8$ TST (R4)+ ;SYMBOL ALREADY DELETED ? BPL 9$ ;NO MOV @SP,R1 ;RESET TO START OF SYMBOL BR 6$ 9$: DEC -(R4) ;IND SYMBOL DELETED SEC ;IND A SYMBOL MATCH BR DLEXT 10$: MOV @SP,R1 ;RESET TO START OF SYMBOL MOV #4,R0 MOV R2,R4 ADD R0,R4 ;INDEX TO NEXT SYMBOL TST (R4)+ TST @R4 ;END OF DELETE LIST ? BNE 7$ DLEXT: MOV R3,R4 ; RESET TO START ; /OF DELETE LIST POP R1 POP R3 POP R2 POP R0 RTS PC .SBTTL RPACK SUBROUTINE ; N CHAR ARE ACCEPTED FROM THE TTY, AND CONVERTED TO RAD 50 ; INTERFACE: ; R5 = #CHARS TO ACCEPT ; R4 = PTR TO WHERE RESULT IS TO BE PLACED RPACK: PUSH R3 11$: MOV #3,R3 CLR R1 ;CLEAR RAD50 WORD 5$: .TTYIN ;GET NEXT CHAR CMPB R0,#CR ;END OF LINE ? BEQ 9$ CMPB R0,#40 ;BLANK ? BEQ 2$ CMPB R0,#'$ BEQ 4$ CMPB R0,#'A BLO 3$ SUB #40,R0 2$: SUB #16,R0 3$: SUB #11,R0 4$: SUB #11,R0 7$: MOV R1,-(SP) ASL R1 ASL R1 ADD (SP)+,R1 ;5 * R1 ASL R1 ASL R1 ASL R1 ;50 * R1 ADD R0,R1 ;INCLUDE CURRENT CHAR DEC R3 BLE 6$ DEC R5 ;DONE REQUIRED CHARS BGT 5$ 10$: CLR R0 ;YES FINISH CURRENT WORD ONLY BR 7$ 6$: MOV R1,(R4)+ ;STORE A COMPLTED RAD 50 WORD DEC R5 ;DONE ? BGT 11$ 8$: .TTYIN ;SEARCH FOR LINE TERM CMPB R0,#LF BNE 8$ POP R3 RTS PC 9$: CLR R5 BR 10$ .SBTTL I/O ROUTINES ; DEPENDING UPON THE ENTRY POINT CALLED, THIS ROUTINE ; INITIALIZES I/O, FILLS THE INPUT BUFFERS, WRITES THE ; OUTPUT BUFFERS, SWAPS THE BUFFERS, OPENS AN EXISTING FILE ; FOR I/O ON CHANNEL 0. ; ENTRY POINTS: ; INITIO - INTIALIZES I/O AND FILLS INPUT BUFFERS ; FILBUF - FILLS INPUT BUFFERS 1 AND 2 ; FIL1BF - FILLS THE OPPOSITE BUFFER ; WRITBF - WRITES ONE BUFFER,ON CHAN 0. ; PRINT - WRITES THE PRINT LINE POINTED TO BY R0 ; AND RETURNS ; ERROR - WRITES THE PRINT LINE POINTED TO BY R0 ; AND THEN RESTARTS THE LIBRARIAN ; RETURN INTERFACE: ; R1 - CURRENT BUFFER ADDRESS ; R2 - END OF CURRENT BUFFER ADDRESS ; R0 - RETURN CODE INITIO: MOV CURFIL,R0 ;IND INPUT FILE TO READ TST @R0 ;INPUT FILE ? BEQ EXITIO .REOPEN 3 ;ASSOCIATE CHAN 3 WITH INPUT FILE BCS OERROR CLR CURBLK ;IND READ LOGICAL BLK # 0 MOV #BUFFR1,CURBUF ;IND INPUT BUFFER IS # 1 FILBUF: MOV CURBUF,R0 MOV #1,-(SP) ;IND READ MACRO MOV #BLK,-(SP) ;IND SIZE OF READ MOV R0,-(SP) ;IND BUFFER ADR FOR READ MOV -(R0),R1 ;GET ADR OF OTHER BUFFER MOV -(R0),R2 ;GET END ADR OF OTHER BUFFER MOV CURBLK,R0 ;IND LOGICAL BLK# TO READ INC CURBLK ;IND NEXT LOGICAL BLK # TO READ .WAIT 3 ;WAIT FOR OUTSTANDING I/O BCS ERBUF2 EMT 203 ;READ ON CHANNEL # 3 BCS ERBUF MOV R1,CURBUF ;IND CURRENT BUFFER ADR FIL1BF: TST ALTBUF ;ALTERNATE BUFFER FILLED ? BMI EXITIO DEC ALTBUF ;SET ALTERNATE BUFFER SWITCH BR FILBUF WRITBF: PUSH R0 ;SAVE R0 MOV OUTBLK,R0 ;IND BLK # TO WRITE .WAIT 0 ;WAIT FOR OUTSTANDING I/O BCS ERWRIT .WRITE 0,R4,R5 ;WRITE BUFFER BCS ERWRIT POP R0 ;RESTORE R0 RTS PC WRITWT: MOV OUTBLK,R0 ;IND BLK # TO WRITE .WRITW 1,R3,R1 ;WRITE AND WAIT ON CHAN 1 BCS ERWRIT RTS PC ; AN ERROR HAS BEEN DETECTED DURING I/O. IF ERROR RECOVERY ; IS POSSIBLE,PROCESSING IS CONTINUED. OTHERWISE, THE CENTRAL ; ERROR ROUTINE IS CALLED WITH A FATAL ERROR CODE. ERBUF: TSTB @#ERRBYT ;RECOVERABLE ERROR ? BNE OERROR ; AN END OF FILE HAS OCCURRED. RETURN TO THE CALLER WITH ; THE LATEST BUFFER AND AN EOF ERBUF1: MOV R1,CURBUF ;IND BUFFER PUSH R1 MOV #EOF,R1 DECB @R1 CMPB @R1,#376 ;FINAL EOF INDICATED ? BNE EXEOF TST (SP)+ TST PASS ;DETERMINE PASS BNE EXPAS2 JMP GETMD1 ;PASS1 TERMINATION EXPAS2: JMP ENDMD3 ;PASS2 TERMINATION EXEOF: POP R1 EXITIO: CLR ALTBUF RTS PC ;RETURN TO CALLER ERBUF2: ADD #6,SP ;CLEAN UP STACK AFTER WAIT ERROR BR ERBUF1 ERWRIT: MOV #OUTPER,R0 BR ERROR FULDEV: MOV #DEVFUL,R0 BR ERROR OERROR: MOV #INPERR,R0 BR ERROR BADMOD: MOV #BADOBJ,R0 ERROR: .PRINT ;PRINT FATAL ERROR MSG JMP REENTR ;RESTART LIBRARIAN PRINT: .PRINT ;WRITE TO CTY RTS PC .PAGE ; SEARCH THE ENTRY POINT TABLE FOR A MATCH OF THE ; INDICATED SYMBOL. ; INTERFACE: ; R1 - POINTS TO SYMBOL TO BE SEARCHED FOR ; RETURN INTERFACE: ; C BIT = 0 - SYMBOL FOUND ; C BIT = 1 - SYMBOL NOT FOUND ; R3 - POINTS TO END OF EPT IF SYMBOL NOT FOUND. ; OTHERWISE, IT POINTS TO THE FOUND SYMBOL. EPTSER: MOV CORADR,R3 ;PT TO 1ST EPT ENTRY ADD #LBREPT,R3 EPTSR1: PUSH R2 PUSH R4 PUSH R1 MOV #4,R2 ;SET UP COMPARE LOOP MOV R3,R4 ;SAVE SYMBOL ADR 1$: CMPB (R1)+,(R3)+ ;SYMBOL MATCH ? BNE 4$ DEC R2 BNE 1$ MOV R4,R3 ;POINT TO SYMBOL CLC ;IND SYMBOL FOUND BR SEREXT 4$: MOV @SP,R1 ;RESET TO START OF SYMBOL MOV R4,R3 ADD #PTR*2,R3 ;POINT TO NEXT EPT MOV R3,R4 MOV #4,R2 TST @R3 ;END OF EPT ? BNE 1$ SEC ;IND SYMBOL NOT FOUND SEREXT: POP R1 POP R4 POP R2 RTS PC .SBTTL FORMATTED BINARY BLOCK INPUT ROUTINE ; INTERFACE: ; R1 - POINTS TO CURENT BUFFER POSITION ; R2 - POINTS TO END OF BUFFER ; R4 - DESTROYED ; CURBUF - POINTS TO BEGINNING OF CURRENT BUFFER ; CURBLK - RELATIVE BLK # OF BLK BEING READ ; RETURN INTERFACE: ; R1 - POINTS TO 1ST DATA WORD OF NEW BLK ; R0 - TYPE CODE OF BLOCK ; R5 - NUMBER OF DATA BYTES IN THE BLOCK NEWBLK: CMP R1,R2 ;END OF BUFFER ? BLO 1$ JSR PC,FIL1BF 1$: TSTB (R1)+ BEQ NEWBLK ;SKIP NULL BYTES CMPB #FBHDR,-(R1) ;FORMATTED BINARY BLK ? BNE MODERR ;MODE ERROR, NOT FB BLK MOV #2,R0 MOV #TEMP,R4 JSR PC,GETBYT ;SKIP 2 BYTES AND PUT 3RD IN TEMP JSR PC,GT1BYT ;NEXT BYTE IN TEMP + 1 MOV -(R4),R5 ;PICK UP ASSEMBLED BLK LENGTH SUB #6,R5 ;CALC CORRECT LENGTH JSR PC,GT1BYT ;GET TYPE BYTE JSR PC,BYTE ;SKIP NULL BYTE MOVB -(R4),R0 RTS PC MODERR: INC R1 ;SKIP CHAR CAUSING MODE ERROR BR NEWBLK ; ROUTINE TO GET NEXT INPUT BYTE INTO R0 BYTE: CMP R1,R2 ;END OF BUFFER ? BLO 1$ JSR PC,FIL1BF 1$: MOVB (R1)+,R0 RTS PC ; ROUTINE TO SKIP NUMBER OF BYTES SPECIFIED BY R0 ; AND THEN PLACE THE NEXT BYTE IN R0 AND AT (R4)+ GT1BYT: CLR R0 ;ENTRY TO MAKE R0=0 GETBYT: MOV R0,-(SP) 1$: CMP R1,R2 BLO 2$ JSR PC,FIL1BF 2$: MOVB (R1)+,R0 DEC @SP BPL 1$ MOVB R0,(R4)+ TST (SP)+ RTS PC ; ROUTINE TO SKIP FB BLKS ON INPUT ; INTERFACE: ; R0 - DESTROYED ; R1 - POINTER TO BLOCK TO BE SKIPPED ; R2 - END OF INPUT BUFFER ; R5 - LENGTH OF BLOCK TO BE SKIPPED SKPBLK: INC R5 ;INCLUDE CHECKSUM BYTE IN LENGTH 1$: ADD R5,R1 ;GET END OF FB BLK CMP R1,R2 ;OUTSIDE OF BUFFER BOUNDARY ? BLO 2$ ;NO MOV R1,R5 ;CALC # OF BYTES TO BE SKIPPED SUB R2,R5 ;IN NEXT BUFFER JSR PC,FIL1BF ;GET NEXT BUFFER BR 1$ 2$: RTS PC PRLIST: MOVB (R3)+,(R1)+ ;MOVE MSG TO BUFFER TSTB @R3 ;END OF MSG ? BNE PRLIST RTS PC .END START .TITLE RTLIB1 V03-03 OVERLAY ONE ; RT-11 LIBRARIAN ; ; DEC-11-ORLBA-E ; ; J.E.G. ; ; COPYRIGHT (C) 1975 ; ; DIGITAL EQUIPMENT CORPORATION ; MAYNARD, MASSACHUSETTS 03754 ; ; 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 DIGITAL. ; ; 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. ; .SBTTL LIBRARIAN MACRO DEFINITIONS .MACRO PUSH,PUSH1 MOV PUSH1,-(SP) .ENDM .MACRO POP,POP1 MOV (SP)+,POP1 .ENDM .SBTTL SYMBOLIC DEFINITIONS R0= %0 R1= %1 R2= %2 R3= %3 R4= %4 R5= %5 SP= %6 PC= %7 ; FORM CONTROL CHARACTERS SPAC= 40 TAB= 11 LF= 12 FF= 14 CR= 15 ; COMMONLY USED CONSTANTS FOURK= 20000 ;MAX SIZE OF FORLIB DIRECTORY BYTBLK= 512. ;BYTE BLOCK SIZE BLK= 256. ;WORD BLOCK SIZE (I/O) PTR1= 2 PTR= 4 HICORE= 50 ;HIGHEST LIBRARIAN FREE CORE ADR RMON= 54 ;START OF RESIDENT MONITOR ADR USRLD= 266 ;START OF USR AREA ERRBYT= 52 ; MONITOR ERROR CODE ADDRESS LKEMT= EMT+20 ;LOOKUP EMT CODE SSEMT= EMT+120 ;SAVESTATUS EMT WEMT= EMT+240 ;WAIT EMT JSW= 44 ;JOB STATUS WORD ADDRESS RESTRT= 020000 ;JSW REENTER BIT ; OFFSETS INTO LIBRARY FILE EPT1= 20 ;EPT STARTING RELATIVE ADDRESS EPTALO= 30 ;EPT ENTRIES ALLOCATED (BYTES) NXTINS= 34 ;NEXT INSERT REL BLK # NXTBYT= 36 ;NEXT INSERT REL BYTE # EPT3= 24 ;EPT ENTRIES AVAILABLE LHEND= 32 ;REL END OF LIBR HEADER LBREPT= 42 ;1ST EPT ENTRY OF LIBRARY ; LIBRARY FILE IDENTIFICATION CODES ENTPNT= 002150 ;ENTRY PNT FLAG BYTE CODE FBHDR= 1 ;FORMATTED BINARY BLK HEADER FBLNTH= 56 ;FB MAXIMUM LENGTH LBRVER= 304 ;CURRENT LIBRARY VERSION # GSD= 1 ;GLOBAL SYMBOL DIRECTORY CODE GSDEND= 2 ;GSD TERMINATION CODE MODEND= 6 ;MODULE TERMINATION CODE LBR= 7 ;LIBRARY FILE IDENTIFIER LBRFIN= 10 ;LIBRARY FILE TERMINATION CODE .MCALL ..V1.. ..V1.. .MCALL .CLOSE,.CSISPC,.CSIGEN,.DATE,.DELETE,.ENTER .MCALL .FETCH,.LOOKUP,.PRINT,.QSET .MCALL .RCTRLO,.READ,.READW,.REOPEN,.SETTOP,.SRESET,.TTYIN .MCALL .WAIT,.WRITE,.WRITW ; .MCALL ...CM1,...CM2,...CM3,...CM4 .SBTTL OVERLAY ONE TABLES .CSECT TABLE GSDTBL: .WORD MODNAM ;MODULE NAME .WORD SECNAM ;CSECT NAME .WORD IGNORE ;INTERNAL SYMBOL DESCRIPTOR .WORD IGNORE ;TRANSFER ADDRESS .WORD ENTSYM ;ENTRY POINT .WORD IGNORE .WORD IGNORE ;PROGRAM ID GSDTBE: .SBTTL CREATE LIBRARY ROUTINE - PASS 1 .CSECT LIBR1 .GLOBL LISFIL,CORADR,OERROR,ENDCOR,ERCORE,INITIO .GLOBL LIBFIL,FULDEV,OUTBUF,NEWBLK,SKPBLK .GLOBL TEMP,LIBINP,FIL1BF,BADMOD .GLOBL SWIT5,EPTSER,UPDPTR,ABS,CCOUNT,SWIT1 .GLOBL EPTADR,BYTE,SWIT7,SWIT3,REPLPT .GLOBL FILCNT,CUROBJ,CURFIL,EOF,ALTBUF .GLOBL MODCNT,ILLDEL,ILLINS,PRLIST,INPERR,CSETER .GLOBL RPLLIB,ERLIBR,REENTR,DELADR,BUFSWT .GLOBL TEMPBF,OUTBF1,OUTBFH,PA2BLK,SWIT11 .GLOBL WRITBF,OUTBLK,LURBLK,DELMSG,EPTMSG .GLOBL EXPAND,DATTBL,DECTBL,SWIT9,FILBUF,CURBLK .GLOBL REPL,EPTBLK,PA2ST,STACK .GLOBL SWIT2,SWIT4,SWIT6,SWIT8,SWIT10,SWIT12 .GLOBL CREATE,GETMD1,DELETE,DELEPT,DELENT .GLOBL NULLIB,LIST,ERROR,PRINT,ENDEPT,EPTSR1 ; THIS ROUTINE CREATES THE USER REQUESTED LIBRARY ; NOTE - LIBFIL CONTAINS THE LIBRARY NAME, AND ; LIBINP CONTAINS THE MODULES THAT WILL COMPOSE THE ; NEW LIBRARY FILE. ; INTERFACE: ; R0 - DESTROYED ; R1 - POINTS TO CURRENT INPUT FILE BUFFER POSITION ; R2 - POINTS TO END OF CURRENT INPUT FILE BUFFER ; R3 - DESTROYED (USED AS OUTPUT BUFFER POINTER) ; R4 & R5 - DESTROYED CREATE: TST LIBFIL ;CREATE LIBR FILE ? BNE 4$ MOV CORADR,R3 ;GET THE BUFER ADR MOV CURFIL,R0 ;PT TO FILE BLK .REOPEN 3 ;OPEN THE LIBRARY FILE BCC 10$ 15$: JMP OERROR 10$: CLR R0 ;IND TO READ BLK #0 .READW 3,R3,#BLK ;READ LIBRARY DIRECTORY BCS 15$ MOV EPTALO(R3),R1 ;GET EPT ENTRIES ALLOCATED CLR R0 MOV #BYTBLK,R4 1$: ADD R4,R3 ;CALC. NXT INPUT BUFFER ADR CMP R3,ENDCOR ;OUT OF CORE ? BLO 2$ JMP ERCORE 2$: CMP R4,R1 ;EPT 1 BLK OR LESS ? BHI 3$ SUB R4,R1 BEQ 3$ INC R0 ;IND TO READ NXT BLK MOV R0,R5 .READW 3,R3,#BLK BCS 15$ MOV R5,R0 BR 1$ 3$: TST (R3)+ MOV R3,LISFIL ;IND LIST BUFFER ADR .CLOSE 3 CLR @R3 ;MARK END OF EPT JMP LIST 4$: JSR PC,INITIO ;READ 1S INPUT FILE .ENTER 0,#LIBFIL,LIBFIL+8. ;CREATE LIBR FILE BCC 20$ JMP FULDEV ; CREATE THE LIBRARY HEADER BLOCK IN THE OUTPUT FILE 20$: MOV CORADR,R3 ;GET OUTPUT BUFFER ADR CLRB SWIT4 MOV R3,R4 8$: CLR (R3)+ ; ###RDS### CLEAR EPT BASE SIZE CMP R3, ENDCOR ; ###RDS### AT END OF CORE ? BLO 8$ ; ###RDS### NO - CLEAR SOME MORE. MOV R4, R3 ; ###RDS### YES - RESTORE VALUE OF CORADR. ADD #BYTBLK,R4 ; IND 1ST BLK BOUNDARY MOV R4,OUTBUF MOV #FBHDR,(R3)+ ;IND LIBRARY HEADER IS FB MOV #FBLNTH,(R3)+ ;IND LENGTH OF FB MOV #LBR,(R3)+ ;IND FILE IS A LIBRARY MOV #LBRVER,(R3)+ ;IND LIBRARY VERSION # TST (R3)+ ;IDENTIFICATION FORMAT .DATE ;GET TODAY'S DATE MOV R0,(R3)+ CLR (R3)+ CLR (R3)+ CLR (R3)+ CLR (R3)+ CLR (R3)+ MOV #12,(R3)+ ;EPT REL START ADR CLR (R3)+ CLR (R3)+ CLR (R3)+ CLR (R3)+ CLR (R3)+ .PAGE ; CREATE THE LIBRARIAN ENTRY POINT TABLE ; THE GSD (GLOBAL SYMBOL DIRECTORY) OF EACH INPUT MODULE IS ; SCANNED. THE MODULE NAME, THE CSECT NAMES, AND THE ENTRY ; POINTS ARE PLACED IN THE EPT ALONG WITH THEIR RELATIVE ; ADDRESSES. (RELATIVE BLK # AND RELATIVE BYTE WITHIN THE BLK) ; HOWEVER IF THE MODULE OR ENTRY POINT IS TO BE REPLACED ; OR DELETED, THE ASSOCIATED ACTION IS PERFORMED. EPTST: JSR PC,NEWBLK ;GET FB BLK CMP R3,OUTBUF ;END OF BLK ? BLO 1$ ADD #BYTBLK,OUTBUF ;IND NEXT BLK BOUNDARY INC OUTBLK ;INCREMENT BLK COUNT 1$: CMP R0,#GSD ;GLOBAL SYMBOL DIRECTORY ? BEQ BLDEPT CMP R0,#LBR ;LIBRARY FILE MERGE ? BEQ MERG1 CMP R0,#LBRFIN ;END OF LIBRARY FILE ? BEQ MERG2 CMP R0,#MODEND ;END OF OBJ MOD ? BNE 4$ JMP GETMOD 4$: JSR PC,SKPBLK ;SKIP OVER FB BLK BR EPTST ; THE USER HAS INDICATED TO MERGE A LIBRARY FILE MERG1: DECB SWIT6 ;IND PROCESSING LIBR FILE ADD #EPTALO-6,R1 MOV @R1,R1 ;GET EPT ENTRIES ALLOC. PUSH R3 MOV #BYTBLK,R3 CLR R5 1$: CMP R3,R1 ;EPT 1 BLK OR LESS BHI 2$ SUB R3,R1 BEQ 2$ INC R5 ;IND BLK TO READ BR 1$ 2$: TST R5 ;CORRECT BLK COUNT ? BEQ 4$ INC R5 ;IND CORRECT BLK COUNT MOV R5,CURBLK JSR PC,FILBUF ;FILL BOTH BUFFERS BR 8$ 4$: JSR PC,FIL1BF ;READ MODULES IN LIBR 8$: POP R3 BR EPTST MERG2: CLRB SWIT6 ;RESET LIBR INDICATOR JMP GETMD1 ; BUILD LIBRARIAN ENTRY POINT TABLE BLDEP0: MOV TEMP,R1 ;RESTORE INPUT BUFFER ADR BLDEPT: PUSH R3 ;SAVE EPT END ADR MOV #8.,R4 SUB R4,R5 ;DECREMENT GSD SYMBOL LENGTH MOV #LIBINP,R3 PUSH R3 ;SAVE SYMBOL ADR 1$: CMP R1,R2 ;END OF INPUT BUFFER ? BLO 2$ PUSH R0 JSR PC,FIL1BF ;SWITCH BUFFERS POP R0 2$: MOVB (R1)+,(R3)+ ;MOVE GSD TO TEMP AREA DEC R4 BGT 1$ MOV R1,TEMP ;SAVE INPUT BUFFER ADR MOVB LIBINP+5,R3 ;GET GSD INDICATOR FLAGS ASL R3 ;SET UP INDICATOR FOR TABLE CMP R3,#GSDTBE-GSDTBL ;LEGAL GSD CODE ? BLOS 6$ JMP BADMOD ;BA OBJ MODULE 6$: POP R1 ;GET SYMBOL ADR POP R4 ;RESTORE EN OF EPT ADR MOV GSDTBL(R3),PC ;CALL APPROPRIATE SUBROUTINE ; BUILD EPT - PROCESS MODULE NAME MODNAM: MOV R4,R3 DECB SWIT10 ;IND ENTRY IS A MOD NAME MOV #SWIT5,R4 TSTB @R4 ;UPDATE SPECIFIED ? BPL REP00 PUSH R3 ;SAE EPT END ADR JSR PC,EPTSER ;SEARCH EPT TABLE POP R3 ;RESTORE EPT END ADR BCC 1$ ;YES - MODULE FOUND ? JMP CHKRP1 1$: MOV UPDPTR,R4 ;GET UPDATE LIST ADR BR REP000 ; BUILD EPT - PROCESS CSECT NAME SECNAM: TST 6(R1) ;ZERO LENGTH CSECT ? BEQ NXTSYM ;YES - IGNORE ENTRY CMP ABS,(R1)+ ;IS SYMBOL ASECT ? BNE 1$ ;NO CMP ABS+2,(R1)+ BEQ NXTSYM TST -(R1) 1$: INC CCOUNT ;INC COUNT OF CSECTS TST -(R1) ;IS CSECT BLANK ? BEQ NXTSYM DECB SWIT8 ;IND TO DELETE CSECT IF REQUIRED BR ENTSY1 ;CHECK FOR CSECT DELETE ; BUILD EPT - PROCESS ENTRY POINT SYMBOL ENTSYM: CMP 4(R1),#ENTPNT ;ENTRY PT WITH ZERO LEN BEQ ENTSY1 TST 6(R1) ;ZERO LENGTH ENTRY POINT ? BEQ NXTSYM ;YES ENTSY1: MOV EPTADR,R4 ;PT TO EPT DELETE LIST BEQ 7$ JSR PC,DELENT ;CHECK DELETE FUNCTION MOV R4,EPTADR ;UPDATE DELETE LIST BCC 7$ ;NO DELETE BR NXTSYM 7$: JSR PC,EPTSER ;SEARCH FOR ENTRY POINT BCS MOVMOD ;NO - PLACE SYMBOL IN EPT ? MOV ENDEPT,R4 ;GET END OF EPT ADR 8$: CMP (R3)+,(R3)+ ;PT TO MOD IND FIELD TST (R3) ;MODULE NAME ? BPL 10$ ;NO - IND ILL INS CMP (R3)+,(R3)+ ;PT TO NEXT ENTRY IN EPT JSR PC,EPTSR1 ;SEARCH FOR DUP ENT PT BCC 8$ ;YES - DUPL. ENT PT/MOD NAME ? MOV R4,R3 ;IND ENTRY ADR IN EPT BR MOVMOD 10$: PUSH R4 ;SAVE EPT END ADR MOV R1,R3 ;IND ERROR MSG BUFFER ADR MOV #ILLINS,R4 ;IND ILLEGAL INSERT MSG ERRMSG: JSR PC,ILLREP ;DECODE SYMBOL & PRINT MSG POP R3 ;RESTORE EPT END ADR ; BR NXTSYM ;IGNORE BAD ENTRY & GET NEXT ONE ; CHECK FORMATTED BINARY BLOCK CONDITION IGNORE: NXTSYM: CLRB SWIT8 ;TURN OFF CSECT DELETE SWITCH TST R5 ;IN FB BLK ? BLE 1$ ;NO BR BLDEP0 1$: MOV TEMP,R1 ;RESTORE INPUT BUFFER AD JSR PC,BYTE ;GET CHECKSUM BYTE JMP EPTST ; PLACE SYMBOL NAME IN LIBRARY EPT MOVMOD: PUSH ENDCOR ;##RDS## SAVE END OF CORE LIMIT. SUB #10, (SP) ; ###RDS### ADJUST FOR NEXT ENTRY. CMP R3, (SP)+ ;OUT OF CORE? BLO RDS002 ;NO- CONTINUE JMP ERCORE ;YES-REPORT LACK OF CORE. ;##RDS## END RDS002: MOV (R1)+,(R3)+ ;PLACE SYMBOL IN MOV (R1)+,(R3)+ ;THE LIBRARY EPT CLR (R3)+ ;BLK # OF MODULE TSTB SWIT10 ;MODULE NAME ? BPL 1$ BIS #100000,-(R3) ;IND MOD NAME IN EPT CLRB SWIT10 ;RESET MODULE INDICATOR TST (R3)+ 1$: TSTB SWIT7 ;REPLACE MODULE ? BPL 2$ COM (R3)+ ;IND MODULE REPLACE CLRB SWIT7 ;TURN OFF REPLACE SWITCH BR 3$ 2$: CLR (R3)+ ;IND NO REPLACE 3$: CLR @R3 ;MARK END OF EPT MOV R3,ENDEPT ;IND END OF EPT ADR BR NXTSYM ;PROCESS NEXT SYMBOL ; CHECK SWITCH OPTIONS REP00A: DECB (R4)+ ;IND SEARCHING REPLACE LIST ; /AFTER AN UPDATE REP00: TSTB -(R4) ;REPLACE SPECIFIED ? TSTB -(R4) BPL CHKDEL ;NO - CHECK DELETE FUNCTION MOV REPLPT,R4 ;GET RPLACE LIST REP000: TST @R4 ;FILE ALREADY REPLACED ? BPL REP001 TST (R4)+ ;SKIP REPL INDICATOR REP001: BEQ CHKRPL INC R4 ;ALIGN TO UPPER BYTE CMPB (R4)+,FILCNT ;REPLACE THIS FILE ? BNE REP000 TSTB SWIT6 ;LIBRARY FILE ? BPL 8$ JMP LIBER 8$: PUSH R3 ;SAVE END OF EPT ADR JSR PC,EPTSER ;SEARCH EPT TABLE MOV R3,R4 ;SAVE FOUND MOD ENTRY ADR BCC REP ;YES - MODULE FOUND ? MOV R1,R3 ;IND ERROR MSG BUFFER ADR MOV #REPL,R4 ;IND ILLEGAL REPLACE MSG JSR PC,ILLREP ;DECODE SYMBOL & PRINT MSG POP R3 ;RESTORE END OF EPT ADR BR GETMD4 ;SKIP MODULE CAUSING ILL REPL REP: ADD #8.,R3 ;INDEX TO NEXT ENTRY CMP R3,@SP ;END OF EPT ? BEQ REP3 TST 4(R3) ;MODULE NAME ? BPL REP REP1: MOV @R3,(R4)+ ;OVERLAY REPLACED ENTRY ? CLR (R3)+ ;CLEAR MOVER ENTRY CMP R3,@SP ;END OF EPT ? BNE REP1 REP01: TST -(R3) ;END OF EPT ? BEQ REP01 TST (R3)+ TST (SP)+ ;POP THE STACK REP2: CLR @R4 ;MARK END OF EPT MOV R4,R3 ;IND NEW END ADR DECB SWIT7 ;IND REPLACE BR CHKD1 REP3: POP R3 MOV R4,R3 ;IND NEW EPT END BR REP2 CHKRPL: MOV #SWIT5,R4 TSTB @R4 ;UPDATE SPECIFIED ? BPL CHKDEL ;NO - REPLACE LIST ALREADY SCANNED CHKRP1: TSTB -(R4) ;REPLACE/UPDATE LOOKED AT ? BPL REP00A ;NO CLRB @R4 ;RESET REPLACE/UPDATE SWITCH CHKDEL: MOV DELADR,R4 ;PT TO MOD. DELETE LIST BEQ CHKD1 JSR PC,DELENT ;CALL DELETE FUNCTION MOV R4,DELADR ;UPDATE DELETE LIST BCS GETMD4 CHKD1: MOV R3,CUROBJ ;IND OBJ. MOD. NAME ADR IN EPT BR MOVMOD ; THE END OF AN OBJECT MODULE HAS BEEN REACHED. ; THE NEXT OBJECT MODULE IS ACCESSED, AND PROCESSING ; RECYCLES BACK THROUGH THE EPTBLD LOOP. GETMOD: CLR @R3 ;MARK CURRENT END OF EPT MOV CUROBJ,R3 ;GET OBJ MOD EPT ADR 1$: ADD #PTR+3,R3 ;PT TO CSECT ENTRY MOVB CCOUNT,R0 ;GET THE CSECT COUNT ASLB R0 ;TOO MANY CSECTS BCS SECTER BISB R0,(R3)+ ;IND # CSECTS IN OBJ MOD TST @R3 ;END OF OBJ MOD ? BNE 1$ CLR CCOUNT ;CLEAR CSECT COUNT MOV #EOF,R0 TSTB @R0 ;AT END OF FILE BPL GETMD3 TSTB SWIT6 ;LIBRARY FILE ? BMI GETMD3 CMPB @R0,#376 ;EOF BUFFER PROCESSED ? BNE GETMD3 GETMD1: .CLOSE 3 ;CLOSE PREVIOUS FILE BCS IERR MOV #STACK,SP ;RESET STACK CLRB EOF ;RESET EOF CLR ALTBUF CLRB SWIT12 MOV CURFIL,R0 ;GET NEXT FILE SUB #16.,R0 ;SAVESTATUS ADR TST @R0 ;ALL FILES PROCESSED ? BEQ EXITCR MOV R0,CURFIL ;IND NEXT FILE ADR JSR PC,INITIO ;INIT I/O FOR NEW FILE INC FILCNT ;INCREMENT FILE COUNT GETMD2: INC MODCNT ;INC CNT OF OBJ MOD JMP EPTST GETMD3: JSR PC,SKPBLK ;SKIP OVER END OBJ FB BR GETMD2 GETMD4: MOV TEMP,R1 ;GET INPUT BUFFER ADR 1$: JSR PC,SKPBLK ;SKIP OVER FB BLK JSR PC,NEWBLK ;GET NXT FB BLK CMP R0,#MODEND ;END OF MODULE ? BNE 1$ ;NO JSR PC,SKPBLK ;SKIP LAST FB JMP EPTST ; ERROR ROUTINES - PASS1 ILLREP: MOV R3,R1 ;IND ASCII CHAR AREA ADD #PTR,R1 PUSH R2 ;SAVE END OF INPUT BUFFER ADR PUSH R1 JSR PC,DECODE ;DECODE MOD NAME MOVB #TAB,(R1)+ MOV R4,R3 ;IND MESSAGE ADR 2$: JSR PC,PRLIST CLRB @R1 ;MARK END OF MSG POP R0 ;POINT TO ERROR MESSAGE .PRINT ;SEND MSG TO CTY POP R2 ;RESTORE END OFINPUT BUFFER ADR RTS PC CALLER: JMP ERROR ;INFORM USER OF ERROR IERR: JMP OERROR ;IND INPUT ERR SECTER: MOV #CSETER,R0 BR CALLER LIBER: MOV #RPLLIB,R0 BR CALLER NULLIB: MOV #ERLIBR,R0 BR CALLER ; END ERROR ROUTINES - PASS 1 EXITCR: CLR (R3)+ ;MARK END OF EPT MOV DELADR,R1 ;ALL DELETES PROCESSED BEQ 8$ JSR PC,CHKDL1 ;CHEK DELETE LIST (MOD NAME) 3$: MOV R3,LISFIL ;IND BUFFER ADR FOR LIST CMP R3, OUTBUF ; ###RDS### INTO OUTPUT AREA ? BLO 5$ ; ###RDS### NO - GO ON. ADD #BYTBLK, OUTBUF ; ###RDS### YES - ADD A BLOCK TO THE EPT TBL. INC OUTBLK ; ### RDS### ...AND BUMP THE BLK. CNT. 5$: MOV CORADR,R4 ;POINT TO 1ST ENTRY MOV R4,R5 TST -(R3) SUB R4,R3 ;CALC.EPT ENTRIES ALLOC+34 BYTE HDR BLOS NULLIB ;ERROR - NULL LIBRARY MOV R3,EPTALO(R5) ;AND IND IN EPT MOV #OUTBLK,R3 INC @R3 ;IND # BLKS IN EPT MOV @R3,EPTBLK JMP PA2ST ;CALL PASS2 8$: MOV EPTADR,R1 ;ALL ENTRY PNTS DELETED ? BEQ 3$ ;YES JSR PC,CHKDL1 ;CHECK DELETE LIST (EPT) BR 3$ ; CHECK THE DELETE LIST AND INDICATE AN ILLEGAL DELETE ; IF EITHER AN ENTRY POINT OR A MODULE NAME HAVE NOT BEEN DELETED CHKDL1: ADD #4,R1 ;POINT TO FLAG WORD TST (R1)+ ;SYMBOL DELETED ? BMI CHKDL1 ;YES - CHECK NEXT SYMBOL SUB #6,R1 TST @R1 ;SYMBOL NOT DELETED ? BEQ CHKDXT ; NO - END OF LIST MOV R3,R4 ;USE END OF EPT AS ERR BUF MOV (R1)+,(R4)+ ;MOVE SYMBOL TO ERROR BUF MOV (R1)+,(R4)+ MOV #ILLDEL,R4 ;IND ILLEGAL DELETE MESSAGE PUSH R3 ;SAVE END OF EPT ADR JSR PC,ILLREP ;DECODE SYMBOL & PRINT MSG POP R3 ;RESTORE END OF EPT ADR CHKDXT: RTS PC .SBTTL MOD40 UNPACKER ROUTINE ; ENTER WITH R1 POINTING TO ASCII CHAR AREA ; R3 POINTING TO RAD50 NAME TO BE UNPACKED ; R0 THRU R3 ARE CHANGED BY THIS ROUTINE DECODE: PUSH R4 MOV #EXPAND,R4 ;ADR OF LIST OF DIVISORS MOV (R3)+,R2 2$: CLR R0 3$: CMP R2,@R4 BLO 4$ SUB @R4,R2 INC R0 BR 3$ 1$: MOV R2,R0 MOV (R3)+,R2 4$: TSTB R0 ;BLANK ? BEQ 5$ CMPB R0,#33 ;DOLLAR SIGN ? BEQ 7$ BGT 6$ ;DIGIT ADD #40,R0 ;LETTER 5$: ADD #16,R0 6$: ADD #11,R0 7$: ADD #11,R0 MOVB R0,(R1)+ TST -(R4) ;MOVE ONTO NEXT DIVISOR BGT 2$ BEQ 1$ ;START NEW WORD POP R4 RTS PC .SBTTL DATE CONVERSION ROUTINE ; SUBROUTINE TO CONVERT THE OCTAL DATE TO DECIMAL ; INTERFACE: ; R0 - CONMTAINS THE OCTAL DATE FROM .DATE MACRO ; R1 - WHERE TO PUT THE CONVERTED DATE ; R2 - WORK REGISTER(PREVIOUS CONTENTS DESTROYED) CDATE: PUSH R0 ;PUSH DATE ONTO STACK ROL R0 ;ISOLATE THE DAY ROL R0 ;IN THE LOW- ROL R0 ;ORDER BITS OF SWAB R0 ;R0 BIC #177740,R0 JSR PC,DECOUT ;CONVERT # IN RO TO DECIMAL MOVB #'-,(R1)+ MOV @SP,R0 ;RESTORE DATE FROM THE SATCK SWAB R0 BIC #177703,R0 ;SET UP THE MONTH ADD #DATTBL-4,R0 1$: MOVB (R0)+,(R1)+ ;MOVE IN MONTH NAME BNE 1$ MOVB #'-,-1(R1) POP R0 ;RESTORE THE DATE BIC #177740,R0 ADD #72.,R0 ;SET UP THE YEAR JSR PC,DECOUT RTS PC .SBTTL DECIMAL TO ASCII ROUTINE ; INPUT VALUE IN RO, STRING POINTER IN R1 ; OUTPUTS LEADING ZEROES ; USES R0,R1,R2, AND R3 DECOUT: MOV #DECTBL,R2 ;POINT TO TABLE OF DIVISORS ; ENTER AT CONVRT WITH ALTERNATE TABLE POINTER IN R0 FOR ; ANOTHER RADIX OR FORMAT CONVRT: MOV #'0-1,R3 ;FORM DIGIT IN R3 1$: INC R3 SUB @R2,R0 ;SUBTRACT DIVISOR BPL 1$ ADD (R2)+,R0 ;READD THE DIVISOR TSTB SWIT9 ;FOUND 1ST # ? BMI 2$ CMP R3,#60 ;SPACE SUPPRESS ? BEQ 3$ DECB SWIT9 2$: MOVB R3,(R1)+ ;OUTPUT THE NEXT DIGIT 3$: TST @R2 ;DONE ? BNE CONVRT ;NO,DO NEXT DIGIT CLRB SWIT9 RTS PC .END .TITLE RTLIB2 V03-02 OVERLAY TWO ; RT-11 LIBRARIAN ; ; DEC-11-ORLBA-E ; ; J.E.G. ; ; COPYRIGHT (C) 1974,1975 ; ; DIGITAL EQUIPMENT CORPORATION ; MAYNARD, MASSACHUSETTS 01754 ; ; 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 DIGITAL. ; ; 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. ; .SBTTL LIBRARIAN MACRO DEFINITIONS .MACRO PUSH,PUSH1 MOV PUSH1,-(SP) .ENDM .MACRO POP,POP1 MOV (SP)+,POP1 .ENDM .SBTTL SYMBOLIC DEFINITIONS R0= %0 R1= %1 R2= %2 R3= %3 R4= %4 R5= %5 SP= %6 PC= %7 ; FORM CONTROL CHARACTERS SPAC= 40 TAB= 11 LF= 12 FF= 14 CR= 15 ; COMMONLY USED CONSTANTS BYTBLK= 512. ;BYTE BLOCK SIZE BLK= 256. ;WORD BLOCK SIZE (I/O) PTR1= 2 PTR= 4 HICORE= 50 ;HIGHEST LIBRARIAN FREE CORE ADR RMON= 54 ;START OF RESIDENT MONITOR ADR USRLD= 266 ;START OF USR AREA ERRBYT= 52 ; MONITOR ERROR CODE ADDRESS LKEMT= EMT+20 ;LOOKUP EMT CODE SSEMT= EMT+120 ;SAVESTATUS EMT WEMT= EMT+240 ;WAIT EMT JSW= 44 ;JOB STATUS WORD ADDRESS RESTRT= 020000 ;JSW REENTER BIT ; OFFSETS INTO LIBRARY FILE EPT1= 20 ;EPT STARTING RELATIVE ADDRESS EPTALO= 30 ;EPT ENTRIES ALLOCATED (BYTES) NXTINS= 34 ;NEXT INSERT REL BLK # NXTBYT= 36 ;NEXT INSERT REL BYTE # EPT3= 24 ;EPT ENTRIES AVAILABLE LHEND= 32 ;REL END OF LIBR HEADER LBREPT= 42 ;1ST EPT ENTRY OF LIBRARY ; LIBRARY FILE IDENTIFICATION CODES ENTPNT= 002150 ;ENTRY PNT FLAG BYTE CODE FBHDR= 1 ;FORMATTED BINARY BLK HEADER FBLNTH= 56 ;FB MAXIMUM LENGTH LBRVER= 1 ;CURRENT LIBRARY VERSION # GSD= 1 ;GLOBAL SYMBOL DIRECTORY CODE GSDEND= 2 ;GSD TERMINATION CODE MODEND= 6 ;MODULE TERMINATION CODE LBR= 7 ;LIBRARY FILE IDENTIFIER LBRFIN= 10 ;LIBRARY FILE TERMINATION CODE .MCALL ..V1.. ..V1.. .MCALL .CLOSE,.CSISPC,.CSIGEN,.DATE,.DELETE,.ENTER .MCALL .FETCH,.LOOKUP,.PRINT,.QSET .MCALL .RCTRLO,.READ,.READW,.REOPEN,.SETTOP,.SRESET,.TTYIN .MCALL .WAIT,.WRITE,.WRITW ; .MCALL ...CM1,...CM2,...CM3,...CM4 .SBTTL OVERLAY TWO TABLES .CSECT TABL2 PA2TBL: .WORD PA2MN0 ;MODULE NAME .WORD PA2SEC ;CSECT NAME .WORD PA2IGN ;INTERNAL SYMBOL DESCRIPTOR .WORD PA2IGN ;TRANSFER ADDRESS .WORD PA2ENT ;ENTRY POINT .WORD PA2IGN .WORD PA2IGN ;PROGRAM ID PA2TBE: .SBTTL CREATE LIBRARY ROUTINE - PASS2 .CSECT LIBR2 .GLOBL SVSTAT,CURFIL,PASS,ALTBUF,OUTBUF,OUTBF1 .GLOBL OUTBFH,INITIO,NEWBLK,SKPBLK,CCOUNT,STACK .GLOBL SWIT1,SWIT2,SWIT3,SWIT4,SWIT5,SWIT6 .GLOBL SWIT7,SWIT8,SWIT9,SWIT10,SWIT11,SWIT12 .GLOBL CURBLK,FILBUF,FIL1BF,DELADR,EPTADR,LIBINP .GLOBL TEMPBF,BUFSWT,BADMOD,EPTSER,LURBLK,PA2BLK .GLOBL EPTBLK,BLKDIS,BYTDIS,EPTSR1,ABS,BYTE .GLOBL EOF,WRITBF,OUTBLK,OUTPER,REENTR .GLOBL ENDCOR,LBREND,CORADR,PA2ST,ENDMD3,LIST .GLOBL DELENT PA2ST: MOV SVSTAT,CURFIL ;SET UP FOR PASS2 MOV DELADR,R4 ;GET PTR TO DELETE LIST BEQ 3$ ;DELETE LIST NULL MOV R4,R3 1$: ADD #4,R4 ;PT TO FLAG WORD CLR (R4)+ ;RESET FLAG WORD FOR PASS 2 TST @R4 ;END OF LIST ? BNE 1$ ;NO MOV R3,DELADR 3$: INC PASS ;IND PASS 2 CLR ALTBUF MOV OUTBUF,R3 ;GET OUTPUT BUFFER ADR MOV R3,R4 ADD #BYTBLK,R4 ;PT TO END OF OUTPUT BUFFER MOV R3,OUTBF1 MOV R3,OUTBFH PA2LBR: JSR PC,INITIO ;FILL INPUT BUFFERS PA2LB1: PUSH R4 JSR PC,NEWBLK ;GET FB BLK POP R4 CMP R0,#LBR ;PROCESSING LIBR FILE ? BEQ MERG3 CMP R0,#LBRFIN ;END OF LIBRARY PROCESS ? BEQ MERG4 CMP R0,#GSD ;GLOBAL SYMBOL DIRECTORY ? BEQ PA2MOD PA2WRT: JSR PC,WRTBLK ;WRITE FB BLK CMP R0,#MODEND ;END OF OBJ MOD ? BNE PA2LB1 JMP ENDMD2 PA2WR1: POP R1 ;RESTORE SYMBOL PTR MOV CCOUNT,R5 ;RESTORE FB LENGTH MOV OUTBF1,R3 ;GET OUTPUT BUFFER ADR BR PA2WRT ; THE USER HAS SPECIFIED TO MERGE A LIBRARY FILE MERG3: DECB SWIT6 ;IND PROCESSING LIBR FILE ADD #EPTALO-6,R1 MOV @R1,R1 ;GET EPT ENTRIES ALLOC. CLR R5 MOV #BYTBLK,R3 1$: CMP R3,R1 ;EPT ONE BLK OR LESS BHI 2$ SUB R3,R1 BEQ 2$ INC R5 ;IND BLK TO READ BR 1$ 2$: TST R5 ;CORRECT BLK COUNT ? BEQ 4$ INC R5 ;IND CORRECT BLK COUNT MOV R5,CURBLK JSR PC,FILBUF ;FILL INPUT BUFFERS BR PA2LB1 4$: JSR PC,FIL1BF ;GET CORRECT BUFER BR PA2LB1 MERG4: CLRB SWIT6 ;;IND FINIS LIBR MERGE JMP ENDMD3 ; PROCESS GSD SYMBOL PA2MD0: MOV SVSTAT,R1 ;RESTORE INPUT BUFFER PTR BR PA2MD1 PA2MOD: CMP R1,R2 ;END IF INP BUF IMED AFTER HDR ? BLO 1$ JSR PC,FIL1BF ;SWITCH BUFFERS MOV #GSD,R0 1$: MOV R5,CCOUNT ;SAVE ORIG FB LENGT MOV R1,SVSTAT ;SAVE INP BUF ADR MOV R1,EPTADR ;ALSO IF INP. BUF. SWITCHED PUSH R1 ;SAVE ORIG. INPT. PTR FOR WRTBLK PA2MD1: PUSH R4 MOV #LIBINP,R3 PUSH R3 ;SAVE GSD SYM ADR(TEMP BUF AREA) MOV #8.,R4 SUB R4,R5 ;DECREMENT GSD LENGTH 1$: CMP R1,R2 ;END OF INPUT BUFFER ? BLO 4$ PUSH R3 ;SAVE CURRENT TEMP PTR MOV #TEMPBF,R3 ;GET TEMP OUT BUFR MOV EPTADR,R1 ;GET ORIG INP BUF PTR 2$: MOVB (R1)+,(R3)+ ;WRT DATA TO OUTP BUF CMP R1,R2 ;DATA WRITTEN ? BLO 2$ JSR PC,FIL1BF ;SWITCH BUFFERS MOV #1,R0 ;IND GSD SYMBOL PUSH R1 ;SAVE NEW INP BUF ADR PUSH R5 ;SAVE COUNTER ADD #8.,R5 3$: MOVB (R1)+,(R3)+ ;MOVE REST OF GSD DEC R5 BGT 3$ MOVB (R1)+,(R3)+ ;MOVE CHECK SUM BYTE POP R5 ;RESTORE COUNTER POP R1 ;RESTORE INP BUF ADR POP R3 ;RESTORE TEMP AREA PTR DECB BUFSWT ;IND SPECIAL PROCESS IN WRTBLK 4$: MOVB (R1)+,(R3)+ ;MOVE GSD TO TEMP AREA DEC R4 BGT 1$ TST R5 ;END OF FB IN GSD ? BNE 5$ ;NO INC R1 ;INDEX OVER CHKSUM 5$: MOV R1,SVSTAT ;UPDATE INPUT BUFFER PTR MOVB LIBINP+5,R3 ;GET GSD INDICATOR FLAGS ASL R3 ;SET UP INDICATOR FOR TABLE POP R1 ;GET SYMBOL ADR PTR POP R4 CMP R3,#PA2TBE-PA2TBL ;LEGAL GSD CODE ? BLOS 6$ JMP BADMOD 6$: MOV PA2TBL(R3),PC ;CALL APPRPOPRIATE SUBROUTINE ; PASS2 - MODULE NAME SUBROUTINE PA2MN0: PUSH R4 CLC MOV DELADR,R4 ;GET DELETE LIST BEQ 1$ ;NO - MODULES TO DELETE ? JSR PC,DELENT ;CHECK FOR MATCH MOV R4,DELADR ;UPDATE MODULE DELETE LIST 1$: POP R4 BCC 2$ JMP PA2DL1 2$: DECB SWIT10 ;IND ENTRY IS A MODULE NAME PA2MNM: JSR PC,EPTSER ;FIND MODULE NAME IN EPT BCS 5$ ;NO - MODULE FOUND ? CLRB SWIT8 ;RESET CSECT DELETE SWICH ADD #6,R3 ;PT TO LAST WRD OF ENTRY TST @R3 ;REPLACE THIS MODULE ? BPL 6$ CLR @R3 ;TURN OFF REPLACE SWITCH MOV R5,CCOUNT 5$: BR PA2DEL 6$: TST -(R3) BPL 10$ 7$: BIT #077777,@R3 ;MOD NAME BLK ADR PREV INDICATED ? BNE 15$ ;YES ADD LURBLK,@R3 ;INCLUDE PREVIOUSLY WRITEEN BLKS ADD PA2BLK,@R3 ;IND ABS BLK # ADD EPTBLK,@R3 ;INCLUDE EPT BLKS MOV (R3)+,BLKDIS ;SAVE BLK DISPLACEMENT PUSH R0 MOV OUTBF1,R0 ;GET CURRENT OUT. BUF. PTR SUB OUTBFH,R0 ;CALC BYTE DISPLACEMENT 9$: BIS R0,(R3)+ ;IND BYTE ADR MOV R0,BYTDIS ;SAVE BYTE DISPLACEMENT POP R0 BR PA2SYM 10$: TSTB SWIT10 ;MODULE NAME ENTRY ? BMI 7$ PUSH R0 MOV BLKDIS,@R3 ;GET BLK DISP TO OBJ MOD BIC #100000,(R3)+ ;STRIP OFF INDICATOR BIT MOV BYTDIS,R0 ;GET DISPLACEMENT TO OBJ BIC #777,@R3 ;INSURE CORRECT BYTE DISP BR 9$ 15$: CMP (R3)+,(R3)+ ;INDEX TO NEXT ENT PT JSR PC,EPTSR1 ;SEARCH FOR CORRECT ENT PT BCC 16$ ;YES - ENTRY FOUND ? TSTB SWIT10 ;MODULE NAME ? BMI PA2DL1 ;YES - IGNORE ENTIRE MODULE BR PA2IGN ;IGNORE ENTRY POINT 16$: CMP (R3)+,(R3)+ ;INDEX TO BLK DISP BIT #077777,@R3 ;ENT PT/ MOD NAME ALREADY SEEN ? BNE 15$ ;YES BR 10$ ; PASS2 - CSECT NAME SUBROUTINE PA2SEC: TST 6(R1) ;ZERO LENGTH CSECT ? BEQ PA2IGN ;YES - IGNORE ENTRY CMP ABS,(R1)+ ;IS SYNBOL ASECT ? BNE 1$ CMP ABS+2,(R1)+ BEQ PA2IGN TST -(R1) 1$: TST -(R1) ;IS CSECT BLANK ? BEQ PA2IGN DECB SWIT8 ;IND CSECT DELETE IF REQUIRED BR PA2MNM ; PASS2 - ENTRY POINT SYMBOL SUBROUTINE PA2ENT: CMP 4(R1),#ENTPNT ;ENT PNT WITH ZERO LEN ? BEQ 1$ TST 6(R1) ;ZERO LENGTH ENTRY PT BEQ PA2IGN 1$: DECB SWIT8 ;IND ENT PT DELETE IF REQUIRED PA2EN1: BR PA2MNM ; CHECK FB CONDITON PA2IGN: PA2SYM: CLRB SWIT10 TST R5 ;END OF FB BLK ? BLE 1$ JMP PA2MD0 1$: PUSH R0 JSR PC,BYTE POP R0 JMP PA2WR1 ENDMD2: TSTB EOF ;END OF FILE BPL PA2LB0 TSTB SWIT6 ;LIBRARY FILE ? BMI PA2LB0 CMPB EOF,#376 ;EOF BUFFER PROCESSED ? BNE PA2LB0 ENDMD3: .CLOSE 3 ;CLOSE PREVIOUS FILE BCS OTERR CLRB EOF CLR ALTBUF CLRB SWIT12 MOV CURFIL,R0 ;GET NEXT FILE SUB #16.,R0 ;SAVESTATUS ADR TST @R0 ;ALL FILES PROCESSED ? BEQ PA2EXT MOV R0,CURFIL ;IND NEXT FILE ADR MOV #STACK,SP ;RESET STACK JMP PA2LBR ; DELETE OBJ MOD FROM LIBRARY BUILD PA2DEL: TSTB SWIT8 ;CSECT/ENT PT DELETE ? BPL PA2DL1 ;NO CLRB SWIT8 ;RESET DELETE INDICATOR BR PA2SYM PA2DL1: MOV SVSTAT,R1 ;GET INP BUF ADR PUSH R4 1$: JSR PC,SKPBLK ;SKIP OVER FB BLK JSR PC,NEWBLK CMP R0,#MODEND ;END OF MODULE ? BNE 1$ JSR PC,SKPBLK ;SKIP LAST FB BLK POP R4 TST (SP)+ ;CLEAN UP STACK CLRB BUFSWT ;TURN OFF WRTBLK SPECIAL PROCESSING PA2LB0: JMP PA2LB1 ; END PASS2 LIBRARY BUILD PA2EXT: MOV OUTBF1,R3 ;GET OUTPUT BUF PTR MOV #LBREND+6,R1 ;IND LIBR END FB ADR MOV #2,R5 ;IND # BYTES MOV #10,R0 ;IND TYPE CODE JSR PC,WRTBLK ;IND END OF LIBRARY SUB OUTBFH,R3 ;CALC. NXT INS BYTE MOV R3,R2 MOV OUTBUF,R4 ;IND WRITE ADR OF LIBR DATA MOV PA2BLK,R5 ;GET # BLKS TO WRITE INC R5 SWAB R5 ;CALC # BYTES JSR PC,WRITBF ;WRITE THE LIBR DATA .WAIT 0 SWAB R5 ;CALC. NXT INS BLK MOV R5,R3 MOV EPTBLK,R5 ;IND # EPT BLKS ADD R5,R3 ;INCLUDE EPT BLKS CLR OUTBLK ;IND TO WRITE EPT SWAB R5 ;CALC # BYTES MOV CORADR,R4 ;IND EPT ADR ADD LURBLK,R3 ;ADD PREVIOUSLY WRITTEN BLKS DEC R3 MOV R3,NXTINS(R4) ;IND NEXT INSERT REL BLK # MOV R2,NXTBYT(R4) ;IND NXT INS BYT WITHIN BLK JSR PC,WRITBF ;WRITE LIBR EPT .WAIT 0 ;WAIT FOR OUTSTANDING I/O .CLOSE 0 ;MAKE LIBRARY FILE PERMANENT JMP LIST OTERR: .PRINT #OUTPER JMP REENTR .SBTTL FORMATTED BINARY BLOCK OUTPUT ROUTINE ; INTERFACE: ; R0 - SAVED ; R1 - POINTS TO FB TO BE WRITTEN ; R2 - POINTS TO END OF DATA INPUT BUFFER ; R3 - POINTS TO BYTE AFTER THE LAST BYTE OF DATA ; WRITTEN TO THE OUTPUT BUFFER ; R4 - POINTS TO END OF OUTPUT BUFFER ; R5 - NUMBER OF DATA BYTES IN THE BLOCK WRTBLK: PUSH R0 JSR PC,CHKBUF MOVB #FBHDR,(R3)+ JSR PC,CHKBUF CLRB (R3)+ JSR PC,CHKBUF ADD #6,R5 ;IND FB LENGHT MOVB R5,(R3)+ JSR PC,CHKBUF SUB #6,R5 CLRB (R3)+ ;IND FB CODE JSR PC,CHKBUF MOVB R0,(R3)+ JSR PC,CHKBUF CLRB (R3)+ JSR PC,CHKBUF TSTB BUFSWT ;SPECIAL PROCESSING ? BPL 11$ ;NO MOV #TEMPBF,R1 ;IND ALTERNATE BUFFER 11$: TST R5 ;FB MIN LENGTH ? BEQ 4$ 1$: CMP R1,R2 ;END OF DATA INPUT BUFFER ? BLO 10$ JSR PC,FIL1BF 10$: JSR PC,CHKBUF 2$: MOVB (R1)+,(R3)+ ;WRITE A BYTE DEC R5 ;END OF FB BLK ? BNE 1$ 4$: JSR PC,CHKBUF 6$: JSR PC,BYTE ;GET CHECKSUM BYTE MOVB R0,(R3)+ ;INTO OUTPUT BUFFER JSR PC,CHKBUF 9$: MOV R3,OUTBF1 ;IND. CURRENT BUFFER POS POP R0 TSTB BUFSWT ;SPECIAL PROCESSING ? BPL WRTEND MOV SVSTAT,R1 ;RESTORE UPDATED INPUT ADR CLRB BUFSWT WRTEND: RTS PC CHKBUF: CMP R3,R4 ;END OF OUTPUT BUFFER ? BLO SWTBF1 SWTBUF: MOV R4,OUTBFH ;IND HEAD OF NXT BUFFR ADD #BYTBLK,R4 ;PT TO END OF NXT BUFFER INC PA2BLK ;INC COUNT OF BLKS DECB SWIT11 ;IND BLK INC SWTBF1: CMP R4,ENDCOR ;OUT OF CORE ? BLO SWTEND PUSH R5 MOV PA2BLK,R5 ;GET # BLKS TO WRITE TSTB SWIT11 ;NEED TO INC BLK COUNT ? BMI 1$ INC R5 1$: SWAB R5 ;CALC # BYTES MOV OUTBUF,R4 ;IND WRITE ADR JSR PC,WRITBF ;WRITE THE DATA .WAIT 0 ;INSURE COMPLETION OF CORE WRITE SWAB R5 ; ADD R5,OUTBLK ;IND NXT WRITE BLK # ADD R5,LURBLK ;SAVE TOTAL BLK COUNT CLR PA2BLK ;RESET BLK COUNT MOV R4,R3 ;IND NXT BUFFER ADR MOV R4,OUTBFH ;RESET BUFFER HEAD PTR ADD #BYTBLK,R4 ;PT TO END OF RESET BUFFER CLRB SWIT11 POP R5 SWTEND: RTS PC .END .TITLE RTLIB3 V03-02 OVERLAY THREE ; RT-11 LIBRARIAN ; ; DEC-11-ORLBA-E ; ; J.E.G. ; ; COPYRIGHT (C) 1974,1975 ; ; DIGITAL EQUIPMENT CORPORATION ; MAYNARD, MASSACHUSETTS 01754 ; ; 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 DIGITAL. ; ; 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. ; .SBTTL LIBRARIAN MACRO DEFINITIONS .MACRO PUSH,PUSH1 MOV PUSH1,-(SP) .ENDM .MACRO POP,POP1 MOV (SP)+,POP1 .ENDM .SBTTL SYMBOLIC DEFINITIONS R0= %0 R1= %1 R2= %2 R3= %3 R4= %4 R5= %5 SP= %6 PC= %7 ; FORM CONTROL CHARACTERS SPAC= 40 TAB= 11 LF= 12 FF= 14 CR= 15 ; COMMONLY USED CONSTANTS BYTBLK= 512. ;BYTE BLOCK SIZE BLK= 256. ;WORD BLOCK SIZE (I/O) PTR1= 2 PTR= 4 HICORE= 50 ;HIGHEST LIBRARIAN FREE CORE ADR RMON= 54 ;START OF RESIDENT MONITOR ADR USRLD= 266 ;START OF USR AREA ERRBYT= 52 ; MONITOR ERROR CODE ADDRESS LKEMT= EMT+20 ;LOOKUP EMT CODE SSEMT= EMT+120 ;SAVESTATUS EMT WEMT= EMT+240 ;WAIT EMT JSW= 44 ;JOB STATUS WORD ADDRESS RESTRT= 020000 ;JSW REENTER BIT ; OFFSETS INTO LIBRARY FILE EPT1= 20 ;EPT STARTING RELATIVE ADDRESS EPTALO= 30 ;EPT ENTRIES ALLOCATED (BYTES) NXTINS= 34 ;NEXT INSERT REL BLK # NXTBYT= 36 ;NEXT INSERT REL BYTE # EPT3= 24 ;EPT ENTRIES AVAILABLE LHEND= 32 ;REL END OF LIBR HEADER LBREPT= 42 ;1ST EPT ENTRY OF LIBRARY ; LIBRARY FILE IDENTIFICATION CODES ENTPNT= 002150 ;ENTRY PNT FLAG BYTE CODE FBHDR= 1 ;FORMATTED BINARY BLK HEADER FBLNTH= 56 ;FB MAXIMUM LENGTH LBRVER= 1 ;CURRENT LIBRARY VERSION # GSD= 1 ;GLOBAL SYMBOL DIRECTORY CODE GSDEND= 2 ;GSD TERMINATION CODE MODEND= 6 ;MODULE TERMINATION CODE LBR= 7 ;LIBRARY FILE IDENTIFIER LBRFIN= 10 ;LIBRARY FILE TERMINATION CODE .MCALL ..V1.. ..V1.. .MCALL .CLOSE,.CSISPC,.CSIGEN,.DATE,.DELETE,.ENTER .MCALL .FETCH,.LOOKUP,.PRINT,.QSET .MCALL .RCTRLO,.READ,.READW,.REOPEN,.SETTOP,.SRESET,.TTYIN .MCALL .WAIT,.WRITE,.WRITW ; .MCALL ...CM1,...CM2,...CM3,...CM4 .SBTTL LIBRARIAN LIST ROUTINE .CSECT LIBR3 .GLOBL DIRFIL,LISFIL,LISHDR,LIBFIL,CORADR,NULLIB .GLOBL DECTB0,LISBLK,LISHD1,ENDCOR,LISDIR,WRITWT .GLOBL DEVFUL,REENTR,EXPAND,DATTBL,DECTBL,OUTBLK .GLOBL LIBINP,SWIT9,LIST,SWIT12 ; THIS ROUTINE OUTPUTS A LISTING FILE OF THE LIBRARIAN'S ; DIRECTORY(ENTRY POINT TABLE) .ENABL LSB LIST: TST DIRFIL ;LIST FILE REQUESTED ? BEQ LIEXIT CLR OUTBLK ;INIT BLK COUNT CLRB SWIT12 .ENTER 1,#DIRFIL,DIRFIL+8. ;CREATE LIST FILE BCC 30$ JMP ERLIST 30$: MOV LISFIL,R1 ;GET LIST BUFFER ADR MOV #LISHDR,R3 ;IND LIST HDR ADR JSR PC,PRLIST ;PUT MSG IN OUTPUT AREA .DATE ;GET CURRENT DATE TST R0 ;DATE SUPPLIED ? BEQ 1$ JSR PC,CDATE ;CONVERT OCTAL DATE SUBR 1$: MOVB #CR,(R1)+ MOVB #LF,(R1)+ TST LIBFIL ;LIB FILENAME SPECIFIED ? BEQ DEFNAM MOV #LIBFIL+2,R3 ;IND LIBRARY FILE NAME 20$: JSR PC,DECODE ;UNPACK THE FILE NAME MOVB #TAB,(R1)+ MOVB #TAB,(R1)+ MOV CORADR,R4 CMP 4(R4),#LBR ;LIBR FILE ? BEQ LIST1 JMP NULLIB ;ERROR BAD LIBR LIST1: ADD #10.,R4 ;GET LIBR CREATE DATE ADR MOV @R4,R0 BEQ 21$ JSR PC,CDATE ;CONVERT OCTAL DATE SUBR MOVB #TAB,(R1)+ 21$: ADD #18.,R4 ;GET THE # BLKS ADR MOV @R4,R0 INC R0 ;COUNT BLOCK 0 MOV #DECTB0,R2 ;IND LARGE TABLE JSR PC,CONVRT ;CONVERT OCTAL TO DECIMAL MOV #LISBLK,R3 JSR PC,PRLIST ADD #6,R4 ;POINT TO ENTRY POINT TABLE MOV #LISHD1,R3 ;IND 2ND HDR JSR PC,PRLIST ;PUT MSG IN OUTPUT AREA MOV R4,R3 2$: TST PTR(R4) ;MODULE NAME ? BPL 3$ MOVB #CR,(R1)+ MOVB #LF,(R1)+ MOV #4,R5 BR 5$ 3$: DEC R5 ;NEXT LINE ? BNE 4$ ;NO MOVB #CR,(R1)+ MOVB #LF,(R1)+ MOV #3,R5 4$: MOVB #TAB,(R1)+ MOVB #TAB,(R1)+ 5$: JSR PC,DECODE ;UNPACK THE FILE NAME ADD #PTR*2,R4 ;POINT TO NEXT EPT ENTRY CMP R1,ENDCOR ;OUT OF CORE ? BLO 8$ JSR PC,LISDIR ;WRITE LIBR DIR MOV R3,R1 6$: CLR (R1)+ ;CLEAR BUFFER AREA CMP R1,ENDCOR ;BUFFER CLEARED ? BLO 6$ MOV R3,R1 8$: MOV R4,R3 TST @R4 ;END OF EPT ? BNE 2$ MOVB #FF,(R1)+ ;INSERT A FORM FEED. CLRB (R1)+ JSR PC,LISDIR ;WRITE LIBR DIR .CLOSE 1 LIEXIT: JMP REENTR LISDIR: MOV LISFIL,R3 ;IND BUFFER ADR SUB R3,R1 ;IND WORD COUNT ASR R1 ;DIVIDE BYTES BY TWO JSR PC,WRITWT ;WRITE LIST FILE TSTB R1 ;EXTRA BLK BEQ LISD1 DECB SWIT12 CLRB R1 ;CLEAR FOR BLK CALC LISD1: SWAB R1 ;CALC # BLKS TSTB SWIT12 ;EXTRA BLK ? BPL LISD2 ;NO INC R1 CLRB SWIT12 LISD2: ADD R1,OUTBLK ;IND NXT WRITE BLK # RTS PC DEFNAM: MOV #LIBINP+14,R3 ;IND DEFAULT LIBR BR 20$ PRLIST: MOVB (R3)+,(R1)+ ;MOVE MSG TO BUFFER TSTB @R3 ;END OF MESSAGE ? BNE PRLIST RTS PC .DSABL LSB ERLIST: .PRINT #DEVFUL JMP REENTR .SBTTL MOD40 UNPACKER ROUTINE ; ENTER WITH R1 POINTING TO ASCII CHAR AREA ; R3 POINTING TO RAD50 NAME TO BE UNPACKED ; R0 THRU R3 ARE CHANGED BY THIS ROUTINE DECODE: PUSH R4 MOV #EXPAND,R4 ;ADR OF LIST OF DIVISORS MOV (R3)+,R2 2$: CLR R0 3$: CMP R2,@R4 BLO 4$ SUB @R4,R2 INC R0 BR 3$ 1$: MOV R2,R0 MOV (R3)+,R2 4$: TSTB R0 ;BLANK ? BEQ 5$ CMPB R0,#33 ;DOLLAR SIGN ? BEQ 7$ BGT 6$ ;DIGIT ADD #40,R0 ;LETTER 5$: ADD #16,R0 6$: ADD #11,R0 7$: ADD #11,R0 MOVB R0,(R1)+ TST -(R4) ;MOVE ONTO NEXT DIVISOR BGT 2$ BEQ 1$ ;START NEW WORD POP R4 RTS PC .SBTTL DATE CONVERSION ROUTINE ; SUBROUTINE TO CONVERT THE OCTAL DATE TO DECIMAL ; INTERFACE: ; R0 - CONMTAINS THE OCTAL DATE FROM .DATE MACRO ; R1 - WHERE TO PUT THE CONVERTED DATE ; R2 - WORK REGISTER(PREVIOUS CONTENTS DESTROYED) CDATE: PUSH R0 ;PUSH DATE ONTO STACK ROL R0 ;ISOLATE THE DAY ROL R0 ;IN THE LOW- ROL R0 ;ORDER BITS OF SWAB R0 ;R0 BIC #177740,R0 JSR PC,DECOUT ;CONVERT # IN RO TO DECIMAL MOVB #'-,(R1)+ MOV @SP,R0 ;RESTORE DATE FROM THE SATCK SWAB R0 BIC #177703,R0 ;SET UP THE MONTH ADD #DATTBL-4,R0 1$: MOVB (R0)+,(R1)+ ;MOVE IN MONTH NAME BNE 1$ MOVB #'-,-1(R1) POP R0 ;RESTORE THE DATE BIC #177740,R0 ADD #72.,R0 ;SET UP THE YEAR JSR PC,DECOUT RTS PC .SBTTL DECIMAL TO ASCII ROUTINE ; INPUT VALUE IN RO, STRING POINTER IN R1 ; OUTPUTS LEADING ZEROES ; USES R0,R1,R2, AND R3 DECOUT: MOV #DECTBL,R2 ;POINT TO TABLE OF DIVISORS ; ENTER AT CONVRT WITH ALTERNATE TABLE POINTER IN R0 FOR ; ANOTHER RADIX OR FORMAT CONVRT: MOV #'0-1,R3 ;FORM DIGIT IN R3 1$: INC R3 SUB @R2,R0 ;SUBTRACT DIVISOR BPL 1$ ADD (R2)+,R0 ;READD THE DIVISOR TSTB SWIT9 ;FOUND 1ST # ? BMI 2$ CMP R3,#60 ;SPACE SUPPRESS ? BEQ 3$ DECB SWIT9 2$: MOVB R3,(R1)+ ;OUTPUT THE NEXT DIGIT 3$: TST @R2 ;DONE ? BNE CONVRT ;NO,DO NEXT DIGIT CLRB SWIT9 RTS PC .END .TITLE RTLIB4 V03-02 OVERLAY FOUR ; RT-11 LIBRARIAN ; ; DEC-11-ORLBA-E ; ; J.E.G. ; ; COPYRIGHT (C) 1974,1975 ; ; DIGITAL EQUIPMENT CORPORATION ; MAYNARD, MASSACHUSETTS 01754 ; ; 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 DIGITAL. ; ; 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. ; .SBTTL LIBRARIAN MACRO DEFINITIONS .MACRO PUSH,PUSH1 MOV PUSH1,-(SP) .ENDM .MACRO POP,POP1 MOV (SP)+,POP1 .ENDM .SBTTL SYMBOLIC DEFINITIONS R0= %0 R1= %1 R2= %2 R3= %3 R4= %4 R5= %5 SP= %6 PC= %7 ; FORM CONTROL CHARACTERS SPAC= 40 TAB= 11 LF= 12 FF= 14 CR= 15 ; COMMONLY USED CONSTANTS BYTBLK= 512. ;BYTE BLOCK SIZE BLK= 256. ;WORD BLOCK SIZE (I/O) PTR1= 2 PTR= 4 HICORE= 50 ;HIGHEST LIBRARIAN FREE CORE ADR RMON= 54 ;START OF RESIDENT MONITOR ADR USRLD= 266 ;START OF USR AREA USRTOP= 7776 ;TOP OF USR (DISP FROM BOTTOM) NOSWAP= 1000 ;USR PERM RESIDENT (BIT 9) CONFWD= 300 ;CONFIG WORD (DISP FROM RMON) ERRBYT= 52 ; MONITOR ERROR CODE ADDRESS LKEMT= EMT+20 ;LOOKUP EMT CODE SSEMT= EMT+120 ;SAVESTATUS EMT WEMT= EMT+240 ;WAIT EMT JSW= 44 ;JOB STATUS WORD ADDRESS RESTRT= 020000 ;JSW REENTER BIT SEVENK= 33000 ;JUST BELOW 8K RESIDENT ; OFFSETS INTO LIBRARY FILE EPT1= 20 ;EPT STARTING RELATIVE ADDRESS EPTALO= 30 ;EPT ENTRIES ALLOCATED (BYTES) NXTINS= 34 ;NEXT INSERT REL BLK # NXTBYT= 36 ;NEXT INSERT REL BYTE # EPT3= 24 ;EPT ENTRIES AVAILABLE LHEND= 32 ;REL END OF LIBR HEADER LBREPT= 42 ;1ST EPT ENTRY OF LIBRARY ; LIBRARY FILE IDENTIFICATION CODES ENTPNT= 002150 ;ENTRY PNT FLAG BYTE CODE FBHDR= 1 ;FORMATTED BINARY BLK HEADER FBLNTH= 56 ;FB MAXIMUM LENGTH LBRVER= 1 ;CURRENT LIBRARY VERSION # GSD= 1 ;GLOBAL SYMBOL DIRECTORY CODE GSDEND= 2 ;GSD TERMINATION CODE MODEND= 6 ;MODULE TERMINATION CODE LBR= 7 ;LIBRARY FILE IDENTIFIER LBRFIN= 10 ;LIBRARY FILE TERMINATION CODE .MCALL ..V1.. ..V1.. .MCALL .CLOSE,.CSISPC,.CSIGEN,.DATE,.DELETE,.ENTER .MCALL .FETCH,.LOOKUP,.PRINT,.QSET .MCALL .RCTRLO,.READ,.READW,.REOPEN,.SETTOP,.SRESET,.TTYIN .MCALL .WAIT,.WRITE,.WRITW,.LOCK,.UNLOCK ; .MCALL ...CM1,...CM2,...CM3,...CM4 .SBTTL LIBRARY COMMAND PROCESSOR .CSECT LIBR4 .GLOBL STACK,IMPURE,IMPEND,LIBFIL,DEFEXT,LIMIT .GLOBL CORADR,REPLPT,UPDPTR,INPERR,CMDER,DEVER .GLOBL FILER,NOCORE,CURFIL,SVSTAT,SWIT4,ENDCOR .GLOBL SWIT1,DELETE,DELEPT,CREATE,LIST,REENTR .GLOBL START1,SWIT3,SWIT2,SWIT5,ERCORE START1: MOV #STACK,SP ;IND STACK ADR MOV #IMPURE,R1 ;GET START OF IMPURE CSECT MOV #IMPEND,R2 ;GET END ADR OF IMPURE CSECT CLR R5 IMPCLR: CLR (R1)+ ;CLEAR CSECT CMP R1,R2 ;AT END OF IMPURE CSECT ? BLO IMPCLR BIS #RESTRT,@#JSW ;MARK LIBRARIAN AS REENTERABLE MOV @#RMON,R1 ;GET PTR TO RESIDENT MONITOR MOV USRLD(R1),R0 ;GET PTR TO TOP OF USR .SETTOP ;REQUEST CORE TO TOP OF USR MOV #LIBFIL,R1 ;GET INPUT LINE ADR .CSISPC R1,#DEFEXT,#0 ;REQUEST LIBRARY COMMAND BCS BADCMD ;LEGAL COMMAND ? MOV LIMIT+2,R2 ;GET END OF CODE ADR .QSET R2,#3 ;ADD 3 ITEMS TP I/O QUEUE ; /(FOR DT,AND DK) MOV R0,R2 ;UPDATE TO HANDLER AREA TST @R1 ;INPUT FILE SPECIFIED ? BNE 1$ COM R5 ;IND NO INPUT FILE BR 5$ 1$: .FETCH R2,R1 ;GET ASSOCIATED DEVICE HANDLER BCS BADDEV ;HANDLER FETCH ERRORS ? 3$: MOV R0,R2 ;GET NEXT HANDLER LOCATION 5$: ADD #10.,R1 ;BUMP PTR TO NEXT FILE SPEC TST @R1 ;LISTING FILE SPECIFIED ? BNE 40$ TST R5 ;INPUT FILE SPECIFIED ? BMI BADCMD BR 4$ 40$: .FETCH R2,R1 ;GET ASSOC DEV HANDLER BCS BADDEV 4$: MOV R0,R2 ;GET NEXT HANDLER LOCATION ADD #10.,R1 TST @R1 ;EXTRANEOUS OUTPUT FILE BNE BADCMD ; THE FOLLOWING CODE FETCHES THE APPROPRIATE HANDLER FOR EACH ; INPUT FILE, AND THEN ASSOCIATES THE SPECIFIED CHANNEL # AND ; FILE THROUGH THE .LOOKUP MACRO. NOTE: THE LOOKUP CODE IS ; MONITOR DEPENDENT AND NON-REENTRANT. MOV #3,R3 ;IND 1ST INPUT CHANNEL # ADD #2,R1 6$: ADD #8.,R1 ; POINT TO NEXT INPUT FILE TST @R1 ;INPUT FILE SPECIFIED ? BEQ 8$ .FETCH R2,R1 ;GET ASSOCIATED DEVICE HANDLER BCS BADDEV MOV R0,R2 ;GET NEXT HANDLER LOCATION MOV R1,R0 ;IND FILE NAME ADR TO LOOKUP ; **** NON REENTRANT CODE **** MOV #LKEMT,R4 ;GET LOOKUP CODE ADD R3,R4 ;IND APPROPRIATE CHANNEL # MOV R4,@PC ;MODIFY EMT @ RUN TIME EMT 23 BCC 8$ ; **** END NON REENTRANT CODE **** TSTB @#ERRBYT ;DETERMINE ERROR TYPE BNE LOOKER ;CHANNEL OPEN ERROR 8$: INC R3 ;IND NEXT CHAN # CMP R3,#8. ; MORE CHANNELS ? BLOS 6$ ASL R4 ;INPUT FILE SPECIFIED ? BCC BADCMD ;NO MOV R2,CORADR ;SAVE FREE CORE ADR ; THE INPUT OBJECT MODULES HAVE BEEN PROCESSED, THE ; ASSOCIATED SWITCHES ARE NOW CHECKED. (LIBRARIAN SWITCHES ARE: ;/D,/G,/R, AND /C). .ENABL LSB MOV R2,R5 ;GET REPLACE DEF SWITCH AREA MOV @#HICORE,R3 ;GET HIGHEST CORE ADR MOV (SP)+,R2 ;GET THE # OF CMD SWITCHES BEQ SWEND MOV R5,REPLPT ;IND REPLACE SWITCH AREA MOV R5,R1 ADD #200.,R5 ;GET UPDATE AREA ASSOC ADR MOV R5,UPDPTR ;IND UPDATE SWITCH AREA TST (R5)+ MOV R5,R4 MOV R5,CORADR ;UPDATE FREE CORE PTR MOV R1,R5 LIBSW1: CMPB @SP,#'D ;DELETE MODULES ? BNE 1$ DECB SWIT1 ;IND DELTE MODULES BR 15$ 1$: CMPB @SP,#'R ;REPLACE MODULES ? BNE 2$ DECB SWIT3 ;IND REPLACE MODULES TST @SP ;REPLACE VALUE ? BMI BADCMD MOV (SP)+,(R5)+ ;SAVE REPLACE ASSOCIATION CLR @R5 ;TERMINATE REPL LIST BR 18$ 2$: CMPB @SP,#'G ;DELETE ENTRY POINTS ? BNE 3$ DECB SWIT2 ;IND DELETE EPT BR 15$ 3$: CMPB @SP,#'C ;CONTINUATION SWITCH ? BNE 4$ DECB SWIT4 ;IND CONT. SWITCH BR 15$ 4$: CMPB @SP,#'U ;UPDATE SWITCH ? BNE BADCMD TST @SP ;UPDATE VALUE ? BMI BADCMD MOV (SP)+,-(R4) ;SAVE UPDATE ASSOC MOV R4,UPDPTR ;UPDATE PTR LIST DECB SWIT5 ;IND UPDATE SWITCH BR 18$ STATER: .PRINT #INPERR BR EREXIT BADCMD: .PRINT #CMDER BR EREXIT BADDEV: .PRINT #DEVER BR EREXIT LOOKER: .PRINT #FILER BR EREXIT ERCORE: .PRINT #NOCORE EREXIT: JMP REENTR ; POP THE PROCESSED SWITCH OFF THE STACK, AND IF MORE ; SWITCHES ARE PRESENT, PROCESS THEM. OTHERWISE, CONTINUE ; PROCESSING 15$: TST (SP)+ ;POP THE SWITCH BPL 18$ ;SWITCH VALUE ? 16$: TST (SP)+ ;REMOVE SWITCH VALUE 18$: DEC R2 ;MORE SWITCHES ? BNE LIBSW1 .DSABL LSB ; THE SWITCHES HAVE ALL BEEN PROCESSED ON THE CURRENT ; COMMAND STRING. A SAVESTATUS AND A WAIT ARE NOW DONE ON THE ; INDICATED FILES, AND, IF THE /C SWITCH WAS SPECIFIED, ; ANOTHER COMMAND READ IS DONE. SWEND: MOV #WEMT+3,R1 ;IND WAIT EMT CODE MOV #SSEMT+3,R2 ;IND SAVESTATUS EMT ; ****NON REENTRANT CODE **** 1$: MOV R1,@PC .WAIT 3 ;WAIT MODIFIED @ RUN TIME ; **** END NON REENTRANT CODE **** BCS 4$ SUB #10.,R3 ;IND SAVESTATUS ADR MOV R3,R0 ; **** NON REENTRANT CODE **** 3$: MOV R2,@PC EMT 123 ;SAVESTATUS MODIFIED AT RUN TIME ; **** END NON REENTRANT CODE **** BCS STATER CLR -(R3) ;INITIALIZE REST OF FILE CLR -(R3) ;DESCRIPTOR BLOCK CLR -(R3) MOV CORADR,R5 ;GET FREE CORE ADR CMP R3,R5 ;CORE EXCEEDED ? BLOS ERCORE 4$: INC R1 ;INDEX TO NEXT CHANNEL # INC R2 CMP R1,#WEMT+8. ;END OF COMMAND STRING BLOS 1$ ;NO INCB SWIT4 ;COMMAND CONTINUATION ? BNE SWTST1 ;NO .PAGE ; THE USER HAS INDICATED MORE THAN 6 INPUT OBJECT MODULES. MOV #CORADR,R2 MOV @R2,R1 ;IND HANDLER AREA .CSIGEN R1,#DEFEXT,#0 ;REQUEST THE USER TO ENTER CMD MOV R0,@R2 ;UPDATE FREE CORE PTR MOV (SP)+,R2 ;GET THE SWITCH COUNT NXTSW: BEQ SWEND CMPB @SP,#'C ;COMMAND CONTINUATION ? BNE BADCMD ;ALL OTHER SWITCHES ARE ILLEGAL DECB SWIT4 TST (SP)+ ;POP THE SWITCH BPL 5$ TST (SP)+ ;REMOVE SWITCH VALUE 5$: DEC R2 BR NXTSW ;CHECK FOR MORE SWITCHES ; ALL LIBRARY COMMANDS HAVE BEEN PROCESSED. THE APPROPRIATE ; SWITCH PROCESSING SUBROUTINES ARE NOW INVOKED. SWTST1: SUB #10.,R3 CLR @R3 ;IND END OF FILES 5$: MOV (R3)+,(R5)+ ;MOVE FILE BLKS CMP R3,@#HICORE ;FILE BLKS MOVED ? BLO 5$ ;NO MOV @#RMON,R0 ;GET PTR TO RESIDENT MON BIT #NOSWAP,CONFWD(R0) ;SET USR NOSWAP ? BNE 10$ ;YES - DON'T INCLUDE USR AREA MOV USRLD(R0),R0 ;PT TO USR ADD #USRTOP,R0 ;PT TO TOP OF USR .SETTOP ;GLOM ALL AVAILABLE CORE MOV R0,R3 10$: TST -(R3) ;IND MAX CORE SIZE ALLOWED MOV R3,ENDCOR MOV R5,CORADR ;UPDATE FREE CORE ADR SUB #10.,R5 ;PT TO 1ST FILE BLK MOV R5,CURFIL MOV R5,SVSTAT MOV #SWIT1,R3 ;GET SWITCHES ADR TSTB @R3 ;DELETE SWITCH ? BPL 1$ INCB @R3 ;ILLOGICAL DELETE ? BMI BADCMD JSR PC,DELETE ;ENTER MOD TO DELETE 1$: INC R3 TSTB @R3 ;DELETE EPT SWITCH ? BPL 2$ INCB @R3 ;ILLOGICAL DELETE EPT ? BMI BADCMD JSR PC,DELEPT ;ENTER EPT TO DELETE 2$: JMP CREATE ;CREAT IND LIBR FILE .END .IF DF MBUILD .TITLE MBUILD ROOT V02-03 .IFF .TITLE PIP ROOT V04-06 .ENDC ; RT-11 PIP (PERIPHERAL INTERCHANGE PROGRAM) ; AND ; RT-11 MBUILD (MAGTAPE BUILD PROGRAM ; ; DEC-11-ORPPA-E ; ; COPYRIGHT (C) 1973,1974,1975 ; ; DIGITAL EQUIPMENT CORPORATION ; MAYNARD, MASSACHUSETTS 01754 ; ; 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 DIGITAL. ; ; 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. ; ; MAY 2, 1973 ; ; HANK MAURER ; LOUISE GERHART ; ANTON CHERNOFF ; JUNE 25, 1974 ; ; BOB FRIEDENTHAL ; ; NOVEMBER 1974,JANUARY 1975,AUGUST 1975 ; ; BOB BEAN ; ; .SBTTL MACRO DEFINITIONS .MCALL ..V1.. .MCALL .CLOSE, .CSISPC,.DELETE,.DSTATU,.FETCH, .HRESET .MCALL .LOOKUP,.PRINT, .RCTRLO,.RENAME,.REOPEN,.SAVEST .MCALL .SETTOP,.SRESET,.TTYIN, .TTYOUT,.UNLOCK,.LOCK .MCALL .READW, .WAIT, .DATE, .WRITW, .EXIT, .REGDEF .MCALL .CSIGEN,.SERR ,.TRPSET,...CM1,...CM2,...CM3 ..V1.. ;USE V1 MACRO FORMAT .REGDEF ;DEFINE REGISTERS .MACRO MESSAGE TEXT JSR R3,PUTMSG .ASCIZ TEXT .EVEN .ENDM MESSAGE .MACRO ERROR TEXT JSR R0,MSG .ASCIZ "?TEXT?" .EVEN .ENDM ERROR .MACRO SWITCH CHAR,ADR,MODE,VALUE .BYTE ''CHAR,MODE .IF B VALUE .WORD 0 .IFF VALUE: .WORD 0 .ENDC .IF EQ MODE .WORD ADR-COPY .IFF ADR: .WORD 0 .ENDC .ENDM SWITCH ;THE FOLLOWING MONITOR FEATURES ARE USED IN NON-STANDARD CALLS ; HENCE, THE USUAL MACROS ARE NOT USED .MACRO .ENTER CH EMT 40+CH .ENDM .ENTER .MACRO .READ CH EMT 200+CH .ENDM .READ .MACRO .WRITE CH EMT 220+CH .ENDM .WRITE ;SYMBOL DEFINITIONS NLIMIT = 37 ;MAX # OF DIRECTORY SEGMENTS ALLOWED STRTAD = 40 ;USER PROGRAM START ADDRESS JSW = 44 ;JOB STATUS WORD EMTERR = 52 ;RT-11 ERROR RETURN WORD SYSPTR = 54 ;POINTER TO RT-11 RESIDENT DIRBLK = 6 ;STARTING BLOCK OF DIRECTORIES OFFSET = 256 ;OFFSET TO VITAL RMON WORDS ;OFFSET IS DIFF OF BLKEY AND $RMON SYSUNT = 275 ;OFFSET TO SYSTEM DEVICE UNIT # CONFIG = 300 ;OFFSET TO CONFIG WORD R50STAR = 132500 ;* IN RADIZ 50 (FROM CSI) DIREOB = 4000 ;DIRECTORY BIT SAYING END OF BLOCK DIRPRM = 2000 ;BIT SAYING PERMANENT FILE DIREMP = 1000 ;BIT SAYING EMPTY ENTRY DIRESZ = 16 ;SIZE OF 1 ENTRY (+ XTRABY) FGACTV = 200 ;BIT IN CONFIG SAYING FG ACTIVE CSWEOF = 20000 ;EOF BIT IN CSW HDR1 = 42110 ;ASCII H,D EOF1 = 47505 ;ASCII E,O RXCS = 177170 ;ADDRESS OF RX11 CONTROL/STATUS REGISTER .IF NDF MBUSSC RSCS2 = 172050 ;ADDRESS OF RH11/RJS03/4 CONT REG 2 .ENDC .IF DF MBUSSC RSCS2 = 176310 ;ADDRESS OF RH11/RJS03/4 CR2 .ENDC ;DEVICE IDENTIFICATION CODES IN $STAT RKIDEN=0 ;RK11/RK05,RK03 DTIDEN=1 ;TC11/TU56 TMIDEN=11 ;TM11/TU10/TSO3 RFIDEN=12 ;RF11/RS11 CTIDEN=13 ;TA11/TU60 RJIDEN=16 ;RJS03/4 TJIDEN=20 ;TJU16 DPIDEN=21 ;RP11/RP02,RP03 DXIDEN=22 ;RX11/RX01 ;ASCII CHARACTERS RUBOUT=377 ;RUBOUT ASTRSK=52 ;ASTERISK .GLOBL ILLCMD,FGCHK,DEVINF,HANERR,SSB,REBOT,FILDES .SBTTL COMMAND DISPATCHER .CSECT PIP MSG: .PRINT ;PRINT ERROR MESSAGE BR ESTRT ;SKIP OVER WARNING MESSAGE TESTS-ALSO REENTRY POINT START: TST REBMES ;SHOULD WE TYPE REBOOT MESSAGE? BNE 1$ ;NO .PRINT #RBMSG ;PRINT ?REBOOT? 1$: TST SYSMES ;SHOULD WE PRINT NO SYS ACTION MESSAGE? BNE ESTRT ;NO .PRINT #SYSMSG ;YES-PRINT ?NO SYS ACTION? ESTRT: .DATE ;GET TODAY'S DATE MOV R0,(PC)+ ;AND REMEMBER IT IN TODAY TODAY: 0 JSR PC,UNLOCK ;RELEASE USR AND RE-ENABLE CTRL/C INTERRUPTS MOV #1000,SP ;SET STACK POINTER CLR @BLKEY ;CAUSE FRESH DIRECTORY TO BE READ .RCTRLO ;RESET CTRL/O SWITCH .SRESET ;SOFT RESET (PURGE FILES, HANDLERS) MOV USRBUF,R0 TST -(R0) ;SET R0 TO BOTTOM OF USR .SETTOP ;TELL MONITR HOW MUCH CORE WE NEED .SETTOP #FREE ;THEN CAUSE NOT TO BE SWAPPED OUT BY CTRL/C .CSISPC #FILDES,#DEFEXT,#0 ;GET CSI COMMAND STRING FROM TTY BCS START ;TRY AGAIN ON ERROR MOV #CLRLST,R0 ;POINT TO LIST OF STUFF TO CLEAR 1$: CLR @(R0)+ ;CLEAR A WORD TST @R0 ;END OF LIST? BNE 1$ ;NO, DO MORE MOV #LIST,R0 ;POINT TO V2 ARG LIST 7$: CLR (R0)+ ;CLEAR ARG LIST CMP R0,#LIST+16 ;DONE? BLO 7$ ;LOOP IF NOT MOV SP,(PC)+ ;SET SYSMES TO NON ZERO SYSMES: 1 MOV SP,(PC)+ ;SET REBMES TO NONZERO REBMES: 1 CLR R3 ;CLEAR SWITCH HANDLER ADDRESS MOV (SP)+,R1 ;NUMBER OF SWITCHES 2$: DEC R1 ;ANY MORE SWITCHES ?? BMI FETCH ;NO, FETCH ALL HANDLERS MOV (SP)+,R2 ;GET SWITCH BMI 3$ ;VALUE WAS SPECIFIED CLR -(SP) ;USE ZERO FOR SWITCH VALUE 3$: MOV #SWTCHS-4,R5 ;POINTER TO SWITCH LIST 4$: CMP (R5)+,(R5)+ ;BUMP SWITCH LIST POINTER MOV (R5)+,R0 ;GET SWITCH MODE AND CHARACTER BEQ 6$ ;END OF SWITCH LIST...BAD SWITCH CMPB R2,R0 ;IS THIS THE NAMED SWITCH ?? BNE 4$ ;NO, KEEP LOOKING MOV (SP)+,(R5)+ ;STORE SWITCH VALUE TST R0 ;WHAT TYPE OF SWITCH BMI 5$ ;ITS A MODE SWITCH TST R3 ;ANY PREVIOUS DIRECTIVE ?? BNE 6$ ;YES, MULTIPLE DIRECTIVES ILLEGAL MOV (R5),R3 ;NO, SAVE ADDRESS OF HANDLER BR 2$ ;LOOK FOR NEXT SWITCH 5$: MOV SP,(R5) ;SET SWITCH WORD NON ZERO BR 2$ ;LOOK FOR NEXT SWITCH 6$: ERROR CLRLST: LCHAN ;LAST CHANNEL NUMBER OUCHAN ;OUTPUT CHANNEL NUMBER .IF NDF MBUILD ASCII ;(/A) FBIN ;(/B) IGNORE ;(/G) ALLDIR ;(/W) .ENDC CURRNT ;(/C) FILENO ;(/M) QUERY ;(/Q) SYSBAD ;(/Y) EMPTY ;(/E RELATED) NOINFO ;(/F RELATED) XMODE ;(/X) DIRSIZ ;(/N VALUE) ZXTRA ;(/Z VALUE) FBLOKS ;DIRECTORY COUNTS NFILS NBLOX DIRDES ;DIRECTORY LIST FILE DIRFLG ;DIRECTORY LISTING IN PROGRESS FLAG 0 ;END OF LIST .SBTTL SWITCH TABLE MODE= 200 ACTION= 0 SWTCHS: .IF NDF MBUILD SWITCH A ASCII MODE SWITCH B FBIN MODE SWITCH D DELETE ACTION SWITCH G IGNORE MODE SWITCH K BLKSCN ACTION SWITCH S COMPRS ACTION SWITCH T EXTEND ACTION SWITCH V VERSON ACTION SWITCH W ALLDIR MODE .ENDC SWITCH C CURRNT MODE SWITCH E FULDIR ACTION SWITCH F FASDIR ACTION SWITCH I COPY ACTION SWITCH L DIRECT ACTION SWITCH M NUMBER MODE FILENO SWITCH N NSWIT MODE DIRSIZ SWITCH O REBOOT ACTION SWITCH Q QUERY MODE SWITCH R RENAME ACTION SWITCH U BOOT ACTION SWITCH X XMODE MODE SWITCH Y SYSBAD MODE SWITCH Z ZEROD ACTION ZXTRA 0 .SBTTL HANDLER FETCH HANERR: ERROR FETCH: MOV #FILDES,R2 ;POINTER TO CSI OUTPUT MOV #FREE,R4 ;ADDRESS OF FREE CORE MOV #FILDES+36,R1 ;ADDRESS OF INPUT LIST .IF NDF MBUILD 1$: TST (R2) ;IS DEVICE NAME NULL? (/E, /L, ETC.) BEQ 2$ ;YES, DON'T FETCH A HANDLER .FETCH R4,R2 ;LOAD HANDLER IN FREE CORE BCS HANERR ;ILLEGAL DEVICE (PROBABLY) MOV R0,R4 ;SAVE UPDATED FREE CORE ADDRESS 2$: ADD #12,R2 ;BUMP LIST POINTER CMP R2,R1 ;ARE WE IN THE INPUT LIST ?? BLOS 1$ ;NO, INCREMENT WAS CORRECT TST -(R2) ;INPUT LIST ELEMENTS ARE 1 WORD SHORTER CMP R2,#FILDES+116 ;DONE WITH LIST ?? BLO 1$ ;NO, LOOP .ENDC MOV R4,INFILS ;SAVE START OF EXPANDED INPUT LIST MOV R4,R2 ;AND PUT IT INTO R2 ;NOTE: R1=#FILDES+36 .SBTTL INPUT EXPANDER EXPAND: ADD #COPY,R3 ;COPY IS THE DEFAULT OPERATION MOV R3,-(SP) ;ADDRESS OF CORRECT ROUTINE MOV #6,-(SP) ;CSI INPUT LIST COUNT EXPLUP: CLR R3 ;STAR SWITCH MOV R2,R4 ;SAVE START OF NEXT EXPANDED ENTRY JSR PC,CORCHK ;INSURE ENUF FREE CORE FOR NXT FILENAM ;### MOV (R1)+,(R2)+ ;COPY DEVICE NAME FROM SHORT INP LIST BNE NOTNUL ;ENTRY WAS NOT NULL TST -(R2) ;NULL ENTRY, BACKUP EXPANDED LIST PTR ADD #6,R1 ;SKIP OVER THIS SHORT LIST ENTRY INFCNT: .CLOSE 0 ;CLOSE CHANNEL USED FOR DIR READS JSR PC,UNLOCK ;RELEASE USR AND RE-ENABLE CTRL/C INTERRUPTS DEC @SP ;ANY MORE TO EXPAND?? BNE EXPLUP ;YES MOV (SP)+,(R2)+ ;POP 0 TO ZERO END OF EXPANDED LIST MOV #FILDES,R4 ;POINTER TO OUTPUT LIST MOV (PC)+,R5 ;POINTER TO EXPANDED INPUT LIST INFILS: 0 ;NOTE: R2 POINTS TO FREE CORE JMP @(SP)+ ;JMP TO COMMAND HANDLER NOTNUL: CMP (R1),#R50STAR ;WAS FILE NAME * ?? BNE 1$ ;NO COMB R3 ;SET STAR NAME SWITCH 1$: MOV (R1)+,(R2)+ ;COPY THE NAME MOV (R1)+,(R2)+ ;TWO WORDS OF RAD 50 MOV (R1),(R2)+ ;COPY THE EXTENSION CMP (R1)+,#R50STAR ;IS THE EXTENSION * ?? BNE 2$ ;NO BIS #100000,R3 ;YES, SET STAR EXTENSION SWITCH 2$: TST R3 ;IS NAME OR EXT STARRED ?? BEQ INFCNT ;NO, NO EXPANSION MOV #DEVNAM,R5 ;POINTER TO NON DIR DEV NAM BLOCK MOV (R4),(R5) ;PUT IN THE DEVICE NAME MOV R4,R2 ;RESET PTR TO START OF EXPANDED ENTRY JSR PC,GETDIR ;GET THE FIRST BLOCK OF THE DIRECTORY EXPNDB: MOV R0,-(SP) ;SAVE NEXT BLOCK EXPNDL: BIT (R5),#DIREOB ;IS IT THE END OF BLOCK ?? BEQ NOEOB ;NO, CHECK FOR PERM MOV (SP)+,R0 ;IS THIS THE LAST DIR BLOCK ?? BEQ INFCNT ;YES, END OF EXPANSION JSR PC,RDDIR ;READ NEXT DIRECTORY BLOCK BR EXPNDB ;CONTINUE EXPANSION NOEOB: BIT (R5)+,#DIRPRM ;IS IT A PERM FILE ?? BEQ NOMACH ;NOT UNLESS THIS BIT IS SET TSTB R3 ;WAS THE NAME STARRED ?? BMI NMATCH ;YES, DON'T CARE ABOUT THE NAME CMP (R5),2(R4) ;NO STAR, DOES NAME MATCH ?? BNE NOMACH ;NO CMP 2(R5),4(R4) ;CHECK BOTH WORDS OF THE NAME BNE NOMACH NMATCH: TST R3 ;WAS THE EXTENSION STARRED ?? BMI EMATCH ;YES, DON'T CARE ABOUT THE EXTENSION CMP 4(R5),6(R4) ;NO STAR, DOES EXTENSION MATCH ?? BNE NOMACH ;NO EMATCH: TST CURRNT ;SHOULD WE INCLUDE ONLY TODAY'S? BEQ 2$ ;NO CMP 12(R5),TODAY ;DOES DATE MATCH TODAY'S? BNE NOMACH ;NO-DON'T INCLUDE IT 2$: TST QUERY ;SHOULD WE VERIFY THIS FILE ? BEQ 1$ ;NO JSR PC,FNAML ;LIST FILE NAME SUB #6,R5 ;FIX R5 MESSAGE <"?"> JSR PC,YESCHK ;IS IT YES ? BNE NOMACH ;NOPE 1$: MOV (R4),(R2)+ ;THIS FILE MATCHES, COPY INTO EXP LIST MOV (R5),(R2)+ ;COPY MATCHING FILE NAME MOV 2(R5),(R2)+ MOV 4(R5),(R2)+ ;INTO EXPANDED LIST NOMACH: ADD #DIRESZ-2,R5 ;BUMP R5 TO NEXT FILE ENTRY ADD (PC)+,R5 ;DON'T FORGET EXTRA WORDS XTRABY: 0 BR EXPNDL ;LOOK AT NEXT FILE NAME .IF NDF MBUILD .SBTTL DELETE DELETE: TST (R4) ;ANY OUTPUT FILES SPECIFIED? BEQ 1$ ;NO-COMMAND OK JMP ILLCMD ;YES-ILLEGAL /D COMMAND SYNTAX 1$: TST (R5) ;NULL INPUT LIST? BEQ FNF ;YES-GIVE FNF ERROR 2$: TST (R5) ;ANY FILES LEFT TO DELETE ?? BEQ STL1V ;NO, DO NEXT PIP COMMAND MOV R5,R0 ;POINTER TO NEXT FILE DESCRIPTOR ADD #10,R5 ;BUMP INPUT LIST POINTER JSR PC,SYSCHK ;CHECK FOR SPECIAL EXTENSIONS BEQ 2$ ;DON'T DELETE .BAD OR .SYS WITHOUT /S JSR PC,TSTNUM ;GET CONTENTS OF FILENO INTO XTRA ARG EMT ^O375 ;DELETE VERSION 2 (CODE 0) BCC 2$ ;OK, DO NEXT ONE .ENDC FNF: ERROR ;TSTNUM ENTERS THE /M SWITCH ARGUMENT FOR LOOKUP, ENTER, AND DELETE ;IT ALSO SETS UP THE VERSION 2 ARG LIST. TSTNUM: MOV R0,-(SP) ;SAVE POINTER TO FILE NAME MOV #FBLOCK,R0 ;POINT TO AREA MOV FILENO,@R0 ;INSET FILE COUNT (-0 IF /M NOT GIVEN) MOV @R0,-(R0) ;BOTH FBLOCK AND FLEN MOV (SP)+,-(R0) ;POINT TO FILE NAME CLR -(R0) ;CHANNEL 0,CODE 0 RTS PC .SBTTL RENAME RENAME: TST (R5) ;NULL INPUT LIST? BEQ FNF ;YES-REPORT ERROR 1$: TST (R5) ;ANY MORE FILES TO RENAME ?? BEQ STL1V ;NO, RETURN TO PIP MOV R5,R0 ;PT R0 TO FILE JSR PC,MTCA ;IF MT OR CT, BR ILLREN ;DISALLOW RENAME EVEN THO MONITR WILL, TOO CMP (R4),(R5) ;ARE DEVICES THE SAME ??? BNE ILLREN ;NO, PROBABLY AN ERROR JSR PC,OEXPND ;EXPAND NEXT OUTPUT FILE NAME MOV #OLNAME,R0 ;POINT TO OLD NAME MOV (R5)+,(R0)+ ;MOVE 4 WORDS OF OLD NAME INTO LIST MOV (R5)+,(R0)+ MOV (R5)+,(R0)+ MOV (R5)+,(R0)+ MOV #OLNAME,R0 ;RESTORE POINTER TO OLD NAME JSR PC,SYSCHK ;CHECK FOR PROTECTED FILES BEQ 1$ ;.SYS OR .BAD FILE .RENAME 0 ;DO THE RENAME .IF DF MBUILD JSR PC,FATERR ;CHECK TO SEE IF FATAL ERROR .ENDC BCC 1$ ;CONTINUE IF FILE FOUND BR FNF ;ELSE FILE NOT FOUND ERROR ILLREN: ERROR STL1V: JMP START ;BACK TO PIP .SBTTL REBOOT REBOOT: JMP REBOT ;CALL REBOOT OVERLAY .SBTTL COPY EOF = 20000 ;EOF BIT IN CSW HDW = 1 ;HARD ERR BIT IN CSW COPY: MOV R2,-(SP) ;SAVE START ADDRESS OF FREE CORE TST (R5) ;NULL INPUT LIST? BNE ONE$ ;NO JMP FNF ;YES-REPORT ERROR ONE$: TST (R5) ;ANY MORE INPUT FILES TO OPEN ?? BEQ TWO$ ;NOPE, ALL OPENED AND SAVED JSR PC,CORCHK ;INSURE ENUF ROOM FOR SAVESTAT OR FOR ;### ;MT/CT FILENAME ;### MOV R5,R0 ;GET DEVICE NAME PTR JSR PC,MTCA ;IF MAGTAPE OR CASSETTE, BR DOMC ;GO COPY FILE NAME JSR PC,LOOKUP ;ELSE, LOOKUP THIS FILE MOV R2,R0 ;PUT STATUS BLOCK IN FREE CORE ADD #12,R2 ;FIVE WORDS EACH .SAVEST 0 ;SAVE THE FILE STATUS BR ONE$ ;DO NEXT ONE DOMC: MOV (R5)+,(R2)+ ;MOVE INPUT LIST TO CORE BLOCK MOV (R5)+,(R2)+ ;FOR MT AND CT INSTEAD OF STATUS BLOCK MOV (R5)+,(R2)+ MOV (R5)+,(R2)+ MOV #-1,(R2)+ ;SET LAST WORD NEG. TO INDICATE MT OR CA BR ONE$ ;THEN GET NEXT INPUT ELEMENT TWO$: CLR (R2)+ ;MARK END OF LIST FOR COMBINE COPY JSR PC,DFNBUF ;DEFINE BUFFER(S) ABOVE INPUT STATII MOV INFILS,R5 ;RESET POINTER TO INPUT LIST MCSTRT: MOV (SP),R2 ;RESET POINTER TO STATUS BLOCKS TST XMODE ;IS IT A MULTI-COPY ?? BNE ENTR15 ;YES, ENTER UP TO 15 AT A TIME CLR (R5) ;PREVENT JMP MCSTRT AFTER CLOSE OUT FILE MOV R4,R0 ;PREPARE TO ENTER OUTPUT FILE (ONLY 1) MOV OUCHAN,LCHAN ;SAVE # OF OUTPUT CHANNEL JSR PC,ENTER ;DO IT BNE DOCOMB ;OK, GO DO THE COMBINE COPY STLNK1: JMP START ;.SYS OR .BAD, BACK TO START ENTR15: MOV #15,OUCHAN ;ENTER UP TO 14 AT A TIME 6$: TST (R5) ;ANY INPUT FILES LEFT ?? BEQ 7$ ;NO, GO MOVE WHAT WE HAVE JSR PC,OEXPND ;GET NEXT OUTPUT FILE NAME MOV R5,R0 ;SAVE DEV NAME PTR FOR MTCA BELOW ADD #10,R5 ;MOVE POINTER TO NEXT INPUT FILE MOV 4(R2),(R3) ;SAME SIZE AS INPUT (OR LESS) JSR PC,MTCA ;IS INPUT FROM MT OR CT? CLR (R3) ;IF SO,WE MUST DO 0 LENGTH ENTER ADD #12,R2 ;BUMP STATUS BLOCK POINTER MOV #NEWNAM,R0 ;PREPARE TO ENTER THIS FILE JSR PC,ENTER ;ENTER THE FILE MOV #NEWNAM,R0 ;POINT TO OUTPUT DEVICE NAME AGAIN JSR PC,MTCA ;AND IF MT OR CA, BR 7$ ;DO NO MORE ENTERS TST -2(R2) ;IS INPUT FILE MT OR CA? BMI 7$ ;YES-DO NO MORE ENTERS ;IF MT OR CA IS INVOLVED IN EITHER SIDE OF TRANSFER,END THIS BATCH OF ;ENTERS,BECAUSE ONLY ONE FILE CAN BE TRANSFERRED AT A TIME DEC OUCHAN ;ELSE, ANY CHANNELS LEFT? BPL 6$ ;IF SO, ENTER ANOTHER FILE 7$: MOV OUCHAN,LCHAN ;SAVE NUMBER OF LAST ENTERED CHANNEL MOV #15,OUCHAN ;ELSE, PREPARE TO COPY 14 FILES MCLOOP: MOV OUCHAN,WAITN ;COPY CURRENT OUTPUT CHANNEL NUMBER ADD (PC)+,(PC) ;MAKE IT A WAIT AND EXECUTE IT .WAIT 1 WAITN: HALT BCS NOMC ;NO FILE ENTERRED HERE DOCOMB: CLR OUBLK ;ZERO OUTPUT FILE BLOCK NUMBER MOV OUBUF,R2 ;INITIALIZE WRITEC COMBIN: MOV (SP),R0 ;POINTER TO STATUS OF INPUT FILE TST (R0) ;IS STATUS WORD 0 BEQ DOCLOS ;YES, END OF COMBINE COPY TST 10(R0) ;IF LAST WORD OF BLOCK<0, BMI MTORCA ;THEN DO THE MT OR CA LOOKUP NOW .REOPEN 0 ;ELSE, RE-OPEN THE INPUT FILE BR MNORC MTORCA: MOV R5,-(SP) ;SAVE R5 AROUND LOOKUP SUBROUTINE MOV R0,R5 ;R0 POINTS TO ELEMENT IN CORE BLOCK JSR PC,LOOKUP ;LOOKUP LOOKS UP ELEMENT PT'D TO BY R5 MOV (SP)+,R5 ;RESTORE R5 MNORC: CLR INBLK ;ZERO INPUT FILE BLOCK NUMBER .IF NDF MBUILD CLR INBUFE ;INITIALIZE READC AND READB TST FBIN ;FORMATTED BINARY BNE BMCOPY ;YES TST ASCII ;WAS IT /A ?? BEQ IMCOPY ;NO, COPY IN IMAGE MODE 12$: JSR PC,READC ;READ A CHAR BEQ MCEOF ;END OF INPUT FILE JSR PC,WRITEC ;WRITE CHAR BR 12$ ;DO NEXT CHAR .IFF BR IMCOPY ;COPY IN IMAGE MODE .ENDC IMLOOP: JSR PC,WRITE ;WRITE THE BUFFER LOAD BCS 1$ ;GOT A REPORTED ERR. THIS TIME MOV OUCHAN,R0 ;SEE IF ERR UNREPORTED INC R0 MOV R0,-(SP) ASL R0 ASL R0 ADD (SP)+,R0 ;POINT R0 TO CSW FOR THIS WRITE ASL R0 ;MAKE IT BYTES CMP (R0)+,(R0)+ ADD @#SYSPTR,R0 BIT #EOF+HDW,(R0) BEQ IMCOPY 1$: JMP OUTER ;OUTPUT ERRORS IMCOPY: JSR PC,READ ;READ A BUFFER LOAD BNE IMLOOP ;NO EOF, DON'T QUIT MCEOF: .CLOSE 0 ;CLOSE THE INPUT FILE ADD #12,(SP) ;BUMP STATUS BLOCK POINTER TST XMODE ;IS IT A COMBINE COPY ?? BEQ COMBIN ;YES, APPEND NEXT INPUT FILE DOCLOS: .IF NDF MBUILD MOV ASCII,-(SP) ;IF IT IS NEITHER ASCII BIS FBIN,(SP)+ ; NOR FORMATTED BINARY BEQ NOFILL ; THEN DO NOT FILL BUFFER JSR PC,FILBUF ;FILL END OF BUFFER WITH NULLS .ENDC NOFILL: MOV #NEWNAM,R0 ;POINTER TO DEVICE NAME IN R0 JSR PC,MTCA ;SEE IF MT OR CA BR 1$ ;IF SO,ONLY ONE FILE IS OPEN AT A TIME MOV (SP),R0 ;IF INPUT FILE IS MT OR CA AS WELL, TST -(R0) ;ONLY ONE FILE WILL BE OPEN AT A TIME BMI 1$ DEC OUCHAN ;GO DOWN ONE CHANNEL BPL MCLOOP ;IF MORE TO DO, TRY ANOTHER XFER 1$: MOV (PC)+,R2 ;SETUP .CLOSE IMAGE .CLOSE 0 18$: MOV R2,(PC) ;MOV INSTRUCTION AND EXECUTE IT HALT INC R2 ;BUMP CLOSE CHANNEL NUMBER CMP R2,(PC)+ ;IS IT DONE ?? .CLOSE 17 BNE 18$ ;NO, KEEP CLOSING TST (R5) ;ANY MORE FILES AT ALL ?? BEQ STLNK5 ;NO-BACK TO PIP JMP MCSTRT ;YES-DO NEXT BATCH NOMC: ADD #12,(SP) ;BUMP INPUT LIST POINTER BR NOFILL .IF NDF MBUILD BMCOPY: MOV R4,R4SAV ;SAVE R4 MOV #FIRSTBY,R4 21$: JSR PC,READB ;READ FORMATTED BINARY BEQ 22$ ;END OF FILE JSR PC,WRITEC ;WRITE A CHARACTER BR 21$ ;AGAIN 22$: MOV (PC)+,R4 ;RESTORE R4 R4SAV: .WORD 0 BR MCEOF .ENDC ;MTCA TESTS FOR UNIT NAME POINTED TO BY R0 MAGTAPE OR CASSETTE. IF SO, ;IT RETURNS TO LOCATION FOLLOWING CALL. IF NOT, IT RETURNS TO LOCATION +2. ;THUS MOV NAMADR,R0 ; JSR PC,MTCA ; BR MTORCA ; BR NOTMTORCA MTCA: .DSTATU #DEVINF ;GET STATUS OF THIS DEVICE MTCA1: MOV #DEVINF,R0 ;POINT R0 TO STATUS WORD CMPB @R0,#TMIDEN ;TM11 MAGTAPE ? BEQ 1$ CMPB @R0,#TJIDEN ;TJU16 MAGTAPE? BEQ 1$ ;YES CMPB @R0,#CTIDEN ;TA11 CASSETTE? BEQ 1$ ADD #2,(SP) ;IF NOT, BUMP RETURN 1$: RTS PC STLNK5: JMP START .SBTTL DIRECTORY FASDIR: MOV SP,(PC)+ ;ONLY GIVE FILE NAMES NOINFO: .WORD 0 BR DIRECT FULDIR: MOV SP,(PC)+ ;LIST EMPTIES AND THEIR SIZES EMPTY: .WORD 0 DIRECT: INC (PC)+ ;SET DIRECTORY LISTING IN PROGRESS FLAG DIRFLG: 0 ADD #10,R2 ;MAKE ROOM FOR POSSIBLE EXTRA ENTRY MOV R5,DEVSAV ;REMEMBER THE DEVICE POINTER MOV R5,R0 ;SAVE POINTER FOR FETCH TST (R5) ;IS INPUT DEVICE SPECIFIED? BNE 1$ ;YES, USE WHAT HE SPECIFIED TST FILDES+36 ;IS THIS /L OR NULL EXPANDED LIST? BEQ 4$ ;JUST /L MOV FILDES+36,(R5)+ ;REMEMBER INPUT DEVICE (DEGENERATE CASE) BR 2$ 4$: MOV (PC)+,(R5)+ ;AND PUT IN THE DK: .RAD50 /DK / .FETCH R2 ;MAKE SURE DK HANDLER IS IN CORE BCC 2$ ;BOGUS DEVICE ASSIGNED TO DK? JMP HANERR ;GIVE AN ERROR IF SO 2$: MOV R0,R2 ;GOOD, RESET AVAILABLE CORE CLR (R5) ;CLEAR TARGET FILE NAME CLR 6(R5) ;AND MARK END OF LIST 1$: JSR PC,DFNBUF ;DEFINE OUTPUT BUFFERS CMP (R4),(PC)+ ;IS OUTPUT DEVICE TT: ?? .RAD50 "TT " BNE 3$ ;NO, ENTER DIRECTORY FILE CLR (R4) ;YES, MAKE IT 0 3$: MOV (R4),DIRDES ;ENABLE LISTING ON DEVICE MOV R4,R0 ;POINTER TO OUTPUT FILE NAME JSR PC,ENTER ;ENTER DIR FILE MOV #DEVNAM,R5 ;POINTER TO DEVICE NAME BLOCK MOV @INFILS,(R5) ;PUT IN THE DEVICE NAME JSR PC,GETDIR ;START DIRECTORY STUFF MOV R0,-(SP) ;SAVE NEXT BLOCK MOV R5,-(SP) ;SAVE DIR PTR MOV -(R5),DEVLOC ;SAVE START BLOCK OF SEGMENT TST NOINFO ;SUPPRESS DATE ON FAST DIRECTORY BNE DIRLUP MOV TODAY,R3 ;GET TODAY'S DATE INTO R3 JSR PC,DATOUT ;PRINT THE DATE AND A CRLF NXTLIN: JSR PC,CRLF DIRLUP: MOV (SP),R5 ;BUMP R5 TO THE NEXT ENTRY ADD XTRABY,(SP) ;COMPUTE ADDR OF NEXT ENTRY ADD #DIRESZ,(SP) MOV INFILS,R0 ;POINTER TO TARGET LIST BIT @R5,#DIREOB ;IS IT END OF BLOCK ? BNE ENDBLK ;YES ADD 10(R5),DEVLOC ;UPDATE POSITION ON DEVICE BIT (R5)+,#DIRPRM ;IS THIS A PERM FILE ?? BNE TARG1 ;YES, SEE IF ITS A TARGET ADD 6(R5),FBLOKS ;ADD TO NUMBER OF FREE BLOCKS TST EMPTY ;WAS IT /E ?? BEQ DIRLUP ;NO, DON'T PRINT EMPTIES MESSAGE <"< UNUSED > "> ;PRINT THE UNUSED MESSAGE MOV 6(R5),R0 ;GET SIZE OF EMPTY JSR PC,R10OVT ;OUTPUT DECIMAL BR NXTLIN ;PRINT CRLF AND CONTINUE TARGCK: CMP (R5),(R0)+ ;DOES IT MATCH THIS TARGET FILE ? BNE 1$ ;NO CMP 2(R5),(R0) BNE 1$ CMP 4(R5),2(R0) BEQ TARGET ;A HIT ! 1$: CMP (R0)+,(R0)+ ;ADVANCE TO NEXT IN TARGET LIST TARG1: TST (R0)+ ;END OF LIST ? BNE TARGCK ;NO, CONTINUE TST FILDES+40 ;PRINT IT ANYWAY ? BNE DIRLUP ;NOPE TARGET: TST CURRNT ;SHOULD WE INCLUDE ONLY TODAY'S? BEQ 8$ ;NO CMP 12(R5),TODAY ;DOES THIS DATE MATCH TODAY'S? BNE DIRLUP ;NO-DON'T INCLUDE IT 8$: INC NFILS ;BUMP HIT COUNTER JSR PC,FNAML ;LIST FILE NAME ADD (R5),NBLOX ;BUMP BLOCK CTR TST NOINFO ;WAS IT /F ?? BNE NXTLIN ;YES, NO SIZE OR DATE MESSAGE <" "> ;PRINT A SPACE MOV (R5)+,R0 ;GET MAX SIZE JSR PC,R10OVT ;OUTPUT DECIMAL MESSAGE <" "> ;PRINT A SPACE TST (R5)+ ;ADVANCE TO DATE WORD MOV (R5),R3 ;GET DATE WORD JSR PC,DATOUT ;PRINT DATE .IF NDF MBUILD TST ALLDIR ;START BLK & EXTRAS? BEQ NXTLIN ;NOPE TST (R5)+ ;WAS DATE = 0 ? BNE 10$ ;NO MOV #9.,R1 ;PRINT 9 SPACES 9$: MESSAGE <" "> DEC R1 BNE 9$ 10$: MOV DEVLOC,R0 ;GET STARTING BLOCK SUB -6(R5),R0 ;FIX UP DEVICE BLOCK # 11$: JSR PC,R8OUT ;PRHNT IT OCTAL CMP R5,(SP) ;DONE LAST EXTRA WORD ? BHIS NXTLIN ;YES MOV (R5)+,R0 ;GET AN EXTRA WORD BR 11$ ;PRINT IT .IFF BR NXTLIN ;DO NEXT LINE .ENDC ENDBLK: TST (SP)+ ;REMOVE R5 THING FROM STACK MOV (SP)+,R0 ;GET REL PTR TO NEXT DIR BLK BEQ ENDDIR ;IF ZERO, END OF THIS DIRECTORY JSR PC,RDDIR ;READ NEXT DIR SEGMENT MOV R0,-(SP) ;SAVE NEXT BLOCK # MOV R5,-(SP) ;AND DIR PTR MOV -(R5),(PC)+ ;SAVE START POSITION DEVLOC: 0 MOV FILDES+40,-(SP) ;INTER-BLOCK GAP ? BIS CURRNT,(SP)+ ; OR /C? BNE DIRLUP ;NO MOV DEVSAV,R0 JSR PC,MTCA ;IS THIS MT OR CT? BR DIRLUP ;YES-NO BLANK LINES BR NXTLIN ;PRINT BLANK LINE TO MARK NEW SEGMENT ENDDIR: TST NOINFO ;IS IT FAST ? BNE ENDLST ;YES, NO FREE BLOCK MSG MOV (PC)+,R0 ;GET FILE COUNT NFILS: 0 CMP R0,#1 ;IS IT WORTH IT ? BLOS LSTFRE ;NO CLR R3 ;LEFT JUSTIFY IT JSR PC,R10CNV ;YES, LIST IT MESSAGE <" FILES, "> MOV (PC)+,R0 ;GET BLOCK COUNT NBLOX: 0 JSR PC,R10CNV ;PRINT IT MESSAGE <" BLOCKS"<015><012>> LSTFRE: MOV (PC)+,R0 ;NAME OF DEVICE BEING LISTED INTO R0 DEVSAV: 0 JSR PC,MTCA ;MT OR CT? BR ENDLST ;YES-DONT PRINT FREE BLOCK MESSAGE MOV (PC)+,R0 ;GET TOTAL NUMBER OF UNUSED BLOCKS FBLOKS: 0 JSR PC,R10OVT ;OUTPUT THE FREE BLOCKS MESSAGE MESSAGE <" FREE BLOCKS"<015><012>> ENDLST: .IF NDF MBUILD TST DIRDES ;WAS OUTPUT DEVICE TT: ?? BEQ STLNK2 ;YES, NO BUFFER TO DUMP JSR PC,FILBUF ;FILL THE BUFFER WITH NULLS .CLOSE 1 ;CLOSE THE FILE .ENDC STLNK2: JMP START ;DO NEXT PIP COMMAND .SBTTL ZERO DIRECTORY ZEROD: CMP DIRSIZ,#NLIMIT ;DID HE SPECIFY A /N SRG TOO LARGE? BHI ILLCMD ;YES-ERROR MOV (R5),R0 ;ANY DEVICE GIVEN ?? BEQ ILLCMD ;NO,BAD COMMAND TST 2(R5) ;IS A FILE NAME GIVEN BNE ILLCMD ;YES-THIS MUST BE A MISTAKE JSR PC,R50OUT ;OUTPUT THE DEVICE NAME MESSAGE <":/Z ARE YOU SURE ?"> JSR PC,YESCHK ;TRY FOR A "Y" BNE STLNK2 ;NO, DON'T ZERO MOV R5,R0 ;GET PTR TO FILE NAME JSR PC,MTCA ;IF MT OR CA, BR DODEL ;INITIALIZE VOLUME JSR PC,OPNDIR ;ELSE, OPEN THE DIRECTORY FOR WRITING .REOPEN 1 ;ON CHANNEL 1 ZERIT: MOV USRBUF,R4 ;USE USR'S DIR BUFFER MOV DIRSIZ,R5 ;DIRECTORY SIZE IN SEGMENTS (/N:XXXX) BNE 1$ ;IF NOT ZERO, OK MOV #4,R5 ;OTHERWISE MAKE IT 4 SEGMENTS 1$: MOV R5,(R4)+ ;THATS FIRST WORD OF THE DIRECTORY ASL R5 ;MAKE IT A BLOCK COUNT CLR (R4)+ ;ZERO LINK TO NEXT SEGMENT MOV ZXTRA,R3 ;GET NUMBER OF EXTRA WORDS (/Z:XXXX) ASL R3 ;MAKE IT THE EXTRA BYTE COUNT MOV #1,R0 ;SET UP DIRECTORY SEGMENT NUMBER MOV R0,(R4)+ ;SET INITIAL HIGHEST SEGMENT = 1 MOV R3,(R4)+ ;NUMBER OF XTRA BYTES INTO DIR HEADER ADD #DIRBLK,R5 ;GIVES TOTAL NUMBER BLOCKS USED MOV R5,(R4)+ ;WHICH IS ALSO START BLOCK OF FILES MOV R3,XTRABY ;SAVE IT MOV DEVINF+6,R1 ;GET THE TOTAL SIZE OF THE DEVICE SUB R5,R1 ;MINUS THE AMOUNT USED BY DIR JSR PC,MAKEMT ;CREATE THE EMPTY MOV #DIREOB,(R4)+ ;PUT IN THE END OF BLOCK MARKER JSR PC,DIRWR ;WRITE OUT THE DIRECTORY IN SEG 1 CLR R0 ;BLOCK # IS 0 .WRITW 1,#BTMSGP,#400 ;WRITE DUMMY BOOTSTRAP ON BLK 0 .IF NDF MBUILD BCC 2$ ;BRANCH IF NO ERROR .IFF BCC STLNK2 ;BACK TO CSI .ENDC 3$: JMP OUTER ;PRINT ?OUT ER? MESSAGE .IF NDF MBUILD 2$: CMPB DEVINF,#DXIDEN ;IS THIS RX11/RX01 FLOPPY DISK? BNE STLNK2 ;BRANCH IF NOT TO RESTART PIP MOV #DXAREA,R0 ;ELSE DO SPFUN REQUEST EMT 375 ;TO WRITE VOL ID IN TRACK 0,SECTOR 7 BCS 3$ ;BRANCH IF HARDWARE ERROR BR STLNK2 ;BACK TO PIP .ENDC ILLCMD: ERROR .IF NDF MBUILD ;ARGUMENT AREA FOR FLOPPY INIT SPFUN REQUEST DXAREA: .BYTE 1,32 ;CHANNEL 1,SPFUN REQ 7 ;SECTOR 7 DXBUFF ;ADDRESS OF BUFFER TO BE WRITTEN 0 ;TRACK 0 .BYTE 377,376 ;SECTOR WRITE COMMAND 0 ;WAIT FOR COMPLETION ;BUFFER USED TO WRITE FLOPPY VOL ID. ONLY FIRST 4 BYTES ;ARE SIGNIFICANT DXBUFF: .WORD 0 ;SPFUN USES FIRST WORD FOR DD FLAG .ASCII /RT11/ .ENDC ;********************************************************* ;DUMMY BOOT WRITTEN INTO BLOCK 0 OF ALL DEVICES PROPERLY ZEROED TPB = 177566 TPS = 177564 BTMSGP: NOP ;ALL BOOTS START WITH NOP CHECK MOV #BTMSG-BTMSGP,R0 1$: TSTB @#TPS BPL 1$ 2$: MOVB (R0)+,@#TPB BPL 1$ BR . BTMSG: .BYTE 0,0,15,12,0,0,0,0,0,0,0,0,0,0 .ASCII /?B-NO BOOT ON VOLUME/ .BYTE 15,12,200 .EVEN ;********************************************************* .IF NDF MBUILD DODEL: .DELETE 16,R5 ;ZERO TAPE BCC 1$ ;IF NO ERROR 2$: JMP ERRWRD ;OTHERWISE REPORT DIR ERROR 1$: .CLOSE 0 ;MAKE SURE CHANNEL 0 CLOSED .LOOKUP 0,R5 ;LOOKUP MT OR CT BCS 2$ ;STRANGE LOOKUP ERROR JSR R5,SPFUN ;REWIND TAPE .BYTE 377,-5 JSR PC,SKPVL1 ;IF MT,SKIP VOL1 1 LABEL STLNK4: JMP START .IFF DODEL: JMP HANERR ;IILLEGAL FOR MBUILD TO ZERO MT .ENDC ;SUBROUTINE SKPVL1 ;IF DEVICE LAST DSTATUSED INTO DEVINF IS MT,ISSUES A ;SPFUN CALL TO SPACE FORWARD 1 BLOCK SKPVL1: CMPB DEVINF,#TMIDEN ;TM11 MAGTAPE? BEQ 2$ ;YES CMPB DEVINF,#TJIDEN ;TJU16 MAGTAPE? BNE 1$ ;NO-DONE 2$: JSR R5,SPFUN1 ;YES-SPACE OVER VOL1 LABEL .BYTE 377,-2 ;SPACE 1 BLOCK JSR PC,LOCK ;LOCK USR MOV R5,-(SP) ;SAVE R5 MOV USRBUF,R5 ;POINT R5 TO USR BUFFER .READW 0,R5,#400 ;READ BLOCK FOLLOWING VOL1 BCC 4$ ;NO ERROR JMP BADDIR ;REPORT READ ERROR 4$: CMP (R5),#240 ;WAS IT BOOT BLOCK? BEQ 3$ ;MUST BE BOOT BLOCK:POSITION AFTER IT JSR R5,SPFUN1 ;NO-BACKUP AND POSITION BEFORE IT .BYTE 377,-3 ;BACKSPACE ONE BLOCK 3$: MOV (SP)+,R5 ;RESTORE R5 1$: RTS PC ;RETURN .IF NDF MBUILD .SBTTL BAD BLOCK SCAN BLKSCN: TST (R5) ;ANY DEVICE GIVEN? ILLCM2: BEQ ILLCMD ;NO-ERROR TST 2(R5) ;IS FILE NAME GIVEN? ILLCM1: BNE ILLCMD ;YES-PROBABLY A MISTAKE .DSTATU #OLNAME,R5 ;GET DEVICE STATUS INFO TST OLNAME ;IS DEVICE FILE STRUCTURED? BPL ILLCMD ;NO-THIS IS A MISTAKE .LOOKUP 1,R5 ;LOOKUP DEVICE BCC BLKSC1 HANER2: JMP HANERR ;SHOULD NEVER GET HERE BLKSC1: CLR R5 ;R5 IS BLOCK # MOV OLNAME+6,R4 ;R4 IS BLOCK COUNT FOR DEVICE 3$: .READW 1,R2,#400,R5 ;READ A BLOCK INTO FREE CORE BCC 2$ ;NO ERROR ;ERROR CLR DIRDES ;MAKE OUTPUT GO TO TTY MESSAGE <"BLOCK"> MOV R5,R0 ;COPY BLOCK # INTO R0 JSR PC,R8OUT ;PRINT BLOCK # MESSAGE <" IS BAD"<015><012>> 2$: INC R5 ;BUMP BLOCK # DEC R4 ;DECREASE BLOCK COUNT BEQ STLNK4 ;IF ZERO,WE ARE ALL DONE BR 3$ ;AND LOOP .SBTTL COMPRESS COMPRS: JSR PC,FGCHK ;MAKE SURE NO F JOB ACTIVE TST (R5) ;ANY INPUT FILE ?? BEQ ILLCM2 ;NO, BAD COMMAND CMP DIRSIZ,#NLIMIT ;IS ARG TO /N TOO LARGE? BHI ILLCM1 ;YES-BAD COMMAND MOV R5,R0 ;PT R0 TO FILE JSR PC,MTCA ;ON MT OR CA, BR HANER2 ;DISALLOW SCRUNCH JSR PC,LOCK ;LOCK USR IN CORE MOV R4,R0 ;SET TO CHECK OUTPUT DEVICE TST (R4) ;WAS OUTPUT DEVICE GIVEN ? BEQ 1$ ;NO. IT IS A 1-DEVICE SQUISH CMP (R4),(R5) ;IS OUT DEV = IN DEV ? BNE 2$ ;NO. IT IS A 2-DEVICE SQUISH CLR (R4) ;SET 1-DEVICE FLAG 1$: DEC IGNORE ;SET /G IF NOT SET ALREADY MOV R5,R0 ;SET TO CHECK INPUT DEVICE 2$: JSR PC,SYSALL ;CHECK FOR SYSTEMS DEVICE COM OUCHAN ;WRITE ON CHANNEL 0 CLR ASCII ;DON'T WANT SPLIT BUFFERS CLR FBIN ;DON'T SPLIT BUFFERS JSR PC,DFNBUF ;DEFINE BUFFERS MOV SP,@NOCTLC ;DISABLE CTRL/C FOR COMPRESS MOV R5,R2 MOV R4,(PC)+ ;SAVE OUTPUT DEVICE NAME OUTDEV: 0 TST (R4) ;2 DEVICE TRANSFER? BNE DOSQ ;YES: IGNORE REARRANGING DIRECTORY CMP R0,#1024. ;MUST HAVE AT LEAST THREE BUFFERS BHIS 10$ ; TO WORK WITH. JMP COROVR ;NO CORE AVAILABLE 10$: MOV #TBUFF,R1 ;SCAN DIRECTORY TO DETERMINE ORDER OF ;DIRECTORY SEGMENTS. JSR PC,GETDIR ;READ IN 1ST DIRECTORY SEGMENT MOVB #1,(R1)+ ;HEAD OF THE LIST IS ALWAYS SEGMENT #1 1$: MOVB R0,(R1)+ ;SAVE LINK TO NEXT SEGMENT BEQ 2$ ;ZERO INDICATES LAST SEGMENT JSR PC,RDDIR ;READ IN NEXT DIRECTORY SEGMENT BR 1$ ;CONTINUE UNTIL LAST SEGMENT HAS BEEN ; READ IN. 2$: MOV #1,R3 ;BEGIN AT TOP OF TABLE 3$: TSTB TBUFF-1(R3) ;ZERO INDICATES END OF THE LIST BEQ DOSQ CMPB TBUFF-1(R3),R3 ;SEE IF ENTRY IS IN ITS CORRECT ; POSITION. BNE 4$ ;NO: SEE IF ITS ALREADY BEEN HANDLED THEN MOV R3,R0 ;READ IN SEGMENT, UPDATE LINKAGE JSR PC,RDDIR ; TO NEXT SEGMENT AND WRITE IT MOV USRBUF,R1 ; BACK OUT. (SKIP LAST SEGMENT THOUGH) TST 2(R1) BEQ 9$ MOV R3,2(R1) INC 2(R1) MOV R3,R0 JSR PC,DIRWR 9$: COMB TBUFF-1(R3) ;INDICATE THIS SEGMENT IS ALREADY IN THE BR 5$ ; RIGHT PLACE. 4$: TSTB TBUFF-1(R3) ;DO WE HAVE TO SAVE THE SEGMENT TO MAKE ; ROOM? BGT 6$ ;YES: SAVE BLOCK IN TEMPORARY AREA ; TO FREE UP A HOLE ON DISK. 5$: INC R3 ;NO: LOOK AT NEXT ENTRY IN LIST BR 3$ 6$: MOV R3,R0 ;SAVE THIS DIRECTORY SEGMENT IN A TEMPORARY ; AREA. THIS WILL FREE UP A ; HOLE ON THE DISK TO ALLOW THE ; SHUFFLING PROCESS TO BEGIN. MOV INBUF,R5 ;PUT THE SEGMENT HERE MOV @BLKEY,R1 ;SAVE '@BLKEY' SINCE THIS ISN'T GOING ; INTO THE USER'S BUFFER. JSR PC,REDDIR MOV R1,@BLKEY ;RESTORE SEGMENT NUMBER MOVB R3,SAVBLK ;SAVE NUMBER OF SAVED SEGMENT 8$: MOVB TBUFF-1(R3),R0 ;TRANSFER SEGMENT TO CORRECT POSITION JSR PC,RDDIR MOV R3,R0 MOV USRBUF,R1 ;INSERT NEW SEGMENT # UNLESS ITS THE LAST ONE TST 2(R1) BEQ 11$ MOV R0,2(R1) INC 2(R1) 11$: JSR PC,DIRWR 7$: MOVB TBUFF-1(R3),R0 ;SAVE SEGMENT # WHICH WAS JUST TRANSFERRED COMB TBUFF-1(R3) ;INDICATE THIS SEGMENT IS DONE MOV R0,R3 ;SEE IF WE'RE AT THE SPOT WHERE CMPB TBUFF-1(R3),SAVBLK ; THE 'SAVED' BLOCK SHOULD GO? BNE 8$ ;NO: DO THE NEXT SEGMENT IN THIS ; SEQUENCE. MOV USRBUF,-(SP) ;TRANSFER SAVED BLOCK NOW FROM TEMPORARY MOV INBUF,R1 ; BUFFER. MOV R1,USRBUF ;INSERT NEW SEGMENT # UNLESS ITS THE LAST ONE TST 2(R1) BEQ 12$ MOV R3,2(R1) INC 2(R1) 12$: JSR PC,DIRWR MOV (SP)+,USRBUF COMB TBUFF-1(R3) ;INDICATE THIS SEGMENT HAS BEEN WRITTEN OUT BR 2$ ;RESCAN LIST AGAIN ; DOSQ: CLR R1 ;CLEAR UNUSED BLOCKS COUNT SUB #512.,BUFSIZ ;REMOVE A SEGMENT SIZE FROM THE CURRENT MOV INBUF,(PC)+ ; FREE BUFFER AREA. SECBUF: 0 ADD #1024.,INBUF ADD #1024.,OUBUF MOV R2,R5 JSR PC,GETDIR ;GET FIRST DIRECTORY BLOCK MOV -(R5),OUBLK ;BEGIN WRITING AT THIS BLOCK MOV R0,-(SP) ;SAVE LINK TO NEXT DIR BLOCK TST (R4) ;IS THERE A DIFFERENT OUTPUT DEV ? BEQ 3$ ;NO, JUST COMPRESS THIS DEVICE TO ITSELF MOV R5,-(SP) ;SAVE INPUT DIRECTORY POINTER MOV R4,R5 ;SETUP POINTER TO OUTPUT DEVICE JSR PC,OPNDIR ;SETUP CHKEY FOR OUTPUT DEVICE .REOPEN 1 ;OPEN THE OUTPUT DEVICE ON CHANNEL 1 MOV #1,@BLKEY ;INITIALIZE DIR SEGMENT IN CORE NUMBER CLR OUCHAN ;SETUP TO WRITE DIR ON CH. 1 MOV (SP)+,R5 ;RESTORE INPUT DIR POINTER MOV DIRSIZ,R0 ;GET NUMBER OF DIR BLOCKS WANTED BEQ 3$ ;NOT SPECIFIED, USE INPUT CMP R0,-10(R5) ;TOO FEW FOR INPUT ? BLOS 3$ ;YES, USE INPUT ASL R0 ;FIND FIRST OUTPUT BLOCK ADD #DIRBLK,R0 MOV R0,OUBLK ;AND SET UP NUMBER BR 4$ ;START THE SQUISH 3$: MOV -10(R5),DIRSIZ ;SET OUTPUT HIGHEST = INPUT HIGHEST 4$: MOV R5,R4 ;SETUP DIRECTORY WRITE POINTER MOV DIRSIZ,-10(R5) ;SET HIGHEST DIR SEGMENT MOV (R5)+,INBLK ;REMEMBER WHER FILES BEGIN ON OLD COPY MOV OUBLK,(R4)+ ;STORE NEW FILE BEGINNING BLOCK MOV R4,(PC)+ ;CALCULATE END OF USR BUFFER ENDUSR: 0 ADD #1024.-14,ENDUSR BR NXTDB ;ENTER COMPRESS LOOP ; READ NEXT DIRECTORY BLOCK, IF ANY, INTO CORE ; IF END OF DIRECTORY, SQUISH IS DONE NEXTDB: MOV (SP)+,R0 ;RELATIVE POINTER TO NEXT DIR BLOCK MOV SECBUF,R5 ;READ NEXT DIRECTORY BLOCK INTO 2ND DIRECTORY ; BUFFER. MOV @BLKEY,-(SP) ;SAVE TEMP JSR PC,REDDIR MOV (SP)+,@BLKEY ;RESTORE FOR OUTPUT'S USE TST -(R5) ;POINT TO FILE BEGINING WORD MOV R0,-(SP) ;SAVE LINK TO NEXT DIR BLOCK JSR PC,CKEND ;CHECK ROOM IN DIRECTORY BEFORE PUTTING ; ANOTHER ENTRY INTO IT. MOV (R5)+,INBLK ;BEGIN READING FROM THIS BLOCK NXTDB: CLR R3 ;CLEAR BLOCK TRANSFER COUNT NXTDN3: JSR PC,CKEND ;CHECK ROOM IN DIRECTORY BEFORE PUTTING ; ANOTHER ENTRY INTO IT. MOV 10(R5),-(SP) ;GET NUMBER OF BLOCKS IN THIS ENTRY BIT (R5),#DIRPRM ;IS IT A PERMANENT FILE ?? BEQ UNPERM ;NO CMP 6(R5),(PC)+ ;IS THE EXTENSION .BAD ?? .RAD50 "BAD" BNE NOTBAD ;NO, GENERAL CASE JSR PC,MOVFLS ;MOVE ANY FILES PREVIOUSLY PAST TST OUCHAN ;DV1:=DV2:/S ?? BEQ SKPBAD ;YES, TREAT .BAD LIKE UNUSED TST R1 ;IS THERE ANY EMPTY TO MAKE? BEQ 1$ ;NO, AVOID CLOBBERING A GOOD ENTRY JSR PC,MAKEMT ;GENERATE AN EMPTY 1$: ADD (SP),INBLK ;PUSH INPUT BLOCK POINTER OVER THE BAD CLR (SP) ;AND DON'T LET HIM BUMP TRANSFER COUNT MOV INBLK,OUBLK ;BEGIN WRITING AFTER .BAD FILE JSR PC,CKEND ;CHECK ROOM IN DIRECTORY BEFORE PUTTING ; ANOTHER ENTRY INTO IT. NOTBAD: MOV XTRABY,R0 ;NUMBER OF EXTRA BYTES PER ENTRY ASR R0 ;MAKE IT A WORD COUNT ADD #7,R0 ;NUMBER OF WORDS IN ENTRY TO MOVE 3$: MOV (R5)+,(R4)+ ;MOVE THE ENTRY DEC R0 BNE 3$ ADD (SP)+,R3 ;INCREMENT NUMBER OF BLOCKS IN TRANSFER BR NXTDN3 ;PROCESS NEXT ENTRY ; EMPTY DIRECTORY SLOT FOUND ; MOVE ANY CHUNK OF FILES FOUND SO FAR, ; THEN PUSH THE INPUT BLOCK POINTER PAST THE EMPTY ; AND SKIP OVER IT UNPERM: JSR PC,MOVFLS ;MOVE FILES ON ANY NON PERMANENT BIT (R5),#DIREOB ;IS IT THE END OF BLOCK BNE DBDONE ;YES ADD (SP),R1 ;INCREMENT NUMBER OF UNUSED BLOCKS SKPBAD: ADD (SP)+,INBLK ;INCREMENT READ POINTER BY UNUSED ADD #16,R5 ;SKIP REST OF THIS ENTRY ADD XTRABY,R5 BR NXTDN3 ; END OF DIRECTORY BLOCK ; EOB ENTRIES HAVE NO SIZE, SO THE SIZE IS PURGED FROM THE STACK ; IF THIS IS THE LAST SEGMENT, AN EMPTY ENTRY IS CREATED ; WHICH IS THE SIZE OF ALL ACCUMULATED FREE SPACE ; THE EOB MARKER IS MADE, AND THE SEGMENT IS WRITTEN DBDONE: TST (SP)+ ;PURGE ENTRY SIZE FROM STACK TST (SP) ;IS THIS THE LAST BLOCK ?? BNE NEXTDB ;NO, READ IN NEXT SEGMENT THEN MOV DEVINF+6,R1 ;GET TOTAL SIZE OF OUTPUT DEVICE SUB OUBLK,R1 ;MINUS THE NUMBER OF BLOCKS USED JSR PC,MAKEMT ;CREATE AN EMPTY OF THIS SIZE MOV #DIREOB,(R4) ;PUT IN EOB MARKER MOV USRBUF,R4 ;SHOW LAST SEGMENT IN CHAIN CLR 2(R4) JSR PC,WRDIR ;WRITE OUT THIS DIR BLOCK ; COMPRESS FINISHED, NOW FIX UP WORD 3 OF SEGMENT #1 TO CONTAIN ; THE HIGHEST ACTIVE SEGMENT # IN USE. MOV @BLKEY,R2 ;GET LAST SEGMENT # USED CLR @BLKEY CLR @CHKEY MOV OUTDEV,R5 TST (R5) ;TWO DEVICE SQUISH? BNE 1$ ;YES MOV #1,R0 ;NO: READ IN FIRST DIRECTORY SEGMENT JSR PC,RDDIR ; AGAIN. BR 2$ 1$: .CLOSE 0 ;CLOSE OUT CHAN #0 JSR PC,GETDIR ;GET THE FIRST DIRECTORY SEGMENT ; FROM OUTPUT CHANNEL. 2$: MOV USRBUF,R1 ;UPDATE HIGHEST ACTIVE SEGMENT # MOV R2,4(R1) JSR PC,WRDIR ;NOW WRITE IT BACK OUT JMP STLNK3 ;COMPRESS COMPLETE ; HERE WE MOVE A CHUNK OF FILES WHICH WERE FOUND BETWEEN EMPTIES ; IF IT IS A ONE-DEVICE SQUISH AND THE INPUT AND OUTPUT BLOCK NUMBERS ; ARE THE SAME, NO I/O IS DONE. ; OTHERWISE, THE BLOCKS ARE TRANSFERRED AS ONE BIG CHUNK MOVFLS: TST OUCHAN ;IS IT A TWO DEVICE COMPRESS ?? BEQ 2$ ;YES, COPY ALWAYS CMP INBLK,OUBLK ;ARE READ AND WRITE BLOCKS THE SAME ?? BNE 2$ ;NO, DO THE MOVE ADD R3,INBLK ;OTHERWISE JUST BUMP BLOCK NUMBERS ADD R3,OUBLK 1$: CLR R3 ;CLEAR BLOCK TRANSFER COUNT RTS PC 2$: TST R3 ;ANY MORE BLOCKS TO MOVE ? BLE 1$ ;NO MOV BUFSIZ,R0 ;SIZE OF BUFFER SWAB R0 ;MAKE IT A BLOCK COUNT SUB R0,R3 ;DOES IT ALL FIT IN CORE ?? BCC 3$ ADD R3,R0 ;YES, ONLY TRANSFER THAT AMOUNT 3$: SWAB R0 ;MAKE IT A WORD COUNT AGAIN JSR PC,READN ;READ N BLOCKS JSR PC,WRITE ;THEN WRITE THEM BCC 2$ ;OUT OF ROOM OR OUTPUT ERROR .PRINT #OUMES ;TELL HIM ABOUT AN OUTPUT ERROR TST OUCHAN ;ONE DEVICE SQUISH ? BNE 2$ ;YES, PUSH ONWARD CLR @BLKEY CLR DIRSIZ CLR ZXTRA JMP ZERIT ; CHECK ROOM IN DIRECTORY BLOCK BEFORE PUTTING ANOTHER ENTRY INTO IT. ; IF FULL, WRITE BLOCK OUT AND RESET WRITE BUFFER POINTERS. CKEND: MOV XTRABY,-(SP) ;MAKE SURE THERE'S ROOM FOR AN ADDITIONAL ENTRY ADD #16,(SP) ADD R4,(SP) CMP (SP)+,ENDUSR BLOS 1$ ;ROOM LEFT: RETURN ;NO: CLEAN UP THIS SEGMENT, WRITE IT ; OUT AND START ANOTHER ONE. JSR PC,MOVFLS ;MOVE FILES ACCUMULATED SO FAR MOV USRBUF,R0 ;INSERT LINKAGE TO NEXT SEGMENT MOV @BLKEY,R2 INC R2 MOV R2,2(R0) MOV #DIREOB,(R4) ;SET "END OF BLOCK" ID JSR PC,WRDIR ;WRITE OUT DIRECTORY SEGMENT MOV USRBUF,R4 ;RESET POINTER TO BEGINNING OF BLOCK ; TO START NEW SEGMENT. ADD #10,R4 ;UPDATE FILE STARTING BLOCK MOV OUBLK,(R4)+ INC @BLKEY ;SHOW THAT NEXT SEGMENT IS THE ONE WE'RE 1$: RTS PC ; GOING TO WORK ON NEXT. TBUFF: .BLKW 20 ;STORAGE AREA FOR MAP OF DIRECTORY ; SEGMENTS PRIOR TO SHUFFLING. SAVBLK = .-1 ;SAVED BLOCK NUMBER DURING SHUFFLING .SBTTL EXTEND EXTEND: TST (R4) ;IS THERE AN OUTPUT DEVICE BEQ STLNK3 ;NO MOV R4,R0 ;CHECK FOR .SYS AND .BAD JSR PC,SYSCHK ;DON'T EXTEND THEM WITHOUT /Y BEQ STLNK3 ;NO GOOD JSR PC,LOCK ;LOCK USR IN CORE MOV SP,@NOCTLC ;DISABLE CTL/C FOR EXTEND EXTTRY: COM OUCHAN ;PREPARE TO WRITE ON CHANNEL 0 MOV #DEVNAM,R5 ;OPEN DEVICE AS NON FILE STRUCTURED MOV (R4),(R5) ;PUT IN DEVICE NAME JSR PC,GETDIR ;GET FIRST DIRECTORY BLOCK MOV 10(R4),R1 ;DESIRED SIZE OF FILE BR LTSTEB ;BEGIN SEARCHING FOR FILE LOCATE: TST R0 ;IS THIS THE LAST DIR BLOCK ?? BEQ EXTNEW ;YES, CREATE FILE JSR PC,RDDIR ;READ NEXT DIRECTORY BLOCK BR LTSTEB ;BEGIN SEARCHING THIS BLOCK LSKP14: TST (R5)+ ;SKIP FIRST WORD OF NAME LSKP12: TST (R5)+ ;SKIP SECOND WORD OF NAME LSKP10: TST (R5)+ ;SKIP EXTENSION WORD LSKP6: ADD #6,R5 ;SKIP SIZE WORDS AND DATE ADD XTRABY,R5 ;SKIP EXTRA WORDS LTSTEB: BIT #DIREOB,(R5) ;IS THIS THE END OF BLOCK ?? BNE LOCATE ;YES, GET NEXT BLOCK BIT #DIRPRM,(R5)+ ;IS THIS A PERM FILE ?? BEQ LSKP14 ;NO, SKIP TO NEXT ENTRY CMP 2(R4),(R5)+ ;CHECK FIRST WORD OF NAME BNE LSKP12 ;NO MATCH CMP 4(R4),(R5)+ ;CHECK SECOND WORD BNE LSKP10 ;NO MATCH CMP 6(R4),(R5)+ ;CHECK EXTENSION BNE LSKP6 ;NO MATCH SUB (R5)+,R1 ;AMOUNT NEEDED BCS EXTNEG ;NEGATIVE EXTEND ?? MOV R5,-(SP) ;SAVE POSITION (IN CASE WE SWITCH MOV @BLKEY,-(SP) ; DIRECTORY BLOCKS) CMP (R5)+,(R5)+ ;SKIP DATA SIZE AND DATE ADD XTRABY,R5 ;SKIP XTRA WORDS BIT #DIREOB,(R5) ;IS NEXT THING AN END OF BLOCK ?? BEQ NOEEB ;NO TST R0 ;LAST SEGMENT ? BEQ EXTROM ;YES, NO CAN DO JSR PC,RDDIR ;YES, READ NEXT DIRECTORY BLOCK NOEEB: BIT #DIREMP,(R5) ;IS NEXT THING AN EMPTY () ?? BEQ EXTROM ;NO, ERROR SUB R1,10(R5) ;THIS IS THE EXCESS BCS EXTROM ;NOT ENOUGH ROOM CMP (SP),@BLKEY ;IS EMPTY IN SAME BLOCK AS FILE ?? BEQ SAMDB ;YES, SAME DIRECTORY BLOCK JSR PC,WRDIR ;NO, WRITE FIRST MODIFIED BLOCK SAMDB: MOV (SP)+,R0 ;GET BLOCK NUMBER OF FIRST DIR BLK JSR PC,RDDIR ;READ BLOCK CONTAINING FILE MOV (SP)+,R5 ;RESTORE POINTER TO SIZE OF FILE ADD R1,-(R5) ;MODIFY THIE SIZE JSR PC,WRDIR ;WRITE OUT THIS MODIFIED BLOCK STLNK3: JMP START ;BACK TO PIP EXTNEW: INC OUCHAN ;WORK WITH CHANNEL 1 MOV R4,R0 ;CREATE A NEW FILE JSR PC,ENTER ;ENTER IT BEQ STLNK3 ;.SYS OR .BAD .CLOSE 0 ;CLOSE DIRECTORY .CLOSE 1 ;CLOSE THE FILE BR EXTTRY ;AND DO IT AGAIN RIGHT EXTNEG: ERROR EXTROM: ERROR .ENDC .SBTTL BOOTSTRAP COPY ;BOOT COPY PROVIDES A METHOD OF TRANSFERRING THE RT-11 ;BOOTSTRAP BLOCKS BETWEEN DEVICES. THE SYNTAX IS: ; *ODEV:FILE=IDEV:BOOTF/U ;THE INPUT FILE IS A FILE WHICH CONTAINS THE RT-11 ;BOOTSTRAP BLOCKS IN BLOCKS 0 AND 1. BOOT COPY READS THESE ;TWO BLOCKS AND WRITES THEM INTO BLOCKS 0 AND 2 OF THE ;OUTPUT DEVICE. USUALLY, THE INPUT FILE WILL BE MONITR.SYS. BOOT: MOV R4,R0 ;PT R0 TO FILE JSR PC,MTCA ;IF MT OR CT, BR BADBOT ;DISALLOW BOOT JSR PC,DFNBUF ;DEFINE BUFFERS CMP R0,#1000 ;NEED TWO BLOCKS AT LEAST BLO COROVR ;NOT ENOUGH BUFFER TST (R4) ;IS THERE AN OUTPUT DEVICE BEQ BADBOT JSR PC,LOOKUP ;OPEN INPUT FILE ON CH. 0 CLR 2(R4) ;OPEN OUTPUT AS NON-FILE DEVICE .LOOKUP 1,R4 ;OPEN CHANNEL 1 FOR OUTPUT .IF DF MBUILD JSR PC,FATERR ;CHECK TO SEE IF FATAL ERROR .ENDC BCS BADBOT MOV #1000,R0 ;READ 2 BLOCKS JSR PC,READN CLR OUBLK ;WRITE BLOCK 0 MOV #400,R0 ;ONE BLOCK JSR PC,WRITE BCS 1$ ;ERROR ON WRITE MOV #2,OUBLK ;AND NOW BLOCK 2 ADD #1000,OUBUF ;SECOND RECORD JSR PC,WRITE .IF NDF MBUILD BCC STLNK3 ;IF NO ERRORS,WE ARE DONE .IFF BCS 1$ ;REPORT ERROR JMP START ;IF NO ERRORS,WE ARE DONE .ENDC 1$: JMP OUTER BADBOT: ERROR .IF NDF MBUILD .SBTTL VERSION VERSON: .PRINT #VMESAG ;TELL HIM OUR VERSION NUMBER BR STLNK3 ;BACK TO PIP VMESAG: .ASCIZ "PIP V04-06 " .ENDC .EVEN .SBTTL DFNBUF (DEFINE BUFFER(S)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; DFNBUF IS ENTERED WITH R2 POINTING TO THE START OF THE ; AVAILABLE BUFFER SPACE. BUFFER ALLOCATION IS DONE ; DEPENDING ON THE AMOUNT OF AVAILABLE CORE AND ON THE ; ASCII SWITCH. INBUF, OUBUF, OUBUFE, AND BUFSIZ ARE SET ; AND CHECKS ARE MADE FOR INSUFFICIENT BUFFER SPACE. ; REGISTER 2 IS LEFT POINTING AT THE START OF THE OUTPUT ; BUFFER. R0 IS USED AS A TEMPORARY. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DFNBUF: MOV USRBUF,R0 ;POINTER TO USR DIRECTORY BUFFER MOV R2,INBUF ;SAVE START OF INPUT BUFFER SUB R2,R0 ;TOTAL SPACE FOR BUFFERS BCS COROVR ;NO ROOM FOR BUFFER(S) BIC #777,R0 ;ROUND TO BLOCKS .IF NDF MBUILD MOV ASCII,-(SP) ;IF IT IS NEITHER ASCII BIS FBIN,(SP)+ ; NOR FORMATTED BINARY BEQ 1$ ; THEN WE NEED BUT ONE BUFFER BIC #1000,R0 ;SINCE WERE SPLITTING,NEED EVEN # OF BLOCKS ROR R0 ;HALVE THE BUFFER SIZE (/A USES 2) ADD R0,R2 ;GET START ADDR OF OUTPUT BUFFER .ENDC 1$: MOV R2,OUBUF ;SAVE START ADDRESS OF OUTPUT BUFFER MOV R2,(PC)+ ;GET ENDING ADDRESS OF OUTPUT BUFFER OUBUFE: 0 ADD R0,OUBUFE ROR R0 ;GET SIZE OF BUFFER(S) IN WORDS MOV R0,BUFSIZ ;SAVE IT BNE RTSPC ;RETURN OK IF BUFFERS NON-ZERO COROVR: ERROR ;NO ROOM IN CORE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; CORCHK IS ENTERED WITH R2 POINTING TO START OF AVAILABLE ; CORE. WE CHECK IF THERE IS ENOUGH ROOM FOR A SAVESTATUS ; BLOCK, OR FOR A MT/CT FILENAME, OR FOR THE NEXT FILE ; NAME IN AN INPUT EXPANSION. ALL THREE ARE CHECKED BY ; INSURING THERE IS AT LEAST 12. BYTES OF FREE CORE LEFT. ; CALLED FROM INPUT EXPANDER AND FROM COPY ROUTINE. (BC) ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CORCHK: MOV USRBUF,-(SP) ;USE SAME CHECK THAT DFNBUF USES ;### MOV R2,-(SP) ;PUT FREE CORE PTR ON STACK ;### ADD #14,(SP) ;ADD 14 TO FREE CORE PTR-NEED 6 WDS ;### SUB (SP)+,(SP)+ ;DO THE SUBTRACT ;### BCC RTSPC ;IF CC-ENUF ROOM-JUST RETN. ;### BR COROVR ;NOT ENUF ROOM-GIVE CORE MSG ;### .SBTTL OEXPND (EXPAND OUTPUT LIST) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; OEXPND EXAMINES THE CURRENT OUTPUT FILE ENTRY FOR A POSSIBLE ; WILD CARD (*) CHARACTER IN EITHER THE FILE NAME OR EXTENSION. ; IF SUCH EXISTS, THE CORRESPONDING PART OF THE CURRENT INPUT ; FILE IS MOVED INTO THE OUTPUT FILE DESCRIPTOR. THE NEW ; OUTPUT FILE DESCRIPTOR IS STORED IN THE FOUR WORD BLOCK ; NEWNAM. THE ROUTINE IS ENTERED WITH R4 POINTING TO THE ; CURRENT OUTPUT FILE AND R5 POINTING TO THE CURRENT INPUT ; FILE. THE OUTPUT LIST POINTER IS INCREMENTED AS REQUIRED. ONE ; CALL TO OEXPND PRODUCES ONE OUTPUT FILE. R0 IS USED AS ; A TEMPORARY. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OEXPND: CLR R0 ;CLEAR OUTPUT LIST BACKUP COUNT CMP R4,#FILDES+36 ;ARE WE GETTING INTO INPUT COUNTRY? BHIS BADOUF ; THAT'S A NO-NO MOV #NEWNAM,R3 ;POINTER TO SPACE FOR NEW NAME MOV (R4)+,(R3)+ ;COPY DEVICE NAME CMP (R4),#R50STAR ;IS FILE NAME * ?? BNE 1$ ;NO MOV 2(R5),(R3)+ ;YES, SUBSTITUTE NAME FROM INPUT LIST MOV 4(R5),(R3)+ ;(TWO WORDS) CMP (R4)+,(R4)+ ;MOVE OUTPUT LIST POINTER TO EXTENSION MOV #12,R0 ;SET BACKUP COUNT BR 2$ ;GO CHECK EXTENSION 1$: MOV (R4)+,(R3)+ ;COPY NAME FROM OUTPUT LIST MOV (R4)+,(R3)+ 2$: CMP (R4),#R50STAR ;IS EXT .* ?? BNE 3$ ;NO MOV 6(R5),(R3)+ ;YES, USE EXTENSION FROM INPUT LIST TST (R4)+ ;BUMP OUTPUT LIST POINTER MOV #12,R0 ;SET OUTPUT LIST BACKUP COUNT BR 4$ 3$: MOV (R4)+,(R3)+ ;EXT IS OK, COPY IT 4$: TST (R4)+ ;SKIP OUTPUT FILE SIZE FROM CSI SUB R0,R4 ;SUBTRACT BACKUP COUNT RTSPC: RTS PC ;RETURN OUTPUT FILE NAME IN NEWNAM .SBTTL ENTER ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; ENTER IS USED TO DO AN RT-11 ENTER OF THE FILE WHO'S ; NAME IS POINTED TO BY R0. CHECKS ARE MADE FOR ALL KNOWN ; ILLEGAL CASES (* IN FILE NAME OR EXTENSION OR NULL FILE). ; OUCHAN CONTAINS THE CHANNEL NUMBER TO BE USED FOR THE ; FILE. ATTEMPTS TO ENTER A .SYS OR .BAD FILE WITHOUT A ; /Y WILL CAUSE ENTER TO RETURN WITH Z=1. A SUCCESSFUL ; ENTER RETURNS WITH Z=0 (BEQ FAILS). OUBLK IS CLEARED ; TO INITIALIZE WRITE. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ENTER: TST (R0) ;ANY FILE TO ENTER BEQ 2$ ;NO, RETURN WITH Z=1 CMP 2(R0),#R50STAR ;IS NAME * ?? BEQ BADOUF ;YES, BAD OUTPUT FILE CMP 6(R0),#R50STAR ;HOW ABOUT THE EXT ?? BEQ BADOUF ;YUP, ITS BAD TST 2(R0) ;NULL NAME? BNE 1$ ;NO-OK MOV R0,-(SP) ;YES-SAVE R0 .DSTATU #DEVINF ;GET DEVICE STATUS .IF DF MBUILD JSR PC,FATERR ;CHECK TO SEE IF FATAL ERROR .ENDC TST DEVINF ;FILE STRUCTURED? BMI BADOUF ;YES-DISALLOW THE ENTER MOV (SP)+,R0 ;RESTORE R0 1$: JSR PC,SYSCHK ;DON'T WRITE .SYS FILE UNLESS /Y 2$: BEQ RTSPC ;.BAD OR .SYS RETURN WITH Z=1 MOV 10(R0),-(SP) ;PUSH SIZE CLR OUBLK ;SET OUTPUT FILE BLOCK NUMBER TO 0 JSR PC,TSTNUM ;SET UP REST OF LIST MOV (SP)+,FLEN ;RETRIEVE LENGTH MOV #2*400,(R0) ;INSERT ENTER CODE (2) IN HI BYTE MOVB OUCHAN,(R0) ;CHANNEL IN LO BYTE INCB (R0) EMT 375 .IF DF MBUILD JSR PC,FATERR ;CHECK TO SEE IF FATAL ERROR .ENDC BCS 3$ ;ENTER BAD-REPORT ERROR JMP CLZRTS ;ENTER OK,RETURN AFTER CLZ 3$: ERROR BADOUF: ERROR .SBTTL LOOKUP ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; LOOKUP DOES AN RT-11 LOOKUP OF THE FILE WHO'S NAME IS ; POINTED TO BY R5. THIS REGISTER IS THEN INCREMENTED PAST ; THE FILE DESCRIPTOR. LOOKUP INITIALIZES READ AND READC BY ; CLEARING INBLK AND INBUFE. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LOOKUP: MOV R5,R0 ;GET FILE DESCRIPTOR POINTER CLR INBLK ;INITIALIZE INPUT FILE BLOCK NUMBER .IF NDF MBUILD CLR INBUFE ;INITIALIZE READC ROUTINE .ENDC ADD #10,R5 ;BUMP INPUT LIST POINTER JSR PC,TSTNUM ;GET XTRA ARG FOR MT AND CA MOV #1*400,(R0) ;SET CODE TO LOOKUP, CHANNEL 0 EMT 375 ;THEN DO V2 LOOKUP .IF DF MBUILD JSR PC,FATERR ;CHECK TO SEE IF FATAL ERROR .ENDC BCC RTS7 ;LOOKUP OK, RETURN ADD (PC)+,(PC) ;ON ERROR CLOSE LAST OUTPUT CHANNEL .CLOSE 1 ;IN CASE MT OR CA, BECAUSE THESE PRECEDE LOOKUPS LCHAN: HALT ;IGNORE POSSIBLE ERROR ON CLOSE ERROR .SBTTL READ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; READ IS USED TO READ BUFSIZ NUMBER OF WORDS FROM THE INPUT ; FILE CURRENTLY OPEN ON CHANNEL 0. INBLK IS THE RELATIVE ; BLOCK NUMBER, AND INBUF IS THE BUFFER ADDRESS. IF THE READ ; IS COMPLETELY SUCCESSFUL, READ RETURNS WITH Z=0 (BEQ FAILS) ; AND THE ACTUAL NUMBER OF WORDS READ IN R0. THIS MAY BE LESS ; THAN BUFSIZ IF THE READ OVERLAPPED THE END OF FILE. IF THE ; READ IS UNSUCCESSFUL (EOF ENCOUNTERRED) Z=1 UPON RETURN ; SIGNALING THAT NOTHING WAS READ. READ WILL IGNORE HARD ; INPUT ERRORS IF THE /G SWITCH WAS SPECIFIED. READ WILL ; INCREMENT THE INPUT FILE BLOCK NUMBER (INBLK) BY THE ; NUMBER OF BLOCKS TRANSFERRED. READN WILL READ THE NUMBER ; OF WORDS IN R0. ; BEFORE BEGINNING THE READ OPERATION,A SPECIAL CASE CHECK IS ; MADE TO SEE IF THE INPUT DEVICE IS CASSETTE OR MAGTAPE. ; IF IT IS,THE BUFFER SIZE IS REDUCED TO 256 WORDS,TO PREVENT ; FILE ELONGATION BY EXTRA NULLS DURING THE TRANSFER. A FURTHER SPECIAL ; CASE CHECK IS MADE FOR CASSETTE,AND IF CASSETTE IS THE INPUT ; DEVICE,THE 256 WORD BUFFER IS "READ" BY FOUR SMALLER READS TO ; THE CASSETTE OF ONE RECORD EACH (64 WORDS). THIS IS NECESSARY TO ; PROPERLY DETECT END-OF FILE,WHICH MAY COME AFTER AN ODD NUMBER ; OF RECORDS ON CASSETTE. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; READ: MOV 2(SP),R0 ;GET PTR TO CORE BLOCK RCOM: TST 10(R0) ;AND TEST 5TH WORD FOR < 0 BPL CORBL ;IF NOT, DO BUFFERS SIZE XFERS MOV #256.,BUFSIZ ;ELSE (MT OR CA) DO SMALLER XFERS MOV OUBUF,OUBUFE ADD #1000,OUBUFE ;RESET OUTPUT BUFFER LIMITS .DSTATU #DEVINF ;DETERMINE CURRENT INPUT DEVICE CMPB DEVINF,#CTIDEN ;IS IT TA11? BNE CORBL ;NO .IF NDF MBUILD MOV INBUF,CTBADD ;YES-SET UP BUFFER ADDRESS 1$: MOV #READBK,R0 ;POINTER TO ARG LIST IN R0 EMT 375 ;V2 READ CALL BCC 4$ ;ERROR MUST BE HARD JSR PC,RDERR ;SEE IF EOF OR HARD ERROR BEQ RTS7 ;EOF 4$: MOV @#SYSPTR,R0 ;BASE ADDR OF RESIDENT INTO R0 MOV 4(R0),SSB ;CSW FOR CHANNEL 0 INTO SSB BIT #CSWEOF,SSB ;DID LAST READ DETECT EOF? BNE 2$ ;YES-IGNORE LAST RECORD ADD #64.*2,CTBADD ;NO-BUMP BUFFER ADDR OVER NEW MATERIAL 2$: MOV CTBADD,R0 ;ADDR OF NEXT BUFFER INTO R0 SUB INBUF,R0 ;DETERMINE HOW MANY BYTES READ SO FAR ROR R0 ;MAKE INTO WORDS BEQ SEZRTS ;IF NOTHING WAS READ AT ALL,WE HAVE LOGICAL EOF BIT #CSWEOF,SSB ;DID LAST READ DETECT EOF? BNE CLZRTS ;YES-RETURN WHAT WE HAVE SO FAR CMP R0,#256. ;IS BUFFER COMPLETE YET BLT 1$ ;NO-READ NEXT RECORD BR CLZRTS ;"READ" COMPLETE;WC IS IN R0 ;AREA PACKET FOR CASSETTE READ READBK: .BYTE 0,10 ;READW ON CHANNEL 0 1 ;BLOCK # ALWAYS 1 CTBADD: 0 ;BUFFER ADDR 64. ;WORD COUNT = 64 WORDS 0 ;WAIT MODE .IFF HALT ;IMPOSSIBLE TO GET HERE .ENDC CORBL: MOV (PC)+,R0 ;ELSE, READ A BUFFER LOAD BUFSIZ: 0 READN: CLR -(SP) ;USE WAIT I/O MOV R0,-(SP) ;PUSH WORD COUNT MOV (PC)+,-(SP) ;PUSH BUFFER ADDRESS INBUF: 0 MOV (PC)+,R0 ;GET RELATIVE BLOCK NUMBER INBLK: 0 .READ 0 ;READ CHANNEL 0 ROR -(SP) ;SAVE CARRY BIT FOR ERROR CHECK SWAB R0 ;NUMBER OF BLOCKS ACTUALLY READ ADD R0,INBLK ;INCREMENT RELATIVE BLOCK NUMBER SWAB R0 ;RESTORE IT TO A WORD COUNT TST (SP)+ ;DID READ GIVE ERROR ? BMI RDERR ;YES, CHECK ON IT MOV R0,-(SP) ;SAVE WORD COUNT JSR PC,MTCA1 ;IS THIS MAGTAPE OR CASSETTE? BR 1$ ;YES-SPECIAL CASE EOF CHECK MOV (SP)+,R0 ;NO-RESTORE WORD COUNT BR CLZRTS ;AND RETURN 1$: MOV @#SYSPTR,R0 ;BAS OF MONITR INTO R0 MOV 4(R0),SSB ;FIRST WORD OF $CSW FOR CHANNEL 0 NTO SSB MOV (SP)+,R0 ;RESTORE COUNT BIT #CSWEOF,SSB ;DID LAST READ RESULT IN NFS EOF? BEQ CLZRTS ;BIT OFF MEANS MORE TO COME SEZRTS: SEZ ;BIT ON MEANS EOF FOR CT OR MT RTS PC CLZRTS: CLZ ;CLEAR EOF INDICATOR RTS7: RTS PC RDERR: TSTB @#EMTERR ;WHAT KIND OF ERROR ?? BEQ RTS7 ;RETURN WITH COND CODES =0 .IF NDF MBUILD TST IGNORE ;SHOULD WE IGNORE IT (/G) BGT CLZRTS ;YES, REGULAR IGNORE BEQ EBOMB ;NO, BOMB ON ERROR MOV R0,-(SP) ;SAVE ACTUAL COUNT .PRINT #INERR ;SQUISH! PRINT, BUT CONTINUE RR0RTS: MOV (SP)+,R0 ;RESTORE COUNT BR CLZRTS ;SO RETURN .ENDC EBOMB: JSR R0,MSG ;PRINT AN ERROR AND DIE .NLIST BEX INERR: .ASCIZ "?IN ER?" .LIST BEX .IF NDF MBUILD .SBTTL READC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; READC IS USED TO READ CHARACTERS FROM THE CURRENT INPUT FILE ; (OPEN ON CHANNEL 0). R1 IS USED AS THE BUFFER POINTER ; AND THE CHARACTERS ARE RETURNED ONE AT A TIME IN R0 AS SEVEN ; BIT ASCII. READC USES READ TO DO THE ACTUAL READING. ; IF THE EOF IS ENCOUNTERRED, READC RETURNS WITH ; Z=1 (BNE FAILS). ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; READC: CMP R1,(PC)+ ;IS BUFFER EMPTY ?? INBUFE: 0 BLO 1$ ;NO, DON'T READ MOV 2(SP),R0 JSR PC,RCOM ;EMPTY BUFFER, READ SOME BEQ 2$ ;END OF FILE MOV INBUF,R1 ;RESET BUFFER POINTER ASL R0 ;GET ACTUAL NUMBER OF BYTES READ ADD R1,R0 ;NOW GET ADDR OF END OF BUFFER MOV R0,INBUFE ;SAVE THIS 1$: MOVB (R1)+,R0 ;GET A CHARACTER FROM THE FILE BIC #177600,R0 ;MAKE IT SEVEN BIT BEQ READC ;IGNORE NULLS CMP R0,#177 ;IS IT A RUBOUT ?? BEQ READC ;YES, IGNORE IT CMP R0,#32 ;IS IT CTRL/Z? (NE RETURNS CHAR,EQ RETURNS EOF) 2$: RTS PC ;RETURN CHARACTER .SBTTL FORMATTED BINARY READ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; READB IS USED TO READ FORMATTED BINARY FILES ; IT WILL DISCARD ANY DATA BEFORE THE BYTE 001 ; MARKING THE FIRST BLOCK ; USED REGISTERS 0,1, AND 4 ; PLEASE NOTE, REGISTER 4 MUST BE INITALLY SET TO FIRSTBY ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; READB: CMP R1,INBUFE ;END OF BUFFER? BLO 2$ ;NO MOV 2(SP),R0 ;GET PTR TO CORE BLOCK JSR PC,RCOM ;READ SOME MORE DATA BEQ NFIL ;END OF FILE MOV INBUF,R1 ASL R0 ;MAKE WORD COUNT , BYTE COUNT ADD R1,R0 ;THIS IS END OF INPUT BUFFER MOV R0,INBUFE ; 2$: MOV @R4,PC ;THIS IS A JMP IN DISGUISE BYTE1: DECB (R1)+ ;IS THIS BYTE AN 001 ? BNE READB ;WELL, NOT A BLOCK INCB -(R1) ;FIX REG 1 AND THE BYTE CLR CKSUM ;CLEAR THE CHECKSUM CLR BYSIZ ;CLEAR THE BYTE COUNTER BR OUTCHA ;ADVANCE THREAD AND OUTPUT BYTE BSIZE: MOVB (R1),(PC)+ ;STORE FIRST BYTE OF BYTE SIZE BYTMP: 0 BR OUTCHA ;OUTPUT THIS CHARACTER BSIZE2: MOVB (R1),BYTMP+1 ;STORE SECOND BYT OF BYTE SIZE ADD BYTMP,BYSIZ ;COMPUTE BYTE SIZE INC BYSIZ ;ADJUST FOR CHECKSUM BYTE ;FALL THRU TO FINISH THE BLOCK OUTCHA: TST (R4)+ ;ADVANCE THE THREAD OUTCH: MOVB (R1)+,R0 ;FOR WRITEC ADD R0,(PC)+ CKSUM: 0 ;CALCULATE CHECKSUM DEC (PC)+ ;DECREMENT BYTE COUNTER BYSIZ: 0 BNE NFIL ;AND EXIT TSTB CKSUM ;IS CHECKSUM EQUAL TO ZERO BNE CKERR ;NO, ERROR CCONT: MOV #FIRSTBY,R4 ;RESET FOR A NEW BLOCK ; (ALSO SET NON-ZERO RETURN CODE) NFIL: RTS PC ;RETURN WITH CHARACTER IN R0 CKERR: TST IGNORE ;IGNORE READ ERRORS BNE CCONT ;YES, CONTINUE ERROR FIRSTBY:.WORD BYTE1 ;FIND A BYTE CONTAINING 001 .WORD OUTCHA ;OUTPUT THE NULL AFTER THE 001 .WORD BSIZE ;SAVE & OUTPUT THE FIRST .WORD BSIZE2 ; AND 2ND COUNT BYTES .WORD OUTCH ;THEN OUTPUT WITHOUT UPDATING THREAD .ENDC .SBTTL WRITE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; WRITE IS USED TO WRITE SOME NUMBER OF WORDS ONTO THE CHANNEL ; OUCHAN FROM THE BUFFER OUBUF TO THE RELATIVE BLOCK ; NUMBER OUBLK. THE WORD COUNT IS SPECIFIED BY R0. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WRITE: CLR -(SP) ;USE WAIT I/O SWAB R0 ;MAKE WORD COUNT A BLOCK COUNT MOV R0,-(SP) ;PUT ONTO STACK MOV (PC)+,R0 ;GET RELATIVE BLOCK NUMBER OUBLK: 0 ADD (SP),OUBLK ;UPDATE THE BLOCK NUMBER SWAB (SP) ;MAKE THE STACK ENTRY A WORD COUNT MOV (PC)+,-(SP) ;PUSH BUFFER ADDRESS OUBUF: 0 MOV (PC)+,-(SP) ;GET CHANNEL NUMBER OUCHAN: 0 ADD (PC)+,(SP) ;ADD PROTOTYPE EMT .WRITE 1 MOV (SP)+,(PC) ;PUT IT IN LINE 0 ; AND DO THE WRITE RTS PC OUTER: JSR R0,MSG .NLIST BEX OUMES: .ASCIZ '?OUT ER?' .LIST BEX .EVEN .IF NDF MBUILD .SBTTL WRITEC ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; WRITEC IS USED TO WRITE CHARACTERS TO THE CURRENT OUTPUT FILE ; OPEN ON CHANNEL OUCHAN. R2 IS USED AS THE OUTPUT BUFFER ; POINTER, AND WRITE IS USED TO DO THE ACTUAL IO TRANSFER. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WRITEC: CMP R2,OUBUFE ;IS BUFFER FULL ?? BLO 1$ ;NO, DON'T WRITE IT MOV R0,-(SP) ;SAVE CHARACTER TO BE WRITTEN MOV BUFSIZ,R0 ;PUT WORD COUNT INTO R0 JSR PC,WRITE ;WRITE ONE BUFFER LOAD BCS OUTER ;OUTPUT ERROR MOV (SP)+,R0 ;RESTORE CHARACTER MOV OUBUF,R2 ;SETUP BUFFER POINTER 1$: MOVB R0,(R2)+ ;STUFF CHARACTER INTO BUFFER RTS PC .SBTTL FILBUF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; FILBUF FILLS THE CURRENT BLOCK OF THE OUTPUT BUFFER WITH ; NULLS AND THEN WRITES OUT THE LAST BUFFER LOAD. THIS ; MAY BE SHORTER THAN BUFSIZ. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FILL: CLRB (R2)+ ;PUT IN ANOTHER NULL FILBUF: MOV R2,R0 ;GET CURRENT BUFFER POINTER SUB OUBUF,R0 ;GET CURRENT BUFFER SIZE BIT #777,R0 ;IS SIZE A MULTIPLE OF 1000 BYTES ? BNE FILL ;NO, MORE NULLS ASR R0 ;MAKE THIS A WORD COUNT JSR PC,WRITE ;WRITE OUT LAST PIECE OF FILE BCS OUTER ;A WRITE ERROR RTS PC .ENDC .SBTTL SYSCHK ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; SYSCHK USED TO PROTECT .SYS AND .BAD FILES FROM INADVERTENT ; DELETION, RENAMING, OR MODIFICATION. THE ROUTINE IS ENTERRED ; WITH R0 POINTING TO THE FILE DESCRIPTOR TO BE CHECKED. ; IF THE FILE HAS AN EXTENSION OF .BAD OR .SYS AND THE /Y SWITCH ; HAS NOT BEEN SET, SYSCHK WILL RETURN WITH Z=1 (BEQ ; SUCCEEDS). OTHERWISE THE RETURN IS WITH Z=0 (BEQ FAILS). ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SYSCHK: CMP 6(R0),(PC)+ ;IS IT A .BAD FILE ?? .RAD50 "BAD" BEQ 1$ ;YES, GO CHECK /Y CMP 6(R0),(PC)+ ;IS IT A .SYS FILE ?? .RAD50 "SYS" BNE SCRET ;NO, JUST RETURN 1$: TST SYSBAD ;WAS THERE A /Y ?? BEQ CHKMES ;INFORM USER SYSALL: MOV R0,-(SP) ;SAVE REGISTER ZERO .DSTATU #DEVINF ;GET DEVICE STATUS INFORMATION MOV #DEVINF+4,R0 ;POINT TO DEVINF+4 (USED AS SCRATCH TOO) CMP @R0,@#SYSPTR ;IS THIS IS A SYS DEVICE BLO POPST ;NO CLR -(R0) ;SET UP FOR NON-FILE-STRUCTURED MOV @(SP),-(R0) ;PUT IN THE DEVICE NAME .LOOKUP 0 ;OPEN THE DEVICE NON-STRUCTURED .SAVEST 0,#SSB ;AND GET INFORMATION THEREON MOV @#SYSPTR,R0 ;BASE OF RES INTO R0 CMPB SYSUNT(R0),SSB+11 ;IS IT SYSTEM DEVICE? BNE POPST ;NOT SYS DEVICE (AT LAST) CLR REBMES ;SET SWITCH SO REBOOT PRINTED WHEN DONE POPST: MOV (SP)+,R0 ;RESTORE REGISTER 0 CHKSLS: TST SYSBAD ;WAS THERE A /Y ?? SCRET: RTS PC CHKMES: CLR SYSMES ;SET FLAG TO PRINT MESSAGE BR CHKSLS .NLIST BEX SYSMSG: .ASCIZ '?NO .SYS/.BAD ACTION?' RBMSG: .ASCIZ '?'<7>'REBOOT'<7>'?' .EVEN .LIST BEX .SBTTL GETDIR AND RDDIR ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; GETDIR IS USED TO OPEN A DIRECTORY AND TO READ ITS FIRST ; BLOCK INTO THE USR DIRECTORY BUFFER. R5 SHOULD POINT TO THE ; DEVICE NAME IN RAD50 FOLLOWED BY A ZERO WORD. THE DEVICE ; IS THEN OPENNED ON CHANNEL 0 AS A NON FILE STRUCTURED ; DEVICE, ALLOWING READING OF ABSOLUTE BLOCKS. GETDIR ; WILL SET CHKEY TO THE INDEX OF THE DEVICE WHO'S DIRECTORY ; IS BEING EXAMINED. THE REMAINING FUNCTIONS OF GETDIR ARE ; THE SAME AS THOSE OF RDDIR. ; RDDIR IS USED TO READ SUCCESSIVE DIRECTORY BLOCKS. IT ; WILL UPDATE BLKEY TO REFLECT THE ABSOLUTE BLOCK NUMBER ; OF THE DIRECTORY BLOCK CURRENTLY IN THE USR'S BUFFER. ; THIS PREVENTS UNECCESSARY DIRECTORY READS IN THE USR. ; GETDIR AND RDDIR ALSO EXAMINE THE TWO KEYS (BLKEY ; AND CHKEY) BEFORE READING TO DETERMINE IF THE BLOCK ; DESIRED IS ALREADY IN CORE. ; UPON EXIT R5 POINTS TO THE FIRST ENTRY OF THE CURRENT ; DIRECTORY BLOCK, R0 CONTAINS THE ABSOLUTE BLOCK NUMBER OF ; THE NEXT DIRECTORY BLOCK (0 MEANS THIS IS THE LAST), AND ; XTRABY CONTAINS THE NUMBER OF EXTRA BYTES IN EACH ; DIRECTORY ENTRY. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GETDIR: JSR PC,LOCK ;LOCK USR IN CORE MOV #NOP,RDDIR ;INITIALIZE CONDITIONAL BRANCH MOV R5,R0 ;POINT TO DEVICE NAME JSR PC,MTCA ;AND IF MT OR CA BR MCDIR ;GO DO SPECIAL DIRECTORY PROCESS JSR PC,OPNDIR ;ELSE, OPEN THE DIRECTORY .REOPEN 0 ;ON CHANNEL 0 MOV #1,R0 ;READ FIRST DIRECTORY BLOCK RDDIR: NOP ;EITHER NOP OR BR TO MTCT CODE MOV (PC)+,R5 ;USE THE USR DIRECTORY BUFFER USRBUF: 0 ;POINTER TO RMON-USRSIZ CMP R0,@BLKEY ;IS THIS BLOCK ALREADY HERE ?? BEQ DIRIN ;YES, DON'T READ AGAIN REDDIR: MOV R0,-(SP) ;SAVE BLOCK NUMBER ASL R0 ;MAKE IT AN ABSOLUTE BLOCK NUMBER ADD #DIRBLK-2,R0 .READW 0,R5,#512. ;READ 2 BLOCKS INTO USRBUF BCS BADDIR ;ERROR READING DIRECTORY CMP 4(R5),#37 ;THIS ISNT A SURE TEST BHI ILGER MOV (SP)+,@(PC)+ ;SAVE BLOCK NUMBER IN USER BLKEY: 0 DIRIN: TST (R5)+ ;SKIP NBLOCKS MOV (R5)+,R0 ;POINTER TO NEXT DIR BLOCK TST (R5)+ ;SKIP HIGHEST SEGMENT NUMBER MOV (R5)+,XTRABY ;GET EXTRA WORD COUNT TST (R5)+ ;SKIP FILE BEGINNING BLOCK RTS PC BADDIR: ERROR ILGER: ERROR .SBTTL MCDIR ;MCDIR READS AN MT OR CT DIRECTORY. ;WHEN ENTERED THROUGH MCDIR IT REWINDS THE VOLUME READS ITS 1ST LABEL ;AND RETURNS AN ENTRY IN USRBUF SIMILAR TO THOSE IN THE DIRECTORY OF A FILE ;STRUCTURED DEVICE. ON SUBSEQUENT CALLS TO MCDIRR IT READS AND RETURNS THE NEXT LABEL ;IT ENCOUNTERS. WHEN IT REACHES LEOT OR PEOT IT RETURNS AN END-OF- ;DIRECTORY ENTRY. MCDIR: MOV #MCDIRR-RDDIR/2+377,RDDIR ;NEXT RDDIR BR'S DOWN CLR 2(R5) ;NON-FILE LOOKUP TO OPEN CHANNEL .LOOKUP 0,R5 .IF DF MBUILD JSR PC,FATERR ;CHECK TO SEE IF FATAL ERROR .ENDC BCS BADDIR JSR R5,SPFUN ;REWIND BEFORE DIRECTORY .BYTE 377,-5 JSR PC,SKPVL1 ;SKIP VOL1 IF MT MCDIRR: MOV R1,-(SP) ;SAVE R1 MOV R4,-(SP) ;AND R4 MOV USRBUF,R5 ;POINT R5 TO INPUT BUFFER FOR READS MOV R5,R4 ;USE 2ND HALF OF BUFFER FOR DIRECTORY ADD #1000,R4 .IF NDF MBUILD CMPB DEVINF,#CTIDEN ;IF CT, BEQ CTDIR ;GO DO A CT DIRECTORY .ENDC RDHDR1: CLR R0 ;BLOCK # IS 0 .READW 0,R5,#40. ;READ THE NEXT BLOCK (HDR1) ;### BDIR1: BCS REWDIR CMP (R5),#HDR1 ;IS THIS A HDR1? BNE DUNMCD ;IF NOT,WE MUST HAVE LEOT CMP (R5)+,(R5)+ ;POINT R5 TO NAME JSR PC,ASCR50 ;GET NAME FROM ASCII TO RAD50 DUNNAM: JSR R5,SPFUN ;SPACE TO EOF1 LABEL .BYTE 377,-2 ;(FORWSP CODE) BCS REWDIR JSR R5,SPFUN .BYTE 377,-2 ;(FORWSP CODE) BCS REWDIR MOV USRBUF,R5 ;POINT TO INPUT BUFFER AGAIN CLR R0 ;BLOCK # IS 0 .READW 0,R5,#40. ;READ THE EOF1 LABEL ;### BCS REWDIR CMP (R5),#EOF1 ;IF EOF1 NOT READ, BNE ENDSEG ;ASSUME BTE CAUSED LACK OF EOF1 AND ;IGNORE ITS CONTENTS OKEOF: ADD #74,R5 ;POINT R5 TO 1ST DIGIT OF BLOCK COUNT JSR PC,ASCOCT ;CHANGE 6 DIGITS OF ASCII TO OCTAL IN (R4) MOV (R4)+,(R4)+ ;COPY COUNT INTO NEXT WORD, TOO SUB #11,R5 ;POINT R5 TO FIRST YEAR DIGIT JSR PC,ASCOCT ;GET BIN FOR YEAR IN (R4) SUB #110,(R4) ;YEAR-72(10) MOV (R4),(PC)+ ;SAVE YEAR YEAR: 0 MOV #28.,FEB ;INIT MONTH TABLE FOR NORMAL YEAR ROR (R4) ROR (R4) ;IF BOTH LOW ORDER BITS=0,THEN LEAP YEAR BCS 1$ ;BRANCH IF NOT LEAP BMI 1$ ;BRANCH IF NOT LEAP INC FEB ;FEBRUARY HAS 29 DAYS THIS YEAR 1$: CMPB (R5)+,(R5)+ ;BUMP R5 BY 2 CLRB (R5) ;MARK END OF DATE FIELD ADD #4,R5 ;POINT R5 TO FIRST DIGIT OF DAY JSR PC,ASCOCT ;BINARY FOR DAYS IN @R4 MOV #MONTAB,R1 ;R1 POINTS TO MONTH TABLE 2$: SUB (R1)+,(R4) ;SUB THIS MONTHS DAYS FROM TOTAL BGT 2$ ;IF MORE LEFT,CONTINUE ADD -(R1),(R4) ;ON OVERFLOW,BACK UP ONE MO SUB #MONTAB,R1 ;(MONTH*2)-2 IN R1 CMPB (R1)+,(R1)+ ;ADD 2 TO MAKE MONTH*2 ASL R1 ASL R1 ASL R1 ;SLIDE MO OVER ASL R1 ADD R1,(R4) ;COMBINE MO AND DAY ASL (R4) ASL (R4) ASL (R4) ;SLIDE MO AND DAY OVER ASL (R4) ASL (R4) ADD YEAR,(R4)+ ;COMBINE YEAR;RT-11 DATE NOW @R4 JSR R5,SPFUN ;SPACE TO NEXT HDR1 .BYTE 377,-2 ;(FORWSP CODE) BCSDIR: BCS REWDIR BR ENDSEG ;ELSE, END THIS SEGMENT DUNMCD: JSR R5,SPFUN ;ON DONE,REWIND TO BEGINNING OF TAPE .BYTE 377,-5 ;(REWIND CODE) JSR PC,SKPVL1 ;IF MT,FSPACE OVER VOL1 ENDIR: CLR R0 ;WHEN DONE, SET R0 TO NO MORE DIRECTORY ENDSEG: MOV #DIREOB,(R4)+ ;SET END OF SEGMENT MARKER MOV USRBUF,R5 ;POINT R5 TO DIRECTORY ADD #1000,R5 CLR XTRABY ;SAY NO EXTRA WORDS MOV (SP)+,R4 ;RESTORE R4 MOV (SP)+,R1 ;RESTORE R1 RTS PC ;AND RETURN REWDIR: JSR R5,SPFUN ;ON ERROR, REWIND TO GET KNOWN POSITION .BYTE 377,-5 ;(REWIND CODE) JSR PC,SKPVL1 ;IF MT,FSPACE OVER VOL1 JMP BADDIR ;AND TAKE ERROR EXIT .IF NDF MBUILD ;CTDIR CONVERT THE LABELS ON A CASSETTE TO DIRECTORY FORMAT CTDIR: CLR R0 ;BLOCK # TO 0 .READW 0,R5,#20 ;READ THE FIRST LABEL INTO BUFFER BCS REWDIR TSTB (R5) ;IF NULL NAME, BEQ DUNMCD ;SENTINAL FILE, DONE TSTB 14(R5) ;IS SEQUENCE NUMBER 0? BEQ 3$ ;YES-CONTINUE TST DIRFLG ;NO-IS A DIRECTORY LISTING IN PROGRESS? BNE 3$ ;YES-CONTINUE JSR R5,SPFUN ;OTHERWISE,IGNORE THIS FILE .BYTE 377,-3 ;SPACE TO NEXT FILE BCS DUNMCD ;ASSUME ERROR IS EOT BR CTDIR ;TRY NEXT FILE 3$: JSR PC,ASCR50 ;ELSE, GET NAME INTO DIRECTORY ADD #3,R5 ;POINT TO SEQ NO BIC #177400,(R5) ;STRIP LEVEL IDENTIFIER MOV (R5)+,(R4)+ ;INSERT SEQ NO. BYTE AS BLOCK COUNT CLR (R4)+ ;0 DATA LENGTH CMPB (R5),#60 ;IS THERE A DATE THERE BGE 1$ ;YES CLR (R4) ;NO:ZERO DATE WORD IN DIRECT BR 2$ 1$: ADD #5,R5 ;POINT R5 TO NEXT TO LAST BYTE OF DATE JSR PC,ASCOCT ;CONVERT 5 DIGITS OF DATE TO BINARY EQUIVALENT 2$: MOV (R4),R1 ;SAVE THIS VALUE IN R1 BEQ NULDAT ;NO DATE HERE CLR (R4) ;CLEAR DATE MOV USRBUF,R5 MOVB 23(R5),(R4) ;PUT IN LAST DIGIT OF DATE FROM LABEL SUB #60,(R4) ;LESS ITS ASCII PART MOV #TENTH,R5 ;PT. R5 TO TABLE OF DECIMAL VALUES MOV #OCTH,R0 ;PT. R0 TO TABLE OF OCTAL VALUES ;THE THREE VALUES IN THE DECIMAL TABLE CORRESPOND TO THE 3 PLACES IN THE ;ORIGINAL DECIMAL DATE WHERE MONTH, DAY, AND YEAR BEGIN. ;THE THREE VALUES IN THE OCTAL TABLE PT. TO THE BITS WHERE ;THE DAY, MONTH, AND YEAR START IN THE RT11 FORMATTED DATE. SUBDAY: SUB (R5),R1 ;SUBTRACT CURRENT TEN VALUE FROM DEC. DATE BLT DUNDAY ;IF DATE GOES <0, THIS PART OF DATE DONE ADD (R0),(R4) ;ELSE, ADD CURRENT OCTAL TO RT11 DATE BR SUBDAY ;AND GO SUBTRACT AGAIN DUNDAY: ADD (R5),R1 ;WHEN VALUE GOES <0, ADD BACK THE LAST SUB CMP -(R5),-(R5) ;THEN PT R5 TO NEXT TEN VALUE (THIS ONE/1000) TST -(R0) ;AND R0 TO NEXT OCTAL BGT SUBDAY ;IF NOT END OF OCTAL LIST (A 0), DO NEXT PART SUB #110,(R4) ;RT11 USES DATE-110 NULDAT: TST (R4)+ ;POP R4 TO NEXT ENTYR JSR R5,SPFUN ;SPACE TO NEXT FILE .BYTE 377,-3 ;(NEXTFILE CODE) BCS DUNMCD ;ON ERR ASSUME PHYSICAL EOT BR ENDSEG ;ELSE, END THIS SEGMENT .ENDC ;SPFUN EXECUTES THE SPECIAL FUNCTION WHOSE CODE FOLLOWS THE SUBROUTINE ;CALL. IT DOES SO BY SETTING UP THE LIST AND EXECUTING EMT 375. ;SPFUN SETS THE WCOUNT TO 0,SPFUN1 SETS IT TO -1 SPFUN1: MOV #1,-(SP) ;WC TO 1 BR SPFUN2 SPFUN: CLR -(SP) ;WC TO 0 SPFUN2: MOV #LIST,R0 ;PT R0 TO LIST MOV #32*400+0,(R0) ;LOAD SPECIAL FUNC. CODE, CHANNEL 17 MOV (R5)+,10(R0) ;GET CODE INTO 5TH WORD MOV (SP)+,6(R0) ;SET UP WC MOV R0,-(SP) ;SAVE R0 (IT GETS ZEROED) EMT 375 ;THEN DO IT MOV (SP)+,R0 ;GET R0 BACK RTS R5 ;AND GO BACK ;ASCR50 DETERMINES THE TYPE OF ENTRY, NULL OR GOOD, BY THE FIRST LETTER ;OF THE FILE NAME POINTED TO BY R5 AND INSERTS THIS INFORMATION AS THE ;STATUS OF THIS DIRECTORY ENTRY IN THE SLOT POINTED TO BY R4 ;THEN IT CONVERTS THE ASCII STRING POINTED TO BY R5 TO 3 RAD50 WORDS ;IN THE SPACE POINTED TO BY R4. ;### ASCR50 WILL IGNORE A '.' (DOT) IN COLUMN 7 OF THE ASCII FILENAME ;AND EXTENSION STRING, SINCE THE MT HANDLER PUTS ONE THERE FOR EASE ;OF TRANSFERABILITY TO RSX ASCR50 WILL ALSO MAKE FILENAMES ;LIKE 'ABC.DAT' ON MAGTAPE (OR CASSETTE) LOOK LIKE PROPER RT ;FILENAMES ON THE DIR LISTING. B.C. ;### ASCR50: MOV #DIREMP,R0 ;SET EMPTY IF NON-NULL NAME CMPB (R5),#RUBOUT ;DELETED FILES START WITH RUBOUT BEQ NULNAM CMPB (R5),#ASTRSK ;DELETED FILES ALSO START WITH * BEQ NULNAM ASL R0 ;TYPE 4 FOR GOOD NAME NULNAM: MOV R0,(R4)+ ;INSERT TYPE AS STATUS OF THIS ENTRY MOV #9.,(PC)+ ;COUNT 9 CHARACTERS CTR: .WORD 0 NXTCAR: MOVB (R5)+,R0 ;GET CHAR INTO R0 CMPB #'.,R0 ;IS CHAR A DOT? ;### BNE R50PAK ;IF NE-NO ;### CMP CTR,#3 ;IS THIS CHAR POS 7? ;### BLO R50PAK ;IF PAST 7, TREAT DOT AS DOT ;### BEQ NXTCAR ;IF AT POS. 7 JUST IGNORE DOT ;### MOV #40,R0 ;IF BEFORE 7, MAKE DOT A SPACE ;### DEC R5 ;AND ADJ PTR TO PAD FILNAM W/SPACES ;### R50PAK: DEC (PC)+ ;COUNT DOWN FROM 3 R50CTR: .WORD 0 BGT 1$ ;SPACE LEFT, SO GO *50 CLR (R4)+ ;CLEAR THE NEXT WORD MOV #3,R50CTR ;RESET COUNT 1$: SUB #72,R0 ;CHECK FOR DIGIT ADD #12,R0 BCC 2$ ;NO, GO TRY FOR LETTER ADD #36,R0 ;SCALE DIGIT BR 4$ 2$: SUB #20,R0 ;REDUCE TO LETTER RANGE BLE 3$ ;DELIMITER! CMP R0,#32 ;A TO Z? BLE 4$ ;GOT IT SUB #40,R0 ;MAY AS WELL TRY LOWER CASE BGT 2$ 3$: CLR R0 ;(DELIMITER)-CALL IT A SPACE ;### 4$: ASL -(R4) ;*50+CHAR ASL @R4 ASL @R4 ADD @R4,R0 ASL @R4 ASL @R4 ADD R0,(R4)+ ;KEEP POINTING PAST IT DEC CTR ;COUNT THIS CHARACTER BGT NXTCAR ;IF MORE LEFT, GET NEXT CHAR DDUN: RTS PC ;ASCOCT CONVERTS THE 6 DIGITS POINTED TO BY R5 FROM ASCII DECIMAL TO ;OCTAL IN THE WORD POINTED TO BY R4. ;IT DOES THIS BY GOING THROUGH EACH DIGIT OF THE VALUE ADDING TO ;THE COUNT THE CORRESPONDING BINARY EQUIVALENT OF THAT PLACE ENOUGH ;TIMES TO SEND THAT DIGIT TO 0. ASCOCT: MOV #TENS,R0 ;POINT R0 TO DEC. EQUIVALENTS CLR (R4) ;CLEAR BLOCK COUNT IN DIRECTORY DIG: MOVB -(R5),R1 ;GET ASCII/DECIMAL DIGIT NOTZER: SUB #60,R1 ;RID ASCII BLT DDUN ;THEN FINAL BLANK(MT) OR 0(CT) GOES <0 DDEC: BEQ NDIG ;WHEN DIGIT REACHES 0, GO TO NEXT ADD (R0),(R4) ;ELSE, ADD EQUIVALENT TO COUNT DEC R1 ;AND KNOCK DIGIT DOWN ONE BR DDEC NDIG: TST (R0)+ ;WHEN DIGIT DONE, PT TO NEXT TENS BR DIG ;AND DO NEXT HIGHER DIGIT ;LIST FOR V2 EMT'S LIST: .WORD 0 ;CODE/CHANNEL FFILE: .WORD 0 ;FILE NAME OR SPECIAL FUNCTION BLOCK FLEN: .WORD 0 ;LENGTH FOR ENTER, BLOCK FOR DELETE AND LOOKUP, BUFFER FOR SPECIAL FUNCTION FBLOCK: .WORD 0 ;BLOCK FOR ENTER, WC FOR SPECIAL FUNCTION FWC: .WORD 0 ;FUNCTION CODE FOR SPECIAL FUNCTION FCONT: .WORD 0 ;CONTINUATION ADDR.(NOT USED) .WORD 0 ;USED BY SPFUNC CALL ;THE FOLLOWING TABLE CONTAINS OCTAL EQUIVALENTS OF DECIMAL POWERS OF ;TEN. .WORD 1 ;KLUDGEY WORD FOR DATE CONVERSION TENS: .WORD 1 ;1. .WORD 12 ;10. .WORD 144 ;100. TENTH: .WORD 1750 ;1000. .WORD 23420 ;10000. .WORD 0 ;100000. (TOO BIG FOR 16 BITS) ;THE TABLE BELOW POINTS TO THE BITS IN THE RT11 FORMAT DATE WHERE ;MONTH, YEAR, AND DAY BEGIN. .WORD 12 ;POINTER TO YEAR PLACE*10 .WORD 2000 ;POINTER TO MONTH PLACE OCTH: .WORD 40 ;POINTER TO DAY PLACE ;THE FOLLOWING MONTH TAVLE IS USED TO CONVERT JULIAN MAGTAPE DATES ;TO RT-11 FORMAT MONTAB: 31. ;JAN FEB: 28. ;FEB 31. ;MAR 30. ;APR 31. ;MAY 30. ;JUN 31. ;JUL 31. ;AUG 30. ;SEP 31. ;OCT 30. ;NOV 31. ;DEC .SBTTL OPNDIR ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; OPNDIR WILL OPEN THE DEVICE SPECIFIED BY THE STRING ; POINTED TO BY R5 ON CHANNEL 17 AND SET UP THE RMON ; CHANNEL CONTROL WORD CHKEY. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; OPNDIR: JSR PC,LOCK ;LOCK USR IN CORE CLR 2(R5) ;DO A NON-FILE-STRUCTURED LOOKUP .LOOKUP 16,R5 ;LOOKUP THE FILE (OPEN NON-STRUCT) .IF DF MBUILD JSR PC,FATERR ;CHECK TO SEE IF FATAL ERROR .ENDC BCS BADJMP ;ERROR LOOKING UP DIRECTORY .DSTATU #DEVINF,R5 ;FIND OUT WHAT KIND OF DEVICE TST DEVINF ;WELL, IS IT FILE STRUCTURED? SEC ;SET C FOR BRANCH VECTOR BPL BADJMP ;NOT A DIRECTORY DEVICE .SAVEST 16,#SSB ;SAVE THE STATUS OF THE DEVICE MOV #SSB,R0 ;RESTORE THAT POINTER (CALLER EXPECTS IT!) MOV 10(R0),-(SP) ;GET INDEX AND POINTER FOR CHKEY MOVB (R0),(SP) BIC #301,(SP) CMP (SP),@CHKEY ;IS IT THE SAME AS CURRENTLY ?? BEQ 1$ ;YES, MAYBE NO READ NEEDED CLR @BLKEY ;NO, CAN'T AVOID A READ 1$: MOV (SP)+,@(PC)+ ;PUT IN NEW CHANNEL KEY CHKEY: 0 ;POINTER TO RMON+206 RTS PC BADJMP: JMP BADDIR ;ERROR VECTOR .SBTTL WRDIR ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; WRDIR WILL WRITE OUT THE DIRECTORY CURRENTLY IN THE USR'S ; DIRECTORY BUFFER ONTO THE DEVICE SPECIFIED BY CHKEY AT ; THE BLOCK SPECIFIED BY BLKEY USING CHANNEL OUCHAN. ; DIRWR WILL WRITE OUT THE DIRECTORY SEGMENT SPECIFIED BY R0. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; WRDIR: MOV @BLKEY,R0 ;BLOCK NUMBER OF DIR BLOCK IN CORE DIRWR: ASL R0 ;MAKE IT AN ABSOLUTE BLOCK NUMBER ADD #DIRBLK-2,R0 CLR -(SP) ;WAIT I/O MOV #1000,-(SP) ;TWO BLOCKS MOV USRBUF,-(SP) ;FROM THE USR BUFFER MOV OUCHAN,1$ ;GET THE OUTPUT CHANNEL NUMBER ADD (PC)+,(PC) ;ADD IN THE .WRITE IMAGE .WRITE 1 1$: 0 ;AND EXECUTE THE WRITE BCC GDRTS ;OK ERRWRD: ERROR ;SUPER BAD ERROR .SBTTL MAKEMT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; MAKEMT WILL CREATE AN EMPTY ENTRY IN THE DIRECTORY AT ; THE PLACE POINTED TO BY R4 USING R1 AS THE SIZE IN ; BLOCKS. R4 IS THEN BUMPED TO POINT TO THE START OF THE NEXT ; DIRECTORY ENTRY. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAKEMT: MOV #DIREMP,(R4) ;CREATE AN EMPTY ENTRY MOV R1,10(R4) ;SIZE OF EMPTY IS PREVIOUS UNUSED CLR R1 ;NO MORE UNUSED AT THIS POINT ADD #DIRESZ,R4 ;BUMP NEW DIRECTORY POINTER ADD XTRABY,R4 ;PAST THIS ENTRY GDRTS: RTS PC .SBTTL CONV ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; CONV WILL CONVERT THE NUMBER IN R0 TO A DIGIT STRING ; USING RADIX. THE RESULTING STRING OF DIGITS (LESS ; LEADING ZEROES WILL BE POINTED TO BY R1, WITH A NEGATIVE ; BYTE TO INDICATE THE END OF STRING. R3 MAY BE SET TO THE ; DESIRED FIELD WIDTH, IN WHICH CASE CONV WILL OUTPUT (VIA ; DIRLST) SUFFICIENT BLANKS TO RIGHT JUSTIFY THE DIGITS ; IN THAT FIELD. R4 IS USED AS A TEMPORARY. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CONV: MOV #DIGITS,R1 ;POINTER TO DIGITS OUTPUT AREA MOV R4,-(SP) ;PRESERVE R4 CNVLUP: CLR R4 ;CLEAR REMAINDER WORD MOV #17,-(SP) ;SET BIT COUNT DIVLUP: ASL R0 ;SHIFT DIVIDEND-QUOTIENT REG ROL R4 ;SHIFT REMAINDER REG CMP R4,RADIX ;BIG ENOUGH TO SUBTRACT ?? BLO NOFIT ;NO SUB (PC)+,R4 ;SUBTRACT DIVISOR RADIX: 0 INC R0 ;SET CORRESPONDING BIT IN QUOTIENT NOFIT: DEC (SP) ;ANY MORE BITS ?? BPL DIVLUP ;YES MOVB R4,-(R1) ;SAVE REMAINDER AS RIGHTMOST DIGIT ADD (SP)+,R3 ;DECREMENT DIGIT COUNT TST R0 ;ANYTHING LEFT ?? BNE CNVLUP ;YES, KEEP DIVIDING BLFILL: DEC R3 ;ENOUGH CHARACTERS ?? BMI 2$ ;YES, RETURN MOV #' ,R0 ;NO, PUT OUT ANOTHER BLANK JSR PC,DIRLST BR BLFILL 2$: MOV (SP)+,R4 ;RESTORE R4 DONE: RTS PC .NLIST BEX .BYTE 0,0,0,0,0,0,0 DIGITS: .BYTE 377 .LIST BEX .SBTTL R10OUT AND R10OVT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; R10OUT WILL OUTPUT THE NUMBER IN R0 IN DECIMAL VIA DIRLST, ; WITH A FIELD WIDTH OF 2. R10OVT WILL USE A FIELD WIDTH OF 4. ; BOTH ROUTINES USE CONV. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; R10OVT: MOV #4,R3 ;PRINT 4 DIGIT FIELD BR R10CNV R10OUT: MOV #2,R3 ;STANDARD IS 2 DIGITS R10CNV: MOV #10.,RADIX ;SET RADIX TO 10. R810: JSR PC,CONV ;CONVERT THE NUMBER 1$: MOVB (R1)+,R0 ;GET NEXT DIGIT BMI DONE ;NEGATIVE IS INDICATOR ADD #'0,R0 ;MAKE ITT ASCII JSR PC,DIRLST ;PRINT ON DIRECTORY LISTING FILE BR 1$ ;DO NEXT DIGIT .IF NDF MBUILD R8OUT: MOV #7,R3 ;OCTAL FIELDS ARE 7 LONG MOV #10,RADIX BR R810 .ENDC .SBTTL R50OUT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; R50OUT WILL OUTPUT (VIA DIRLST) THE WORD IN R0 AS THREE ; RADIX 50 CHARACTERS. SPACES ARE PRINTED FOR 0,33,34,35. ; R50OUT USES CONV. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FNAML: JSR PC,R50WD ;FIRST 3 CHARS JSR PC,R50WD ;NEXT 3 MOV #' ,R0 ;PREPARE TO PRINT . OR BLANK TST (R5) ;IS EXTENSION NON-BLANK ?? BEQ 1$ MOV #'.,R0 ;NO, PUT OUT DOT FIRST 1$: JSR PC,DIRLST ;PRINT IT R50WD: MOV (R5)+,R0 ;GET THE RAD50 WORD R50OUT: MOV R3,-(SP) ;PRESERVES R3, R1 MOV R1,-(SP) MOV #3,R3 ;OUTPUT THREE CHARS ALWAYS MOV #50,RADIX ;SET RADIX TO 50 JSR PC,CONV ;CONVERT FROM RAD 50 1$: MOVB (R1)+,R0 ;GET NEXT CHARACTER BMI 5$ ;MINUS IS INDICATOR CHARACTER BEQ 2$ ;ZERO IS A BLANK CMP R0,#32 ;IS IT A LETTER (1-32) ?? BLE 3$ ;YES SUB #36,R0 ;IS IT A DIGIT (36-47) ?? BCC 4$ ;YES 2$: MOV #-40,R0 ;PRINT A SPACE FOR 0,33,34,35 3$: ADD #20,R0 ;CONVERT FROM (1-32) TO (101-132) 4$: ADD #60,R0 ;CONVERT FROM (36-47) TO (60-71) JSR PC,DIRLST ;OUTPUT THE CHAR BR 1$ 5$: MOV (SP)+,R1 MOV (SP)+,R3 RTS PC .SBTTL YESCHK ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; YESCHK GETS A FULL LINE FROM THE TTY ; IT RETURNS CC EQUAL IF THE FIRST CHAR WAS "Y" ; OTHERWISE CC NONEQUAL ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; YESCHK: .TTYIN ;READ CHARACTER FROM TT: MOV R0,-(SP) ;SAVE THE RESPONSE CHARACTER 1$: .TTYIN ;GET NEXT TT: CHARACTER CMP R0,#12 ;IS IT A LINE FEED ?? BNE 1$ ;NO, KEEP SKIPPING CMP (SP)+,#'Y ;WAS RESPONSE "Y......" ?? RTS PC .SBTTL PUTMSG AND CRLF ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; PUTMSG WILL OUTPUT A TEXT STRING VIA DIRLST. THE CALL IS : ; JSR R3,PUTMSG ; .ASCIZ "TEXT OF MESSAGE" ; .EVEN ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MSGLUP: JSR PC,DIRLST ;PRINT ODD CHAR MOVB (R3)+,R0 ;GET ODD CHAR BEQ MSGDUN ;IF ZERO, END OF MESSAGE JSR PC,DIRLST ;PRINT EVEN CHARACTER PUTMSG: MOVB (R3)+,R0 ;GET EVEN CHAR BNE MSGLUP ;NOT ZERO, GO PRINT IT INC R3 ;EVEN OFF THE RETURN REGISTER MSGDUN: RTS R3 .SBTTL DATOUT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; DATOUT OUTPUTS R3 VIA DIRLST AS A DATE. THE DATE ; WILL ALWAYS OCCUPY 9 CHARACTERS WITH A LEADING BLANK ; INSERTED IF NECESSARY. THE FORMAT IS : 12-SEP-73 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; DATOUT: BIT #36000,R3 ;MAKE SURE DATE IS VALID BEQ DIRRTS ;DON'T PRINT, JUST RETURN 1$: MOV R3,-(SP) ;PUSH RIGHTMOST FIELD OF DATE WORD BIC #177740,(SP) ;ONLY 5 BITS ASR R3 ;SHIFT TO NEXT DATE FIELD ASR R3 ASR R3 ASR R3 ASR R3 BNE 1$ ;MORE FIELDS (DATE CAN'T BE 0) MOV 2(SP),R0 ;GET DAY JSR PC,R10OUT ;OUTPUT 2 DIGITS DECIMAL MOV (SP)+,R3 ;GET MONTH ASL R3 ;TIMES FOUR ASL R3 ADD #MONTHS-4,R3 ;POINTER TO MONTH TABLE MOV #5,(SP) ;OUTPUT MONTH (-XXX-) 2$: MOVB (R3)+,R0 ;GET NEXT CHAR OF MONTH JSR PC,DIRLST ;PRINT IT DEC (SP) ;MORE ?? BNE 2$ ;YES TST (SP)+ ;PURGE COUNTER WORD MOV (SP)+,R0 ;GET YEAR ADD #72.,R0 ;ADD 72 FOR BASE YEAR OF 1973 BR R10OUT ;OUTPUT DECIMAL, R10OUT RETURNS .NLIST BEX MONTHS: .ASCII "-JAN-FEB-MAR-APR-MAY-JUN-JUL-AUG-SEP-OCT-NOV-DEC-" .LIST BEX .EVEN .SBTTL DIRLST ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; DIRLST WILL OUTPUT A CHARACTER TO THE DIRECTORY LISTING ; FILE IF THE SWITCH LISTOF IS 0. A SPECIAL CASE CHECK IS ; MADE FOR THE DEVICE TT: AND THE SYSTEM'S TELETYPE ; HANDLER IS USED DIRECTLY. ; ; ; CRLF WILL OUTPUT A CARRIAGE RETURN LINE FEED VIA DIRLST. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; CRLF: MOV #15,R0 ;OUTPUT A CARRIAGE RETURN JSR PC,DIRLST MOV #12,R0 ;THEN A LINE FEED DIRLST: TST (PC)+ ;IS ANY OUTPUT DEVICE GIVEN ?? DIRDES: 0 BNE NOTTT ;YES, ITS NOT TT: .TTYOUT ;IF TT: USE SYSTEM TT: HANDLER DIRRTS: RTS PC NOTTT: .IF NDF MBUILD JMP WRITEC ;WRITE CHARACTER TO DIRLST FILE .IFF JMP HANERR ;ILLEGAL DEVICE .ENDC .SBTTL FGCHK ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; PRINTS "FG PRESENT" ERROR MESSAGE AND RETURNS ; TO START IF A FOREGROUND JOB IS IN CORE. ; USES R0 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; .ENABL LSB FGCHK: MOV @#SYSPTR,R0 ;START ADDR OF RES IN R0 BIT #FGACTV,CONFIG(R0) ;TEST FG BIT IN CONFIG WORD BEQ 1$ ;RETURN IF NO FG AROUND ERROR .SBTTL LOCK AND UNLOCK ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; LOCK SERVES TO ASSURE THAT PIP HAS POSSESSION OF THE USR ; BEFORE IT USES THE USR BUFFER FOR DIRECTORY EXAMINATION. ; UNLOCK SERVES TO RELEASE CONTROL SO THE FOREGROUND CAN GET ; TO USR AGAIN WHEN PIP IS DONE WITH IT. ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; LOCK: TST (PC)+ ;USR IN CORE ALREADY? LOCKF: 0 BNE 1$ ;YES INC LOCKF ;NO-SET FLAG AS WE ARE ABOUT TO GET IT .LOCK ;PULL USR IN CORE 1$: RTS PC UNLOCK: TST LOCKF ;USR IN CORE? BEQ 2$ ;NO-NO NEED TO DO ANYTHING CLR LOCKF ;YES-WE ARE GOING TO KICK IT OUT .IF NDF MBUILD CLR @(PC)+ ;RE-ENABLE CTRL/C'S NOCTLC: 0 ;POINTER TO RMON+212 .ENDC .UNLOCK ;BOOT USR OUT 2$: RTS PC .DSABL LSB .IF DF MBUILD .SBTTL FATAL ERROR AND TRAP HANDLING CODE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; FATERR HANDLES THE FATAL ERROR RETURNS CAUSED BY THE .SERR ; ISSUED WHEN MBUILD STARTS. IT PRINTS AN APPROPRIATE MESSAGE ; IF THE CODE IS MEANINGFUL,ELSE IT LETS NORMAL BCS FOLLOWING ; EMT EXECUTE. IF CODE IS VALID,FATERR RESTARTS MBUILD ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; FATERR: ROR -(SP) ;SAVE CARRY MOVB @#52,R0 ;GET ERROR CODE BMI 1$ ;BRANCH IF FATAL 2$: ROL (SP)+ ;RESTORE CARRY RTS PC ;AND RETURN 1$: NEG R0 ;MAKE ERROR POSITIVE DEC R0 ;ADJUST BY ONE ASL R0 ;TURN ERROR CODE INTO INDEX MOV FATTBL(R0),R0 ;GET ADDRESS OF APPROPRIATE MESSAGE BEQ 2$ ;IF NO MESSAGE,LET ORIGINAL CODE HANDLE IT .PRINT ;PRINT MESSAGE JMP START ;AND RESTART MBUILD FATTBL: 0 M2 M3 0 0 M6 0 0 0 M2: .ASCIZ /?ILL DEV?/ M3: .ASCIZ /?M-DIR IO ERR?/ M6: .ASCIZ /?M-DIR OVFLO?/ .EVEN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; TRPLOC HANDLES TRAPS TO 4 AND 10 BY PRINTING ERROR MESSAGE ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; TRPLOC: MOV R0,-(SP) ;SAVE R0 .PRINT #TRP410 ;PRINT ERROR MESSAGE .TRPSET #TAREA,#TRPLOC ;REISSUE TRPSET MOV (SP)+,R0 ;RESTORE R0 RTI TAREA: .WORD 0,0 TRP410: .ASCIZ /?M-TRAP TO 4 OR 10?/ .EVEN .ENDC .SBTTL STORAGE DECLARATIONS OLNAME: .WORD 0,0,0,0 ;OLD NAME SPACE FOR RENAME NEWNAM: .WORD 0,0,0,0,0 ;NEW NAME SPACE FOR RENAME DEVNAM: .WORD 0,0 ;USED FOR NON FILE STRUCTURED OPEN DEFEXT: .WORD 0,0,0,0 ;DEFAULT EXTENSIONS (ALL BLANK) DEVINF: .BLKW 5 ;DEVICE INFORMATION BLOCK SSB: .BLKW 5 ;SAVE STATUS BLOCK FILDES: .BLKW 47 ;OUTPUT AREA FOR CSI FREE: ;FREE CORE ;HANDLERS ;EXPANDED INPUT LIST ;STATUS BLOCKS FOR INPUT LIST (/X & /R) ;BUFFER(S) .SBTTL INITIALIZATION CODE BEGIN: .IF DF MBUILD .SRESET ;FLUSH ANYTHING ACTIVE .PRINT #VMESAG ;IDENTIFY SELF .SERR ;WE'LL HANDLE ALL ERRORS .TRPSET #TAREA,#TRPLOC ;AND ALL TRAPS .ENDC MOV @#SYSPTR,R2 ;POINTER TO RMON ADD #OFFSET,R2 ;GET ADDRESS OF BLKEY MOV R2,BLKEY TST (R2)+ ;GET ADDRESS OF CHKEY MOV R2,CHKEY CMP (R2)+,(R2)+ .IF NDF MBUILD MOV R2,NOCTLC .IFF MOV SP,@(R2) ;PERMANENTLY DISABLE CTRL C .ENDC TST (R2)+ ;GE ADDRESS OF USR BUFFER POINTER MOV (R2),USRBUF CMP USRBUF,#BEGIN+512. ;WE NEED AT LEAST 1 BLOCK OF BUFFER BHI 1$ ;THERE IS ENOUGH .PRINT #NOCOR ;PRINT FATAL ERROR .EXIT ;AND RETURN TO MONITOR 1$: MOV (R2),R0 ;USR BUFFER IS JUST ABOVE KMON TST -(R0) ;BUFFERS GO UP TO USR .SETTOP ;TEL THE MONITOR ABOUT IT BIS #20000,@#JSW ;SET REENTERABLE BIT MOV #START,@#STRTAD ;SETUP START ADDRESS JMP START ;START PROGRAM NOCOR: .ASCIZ /?OVR COR?/ .IF DF MBUILD VMESAG: .ASCIZ "MBUILD V02-03 " .SBTTL CODE TO WRITE MBUILD CORE IMAGE BR BEGIN ;MBUILD ENTERED AT RE-ENTRY ADDRS ;BY MSBOOT BEGINM: .CSIGEN #FREEM,#DEFEXT,#0 ;GET NAME OF OUTPUT FILE BCS MWERR ;ERROR IN COMMAND STRING MOV #20000,R0 ;WRITE FROM ADRESSES 0-37777 MOV #-1,OUCHAN ;USE CHANNEL 0 (DEFAULT IS 1) JSR PC,WRITE ;WRITE CORE IMAGE ON CHANNEL 0 BCS MWERR ;SOMETHING IS WRONG WITH WRITE .CLOSE 0 ;CLOSE CHANNEL 0 BCS MWERR ;SOMETHING WENT WRPMG MBEXIT: .EXIT ;RETURN TO MONITOR MWERR: .PRINT #OUMES ;PRINT "?OUT ER?" BR MBEXIT ;AND EXIT TO MONITOR FREEM: .ENDC .IF NDF MBUILD .END BEGIN .IFF .END BEGINM .ENDC ; PREPAS.MAC V02-02 .NLIST ; COPYRIGHT (C) 1974,1975 ; ; DIGITAL EQUIPMENT CORPORATION ; MAYNARD, MASSACHUSETTS 01754 ; ; 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 DIGITAL. ; ; 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 DIGITAL. ; ; 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. ; .LIST .SBTTL SOME SYMBOLIC PARAMETERS DOT= 56 LAB= 74 RAB= 76 ENDDEF= -1 MARG= -2 .SBTTL MISCELLANEOUS MACRO DEFINITIONS .MACRO CMPSYM SYM MOV SYM,R0 CALL CMPSYM .ENDM .MACRO STASH SYM MOV SYM,(R3)+ MOV SYM+2,(R3)+ .ENDM .MACRO GETLST SYM MOV #SYM'CNT,R0 CALL GETLST .ENDM .MACRO SCHLST SYM MOV #SYM'CNT,R0 CALL SCHLST .ENDM .MACRO ERROR MSG ENTSEC CHAR CHARPT= . .ASCIZ "MSG" XITSEC JSR R5,ERROR .WORD CHARPT .ENDM .MACRO SAVREG JSR R3,SAVREG .ENDM .IF NDF EIS .MACRO DIV SRC,DST .IIF DIF , MOV SRC,R3 .IIF DIF , .ERROR ;ILLEGAL DIV ARGS CALL DIV .ENDM .ENDC .SBTTL MACRO PREPASS MAIN LOOP .ENABL LSB PREPAS: MOV BUFTBL+TMPCHN,R4 MOV #IMPURE,R0 20$: CLR (R0)+ ;CLEAR IMPURE AREA CMP R0,#IMPURT BLO 20$ MOV #ERRLST,ERRPTR ;INIT ERROR MECHANISM MOV #IDENT,R5 ;IDENTIFY SELF ON LISTING CALL PUTLIN ENTSEC IMPURE IMPURE: XITSEC 4$: CALL GETLIN ;GET A LINE OF SOURCE BEQ 1$ ;LINE OK? RETURN ;END OF INPUT 1$: CALL GETOP ;ISOLATE OPCODE BEQ ENDLIN ;END OF LINE - NO OPCODE CMPB #DOT,@R5 ;DOES OP BEGIN WITH A DOT? BNE ENDLIN CALL GETSYM ;GET OP INTO RAD50 CALL SRCHM ;SEARCH MACRO TABLE FOR SYMBOL BNE 2$ ;NOT FOUND CALL MEXP ;MACRO - GO EXPAND IT BR 4$ 2$: CMPSYM #MCALL ;IS OPCODE ".MCALL"? BNE 3$ CALL MCL ;YES, GO PROCESS IT BR 4$ 3$: CMPSYM #MACRO ;IS OPCODE ".MACRO"? BNE ENDLIN CALL MACR ;GO DEFINE USER MACRO ENDLIN: CALL PUTLIN ;WRITE LINE TO OUTPUT (SCRATCH) BR 4$ .DSABL LSB ENTSEC DPURE MCALL: .RAD50 /.MCALL/ MACRO: .RAD50 /.MACRO/ ENTSEC CHAR IDENT: .ASCII /; RT-11 MACRO EXPAND / GVNUM .BYTE CR,LF,0 XITSEC .SBTTL LINE HANDLERS .ENABL LSB GETLIN: TST SMFLG ;SYSTEM MACRO? BNE 2$ CALL GETPLI ;GET LINE FROM EXEC BIT #IO.ERR,IOFTBL+SRCCHN ;ERRORS? BNE 1$ ;YES TST R0 ;LINE OKAY? BEQ 3$ ;YES BMI GETLIN ;END FILE TRY AGAIN RETURN ;END OF INPUT RETURN 3$: MOV #SRCCHN,R0 4$: MOV BUFTBL(R0),R5 ;LINE POINTER MOV @CNTTBL(R0),R0 ;LINE LENGTH ADD R5,R0 ;CALC ADDR OF TERMINAL CLRB @R0 ;AND SET IT RETURN ;NORMAL (Z SET) 1$: SERROR INE, ;SYSTEM MACRO READ: 2$: $READW SML MOV #SMLCHN,R0 BIT #IO.ERR,IOFTBL(R0) BNE 1$ BIT #IO.EOF,IOFTBL(R0) ;END FILE? BEQ 4$ ;NO, PREPARE LINE RETURN ;YES, Z NOT SET .DSABL LSB .ENABL LSB PUTLIN: MOVB (R5)+,(R4)+ ;MOVE REMAINDER OF LINE BNE PUTLIN DEC R4 ;REMOVE NULL BYTE PUTL1: SUB BUFTBL+TMPCHN,R4 ;CALC LENGTH MOV R4,@CNTTBL+TMPCHN ;AND STORE IN TABLE BEQ 1$ ;ZERO LENGTH - DO NOTHING CMP R4,#SRCLEN ;LINE TOO LONG? BLE 2$ ERROR MOV #SRCLEN,R4 MOV R4,@CNTTBL+TMPCHN ADD BUFTBL+TMPCHN,R4 MOVB #LF,-(R4) ;TERMINATE LINE MOVB #CR,-(R4) 2$: $WRITW TMP 1$: CALL PUTERR ;PRINT ANY ERROR MESSAGES MOV BUFTBL+TMPCHN,R4 RETURN .DSABL LSB .SBTTL STRING HANDLERS GETOP: SAVREG BR 3$ 4$: MOVB (R5)+,(R4)+ ;SKIP OVER COLON 3$: CALL GETNS ;GET NON-SEPARATOR BEQ 1$ ;END OF LINE MOV R5,R1 ;SAVE LINE POINTER CALL GETTM ;GET NEXT TERMINATOR CMPB #':,@R5 ;WAS TERMINATOR A COLON? BEQ 4$ MOVB @R5,R0 ;GET TERMINATOR BITB #C.EOL!C.SEP,CHRTBL(R0) ;END LINE OR SEP? BEQ 1$ ;NO, SO NO OPCODE SUB R1,R5 ;BACK UP PTRS TO BEFORE OPCODE SUB R5,R4 MOV R1,R5 1$: RETURN ;NO OPCODE IF Z SET .ENABL LSB 2$: MOVB (R5)+,(R4)+ ;OUTPUT CHAR GETNS: MOVB @R5,R0 ;GET CHAR BITB #C.SEP,CHRTBL(R0) ;SEPARATOR? BNE 2$ BITB #C.EOL,CHRTBL(R0) ;END LINE? BNE 1$ CLZ ;SIGNAL GOOD RETURN RETURN 1$: SEZ RETURN .DSABL LSB .ENABL LSB 1$: MOVB R0,(R4)+ GETTM: MOVB (R5)+,R0 BITB #C.TER!C.SEP!C.EOL,CHRTBL(R0) BEQ 1$ DEC R5 ;BACK UP RETURN .DSABL LSB .SBTTL SYMBOLIC TO RAD50 DOTSYM: CMPB #DOT,@R5 ;DOES SYMBOL BEGIN WITH A DOT? BEQ GETSYM ;YES, IT IS OKAY ERROR GETSYM: SAVREG MOV #SYMBOL,R2 ;RESULT LOCATION CALL RAD50 ;CONVERT 1ST 3 CHARS CALL RAD50 ;AND NEXT 3 MOVB @R5,R0 ;GET TERM CHAR BITB #C.R50!C.TER!C.SEP!C.EOL,CHRTBL(R0) BEQ 1$ ;ERROR - ILLEGAL CHAR JMP GETTM ;SKIP REMAINDER OF SYMBOL 1$: ERROR RETURN RAD50: MOV #3,R3 CLR R1 ;RAD50 RESULT 5$: MOVB (R5)+,R0 ;GET NEXT CHAR BITB #C.R50,CHRTBL(R0) ;RAD50 CHAR? BEQ 9$ ;NO MOVB R0,(R4)+ ;COPY CHAR TO OUTPUT CMPB R0,#'$ BEQ 4$ CMPB R0,#'A BLO 3$ SUB #56,R0 3$: SUB #11,R0 4$: SUB #11,R0 7$: MOV R1,-(SP) ;MULT PREV RESULT BY 50 ASL R1 ASL R1 ADD (SP)+,R1 ASL R1 ASL R1 ASL R1 ADD R0,R1 ;ADD CURRENT CHAR DEC R3 BGT 5$ MOV R1,(R2)+ ;STORE A WORD OF RESULT RETURN 9$: DEC R5 ;CONTINUE TO POINT TO 'BAD' CHAR CLR R0 BR 7$ .SBTTL SYMBOL SEARCHING ROUTINE CMPSYM: MOV #SYMBOL,R1 ;COMPARE SYMBOL TO @R0 CMP (R1)+,(R0)+ BNE RET1 CMP @R1,@R0 RET1: RETURN SRCHM: MOV #MROOT,R0 ;POINT TO ROOT OF MACRO TREE 1$: CALL CMPSYM ;LESS-EQUAL-GREATER? BEQ RET1 ;EQUAL, RETURN BLO 2$ ;LOWER, USE LEFT SON TST (R0)+ ;HIGHER, POINT TO RIGHT SON 2$: TST (R0)+ TST @R0 ;ANY LINK? BEQ 3$ ;NO, RETURN NOT FOUND MOV @R0,R0 ;FOLLOW LINK BR 1$ 3$: CLZ ;SIGNAL NOT FOUND RETURN ENTSEC IMPURE MROOT: .BLKW 4 ;ROOT OF MACRO SYMBOL TABLE BINARY TREE SYMBOL: .BLKW 2 XITSEC .SBTTL DEFINE MACRO .ENABL LSB MACR1: SAVREG ;ENTRY FROM MCALL STMT BR 30$ MACR: CALL SEMI ;INSERT SEMICOLON INTO OUTPUT CALL GETNS ;GET NON-SEPARATOR BEQ 9$ ;ERROR - NO NAME CALL DOTSYM ;GET DOTTED MACRO NAME 30$: CALL SRCHM ;ALREADY MACRO BY THAT NAME? BEQ 10$ ;ERROR - MULTIPLY DEFINED MACRO MOV AVAIL,R3 ;POINT R3 TO FREE CORE MOV R0,MCIP ;SET MACRO IN PROGRESS MOV R3,@R0 ;LINK NEW MACRO INTO TREE STASH SYMBOL ;STORE MACRO NAME IN DEFINITION CLR (R3)+ ;CLEAR LEFT AND RIGHT SONS CLR (R3)+ GETLST ARG ;GET ARGUMENT LIST 6$: CALL PUTLIN ;OUTPUT THE LINE CALL GETLIN ;AND GET A NEW ONE BEQ 1$ ;LINE IS OKAY SERROR ME, 1$: MOVB #';,(R4)+ ;PLACE SEMICOLON AT BEGINNING 4$: MOV R5,LPIN ;PIN DOWN LEFT END OF LINE 2$: MOV R3,R0 ;ENOUGH ROOM? ADD #STKFDG,R0 CMP R0,SP BHIS 11$ CALL SCNDOT ;LOOK FOR AN ELIGIBLE DOT BNE 6$ ;END OF LINE CALL GETSYM ;CONVERT TO RAD50 CMPSYM #R50DOT ;SOLITARY DOT? BEQ 2$ CMPSYM #ENDM ;".ENDM" DIRECTIVE? BEQ 7$ ;YES, TERMINATE DEFINITION CMPSYM #MACRO ;NESTED MACRO DEF? BEQ 8$ 20$: SCHLST ARG ;SEARCH FOR SYMBOL AMONG ARGS BNE 2$ ;NOT FOUND MOV LPIN,R1 ;GET POINTER TO DOT CMPB -(R1),#'' ;WAS PRECEEDING CHAR A QUOTE? BNE 3$ DEC R3 ;REMOVE QUOTE FROM DEF 3$: MOVB #MARG,(R3)+ ;STORE MACRO ARG FLAG CHAR MOVB R0,(R3)+ ;STORE ARG POINTER SWAB R0 MOVB R0,(R3)+ CMPB @R5,#'' ;DOES QUOTE FOLLOW ARG? BNE 4$ 5$: MOVB (R5)+,(R4)+ ;SKIP IT BR 4$ 7$: CALL VEROP ;MAKE SURE .ENDM IS IN OPCODE BNE 20$ ;FORGET IT, IT'S NOT MOVB #ENDDEF,(R3)+ ;SET END MARKER CALL GETNS ;ANY MORE ON LINE? BEQ 12$ ;NO CALL DOTSYM ;YES, MUST BE NAME OF MACRO CMPSYM @MCIP ;SAME? BEQ 12$ ;YES, OKAY ERROR 12$: INC R3 BIC #1,R3 ;ROUND UP TO NEXT WORD MOV R3,AVAIL CLR MCIP RETURN 8$: CALL VEROP ;MAKE SURE .MACRO IS IN OPCODE BNE 20$ ;IT ISN'T ERROR BR 2$ 9$: ERROR RETURN 10$: ERROR RETURN 11$: SERROR COR, .DSABL LSB ENTSEC DPURE R50DOT: .RAD50 /. / ENDM: .RAD50 /.ENDM/ ENTSEC IMPURE MCIP: .BLKW .BLKW LPIN: .BLKW ENTSEC MIXED AVAIL: .BLKW XITSEC .SBTTL EXPAND A MACRO .ENABL LSB MEXP: MOV R0,R3 CALL SEMI ;INSERT A SEMICOLON ADD #6,R3 ;POINT TO DEFINITION TEXT CALL GETARG ;SET UP ARGS (PTRS AND LENGTHS) CALL PUTLIN MOV #SRCLEN,R2 ADD R4,R2 ;CALC LEGAL END OF LINE 1$: CMP R4,R2 ;CHECK LINE LENGTH BHIS 20$ ;LINE GETTING TOO LONG MOVB (R3)+,(R4)+ ;BEGIN COPYING DEF TO OUTPUT BGT 1$ ;NOT SPECIAL CHAR, KEEP GOING DEC R4 ;BACK UP POINTER MOVB @R4,R0 ;GET SPECIAL CHAR BEQ 2$ ;END LINE - OUTPUT IT CMPB R0,#MARG ;MACRO ARG? BEQ 3$ CMPB R0,#ENDDEF ;END OF MACRO DEF BNE 5$ ;CAN'T HAPPEN MOV BUFTBL+TMPCHN,R4 ;PURGE LINE RETURN 5$: HALT 2$: CALL PUTL1 ;OUTPUT LINE OF MACRO BR 1$ 3$: MOVB (R3)+,R0 ;PICK UP ARG PTR (LOW BYTE) SWAB R0 CLRB R0 BISB (R3)+,R0 ;HIGH BYTE SWAB R0 MOV -2(R0),R1 ;LENGTH OF ARG BEQ 1$ ;NULL ARG MOV @R0,R0 ;POINTER TO ARG 4$: MOVB (R0)+,(R4)+ ;SUBSTITUTE ARG CMP R4,R2 BHIS 20$ DEC R1 BNE 4$ BR 1$ ;DONE 20$: ERROR DEC R4 BR 2$ .DSABL LSB .SBTTL MCALL STATEMENT .IF NDF XSML .ENABL LSB MCL: MOV SP,SMFLG ;SET SYSTEM MACRO FLAG CALL SEMI ;INSERT SEMI COLON GETLST MCL ;GET LIST OF ARGS MOV MCLCNT,-(SP) ;SAVE NUMBER OF ARGS BEQ 3$ CALL PUTLIN ;OUTPUT THE MCALL MOV R4,R3 ;REMEMBER OUTPUT POINTER 1$: CALL INISML ;CALL EXEC TO INIT LIBRARY TST R0 ;GOT A LIBRARY? BNE 2$ ;YES, OKAY ERROR BR 3$ 20$: MOV R3,R4 2$: CALL GETLIN ;READ A LINE FROM LIBRARY BNE 1$ ;BRANCH IF END OF FILE CALL GETOP ;GET OPCODE (IF ANY) BEQ 20$ ;NONE, IGNORE LINE CMPB #DOT,@R5 ;OPCODE BEGIN WITH DOT? BNE 20$ CALL GETSYM ;CONVERT SYMBOL TO RAD50 CMPSYM #MACRO ;.MACRO DIRECTIVE? BNE 20$ CALL GETNS ;YES, GET NAME BEQ 20$ ;NO NAME, YOU LOSE CALL GETSYM ;CONVERT NAME TO RAD50 SCHLST MCL ;IS MACRO IN .MCALL LIST? BNE 20$ ;NO CLR -(R0) ;YES, REMOVE FROM LIST CALL SEMI CALL MACR1 ;DEFINE MACRO CALL PUTLIN DEC @SP ;DECREMENT MCALL COUNT BNE 2$ ;NOT DONE YET 3$: TST (SP)+ ;POP CALL FINSML CLR SMFLG RETURN .DSABL LSB ENTSEC IMPURE SMFLG: .BLKW ;SYSTEM MACRO IN PROGRESS MCLCNT: .BLKW ;COUNT OF MCALL ARGS MCLLST: .BLKW 2*30. ;MAX OF 30. ARGS TO MCALL XITSEC .ENDC .SBTTL SCAN FOR DOT IN MACRO DEFINITION SCNDOT: CALL GETCHR ;GET NEXT CHAR BNE 1$ ;END LINE ENCOUNTERED CMPB R0,#DOT ;IS CHARACTER A DOT? BEQ 2$ ;YES, FOUND ONE! 3$: BITB #C.R50,CHRTBL(R0) ;RAD50 CHAR? BEQ SCNDOT ;NO, GO CHECK FOR DOT CALL GETCHR BEQ 3$ 1$: MOV LPIN,R0 4$: MOVB (R0)+,(R3)+ ;COPY REST OF LINE INTO DEFIN BNE 4$ CLZ RETURN ;END OF LINE RETURN 2$: MOV LPIN,R0 DEC R5 ;BACK UP POINTERS TO DOT DEC R4 MOV R5,LPIN ;AND UPDATE PIN BR 6$ 5$: MOVB (R0)+,(R3)+ ;UPDATE LINE IN DEFIN 6$: CMP R0,R5 ;DONE? BNE 5$ RETURN .SBTTL GET LIST OF ARGUMENT NAMES GETLST: SAVREG MOV R0,R2 CLR (R0)+ ;SET ARG COUNT TO ZERO MOV R0,R3 BR 3$ 1$: CMPB @R5,#', BNE 2$ MOVB (R5)+,(R4)+ ;SKIP OVER COMMA CALL GETNS BEQ 4$ ;END LINE 2$: CALL DOTSYM ;CONVERT TO RAD50 INC @R2 ;INCREMENT ARG COUNT CMP @R2,#30. ;TOO MANY ARGS? BHI 5$ STASH SYMBOL ;STORE NAME IN LIST 3$: CALL GETNS ;SCAN FOR ARG OR COMMA BNE 1$ 4$: RETURN 5$: ERROR RETURN ENTSEC IMPURE ARGCNT: .BLKW LIST: .BLKW 2*30 ;ALLOWS 30 ARGS MAXIMUM LSTEND: XITSEC SCHLST: ;SEARCH ARGUMENT LIST SAVREG MOV (R0)+,R3 ;NUMBER OF ARGS TO SEARCH BEQ 3$ ;NONE- RETURN NOT FOUND 4$: CALL CMPSYM ;MATCH? BEQ 1$ TST (R0)+ ;POINT TO NEXT ARG DEC R3 BNE 4$ 3$: CLZ ;SIGNAL NOT FOUND 1$: RETURN ;Z SET IF FOUND .SBTTL PROCESS LIST OF REAL ARGS .ENABL LSB GETARG: SAVREG MOV #LIST,R1 MOV R1,R2 1$: CLR (R1)+ ;SET ALL ARGS TO NULL TO START CMP R1,#LSTEND BLO 1$ 2$: CALL GETNS ;LOOKING FOR ARG BEQ 5$ ;END LINE, DONE CALL GETCHR CMPB R0,#', ;NULL ARG? BEQ 6$ CLR R3 ;CHAR COUNT CMPB R0,#LAB ;LEFT ANGLE BRACKET BEQ 8$ CMPB R0,#'^ ;UPARROW? BEQ 13$ ;NOT SPECIAL ARG FORM, USE AS IS MOV R5,-(SP) DEC @SP ;POINT TO 1ST CHAR OF ARG INC R3 ;COUNT 1ST CHAR 3$: CALL GETCHR BITB #C.SEP!C.COM!C.EOL,CHRTBL(R0) BNE 4$ ;BRANCH IF END OF ARG INC R3 ;BUMP CHAR COUNT BR 3$ 15$: CLR R0 4$: CMP R2,#LSTEND ;TOO MANY REAL ARGS? BHIS 20$ MOV R3,(R2)+ ;STORE ARG LENGTH MOV (SP)+,(R2)+ ;AND POINTER CMPB R0,#', BEQ 2$ ;GO LOOK FOR NEXT ARG 7$: CALL GETNS ;LOOKING FOR COMMA BEQ 5$ CALL GETCHR CMPB R0,#', BEQ 2$ ERROR BR 7$ 20$: TST (SP)+ 21$: ERROR 5$: RETURN 6$: ADD #4,R2 ;LEAVE ARG NULL BR 2$ 8$: MOV R5,-(SP) ;SAVE PTR TO ARG CLR R1 ;BRACKET LEVEL 9$: CALL GETCHR BNE 20$ ;ERROR, END LINE CMPB R0,#LAB BEQ 11$ CMPB R0,#RAB BEQ 12$ 10$: INC R3 ;BUMP CHAR COUNT BR 9$ 11$: INC R1 ;BUMP BRACKET LEVEL BR 10$ 12$: DEC R1 ;DECR BRACKET LEVEL BPL 10$ BR 4$ ;LEVEL NEGATIVE - DONE 13$: CALL GETCHR ;GET DELIMITER CHARACTER BNE 21$ ;ERROR, END LINE MOV R0,R1 ;SAVE DELIMITER MOV R5,-(SP) ;SAVE PTR TO ARG 14$: CALL GETCHR BNE 20$ CMPB R0,R1 ;DELIMITER? BEQ 15$ INC R3 BR 14$ .DSABL LSB GETCHR: MOVB (R5)+,R0 ;GET NEXT INPUT CHAR MOVB R0,(R4)+ ;AND COPY TO OUTPUT BITB #C.EOL,CHRTBL(R0) ;TEST FOR END LINE BNE 1$ RETURN 1$: DEC R5 ;BACK UP POINTERS DEC R4 RETURN VEROP: SAVREG MOV BUFTBL+SRCCHN,R2 ;PTR TO LINE TST SMFLG ;INPUT FROM SYSMAC? BEQ 1$ ;NO MOV BUFTBL+SMLCHN,R2 ;YES, GET LINE PTR 1$: MOV LPIN,R1 ;GET PTR TO DOT 2$: MOVB -(R1),R0 ;GET PRECEEDING CHAR CMP R1,R2 ;BACK TO BEGINNING OF LINE? BLO 5$ ;YES, VERIFIED 3$: BITB #C.SEP,CHRTBL(R0) ;SEPARATOR? BNE 2$ ;YES, KEEP GOING BACK CMPB R0,#': ;IS CHAR A COLON? BNE 6$ ;NO, VERIFIED NEGATIVE 4$: MOVB -(R1),R0 ;YES, GET PRECEEDING CHAR CMP R1,R2 ;BACK TO BEGINNING? BLO 5$ ;YES, VERIFIED BITB #C.R50,CHRTBL(R0) ;RAD50 CHAR? BNE 4$ ;YES, KEEP LOOKING BR 3$ 5$: SEZ ;SIGNAL VERIFIED 6$: RETURN .SBTTL UTILITIES SAVREG: MOV R2,-(SP) ;ENTER WITH JSR R3,SAVREG MOV R1,-(SP) CALL TSTSTK ;TEST FOR CORE OVERFLOW CALL @R3 ;'RETURN' TO CALLING ROUTINE BNE 1$ ;TEST STATE OF Z BIT MOV (SP)+,R1 ;RESTORE REGS MOV (SP)+,R2 MOV (SP)+,R3 SEZ RETURN 1$: MOV (SP)+,R1 MOV (SP)+,R2 MOV (SP)+,R3 CLZ RETURN MOVBYT: MOVB (R1)+,(R2)+ ;MOVE BYTE STRING BNE MOVBYT DEC R2 RETURN DNC: MOV #10.,R3 ;DECIMAL OUTPUT CONVERSION DNCF: CLR R0 DIV R3,R0 MOV R1,-(SP) MOV R0,R1 BEQ 1$ CALL DNCF 1$: MOV (SP)+,R1 ADD #'0,R1 MOVB R1,(R2)+ RETURN DIV: MOV #16.,-(SP) CLR -(SP) 1$: ASL @SP ASL R1 ROL R0 CMP R0,R3 BLT 2$ SUB R3,R0 INC (SP) 2$: DEC 2(SP) BNE 1$ MOV R0,R1 MOV (SP)+,R0 TST (SP)+ RETURN SEMI: SAVREG ;ROUTINE TO INSERT A SEMICOLON MOV BUFTBL+TMPCHN,R0 ;GET PTR TO OUTPUT BUFFER CMP R0,R4 BLO 2$ MOVB #';,(R4)+ RETURN 2$: MOV R0,R1 ;TENTATIVE PLACE FOR SEMICOLON 1$: CMPB (R0)+,#': ;COLON? BEQ 2$ ;YES CMP R0,R4 BLO 1$ MOVB @R1,R2 ;PICK UP PRESENT CHAR MOVB #';,(R1)+ ;REPLACE WITH SEMICOLON 3$: CMP R1,R4 ;MOVE OVER REMAINDER OF LINE BHI 4$ ;BRANCH IF DONE MOVB @R1,R3 ;PICK UP CHAR MOVB R2,(R1)+ MOV R3,R2 BR 3$ 4$: MOV R1,R4 RETURN .SBTTL ERROR HANDLERS ERROR: MOV R2,-(SP) MOV #ERRLST,R2 BR 2$ 1$: CMP @R5,(R2)+ ;ALREADY IN LIST? BEQ 3$ ;YES, RETURN 2$: CMP R2,ERRPTR ;END OF LIST? BLO 1$ MOV @R5,(R2)+ ;STORE ADDR OF ERROR MSG CMP R2,#ERRLSE ;LIST FULL? BHIS 3$ ;YES MOV R2,ERRPTR 3$: TST (R5)+ ;GET RETURN ADDR MOV (SP)+,R2 RTS R5 ENTSEC IMPURE ERRCNT: .BLKW ;NUMBER OF ERRORS THIS RUN ERRPTR: .BLKW ;POINTER TO END OF ERRLST ERRLST: .BLKW 8. ;MAX # OF ERRORS PER STMT .BLKW ;GUARD WORD ERRLSE: XITSEC PUTERR: CMP ERRPTR,#ERRLST ;ANY ERRORS? BHI 1$ ;YES RETURN 1$: SAVREG MOV #ERRLST,R3 ;GET PTR TO LIST OF ERRORS 2$: MOV BUFTBL+TMPCHN,R4 INC ERRCNT MOV #ERRMSG,R1 ;STANDARD MSG HEADER MOV R4,R2 ;ADDR OF OUTPUT LINE CALL MOVBYT MOV (R3)+,R1 ;ADDR OF MESSAGE CALL MOVBYT MOV #ERRMS1,R1 ;STANDARD MSG TRAILER CALL MOVBYT SUB R4,R2 ;CALC LINE LENGTH DEC R2 BLE 3$ MOV R2,@CNTTBL+TMPCHN $WRITW TMP ;WRITE THE ERROR MSG 3$: CMP R3,ERRPTR BLO 2$ MOV #ERRLST,ERRPTR ;RESET ERROR LIST RETURN ENTSEC CHAR ERRMSG: .ASCIZ /? *** ERROR *** / ERRMS1: .BYTE CR,LF,LF,0 XITSEC .SBTTL CHARACTER TABLE ENTSEC DPURE C.TER= 1 C.EOL= 2 C.SEP= 4 C.R50= 10 C.COM= 20 T.NUL= 0 T.TER= C.TER T.EOL= C.EOL ! C.TER T.SEP= C.SEP ! C.TER T.R50= C.R50 T.COM= C.COM ! C.TER .MACRO GENCHR LIST .IRP SYM, .BYTE T.'SYM .ENDM .ENDM CHRTBL: GENCHR GENCHR GENCHR GENCHR GENCHR GENCHR GENCHR GENCHR GENCHR GENCHR GENCHR GENCHR GENCHR GENCHR GENCHR GENCHR XITSEC .SBTTL FINIS ENTSEC IMPURE IMPURT: XITSEC .END ; RT-11 ASSEMBLER (WITHOUT MACRO FEATURE) VS02-11 ; ; DEC-11-ORTAA-E ; ; MAY 10, 1973 ; BOB BOWERING ; ERIC PETERS ; ; COPYRIGHT (C) 1974,1975 ; ; DIGITAL EQUIPMENT CORPORATION ; MAYNARD, MASSACHUSETTS 01754 ; ; 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 DIGITAL. ; ; 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. ; .SBTTL RT-11 MACRO PARAMETER FILE RT11= 0 XBAW= 0 XCREF= 0 XEDABS= 0 XEDPIC= 0 XEDCDR= 0 XSWIT= 0 XTIME= 0 XLCTTM= 0 XEDLC= 0 XEDPNC= 0 XMACRO= 0 XFLTG= 0 XEDLSB= 0 TRAPS= 0 BRERR= 0 ; RT-11 OBJECT MODULE PATCH UTILITY (PATCHO) ; ; DEC-11-ORPOA-E ; ; ECP, RRB, BAM ; APRIL 1974 ; BC SEP 1975 ; ; COPYRIGHT (C) 1974,1975 BY DIGITAL EQUIPMENT CORPORATION ; MAYNARD, MASSACHUSSETTS 01754 ; ; 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 DIGITAL. ; ; THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE ; WITHOUT NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITTMENT ; BY DIGITAL EQUIPMENT CORPORATION. ; ; DIGITAL ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY ; OF ITS SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DIGITAL. ; .TITLE CMFCV FLOATING COMPARE AND LOGICAL/INTEGER CONVERT ; H.J. .MCALL .REGDEF .REGDEF .GLOBL CMF$SS,CMF$MS,CMF$MM .GLOBL CIL$,CLI$ .GLOBL ICO$,OCO$ ;FLOATING COMPARES. UPON EXIT THE ;CONDITION CODES WILL BE SET FOR THE SIGNED BRANCHES ;COMPARE MEMORY TO STACK+ CMF$MS: MOV (R4)+,R1 ;GET ADDRESS OF VARIABLE MOV (R1)+,R0 ;GET HIGH ORDER MOV @R1,R1 ;GET LOW ORDER MOV (SP)+,R2 ;GET HIGH ORDER OF 2ND OPERAND MOV (SP)+,R3 ;GET LOW ORDER OF 2ND OPERAND BR COMP ;BRANCH TO COMPARE CODE ;COMPARE MEMORY TO MEMORY CMF$MM: MOV (R4)+,R1 ;GET ADDRESS OF VARIABLE MOV (R1)+,R0 ;GET HIGH ORDER MOV @R1,R1 ;GET LOW ORDER MOV (R4)+,R3 ;GET ADDRESS OF 2ND OPERAND MOV (R3)+,R2 ;GET HIGH ORDER MOV @R3,R3 ;GET LOW ORDER BR COMP ;COMPARE STACK+ TO STACK+ CMF$SS: MOV (SP)+,R2 ;GET HIGH ORDER PART MOV (SP)+,R3 ;GET LOW ORDER PART MOV (SP)+,R0 ;GET HIGH ORDER OF 1ST OPERAND MOV (SP)+,R1 ;GET LOW ORDER OF 1ST OPERAND ;THANKS ARE OWED TO R.B.,A.C.,R.L. FOR THE FOLLOWING INSANENESS COMP: CMP R0,R2 ;ARE THEY EQUAL BNE 1$ ;BRANCH IF NOT EQUAL CMP R1,R3 ;MAKE SURE LOW ORDERS EQUAL BEQ 2$ ;BRANCH IF EXACTLY EQUAL ;AT THIS POINT THE C BIT SAYS WHETHER OPERAND 1 WAS BIGGER ;OR NOT THAN OPERAND 2 IN UNSIGNED MODE. C SET IF 1ST SMALLER 1$: BIS R2,R0 ;SET UP N BIT SAYING EITHER WAS NEGATIV BCC 2$ ;IF 2ND SMALLER UNSIGNED N-BIT GOOD NEG R0 ;INVERTS N BIT 2$: JMP @(R4)+ ;EXIT INTO THE WORLD WITH Z,N,V SET CIL$: MOVB @SP,R0 ;CONVERT BYTE TO WORD MOV R0,@SP CLI$: JMP @(R4)+ .SBTTL INTEGER AND OCTAL OUTPUT CONVERSIONS ;STACK ON ENTRY CONTAINS (IN REVERSE ORDER): ; RETURN PC ; NUMBER ; FIELD WIDTH ; FIELD START ADDRESS OCO$: MOV #4,R0 ;SET R0 TO RADIX/2 BR IOGO ICO$: MOV #100005,R0 ;DITTO FOR DECIMAL BUT INCLUDE FLAG IOGO: MOV SP,R1 ADD #6,R1 ;R1 POINTS TO FIELD POINTER MOV @R1,R2 ;GET FIELD POINTER MOV (SP)+,@R1 ;SAVE CALLING PC IN SAFE PLACE MOV -(R1),R3 ;GET FIELD WIDTH MOV R5,@R1 ;SAVE R5 MOV -(R1),R5 ;GET NUMBER - R1 NOW EQUALS SP MOV R4,@R1 ;SAVE R4 ADD R3,R2 ;POINT TO END OF FIELD MOV R3,-(SP) ;SAVE FIELD LENGTH FOR ASTERISKING MOV #"- ,R1 ;SET SIGN PLUS (BLANK) TENTATIVELY ASL R0 ;GET DECIMAL FLAG BCC POS ;OCTAL OUTPUT IS UNSIGNED TST R5 ;DECIMAL OUTPUT IS SIGNED IF NEGATIVE BGE POS NEG R5 ;FORCE NUMBER POSITIVE SWAB R1 ;SET SIGN MINUS POS: CLRB R1 ;DO A 24-BIT DIVIDE OF THE RADIX CLR R4 ;INTO THE NUMBER. DIVIDEND IN R1 AND R5, COM R4 ;QUOTIENT WINDS UP IN R4 (COMPLEMENTED) 2$: ROL R5 ;AND REMAINDER IN R1 BCC 2$ BEQ ZERO ;HANDLE ZERO CASE DIVLP: ROLB R1 CMPB R1,R0 BLO 3$ ;IF WE BRANCH, CARRY IS SET SUB R0,R1 ;THIS CLEARS CARRY 3$: ROL R4 ASL R5 BNE DIVLP ZERO: COM R4 ;RECOMPLEMENT QUOTIENT DEC R3 ;ANY ROOM IN FIELD? BMI IOERR ;NO - FIELD OVERFLOW ADD #'0,R1 ;CONVERT QUOTIENT TO DIGIT MOVB R1,-(R2) ;STORE IT MOV R4,R5 ;SET UP FOR NEXT DIVISION BNE POS ;(IF THERE IS TO BE ONE) BR NOMODG ;NUMBER REDUCED TO 0 - NO MORE DIGITS SGNLP: SWAB R1 ;GET SIGN BYTE MOVB R1,-(R2) ;AND STORE IT MOV #" ,R1 ;AND RESET IT TO BLANK NOMODG: DEC R3 ;HERE WHEN DIGITS EXHAUSTED - ROOM FOR SIGN? BGE SGNLP ;YES - PUT IT OUT CMPB #'-,R1 ;NO - WAS SIGN NEGATIVE? BEQ IOERR ;YES - FIELD OVERFLOW TST (SP)+ ;POP BACKUP FIELD WIDTH QUICKY: MOV (SP)+,R4 ;RESTORE R5 MOV (SP)+,R5 ;AND R4 RTS PC ;AND RETURN ASTLP: MOVB #'*,(R2)+ ;SINCE FIELD OVERFLOWED, R2 POINTS IOERR: DEC @SP ;TO BEGINNING OF FIELD - THEREFORE BGE ASTLP ;USE IT AND THE BACKUP FIELD WIDTH QUICKX: COM (SP)+ ;ON THE STACK TO STORE ASTERISKS. BR QUICKY ;RETURN WITH CARRY ON TO SHOW ERROR ;THE FOLLOWING IS WHAT THE ROUTINE ADDRESS TABLES FOR THE ;CONVERSIONS SHOULD LOOK LIKE - BUT TO AVOID FORCE LOADING ;OF ALL THE CONVERSION ROUTINES, THE COMPILER GENERATES ;REFERENCES TO THE NEEDED ONES AND THEY, WHEN LOADED, PLUG ;THEIR OWN ADDRESS'S INTO THE ACTUAL TABLE WITH THE SAME ;RELATIVE OFFSETS AS THE EXAMPLE. THIS IS DONE USING CSECTS. ; NOTES: ; 1) THE OBJECT TIME COMPILER FORCE LOADS EVERYTHING ; 2) THIS ROUTINE MUST BE IN THE SAME SEGMENT AS THE CONVERSION ROUTINES ; ;OUTPUT CONVERSION JUMP TABLE ; ;OCONVS: .WORD LCO$,OCO$,ICO$,FCO$,ECO$,GCO$,DCO$ ; ;INPUT CONVERSION JUMP TABLE ; ;ICONVS: .WORD AINPUT,LCI$,OCI$,ICI$,RCI$,RCI$,RCI$,RCI$ .CSECT $FIO2 ;FIO CONVERSION ADDRESS TABLES .BLKW 1 ;MAP LOGICAL CONVERSION .WORD OCO$,ICO$ ;FILL IN MY ADDRESSES .BLKW 4 ;MAP REAL OUTPUT CONVERSIONS .BLKW 2 ;MAP A AND L INPUT CONVERSIONS .BLKW 2 ;FILL IN MY ADDRESSES .BLKW 4 ;MAP REAL INPUT CONVERSIONS .END