From f7eea7a92443743eab9816361080242defbf81ca Mon Sep 17 00:00:00 2001 From: Lars Brinkhoff Date: Tue, 12 Jun 2018 21:46:42 +0200 Subject: [PATCH] 11STNK - PDP-11 linker. --- build/misc.tcl | 4 + doc/programs.md | 1 + src/kldcp/11stnk.53 | 1166 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 1171 insertions(+) create mode 100755 src/kldcp/11stnk.53 diff --git a/build/misc.tcl b/build/misc.tcl index 0f4b6e1a..9927fd84 100644 --- a/build/misc.tcl +++ b/build/misc.tcl @@ -902,3 +902,7 @@ expect ":KILL" # KL10 front end dumper respond "*" ":midas dsk0:.;@ fedump_kldcp; fedump\r" expect ":KILL" + +# PDP-11 linker. +respond "*" ":midas sys1;ts 11stnk_kldcp;11stnk\r" +expect ":KILL" diff --git a/doc/programs.md b/doc/programs.md index f4dcd041..5e6a09cc 100644 --- a/doc/programs.md +++ b/doc/programs.md @@ -1,4 +1,5 @@ - 11SIM, PDP-11 emulator. +- 11STNK, PDP-11 linker. - 20XCVT, convert TOPS-20 CSAVE file to PDUMP. - @, cross reference generation tool. - ACNVRT/MCNVRT/PCNVRT/UCNVRT, asciizer and binarator. diff --git a/src/kldcp/11stnk.53 b/src/kldcp/11stnk.53 new file mode 100755 index 00000000..655ceaa9 --- /dev/null +++ b/src/kldcp/11stnk.53 @@ -0,0 +1,1166 @@ +TITLE 11STNK - STINKING ODOR OF PDP11'S + ;ALSO TIMESHARING BOOT11 COMMAND + +IFNDEF 10XP,IFE .OSMIDAS-SIXBIT/TENEX/,[ 10XP==1 ] .ELSE 10XP==0 +IFNDEF ITSP, ITSP==1-10XP +DEFINE 10X +IFN 10XP!TERMIN +DEFINE ITS +IFN ITSP!TERMIN + +10X, .DECSAV + +IF1 EXPUNGE MAP ;FUCK YOU CRISPIN +APR==0 + +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 + + +ITS, DLB==60 +ITS, DLC==64 +ITS, PAG==10 +ITS, SWPUA=701540,, + +11CORL==28.*1024. ;# WORDS OF PDP11 CORE + +ITS,[ +INCH==1 +OUCH==2 +TYIC==3 +TYOC==4 +ERRCH==5 + +OPENI: SETZ + SIXBIT/OPEN/ + [.UII,,INCH] + 0(Q) + 2(Q) + 3(Q) + SETZ 1(Q) + +OPENO: SETZ + SIXBIT/OPEN/ + [.BIO,,OUCH] + 0(Q) + 2(Q) + 3(Q) + SETZ 1(Q) + +;FILE NAME BLOCKS. CONTAIN INITIAL DEFAULTS +;DEV SNM FN1 FN2 + +RUGFN: SIXBIT/DSK/ + SIXBIT/./ + SIXBIT/KLRUG/ + SIXBIT/BIN/ + +DDTFN: SIXBIT/DSK/ + SIXBIT/./ + SIXBIT/11DDT/ + SIXBIT/16K/ + +PRGFN: SIXBIT/DSK/ + SIXBIT/./ + SIXBIT/IOELEV/ + SIXBIT/BIN/ + +DMPFN: SIXBIT/DSK/ + 0 + SIXBIT/FOO/ + SIXBIT/BIN/ +];ITS + +10X,[ +;BLOCKS FOR LONG FORM GTJFN + + INJFN' ;JFN HERE +RUGFN: 160000,,0 ;OLD FILE, CONFIRM + 100,,101 ;USE TERMINAL + 0 ;DEFAULT DEVICE + -1,,[ASCIZ/PDP11/] ;DEFAULT DIRECTORY + -1,,[ASCIZ/KLRUG/] ;DEFAULT FILENAME + -1,,[ASCIZ/BIN/] ;DEFAULT FILETYPE (PALX OUTPUT) + 0 ;PROTECTION + 0 ;ACCOUNT + + + INJFN' ;JFN HERE +DDTFN: 160000,,0 ;OLD FILE, CONFIRM + 100,,101 ;USE TERMINAL + 0 ;DEFAULT DEVICE + -1,,[ASCIZ/PDP11/] ;DEFAULT DIRECTORY + -1,,[ASCIZ/11DDT/] ;DEFAULT FILENAME + -1,,[ASCIZ/24K/] ;DEFAULT FILETYPE + 0 ;PROTECTION + 0 ;ACCOUNT + + INJFN' ;JFN HERE +PRGFN: 160000,,0 ;OLD FILE, CONFIRM + 100,,101 ;USE TERMINAL + 0 ;DEFAULT DEVICE + 0 ;DEFAULT DIRECTORY + -1,,[ASCIZ/FOO/] ;DEFAULT FILENAME + -1,,[ASCIZ/BIN/] ;DEFAULT FILETYPE + 0 ;PROTECTION + 0 ;ACCOUNT + +;IS THIS GOING TO BE USED? + OUTJFN' ;JFN HERE +DMPFN: 660000,,0 ;NEW FILE, CONFIRM + 100,,101 ;USE TERMINAL + 0 ;DEFAULT DEVICE + 0 ;DEFAULT DIRECTORY + -1,,[ASCIZ/FOO/] ;DEFAULT FILENAME + -1,,[ASCIZ/SAV/] ;DEFAULT FILETYPE + 0 ;PROTECTION + 0 ;ACCOUNT +];10X + +LPDL==50 +PDL: -LPDL,,. + BLOCK LPDL + +;COMMAND TABLE + +;1ST WD - SIXBIT NAME OF COMMAND (FIRST LETTER MUST BE UNIQUE) +;2ND WD - (LH) 0 IF NO FILE NAME ELSE POINTER TO FILE NAME BLOCK +; - (RH) DISPATCH ADDRESS +;3RD WD - POINTS TO ASCIZ HELP STRING + +COMTAB: SIXBIT/RUG/ ? RUGFN,,RUGLD ? [ASCIZ/LOAD RUG/] + SIXBIT/DDT/ ? DDTFN,,DDTLD ? [ASCIZ/LOAD 11DDT/] + SIXBIT/LOAD/ ? PRGFN,,PRGLD ? [ASCIZ/LOAD A PROGRAM/] + SIXBIT/MAP/ ? 0,,MAP ? [ASCIZ/PRINT CORE MAP/] +ITS, SIXBIT/ADUMP/ ? DMPFN,,ADUMP ? [ASCIZ/DUMP IN PALX BIN FORMAT/] +ITS, SIXBIT/BDUMP/ ? DMPFN,,BDUMP ? [ASCIZ/DUMP IN KLDCP BIN FORMAT/] +ITS, SIXBIT/TDUMP/ ? DMPFN,,TDUMP ? [ASCIZ/DUMP AS DL10 BOOTSTRAP PROGRAM/] + SIXBIT/STUFF/ ? 0,,STUFF ? [ASCIZ/STUFF INTO PDP11/] + SIXBIT/HELP/ ? 0,,HELP ? [ASCIZ/ /] + SIXBIT/?/ ? 0,,HELP ? [ASCIZ/ /] +LCMTAB==.-COMTAB + +HELP: PUSHJ P,CRLF + MOVE A,[-LCMTAB/3,,COMTAB] +HELP1: MOVE TT,(A) + PUSHJ P,SIXOUT + MOVEI TT,[ASCIZ/ (FILENAME)/] + MOVE T,1(A) + TLNE T,-1 + PUSHJ P,ASCOUT + MOVEI TT,[ASCIZ/ - /] + PUSHJ P,ASCOUT + MOVE TT,2(A) + PUSHJ P,ASCOUT + PUSHJ P,CRLF + ADDI A,2 + AOBJN A,HELP1 + POPJ P, + +;SIXBIT OUTPUT FROM TT +SIXOUT: MOVEI T,0 + LSHC T,6 + ADDI T,40 +ITS, .IOT TYOC,T +10X,[ EXCH T,A + PBOUT + EXCH T,A +];10X + JUMPN TT,SIXOUT +CPOPJ: POPJ P, + +CRLF: MOVEI TT,[ASCIZ/ +/] +;ASCIZ OUTPUT FROM TT +ASCOUT: HRLI TT,440700 +ITS,[ +ASCOU1: ILDB T,TT + JUMPE T,CPOPJ + .IOT TYOC,T + JRST ASCOU1 +];ITS +10X,[ EXCH TT,A + PSOUT + EXCH TT,A + POPJ P, +];10X + +;OCTAL OUTPUT FROM T +OCTOUT: IDIVI T,8 + HRLM TT,(P) + SKIPE T + PUSHJ P,OCTOUT + HLRZ TT,(P) + ADDI TT,"0 +ITS, .IOT TYOC,TT +10X,[ EXCH TT,A + PBOUT + EXCH TT,A +];10X + POPJ P, + +;DECIMAL OUTPUT FROM T +DECOUT: IDIVI T,10. + HRLM TT,(P) + SKIPE T + PUSHJ P,DECOUT + HLRZ TT,(P) + ADDI TT,"0 +ITS, .IOT TYOC,TT +10X,[ EXCH TT,A + PBOUT + EXCH TT,A +];10X + POPJ P, + +;READ SYLLABLE FROM TTY +;RETURN SIXBIT IN TT, DELIMITER IN A + +GETSYL: MOVEI TT,0 + MOVE T,[440600,,TT] +GETSY1: +ITS, .IOT TYIC,A +10X, PBIN + CAIE A,^G + CAIN A,177 + JRST CMDER ;RUBOUT - ERR BACK TO COMMAND LEVEL + CAIE A,": + CAIN A,"; + POPJ P, + CAIG A,40 + POPJ P, + CAIGE A,140 + SUBI A,40 + TLNE T,770000 + IDPB A,T + JRST GETSY1 + +;FILE NAME READER +;CALL WITH Q -> FILE NAME BLOCK. +;SUPPORTS ALTMODE, ^X, ^Y + +FNR: MOVEI TT,[ASCIZ/ (FILENAME) /] + PUSHJ P,ASCOUT +ITS,[ + SKIPN 1(Q) + .SUSET [.RSNAM,,A] + SKIPN 1(Q) + MOVEM A,1(Q) +FNR0: SETZB B,C ;B,C,D,E = DEV,SNM,FN1,FN2 + SETZB D,E +FNR1: PUSHJ P,GETSYL + JUMPE TT,FNR2 + CAIN A,": + JRST [ MOVEM TT,B ? JRST FNR2 ] + CAIN A,"; + JRST [ MOVEM TT,C ? JRST FNR2 ] +FNR1A: SKIPE D + SKIPA E,TT + MOVE D,TT +FNR2: CAIL A,40 + JRST FNR1 + CAIE A,33 + JRST FNR3 + PUSHJ P,FNRST ;ALTMODE, SHOW CURRENT NAME + PUSHJ P,CRLF + PUSHJ P,FNRALT + JRST FNR0 + +FNRALT: IRPC ZZ,,[:;X ] + MOVE TT,.IRPCNT(Q) + PUSHJ P,SIXOUT + IFSE [ZZ]X,.IOT TYOC,[40] + .ELSE [ MOVEI TT,[ASCIZ/ZZ /] ? PUSHJ P,ASCOUT ] + TERMIN + +FNR3: CAIE A,^X + JRST FNR4 + MOVE TT,2(Q) + MOVEI A,40 + JRST FNR1A + +FNR4: CAIE A,^Y + JRST FNRST + MOVE TT,3(Q) + MOVEI A,40 + JRST FNR1A + +FNRST: REPEAT 4,[ + SKIPE B+.RPCNT + MOVEM B+.RPCNT,.RPCNT(Q) +] POPJ P, +];ITS +10X,[ MOVEI A,(Q) + MOVEI B,0 + GTJFN + JRST FNR1 + HRRZS A ;JFN + MOVEM A,@-1(Q) + POPJ P, + +FNR1: MOVE B,A + HRLI B,.FHSLF + MOVEI A,101 + MOVEI C,0 + ERSTR + JFCL + JFCL + JRST FNR + +;OPENF JFN IN A FOR 8-BIT INPUT +;ON ITS PALX MAKES ONE BYTE PER WORD BIN FILES, +;BUT ON TENEX IT MAKES FOUR BYTES PER WORD. RANDOM! +OPENI: MOVE B,[100000,,600000] ;36-BIT, INPUT, HALTF ON I/O ERROR + OPENF + CAIA + AOS (P) + POPJ P, + +;OPENF JFN IN A FOR 36-BIT OUTPUT +OPENO: MOVE B,[440000,,500000] ;36-BIT, INPUT, HALTF ON I/O ERROR + OPENF + CAIA + AOS (P) + POPJ P, + +;CLOSE & RELEASE JFN IN INJFN +CLOSEI: HRRZ A,INJFN + CLOSF + JRST FSERR ;? + POPJ P, + +;.IOT INCH,A +INCHA: PUSH P,B + HRRZ A,INJFN + BIN + MOVE A,B + POP P,B + POPJ P, + +.VALUE==HALTF +];10X + +ITS,[ +INCHA: .IOT INCH,A + POPJ P, +];ITS + +GO: MOVE P,PDL +ITS,[ .OPEN TYIC,[.UAI,,'TTY] + .VALUE + .OPEN TYOC,[.UAO,,'TTY] + .VALUE +];ITS + MOVE TT,[.FNAM1] + PUSHJ P,SIXOUT +ITS, .IOT TYOC,[".] +10X, MOVEI A,". +10X, PBOUT + MOVEI T,.FVERS + PUSHJ P,DECOUT + PUSHJ P,CRLF + MOVSI A,-1 ;LH -1 IF LOC NOT STORED INTO + MOVEM A,11CORE + MOVE A,[11CORE,,11CORE+1] + BLT A,11CORE+11CORL-1 +ITS,[ .SUSET [.RXJNAME,,A] ;See if this is BOOT11 + CAME A,[SIXBIT/BOOT11/] + JRST CMD ;No, take 11STNK commands + MOVEI Q,DDTFN ;Yes, load .;11DDT 16K + PUSHJ P,DDTLD + MOVEI Q,PRGFN ;and .;IOELEV BIN + PUSHJ P,PRGLD + MOVEI TT,[ASCIZ/Stuff/] + PUSHJ P,ASCOUT + PUSHJ P,STUFF ;ask user then stuff it + .LOGOUT 1, ;go away if user types N +];ITS + +CMD: MOVE P,PDL +ITS, .IOT TYOC,["*] +ITS, .IOT TYIC,A +10X, MOVEI A,"* +10X, PBOUT +10X, PBIN + CAIGE A,40 + JRST CMDER + CAIGE A,140 + SUBI A,40 + ANDI A,77 + MOVE B,[-LCMTAB/3,,COMTAB] +CMD1: LDB T,[360600,,(B)] + CAMN T,A + JRST CMD2 + ADDI B,2 + AOBJN B,CMD1 +CMDER: MOVEI TT,[ASCIZ/??? +/] + PUSHJ P,ASCOUT + JRST CMD + +CMD2: MOVE TT,(B) ;COMPLETE THE COMMAND NAME + LSH TT,6 + PUSHJ P,SIXOUT + HLRZ Q,1(B) ;GET FILE NAME ARG IF NECC + HRRZ H,1(B) + JUMPE Q,CMD3 + PUSHJ P,FNR +CMD3: PUSHJ P,(H) + JRST CMD + +ITS,[ +FSERR: .OPEN ERRCH,[.UAI,,'ERR ? 1 ? 0] + .VALUE +FSERR1: .IOT ERRCH,A + JUMPL A,FSERR2 + CAIGE A,40 + JRST FSERR2 + .IOT TYOC,A + JRST FSERR1 + +FSERR2: MOVEI TT,[ASCIZ/ - /] + PUSHJ P,ASCOUT + PUSHJ P,FNRALT + PUSHJ P,CRLF + JRST CMD +];ITS +10X,[ +FSERR: MOVEI A,101 + MOVE B,[.FHSLF,,-1] + MOVEI C,0 + ERSTR + JFCL + JFCL + PUSHJ P,CRLF + JRST CMD +];10X + +DDTLD: SETZM RUGFLG +ITS, .CALL OPENI ;LOAD 11DDT +10X, PUSHJ P,OPENI + JRST FSERR + PUSHJ P,ALOAD + MOVEM W,RUGSA + LSH W,-1 + MOVEI A,11CORE-2(W) ;-> WORD IN WHICH TO STORE START ADDRESS + MOVEM A,SASTOR + MOVEI A,11CORE-1(W) ;-> WORD TO CONTAIN LOWEST -11 ADDR OF SYMBOL TABLE + MOVEM A,O.SYME + MOVE A,(A) ;SET UP CURRENT CONTENTS + LSH A,-1 + MOVEM A,RUGSYM + MOVEI A,-2(W) ;-11 ADDR/2 OF HIGHEST SYMBOL TABLE LOC + JRST RUGLD1 ;FROM HERE ON WORKS LIKE RUG + + +RUGLD: SETOM RUGFLG +ITS, .CALL OPENI ;LOAD RUG +10X, PUSHJ P,OPENI + JRST FSERR + 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 + SETZM SASTOR ;RUG DOESN'T KNOW ABOUT PROG START ADDR + 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 +RUGLD1: 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 + MOVE A,@O.SYME + MOVEM A,SYMLO ;INITIAL LOW SYMBOL ADDR (FOR MAP) +ITS, .CLOSE INCH, +10X, PUSHJ P,CLOSEI + MOVE A,PRGHI + MOVEM A,RUGHI + SETZM PRGHI + POPJ P, + + +PRGLD: +ITS, .CALL OPENI ;LOAD IOELEVEN +10X, PUSHJ P,OPENI + JRST FSERR + PUSHJ P,ALOAD + MOVEM W,SADR ;STORE START ADDR INTO 10 + MOVEM W,@SASTOR ;STORE START ADDR INTO 11 + PUSHJ P,SLOAD ;LOAD SYMBOLS INTO CORE IMAGE FOR RUG +ITS, .CLOSE INCH, +10X, PUSHJ P,CLOSEI + POPJ P, + +;CORE LOADER + +ALOAD: PUSHJ P,INCHA ;SEARCH FOR START OF BLOCK + JUMPE A,ALOAD ;SKIPPING "BLANK TAPE" + CAIE A,1 + .VALUE ;UNKNOWN BLOCK TYPE + PUSHJ P,INCHA ;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: PUSHJ P,INCHA ;BYTE TO BE LOADED + TDNE A,[-400] + .VALUE + CAIL W,11CORL*2 + .VALUE + CAMLE W,PRGHI + MOVEM W,PRGHI + MOVEI J,2*11CORE(W) ;FIGURE OUT WHERE IT GOES + ROT J,-1 + SKIPL J + TLOA J,001000 + HRLI J,101000 + DPB A,J + HRRZS @J ;MARK THIS WORD AS STORED INTO + ADDI W,1 + SOJG Q,LD1 + PUSHJ P,INCHA ;IGNORE CHECKSUM + JRST ALOAD + +JBLK: PUSHJ P,INCHA ;GOBBLE CHECKSUM + JUMPE Q,CPOPJ ;RETURN FROM ALOAD WITH START ADDR IN W + .VALUE ;BLOCK LENGTH < 6 ? + +ITS,[ +RWORD: .IOT INCH,W ;FORM TWO BYTES INTO A WORD + TDNE W,[-400] + .VALUE + .IOT INCH,A + TDNE A,[-400] + .VALUE + LSH A,8 + IOR W,A + POPJ P, +];ITS + +10X,[ +RWORD: PUSH P,B + HRRZ A,INJFN + BIN + MOVE W,B ;LOW BYTE + TDNE W,[-400] + .VALUE + BIN + MOVE A,B ;HIGH BYTE + TDNE A,[-400] + .VALUE + LSH A,8 + IOR W,A + POP P,B + POPJ P, +];10X + +;SYMBOL LOADER + +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: PUSHJ P,INCHA ;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: PUSHJ P,INCHA + JUMPE A,SLOADE + AOJE A,SLOADE + SOS A + PUSHJ P,RAD50 ;DEPOSIT 2 -11 WORDS OF RADIX 50 FOR THIS SIXBIT + PUSHJ P,INCHA ;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 + MOVEM B,SYMLO + 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 +RUGFLG: 0 ;-1 RUG, 0 11DDT +SASTOR: 0 ;-> WORD IN -11 CORE IMAGE WHERE START ADDRESS IS STORED +PRGHI: 0 ;HIGHEST LOC LOADED +SYMLO: 0 ;LOWEST LOC LOADED WITH SYMBOLS + .SEE RUGSA +RUGHI: 0 ;HIGHEST LOC LOADED WITH RUG/DDT + .SEE SADR + +MAP: PUSHJ P,CRLF + IRP WD,,[PRGHI,SYMLO,RUGSA,RUGHI,SADR]NM,,[HIGHEST PROGRAM LOC,LOWEST SYMBOL LOC,START ADDRESS OF DEBUGGER,HIGHEST DEBUGGER LOC,PROGRAM START ADDRESS] + MOVEI TT,[ASCIZ/NM=/] + PUSHJ P,ASCOUT + MOVE T,WD + PUSHJ P,OCTOUT + PUSHJ P,CRLF + TERMIN + POPJ P, + +ITS,[ +;DUMP OUT AS PDP11 ABSOLUTE BINARY +;ADUMP DUMPS ONE BYTE PER WORD, LIKE PALX +;BDUMP DUMPS FOUR BYTES PER WORD, ARRANGED IN A WAY TO CORRESPOND +;TO THE RH11. THIS FOR KLDCP '.BIN' FILES. +;I IS BYTE# FOR BDUMP, J IS BUFFER, Q IS CHECKSUM, W IS -11 ADDR + +BDMPNT: 221000,,J + 321000,,J + 001000,,J + 101000,,J + +ADMPNT: 001000,,J + +PUTB: 0 ;APUTB OR BPUTB + +APUTB: DPB A,ADMPNT + ADD Q,A +APUTW: HRROI TT,J + .IOT OUCH,TT +APUTW1: MOVSI I,-4 + MOVEI J,0 + POPJ P, + +BPUTB: DPB A,BDMPNT(I) + ADD Q,A + AOBJP I,APUTW + POPJ P, + +ADUMP: SKIPA TT,[APUTB] +BDUMP: MOVEI TT,BPUTB + MOVEM TT,PUTB + .CALL OPENO + JRST FSERR + PUSHJ P,APUTW1 + MOVSI W,-11CORL +ADUMP1: SKIPGE 11CORE(W) ;SEARCH FOR WORD THAT'S BEEN LOADED + AOBJN W,ADUMP1 + JUMPGE W,DUMPJB ;ALL CORE DUMPED, DO JUMP BLOCK + MOVEI H,(W) ;H := PDP11 ADDR OF FIRST WORD + LSH H,1 + HRLI W,-30 ;MAX BLOCK LENGTH; SCAN FOR WORD NOT LOADED +ADUMP2: SKIPL 11CORE(W) + AOBJN W,ADUMP2 + JUMPGE W,ADUMP4 ;BLOCK MAX SIZE + SKIPL 11CORE+1(W) + AOBJN W,ADUMP2 ;NOT TWO ZEROES IN A ROW +ADUMP4: MOVEI E,(W) ;NEXT LOCATION TO LOOK AT IS SAVED IN E + MOVEI Q,0 ;INIT CKSM + MOVEI A,1 ;PUT BLOCK HEADER + PUSHJ P,@PUTB + MOVEI A,0 + PUSHJ P,@PUTB + MOVE A,E + LSH A,1 + SUB A,H + MOVE D,A + ADDI A,6 + PUSHJ P,DWORD ;BYTE COUNT + MOVE A,H + PUSHJ P,DWORD ;LOAD ADDRESS + MOVE W,H + LSH W,-1 + LSH D,-1 + MOVNS D + HRL W,D ;NOW W IS AOBJN PTR TO WORDS TO DUMP +ADUMP5: MOVE A,11CORE(W) + PUSHJ P,DWORD + AOBJN W,ADUMP5 + MOVN A,Q ;PUNCH CHECKSUM + PUSHJ P,@PUTB + PUSHJ P,FEED + MOVE W,E ;SET UP AOBJN PTR TO CORE YET TO BE DUMPED + SUBI E,11CORL + HRL W,E + JRST ADUMP1 + +DUMPJB: MOVEI Q,0 + MOVEI A,1 ;JUMP BLOCK + PUSHJ P,@PUTB + MOVEI A,0 + PUSHJ P,@PUTB + MOVEI A,6 + PUSHJ P,@PUTB + MOVEI A,0 + PUSHJ P,@PUTB + MOVE A,RUGSA + PUSHJ P,DWORD + MOVN A,Q + PUSHJ P,@PUTB + PUSHJ P,FEED + .CLOSE OUCH, + .LOGOUT 1, + +FEED: MOVEI A,0 ;PUNCH 8 NULL FRAMES + PUSHJ P,.+1 + PUSHJ P,.+1 + PUSHJ P,.+1 + JRST @PUTB + +DWORD: LDB B,[101000,,A] + PUSHJ P,@PUTB + MOVE A,B + JRST @PUTB + +;DUMP OUT AS A DL10 BOOTSTRAP PROGRAM +;THIS IS A STANDALONE PDP10 PROGRAM WHICH LOADS THE -11 ON DL10 PORT#0 + +TDUMP: .CALL OPENO + JRST FSERR + MOVSI A,-11CORL ;CHANGE -1,,0 TO 0 + HRRZS 11CORE(A) ;SINCE WILL LOAD ALL -11 CORE + AOBJN A,.-1 + 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, + .LOGOUT 1, +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 + +;HERE IS THE VERSION WHICH STUFFS THE PDP11 UNDER TIMESHARING +DLB==60 ? ..D060==0 +DLC==64 ? ..D064==0 +DL10PG==300 + +STUFF: MOVEI TT,[ASCIZ\ core image into PDP11?\] + PUSHJ P,ASCOUT + .IOT TYIC,A + PUSHJ P,CRLF + CAIE A,"Y + CAIN A,"y + CAIA + POPJ P, + MOVSI A,(SETZ) + .IOTLSR A, +;Make ITS not touch the DL10 + MOVE A,[SQUOZE 0,DL10F] + .EVAL A, + .LOSE + HRLI A,[0] + .SETLOC A, + MOVSS A + HRRI A,B + .GETLOC A, + JUMPN B,.-1 +;Stop the pdp11 + DATAO DLC,[40] ;STOP PDP11 + DATAI DLC,A + TRNE A,20 ;AWAIT PDP11 STOPPED + JRST .-2 +;Obtain access to the DL10 + .CALL [ SETZ ? 'DL10MP ? MOVEI DL10PG ? SETZM A ] ;A GETS AOBJN PTR TO CONTROL AREA + .LOSE %LSSYS + HRRZM A,DL10LC' + HLRO B,A + MOVNS B + MOVEM B,DL10SZ' + MOVE C,(A) ;COPY FIRST WORD + MOVEM C,@DL10LC + MOVEM C,DLINIT + MOVE C,[SQUOZE 0,NDLTYS] ;INITIALIZE VERSION, DON'T TRUST COPY IN SYSTEM + .EVAL C, + .LOSE + MOVE D,[SQUOZE 0,NFDLTY] + .EVAL D, + .LOSE + LSH C,8 + ADD C,D + MOVEM C,DL10VR + MOVSI A,DL10AR ;SET UP BOOT PROGRAM THERE + HRR A,DL10LC + MOVE B,DL10LC + BLT A,BOOTSZ-1(B) +;Here's what stuffs the 11 +; CONO DLC,400000 ;RESET DL10 +; MOVEI A,1 +; .SLEEP A, +; CONO DLB,500 + CONO DLC,100020 ;PORT ENABLE, DISABLE PDP10 INTERRUPT + MOVSI A,2 + SOJG A,. ;DON'T ASK ME + DATAO DLC,[20] ;START PDP11 AT DL10 BOOT AREA + DATAI DLC,A + TRNN A,20 + JRST .-2 +;PDP11 IS NOW EXECUTING THE BOOT PROGRAM + MOVE J,DL10LC + SUBI J,DL10AR ;RELOCATION FOR REFERENCES TO FLAG, DAT, SADR +IFLE 11CORL-40000,MOVSI Q,-11CORL ;LOAD ONLY 16K +.ELSE MOVSI Q,-40000 +STUFLP: HRRZ A,11CORE(Q) ;TELL 11 BOOTSTRAP PROGRAM TO STORE ONE WORD + SKIPE FLAG(J) + JRST .-1 + MOVEM A,DAT(J) + AOS FLAG(J) + AOBJN Q,STUFLP + SKIPE FLAG(J) + JRST .-1 + SKIPA ;DON'T WANT TO LOSE PROCESSOR IN NEXT CODE + SKIPA ;OR PDP11 WILL END UP IN DDT + .HANG + MOVEI A,000407 ;BR FROM 100004 TO 100024 + MOVEM A,DL10AR+2(J) + MOVEI A,25. ;ALLOW TIME FOR -11 TO GET STARTED + SOJG A,. +;NOW, WHILE THE 11 IS DOING A RESET, RESTORE THE DL10 CONTROL AREA + MOVSI A,DLINIT + HRR A,DL10LC + MOVEI B,DLXEND-DLINIT + ADDI B,-1(A) + BLT A,(B) +;NOW TURN ON DL10 TO ITS + MOVE A,[SQUOZE 0,DL10F] + .EVAL A, + .LOSE + HRLI A,[-1] + .SETLOC A, + CONO DLC,3 ;ENABLE PDP10 INTERRUPT + .LOGOUT 1, + +;This kludge is worthy of Charles Garman. +;But it was perpetrated by DAM. +;This is a copy of what to initialize the DL10 area to when we are +;done with it. The program used to save and restore it, but this +;proved to be a loss, e.g. the chaos net double-buffers got out of +;phase between the two machines. The constants below must agree with those +;in ITS and in IOELEV. +DLINIT: JSR .-. +DL10VR: 0 ;VERSION, GOTTEN OUT OF SYSTEM + ;NDLTYS_8+NFDLTY ;"I/O VERSION NUMBER" +DL10UP: 0 ;INCREMENTED BY -11 EVERY 1/60 SECOND. + ;SETOM'ED BY 10 EVERY 1/2 SECOND. DETECTS UP/DOWNNESS. + +DL10SO: 0 ;LINE # TO SET OUTPUT DONE FOR, SET BY -10, CLEARED BY -11. + +DL10IL: 0 ;LINE # WITH INPUT AVAILABLE. CLEARED BY -10 AFTER CHAR READ. +DL10IC: 0 ;CHARACTER RECEIVED FROM THAT LINE. + +DL10OD: 0 ;LINE # WITH OUTPUT DONE. CLEARED BY -10 WHEN PROCESSED. +DL10BS: 0 ;BUFFER SIZE FOR THAT LINE. + +DL10BP: 0 ;WIERD DL10 BYTE POINTER TO TTY OUTPUT BUFFER. +DL10CC: 0 ;NUMBER OF CHARACTERS BEING OUTPUT TO TTY. +DL10LN: 0 ;LINE # OUTPUT BEING SENT TO. CLEARED BY -11 WHEN GOBBLED. + +DL10CL: 0 ;DIALUP LINE CONNECT OR DISCONNECT INFO. SET BY 11, 0'D BY 10. + ;0000NN => LINE # NN DISCONNECTED. + ;01RTNN => LINE # NN CONNECTED, %TTISP=R, %TTOSP=T. + +DL10PL: 0 ;LINE # TO SET PARAMETERS OF. CLEARED BY -11 WHEN PROCESSED. +DL10PR: 0 ;VALUE OF DH11 LPR REGISTER. +DL10PS: 0 ;NUMBER OF BYTES OF OUTPUT BUFFERING DESIRED. + +DL10XD: 0 ;1=EXAMINE -11 CORE, 2=DEPOSIT. CLEARED BY -11 WHEN DONE. +DL10XA: 0 ;EXAMINE/DEPOSIT ADDRESS +DL10XW: 0 ;EXAMINE/DEPOSIT WORD + +GLPTBP: 0 ;BYTE POINTER TO BUFFER FOR GOULD LPT +GLPTBC: 0 ;BYTE COUNT " " - IF NONZERO BUFFER IS ACTIVE BY PDP11. +GLPTER: 0 ;NONZERO => PDP11 CLAIMS PRINTER IS BROKEN. +GLPGRF: 0 ;NONZERO => GRAPHICS MODE (SET BY 10). + +;CHAOS NET SHARED VARIABLES +DLCINI: 1 ;THE COMMENTS ARE IN THE CHAOS FILE +DLCSP1: 0 +DLCSP2: 0 +DLCSS1: 0 +DLCSS2: 0 +DLCRP1: 0 +DLCRP2: 0 +DLCRS1: 2 ;IF NET WAS QUIESCENT, THIS WILL BE RIGHT AND +DLCRS2: 2 ;WILL PREVENT BUFFERS FROM GETTING LOST + +;^ ADD MORE HERE + +DLXEND:: ;END OF ASSIGNED DL10 AREA + +VARIABLES +CONSTANTS + +;THE PROGRAM THAT GOES ON THE MAGDMP TAPE + +IFG .-4000,.ERR BLOAT +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 + +IFLE 11CORL-40000,MOVSI Q,-11CORL ;LOAD ONLY 16K +.ELSE MOVSI Q,-40000 +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 + +CONSTANTS +VARIABLES + +LOC 5000 +DL10AR: JRST 4,. + 005001 ;100002/ CLR %1 + 005727 ;100004/ TST # +FLAG: 0 ;100006/ 0 => 11 READY FOR WORD, NON-0 => WORD GIVEN + 001775 ;100010/ BEQ 100004 + 012721 ;100012/ MOV #,(1)+ +DAT: 0 ;100014/ VALUE TO BE STORED + 005037 ;100016/ CLR @#FLAG + 100006 ;100020/ + 000770 ;100022/ BR 100004 + 000137 ;100024/ JMP @# +SADR: 1 ;100026/ THE START ADDRESS +BOOTSZ==.-DL10AR +];ITS + +10X,[ +;;; This is the command that stuffs a core image into the +;;; pdp-11, by simply transmitting the whole damn thing +;;; down the DR-11. + +;Magic instructions +DR11R=744000,, ;Reset TYMNET service microcode, and send 6 + ; 6 low bits of effective address to control reg: + ; 30-31 CSR0, CSR1 to 11 (input ready, output done) + ; 32-33 not connected + ; 34-35 interrupt enables (input, output) + +DR11O=745000,, ;Effective address to pdp-11 + +DR11I=746000,, ;C(E) gets input from pdp-11 in low 16 bits + ; and high bits are: + ; 0,1 tape flags + ; 2 input ready + ; 3 output done + ; 4,5 edge versions of above (cause interrupt) + ; 6,7 60 Hz clock flag and clock interrupt + +STUFF: MOVEI TT,[ASCIZ\ core image into PDP11?\] + PUSHJ P,ASCOUT + PBIN + PUSHJ P,CRLF + CAIE A,"Y + CAIN A,"y + CAIA + POPJ P, + USRIO + JRST [ MOVEI TT,[ASCIZ\Cannot get into user I/O mode +\] + PUSHJ P,ASCOUT + JRST CMD ] + DR11R 0 ;Reset DR11, turn off Tymnet microcode + MOVSI Q,-11CORL +STUFF1: HRRZ A,11CORE(Q) + PUSHJ P,DRSEND + AOBJN Q,STUFF1 + JRST 2,@[CPOPJ] ;Turn off loser iot mode + +;Send word in A to DR-11 +DRSEND: DR11I B ;Bit 5 non-zero means ready to accept output + TLNN B,010000 + JRST DRSEND + DR11O (A) + POPJ P, +];10X + +10X, SADR: 1 + +CONSTANTS +VARIABLES + +RUGSA: 0 ;START ADDR OF RUG/DDT (ALSO ASSUMED TO BE LOWEST LOC) + +LOC 6000 +11CORE: BLOCK 11CORL + +BOOTEN: -1 ;MIDAS CORING BUG + +END GO + \ No newline at end of file