NEXT TEXT BLOCK SUB R4,R3 ;GET OFFSET FROM TOP OF TEXT AREA ADD #TXTBK1,R3 MOV DDm  ,$ DQ$ 4o w x Dd,H U ^DQ$ S~Z MOV #64.,TXTCNT ;WANT TO WRITE ONLY ONE SECTOR MOVB #1,TXTR.W ;WRITE MOV #TXTLS h#*v2  n    ~ *2 D  7 1-<*2t  R3,TXTPTR ;ACTUAL POINTER TO NEXT OPEN TEXT WORD TXTO50: TST (SP)+ ;POP SAVED PC RTS PC ,lD JQ$Dd  ,,&D ;Q$DdDQ$ 47, ~ҏ T,-(SP) EMT DISCIO ;WRITE OUT FINAL TEXT SECTOR MOV #207,@TRAILPOINTER ;[RTS PC] IN $  0*2  D ^*3  `? < 7 @  .PAGE LPCALL: ;COMMON ROUTINE TO MAKE EMT TO LINE PRINTER MOV #MAPLST,-(SP) EMT  7 W- DDde7W,~ m 7 ɥɥ -,h "eX  ~JTO FINAL TRAILER WRD MOV #TRALST,-(SP) ;LIST FOR TRAILER EMT DISCIO ;WRITE OUT FINAL TRA,Ae**37: e 7 8 .W µ*N3 0 0   C  ` 7 0r3 µ  LPRNTR ;LINE PRINTER RTS PC ; ******************************************************************    .  @>/: 0 H : (H ,F*~ILER SECTOR MOV TRSCSV,TXTSEC ;INIT TO READ IN FIRST TRAILER SECTOR CLRB TXTR.W ;READ   0l0z?*3 0,A7 e 7 N 'W **3@&'@  ** ; SUBROUTINE "BINARY TO OCTAL ASCII CONVERSION" ; INPUT: R4 = BINARY NUMBER ;  7:  e! & : 0j e! @p P: /~: MOV #TXTLST,-(SP) EMT DISCIO ;READ FIRST TRAILER SECTOR MOV TRAPC,R0 . *3M @F ?&'?2 f*4?&'? D? }*,4B R3 = DESTINATION END ADDRESS ; R2 = ITERATION LENGTH (IF ENTER @"B2ONTA") BIN2OC: MOp *: ,7: v W s: v .W p j ~!;BYTES IN PROGRAM PLUS TRAILER ASR R0 ;# WORDS ADD #LEDWDS+PHDSZE,R0 ;TOTAL WORDS" A w`. * @ ? d*P4- * @ nD@H@&' \*t4e 7  6?<  #V #6,R2 ;INIT ITERATION LENGTH (NORMAL 6 CHARS) B2ONTA: ;ENTER HERE WHEN PRE-SETTING ITERATION LENGTH $ cw wf";}G(;}Gn,V W!TsW!Ls%>~*& FROM TOP OF HEADER CLRB R0 ;GETTING # OF PAGES SWAB R0 ;# CORE "PAGES" -1'E *4 7 7 7*4$7 7  v< z *4x x ( MOVB R4,-(R3) ;ALSO LOOP RETURN FOR NEXT OCTAL DIGIT BICB #370,(R3) ;LEAVE ONLY LEAST SI) V ,N s )A 49"$U111*~+ INC R0 ;# OF CORE PAGES MOV R0,-(SP) ;SAVE FOR USE BELOW MOV PRSI,@t > FT :[kV*5n 7 l ! D^  z&54B*(5554  82@B -GNIFICANT THREE BITS BISB #060,(R3) ;CHANGE TO ASCII CODE ASR R4 ;BEGIN SHIFTING . 1 . 49 ` :<}H2,> 77 :  /M~0ZE,R1 ASR R1 ;WORDS IN PGM ONLY ADD #LEDWDS+PHDSZE,R1 ;# WORDS IN PGM PLUS HEADE1E*L5 `B*C( m  v*p5   z556(6@6Z6t6666*56(62Z62FOR NEXT OCTAL DIGIT BIC #100000,R4 ;PREVENT SIGN PROPAGATION ASR R4 ASR R4 3 : .bw:   7 P: &P,  4~5R CLRB R1 ;256 WORDS/PAGE [PDP-11/20] SWAB R1 ;# PAGES -1 (EXCLUDING TRAIL6t66w J B *5ee 톗  t *5(7  R7 @7 DEC R2 ;MORE ASCII DIGITS TO GO? BGT B2ONTA ;BACK FOR MORE RTS PC 8 & T&f&  ,M m -"= $",9\~ ;ER) INC R1 ;# PAGES (EXCLUDING TRAILER) SUB R1,R0 ;# PAGES FREE TO RELEASE AX*6t l  DDm *$6 DQ$ 4o w x Dd*H6 U< ;ASCII BUFFER FILLED: RETURN ; ******************************************************************** ERRPRT: = &,7 e ,0e #0-&],6>~? :E*қޛ* қ@FTER RELOCAT'N SWAB R1 BISB R0,R1 ;BYTE 0 = # PAGES TO RELEASE... MOV #TXTBK1,A ;ERROR MESSAGE PRINTING ROUTINE ; R4 ALREADY INITED WITH BINARY ERROR NUMBER MOV #ERRNUM+2,R3 B *,, F7 Z# 0- ,@ ee  eqCkD*,Қ@M0. /ě+*ě ~"*-ER0 MOV R1,(R0)+ ;...BYTE 1 = FIRST FREE PAGE MOV #240,(R0) ;NOP KEEPS BOUNDARY @ MULTIPF ;LAST CHAR IN ASCII BUFFER MOV #3,R2 ;A 3-CHAR MESSAGE NUMBERR JSR PC,B2ONTA ;USEG,d e&e :, <w  Ve e ,H~Irěě*@^'  &f"eѕ .d  ѕ ѕ 嬞w*JLE OF 4. INCB TXTR.W ;WRITE MOV #TXTLST,-(SP) EMT DISCIO ;WRITE OUT MK SECONDARY ENTRY POINT TO CONVERSION MOV #ERRMSG,TTYBUF ;INIT FOR PRINTING ERROR MESSAGE MOV #TTYLSL  w w e 7! U,  #2-7!~e v, &fe M~rNққ * @қěě`*EEEE*ԛOODIFIED FIRST TRAILER BLOCK .PAGE ;NOW DEFINE A "ROS" FILE FOR THE LOAD MODULE, OUTPUT IT, AND INIT ; THE NECESSPT,-(SP) EMT TTYOUT ;REQUEST MESSAGE EMT EXIT ;CURRENTLY ALL ERRORS TERMINATE LOQ !!!!!, w  @` 7 VB w t2< 7 7*7 Rz~SMM* ěTPTARY TABLES TO RUN THE FILE AS AN OVERLAY TASK. MOV #30,R4 ;INIT ERROR NUMBER MOV BGNSEC,TXTUADER .PAGE TTYLST: .WORD 1 ;TELETYPE I/O LIST .BYTE 0,2 ;DEVICE: TTY #1; CALVe  * ,f e Md-   d & ,W~b!OCTAL DUMP V001A # "YSEC ;SET TO READ IN TASK HEADER INFO CLRB TXTR.W ;READ MOV #TXTLST,-(SP) EMT ZL TYPE: SUSPEND .WORD 0 ;I/O COMPLETE .BYTE 0,0 ;ERROR,LEVEL .WORD [  >  dk $d,, 7? 5Ћ#\~ږ] ^DQ$ S*l6D JQ$Dd  ,[*6&D ;Q$DdDQ$ 47^ DISCIO ;READ IN FIRST SECTOR MOV #LEDWDS*2+TXTBK1,R0 ;POINTER TO FIRST WORD OF HEADER MO_ 0,0 ;RESERVED TTYBUF: .WORD 0 ;DATA BUFFER OBJLST: .WORD 1 ;OBJECT MODULE R`, Bwt` 7h@5e, X0 @ He H, a~Rbp*6 7 W- DDde7,*6~ m 7 ɥɥ *6h "ecVB HTASK(R0),R1 ;TASK # CMP R1,#TASMAX ;WITHIN LIMITS? BGT LDER30 ;OUTSIDE TASdEAD LIST .BYTE 1,2 ;DISC: SUSPEND .WORD 0 .BYTE 0,3 ;ERR TASK, DISC e eHBw` 8$),>  H  8mmH f~ʗgX    e, 7 @>/:<0 H<8*F7* 7:< e! &hK LIMITS CMP R1,#OVTMIN BLT LDER30 MOV HPRIOR(R0),R2 ;PRIORITY CMP R2,#iREQUEST PRIORITY OBJERR: .WORD 0,0 ;ERROR WORD, RESERVED .WORD OBJHED ;DATA BUFFER MAj,b #e#):  $: .  E m7: k ~Bl.j7 e! @p8 77 :< ,b8w:<wIFIED BLE LDER32 LODL10: CMP R1,TASKS ;TASKS = MAX[TASKS,TASKNO] BLE LODL20 MOx.WORD 0 ;DATA BUFFER: CHOSEN DURING RUN TXTLST: .WORD 1 ;LIST FOR TRANSFERS TO/FROM TEXT Ayh 6, p  p c,B b ~z~{  7 P?*8<  & T&f&>*8M m -"E|V R1,TASKS LODL20: MOV #DFLIST,R3 ;POINTER TO "DEFINE" LIST MOV HSTACK(R0),R5 ;FILE I.D. }REA .BYTE 1,2 ;DISC; SUSPEND .WORD 0 .BYTE 0,3 ;ERROR,LEVEL ~b ~f x   p lp >~"*8 &,A7 e^.8e #0-&],A*9F7  CMP R5,#NDISCS+$SYSFL;MUST BE GREATER THAN SYSTEM RESERVED BLE LDER35 ;FILE I.D. ILLEGAL  .WORD 0,0 ;RESERVED .WORD TXTHED ;ALWAYS R/W FROM/TO TEXT AREA TRALST: .WORD 1 i   ~]~@  ,  ROSLOD ~Z# 0- *@9ee  eF*d9 e&e MOV R5,6(R3) ;LOAD FILE I.D. INTO LIST MOVB HSTATS(R0),R5 ;REQUESTED FILE TYPE CMP R5,# ;LIST FOR TRAILER .BYTE 1,2 ;DISC,SUSPEND .WORD 0 .BYTE 0,3 IIA # ROSLOD PASS #,01 END  ROSLOD PASS #2 BEGIN ,T ROSLOD PASS #2 END ERROM~*9 <w  Ve e *9 w w e 7! **9 #$OVTYP ;IS IT LEGAL FOR AN OVERLAY? BNE LDER36 ;NO MOV R5,8.(R3) ;LOAD INTO "DE ;ERROR;LEVEL .WORD 0,0 .WORD TRAHED ;DATA BUFFER .PAGE DFLIST: .WORD 1 R #  x _ z`,z **** ROSLOD LOAD MAP **** A),******~2-7!~e v*9&fe  !!!!!*:w  @` 7 VB w tFINE FILE" LIST MOV TRASEC,R5 ;# OF FINAL SECTOR WRITTEN SUB BGNSEC,R5 ;GET # OF SECTOR ;"DEFINE FILE" LIST .BYTE 0,0 ;ERROR,ERRTSK .WORD 0 ;IFD: RETURNED**** MODULE TITLE: "" SE%CTION ENTRY OFFSET SIZE TOTALM ,<\h0<: 7 7*7 e=Q*f:e Md@-= <*: S -1 INC R5 ;# OF SECTORS IN FILE MOV R5,10.(R3) ;# OF SECTORS TO DEFINE  IF CORE DIRECTORY .WORD 0 ;FILE I.D. .WORD 0 ;FILE TYPE .WORD 0 >  , !******V#(**** UNDEFINED REFERENCES ~> =d@*: 7? 5Ћ#_*:Bwt` 7h@5 MOV R3,-(SP) EMT DEFINE ;GO GET FILE DEFINED TSTB 2(R3) ;ERROR? BN ;# SECTORS IN FILE ; ******************************************************************** TXTHED: G D,Du"hb~z:*:X0 @ He *;  eHBw` 8$)*>; >E LDER33 ;YES MOVB R2,TPRTY(R1) ;PRIORITY MOV 6(R3),IFD(R1) ;INIT FILE I.D. ;HEADER FOR TEXT SAVE BUFFER READ/WRITE OPERATIONS .WORD BTCHID ;FILE I.D. FOR BATCH FILE .BYTE  ""+ ,k~H< 8>mm_*b;#e#):<g,; E m7 MOV 4(R3),R0 ;IFD WORD BEQ LODL25 ;NO IFD RETURNED: LEAVE FILE I.D. BIS #1 0 ;RELATIVE SECTOR TXTR.W: .BYTE 0 ;TEXT READ/WRITE BYTE .WORD 0,0,0 TXTSEC: .W~j:<.; 7ep< ,<,;#0 E w?*;00000,R0 ;SHOW IFD RATHER THAN FILE I.D. MOV R0,IFD(R1) ;USE RATHER THAN FILE I.D. LODL25: CLRB TSORD 0 ;RELATIVE SECTOR TO READ/WRIOTE TEXT TXTCNT: .WORD 0 ;# WORDS TO TRANSFER EACH TIME z~ h?< *<p=*B<b<~>TAT(R1) ;TASK STATUS CLRB IOSTAT(R1) MOVB (SP)+,BSIZE(R1) ;INIT # "PAGES" IN OVERLAY ASTXTBK1: .=.+128. ;FIRST TEXT SAVE BLOCK TXTBK2: .=.+128. ;SECOND TEXT SAVE BLOCK ; ******~Zuf<Mp=>~>@n* ? ROSLOD IIA # RL R1 ;NOW A WORD INDEX CLR HEADER(R1) ;SHOW READY TO RUN MOV BGNSEC,R0 ************************************************************** OBJHED: ;HEADER FOR READING OBJECT MODULES ~ҞOSLOD PASS #*0?1 END  ROSLOD PASS #2 BEGIN *T? ROSLOD PASS #2 END ERROR # x?;INIT RELATIVE READ SECTOR # CLR R1 ;INIT RELATIVE WRITE SECTOR MOV 6(R3),R2 ;W.WORD BTCHID ;FILE I.D. FOR BATCH FILE .BYTE 0 ;RELATIVE SECTOR .BYTE 0 *r   Be*r (- -- *reŸ)eL{~J x  N N Ê <%! ,c 4*z? **** ROSLOD LOAD MAP **** A*?********** MODULE TITLE: "" SE#?CTION ENTRRITE FILE I.D. LODL30: CLRB TXTR.W ;SET TO READ MOV R0,TXTSEC ;SET UP READ SECTOR MO ;READ/WRITE FLAG .WORD 0,0,0 OBJSEC: .WORD 0 ;RELATIVE SECTOR NUMBER .WORD 12e  E*r E EvÝ*s;`Ý1`Ý*`%<< % ѐhˋÜ`E $  P DŸ  LwZ ɋY OFFSET SIZE TOTAL"*?<> *@ !******+V #BTCHID,TXTHED ;SET UP READ I.D. MOV #TXTLST,-(SP) EMT DISCIO ;READ A SECTOR 8. ;ALWAYS READ IN TWO SECTORS OBJBK1: .=.+128. ;FIRST BLOCK FOR OBJECT DATA OBJBK2: .=.+128. I*@s ÝÜEt   *ds UU&|-Dt*sEr ph!(@**** UNDEFINED REFERENCES *D@J h@ TST TXTLST+8. ;ERROR? BNE LDER34 MOV R1,TXTSEC ;SET UP WRITE SECTOR MO ;SECOND BLOCK FOR OBJECT DATA ; ******************************************************************** TR eet?p6 m*s Dw t4%x,s%tBA  J6 v;v;C{ :v;P[*{E7"A*,E @@,PE,EV R2,TXTHED ;WRITE FILE I.D. INCB TXTR.W ;SET TO WRITE MOV #TXTLST,-(SP) AHED: ;HEADER FOR TRAILER WRITES .WORD BTCHID ;FILE I.D. FOR BATCH FILE .BYTE 0 TRARw JG,st UtttttOtgFtGs*\t&E *{  ;i*{ ;[{{*{"vE & T'NX$EP]Wtpu*EIpwn EMT DISCIO ;WRITE A SECTOR TST TXTLST+8. ;ERROR? BNE LDER34 CMPB .W: .BYTE 1 ;ALWAYS WRITE FROM TRAILER AREA .WORD 0,0,0 TRASEC: .WORD 0 ;TRAILER <-~*t76 w e6,tT  0mH5\~{|~{{;{,|{ 7~{{;S,B|{{ d7k nGjwhNU_ E Z | z/ 4 $E = @Dk_1K_ dX*_~ F      (R0)+,(R1)+ ;BUMP BOTH SECTOR NUMBERS CMP R0,TRASEC ;HAVE WE PASSED LAST SECTOR? BLE LODL SECTOR NUMBER .WORD 64. ;WRITE ONE SECTOR AT A TIME TRAILBLOCK: .=.+128. ;TRAILER BUILD}0,t :EtœEtFt Da`Vt.ttӵeK6 w (7i,h|{{;{{7 Y5*| {{{7 &7 ,7 2*|wX`FpFt Fr"Fv30 ;MORE SECTORS TO GO .PAGE MOV #ND2MSG,TTYBUF ;"PASS 2 END" MESSAGE MOV #TTY AREA: OUTPUT WHEN FULL .PAGE IDMSG: IDEND-.-4 ;# CHARS IN I.D. MESSAGE .WORD 0 ,u ؊Ҋ V $Xt(>u5St& H H H).*`uo7D%w(ξ0 e~{*|{{{{{*|7 w {{"$F6FBFNFZFfFrF~FFB2FBFNFZFfFrF~FFF4FNFZFfFrF~FFFF*6F3ZFLST,-(SP) EMT TTYOUT EMT EXIT ;****** E N D O F L O A D E R****** LDER36: INC  .BYTE CR .ASCII "ROSLOD IIA" .BYTE CR,'# IDEND: .EVEN ; ********************************** o1o S(u(p1)p 7u7 bt^tdCu7 P{ `,}w  Nw7 N{4*D}{{{7 &w {{W*h}FN3ZFFN3ZFFN*ZF3ZFFN3ZFFN3ZFFN~F3ZFFN3ZFFN@ R4 ;ILLEGAL FILE TYPE LDER35: INC R4 ;ILLEGAL FILE I.D. LDER34: INC R4 ;F********************************** ND1MSG: ND1END-.-4 ;# CHARS IN "END 1" MESSAGE .WORD 0 7  uuwuw\*ww J DE@!!* x  {{ w ;[$}*}w   e4e8w,}e -w*BF0[FL0[FL0[FL2*fF0[FL0[FL0[FLF0[FLILE SECTOR TRANSFER ERROR LDER33: INC R4 ;"DEFINE FILE" ERROR LDER32: INC R4 ;MAX XEQ ENT .BYTE CR .ASCII "ROSLOD PASS #1 END" .BYTE CR ND1END: .EVEN ; ********************************** CaaŠw Z,.xe! ee  w 3*Txx  ŋ~{7 *}{{{{{{H*}{{{w b ^*~0[FL*NF3\FN3\FN3\FN4*rF3\FN3\FN3\FNFRY ERROR FOR T/S TASK LDER31: INC R4 ;PRIORITY OUTSIDE LIMITS LDER30: MOV R4,-(SP) ;TASK # OUTS********************************** PAS2MG: PAS2ND-.-4 ;# CHARS IN "PASS 2" MESSAGE .WORD 0 .BYTE W*xxe ee e Q Šg x@(p*xU   xB7ne0XT~{w: $*B~ 4w~{wv Df~ECTAPE COPY V001A j3\FN3\FNZFV^FM_FL`FKIDE LIMITS JSR PC,ERRPRT ;GO PRINT ERROR AND EXIT .PAGE REGSAV: MOV R4,-(SP) ;R5 PUSH CR .ASCII "ROSLOD PASS #2 BEGIN" .BYTE CR PAS2ND: .EVEN ; *****************************************xe-ze Tx`*xx^-VE?JFes *yeX .*|~ORIGINAL ON UNIT COPY To*~O UNIT ????  *** I/O *~ERROR, UNIT aFJbFIcFHdFGeFFfFED BY "JSR" MOV R3,-(SP) ;SAVE REST... MOV R2,-(SP) MOV R1,-(SP) MOV **************************** ND2MSG: ND2END-.-4 .WORD 0 .BYTE CR .ASCII "ROSLOD PASS #2 EN ~e$U7*2y E} =f*Vye e eI  *** UNRECOVERA~BLE COPY ERROR ~ COPY COMPLETED '#VERIFY COPY EgFDhFCiF:jF9lF R0,-(SP) JMP (R5) ;...AND RTN REGPOP: ;RESTORE RGS TST (SP)+ ;PD" .BYTE CR ND2END: .EVEN .PAGE ERRMSG: ERNEND-.-4 ;# CHARS IN ERROR MESSAGE .W *zye  *ye @ee *ye_ (Y OR N)? { 7*nF!"FvFnFpFrFtFvFxFzF OP UNNEEDED R5 MOV (SP)+,R0 ;RESTORE OTHERS... MOV (SP)+,R1 MOV (SP)+,R2  ORD 0 .BYTE CR .ASCII "ERROR # " ERRNUM: .BYTE 0,0,0 .BYTE CR ERNEND: .EVEN ; ****   j +*yf w#& P LN .* zFN @N Հ0 E M  |F~FFFFFFFFFFFFFFFFFFFFFFFF FFF*~Fw   Z  MOV (SP)+,R3 MOV (SP)+,R4 RTS R5 ;...AND RTN ; **************************** **************************************************************** HEDING: .WORD END01-4-. .WORD 0 .B *.z   Rz-S--< ez------<wz ^F)b0*Fw && &&  ,*F w f & w" **************************************** GETPC: ;LOAD R4 W/ REL ADDR OF CURRENT TEXT ELEMENT MOV CURPC, YTE FF .ASCII "**** ROSLOD LOAD MAP **** .BYTE LF,LF END01: .EVEN .PAGE MODULE: .WORD  04268*{ !"*{$'(+-.03569:,HT,HT SECVAL: .BYTE 0,0,0,0,0,0,HT SECSIZ: .BYTE 0,0,0,0,0,0,HT CUMSIZ: .BYTE 0,0,0,0,0,0 END04: .EVEN ( *}PҀPҀPҀPT }Ҁ8 }}TRY. JSR R5,REGSAV MOV R4,R2 ;NEED R4 BELOW MOV PTSECT,R4 ;PTR TO BE*  [_  j1]F ,HnF %nFnF]F5jF,H 1^F%nF5lF 4w1+ 4 POINTS TO RAD50 NAME ; OUTPUT: R4 POINTS TO NAME IN LSD (IF FOUND) ; R4 UNCHANGED IF, ; ******************************************************************** .PAGE ENTRY: .WORD END05-4-. - *} L/P 1 PARITY ERROR L/P 1 8}NOT READY~ L/P 1 ABORTED~0}GIN OF CURRENT SECTION INPT01: ADD #BPSYM,R4 ;NEXT (POSSIBLE) SECTION ENTRY ;[SKIP/ _F]FB.IaFf2F $ eF1aF "Fi.:IeFhF "FeF1hFU"F0 NOT FOUND ; CALL: JSR PC,SRMODN ; BR A ;FOUND ; B1 .WORD 0 .BYTE ' ,HT .ASCII " " MFLAG: .BYTE 0 ;PLACE TO PUT POSSIBLE "M" FLA2 }8~~@*~&f&f  7*<~0 T `~ FIRST ONE: IT IS SECTION'S NAME]. CMP R4,SYME ;DID WE REACH END OF DEFINED SYMBOLS? BHIS IN4 ,bIeFaF^"FeF}cF"FeFc*IaF "F eF1eFwh "F*I1aF eF5 R B ;NOT FOUND MOV R0,-(SP) ;SAVE IT MOV #LSDBGN,R0 ;START OF LSD SRMOD1: 6 G .ASCII " " GLOBAL: .BYTE 0,0,0,0,0,0,' ,' ; GLBVAL: .BYTE 0,0,0,0,0,0 END05: .EVEN 7  I*j~   .E @.E *~HE .E *:}*~2}PT02 ;YES: STICK IT IN NOW. CMPB FLAGS+1(R4),#GENTRY ;IS NEXT A GLOBAL SYMBOL ENTRY? BNE 9  "F eF1aF@lFw*IriFw&"FiFwE,IE D0F@lF f2F : CMP R0,SYME ;REACHED END OF DEFINES? BLO SRMOD2 ;NOT YET MOV (SP)+,R0 ;N; .PAGE UNDHED: .WORD END06-4-. .WORD 0 .ASCII /**********/ .BYTE LF,LF .ASCII < RHഊ[_0 } p,~ & wxH*~0 }s INPT02 ;NO: SECTION HAS ENDED: INSERT HERE. ; IT IS STILL IN THIS SECTION: COMPARE WILL DETERMINE ALPHABETIC ORD> \#*J D F+ŀ| n *-*>Jel.bFBE,I u*bJ 5? OT FOUND! ADD #2,(SP) ;ALTER RETURN FOR "NOT FOUND" RTS PC SRMOD2: CMPB #OBJMN,FLAGS+1@ "UNDEFINED REFERENCES" .BYTE LF END06: .EVEN ; **************************************************************A }3"}q, 3 }3 $}*}s&}3 &}3 (} {*F |  &  *}[*jER CMP (R4),(R2) ;FIRST HALF-WORDS: BHI INPT02 ;NEW ONE IS LATER ALPHATETICALLY: C @ ="FC0F5@ *J@w"ĕ eF^"FeF2 *J   ށ bF bFĕ\eFD (R0);THIS ENGRY AN OBJ MOD NAME? BEQ SRMOD3 ;YES: IS NAME SAME? SRMOD4: ADD #BPSYM,R0 ;NOT AE ****** UNDDEF: .WORD 6 .WORD 0 UNDNAM: .BYTE ,,,,, ;SIX CHARS IN NAME OF UNDEFINED REF F }}   |w{,  M*}2}e}*2} }[_& BLO INPT01 ;NEW ONE IS EARLIER: KEEP LOOKING CMP 2(R4),2(R2) ;1ST HALVES EQUAL: COMPARE 2H .JcFĒ1bF  1cFĕ\eFdF,JdFf2F " F="F eFf0Fw.K " I N OJB MOD BR SRMOD1 SRMOD3: CMP (R4),(R0) ;FIRST HALF-NAME MATCH? BNE SRMOD4 J .PAGE ASWICH: .WORD 0 ;SWITCH FOR IGNORING "ASECTS" BC: .WORD 0 ;BYTE COUNT BGNSECK .*  }&  f "}*}* 2 } )} * ND HALVES BLOS INPT01 ;STILL LOWER: TRY AGAIN INPT02: ;TIME TO INSERT ENTRY INTO LSD M ĕ="FeF > 6*DK8w 5 W<.E45.E<A.Ep,hK ,( N ;NO CMP 2(R4),2(R0) ;YES: SECOND HALF-NAME MATCH? BNE SRMOD4 ;NO ; FOUND! O : .WORD 0 ;BEGIN SECTOR FOR BUILDING LOAD MODULE BLKPTR: .WORD 0 ;POINTER TO CURRENT PLACE INP  s}3"}*}3 }3 $}f*D{s&}|3 &}3 (}  M*h 3 }}  M (}%CMP R4,PTROBJ ;IF INSERTING BELOW OBJ MOD POINTER... BHI INPT03 ADD #BPSYM,PTROBJ ;...MUR &0 ~f*K 0 [_C `0  L*K,KS MOV R0,R4 ;NOW POINTS TO LSD ENTRY MOV (SP)+,R0 RTS PC .PAGE PTGLOB: T INPUT BLOCK BLOCK1: 0 ;FLAG FOR FIRST BLOCK IN MODULE CURPC: .WORD 0 ;CURRENT VALUE OF RELATIVE "PCU (} *  M} w} Y* 3 (}}&Ҁ<  MC.ԀfST ADVANCE IT ALONG WITH OTHERS INPT03: BR INSY01 ;GO INSERT AT R4 .PAGE UNSQUISH: ;MAKE A HOW 5@.EAHE > <vF4vF,K& & rnFnF4nFenF4vF*"Lسf `D` X ;SEARCH LSD FOR A GLOBAL NAME (NOT OBJ MOD) ;THE SECRET TO THE LOADER'S CONTROL SECTION ABILITY LIES HERE. ; IF THE SY " DIRSEC: .WORD 0 ;NEXT AVAILABLE DIRECTORY SECTOR MODCNT: .WORD 0 ;COUNT OF # OF MODULES TZ }*}} r .} Z (}*,(}<    |o, wv&ff& ~$}AaeLE IN TABLE. R4 POINTS TO DESIRED HOLE LOC'N MOV R0,-(SP) MOV R1,-(SP) MOV USYME,R0 \ `FiF*FLCD4F1gF]F1eF@jF 4 *jL  eF="Ff2F@F,L] ECTION IS ONE OF THE NAMED ONES, IT APPEARS ONLY ONCE IN THE ; LSD, AND THUS HAS ONLY ONE BASE TO LOAD PROGRAMS FROM. THE UN^ O LINK NAMCTR: 0 ;COUNTER FOR NAMES INPUT FROM TTY NAMPTR: 0 ;POINTER TO NAMES IN INPUT LIST OFFSET: 0 _ s!&}93 ,}*F D! 3 ~  ,} % 3 ~  ,,jRĕ J  s!&}5Еs$}~ ;START @ TOP ENTRY... MOV R0,R1 ADD #BPSYM,R1 ;...AND EXPAND UPWARD UNSQ01: CMP R0a J@lF 3 1dF1bFeFD F,LA5@ =Ff0FiF eF*L"Ff4Fw F Ýb NAMED ; C-SECTS, HOWEVER, ARE DETECTED AS 6 BLANKS, AND ARE MADE UNIQUE TO ; EACH OBJECT MODULE BY LIMITING THE SEARCH TO Tc ;KEEPS OFFSET FROM BEGIN OF LOAD MODULE ONEZRO: .BYTE 1,0 PRSIZE: .WORD 0 ;CURRENT PROGRAM SIZE PTROBJd *   5*  6 & `3 ~ |*؁ 4W 1,R4 ;ARE WE DOWN TO DESIRED LOC'N YET? BHI UNSQ02 ;NOT YET: MOVE ANOTHER ONE MOV (SP)+,R1 f ifF A"F*L7Y`Fw]F@jF@lFk."M7  5@.EsHE 5.Eg HE CURRENT OBJECT MODULE ; AREA IN THE LSD. ; INPUT: R4=PRT TO RAD50 NAME ; OUTPUT: R4=PTR TO LSD ENTRY IF FOh : .WORD 0 ;POINTER TO CURRENT OBJ MOD ENTRY IN LSD PTR1.0: .WORD 0 ;POINTER FOR DETECTING ONEi  .W +5(5%*D eD   * !!5   MOV (SP)+,R0 RTS PC UNSQ02: MOV -(R0),-(R1) ;BLOCK MOVE MOV -(R0),-(R1) MOk *JMl5.Eh5 .EU.E=F=F,nM.Ep w B evF @enF-*MevF l UND ; CALL: JSR PC,PTGLOB ; BR A ;NOT FOUND ; BR B m -ZERO SEQUENC PTSECT: .WORD 0 ;POINTER TO CURRENT SECTION NAME IN LSD SECTCT: .WORD 0 ;SECn *D@& 5 5*h5 } 3.} R* V -(R0),-(R1) MOV -(R0),-(R1) MOV -(R0),-(R1) BR UNSQ01 ; ****************p :J  H }.M]F!]F]F^F^F_F_F E jFjFR,MlFlF J]F3^F3_Fq ;FOUND MOV R0,-(SP) ;SAVE IT MOV (R4),R0 ;IS THIS THE SPECIAL... r TOR COUNTER WHEN READING IN A MODULE SYME: .WORD 0 ;NEXT OPENING IN LSD FOR DEFINED SYMBOL TRAILPOINTER: s  0}}*Ҁ&<  f~ .Ԃ e00& **************************************************** SQUISH: ;REMOVE ENTRY POINTED TO BY R4 FROM THE UNDEF'D TABLE u .N}"Ff2F ^ 3fFw  gFgF..N -$F ,w E =F.v BIS 2(R4),R0 ;...CASE OF 6 BLANKS? BEQ PTGL01 ;YES: START AT CURRENT OBJ MOD MOV w .WORD 0 ;NEXT SPACE IN TRAILER BLOCK TRAPC: .WORD 0 ;TRAILER "PC" TRSCSV: .WORD 0 x k*~www* ~@aAa ! @}*}wjY.0 f JSR R5,REGSAV MOV R4,R0 MOV #BPSYM,R1 ;ELEMENT SIZE ADD R1,R0 z *VNhF7@lF^"FeFw *zN~vf& iFN{ #LSDBGN,R0 ;NO: BEGIN @ BEGINNING OF SYMBOL TABLE BR PTGL02 PTGL01: MOV PTROBJ,R0 ;CURRENT O| ;SAVE OF INITIAL TRAILER SECTOR TSWICH: 0 ;SWICH USED TO DIRECT FLOW AFTER TEXT OUTPUT TXTBC: .WORD 0 }  `Baf}*X 5 f Å*|1 <7 6 ;STAYS ONE ELEMENT ABOVE R1 ASR R1 ;USE BELOW AS COUNTER SQUI01: CMP R0,USYME  NNNNNNNNNNN7NNN N BJ MOD PTGL02: CMP R0,USYME ;END? BLO PTGL03 ;NOT YET MOV (SP)+,R0 ;NOT ;BYTE COUNT OF DATA IN CURRENT TEXT TXTORG: .WORD 0 ;CURRENT PC AT BEGIN OF RESIDENT TEXT TXTPTR: .WOR & * & & &  \ z ă f}}B  *ރ% ;REACHED TOP OF TABLE? BHIS SQUI04 ;YES: EXIT SQUI02: MOV R1,R2 ;COUNTER=# WORDS PER SYMBO  N N N N NNN*FO@ FOUND! RTS PC PTGL03: CMP (R4),(R0) ;FIRST HALF-NAME MATCH? BNE PTGL04 ;NO D 0 ;POINTER TO CURRENT OPEN SLOT IN TEXT USYME: .WORD 0 ;NEXT SLOT IN LSD FOR UNDEFINED SY f'(6 wde6 &<PdS +wwQEeP v*bS  JSR PC,PTGLOB ;CAN NAME BE FOUND IN LSD? GETS01: RTS PC ;NO: ERROR RETURN CMPB I*@E@pM3 4 6* 3 6M]*d  W"R Q*P ;"NEXT BLOCK": SUBROUTINE READS IN SECTORS UNTIL ; AT LEAST ONE BYTE OF NEXT BLOCK IS IN UPPER HALF O Հ  .S ``eFO  N N =Qo"S= Q=Q= Q=Q Q #SECTN,FLAGS+1(R4) ;YES: IS IT A SECTION NAME? BNE GETS01 ;NO:ERR EXIT ADD #2,(SP) *b*@  G.І&f  && F THE ; TWO-SECTOR BUFFER. ONE ADDITIONAL SECTOR IS READ AFTER ; THE FINAL SECTOR IN THE MODU $S} Q zQUANCQf*S~Q N w | Z* T  ;"GOOD" RETURN RTS PC ; ******************************************************************** SRGLOB: [_*& y EAp3 .T Mu*@ @30 <M0 \H (N*@0eLE TO FORCE THE LAST BLOCK ; INTO THE UPPER HALF. NXTB90: JSR PC,NXTMOD ;INIT FOR NEXT MODULE AND 5Q*0Tƫ& . w2d*TTŀE7 :S5@ !d ;SEARCH LSD FOR A GLOBAL & RETURN ITS FINAL VALUE IN R4 ; INPUT: R4=ADDR OF BLOBAL NAME (RAD50) ; OUTPUTTION NAME .WORD LODD20 ;(2) INTERNAL SYMBOL (IGNORE) .WORD LODD20 ;(3) TRANSFER ADDR l$X  -b *d  XMb e$ (,1b e$READ A BLOCK BR NXTB80 ;NO MORE MODULES NXTBLK: MOV #ONEZRO,PTR1.0 ;INIT PTR TO [1] *xT% 4e*T 45 - r*T  : R4=VALUE OF GLOBAL JSR PC,PTGLOB ;SEARCH FOR NAME RTS PC ;NOT FOUND ESS (IGNORE) .WORD LODE40 ;(4) GLOBAL SYMBOL ; ******************************************************** (+.1^be$3 X (M $,$.ևb!  :*! ! +!  (* CMP BLKPTR,#OBJBK2 ;ARE WE INTO LOWER SECTOR? BLO NXTB30 ;NO-NEW READ NOT NEEDED NXTB10: `2 lm l~*T m 44 e*U  5  *_  MOV VALF(R4),R4 ;FOUND: GET VALUE ADD #2,(SP) ;"GOOD" RETURN RTS PC ; ******************** LDER13: MOV #13,R4 ;FIRST MODULE BLOCK NOT "GSD" JSR PC,ERRPRT LDER14: MOV #1 dl80el$ (*7," 4M*N8 6N8*H*N8N ;LOOP HERE FOR SUCCESSIVE SECTOR READS DEC SECTCT ;ANY MORE SECTORS IN MODULE? BLT .,Uw@f 5? @,TUEQw@N CQX*zU" ************************************************************ INUSYM: ;INSERT AN ENTRY IN UNDEFINED SECTION OF LSD ; 4,R4 ;FIRST ENTRY IN GSD NOT OBJ MOD NAME JSR PC,ERRPRT LDER15: MOV #15,R4 ;ILLEGAL GSD E 8 %(?,lW %B %%%*   `  }NXTB90 ;NO MORE: GO INIT FOR NEXT MODULE ;YES - READ NEXT SECTOR--- MOV #OBJLST,-(SP) ;DIS zAND 5~Qw@*UdwW& N & . s*U@NDNC `` " INPUT: R4 POINTING TO ".REF" ENTRY IN GSD MOV R0,-(SP) ;SAVE IT MOV USYME,R0 NTRY DECLARATION JSR PC,ERRPRT LODC19: JMP LODF00 ;END OF READING FIRST PASS OVER OBJ MODS 0  C`U3&f N$*; `f< CEA`*5`C READ LIST EMT DISCIO ;****READ NEXT SECTOR**** TST OBJERR ;READ ERROR? c/,U  NN B [_{. VWf @ ԩ NQ&4V MOV (R4)+,(R0)+ ;MOVE IN THE UNDEFINED MOV (R4)+,(R0)+ ;SYMBOL ENTRY MOV (R4)+,(R0)+ .PAGE ;****************PROCESSING FOR INDIVIDUAL G S D ENTRIES************** ; ON ENTRY TO EACH ROUTINE, R1 AND R4 PO  $*w>w*n.(fF 5 f ..P1 3 BNE LDER01 ;YES INC OBJSEC ;BUMP SECTOR # FOR NEXT TIME SUB #128.,BLKPTR QN  N w^w*TV5Qw@B  *xV``BmN V R@ uN MOV (R4)+,(R0)+ ADD #BPSYM,USYME ;BUMP POINTER JSR PC,SYMOVF ;OVERFLOW? INT TO CANDIDATE ENTRY ;*******MODULE NAME******** LODE00: JSR PC,SRMODN ;SEARCH FOR MODULE NAME $3 4s 2p*x3 X :0   s\3 &.,?Z -JKL*MNOPQ !$*); R  stuvwxj*y z &ABCDEFGH `. ;HAVE BOTH [1] AND [0] BEEN TESTED? BNE NXTB44 ;NO - CHECK FOR [0] .PAGE ; YE  NX+NX& &  wJ*dXY2u*X CURRENT SECTION ;OF LSD. R4 POINTS TO CANDIDATE ENTRY. JSR R5,REGSAV MOV R4,RR LODE22: MOV R1,R4 ;INSERT NEW SECTION NAME INTO LSD MOV SYME,PTSECT ;POINTER TO SECTION *ڋ<(+|I   abcdefgh u*i jklmnopq r *"  A! A [1-0] SEQUENCE HAS BEEN FOUND: NOW PROCESS BLOCK MOVB (R0)+,R1 ;BLOCK'S BYTE COUNT TSTB *X*X 2 ;NEED R4 BELOW MOV PTSECT,R4 ;PTR TO BEGIN OF CURRENT SECTION INPT01: ADD #BPSYM,R4 NAME IN LSD JSR PC,INSYME ;INSERT NEW NAME IN LSD BR LODD20 LODE24: ;SECTION NAM \()[] *F @yz{|}~123456789:;*j<=>?aiklmno!"#$%&'()*+,-./(R0)+ ;UPPER BYTE OF BC MUST BE ZERO BNE LDER02 MOV R0,R5 ;SAVE POINTER TO FIRST X X*FZ&jZ ;NEXT (POSSIBLE) SECTION ENTRY ;[SKIP FIRST ONE: IT IS SECTION'S NAME]. CMP R4,SE FOUND ALREADY DEFINED IN LSD CMPB FLAGS+1(R4),#SECTN ;IS IT A SECTION NAME,TOO? BNE LDER17  *`YZ[\]^_С<*bcdefgh P *֌IJKLMNO DATA BYTE ; NOW WANT TO COMPUTE CHECKSUM TO VERIFY CORRECT READ: MOV R1,R2 ;INIT CHECKSUM,  pZZ AC: V Z ? Z ILL CMD! Z  YME ;DID WE REACH END OF DEFINED SYMBOLS? BHIS INPT02 ;YES: STICK IT IN NOW. CMPB FL ;NO - DOUBLE DEFINITION ERROR MOV R4,PTSECT ;SECTION NAME POINTER TO ORIG ENTRY CMP VA  *ABCDEFGHjX*QRSTUVWXpqrssWHICH INCLUDES BC SUB #4,R1 ;REDUCE BC TO ELIM "1-0" AND BC WORDS MOV R1,BC ;S ILL PAR! ZNON-QUIESCENT *X  Y]X AGS+1(R4),#GENTRY ;IS NEXT A GLOBAL SYMBOL ENTRY? BNE INPT02 ;NO: SECTION HAS ENDED: INSERT HERE. LR(R4),VALR(R1) ;COMPARE SECTION SIZES BHIS LODD20 ;ORIG WAS BIGGER: LEAVE IT MOV VALR *Btuvwx0@@P~}zn|@@@@@@@*f@@@@@@@@a@@kMl@@@@@@@@@@@@*@@@@AVE BYTE COUNT OF DATA ONLY NXTB50: MOVB (R0)+,R3 ;EXTRACT NEXT BYTE ADD R3,R2 ;ACCUM CHECK ENZDS[QU[XX [TM[&XDT(\REYTYZCR"ZLP4ZEX~Z8YFZ \,TZ$&.YFZ  ; IT IS STILL IN THIS SECTION: COMPARE WILL DETERMINE ALPHABETIC ORDER CMP (R4),(R2) ;FIRST HALF-WORDS: (R1),VALR(R4) ;REPLACE WITH NEW BIGGER SIZE BR LODD20 ; ********************************************** @@[\^j@@@@@@@@@@@@@@@-*Z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@N*ҍ@@KL;@@@@@@@@@ @@o@@@@@@@SUM DEC R1 ;MORE DATA BYTES TO ADD IN? ;BYTE COUNT INCLUDES CHECK %7  *NYX " X$ wrYpZ TZY7  BHI INPT02 ;NEW ONE IS LATER ALPHATETICALLY: BLO INPT01 ;NEW ONE IS EARLIER: KEEP ********************** LDER17: MOV #17,R4 ;SECTION NAME CONFLICT W/GLB OR MOD NAME JSR PC,ERRPR *@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@R*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@->@@@@@@@@@@@@SUM BYTE... BGE NXTB50 ;SO GO BACK FOR ONE EXTRA BYTE AT END INCB R2 ;CHECKSU FZ v VZ,YD XS#  ZFZ g*Y  Z|W, ! LOOKING CMP 2(R4),2(R2) ;1ST HALVES EQUAL: COMPARE 2ND HALVES BLOS INPT01 ;STILL LOWERT .PAGE ;*******GLOBAL SYMBOL******** (HERE AT LAST...) LODE40: BITB #UNDEF,FLAGS(R1);REF OR DEF?  @@@@.Ȏ.q8q&qx 7r wqa*w 7tdcsw  7^w w ,>ĝM ITSELF INCLUDES THE "1" @BEGIN BNE LDER03 ;CHECKSUM ERROR MOV R0,BLKPTR ;ADVANCE B *Y 7!8 E.E W,q. ZWLWC 0 v)wWT /2Zw : TRY AGAIN INPT02: ;TIME TO INSERT ENTRY INTO LSD CMP R4,PTROBJ ;IF INSERTING BELOW OBJ MOD POINBEQ LODE50 ;REF JSR PC,PTGLOB ;DEF - SEE IF IT IS ALREADY IN LSD BR LODE44 " \7p70 , pp*:w.& pp@p DV*^ A  &DCc  w LK PTR-READY FOR NEXT BLOCK MOV R5,R0 ;RESET LOCAL PTR TO FIRST DATA BYTE BIT #1,R0 $ WT L) *Z7 7 7 aZc ZZ   h*Z<[T[[[ % TER... BHI INPT03 ADD #BPSYM,PTROBJ ;...MUST ADVANCE IT ALONG WITH OTHERS INPT03: BR INSY01 ;NOT FOUND BITB #UNDEF,FLAGS(R4);FOUND: IS IT ALREADY DEFINED? BEQ LODE42 ;NO: GO REMOVE' 2w * w  ' 7  P*&w \w wXw w  .ʏf ;IS ADDR OF FIRST DATA BYTE ODD? BEQ NXTB70 ;EVEN: NO RELOCATION NEEDED MOV BC,R3 ) W,2`,[ 0!- )!&7!#ƤyZ 0<[K_4K_K_K_* ;GO INSERT AT R4 .PAGE UNSQUISH: ;MAKE A HOLE IN TABLE. R4 POINTS TO DESIRED HOLE LOC'N MO IT FROM UNDEF AREA BISB #DBLDEF,FLAGS(R4) ;FLAG OLD ONE AS A DOUBLER BISB #DBLDEF,FLAGS(R1) , w |t w 7 wtwhw * %E ed wh喙*6 _ =w F6 / ;NEED TO MOVE ALL BYTES BACK ONE NXTB60: MOVB (R0)+,-2(R0) ;SHIFT BYTE BACK ONE DEC R3 . $f[ ZFZ  K_&[v&& & &  & {,[ HH:MM:SS / V R0,-(SP) MOV R1,-(SP) MOV USYME,R0 ;START @ TOP ENTRY... MOV R0,R1 ;ALSO FLAG NEW ONE BR LODE44 ;BYPASS REMOVAL LODE42: JSR PC,SQUISH ;REMOVE FROM UNDEFIN1 w :( w q*:2! w * w "w * 7 w *^7w 77R_ J*w ;MORE BYTES TO MOVE? BGT NXTB60 ;YES MOV R5,R0 DEC R0 ;NOW POI3 MM/DD/YY [ *[[[[[[ &e I*[ W, ! J4 ADD #BPSYM,R1 ;...AND EXPAND UPWARD UNSQ01: CMP R0,R4 ;ARE WE DOWN TO DESIRED LOC'N YET? BHI ED TABLE SUB #BPSYM,USYME ;AND ADJUST ITS POINTER LODE44: MOV R1,R4 ;AGAIN POINT TO INPUT ENTR6 7  ww (b ww ,*w A B` r%m*ʐ w| 7twNTS TO FIRST DATA BYTE NXTB70: MOV BC,R5 ;INIT R5 WITH DATA BYTE COUNT ADD #2,(SP) ;BUMP 8 *\  u[[w*xW, !|,6\ Ru[[ [(\\ DԝD9 UNSQ02 ;NOT YET: MOVE ANOTHER ONE MOV (SP)+,R1 MOV (SP)+,R0 RTS PC UNSQ02: MOV Y JSR PC,INPTRH ;INSERT IT ALPHABETICALLY IN THIS SECT'N ;IF IT WAS DOUBLY DEFINED, BOTH ENTRIES ARE FLAG; rj*whg E 7pwhP *E tP Iw *6-FOR "GOOD" RETURN NXTB80: RTS PC ; ******************************************************************** LDER01: MO= ԝA  FZ *~\ w  ы Dĥ  *\D0 C ``a > -(R0),-(R1) ;BLOCK MOVE MOV -(R0),-(R1) MOV -(R0),-(R1) MOV -(R0),-(R1) GED AS SUCH. THE FIRST ;ENTRY WILL BE USED AS THE REF'D VALUE. THE MAP WILL SHOW ALL OF THEM. BR LODD20 ; * @ % w  =w p*Z7 킎=w e0*~w ,w %@w ~kV #1,R4 ;OBJ MODULE BLOCK READ ERROR JSR PC,ERRPRT LDER02: MOV #2,R4 ;BLOCK BYTE COB &\- v6 w b6\*\'d w @\ Օ+{* ]  d C MOV -(R0),-(R1) BR UNSQ01 ; ******************************************************************** * * GLOBAL REF * * * LODE50: JSR PC,PTGLOB ;IS IT IN LSD ALREADY? BR LODE52 ;NOT FOUND: INSEE O*e=w @w Xww*Ƒw=w  w  d*w *AUNT ERROR JSR PC,ERRPRT LDER03: MOV #3,R4 ;OBJ MOD BLOCK CHECKSUM ERROR JSR PC,ERRG 0B` e0  .]w %Օ- ҋ P]\.D]  H SQUISH: ;REMOVE ENTRY POINTED TO BY R4 FROM THE UNDEF'D TABLE JSR R5,REGSAV MOV R4,R0 RT IT BR LODD20 ;FOUND: NO NEED TO DO ANYTHING LODE52: JSR PC,INUSYM ;INSERT AS AN UNDEFINEJ e0w v,w nHBFR*w 6- .27삎, *2( B:8w PRT .PAGE ; " T R A P U T " ; SUBROUTINE PUTS AN "ADD R1,LOC" TWO-WORD INSTRUCTION IN THE TASK ; TRAILER,L *l] x ]$]xf&f&X*]J M MOV #BPSYM,R1 ;ELEMENT SIZE ADD R1,R0 ;STAYS ONE ELEMENT ABOVE R1 ASR R1D BR LODD20 .PAGE ;NOW ALL OBJ MODULES HAVE BEEN PASSED OVER ONCE, ALL ; GSD'O ?*Vw 7 w 777     w *z%0 %7E `  11, W ֆ TO BE EXECUTED WHEN THE LOAD MODULE IS READ INTO CORE PRIOR ; TO TASK EXECUTION, THUS EFFECTING DYNAMIC RELOCTTION. THE SUBQ   r]v  w]] l7 wlqR ;USE BELOW AS COUNTER SQUI01: CMP R0,USYME ;REACHED TOP OF TABLE? BHIS SQUI04 S HAVE BEEN PROCESSED, AND THE LOADER'S SYMBOL DIRECTORY ; (LSD) HAS BEEN CONSTRUCTED. NOW THE LSD MUST BE PASSED OVER T  m7 yĒĒ hxtΓ ؒB^֐ *쒜ȑ,JБZROUTINE ; CALCULATES THE PROPER DISPLACEMENT BETWEEN THE INSTRUCITON AND "LOC", ; THE WORD IN THE TEXT NEEDING DYNAMIC RELV *^^^^) ERROR XXXXX#,^ SXXXXX SXXXXX SXXXXX SXXXXX *J^&^-^4^;^B^W ;YES: EXIT SQUI02: MOV R1,R2 ;COUNTER=# WORDS PER SYMBOL SQUI03: MOV (R0)+,(R4)+ ;BLOCK TRANSFER ; TO ASSIGN LOAD MODULE RELATIVE ADDRESSES TO ALL GLOBAL SYMBOLS, ; AND SECTION BASES ASSIGNED. THE LOAD MAP WY >Z7U<*D 2 7.7(%  *4w %=w OCATION. THE FORMULA FOR THE ; DISPLACEMENT BETWEEN THE "ADD" INSTRUCTION AND ITS OBJECT IN THE LOAD ; TEXT IS: [ w *n^ w | w| z.^fw  7 \'wV^P0\ DEC R2 BGT SQUI03 ;STILL IN BLOCK BR SQUI01 SQUI04: JSR R5,REGPOP ILL THEN BE PRINTED, ; SHOWING LOAD MODULE RELATIVE ADDRESSES, MULTIPLY DEFINED SYMBOLS ; ACCOMPANIED BY A "M" F^ *Xw  w w ww i*|  7mw -* DISPL = CURPC + OFFSET - TRAPC ; THIS DISPLACEMENT IS NEGATIVE, SINCE ALL REFERENCES FROM THE TRAILER ; WILL BE ` ,^@J^f& &  R ^,^ n f  _ a RTS PC .PAGE NXTMOD: ;ROUTINE SETS UP PARAMETERS TO READ NEXT OBJ MODULE DEC NAMCTR LAG. LODF00: ;END OF PASS 1 MOV #ND1MSG,TTYBUF ;INIT TO PRINT "END PASS 1" ON TTY MOV #Tc w %/w *ē\ z \pp * L e  !B !=BACKWARD. TRAPUT: ;SUBROUTINE TO BUILD TRAILER ADD #4,TRAPC ;ADVANCE TO NEXT OPEN CELL AFTER Te "_s_$_&_(_*_,_._0_2_4_6_._8_:_<_>_@_B_("_f ;MORE MODULES? BLT NXTM30 ;NO MORE: TAKE "DONE" EXIT CLR BLOCK1 ;FLAGS FIRSTTYLST,-(SP) EMT TTYOUT CLR PRSIZE ;INIT PROGRAM LOAD SIZE MOV #LSDBGN,R0 h . L !644  !4*44 % w  *X @HIS 1. MOV TRAILPOINTER,R3 ;NEXT OPEN TRAILER SLOT MOV #60167,(R3)+ ;"ADD R1,A" INSTRUCTION j V*|_f&×&  6  `7r]ߕy*_K_ K_V[_R *_k BLOCK IN MODULE MOV NAMPTR,R0 MOV 4(R0),OBJSEC ;START SECTOR # MOV 6(R0),SECTCT ;INIT PTR TO LSD MOV R0,PTROBJ ;...AND TO CURRENT OBJ MODULE BR LODF20 LODF10: ADD #Bm w @ % % w #*| ww  S*D  &C@AEPA&f JSR PC,GETPC ;GET VALUE OF CURRENT LOAD OFFSET SUB TRAPC,R4 ;CALC BACKWARD DISPLACEMENT o *_ K_ߐk_Wr*_r ߕ 4 __K_4[_2* `2  p ;SECTOR COUNT INC SECTCT ;WANT ONE EXTRA SECTOR ON LAST READ ADD #8.,NAMPTR ;ADVANPSYM,R0 ;NEXT ENTRY LODF20: CMP R0,SYME ;END OF LSD? BHIS LODF90 ;YES: EXIT LOOP r >*Ĕw w /w w :w *  ` E , ` H CMP -(R4),-(R4) ;SINCE "PC" IS ADVANCED, BUT "TRAPC" NOT MOV R4,(R3)+ ;STICK IT BEHIND "t ߐ  *0`ee *w *T` 6 u CE TO NEXT NAME MOV #OBJBK2,BLKPTR ;INIT BLOCK POINTER TO FORCE FIRST READ ADD #2,(SP) ;B MOVB FLAGS+1(R0),R1 ;ENTRY TYPE MOVB FLAGS(R0),R2 ;QUALITIES FLAG CMPB R1,#GENTRY w  8 wFjn*2w 7U4E(w T76".V  pADD" ; NOW SEE IF BUFFER IS FULL, AND WRITE IT OUT IF SO: CMP R3,#TRAILBLOCK+64. ;AT END YET? y *x`ߕ R7 ~f*`vd *_ 6 6*` ×ߕz UMP TO TAKE "GOOD" EXIT NXTM30: RTS PC .PAGE ;"NEXT BLOCK": SUBROUTINE READS IN SECTORS UNTI;GLOBAL SYMBOL? BEQ LODF50 ;YES DEC R1 ;SECTION NAME? BNE LODF10| jC*~w V׭hjUA*7w @ŝ*ƕŝ BLO TRAP20 ;NOT YET MOV #TRALST,-(SP) ;LIST FOR WRITING TRAILER EMT DISCIO ~ >&07  X.` 2 7  K_ߐK_* a <"_*_0*__0*_"_ߐ L ; AT LEAST ONE BYTE OF NEXT BLOCK IS IN UPPER HALF OF THE ; TWO-SECTOR BUFFER. ONE ADDITION ;NO: GET NEXT ENTRY .PAGE ;*******SECTION NAME: MAKE ITS SIZE EVEN, STORE ITS BASE VALUE, SET PTR ; w"jt w*ꕆt! w w Jtuw 4,@eZ%ĕt72  INC TRASEC ;BUMP TRAILER SECTOR COUNT MOV #TRAILBLOCK,R3 ;PREPARE TO RESET POINTER TRAP20: u*0a& (w,ߕh*Ta 1K_7 7 7 |0 *xawK_ AL SECTOR IS READ AFTER ; THE FINAL SECTOR IN THE MODULE TO FORCE THE LAST BLOCK ; INTO THE UPP TO THIS SECTION, AND INCREMENT THE TOTAL PROGRAM SIZE. BITB #ABSREL,R2 ;ABSOLUTE OR RELOCATABLE? A*4w Bw .e` w ;w d*Xĝw wpf&*|f MOV R3,TRAILPOINTER ;NEW POINTER RTS PC .PAGE ; " T X T O U T " ; ("TXTBC" MAY &f K7xH&aߕK_ ya$b$baaaa$b$b,a& zߕ *61 7 .7 ( ER HALF. NXTB90: JSR PC,NXTMOD ;INIT FOR NEXT MODULE AND READ A BLOCK BR NXTB80 ;NO MORE M BNE LODF30 ;REL CLR VALR(R0) ;ABS: SET SIZE... CLR BASE(R0) ;...AND  G.4 hh,Ȗ7h7hhw rh5 BE ZERO, WHICH INDICATES "CURPC" HAS BEEN SET TO A NEW ; VALUE BY AN RLD COMMAND. IF THE NEW PC STILL FALLS WITHIN BLOCK # .a7 e "ffffffK_>bI* bW"1f 8W*.bc ODULES NXTBLK: MOV #ONEZRO,PTR1.0 ;INIT PTR TO [1] CMP BLKPTR,#OBJBK2 ;ARE WE INTO LOWER SECTOBASE = 0 BR LODF40 LODF30: ;RELOCATABLE SECTION MOV VALR(R0),R3 ;SECTION SIZE hh*gzhbxhV  < !*%& &e@*6 1, ; NO TRANSFER WILL OCCUR. IF THE NEW PC IS INTO THE SECOND BLOCK, OR ; OUTSIDE THE TWO BLOCKS, BOTH BLOCKS WILL BE WRIT 2bw  Kp*Rb7H *_ ߕK_ 8 *vb*6K_B "_+C  R? BLO NXTB30 ;NO-NEW READ NOT NEEDED NXTB10: ;LOOP HERE FOR SUCCESSIVE SECTOR READS MOV R3,R4 ASR R4 ADC R3 ;MAKE SIZE EVEN MOV PRSIZE,BASE(R0) ;SET B N @ e0w &  *Z h7ggl*~gE TEN OUT, AND THE ; APPROPRIATE NEW TWO BLOCKS WILL BE READ IN. IN MANY CASES THIS WILL ; MEAN THAT A PARTIALLY-WRITTEN TEXT  *b%ߕW" "_ r"_ "__`_*bL2_1 0K_vw ^l*b  DEC SECTCT ;ANY MORE SECTORS IN MODULE? BLT NXTB90 ;NO MORE: GO INIT FOR NEXT MODULE ASE OF NEW SECTION ADD R3,PRSIZE ;SUM UP TOTAL SIZE (& END OF THIS SECT) LODF40: MOV R0,PTSECT w *  w ׭g ^*Ɨw Uw dw njU*  BLOCK #2 WILL BE WRITTEN TO DISC, ; ONLY TO BE READ BACK IN AGAIN INTO BLOCK #1. IN THIS WAY, ; WE CAN BUFFER OUR TEXT OUT f&×&  17*c.ߕK_)K_ *_ **c __K_ߐ   ;YES - READ NEXT SECTOR--- MOV #OBJLST,-(SP) ;DISC READ LIST EMT DISCIO ;****READ ;POINTER TO NEW SECTION BR LODF10 ;GET NEXT ENTRY ;*******GLOBAL ENTRY POINT LODF50: BI 7,XR삎-P DI*w@ 78 %(! U,2 %?? ONE SECTOR AT A TIME, AND PROTECT THE ; INTEGRITY OF OUR NEWLY CREATED TEXT.) TXTOUT: ;SUBROUTINE TO OUTPUT ACCU o*Nc w 6 *rc7 l di   L*c` "_ NEXT SECTOR**** TST OBJERR ;READ ERROR? BNE LDER01 ;YES INC OBJSEC TB #ABSREL,R2 ;ABS OR REL? BEQ LODF60 ;ABS MOV PTSECT,R3 ;POINTER TO CURRENT *X~w N%w 77B*|w Z e0w ,w *MULATED TEXT IF BUFFER IS FULL ADD TXTBC,CURPC ;BUMP LOC'N CTR TO BGN OF NXT TEXT BLOCK ADD TXTB !!,Eߕ .c"_wFr"__e"__ EWK_*c7 $wK_  ;BUMP SECTOR # FOR NEXT TIME SUB #128.,BLKPTR ;SHIFT POINTER BACK TO TOP SECTOR AREA .PAGE SECTION MOV BASE(R3),BASE(R0) ;SECTION BASE ADD VALR(R0),BASE(R0) ;CALC OFFSET FROM LO w pI*Ę Cå å$ נA -.  e` C,TXTPTR ;ALSO BUMP POINTER IN LOCAL TEXT BLOCK MOV CURPC,-(SP) ;SAVE FOR WORK BELOW MOV TXTO *d@E @`eBJ& E**dfB 6F 6 v "*Nd NXTB30: ;PREPARE TO FIND NEXT BLOCK START MOV BLKPTR,R0 MOV #OBJBK2,R1 ;TOP OF LOWEAD MOD BASE BR LODF10 ;NEXT LODF60: MOV VALR(R0),BASE(R0) ;HAS ABS VALUE BR F*  Ëנe ee 4e ѐ  @(*NRG,R4 ;PC VALUE @ BGN OF RESIDENT TEXT CMP (SP),R4 ;IS NEW PC BELOW TEXT IN BLOCK ONE? BL 7 7 7 7 .rd 0 "_"__0`_ 1 *_K_&d0[_0k_ >b  R AREA SUB R0,R1 ;# BYTES REMAINING IN TOP SECTOR BR NXTB44 ;AVOID RESET "PTR1.0" IN CASE LODF10 .PAGE ;NOW ALL ENTRY POINTS AND SECTION BASES HAVE BEEN ;RELOCATED WITH ODT-11R V00 r2ABE*z *;/\ $G _<^,OWEBP@>SRC-FI!XASePMCFRBO TXTO10 ;YES - REPLACE TEXT ADD #128.,R4 ;PC OF FIRST BYTE IN SECOND TEXT BLOCK CM *d _  W"qd*_&d*_e0)ek_0K_  6ede|f.ggh OF BLOCK BOUNDARY ; SEARCH FOR A "1-0" SEQUENCE TO START NEXT BLOCK NXTB40: MOV #ONEZRO,PTR1.0 ;INIT PTR TO [RESPECT TO PROGRAM BASE ZERO. ;NOW TIME TO PRINT THE LOAD MAP. LODF90: MOV #HEDING,MAPBUF ;P*dbERP (SP),R4 ;NEW PC IS ABOVE BLOCK1:IS IT BELOW BK2? BLO TXTO50 ;YES - NO NEED TO WRITE OR REA e"iipjkkdeeHffgNhehi>jjj(ej6ee2 1] NXTB44: DEC R1 ;END OF TOP BLOCK YET? BGE NXTB46 ;NOT YET - KEEP GOING MORINT HEADING JSR PC,LPCALL ;GO ASK FOR LINE PRINTER MOV #LSDBGN,R0 CLR PRSIZE REL ADDR OF CURRENT TEXT ELEMENT MOV CURPC,R4 ;PC @ TEXT BLOCK START ADD OFFSET,R4 ;OFFD .PAGE TXTO10: ;HERE TO WRITE CURRENT TEXT OUT AND READ NEW TEXT IN--- MOVB #1,TXTR.W *ee TASK # 2 e e6eff2*Hf V R0,BLKPTR ;UPDATE FOR PROPER PLACE IN NEW BLOCK BR NXTB10 ;...AND GO MOVE NEXT BLOCK UP ;INIT CUMULATIVE LOAD MODULE SIZE BR LODG20 LODG10: ADD #BPSYM,R0 ;NEXT ENTRY LODG20: CMP SET SPECIFIED WITH RLD COMMAND TST (R4)+ ;SINCE PC INCREMENTS AFTER FETCH RTS PC ; **;WRITE MOV #TXTLST,-(SP) EMT DISCIO ;WRITE OUT CURRENT RESIDENT TEXT MOV (SP) Vf TASK # 3 Hf lf& & &  |fg2U*fg TA NXTB46: CMPB (R0)+,@PTR1.0 ;IS NEXT BYTE A MATCH FOR SEQUENCE? BNE NXTB40 ;NO MATCH - KEEP LOOKING R0,SYME ;END OF LSD? BHIS LODH10 ;YES: EXIT LOOP MOVB FLAGS+1(R0),R1 ;ENTRY TYP****************************************************************** SYMOVF: ;CHECK FOR SYMBOL TABLE OVERFLOW ,R3 ;NEW "CURPC" ASR R3 ;NOW GET SECTOR FOR NEW PC BIC #100000,R3 ;SUPPRES SK # 4 f g& &  $.gg2*gg TASK # INC PTR1.0 ;MATCH: BUMP TO NEXT BYTE IN CODE BIT #1,PTR1.0 ;HAVE BOTH [1] AND [0] BE BEQ LODG30 ;OBJ MOD NAME DEC R1 BEQ LODG40 ;SECTION NAME CMP USYME,#LSDEND-BPSYM BLOS SYMOV1 ;NOT YET AT END LDER26: MOV #26,R4 ;OVERFLOW: "THS EXTENDED SIGN ASR R3 ASR R3 ASR R3 ASR R3 ASR R3 5 g g& & &  glh2*Nh\h TASK # 6 Nh EEN TESTED? BNE NXTB44 ;NO - CHECK FOR [0] .PAGE ; YEA! A [1-0] SEQUENCE HAS BEEN CMP R1,#3 ;ENTRY? BNE LODG10 ;NO: IGNORE MOV #GLOBAL,-(SP) ;YES:***PR-TH-THAT'S ALL, FOLKS!" JSR PC,ERRPRT SYMOV1: RTS PC .PAGE SRMODN: ;SEARCH DEFINED SECTASR R3 MOV R3,R4 ;SAVE NEW SECTOR (RELATIVE TO TEXT BGN) ADD BGNSEC,R3 ;SECTOR rh& &  Uhi2?*hi TASK # 7 h FOUND: NOW PROCESS BLOCK MOVB (R0)+,R1 ;BLOCK'S BYTE COUNT TSTB (R0)+ ;UPPER BYTE OFINT ENTRY NAME & VALUE*** MOV R0,-(SP) EMT R50UNP ;RAD50 UNPACK MOV 10(R0),RION OF LSD FOR A MODULE NAME ; INPUT: R4 POINTS TO RAD50 NAME ; OUTPUT: R4 POINTS TO NAME IN RELATIVE TO BEGIN OF BATCH FILE MOV R3,TXTSEC ;SET FOR UPCOMING READ & SUBSQNT WRITES CLRB TX  i"ii2*ii TASK # 8 i i&   BC MUST BE ZERO BNE LDER02 MOV R0,R5 ;SAVE POINTER TO FIRST DATA BYTE ; NOW WANT4 ;GLOBAL'S VALUE RELATIVE TO LOAD BASE 0. MOV #GLBVAL+6,R3 ;END OF ASCII BUFFER JSR PC,BINLSD (IF FOUND) ; R4 UNCHANGED IF NOT FOUND ; CALL: JSR PC,SRMODN ; TR.W ;PREPARE FOR NEW TEXT READ MOV #TXTLST,-(SP) EMT DISCIO ;READ IN NEW TEXT 2i\j2 *>jLj TASK # 9 >j bj pj TO COMPUTE CHECKSUM TO VERIFY CORRECT READ: MOV R1,R2 ;INIT CHECKSUM, WHICH INCLUDES BC SU2OC ;CONVERT BINARY TO OCTAL ASCII MOVB #' ,MFLAG ;INIT "M" FLAG POSITION WITH SPACE BITB BR A ;FOUND ; BR B ;NOT FOUND MOV R0,-(SP) ;SAVE IT ASL R4 ;NOW GET PC AT BEGIN OF NEW TEXT ASL R4 ASL R4 ASL R4 k2 _*jj TASK # 10 j  k ~kk2 . B #4,R1 ;REDUCE BC TO ELIM "1-0" AND BC WORDS MOV R1,BC ;SAVE BYTE COUNT OF DATA ONLY FLAGS(R0),#DBLDEF ;WAS THIS SYMBOL MULTIPLY DEFIND BEQ LODG25 MOVB #'M,MFLAG ;YES: SET TO MOV #LSDBGN,R0 ;START OF LSD SRMOD1: CMP R0,SYME ;REACHED END OF DEFINES? BLO SRMO ASL R4 ASL R4 ASL R4 MOV R4,TXTORG ;NEW BEGIN PC MOV (S k7   kl2 $l7     -*2l NXTB50: MOVB (R0)+,R3 ;EXTRACT NEXT BYTE ADD R3,R2 ;ACCUM CHECKSUM DEC R1 FLAG ENTRY IN MAP LODG25: MOV #ENTRY,MAPBUF ;SET UP TO PRINT ENTRY LINE JSR PC,LPCALL BR D2 ;NOT YET MOV (SP)+,R0 ;NOT FOUND! ADD #2,(SP) ;ALTER RETURN FOR "NOT FOUP),R3 ;PC FOR BEGIN OF NEXT TEXT BLOCK SUB R4,R3 ;GET OFFSET FROM TOP OF TEXT AREA AD \l  7 7d*Vl7lvEpjd ^ *zl l"l" ;MORE DATA BYTES TO ADD IN? ;BYTE COUNT INCLUDES CHECKSUM BYTE... BGE LODG10 ;NEXT .PAGE LODG30: ;***PRINT OBJECT MODULE'S NAME*** MOV #TITLE,-(SP) ND" RTS PC SRMOD2: CMPB #OBJMN,FLAGS+1(R0);THIS ENGRY AN OBJ MOD NAME? BEQ SRMOD3 ;YESD #TXTBK1,R3 MOV R3,TXTPTR ;ACTUAL POINTER TO NEXT OPEN TEXT WORD TXTO50: TST (SP)+ ;POP &  *l$ҝd.( wZblZX.ll NXTB50 ;SO GO BACK FOR ONE EXTRA BYTE AT END INCB R2 ;CHECKSUM ITSELF INCLUDES THE "1" @BEG MOV R0,-(SP) EMT R50UNP ;UNPACK MODULE'S NAME MOV #MODULE,MAPBUF ;INIT TO PRINT: IS NAME SAME? SRMOD4: ADD #BPSYM,R0 ;NOT AN OJB MOD BR SRMOD1 SRMOD3: CMP (R4),(R0) ;F SAVED PC RTS PC .PAGE LPCALL: ;COMMON ROUTINE TO MAKE EMT TO LINE PRINTER MOV ~mn!*mw . ZF& FNl*&m@f: F F(. *jm IN BNE LDER03 ;CHECKSUM ERROR MOV R0,BLKPTR ;ADVANCE BLK PTR-READY FOR NEXT BLOCK MODULE NAME & HEADING JSR PC,LPCALL ;GO PRINT IT BR LODG10 ;NEXT LODG40: IRST HALF-NAME MATCH? BNE SRMOD4 ;NO CMP 2(R4),2(R0) ;YES: SECOND HALF-NAME MATCH? #MAPLST,-(SP) EMT LPRNTR ;LINE PRINTER RTS PC ; ************************************ *Jm "'xww [nm*vm~&-&o e?U MOV R5,R0 ;RESET LOCAL PTR TO FIRST DATA BYTE BIT #1,R0 ;IS ADDR OF FIRST DATA B ;***PRINT PROGRAM SECTION NAME*** MOV #SECNAM,-(SP) MOV R0,-(SP) EMT R50UNP BNE SRMOD4 ;NO ; FOUND! MOV R0,R4 ;NOW POINTS TO LSD ENTRY MOV (S******************************** ; SUBROUTINE "BINARY TO OCTAL ASCII CONVERSION" ; INPUT: R4 = BI *m 6  e*m>:a[*mS&  YTE ODD? BEQ NXTB70 ;EVEN: NO RELOCATION NEEDED MOV BC,R3 ;NEED TO MOVE ALL BYTE ;UNPACK SECTION NAME MOV 10(R0),R4 MOV #SECVAL+6,R3 JSR PC,BIN2OC ;CONVERT BINP)+,R0 RTS PC .PAGE PTGLOB: ;SEARCH LSD FOR A GLOBAL NAME (NOT OBJ MOD) ;THE SECRET TO THENARY NUMBER ; R3 = DESTINATION END ADDRESS ; R2 = ITERATION LENGTH (IF E w 2*n%%E Cw.*n  eoBA  Jo6 w  S BACK ONE NXTB60: MOVB (R0)+,-2(R0) ;SHIFT BYTE BACK ONE DEC R3 ;MORE BYTES TO MOVE? ARY TO OCTAL ASCII MOV 6(R0),R1 ;SECTION SIZE MOV R1,R4 MOV #SECSIZ+6,R3 LOADER'S CONTROL SECTION ABILITY LIES HERE. ; IF THE SECTION IS ONE OF THE NAMED ONES, IT APPEARS ONLY ONCE IN THE ; LSD, ANTER @"B2ONTA") BIN2OC: MOV #6,R2 ;INIT ITERATION LENGTH (NORMAL 6 CHARS) B2ONTA: ;ENTER HERE WHEN *Rn0p)p p"$:*vn2EW  9o.n1o 7 BGT NXTB60 ;YES MOV R5,R0 DEC R0 ;NOW POINTS TO FIRST DATA BYTE NXTB70 JSR PC,BIN2OC ;CONVERT BINARY TO OCTAL ASCII MOV R1,R2 ASR R2 ADC R1 ND THUS HAS ONLY ONE BASE TO LOAD PROGRAMS FROM. THE UNNAMED ; C-SECTS, HOWEVER, ARE DETECTED AS 6 BLANKS, AND ARE MADE UNI PRE-SETTING ITERATION LENGTH MOVB R4,-(R3) ;ALSO LOOP RETURN FOR NEXT OCTAL DIGIT BICB #370,( X )p fo`<*n7vBABWCEq<*nJo7œ : MOV BC,R5 ;INIT R5 WITH DATA BYTE COUNT ADD #2,(SP) ;BUMP FOR "GOOD" RETURN NXTB80: RT ;MAKE MODULE SIZE EVEN ADD R1,PRSIZE ;ACCUMULATE LOAD MODULE SIZE MOV PRSIZE,R4 QUE TO ; EACH OBJECT MODULE BY LIMITING THE SEARCH TO THE CURRENT OBJECT MODULE ; AREA IN THE LSD. ; INPUT: R4=PRT R3) ;LEAVE ONLY LEAST SIGNIFICANT THREE BITS BISB #060,(R3) ;CHANGE TO ASCII CODE ASR R4 & ‹* o & 5@& X Œ ŒN*.o$Œ&&f A*Ro  S PC ; ******************************************************************** LDER01: MOV #1,R4 ;OBJ MOD MOV #CUMSIZ+6,R3 JSR PC,BIN2OC ;CONVERT IT TO OCTAL ASCII MOV #SECT,MAPBUF TO RAD50 NAME ; OUTPUT: R4=PTR TO LSD ENTRY IF FOUND ; CALL: JSR PC,PTGLOB ; BR A ;BEGIN SHIFTING FOR NEXT OCTAL DIGIT BIC #100000,R4 ;PREVENT SIGN PROPAGATION ASR  o`BAW,Jo*vo on   owwo ULE BLOCK READ ERROR JSR PC,ERRPRT LDER02: MOV #2,R4 ;BLOCK BYTE COUNT ERROR JSR PCJSR PC,LPCALL ;PRINT SECTION NAME,BASE,SIZE,& CUM SIZE BR LODG10 ;NEXT .PAGE LODH ;NOT FOUND ; BR B ;FOUND MOV R0,-(SP) ;SAVE IT R4 ASR R4 DEC R2 ;MORE ASCII DIGITS TO GO? BGT B2ONTA ;BACK FO &o&orpd ,ERRPRT LDER03: MOV #3,R4 ;OBJ MOD BLOCK CHECKSUM ERROR JSR PC,ERRPRT .PAGE ; 10: ;END OF PRINTING DEFINEDS: NOW PRINT UNDEFINEDS, IF ANY CMP SYME,USYME ;ANY UNDEFINEDS? MOV (R4),R0 ;IS THIS THE SPECIAL... BIS 2(R4),R0 ;...CASE OF 6 BLANKS? BEQ PTGLR MORE RTS PC ;ASCII BUFFER FILLED: RETURN ; **************************************************# (pd 9pL>pI,@p7" @ : 7f_$ " T R A P U T " ; SUBROUTINE PUTS AN "ADD R1,LOC" TWO-WORD INSTRUCTION IN THE TASK ; TRAILER, TO BE EXECUTED WHEN THE LOAD BEQ LODH30 ;NO: GO TO MESSAGE MOV #UNDHED,MAPBUF JSR PC,LPCALL ;PRINT HEADING 01 ;YES: START AT CURRENT OBJ MOD MOV #LSDBGN,R0 ;NO: BEGIN @ BEGINNING OF SYMBOL TABLE BR****************** ERRPRT: ;ERROR MESSAGE PRINTING ROUTINE ; R4 ALREADY INITED WITH BINARY ERROR NUMBER ( ,fp)-K_7| zr!*p& ] B"___"_*p9 _) MODULE IS READ INTO CORE PRIOR ; TO TASK EXECUTION, THUS EFFECTING DYNAMIC RELOCTTION. THE SUBROUTINE ; CALCULATES THE PRO MOV #UNDDEF,MAPBUF ;SET UP TO PRINT FROM UNDEFINED BUF LODH20: MOV #UNDNAM,-(SP) MOV R0,-(SP) PTGL02 PTGL01: MOV PTROBJ,R0 ;CURRENT OBJ MOD PTGL02: CMP R0,USYME ;END? BLO PTGL03 MOV #ERRNUM+2,R3 ;LAST CHAR IN ASCII BUFFER MOV #3,R2 ;A 3-CHAR MESSAGE NUMBERR - H & tc7u*p&fRtЕ<<9<23*p- "PPP. PER DISPLACEMENT BETWEEN THE INSTRUCITON AND "LOC", ; THE WORD IN THE TEXT NEEDING DYNAMIC RELOCATION. THE FORMULA FOR THE EMT R50UNP ;CONVERT TO ASCII JSR PC,LPCALL ;GO PRINT IT ADD #BPSYM,R0 ;NOT YET MOV (SP)+,R0 ;NOT FOUND! RTS PC PTGL03: CMP (R4),(R0) ;FIRST H JSR PC,B2ONTA ;USE SECONDARY ENTRY POINT TO CONVERSION MOV #ERRMSG,TTYBUF ;INIT FOR PRINTING ERROR M2 *q)mȵ  Xt@pEt*@q ɕte*dq%3 ; DISPLACEMENT BETWEEN THE "ADD" INSTRUCTION AND ITS OBJECT IN THE LOAD ; TEXT IS: DISPL = CURPC + OF ;BUMP TO NEXT ENTRY CMP R0,USYME ;REACHED END? BLO LODH20 LODH30: ;NOW PRIALF-NAME MATCH? BNE PTGL04 ;NO CMP 2(R4),2(R0) ;2ND HALF-NAME MATCH? BNE ESSAGE MOV #TTYLST,-(SP) EMT TTYOUT ;REQUEST MESSAGE EMT EXIT ;CUR7 !G7~& ^*q< 72Ve*q"2 7>B f 8 FSET - TRAPC ; THIS DISPLACEMENT IS NEGATIVE, SINCE ALL REFERENCES FROM THE TRAILER ; WILL BE BACKWARD. TRAPUT: NT "PASS 2" ON TTY MOV #PAS2MG,TTYBUF MOV #TTYLST,-(SP) EMT TTYOUT ;PRINT MES PTGL04 ;NO ;MATCH! CMPB #OBJMN,FLAGS+1(R0) ;FILTER OUT OBJ MOD NAMES BEQ PTGL04 RENTLY ALL ERRORS TERMINATE LOADER .PAGE TTYLST: .WORD 1 ;TELETYPE I/O LIST .BYTE 0,2 < .q D &  ‹ & & N & .q yeEwލ* r= ;SUBROUTINE TO BUILD TRAILER ADD #4,TRAPC ;ADVANCE TO NEXT OPEN CELL AFTER THIS 1. MOV TRAILPSAGE ; ******************************************************************** .PAGE ;PASS 1 IS N MOV R0,R4 ;NOW POINTS TO FOUND NAME IN LSD MOV (SP)+,R0 ;UNSAVE ADD #2,(SP ;DEVICE: TTY #1; CALL TYPE: SUSPEND .WORD 0 ;I/O COMPLETE .BYTE 0,0 57& !*Dr5E -?-u*hr   ΝOINTER,R3 ;NEXT OPEN TRAILER SLOT MOV #60167,(R3)+ ;"ADD R1,A" INSTRUCTION JSR PC,GETPC OW COMPLETED. NOW BEGIN PASS 2 TO FORM THE ;LOAD MODULE ITSELF, COMPLETE WITH HEADER & TRAILER. ;THE) ;"GOOD" RETURN RTS PC ;NO MATCH PTGL04: ADD #BPSYM,R0 ;NEXT LSD ENTRY BR PT .TITLE TEST1 .GLOBL A,B,C,D MOV #A,B MOV #A,B MOV #A,B MO")m #@ J #?B EN 6-CHAR NUMBERS MOV #4000,@#LPCMD ;PRINT! TST @#LPCSR ;DONE? BPL .-4 .TITLE TEST2 .GLOBL A,B,C,D MOV #A,B MOV #A,B MOV #A,B MOINITIAL TRAILER SECTOR TSWICH: 0 ;SWICH USED TO DIRECT FLOW AFTER TEXT OUTPUT TXTBC: .WORD 0 ;BYTE CV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B ;ERROR WORD, RESERVED .WORD OBJHED ;DATA BUFFER MAPLST: .WORD 1 ;LIST FOR LOAD M ;NOT YET DEC LINCNT ;MORE LINES? BGT NXTLIN ;YES DEC SECNT V #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B OUNT OF DATA IN CURRENT TEXT TXTORG: .WORD 0 ;CURRENT PC AT BEGIN OF RESIDENT TEXT TXTPTR: .WORD 0 MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,BAP .BYTE 3,2 ;LINE PRINTER,SUSPEND .WORD 0 ;I/O COMPLETE .BYTE 0, ;DOES HE WANT ANOTHER SECTOR/BLOCK? BLE .+4 ;ALL DONE. RTS PC ;RET MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B ;POINTER TO CURRENT OPEN SLOT IN TEXT USYME: .WORD 0 ;NEXT SLOT IN LSD FOR UNDEFINED SYMBOL ; MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV 0 ;ERROR,LEVEL .WORD 0,0 ;RESERVED MAPBUF: .WORD 0 ;DATA BUFFER: CHOSEN DURN FOR ANOTHER ONE TST (SP)+ JMP START ;GO BACK AND WAIT FOR ANOTHER SEQUENCE MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV ******************************************************************** NAMBUF: .=MAXNAM*8.+. ;BUFFER HOLDS OBJ MOD #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B URING RUN TXTLST: .WORD 1 ;LIST FOR TRANSFERS TO/FROM TEXT AREA .BYTE 1,2 ;DISC; S.PAGE BIN2OCT: ;BINARY TO ASCII CONVERSION - WITH PARITY MOV #6,R2 ;CONVERT SIX CHARS BIN050 #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B ULE RAD50 NAMES... ;...AND SECTOR INFORMATION FOR EACH MODULE. USES FOUR WORDS PER MODULE. TMPBUF: .WORD 0,0,0 MOV #A,B MOV #A,B MOV #A,B MOV #A,B CLR 123456 CLR 123456USPEND .WORD 0 .BYTE 0,3 ;ERROR,LEVEL .WORD 0,0 ;RESERVED : MOVB R4,-(R3) ;PUT NEXT DIGIT IN ASCII BUFFER BICB #370,(R3) ;ISOLATE ONLY THIS OCTAL DIGIT MOV #A,B MOV #A,B MOV #A,B MOV #A,B CLR 123456 CLR 123456 ;TEMPORARY CONVERSION BUFFER ASCDAT: .WORD MAXNAM*7 ;TTY INPUT BUFFER FOR COMMAND STRING INPCNT: .WORD 0 CLR 123456 CLR 123456 CLR 123456 CLR 123456 CLR 123456 .WORD TXTHED ;ALWAYS R/W FROM/TO TEXT AREA TRALST: .WORD 1 ;LIST FOR TRAILER .BYTE CLR -(SP) ;WILL ACCUM PARITY MOVB (R3),TMP ;WANT TO COUNT BITS ASR TMP CLR 123456 CLR 123456 CLR 123456 CLR 123456 CLR 123456 ;ACTUAL CHARACTER COUNT LSDBGN: ;"LOADER SYMBOL DIRECTORY": WRITES OVER UNNEEDED BUFFER .=.+2 CLR 123456 CLR 123456 CLR 123456 MOV #C,D MOV #C,D MOV 1,2 ;DISC,SUSPEND .WORD 0 .BYTE 0,3 ;ERROR;LEVEL .WORD 0,0 ADC (SP) ASR TMP ADC (SP) ASR TMP ADC (SP) ASR CLR 123456 CLR 123456 MOV #C,D MOV #C,D MOV #C,D MOV 000 ;RESERVE SPACE FOR SYMBOL TABLE LSDEND = . ;END OF LOADER SYMBOL DIRECTORY #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D .WORD TRAHED ;DATA BUFFER .PAGE TXTHED: ;HEADER FOR TEXT SAVE BUFFER READ/WRITE OPERATIONS (SP)+ ;SEE IF BIT COUNT WAS EVEN OR ODD BCC BIN100 ;WAS EVEN: PARITY BIT NOT NEEDED #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D MO .END MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D .WORD BTCHID ;FILE I.D. FOR BATCH FILE .BYTE 0 ;RELATIVE SECTOR TXTR.W: .BYTE BISB #200,(R3) ;MAKE EVEN BY SETTING PARITY BIT BIN100: BISB #060,(R3) ;MAKE CHARACTER ASCII ASR V #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D R4,TXTORG ;NEW BEGIN PC MOV (SP),R3 ;PC FOR BEGIN OF NEXT TEXT BLOCK SUB R4,R3 MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C0 ;TEXT READ/WRITE BYTE .WORD 0,0,0 TXTSEC: .WORD 0 ;RELATIVE SECTOR TO READ/WRIOT R4 ;SHIFT FOR NEXT OCTAL DIGIT BIC #100000,R4 ;PREVENT SIGN PROPAGATION ASR MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D CLR 1234 ;GET OFFSET FROM TOP OF TEXT AREA ADD #TXTBK1,R3 MOV R3,TXTPTR ;ACTUAL POINTER TO NEXT OP,D CLR 123456 CLR 123456 CLR 123456 CLR 123456 CLR 123456 E TEXT TXTCNT: .WORD 0 ;# WORDS TO TRANSFER EACH TIME TXTBK1: .=.+128. ;FIRST TEXT SAVE BLOR4 ASR R4 DEC R2 ;MORE ASCII DIGITS TO GO? BGT BIN050 ;BACK FOR 56 CLR 123456 CLR 123456 CLR 123456 CLR 123456 CLR 123456 EN TEXT WORD TXTO50: TST (SP)+ ;POP SAVED PC RTS PC .PAGE LPCALL: ;COMMON ROUT CLR 123456 CLR 123456 CLR 123456 CLR 123456 CLR 123456 A: CK TXTBK2: .=.+128. ;SECOND TEXT SAVE BLOCK ; **********************************************************MORE RTS PC PRTHED: MOV R3,@#LPADDR ;INIT PRINTER TO PRINT MOV #-9.,@#LPWC CLR 123456 CLR 123456 CLR 123456 CLR 123456 .PAGE .CSECT INE TO MAKE EMT TO LINE PRINTER MOV #MAPLST,-(SP) EMT LPRNTR ;LINE PRINTER RTS 11 B: 22 .PAGE .CSECT ABCDEF MOV #A,B MOV #A,B MOV #A,B ********** OBJHED: ;HEADER FOR READING OBJECT MODULES .WORD BTCHID ;FILE I.D. FOR BATCH FILE ;WORD COUNT MOV #4000,@#LPCMD ;PRINT! TST @#LPCSR ;DONE? BPL .-4 ABCDEF MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B PC ; ******************************************************************** ; SUBROUTINE "BINARY TO OCTAL ASCI MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B .BYTE 0 ;RELATIVE SECTOR .BYTE 0 ;READ/WRITE FLAG .WORD 0,0,0 OB ;NOT YET RTS PC .PAGE ADRESS: .WORD 0 KEY: .WORD 0 ;DEVICE SELECTION KEY LIMOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B I CONVERSION" ; INPUT: R4 = BINARY NUMBER ; R3 = DESTINATION END ADDRESS ; MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV JSEC: .WORD 0 ;RELATIVE SECTOR NUMBER .WORD 128. ;ALWAYS READ IN TWO SECTORS OBJBK1NCNT: .WORD 0 SECNT: .WORD 0 ;# OF SECTORS TO PRINT SECTOR: .WORD 0 ;CURRENT SECTOR BEIN MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A R2 = ITERATION LENGTH (IF ENTER @"B2ONTA") BIN2OC: MOV #6,R2 ;INIT ITERATION LENGTH ( #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B MOV #A,B : .=.+128. ;FIRST BLOCK FOR OBJECT DATA OBJBK2: .=.+128. ;SECOND BLOCK FOR OBJECT DATA ; G DUMPED TMP: .WORD 0 HEDBUF: .BYTE '-,'S,'E+200,'C+200,'T+200,'O+200,'R+200,'-,'- DISCID: .BYTE 0,'< SECNUM: .=,B MOV #A,B MOV #A,B MOV #A,B CLR 123456 CLR 123456 NORMAL 6 CHARS) B2ONTA: ;ENTER HERE WHEN PRE-SETTING ITERATION LENGTH MOVB R4,-(R3) ;ALSO LOOP RCLR 123456 CLR 123456 CLR 123456 CLR 123456 CLR 123456 CLR ******************************************************************** TRAHED: ;HEADER FOR TRAILER WRITES .W.+6 .BYTE '>+200 MEMBUF: .BYTE '-,'-,'C+200,'O+200,'R+200,'E+200,'-,'-,'-,'-,'< MEMADR: .=.+6 .BYTCLR 123456 CLR 123456 CLR 123456 CLR 123456 CLR 123456 CLR ETURN FOR NEXT OCTAL DIGIT BICB #370,(R3) ;LEAVE ONLY LEAST SIGNIFICANT THREE BITS BISB #060,(R3 123456 CLR 123456 CLR 123456 CLR 123456 CLR 123456 MOV #C,DORD BTCHID ;FILE I.D. FOR BATCH FILE .BYTE 0 TRAR.W: .BYTE 0 ;READ/WRITE .WE '>+200 DSCTAB: ;TABLE OF DISC ADDRESSES FOR BOTH DISCS ; FOR DDC DISC: .WORD 165300 123456 CLR 123456 CLR 123456 MOV #C,D MOV #C,D MOV #C,D ) ;CHANGE TO ASCII CODE ASR R4 ;BEGIN SHIFTING FOR NEXT OCTAL DIGIT BIC #100000, MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV ORD 0,0,0 TRASEC: .WORD 0 ;TRAILER SECTOR NUMBER .WORD 64. ;WRITE ONE SECTOR AT A T ;DISC CONTROL STATUS AND COMMAND REG .WORD 165304 ;DISC MEMORY ADDRESS REG .WORD 165302 MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #CR4 ;PREVENT SIGN PROPAGATION ASR R4 ASR R4 DEC R2 ;MORE ASCII DIGITS #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D IME TRAILBLOCK: .=.+128. ;TRAILER BUILD AREA: OUTPUT WHEN FULL .PAGE IDMSG: IDEND-.-4 ;DISC WORD COUNT .WORD 165306 ;DISC ADDRESS REG .WORD 165310 ;DISC ERROR REGISTER,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV TO GO? BGT B2ONTA ;BACK FOR MORE RTS PC ;ASCII BUFFER FILLED: RETURN ; MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D ;# CHARS IN I.D. MESSAGE .WORD 0 .BYTE CR .ASCII "ROSLOD IIA" .BYTE CR IDEN ; FOR RF-11 DISC: .WORD 177460 ;DISC CONTROL STATUS AND COMMAND REG .WORD 177464 #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D ******************************************************************** ERRPRT: ;ERROR MESSAGE PRINTING ROUTINE ; MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #CD: .EVEN ; ******************************************************************** ND1MSG: ND1END-.-4 ;# CHA ;DISC MEMORY ADDRESS REG .WORD 177462 ;DISC WORD COUNT .WORD 177466 ;DISC ADDRESS MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D R4 ALREADY INITED WITH BINARY ERROR NUMBER MOV #ERRNUM+2,R3 ;LAST CHAR IN ASCII BUFFER MOV ,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV #C,D MOV RS IN "END 1" MESSAGE .WORD 0 .BYTE CR .ASCII "ROSLOD PASS #1 END" .BYTE CR ND1EREG .WORD 177470 ;DISC ADDRESS EXTENSION REG LPBUF: .=.+132. DSCBUF: .=.+128. ;DATE: 22-MAR-72 MOV #C,D MOV #C,D MOV #C,D MOV #C,D .END #3,R2 ;A 3-CHAR MESSAGE NUMBERR JSR PC,B2ONTA ;USE SECONDARY ENTRY POINT TO CONVERSION #C,D C: 33 D: 44 .END ND: .EVEN ; ******************************************************************** PAS2MG: PAS2ND-.-4 ;# CHARS IN "P; M W KLEIN .END START MOV #ERRMSG,TTYBUF ;INIT FOR PRINTING ERROR MESSAGE MOV #TTYLST,-(SP) EMT TTYOUT ;REQASS 2" MESSAGE .WORD 0 .BYTE CR .ASCII "ROSLOD PASS #2 BEGIN" .BYTE CR PAS2ND: .EED TEXT.) TXTOUT: ;SUBROUTINE TO OUTPUT ACCUMULATED TEXT IF BUFFER IS FULL ADD TXTBC,CURPC ;BUMP UEST MESSAGE EMT EXIT ;CURRENTLY ALL ERRORS TERMINATE LOADER .PAGE TTYLST: .WORD 1 VEN ; ******************************************************************** ND2MSG: ND2END-.-4 .WORD 0 LOC'N CTR TO BGN OF NXT TEXT BLOCK ADD TXTBC,TXTPTR ;ALSO BUMP POINTER IN LOCAL TEXT BLOCK MOV CU ;TELETYPE I/O LIST .BYTE 0,2 ;DEVICE: TTY #1; CALL TYPE: SUSPEND .WORD 0 .BYTE CR .ASCII "ROSLOD PASS #2 END" .BYTE CR ND2END: .EVEN .PAGE ERRMSG: ERNEND-.-4 RPC,-(SP) ;SAVE FOR WORK BELOW MOV TXTORG,R4 ;PC VALUE @ BGN OF RESIDENT TEXT MOV R4,R3 ;I/O COMPLETE .BYTE 0,0 ;ERROR,LEVEL .WORD 0,0 ;RESERVED TTYBUF: .WORD ;# CHARS IN ERROR MESSAGE .WORD 0 .BYTE CR .ASCII "ERROR # " ERRNUM: .BYTE 0, ;SAVE ALSO FOR CALCS BELOW CMP (SP),R4 ;IS NEW PC BELOW TEXT IN BLOCK ONE? BLO TXTO0 ;DATA BUFFER OBJLST: .WORD 1 ;OBJECT MODULE READ LIST .BYTE 1,2 ;DISBEQ . ;STICK HERE FOR OPERATOR INTERVENTION MOVB #'B,DISCID ;INIT I.D. PRINT OF "B" FOR DD0,0 .BYTE CR ERNEND: .EVEN ; ******************************************************************** HEDING: ODT-11R V002ABEU~077 *;/\ $G _<^,OWEBP@>SRC-FI!XASPMCFRB10 ;YES - REPLACE TEXT ADD #128.,R4 ;PC OF FIRST BYTE IN SECOND TEXT BLOCK CMP (SP)C: SUSPEND .WORD 0 .BYTE 0,3 ;ERR TASK, DISC REQUEST PRIORITY OBJERR: .WORD 0,0 C DISC CLRB DSWICH ;PREPARE PGM FOR USING "DDC" DISC MOV PC,R5 ;R5 IS USED AS PTR TO T.WORD END01-4-. .WORD 0 .BYTE FF .ASCII "**** ROSLOD LOAD MAP **** .BYTE LF,LF !~w V#Ffry Kyry7  K|pyry ~-v  -|ZR 4B, &',5 ee e "w 7lB&e, "7lee "7w-rww  yy "y& &ry&y& &7n77777 77U7g7K7j7g7m7j7g7g7d7a7^7[7X7V777K7Hw  yy "y& &ry&y& &7n77777 77U7g7K7j7g7m7j7g7g7d7a7^7[7X7V777K7H7E7=7D7B7*7$7!yyyyyyh!wwwDwwB!*(H zy/ 6 %Z &y/%Z \7? y/   Vw: y yPHw~@!e0wxw77 +%5wwB!*(H zy/ 6 %Z &y/%Z \7? y/   Vw: y yPHw~@!e0wxw77 +%5  EE UH0 0 e U0 w7-FFwJV\@.767 6e 7 ?µ 0l0µ 0 0  C ``77mw77 +%5  EE UH0 0 e U0 w7-FFwJV\@.767 6e 7 ?µ 0l0µ 0 0  C ``77m 7zw6-rx} :{*76{0L7.:{6N7mtE@{0L7 D{6N7m\H{{-{w4 ww/fL{L{,y@ɥ<>@B¥,杓y¥%$ %7 ~7rDe P zffgfXgg0.@ @ɥw ,  .6F72-,(@{ 76{d |7x֋5Vw%, b7nf}}}& &D,w2w.w."eEp!" e ewecee bEeE E!# e yee=gee EeE (=7\V7QKC  ɵ1a(, www"y xQxly"y`c!~ze r ~ P {gV-P.&~f~7O5e 7 (~ѕ ѕ J&~e 7 ݇h!ww"y xQxly"y`c!~ze r ~ P {gV-P.&~f~7O5e 7 (~ѕ ѕ J&~e 7 ݇h!7"y"y$gbgggg~MODULEѕ ѕ ѕ ~,g$g~ѕ<ѕ>ѕ ѕ Bѕ ѕ xwf7 @wJɥ<> $ "7&B@s%B%m% %l)wf7 @wJɥ<> $ "7&B@s%B%m% %l)w,y E@7nɥww ~v& p,y^z  R7&B@%9%/% %+wee z杋q  ww`oN(P@>eՔ &f"w 7w% P zgZffPgZfw"w"w@ :7ryyywABLE OF DISC ADDRESSES ADD #DSCTAB-.,R5 ;NOW AT TOP OF TABLE CMP KEY,#2 ;WAS DDC DISC SEa~ ;T/W .WORD START .WORD 0 ;INIT .WORD 0 ;MAX XEQ  ;BC TO ZERO? BLT LODK30 ;YES MOVB (R1)+,(R2)+ ;TRANSFER ANOTHER BYTE BR E ADD R1,R0 ;STAYS ONE ELEMENT ABOVE R1 ASR R1 ;USE BELOW AS COUNTER SQLECTED? BEQ HALT2 ;YES: NO FURTHER WORK NEEDED ADD #10.,R5 ;RF-11 DISC: USE UPPER~x .BYTE STSIZE ;STACK SIZE (WORDS) .BYTE PRIOR ;PRIORITY .WORD 0 LODK20 ;BACK FOR MORE LODK30: CLR TSWICH ;INDICATE FIRST TXT BLCOK JSR PC,NXTBLK 01: CMP R0,USYME ;REACHED TOP OF TABLE? BHIS SQUI04 ;YES: EXIT SQUI02: MOV R1,R2 HALF OF TABLE DECB DISCID ;PRINT "A" FOR RF-11 INCB DSWICH ;SET SWITCH TO GO THRU Sp~ ;TIMER .WORD 0 ;ARG .BYTE 0 ;STATUS .BYTE TASKNO ;T;NEXT BLOCK BR LDER21 ;FINAL BLOCK OUGHT TO BE MODULE END CMP #RLDCMD,R2 ;RLD?  ;COUNTER=# WORDS PER SYMBOL SQUI03: MOV (R0)+,(R4)+ ;BLOCK TRANSFER DEC R2 BGT SQUI03HIFT LOGIC HALT2: HALT ;NOW WAIT FOR ADDRESS SELECTION MOV @#SWR,ADRESS ;DISC OR MEMORY: SAVE ~hK NUMBER .WORD 0 ;STACK .WORD -1 ;BOTTOM STACK WORD: HOPE IT'S NEVER CHANGED  BEQ LODJ28 ;YES CMP #TXTCMD,R2 ;TXT? BEQ LODK50 ;YES CM ;STILL IN BLOCK BR SQUI01 SQUI04: JSR R5,REGPOP RTS PC .PAGE NXTMOD: HALT ;WAIT FOR KEY-IN OF SECTOR/BLOCK COUNT MOV @#SWR,SECNT ;SAVE IT CMP KEY,~ .=STSIZE*2+.-2 .PAGE ;FIRST PRINT IDENTIFICATION ON TTY TO OPEN DIALOGUE: START: ;TASK BEGIN FOR TH #MODEND,R2 ;MODULE END? BNE LODK30 ;NO - IGNORE ANYTHING ELSE LODK40: ;TEXT FOLLOW ;ROUTINE SETS UP PARAMETERS TO READ NEXT OBJ MODULE DEC NAMCTR ;MORE MODULES? BLT NX#3 ;WAS MEMORY SELECTED? BNE DISC ;NO BIC #77,ADRESS ;ALWAYS DUMP IN BLOC~XLOADER MOV #IDMSG,TTYBUF ;INIT FOR INITIAL I.D. MESSAGE MOV #TTYLST,-(SP) EMT TTYO BY MODULE - END MOV #2,TSWICH ;PUT OUT TEXT: THEN GET NEW MODULE BR LODJ60 ;GO OU30 ;NO MORE: TAKE "DONE" EXIT CLR BLOCK1 ;FLAGS FIRST BLOCK IN MODULE MOV NAMPTRKS OF 64 WORDS .PAGE PRTMEM: MOV ADRESS,R4 MOV PC,R3 ADD #MEMADR+6-.,R3 JS~Л ;PRINT ON TTY ; NOW INPUT COMMAND STRING MOV #ASCDAT,TTYBUF ;INIT FOR INPUT OF COMMAND STRING UT TEXT LODK50: ;TEXT FOLLOWED BY TEXT MOV #1,TSWICH ;INDICATE MORE TEXT AFTER OUTPUT THIS 1.0 MOV 4(R0),OBJSEC ;START SECTOR # MOV 6(R0),SECTCT ;SECTOR COUNT INC SECTCTR PC,BIN2OCT ;CONVERT MEM ADDRESS TO PRINT IT MOV PC,R3 ADD #MEMBUF-.,R3 JSR ~H MOV #TTYLST,-(SP) EMT TTYIN ;INPUT ENTIRE COMMAND STRING MOV #ASCDAT-1,R0  BR LODJ60 ;GO OUTPUT UN-MODIFIED TEXT BLOCK ; **************************************************** ;WANT ONE EXTRA SECTOR ON LAST READ ADD #8.,NAMPTR ;ADVANCE TO NEXT NAME MOV #OBJBKPC,PRTHED ;GO PRINT MEMORY ADDRESS OF BLOCK MOV ADRESS,R0 ;PREPARE TO ... JSR PC,FILLB~NIT POINTER TO NAMES BUFFER MOV #NAMBUF,R1 ;FILL W/RAD50 FORMS OF MODULE NAMES MOV INPCNT,R************** LDER21: MOV #21,R4 ;FINAL MODULE BLOCK NOT MODULE END JSR PC,ERRPRT .PBLKPTR ;INIT BLOCK POINTER TO FORCE FIRST READ ADD #2,(SP) ;BUMP TO TAKE "GOOD" EXIT NXTM30: RTS F ;...CONVERT BINARY TO ASCII AND PRINT IT ADD #200,ADRESS ;IF MORE TO DO, BUMP ADDRESS... BR%~8 ;ACTUAL # OF CHARS RECEIVED LODA10: MOV #TMPBUF+6,R3 ;POINTER TO TMPY BFR FOR CONVERSION MOV #"E LODJ30: CMD1: ;INTERNAL SYMBOL: ADD SECTION BASE TO LOCAL OFFSET - ;"ADD BIAS" INSTRUCTION INTO TRAILPC .PAGE ;"NEXT BLOCK": SUBROUTINE READS IN SECTORS UNTIL ; AT LEAST ONE BYTE OF PRTMEM ;...AND CONTINUE .PAGE DISC: ;HERE TO DUMP FROM DISC BIS #400,@(R5) ~,-(R3) ;CLEAR BFR W/ BLANKS MOV #" ,-(R3) MOV #" ,-(R3) LODA20: INC R0 ;B MOV (R1)+,R4 ;LOCAL VALUE ADD BASE(R5),R4 ;CALC OFFSET FROM LOAD MODULE BASE EXT BLOCK IS IN UPPER HALF OF THE ; TWO-SECTOR BUFFER. ONE ADDITIONAL SECTOR IS READ AFTER ; ;DCS - DISC CLEAR MOV ADRESS,R0 MOV R0,SECTOR ;SAVE IT FOR PRINTOUT DSWICH: BR .+4P LIST POINTER TO NEXT CHAR DEC R2 ;ANY MORE CHARS? BLT LODA30 ;NO: GO TO FV R4,(R3)+ ;PUT ALTERED WORD INTO TEXT JSR PC,TRAPUT ;"ADD" INTO TRAILER SUB #4THE FINAL SECTOR IN THE MODULE TO FORCE THE LAST BLOCK ; INTO THE UPPER HALF. NXTB90: JSR PC,NXTMOD 2 ;USE RF-11 DISC IF INCREMENTED BR SETDAR ;...ELSE USE "DDC" DISC MOV R0,R1 ~(AL CONVERSION OR TO EXIT CMPB (R0),#', ;COMMA ENDS FIELD BEQ LODA30 ;END OF FIELD 0 ;BC BR LODJ99 LODJ32: CMD2: ;GLOBAL RELOCATION: OFFSET FROM LOAD BASE INTO TEXT -  ;INIT FOR NEXT MODULE AND READ A BLOCK BR NXTB80 ;NO MORE MODULES NXTBLK: CMP BLKP ;NEED TO SPLIT IT UP SWAB R1 ;FIRST GET EXTENSION BITS ASR R1 ASR ~ CMP R3,#TMPBUF+5 ;TMP BUF FULL? (ONLY 1ST SIX CHARS USED) BHI LODA20 ;FULL: IGNORE REST ;"ADD" INTO TRAILER MOV R1,R4 ;POINTS TO GLOBAL NAME CMP (R1)+,(R1)+ ;BUMP PT,#OBJBK2 ;ARE WE INTO LOWER SECTOR? BLO NXTB30 ;NO-NEW READ NOT NEEDED NXTB10: ;LOOP HERE F R1 BIC #-3-1,R1 ;ISOLATE THE TWO EXTENSION BITS MOV R1,@10(R5) ;...AND FEED IT TO THEC~Ÿ)eL x  N N Ê <%F CHARS TO COMMA MOVB (R0),(R3)+ ;XFER CHAR TO TMP BUF BR LODA20 .PAGE LODA30: PAST NAME JSR PC,SRGLOB ;SEARCH FOR NAME IN LSD BR LDER22 ;GLOBAL SYMBOL SEARCH  SUCCESSIVE SECTOR READS DEC SECTCT ;ANY MORE SECTORS IN MODULE? BLT NXTB90 ;NO DISC - DAE ASL R0 ;LEFT-JUSTIFY LOW TEN ADDRESS BITS ASL R0 ASL R0 ! ,c ѐ"vhˋÜ`E $  P   LwZV #TMPBUF,-(SP) MOV R1,-(SP) EMT R50PAK ;CONVERT TO RADIX-50 MOV (R1)+,ILURE MOV R4,(R3)+ ;PUT ALTERED WORD INTO TEXT JSR PC,TRAPUT ;PUT "ADD" INTO TRAILERE: GO INIT FOR NEXT MODULE ;YES - READ NEXT SECTOR--- MOV #OBJLST,-(SP) ;DISC READ LIST ASL R0 ASL R0 ASL R0 SETDAR: MOV R0,@6(R5) ;OUTPUT SECTOR NUMBER TO DISC ADDR R ɋr pC ;CHECK CONVERTED NAME... BIS (R1)+,R3 ;...FOR ALL NULLS BEQ LODB10 ;ALL N SUB #6,R0 ;BC LODJ99: JMP LODJ20 ;COMMON RETURN (GET NEXT RLD COMMAND) LODJ34: CMEMT DISCIO ;****READ NEXT SECTOR**** TST OBJERR ;READ ERROR? BNE LDER01 EG .PAGE PRTSEC: ;NOW PRINT SECTOR HEADING MOV SECTOR,R4 MOV PC,R3 * ; INPUT TO GETELT IS: * ; R5 = ADDRESS OF COMMUNICATIONS BLOCKLS: END OF INPUT LINE REACHED LODA40: CMP (R1)+,(R1)+ ;LEAVE ROOM FOR FOUR WORDS PER ENTRY BR LODA10: ;INTERNAL DISPLACED RELOCATION: ;DISPLACEMENT FROM CURRENT PC INTO TEST - ;"SUB BIAS ;YES INC OBJSEC ;BUMP SECTOR # FOR NEXT TIME SUB #128.,BLKPTR ;SHIFT POINTER BACK ADD #SECNUM+6-.,R3 JSR PC,BIN2OCT ;CONVERT SECTOR # TO PARITY ASCII MOV PC,R3 AD * ; SECTOR ZERO IN THE ZBUF * ; DISKIO LIST SE ;...AND GO TO FETCH ANOTHER NAME ; ******************************************************************** LODB10INSTRUCTION INTO TRAILER JSR PC,GETPC ;CURRENT OFFSET FROM LOAD BASE NEG R4 ADD  TOP SECTOR AREA NXTB30: ;PREPARE TO FIND NEXT BLOCK START MOV BLKPTR,R0 MOV #OBJBK2,R1D #HEDBUF-.,R3 JSR PC,PRTHED ; NOW PRINT ONE SECTOR'S WORTH --- MOV PC,R3 ADTUP FOR ROS FILE * ; *  ;ALL NAMES NOW CONVERTED TO RAD50 MOV #NAMBUF,R0 ;INIT POINTER TO LIST OF RAD50 NAMES SU(R1)+,R4 ;FORM (L-(.+2)) MOV R4,(R3)+ ;PUT ALTERED WORD INTO TEXT JSR PC,TRAPUT  ;TOP OF LOWER AREA SUB R0,R1 ;# BYTES REMAINING IN TOP SECTOR ; SEARCH FOR A "1-0" SEQUENCD #DSCBUF-.,R3 MOV R3,@2(R5) ;CURRENT MEMORY ADDRESS REGISTER MOV #-64.,@4(R5) ;DISC WO; OUTPUT FROM GETELT IS: * ; R3 = SECTOR # CONTAINING SPECIED ELEMENTS DI #NAMBUF+4,R1 ;#BYTES IN CONVERTED LIST ASR R1 ;#WORDS ASR R1 ASR  ;"ADD" INTO TRAILER BIS #100000,-2(R3) ;CHANGE IT TO A "SUB" INSTR SUB #4,R0 ;BC TO START NEXT BLOCK NXTB40: MOV #ONEZRO,PTR1.0 ;INIT PTR TO [1] NXTB44: DEC R1 ;END OF TOP BLOCK YERD COUNT: ONE SECTOR MOV #5,@(R5) ;DCS - READ! TSTB @(R5) ;DCS - READY? BPRECTORY ENTRY * ; R2 = ADDRESS OF LAST CELL IN LAST EXAMED BUFFER (ZBUF OR ABUF) * ; R0 = ADDRESS IN BUFFERR1 ;#NAMES CONVERTEDTO RADIX-50 MOV R1,MODCNT ;SAVE IT: # OBJ MODULES TO LINK .PAG BR LODJ99 ;NEXT .PAGE LODJ36: CMD4: ;GLOBAL DISPLACED RELOCATION: ;DIS BLT NXTB10 ;YES - GO READ NEXT SECTOR CMPB (R0)+,@PTR1.0 ;IS NEXT BYTE A MATCH FOR SEQUL .-4 ;NOT YET MOV PC,R0 ADD #DSCBUF-.,R0 ;POINTER TO BINARY BUFFER JS OF STATUS BYTE OF ENTRY IF FOUND * ; = 0 IF ELEMENT NOT FOUND * ;  ; NOW CHECK BATCH DIRECTORY FOR EACH NAME ENTERED LODB20: DEC R1 ;COUNT DOWN # OF NAMES ACEMENT FROM CURRENT PC INTO TEXT ;NO TRAILER ELEMENT JSR PC,GETPC ;GET PC NOW CE? BNE NXTB40 ;NO MATCH - KEEP LOOKING INC PTR1.0 ;MATCH: BUMP TO NEXT BYTE INR PC,FILLBF INC SECTOR BR PRTSEC .PAGE FILLBF: MOV #4,LINCNT ;PRINT FOUR Z STATUS BIT SET IFF ELEMENT NOT FOUND * ; ABUF CONTAINS SECTOR WITH THE ELEMENT'S DIRECTORY ENT LODC10 ;DONE:EXIT LOOP:ALL NAMES WERE FOUND MOV #-1,OBJSEC ;START W/ RELATIVE SECTOR ZERO  MOV R4,R3 ;SAVE IT MOV R1,R4 ;PTR TO GLOBAL NAME CMP (R1)+,(R1)+ ;BODE BIT #1,PTR1.0 ;HAVE BOTH [1] AND [0] BEEN TESTED? BNE NXTB44 ;NO - CHECK FOR LINES OF 16 WORDS EACH NXTLIN: MOV PC,R3 ;PRINT NEXT LINE ADD #LPBUF+6-.,R3 ;ASCII BUFFER TRY (UNLESS* ; ENTRY FOUND IN SECTOR 0. * ; DB30: INC OBJSEC ;BUMP SECTOR # MOV #OBJLST,-(SP) EMT DISCIO ;DISCIO: DIRECP PAST NAME JSR PC,SRGLOB ;SEARCH FOR GLOBAL BR LDER22 ;GLOBAL SYMBOL SEARCH FAIL] .PAGE ; YEA! A [1-0] SEQUENCE HAS BEEN FOUND: NOW PROCESS BLOCK MOVB (R0)+,R1 ;BLO MOV #16.,R1 ;# WORDS PER LINE CVRT: MOV (R0)+,R4 ;NEXT BINARY WORD JSR PC,BIN2OCT * ; SUBROUTINES USED: DISKBF * ; RY SECTOR TST OBJERR ;CHECK FOR ERROR BNE LDER10 ;YES: ERR OUT MOV E SUB R3,R4 ;GET DISPLACEMENT MOV R4,(R3)+ ;PUT ALTERED WORD INTO TEXT 'S BYTE COUNT TSTB (R0)+ ;UPPER BYTE OF BC MUST BE ZERO BNE LDER02 MOV R0,R ;CONVERT IT TO PARITY ASCII ADD #6,R3 ;GET TO END OF CURRENT ASCII MOV #120240,(R3) * ; ALL UNUSED REGISTERS ARE PRESERVED. #8.,R3 ;INIT COUNT OF ENTRIES IN THIS SECTOR MOV #OBJBK1,R4 ;...AND POINTER TO SECTOR DATA SUB #6,R0 ;BC BR LODJ99 ;NEXT RLD LODJ38: CMD5: ;GLOBAL ADDITIVE RELOCATION:  ;SAVE POINTER TO FIRST DATA BYTE ; NOW WANT TO COMPUTE CHECKSUM TO VERIFY CORRECT READ: MOV + ;INSERT A DOUBLE SPACE ADD #6,R3 ;GET IT READY FOR NEXT CONVERSION DEC R1 * ; * ;********************************************* TST OBJSEC ;IS THIS THE 1ST SECTOR (RELATIVE ZERO)? BNE LODB50 ;NO: BYPASS INIT OF ENTR ;PUT SUM OF CONSTANT & GLOBAL (OFFSET::0) INTO TEXT; ;PUT "ADD" INTO TRAILER MOV R1,R2 ;INIT CHECKSUM, WHICH INCLUDES BC SUB #4,R1 ;REDUCE BC TO ELIM "1-0" AND BC WORDS ;MORE WORDS IN THIS LINE? BGT CVRT ;CONVERT NEXT WORD ; BUFFER NOW FULL: TIME TO PRINT ************************** GETELT =. ; ENTRY POINT MOV #ZBUF+8.+FID,R0 ; PUT ADDRESS OF ECOUNT TST (R4)+ ;SKIP BATCH FILE I.D. MOVB (R4),R2 ;# ENTRIES IN DIRECTORY (+1),R4 ;PTR TO GLOBAL NAME JSR PC,SRGLOB ;SEARCH LSD FOR IT BR LDER22 ;GLO MOV R1,BC ;SAVE BYTE COUNT OF DATA ONLY NXTB50: MOVB (R0)+,R3 ;EXTRACT NEXT BYTE AD MOV PC,R1 ADD #LPBUF-.,R1 MOV R1,@#LPADDR MOV #-63.,@#LPWC ;PRINT SIXTENTRY 1, SECTOR 0 IN R0 MOV #ZBFEND,R2 ; ADDRESS OF LAST WORD IN BUFFER CLR R3 ; SE TST (R4)+ ;SKIP SECOND WORD MOV (R4)+,DIRSEC ;NEXT FREE DIRECTORY SECTOR MOL SYMBOL SEARCH FAILURE CMP (R1)+,(R1)+ ;BUMP PAST GLOBAL TO CONSTANT ADD (R1)+,R4 ;C R3,R2 ;ACCUM CHECKSUM DEC R1 ;MORE DATA BYTES TO ADD IN? DEC R1 EN 6-CHAR NUMBERS MOV #4000,@#LPCMD ;PRINT! TST @#LPCSR ;DONE? BPL .-4 CTOR # OF SEARCH GETA10: CMP (R0)+,BFELN1(R5); DOES FIRST TRIAD MATCH? BNE GETA20 ; NO CM (R4)+,BGNSEC ;NEXT FREE BATCH ELEMENT SECTOR SUB #8.,R4 ;RESET SO NEXT INSTRUCTION WILL WORK ST + XSYM MOV R4,(R3)+ ;PUT ALTERED WORD INTO TEXT JSR PC,TRAPUT ;"ADD" INTO TRAILE ;BYTE COUNT INCLUDES CHECKSUM BYTE BGE NXTB50 ;SO GO BACK FOR ONE EXTRA BYTE AT END IN ;NOT YET DEC LINCNT ;MORE LINES? BGT NXTLIN ;YES DEC SECNT P (R0)+,BFELN2(R5); YES. DOES SECOND TRIAD? BNE GETA30 ; NO. CMPB 1(R0),BFTYPE(R5); YELODB40: ADD #16.,R4 ;ADVANCE POINTER TO NEXT ENTRY DEC R2 ;MORE ENTRIES TO C SUB #6,R0 ;BC BR LODJ99 ;NEXT RLD LODJ40: CMD6: ;GLOBAL ADDITIVE DISPL R2 ;CHECKSUM ITSELF INCLUDES THE "1" @BEGIN BNE LDER03 ;CHECKSUM ERROR MOV ;DOES HE WANT ANOTHER SECTOR/BLOCK? BLE .+4 ;ALL DONE. RTS PC ;RETS. DOES TYPE? BNE GETA30 ; NO RTS PC ; YES - ALL DONE RETURN TO USER. GETA20CK? BEQ LDER11 ;EXHAUSTED: NO SUCH NAME FOUND DEC R3 ;DONE W/ THIS SECTOR? ED: ;SUM OF CONST & GLOBAL, LESS CURRENT OFFSET, TO FORM ;DISPLACEMENT TO PUT INTO TEXT;  R0,BLKPTR ;ADVANCE BLK PTR-READY FOR NEXT BLOCK MOV R5,R0 ;RESET LOCAL PTR TO FIRST DATA BYTURN FOR ANOTHER ONE TST (SP)+ JMP START ;GO BACK AND WAIT FOR ANOTHER SEQUENCE : TST (R0)+ ; INCREMENT R0 BY 2 GETA30: ADD #6,(R0) ; ADD 6 TO R0-NOW POINTS TO NEXT ENTRY  BEQ LODB30 ;YES: GO GET NEXT SECTOR IN DIRECTORY LODB50: CMP (R0),(R4) ;INPUT NAME :VS: DIR ;NO TRAILER ELEMENT JSR PC,GETPC ;PC NOW MOV R4,-(SP) ;SAVE IT  BIT #1,R0 ;IS ADDR OF FIRST DATA BYTE ODD? BEQ NXTB70 ;EVEN: NO RELOCATION NEE.PAGE BIN2OCT: ;BINARY TO ASCII CONVERSION - WITH PARITY MOV #6,R2 ;CONVERT SIX CHARS BIN050 CMP R0,R2 ; OR ARE WE OUT OF THE BUFFER? BLO GETA10 ; NOPE. PROCEED WITH SEARCH TORY NAME BNE LODB40 ;NO MATCH CMP 2(R0),2(R4) ;CHECK SECOND WORD BNE  MOV R1,R4 ;GLOBAL NAME PTR JSR PC,SRGLOB ;SEARCH FOR NAME IN LSD BR LDERD MOV BC,R5 ;NEED TO MOVE ALL BYTES BACK ONE NXTB60: MOVB (R0)+,-2(R0) ;SHIFT BYTE BACK ONE : MOVB R4,-(R3) ;PUT NEXT DIGIT IN ASCII BUFFER BICB #370,(R3) ;ISOLATE ONLY THIS OCTAL DIGIT MOV #ABUF+BHEAD+DNAME1 1 YUP. SET R0=ADD OF FIRST ENTRY ; IN ABUF DB40 ;NO MATCH CMP (R0)+,(R0)+ ;MATCH! GET PAST NAME IN "NAMBUF" MOV 14(R4),(R0)+  ;GLOBAL SYMBOL SEARCH FAILURE CMP (R1)+,(R1)+ ;BUMP PAST NAME TO CONST ADD (R1)+,R4 DEC R5 ;MORE BYTES TO MOVE? BGT NXTB60 ;YES NXTB70: MOV BC,R5 ;I CLR -(SP) ;WILL ACCUM PARITY MOVB (R3),TMP ;WANT TO COUNT BITS ASR TMP MOV #ABFEND,R2 ; SET R2 = ADDRESS OF ABUF LAST WORD INC R3 ; ADD 1 TO R3 (SECTOR COUNTER ;... START SECTOR... MOV 16(R4),(R0)+ ;... AND LENGTH, TO INTERNAL DIRECTORY BR LODB20  ;C+XSYM SUB (SP)+,R4 ;C+XSYM-PC= DISPLACEMENT MOV R4,(R3)+ ;PUT ALTERED WORD T R5 WITH DATA BYTE COUNT ADD #2,(SP) ;BUMP FOR "GOOD" RETURN NXTB80: RTS PC ; ************** ADC (SP) ASR TMP ADC (SP) ASR TMP ADC (SP) ASR CMP R3,#DIRMAX ; HAVE WE CHECKED ALL SECTORS BLT GETA50 ; NOT YET CLR ;GO GET NEXT NAME .PAGE LDER10: MOV #10,R4 ;DISC READ ERROR: BATCH DIRECTORY JSR PC,ETO TEXT SUB #8.,R0 ;BC BR LODJ99 ;NEXT RLD .PAGE LODJ42: CMD7: **************************************************** LDER01: MOV #1,R4 ;OBJ MODULE BLOCK READ ERROR (SP)+ ;SEE IF BIT COUNT WAS EVEN OR ODD BCC BIN100 ;WAS EVEN: PARITY BIT NOT NEEDED R0 ; YES. R0 = 0 SINCE NOTHING FOUND RTS PC ; RETURN GETA50: MOV #ABUF,DSKADD PRT LDER11: MOV #11,R4 ;"BFUP" DIRECTORY SEARCH FAILURE JSR PC,ERRPRT ; ******************;SET CURRENT PC AND POINT TO NEW SECTION ;IF .ASECT, THE CONSTANT WILL BE THE NEW PC, AND ITS JSR PC,ERRPRT LDER02: MOV #2,R4 ;BLOCK BYTE COUNT ERROR JSR PC,ERRPRT LDER03: MOV #3BISB #200,(R3) ;MAKE EVEN BY SETTING PARITY BIT BIN100: BISB #060,(R3) ;MAKE CHARACTER ASCII ASR ; SET BUFFER ADDRESS FOR TRANSFER MOVB #RFUN,AFUN ; SET STATUS FOR READ MOV R3,DSKSEC ; ************************************************ LODC10: ; ALL NAMES FOUND IN DIRECTORY. NOW PROCEED WITH PASS 1. ;BASE WILL BE ZERO. ;IF .CSECT, THE CONSTANT WILL REPRESENT THE OFFSET FROM ;THAT SE4 ;OBJ MOD BLOCK CHECKSUM ERROR JSR PC,ERRPRT .PAGE ; " T R A P U T " ; SUBROUTI R4 ;SHIFT FOR NEXT OCTAL DIGIT BIC #100000,R4 ;PREVENT SIGN PROPAGATION ASR SET SECTOR # JSR PC,DISKBF ; GO READ SECTOR BNE BFERDK ; DISK ERROR BR  CLR (R0) ;FLAG END OF NAMES LIST MOV #NAMBUF,NAMPTR ;POINTER TO LIST OF MODULE NAMES ION'S BASE. MOV R1,R4 ;PTR TO SECT NAME SOUGHT CMP (R1)+,(R1)+ ;BUMP TO CONSTANT  PUTS AN "ADD R1,LOC" TWO-WORD INSTRUCTION IN THE TASK ; TRAILER, TO BE EXECUTED WHEN THE LOAD MODULE IS READ INTO CORE PRIR4 ASR R4 DEC R2 ;MORE ASCII DIGITS TO GO? BGT BIN050 ;BACK FOR GETA10 ; GO PROCESS THIS BUFFER .PAGE ; THIS SUBROUTINE, FILECK, IS USED BY ALL BFUP ENTRY POINTS TO: ;  MOV MODCNT,NAMCTR ;# OF MODULES IN LIST MOV #LSDBGN,SYME ;INIT PTR TO DEFINED SYMBOLS  JSR PC,GETSEC ;SEARCH FOR SECTION NAME IN LSD BR LDER23 ;NOT FOUND MOV  ; TO TASK EXECUTION, THUS EFFECTING DYNAMIC RELOCTTION. THE SUBROUTINE ; CALCULATES THE PROPER DISPLACEMENT BETWEEN THEMORE RTS PC PRTHED: MOV R3,@#LPADDR ;INIT PRINTER TO PRINT MOV #-9.,@#LPWC 1) INSURE THAT BFUP IS AVAILABL FOR USE ; 2* READ SECTOR 0 INTO ZBUF, THUS INSURING THAT THE SPECIFIED ; V #LSDBGN,USYME ;INIT PTR TO UNDEFINED SYMBOLS .PAGE LODC20: ;LOOP HERE FOR SUCCESSIVE OBJECT MODUL,PTSECT ;PERM PTR TO SECT NAME IN LSD... MOV R4,R5 ;...ALSO CURRENT PTR SUB #4,R0 NSTRUCITON AND "LOC", ; THE WORD IN THE TEXT NEEDING DYNAMIC RELOCATION. THE FORMULA FOR THE ; DISPLACEMENT BETWEEN THE;WORD COUNT MOV #4000,@#LPCMD ;PRINT! TST @#LPCSR ;DONE? BPL .-4 ROS FILE IS DEFINED IN ROS. ; 3) SETING THE STATUS BITS & ROTO 1 IF THE FILE HAS NOT BEEN ; INITIALIZED A JSR PC,NXTMOD ;INIT FOR NEXT OBJ MODULE BR LODC19 ;DONE WITH ALL OBJ MODULES LO ;BC (MORE BELOW) ; CONTINUE AS IN "CMD8" LODJ44: CMD8: ;MODIFICATION TO PC: ".=.+C" ;BADD" INSTRUCTION AND ITS OBJECT IN THE LOAD ; TEXT IS: DISPL = CURPC + OFFSET - TRAPC ; THIS DISPLAC ;NOT YET RTS PC .PAGE ADRESS: .WORD 0 KEY: .WORD 0 ;DEVICE SELECTION KEY LIS A BFUP FILE. IF THE FILE IS INITIALIZED, RO ; IS SET TO 0 AND THE STATUS BITE ARE SET ACCORDINGLY. ; ERROR EXIT30: JSR PC,NXTBLK ;GET NEXT BLOCK BR LODC19 ;DONE WITH ALL OBJECT BLOCKS LODD00: P PC BY ADDING NEW CONST TO CURRENT PGM SECT BASE MOV BASE(R5),R4 ;CURRENT SECTION'S BASE ADD ENT IS NEGATIVE, SINCE ALL REFERENCES FROM THE TRAILER ; WILL BE BACKWARD. TRAPUT: ;SUBROUTINE TO BUILD TRAILERNCNT: .WORD 0 SECNT: .WORD 0 ;# OF SECTORS TO PRINT SECTOR: .WORD 0 ;CURRENT SECTOR BEINS ARE TAKEN IF ITEMS 1 OR 2 ARE NOT CORRECT. ; ONLY REGISTER R0 IS USED AND NOT RESTORED. ; FILECK =. ;HERE TO PROCESS SUCCESSIVE GSD BLOCKS ; R0 POINTS TO FIRST DATA BYTE IN BLOCK ; R5 CONTAINS BYTE COUNT OF D(R1)+,R4 ;ADD CONSTANT TO BASE VALUE MOV R4,CURPC ;NEW VALUE OF NEXT TEXT BLOCK'S BASE  ADD #4,TRAPC ;ADVANCE TO NEXT OPEN CELL AFTER THIS 1. MOV TRAILPOINTER,R3 ;NEXT OPEN TRAILERG DUMPED TMP: .WORD 0 HEDBUF: .BYTE '-,'S,'E+200,'C+200,'T+200,'O+200,'R+200,'-,'- DISCID: .BYTE 0,'< SECNUM: .= ; ENTRY POINT CLR (R5) ; CLEAR BFUP COM BLOCKS ERROR WORD TSTB BFBUSY ; IS BFUA BYTES TST BLOCK1 ;IS THIS FIRST BLOCK IN MODULE? BEQ LODD10 ;YES  ;(AS OFFSET FROM LOAD MODULE'S BASE) TST (SP)+ ;POP CURRENT COMMAND CLLOT MOV #60167,(R3)+ ;"ADD R1,A" INSTRUCTION JSR PC,GETPC ;GET VALUE OF CURRENT LOAD O.+6 .BYTE '>+200 MEMBUF: .BYTE '-,'-,'C+200,'O+200,'R+200,'E+200,'-,'-,'-,'-,'< MEMADR: .=.+6 .BYTP IN USE BNE BFER08 ; YES - ERROR INCB BFBUSY ; SET BFUP BUSY FLAG MOVB C (R0) ;IS THIS A GSD BLOCK? BEQ LODD20 ;YES: PROCEED DEC (R0)  TXTBC ;AVOID ALTERING NEW [CURPC] IN "TXTOUT" SUB #4,R0 ;2 WDS FOR CMD8; 4 WDS FOR CMDSET SUB TRAPC,R4 ;CALC BACKWARD DISPLACEMENT MOV R4,(R3)+ ;STICK IT BEHIND "ADD" E '>+200 DSCTAB: ;TABLE OF DISC ADDRESSES FOR BOTH DISCS ; FOR DDC DISC: .WORD 165302 #RFUN,ZFUN ; SET SECTOR 0 FOR READ MOV 2(R5),ABUF ; MOV 2(R5),ZBUF ; SET BOTH BUF;IS IT GSD END? BEQ LODC20 ;YES: GET NEXT OBJ MODULE CMP (R0),#4 ;IS IT MODULE  ; PC COMMANDS MUST BE LAST IN RLD BLE LODJ99 ;DONE: O.K. ; IF NOT DONE, THEN NEXT COMMAND MUST AL NOW SEE IF BUFFER IS FULL, AND WRITE IT OUT IF SO: CMP R3,#TRAILBLOCK+64. ;AT END YET? BL ;DISC CONTROL STATUS AND COMMAND REG .WORD 165300 ;DISC MEMORY ADDRESS REG .WORD 165304 FERS WITH FILE ID. MOV #ZBUFF,R0 ; GET ADDRESS OF BUFFER FOR SECTOR ZERO MOV R0,DSKADD D? BEQ LODC20 ;YES: GET NEXT MODULE BR LODC30 ;NO: GET NEXT BLOCK LODD10:  BE PC TYPE CMPB #PCMD1,(R1) ;IS NEXT COMMAND "PC DEFINITION"? BEQ LODJ99 ;YES: O.K. TRAP20 ;NOT YET MOV #TRALST,-(SP) ;LIST FOR WRITING TRAILER EMT DISCIO IN ;DISC WORD COUNT .WORD 165306 ;DISC ADDRESS REG .WORD 165310 ;DISC ERROR REGISTER; SET BUFFER ADDRESS FOR TRANSFER JSR PC,DISKBF ; READ IN SECTOR 0 CMP #7,DSKERR ; WAS C BLOCK1 ;INDICATE FIRST BLOCK PROCESSED DEC (R0) ;CHECK THAT IT IS GSD BNE  CMPB #PCMD2,(R1) ;IS IT "PC MODIFICATION"? BEQ LODJ99 ;YES: O.K. .PAGE LO TRASEC ;BUMP TRAILER SECTOR COUNT MOV #TRAILBLOCK,R3 ;PREPARE TO RESET POINTER TRAP20: ; FOR RF-11 DISC: .WORD 177460 ;DISC CONTROL STATUS AND COMMAND REG .WORD 177464 THIS A REAL ROS FILE? BEQ FLCK10 ; NO DISK I/O ERROR - ALL IS AOK. BEQ BFER01 ;  LDER13 ;NOT GSD BEGIN TSTB FLAGS+1(R0) ;ENTRY TYPE BNE LDER14 ;FIRST ENTRY46: CMD9: ;SET PROGRAM LIMITS CLR (R3)+ ;FIRST TEXT WORD: RELATIVE ZERO MOV PRSIZE,(MOV R3,TRAILPOINTER ;NEW POINTER RTS PC .PAGE ; " T X T O U T " ; ("TXTBC" MAY BE ZE ;DISC MEMORY ADDRESS REG .WORD 177462 ;DISC WORD COUNT .WORD 177466 ;DISC ADDRESS NO. BR BFERDK ; YES. THEREFORE A REAL I/O ERROR. FLCK10: CMP 12.(R0),(PC)+ ; LET'S SEE IF THIOT MODULE NAME LODD20: ;HERE FOR EACH SUCCESSIVE ENTRY UNTIL BLOCK END CMP -(R5),(R0)+ ;BUMP BC) ;SECOND WORD: TOP OF PROGRAM INC (R3)+ ;MAKE FIRST AVAILABLE BYTE JSR PC,TRAPUT , WHICH INDICATES "CURPC" HAS BEEN SET TO A NEW ; VALUE BY AN RLD COMMAND. IF THE NEW PC STILL FALLS WITHIN BLOCK #1, ; REG .WORD 177470 ;DISC ADDRESS EXTENSION REG LPBUF: .=.+132. DSCBUF: .=.+128. ;DATE: 22-MAR-72 S IS A BFUP FILE? .RAD50 /.BF/ ; FIRST WORD OF FLAG BNE FLCK30 ; NOT BFUP FILE  PTR PAST GSD COMMAND SUB #8.,R5 ;BLOCK END? BLT LODC30 ;YES: GO GET NEXT ONE  ;CAUSE BIAS TO BE ADDED TO BOTH WORDS ADD #2,OFFSET JSR PC,TRAPUT BR LODJ99 ;  TRANSFER WILL OCCUR. IF THE NEW PC IS INTO THE SECOND BLOCK, OR ; OUTSIDE THE TWO BLOCKS, BOTH BLOCKS WILL BE WRITTEN OU; M W KLEIN .END START CMP 14.(R0),(PC)+ ; FIRST WORD OK - IS THE SECOND? .RAD50 /UP./ ; SECOND WORD OF FLAG.  MOVB FLAGS+1(R0),R2 ;ENTRY TYPE CMPB R2,#GSDMAX ;IS IT LEGAL? BGT LDER15 ******************************************************************* LDER22: TST (SP)+ ;POP SAVED PC  AND THE ; APPROPRIATE NEW TWO BLOCKS WILL BE READ IN. IN MANY CASES THIS WILL ; MEAN THAT A PARTIALLY-WRITTEN TEXT BLOCK4~Pvw J DE BNE FLCK30 ; NOT A BFUP FILE CLR R0 ; IT IS A BFUP FILE SET R0 & STATUS BITS ;NO MOV R0,R1 ;ENTRY POINTER ADD #8.,R0 ;NEXT ENTRY MOV R1,R4  MOV #22,R4 ;GLOBAL SYMBOL SEARCH FIALURE JSR PC,ERRPRT LDER23: MOV #23,R4 ;SEC2 WILL BE WRITTEN TO DISC, ; ONLY TO BE READ BACK IN AGAIN INTO BLOCK #1. IN THIS WAY, ; WE CAN BUFFER OUR TEXT OUT ONE S@!!  CaaŠw ~ve! ee  w ߀6w  RTS PC ; RETURN FLCK30: MOV #1,R0 ; SET R0 AND STATUS BITS - NOT BFUP RTS PC  ;SECONDARY POINTER USED BY VARIOUS RTNES ASL R2 ;BYTE INDEX JMP @GSDTAB(R2) ON NAME SEARCH FAILURE JSR PC,ERRPRT LDER24: MOV #24,R4 ;FATAL ERROR: PC CMD NOT LAST IN RLD TOR AT A TIME, AND PROTECT THE ; INTEGRITY OF OUR NEWLY CREATED TEXT.) TXTOUT: ;SUBROUTINE TO OUTPUT ACCUMULATEŋWe ee e Q Š@(U ~@w  xB7ne-ze  ;FILE RETURN. .PAGE ;*********************************************************************** ;  .PAGE GSDTAB: .WORD LODE00 ;(0) OBJ MOD NAME .WORD LODE20 ;(1) SECTION NAME  JSR PC,ERRPRT .PAGE LODL00: ;NOW DONE WITH PASS 2: OUTPUT ANY REMAINING TEXT, THEN ; TEXT IF BUFFER IS FULL ADD TXTBC,CURPC ;BUMP LOC'N CTR TO BGN OF NXT TEXT BLOCK ADD TXTBC,TXTPx`x^-VE?JFes eX . ~~we$U7 E}  * ; DISKBF IS AN INTERNAL SUBROUTINE USED BY BFUP TO DO DISK I .WORD LODD20 ;(2) INTERNAL SYMBOL (IGNORE) .WORD LODD20 ;(3) TRANSFER ADDRESS (IGNORE)  OUTPUT THE TRAILER. FIX UP MONITOR TASK TABLES; EXIT. MOV #64.,TXTCNT ;WANT TO WRITE ONLY ONE SECTOR ;ALSO BUMP POINTER IN LOCAL TEXT BLOCK MOV CURPC,-(SP) ;SAVE FOR WORK BELOW MOV TXTORG,R4  =e e ee ~0x e @ee USING * ; THE EMT DISCIO. IT PUSHS THE LIST ADDRESS ON THE STACK, USES THE EMT* ; AND, ON RETURN, CHECKS THE STATUS. .WORD LODE40 ;(4) GLOBAL SYMBOL ; ********************************************************************  JSR PC,TXTO10 ;GO WRITE OUT FINAL TEXT SECTOR MOV #207,@TRAILPOINTER ;[RTS PC] INTO F ;PC VALUE @ BGN OF RESIDENT TEXT MOV R4,R3 ;SAVE ALSO FOR CALCS BELOW CMP (SP),R4 e_   j f w#& P LN FN ~x @N Հ0 E NON-ZERO STATUS WILL CAUSE THE * ; THE ERROR STATUS TO BE SET IN THE COMMUNICATIONS BLOCK * ; ER13: MOV #13,R4 ;FIRST MODULE BLOCK NOT "GSD" JSR PC,ERRPRT LDER14: MOV #14,R4 ;FAL TRAILER WRD MOV #TRALST,-(SP) ;LIST FOR TRAILER EMT DISCIO ;WRITE OUT FINAL TRAILER ;IS NEW PC BELOW TEXT IN BLOCK ONE? BLO TXTO10 ;YES - REPLACE TEXT ADD #128.,R4   -S--<------<04~ y268 * ; THE LINKAGE IS 'JSR PC,DISKBF'. ST ENTRY IN GSD NOT OBJ MOD NAME JSR PC,ERRPRT LDER15: MOV #15,R4 ;ILLEGAL GSD ENTRY DECLARATIONECTOR MOV TRSCSV,TXTSEC ;INIT TO READ IN FIRST TRAILER SECTOR CLRB TXTR.W ;READ  ;PC OF FIRST BYTE IN SECOND TEXT BLOCK CMP (SP),R4 ;NEW PC IS ABOVE BLOCK1:IS IT BELOW BK2? K~y * ; * ;******************************************* JSR PC,ERRPRT LODC19: JMP LODF00 ;END OF READING FIRST PASS OVER OBJ MODS .PAGE ;*** MOV #TXTLST,-(SP) EMT DISCIO ;READ FIRST TRAILER SECTOR MOV TRAPC,R0 ;BYTO TXTO50 ;YES - NO NEED TO WRITE OR READ .PAGE TXTO10: ;HERE TO WRITE CURRENT TEXT OUT AND p~z************************** DISKBF =. ; ENTRY POINT MOV #DISKLST,-(SP) ; PUSH DISK I/O ***********PROCESSING FOR INDIVIDUAL G S D ENTRIES************** ; ON ENTRY TO EACH ROUTINE, R1 AND R4 POINT TO CANDIDATE IN PROGRAM PLUS TRAILER ASR R0 ;# WORDS ADD #3+PHDSZE,R0 ;TOTAL WORDS FROM TOP OFAD NEW TEXT IN--- MOVB #1,TXTR.W ;WRITE MOV #TXTLST,-(SP) EMT DISCIO  !"$'(+-.03569: JSR PC,SQUISH ;NO: REMOVE FROM UNDEF AREA SUB #BPSYM,USYME ;AND ADJUST UNDEF PTR LODE22: MOR4,-(SP) ;R5 PUSHED BY "JSR" MOV R3,-(SP) ;SAVE REST... MOV R2,-(SP) MOV  R4 ASL R4 ASL R4 MOV R4,TXTORG ;NEW BEGIN PC MOV (SP),R3 C *:{2{R~X}Hഊ]0 {  & wx0 T SECVAL: .BYTE 0,0,0,0,0,0,HT SECSIZ: .BYTE 0,0,0,0,0,0,HT CUMSIZ: .BYTE 0,0,0,0,0,0 END04: .EVEN ; ****** R1,R4 ;INSERT NEW SECTION NAME INTO LSD MOV SYME,PTSECT ;POINTER TO SECTION NAME IN LSD  R1,-(SP) MOV R0,-(SP) JMP (R5) ;...AND RTN REGPOP: ;RESTORE RGS ;PC FOR BEGIN OF NEXT TEXT BLOCK SUB R4,R3 ;GET OFFSET FROM TOP OF TEXT AREA ADD #TXTBK{s{3{3 {3 {{s{Z~}3 {3 { *z z  &  {{{ ************************************************************ ENTRY: .WORD END05-4-. .WORD 0 .BYT JSR PC,INSYME ;INSERT NEW NAME IN LSD BR LODD20 LODE24: ;SECTION NAME FOUND ALREADY T (SP)+ ;POP UNNEEDED R5 MOV (SP)+,R0 ;RESTORE OTHERS... MOV (SP)+,R1 R3 MOV R3,TXTPTR ;ACTUAL POINTER TO NEXT OPEN TEXT WORD TXTO50: TST (SP)+ ;POP SAVED PC   zw*z  M{2{R~H~e{2{{]  {&  HT MFLAG: .BYTE 0 ;PLACE TO PUT POSSIBLE "M" FLAG GLOBAL: .BYTE 0,0,0,0,0,0,' GLBVAL: .BYTE 0,0,FINED IN LSD CMPB FLAGS+1(R4),#SECTN ;IS IT A SECTION NAME,TOO? BNE LDER17 ;NO - DOUBMOV (SP)+,R2 MOV (SP)+,R3 MOV (SP)+,R4 RTS R5 ;...AND RTN ; ** RTS PC .PAGE LPCALL: ;COMMON ROUTINE TO MAKE EMT TO LINE PRINTER MOV #MAPLST,-(SP f {{ 2 { ){  ~~ s{3{{3 {3 {*zs{z3 {0,0,0 END05: .EVEN .PAGE UNDHED: .WORD END06-4-. .WORD 0 .ASCII /**********/  DEFINITION ERROR MOV R4,PTSECT ;SECTION NAME POINTER TO ORIG ENTRY CMP VALR(R4),VALR(R1) **************************************************************** GETPC: ;LOAD R4 W/ REL ADDR OF CURRENT TEXT ELEME EMT LPRNTR ;LINE PRINTER RTS PC ; ************************************************{  M 3 {^|  M {%{   Ml| ~8w|  3 {^|&l.BYTE LF,LF .ASCII "UNDEFINED REFERENCES" .BYTE LF END06: .EVEN ; **************************** ;COMPARE SECTION SIZES BHIS LODD20 ;ORIG WAS BIGGER: LEAVE IT MOV VALR(R1),VALR(R4)  MOV CURPC,R4 ;PC @ TEXT BLOCK START ADD OFFSET,R4 ;OFFSET SPECIFIED WITH RLD COMMAND****************** ; SUBROUTINE "BINARY TO OCTAL ASCII CONVERSION" ; INPUT: R4 = BINARY NUMBER <  MCf{{{ r { Z {,{<  ~  |wv&ff& |{************************************** UNDDEF: .WORD 6 .WORD 0 UNDNAM: .BYTE ,,,,, ;SIX CHARS ;REPLACE WITH NEW BIGGER SIZE BR LODD20 ; ************************************************************** RTS PC ; ******************************************************************** SYMOVF: ;CHECK FOR S; R3 = DESTINATION END ADDRESS ; R2 = ITERATION LENGTH (IF ENTER @"B2ONTes!{93 { D! 3 |  { % 3 |  Rĕ J  s!{5Еs{,~(|   N NAME OF UNDEFINED REF .PAGE BC: .WORD 0 ;BYTE COUNT BGNSEC: .WORD 0 ;BEG**** LDER17: MOV #17,R4 ;SECTION NAME CONFLICT W/GLB OR MOD NAME JSR PC,ERRPRT .PAGBOL TABLE OVERFLOW CMP USYME,#LSDEND-BPSYM BLOS SYMOV1 ;NOT YET AT END MOV ) BIN2OC: MOV #6,R2 ;INIT ITERATION LENGTH (NORMAL 6 CHARS) B2ONTA: ;ENTER HERE WHEN PRE-SETTING5  6 & `3 |  4W 1 .W +5(5%D ~eD   SECTOR FOR BUILDING LOAD MODULE BLKPTR: .WORD 0 ;POINTER TO CURRENT PLACE IN INPUT BLOCK BLOCK1: 0  ;*******GLOBAL SYMBOL******** (HERE AT LAST...) LODE40: BITB #UNDEF,FLAGS(R1);REF OR DEF? BEQ LODE50 6,R4 ;OVERFLOW: "TH-TH-THAT'S ALL, FOLKS!" JSR PC,ERRPRT SYMOV1: RTS PC .PAGE SRMODNTERATION LENGTH MOVB R4,-(R3) ;ALSO LOOP RETURN FOR NEXT OCTAL DIGIT BICB #370,(R3) ;L !!5  @& 5 55 ~ j| 3LAG FOR FIRST BLOCK IN MODULE CURPC: .WORD 0 ;CURRENT VALUE OF RELATIVE "PC" DIRSEC: .WORD 0  ;REF JSR PC,PTGLOB ;DEF - SEE IF IT IS ALREADY IN LSD BR LODE44 ;NOT FOUND  ;SEARCH DEFINED SECTION OF LSD FOR A MODULE NAME ; INPUT: R4 POINTS TO RAD50 NAME ; VE ONLY LEAST SIGNIFICANT THREE BITS BISB #060,(R3) ;CHANGE TO ASCII CODE ASR R4     {^|l&<  f|  e00t~ ;NEXT AVAILABLE DIRECTORY SECTOR MODCNT: .WORD 0 ;COUNT OF # OF MODULES TO LINK NAMCTR: 0 ;COUNT BITB #UNDEF,FLAGS(R4);FOUND: IS IT ALREADY DEFINED? BEQ LODE42 ;NO: GO REMOVE IT FROM UNDEF AUTPUT: R4 POINTS TO NAME IN LSD (IF FOUND) ; R4 UNCHANGED IF NOT FOUND ; CALL: JSR;BEGIN SHIFTING FOR NEXT OCTAL DIGIT BIC #100000,R4 ;PREVENT SIGN PROPAGATION ASR R4  Å|w|@aAa ! @{{wj f  `BafP| 5  FOR NAMES INPUT FROM TTY NAMPTR: 0 ;POINTER TO NAMES IN INPUT LIST OFFSET: 0 ;KEEPS OFFSET FROM BEGIN OF LOA BISB #DBLDEF,FLAGS(R4) ;FLAG OLD ONE AS A DOUBLER BISB #DBLDEF,FLAGS(R1) ;ALSO FLAG NC,SRMODN ; BR A ;FOUND ; BR B ;NOT FOUND MOV ASR R4 DEC R2 ;MORE ASCII DIGITS TO GO? BGT B2ONTA ;BACK FOR MORE ~f Å1 <7 6&  & & &  } f{{B   MODULE ONEZRO: .BYTE 1,0 PRSIZE: .WORD 0 ;CURRENT PROGRAM SIZE PTROBJ: .WORD 0 ;POI ONE BR LODE44 ;BYPASS REMOVAL LODE42: JSR PC,SQUISH ;REMOVE FROM UNDEFINED TABLE  R0,-(SP) ;SAVE IT MOV #LSDBGN,R0 ;START OF LSD SRMOD1: CMP R0,SYME ;REACHED END OF  RTS PC ;ASCII BUFFER FILLED: RETURN ; **************************************************************~% f6 wde6 PER TO CURRENT OBJ MOD ENTRY IN LSD PTR1.0: .WORD 0 ;POINTER FOR DETECTING ONE-ZERO SEQUENC PTSECT: .WORD SUB #BPSYM,USYME ;AND ADJUST ITS POINTER LODE44: MOV R1,R4 ;AGAIN POINT TO INPUT ENTRY JSR FINES? BLO SRMOD2 ;NOT YET MOV (SP)+,R0 ;NOT FOUND! ADD #2,(SP) **** ERRPRT: ;ERROR MESSAGE PRINTING ROUTINE ; R4 ALREADY INITED WITH BINARY ERROR NUMBER MOV ւ ~prt CR 1 ERROR CR 1 SPUR INT f&f  6 @ B  0 ;POINTER TO CURRENT SECTION NAME IN LSD SECTCT: .WORD 0 ;SECTOR COUNTER WHEN READING IN A  PC,INPTRH ;INSERT IT ALPHABETICALLY IN THIS SECT'N ;IF IT WAS DOUBLY DEFINED, BOTH ENTRIES ARE FLAGGED AS SUCH. THE ;ALTER RETURN FOR "NOT FOUND" RTS PC SRMOD2: CMPB #OBJMN,FLAGS+1(R0);THIS ENGRY AN OBJ MOD NAME?  #ERRNUM+2,R3 ;LAST CHAR IN ASCII BUFFER MOV #3,R2 ;A 3-CHAR MESSAGE NUMBERR JSR PC  1~pBC @C C C {ƂsƂ ٴ]DULE SYME: .WORD 0 ;NEXT OPENING IN LSD FOR DEFINED SYMBOL TRAILPOINTER: .WORD 0 ;NEXT SPACE IRST ;ENTRY WILL BE USED AS THE REF'D VALUE. THE MAP WILL SHOW ALL OF THEM. BR LODD20 ; * * * GLOBAL REF *BEQ SRMOD3 ;YES: IS NAME SAME? SRMOD4: ADD #BPSYM,R0 ;NOT AN OJB MOD BR SRMOD1 SRMO2ONTA ;USE SECONDARY ENTRY POINT TO CONVERSION MOV #ERRMSG,TTYBUF ;INIT FOR PRINTING ERROR MESSAGE  0 Ȃ& ~   & bwڳ Ȃ3ʂ ҂  TRAILER BLOCK TRAPC: .WORD 0 ;TRAILER "PC" TRSCSV: .WORD 0 ;SAVE OF INITIAL TRAILER SEC * LODE50: JSR PC,PTGLOB ;IS IT IN LSD ALREADY? BR LODE52 ;NOT FOUND: INSERT IT : CMP (R4),(R0) ;FIRST HALF-NAME MATCH? BNE SRMOD4 ;NO CMP 2(R4),2(R0) ;Y MOV #TTYLST,-(SP) EMT TTYOUT ;REQUEST MESSAGE EMT EXIT ;CURRENTLY ALL E҂҂ Ă fa~`ւf<   Ȃ 6M ΂5@p/Mp R TSWICH: 0 ;SWICH USED TO DIRECT FLOW AFTER TEXT OUTPUT TXTBC: .WORD 0 ;BYTE COUNT OF DATA IN CUR LODD20 ;FOUND: NO NEED TO DO ANYTHING LODE52: JSR PC,INUSYM ;INSERT AS AN UNDEFINED BR : SECOND HALF-NAME MATCH? BNE SRMOD4 ;NO ; FOUND! MOV R0,R4 ;NOW POINTS TOORS TERMINATE LOADER .PAGE TTYLST: .WORD 1 ;TELETYPE I/O LIST .BYTE 0,2 ;Dw"55@53ւ\& ~؄ E@pM3 ΂ ЂĂ 3 ЂM  NT TEXT TXTORG: .WORD 0 ;CURRENT PC AT BEGIN OF RESIDENT TEXT TXTPTR: .WORD 0 ;POINTER T LODD20 .PAGE ;NOW ALL OBJ MODULES HAVE BEEN PASSED OVER ONCE, ALL ; GSD'S HAVE BEEN PROCSD ENTRY MOV (SP)+,R0 RTS PC .PAGE PTGLOB: ;SEARCH LSD FOR A GLOBAL NAME (NOT OICE: TTY #1; CALL TYPE: SUSPEND .WORD 0 ;I/O COMPLETE .BYTE 0,0 ;ERROR,LEVR PĂ~P@  &f  && CURRENT OPEN SLOT IN TEXT USYME: .WORD 0 ;NEXT SLOT IN LSD FOR UNDEFINED SYMBOL ; ******************SED, AND THE LOADER'S SYMBOL DIRECTORY ; (LSD) HAS BEEN CONSTRUCTED. NOW THE LSD MUST BE PASSED OVER ; TO ASS MOD) ;THE SECRET TO THE LOADER'S CONTROL SECTION ABILITY LIES HERE. ; IF THE SECTION IS ONE OF THE NAMED ONES, IT APPE .WORD 0,0 ;RESERVED TTYBUF: .WORD 0 ;DATA BUFFER OBJLST: .WORD 1  ]& fz EAp3 Ȃ M@ @3ʂ <~ȅM0 H ‚ʂel  -************************************************ NAMBUF: .=MAXNAM*8.+. ;BUFFER HOLDS OBJ MODULE RAD50 NAMES... N LOAD MODULE RELATIVE ADDRESSES TO ALL GLOBAL SYMBOLS, ; AND SECTION BASES ASSIGNED. THE LOAD MAP WILL THEN BE PRINS ONLY ONCE IN THE ; LSD, AND THUS HAS ONLY ONE BASE TO LOAD PROGRAMS FROM. THE UNNAMED ; C-SECTS, HOWEVER, ARE DETECTED;OBJECT MODULE READ LIST .BYTE 1,2 ;DISC: SUSPEND .WORD 0 OBJERR: .BYTE 0,0   M e ‚1 e~@ ‚1^e3 ‚M ;...AND SECTOR INFORMATION FOR EACH MODULE. USES FOUR WORDS PER MODULE. TMPBUF: .WORD 0,0,0 ;TEMPORARY CONVED, ; SHOWING LOAD MODULE RELATIVE ADDRESSES, MULTIPLY DEFINED SYMBOLS ; ACCOMPANIED BY A "M" FLAG. LODF00: S 6 BLANKS, AND ARE MADE UNIQUE TO ; EACH OBJECT MODULE BY LIMITING THE SEARCH TO THE CURRENT OBJECT MODULE ; AREA IN THE ORD 0,0 .WORD OBJHED ;DATA BUFFER MAPLST: .WORD 1 ;LIST FOR LOAD MAP .B,!  Ԃ*! ! +!  ‚l҂ʂel ‚~Ă ΂MĂ҂ ION BUFFER ASCDAT: .WORD MAXNAM*7 ;TTY INPUT BUFFER FOR COMMAND STRING INPCNT: .WORD 0 ;ACTUAL  ;END OF PASS 1 MOV #ND1MSG,TTYBUF ;INIT TO PRINT "END PASS 1" ON TTY MOV #TTYLST,-(SP) D. ; INPUT: R4=PRT TO RAD50 NAME ; OUTPUT: R4=PTR TO LSD ENTRY IF FOUND ; CALL: JSR PC,PTGLOE 3,2 ;LINE PRINTER,SUSPEND .WORD 0 ;I/O COMPLETE .BYTE 0,0 ҂Ă҂҂ %(W %B %%% ~0   `  ARACTER COUNT LSDBGN: ;"LOADER SYMBOL DIRECTORY": WRITES OVER UNNEEDED BUFFER .=.+2000  EMT TTYOUT CLR PRSIZE ;INIT PROGRAM LOAD SIZE MOV #LSDBGN,R0 ;INIT PTR TO L ; BR A ;NOT FOUND ; BR B ;FOUND MOV R0,-RROR,LEVEL .WORD 0,0 ;RESERVED MAPBUF: .WORD 0 ;DATA BUFFER: CHOSEN DURING RUN   CU3 N; f< CEA5  :~ĂESERVE SPACE FOR SYMBOL TABLE LSDEND = . ;END OF LOADER SYMBOL DIRECTORY .END  MOV R0,PTROBJ ;...AND TO CURRENT OBJ MODULE BR LODF20 LODF10: ADD #BPSYM,R0 ;NP) ;SAVE IT MOV (R4),R0 ;IS THIS THE SPECIAL... BIS 2(R4),R0 ;...CASE OF 6 TLST: .WORD 1 ;LIST FOR TRANSFERS TO/FROM TEXT AREA .BYTE 1,2 ;DISC; SUSPEND >w*f 5 f .1 3 3 ΂s ̂3 Ԃʂ,~    ; INDEX MODE ADDRESSING SYNT05:    ; PARENTHETICAL EXPRESSION PROCESSED  JSR PC, PARSEP ; CALL PARENTHET ENTRY LODF20: CMP R0,SYME ;END OF LSD? BHIS LODF90 ;YES: EXIT LOOP MOVB FLANKS? BEQ PTGL01 ;YES: START AT CURRENT OBJ MOD MOV #LSDBGN,R0 ;NO: BEGIN @ BEGINNI.WORD 0 .BYTE 0,0 ;ERROR,LEVEL .WORD 0,0 ;RESERVED .WORD TXTHEDs3 Ȃւf< 4\ ‚A ʂ"p & .  ʂd~S SEPARATOR  BNE  SYNT06  ; A PARENTHESIS WAS FOUND SYNT15: INCB  QERROR  ; THE FIELD HAS TERMINATES+1(R0),R1 ;ENTRY TYPE MOVB FLAGS(R0),R2 ;QUALITIES FLAG CMPB R1,#GENTRY ;GLOBAL SYMBOL?  OF SYMBOL TABLE BR PTGL02 PTGL01: MOV PTROBJ,R0 ;CURRENT OBJ MOD PTGL02: CMP R0,USYME  ;ALWAYS R/W FROM/TO TEXT AREA TRALST: .WORD 1 ;LIST FOR TRAILER .BYTE 1,2  Ă3wD3 Ԃ Ђw 7 z7 Ă 12345678 &=':>@9 0/STUVWX ;  BR  IMMMDR  ; IMMEDIATE ADDRESSING  BR  SYNT0B  ; DETERMINE ADDRESSING SYNT06: BGT  SYNT07  BEQ LODF50 ;YES DEC R1 ;SECTION NAME? BNE LODF10 ;NO: GND? BLO PTGL03 ;NOT YET MOV (SP)+,R0 ;NOT FOUND! RTS PC PTGL03: CM;DISC,SUSPEND .WORD 0 .BYTE 0,0 ;ERROR;LEVEL .WORD 0,0 .WORD TRAH~Y _,(%\"Z -JKLMNOPQ $*];^R ! +ABCDEFGH .)[<#I  ; LEFT PARENTHESIS FOUND  INCB  QERROR  ; RIGHT PARENTHESIS FOUND SYNT07:   ; CALL AUTO INC.;DEC. NEXT ENTRY .PAGE ;*******SECTION NAME: MAKE ITS SIZE EVEN, STORE ITS BASE VALUE, SET PTR ; TO THIS SE (R4),(R0) ;FIRST HALF-NAME MATCH? BNE PTGL04 ;NO CMP 2(R4),2(R0) ;2ND HAL ;DATA BUFFER .PAGE TXTHED: ;HEADER FOR TEXT SAVE BUFFER READ/WRITE OPERATIONS .WORD  ~? 1234567ETERMINATOR  ; OPEN SUBROUTINE AUTO INCREMENT;DECREMENT DETERMINATOR   ; THIS SUBROUTINE VERIFIES THAT THE SAVED ION, AND INCREMENT THE TOTAL PROGRAM SIZE. BITB #ABSREL,R2 ;ABSOLUTE OR RELOCATABLE? BNE LODFNAME MATCH? BNE PTGL04 ;NO ;MATCH! CMPB #OBJMN,FLAGS+1(R0) ;FILTER OUT OBJ MOD NAMES BTCHID ;FILE I.D. FOR BATCH FILE .BYTE 0 ;RELATIVE SECTOR TXTR.W: .BYTE 0 :#@'="9 1~ 0/STUVWXY ,% >?Z -JKLMNOPQ !$*); R  stuvwxy z  ; TERMINATOR CODE IS FOR EITHER A + OR A   ; - CHARACTER. IF SO, THEN VERIFY THAT THIS   ; IS THE SOLE ;REL CLR VALR(R0) ;ABS: SET SIZE... CLR BASE(R0) ;...AND BASE = 0  BEQ PTGL04 MOV R0,R4 ;NOW POINTS TO FOUND NAME IN LSD MOV (SP)+,R0 ;U;TEXT READ/WRITE BYTE .WORD 0,0,0 TXTSEC: .WORD 0 ;RELATIVE SECTOR TO READ/WRIOTE TEXT TXTCNT &ABCDEFGH `.<(+|~xI   abcdefgh i jklmnopq r  \()[] DDRESSING INDICATOR PRESENT.   ; THEN APPROPRIATELY SET THE OPERATOR SEEN   ; VARIABLE.    ; INPUT BR LODF40 LODF30: ;RELOCATABLE SECTION MOV VALR(R0),R3 ;SECTION SIZE MOV R3,R4 AVE ADD #2,(SP) ;"GOOD" RETURN RTS PC ;NO MATCH PTGL04: ADD #BPSYM,R0 ;NEXT .WORD 0 ;# WORDS TO TRANSFER EACH TIME TXTBK1: .=.+128. ;FIRST TEXT SAVE BLOCK TXTBK2: .= @)~yz{|}~123456789:;<=>?aiklmno!"#$%&'()*+,-./`YZ[\]^_ CONTAINS THE EFFECTIVE    ;  TERMINATOR CODE    ; OUTPUT CONDITION CODED RESULTS    ;   ASR R4 ADC R3 ;MAKE SIZE EVEN MOV PRSIZE,BASE(R0) ;SET BASE OF NEW SECTI*$zt lf`ZTNF@:4.( ztlf`ZTNF@:4( |vpj.}؁(@h| h~s&(XhThV,|x|r|l|f|`|Z| ||||$|k,$|T|N|H|B|<|6| ||||$|k,H|0|*|$|||| ||||$|k,l| |||||=| ||||$|k,||||||| ||||$|k,7 .7 .7 .7 .7 .7 .7 .7 .7 .V*. ......".&.s7 .TVTVTV:. T V TV TV(TVTVTV6 TV TV TV"TVTVTV6 TV TV TV"TVTVTV6 TV TV TV"$TVTVTV6 TV TV TV"6TVTVTV6 TV TV TV"HTVTV7 .7 .. TV TV..?,\7 .7 .7 .7 .7 .7 .7 .7 . .. ......".|~|~|~6 |~ |~ |~2|~|~|~6 |~ |~ |~2$|~|~|~6 |~ |~ |~26|~|~|~6 |~ |~ |~2H|~|~|~6 |~ |~ |~2Z|~|~|~p6 |~ |~ |~2l|~|~7 .7 .8. |~ |~...7 .7 .7 .7 .7 .7 .7 .7 .T*. ......".&T,TTTTTTBT TTTT$T[,TTTzTtTnThT TTTT$T[,TbT\TVTPTJTDT TTTT$T[,T>T8T2T,T&T ]T TTTT$T[*6TTTTT$1T TTTT.}@@ @@*&@(x(T|6@  @ @ 6@  @ @ $6@  @ @ 66@  @ @ Hv6@  @ @ Zd6@  @ @ lR6@  @ @ ~@6@  @ @ .6@  @ @ 6@  @ @ ,7 .7 .7 .7 .7 .7 .7 .7 .7 .V*. ......".&.s6 6 6 6  6 26 D7 .7 .W. ..(X7 .7 .7 .7 .7 .7 .7 .7 ... ......".6@  @ @ 6@  @ @ $6@  @ @ 66@  @ @ Hv6@  @ @ Zd6@  @ @ l7 .7 .0.@  @ ...7 .7 .7 .7 .7 .7 .7 .7 .6. ......".&(!6 6 6 6 6 6 6 $6 66 H&   * <<<{{{{ZkZkZkZkZkZkZk1c1c1c1<?<