TITLE 11BOOT - BOOT I/O 11 ON KL10 ;LOADS DSK:KLRUG BIN AND DSK:IOELEV BIN, GIVES SYMBOLS TO RUG, AND ;MAKES DSK:@ BOOT11 WHICH IS TO BE PUT ON THE MAGDMP TAPE. .MLLIT==1 A=1 B=2 C=3 D=4 E=5 T=6 TT=7 H=10 I=11 J=12 Q=13 W=14 P=17 DLB==60 DLC==64 PAG==10 SWPUA=701540,, 11CORL==16.*1024. INCH==1 OUCH==2 OPENI: SETZ SIXBIT/OPEN/ [.UII,,INCH] [SIXBIT/DSK/] [SIXBIT/IOELEV/] SETZ [SIXBIT/BIN/] OPENR: SETZ SIXBIT/OPEN/ [.UII,,INCH] [SIXBIT/DSK/] [SIXBIT/KLRUG/] SETZ [SIXBIT/BIN/] OPENO: SETZ SIXBIT/OPEN/ [.BIO,,OUCH] [SIXBIT/DSK/] [SIXBIT/@/] SETZ [SIXBIT/BOOT11/] LPDL==50 PDL: -LPDL,,. BLOCK LPDL RWORD: .IOT INCH,W TDNE W,[-400] .VALUE .IOT INCH,A TDNE A,[-400] .VALUE LSH A,8 IOR W,A POPJ P, GO: MOVE P,PDL SETZM 11CORE MOVE A,[11CORE,,11CORE+1] BLT A,11CORE+11CORL-1 .CALL OPENR ;LOAD RUG .VALUE PUSHJ P,ALOAD LSH W,-1 ;START ADDR OF RUG -> VECTOR OF MAGIC CRUFT MOVE A,11CORE(W) ;FIRST WORD IS READ START ADDR (O.ODT) MOVEM A,RUGSA MOVEI A,11CORE+2(W) ;-> WORD TO CONTAIN LOWEST -11 ADDR OF SYMBOL TABLE MOVEM A,O.SYME MOVE A,11CORE+2(W) ;THIRD WORD IS POINTER TO LOWEST SYMBOL TABLE LOC LSH A,-1 MOVEM A,RUGSYM MOVE A,11CORE+1(W) ;SECOND WORD -> HIGH SYMBOL TABLE LOC LSH A,-1 SUB A,RUGSYM ;A := # WORDS OF SYMBOL TABLE IDIVI A,16.*3+2 ;A := # BLOCKS, B := # WORDS IN LAST BLOCK JUMPE B,G0001 MOVE A,RUGSYM ADD A,B ;A := WORD ADDR OF TOP OF BLOCK SUBI A,2 MOVEM A,FLGPNT SUBI B,2 IDIVI B,3 ;B := # SYMBOLS ALREADY USED IN BLOCK SUBI B,16. G0001: MOVNM B,SYMCNT ;SET # OF SYMBOLS YET TO GO .CALL OPENI ;LOAD IOELEVEN .VALUE PUSHJ P,ALOAD MOVEM W,SADR PUSHJ P,SLOAD ;LOAD SYMBOLS INTO CORE IMAGE FOR RUG JRST LDEND ALOAD: .IOT INCH,A ;SEARCH FOR START OF BLOCK JUMPE A,ALOAD ;SKIPPING "BLANK TAPE" CAIE A,1 .VALUE ;UNKNOWN BLOCK TYPE .IOT INCH,A ;SECOND BYTE OF HEADER ALWAYS 0 SKIPE A .VALUE PUSHJ P,RWORD ;BYTE COUNT + 6 HRREI Q,-6(W) PUSHJ P,RWORD ;LOAD ADDRESS JUMPLE Q,JBLK LD1: .IOT INCH,A ;BYTE TO BE LOADED TDNE A,[-400] .VALUE CAIL W,11CORL*2 .VALUE MOVEI J,2*11CORE(W) ;FIGURE OUT WHERE IT GOES ROT J,-1 SKIPL J TLOA J,001000 HRLI J,101000 DPB A,J ADDI W,1 SOJG Q,LD1 .IOT INCH,A ;IGNORE CHECKSUM JRST ALOAD JBLK: .IOT INCH,A ;GOBBLE CHECKSUM SKIPE Q .VALUE POPJ P, ;RETURN FROM ALOAD WITH START ADDR IN W SBTB: 440600,,A ;SIXBIT BYTE POINTER TO A RAD50: MOVE Q,SBTB PUSHJ P,LOOP50 HRRZM E,11CORE-3(B) PUSHJ P,LOOP50 HRRZM E,11CORE-2(B) POPJ P, LOOP50: MOVEI E,0 MOVEI D,3 LOP50: ILDB C,Q PUSHJ P,CNVT IMULI E,50 ADD E,C SOJG D,LOP50 POPJ P, CNVT: CAIL C,41 CAILE C,72 JRST NOTLET SUBI C,40 POPJ P, NOTLET: CAIN C,4 JRST DOLR CAIN C,5 JRST PRCNT CAIN C,16 JRST PERD CAIG C,31 CAIGE C,20 JRST NOTNUM ADDI C,16 POPJ P, NOTNUM: MOVEI C,0 POPJ P, DOLR: MOVEI C,33 POPJ P, PERD: MOVEI C,34 POPJ P, PRCNT: MOVEI C,35 POPJ P, SLOAD: .IOT INCH,A ;LOAD SYMBOLS JUMPE A,SLOAD ;SKIP BLANK TAPE CAIE A,2 .VALUE ;NOT SYMBOLS BLOCK MOVE B,RUGSYM ;LOAD SYMBOLS AT -3(B),-2(B),-1(B) MOVE H,SYMCNT ;# SYMBOLS YET TO GO IN THIS BLOCK MOVE A,FLGPNT HRLZ I,11CORE+1(A) ;PICK UP REGISTER FLAGS WORD HRR I,11CORE(A) ;PICK UP HALF-KILL FLAGS WORD JUMPN H,SLOAD1 SLOAD0: MOVEI H,16. ;NEW BLOCK MOVE B,RUGSYM SUBI B,2 MOVEM B,RUGSYM MOVEM B,FLGPNT SETZB I,11CORE(B) SETZM 11CORE+1(B) SLOAD1: .IOT INCH,A JUMPE A,SLOADE AOJE A,SLOADE SOS A PUSHJ P,RAD50 ;DEPOSIT 2 -11 WORDS OF RADIX 50 FOR THIS SIXBIT .IOT INCH,A ;GET FLAGS AND VALUE HRRZM A,11CORE-1(B) ;STORE VALUE MOVEI D,100000 MOVNI E,-1(H) ;E IS 0 FOR LOWEST SYM IN BLOCK, -15. FOR HIGHEST LSH D,(E) ;POINT TO RIGHT BIT IN FLAG TLNE A,4000 TLO I,(D) ;2ND FLAG WORD TLNE A,20000 TRO I,(D) ;1ST FLAG WORD SUBI B,3 SOJG H,SLOAD1 MOVE A,FLGPNT ;BLOCK DONE, FILL OUT HLRZM I,11CORE+1(A) HRRZM I,11CORE(A) MOVEM B,RUGSYM JRST SLOAD0 ;START NEXT BLOCK SLOADE: MOVE A,FLGPNT ;FINISH LAST BLOCK HLRZM I,11CORE+1(A) HRRZM I,11CORE(A) MOVEM B,RUGSYM LSH B,1 MOVEM B,@O.SYME ;TELL RUG WHERE SYMBOL TABLE ENDS POPJ P, RUGSYM: 0 ;WORD ADDR OF LOWEST LOC IN RUG SYMBOL TABLE FLGPNT: 0 ;WORD ADDR OF FLAG PAIR FOR CURRENT SYM BLOCK SYMCNT: 0 ;NUMBER OF SYMBOLS NOT YET GENERATED INTO CURRENT BLOCK O.SYME: 0 ;-> WORD IN -11 CORE IMAGE WHICH CONTAINS LOWEST ;-11 ADDR USED BY SYMBOL TABLE LDEND: .CLOSE INCH, .VALUE [ASCIZ|RUGSA/P|] .CALL OPENO .VALUE HRROI A,[JRST 1] ;WRITE SBLK FILE .IOT OUCH,A MOVEI H,BOOTST DMPLP: CAIL H,BOOTEN ;FIND NON-ZERO JRST DMPEN SKIPN (H) AOJA H,DMPLP MOVE J,H ;FIND 2 CONSECUTIVE ZEROS HRLI J,-200 ;WITHIN NEXT 200 WORDS ZERLP: SKIPE (J) AOBJN J,ZERLP JUMPGE J,DMPBLK AOBJP J,DMPBLK SKIPE (J) JRST ZERLP DMPBLK: SUBM H,J ;RH(J) := - # BLOCKS HRL H,J PUSH P,[DMPLP] HRROI A,H .IOT OUCH,A ;HEADER MOVE Q,H MOVE J,H .IOT OUCH,H ;DATA CKSLP: ROT Q,1 ADD Q,(J) AOBJN J,CKSLP HRROI A,Q .IOT OUCH,A ;CHECKSUM POPJ P, DMPEN: HRROI A,[JUMPA BOOTER] ;START ADDR .IOT OUCH,A MOVSI H,-LSYMT HRROI A,H .IOT OUCH,A ;HEADER MOVE Q,H HRRI H,SYMT MOVE J,H .IOT OUCH,H ;DATA PUSHJ P,CKSLP HRROI A,[JUMPA BOOTER] ;START ADDR AGAIN .IOT OUCH,A .CLOSE OUCH, .BREAK 16,040000 CONSTANTS SYMT: SQUOZE 0,GLOBAL -LSYMT,,0 SQUOZE 4,RUG GORUG SQUOZE 4,GO BOOTER SQUOZE 4,11CORE 11CORE SQUOZE 4,SADR SADR LSYMT==.-SYMT ;THE PROGRAM THAT GOES ON THE MAGDMP TAPE LOC 4000 BOOTST:: GORUG: MOVE A,RUGSA ;ENTER HERE TO START 11 IN RUG MOVEM A,SADR ;ENTER BELOW TO START 11 IN IOELEV BOOTER: CONI PAG,A ;FLUSH CACHE TRZN A,600000 JRST BOOTAA SWPUA CONSZ APR,200000 JRST .-1 CONO PAG,(A) BOOTAA: CONO DLC,400000 ;RESET DL10 MOVEI A,5000 SOJG A,. CONO DLB,DL10AR DATAO DLC,[40] ;STOP PDP11 DATAI DLC,A TRNE A,20 JRST .-2 MOVSI A,2 SOJG A,. CONO DLC,100020 ;PORT ENB DATAO DLC,[20] ;START PDP11 DATAI DLC,A TRNN A,20 JRST .-2 ;PDP11 IS NOW RUNNING OUT OF DL10 AREA MOVSI Q,-11CORL BOOTLP: MOVE A,11CORE(Q) ;TELL 11 BOOTSTRAP PROGRAM TO STORE ONE WORD SKIPE FLAG JRST .-1 MOVEM A,DAT AOS FLAG AOBJN Q,BOOTLP SKIPE FLAG JRST .-1 MOVEI A,000407 ;BR FROM 100004 TO 100024 MOVEM A,DL10AR+2 MOVEI A,25. ;ALLOW TIME FOR -11 TO GET STARTED SOJG A,. CONO DLC,400000 ;THEN, QUICK, TURN OFF PORT ENB WHILE IT'S IN INIT CODE SKIPE -4000 JRST -4000 ;IF DDT IS PRESENT RETURN TO IT JRST -400 ;ELSE RETURN TO MAGDMP RUGSA: 0 ;PDP11 START ADDRESS OF RUG CONSTANTS LOC 5000 DL10AR: JRST 4,. 005001 ;100002/ CLR %1 005727 ;100004/ TST #0 FLAG: 0 ;100006/ 0 => 11 READY FOR WORD, NON-0 => WORD GIVEN 001775 ;100010/ BEQ 100004 012721 ;100012/ MOV #0,(1)+ DAT: 0 ;100014/ VALUE TO BE STORED 005037 ;100016/ CLR @#FLAG 100006 ;100020/ 000770 ;100022/ BR 100004 000137 ;100024/ JMP @#1 SADR: 1 ;100026/ THE START ADDRESS LOC 6000 11CORE: BLOCK 11CORL BOOTEN: -1 ;MIDAS CORING BUG END GO