diff --git a/build/misc.tcl b/build/misc.tcl index eea73a26..395b7718 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -975,3 +975,12 @@ expect ":KILL" # TV-11 respond "*" ":palx dsk0:.;_system;tv\r" expect ":KILL" + +# 11BOOT +respond "*" ":midas /t sys3;ts 11boot_syseng;11boot\r" +respond "with ^C" "APR==0\r\003" +expect ":KILL" +# Note, must be run with symbols loaded. +respond "*" ":cwd .\r" +respond "*" "11boot\033\013" +expect ":KILL" diff --git a/doc/programs.md b/doc/programs.md index 9da29194..6c5740fe 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -1,3 +1,4 @@ +- 11BOOT, boot IO-11. - 11DDT, PDP-11 debugger. - 11SIM, PDP-11 emulator. - 11STNK, PDP-11 linker. diff --git a/src/syseng/11boot.23 b/src/syseng/11boot.23 new file mode 100755 index 00000000..c717ef5e --- /dev/null +++ b/src/syseng/11boot.23 @@ -0,0 +1,371 @@ +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 + \ No newline at end of file