1
0
mirror of https://github.com/PDP-10/its.git synced 2026-05-24 06:10:34 +00:00
Files
PDP-10.its/src/kldcp/11stnk.53
2018-06-13 21:01:39 +02:00

1166 lines
22 KiB
Plaintext
Executable File
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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