mirror of
https://github.com/PDP-10/its.git
synced 2026-01-16 08:24:38 +00:00
696 lines
15 KiB
Plaintext
Executable File
696 lines
15 KiB
Plaintext
Executable File
|
||
IF1, TITLE STUFF A PDP-11
|
||
IF2,[PRINTX /UP YOUR /]
|
||
DEFINE PACK A,B,C,D,E
|
||
A_29.+B_22.+C_15.+D_8.+E_1
|
||
TERMIN
|
||
|
||
FLAGS=0
|
||
PNTR=1
|
||
A=2
|
||
B=3
|
||
C=4
|
||
D=5
|
||
E=6
|
||
F=7
|
||
S=10
|
||
SPNTR=10
|
||
BCOUNT=11
|
||
CKSM=12
|
||
CMPTR=13
|
||
11WORD=14
|
||
ST11AD=15
|
||
CHK=16
|
||
P=17
|
||
|
||
TF1==1
|
||
;PDP11 INSTRUCTIONS
|
||
BR.==777 ;BR .
|
||
BR.M2==776 ;BR .-2
|
||
WAIT==1
|
||
RESET==5
|
||
JMP==137 ;JMP @#...
|
||
CLR==5037 ;CLR @(PC)+
|
||
CLRPC==5007 ;CLR PC
|
||
|
||
LKS==177546
|
||
LKBRKV==100
|
||
TPS==177564
|
||
TPB==177566
|
||
TPBRKV==64
|
||
;5/29/73 PROGRAMMING THE PDP-10 TO PDP-11 INTERFACE
|
||
|
||
;THE INTERFACE LETS THE PDP-10 PROGRAMMER DIRECTLY ACCESS THE MEMORIES
|
||
;OF UP TO EIGHT PDP-11'S. PDP-10 PAGES ARE MAPPED INTO SEGMENTS OF
|
||
;VARIABLE SIZE IN THE PDP-11'S MEMORY. THE PDP-10 PAGE MAP IS ALSO
|
||
;DIRECTLY ADDRESSABLE IN MEMORY (IT CURRENTLY LIVES IN LOCATIONS
|
||
;776000-776777)**. THERE IS ONE ENTRY IN THE MAP FOR EACH PDP-10 PAGE.
|
||
;** SEE ALSO BELOW
|
||
|
||
;PAGE TABLE ENTRY:
|
||
; 4.9 VALID
|
||
; 4.8 WRITE ENABLE
|
||
; 4.3-4.7 (5 BITS) NOT USED (0)
|
||
; 3.9-4.2 (3 BITS) PDP-11 NUMBER
|
||
; 2.2-3.8 (16 BITS) RELOCATION
|
||
; ORIGIN OF SEGMENT OF IN PDP-11 ADDRESS SPACE
|
||
; PDP-11 ADDRESS=4*RELOCATION
|
||
; 1.1-2.1 (10 BITS) PROTECTION (PDP-11 PROTECTION=4*PROTECTION
|
||
; IF PROTECTION=0 THEN ONLY ONE 16 BIT WORD IS ACCESSIBLE)
|
||
|
||
;WRITE REFERENCE FORMAT
|
||
; 3.3-4.9 (16 BITS) WORD 0, LOW ORDER WORD
|
||
; 1.5-3.2 (16 BITS) WORD 1, HIGH ORDER WORD
|
||
; 1.4 DON'T WRITE WORD 0
|
||
; 1.3 DON'T WRITE WORD 1
|
||
; 1.1-1.2 (2 BITS) NOT USED
|
||
|
||
;READ REFERENCE FORMAT
|
||
; 3.3-4.9 (16 BITS) WORD 0, LOW ORDER WORD
|
||
; 1.5-3.2 (16 BITS) WORD 1, HIGH ORDER WORD
|
||
; 1.1-1.4 (4 BITS) 0
|
||
|
||
;NOTE -- SPLIT CYCLES WILL DO THE RIGHT THING; HENCE, ILDB AND IDPB WORK.
|
||
|
||
;CAUTION -- WHEN USING BYTE INSTRUCTIONS, A 16 BIT BYTE SIZE IS
|
||
;RECCOMMENDED. SUCCESSIVE INCREMENTS OF BYTE POINTERS WITH AN 8 BIT BYTE
|
||
;SIZE DO NOT ADDRESS CONSECUTIVE BYTES IN THE PDP-11!
|
||
|
||
;ITS SYSTEM CALL TO PUT 11 MAP ENTRY IN YOUR 10 MAP
|
||
|
||
; .CALL [SETZ
|
||
; SIXBIT /T11MP/
|
||
; 10PGNO ;PTR TO 10 PG NO
|
||
; SETZ PGENT] ;PTR TO ENTRY (FORMAT ABOVE)
|
||
;10PGNO: 3
|
||
;PGENT: 3_34.+2000_10.+1777
|
||
; FOR ABOVE 10 ADDRESSES 6000-7777 ARE MAPPED INTO
|
||
; 11 ADDRESSES 10000-17776. BOTH READ AND WRITE ARE ENABLED.
|
||
|
||
RCH: MOVE PNTR,[10700,,BUFF-1] ;INITL BYTE PNTR TO BUFF
|
||
MOVEM PNTR,CMPTR
|
||
GCHR: PUSHJ P,TYI ;GET CHAR
|
||
CAIN A,177 ;RUBOUT?
|
||
JRST RUBOT
|
||
IDPB A,PNTR
|
||
CAIE A,15 ;CR?
|
||
JRST GCHR
|
||
MOVEI A,0 ;IT WAS CR
|
||
IDPB A,PNTR ;MARK END OF STRNG
|
||
CPOPJ: POPJ P,
|
||
|
||
RUBOT: CAMN PNTR,[10700,,BUFF-1] ;RUBOUT AT BEG OF BUFFER?
|
||
JRST BRUB
|
||
LDB A,PNTR ;GET LAST CHAR TYPED
|
||
PUSHJ P,TYO ;ECHO IT
|
||
ADD PNTR,[70000,,] ;DECREMENT POINTER
|
||
JUMPGE PNTR,GCHR ;JUMP IF VALID
|
||
SUB PNTR,[430000,,1] ;WAS 440700,,SOMETHING, BACK IT UP
|
||
JRST GCHR
|
||
|
||
BRUB: PUSHJ P,CRR ;TYPE CR LF
|
||
JRST GCHR
|
||
TYI: .IOT TTI,A
|
||
CAIL A,"a
|
||
CAILE A,"z
|
||
CAIA
|
||
SUBI A,40
|
||
JUMPE A,TYI
|
||
CAIE A,15
|
||
POPJ P,
|
||
PUSHJ P,CRR ;ECHO CR
|
||
MOVEI A,15
|
||
POPJ P,
|
||
TYO: .IOT TTO,A
|
||
POPJ P,
|
||
|
||
SCRS: SKIPE B ;IF B NOT = 0, TYPE MESG IT POINTS TO
|
||
JRST TYPE
|
||
CRS: MOVEI A,"*
|
||
PUSHJ P,TYO
|
||
CRR: MOVEI A,15
|
||
PUSHJ P,TYO
|
||
MOVEI A,12
|
||
JRST TYO
|
||
TYPE: HRLI B,350700 ;TYPE ASCIZ STRING WHOSE ADDR IS IN B
|
||
LDB A,B
|
||
PUSHJ P,TYO
|
||
ILDB A,B
|
||
JUMPN A,.-2
|
||
POPJ P,
|
||
|
||
BUFF: BLOCK 10.
|
||
TYPENL: TROA FLAGS,TF1 ;SAME AS TYPEN EXCEPT W/ LEADING ZEROS
|
||
|
||
TYPEN: ;TYPE NUMBER IN B IN OCTAL W/O LEADING ZEROS
|
||
TRZ FLAGS,TF1 ;CLEAR TYPE ZERO FLAG
|
||
PUSH P,A
|
||
PUSH P,B
|
||
SETZM A
|
||
LSHC A,3 ;SHIFT 1ST CHAR FROM B TO A
|
||
ADDI B,7 ;PUT END MARKER IN B
|
||
TYPEN2: TRNN FLAGS,TF1 ;SEEN ANY NON-ZERO DIGITS YET?
|
||
JUMPE A,TYPEN1 ;NO, IS THIS ONE?
|
||
TYPEN3: ADDI A,60
|
||
TRO FLAGS,TF1
|
||
PUSHJ P,TYO
|
||
SETZM A
|
||
TYPEN1: LSHC A,3
|
||
JUMPN B,TYPEN2
|
||
SETZM A
|
||
TRNN FLAGS,TF1 ;TYPE AT LEAST 1 ZERO
|
||
JRST TYPEN3
|
||
POP P,B
|
||
POP P,A
|
||
POPJ P,
|
||
|
||
CRLF: PUSH P,A
|
||
MOVEI A,15
|
||
PUSHJ P,TYO
|
||
MOVEI A,12
|
||
PUSHJ P,TYO
|
||
POP P,A
|
||
POPJ P,
|
||
|
||
MAX11S=10
|
||
|
||
DESC: ;DESCRIBES PDP11'S CONNECTED TO 10/11 INTERFACE
|
||
;1ST DIGIT IS # 2K WORD PAGES OF 11 CORE
|
||
[ 6
|
||
ASCIZ \ TV 11/10 \
|
||
-1] ;HAS TTY AND LINE CLOCK.
|
||
[ 14
|
||
ASCIZ \ XGP 11/20 \
|
||
-1]
|
||
[ 4
|
||
ASCIZ \ LISP MACHINE \
|
||
1] ;CLOCK BUT NO TTY
|
||
[ 0
|
||
ASCIZ \ CHESS MACHINE \
|
||
0]
|
||
[ 16
|
||
ASCIZ \ LOGO 11/45 \
|
||
-1]
|
||
[ 16
|
||
ASCIZ \ MICRO AUTOMATION 11/45 \
|
||
-1]
|
||
[ 14
|
||
ASCIZ \ VISION 11/40 \
|
||
-1 ]
|
||
[ 4
|
||
ASCIZ \ CHAOS-11 \
|
||
-1 ]
|
||
|
||
11NTAB: ASCII /TV<54>/
|
||
ASCII /XGP<47>/
|
||
ASCII /LISP<53>/
|
||
ASCII /CHESS/
|
||
ASCII /LOGO<47>/
|
||
; ASCII /ROBOT/
|
||
-1
|
||
; ASCII /VISIO/
|
||
-1
|
||
ASCII /CHAOS/
|
||
11NTLN==.-11NTAB
|
||
|
||
11FTAB: [SIXBIT/./ ? SIXBIT/TV/ ? SIXBIT/BIN/]
|
||
[SIXBIT/SYSBIN/ ? SIXBIT/VXGP/ ? SIXBIT/BIN/]
|
||
[SIXBIT/CONS/ ? SIXBIT/CCONS/ ? SIXBIT/BIN/]
|
||
0
|
||
[SIXBIT/RUG/ ? SIXBIT/AR/ ? SIXBIT /BIN/]
|
||
0
|
||
0
|
||
[SIXBIT/./ ? SIXBIT/IOELEV/ ? SIXBIT/BIN/]
|
||
IFN .-11FTAB-11NTLN,.ERR
|
||
|
||
TTO==1
|
||
TTI==2
|
||
DSK==3
|
||
ERRC==4
|
||
|
||
|
||
START: MOVE P,[-100,,PLD]
|
||
.OPEN TTO,STTO
|
||
.LOSE 1000
|
||
.OPEN TTI,STTI
|
||
.LOSE 1000
|
||
.SUSET [.ROPTIO,,A]
|
||
TLNN A,OPTCMD
|
||
JRST BCMD
|
||
SETZM A
|
||
SETOM B
|
||
.BREAK 12,[5,,A] ;IF HAVE JCL, READ 1ST WORD OF IT INTO A.
|
||
JUMPE A,BCMD ;WAS THERE ANY JCL?
|
||
TRZ A,1 ;GODDAMN DDT LIKES TO SET LOW BIT
|
||
MOVE B,[440700,,A]
|
||
MOVEI D,5
|
||
UPCASE: ILDB C,B ;IF WE HAVE JCL, CONVERT IT TO UPPER CASE
|
||
CAIL C,140
|
||
SUBI C,40
|
||
DPB C,B
|
||
SOJG D,UPCASE
|
||
MOVSI B,-11NTLN ;IF WE HAVE JCL, COMPARE AGAINST ASCII/TV^M/, ETC.
|
||
CAME A,11NTAB(B)
|
||
AOBJN B,.-1
|
||
JUMPGE B,BADJCL ;NOT NAME OF AN 11 => LOSE.
|
||
SETOM JCLP
|
||
MOVE A,11FTAB(B) ;ELSE B HAS NUMBER OF 11. GET THE FILENAMES
|
||
JUMPE A,BAD11
|
||
MOVE F,(A) ;1ST WORD IS SNAME
|
||
MOVEM F,SNR
|
||
.SUSET [.SSNAM,,F]
|
||
HRLI A,1(A) ;THEN COME FN1 AND FN2
|
||
HRRI A,ADR+1 ;TO USE FOR THAT 11.
|
||
BLT A,ADR+2
|
||
.OPEN DSK,ADR
|
||
.LOSE 1000
|
||
MOVE A,DESC(B)
|
||
MOVE A,(A)
|
||
MOVEM A,NOPG
|
||
HRRZ F,B
|
||
JRST 11INIT
|
||
|
||
BADJCL: MOVEI B,[ASCIZ /JCL is not the name of a PDP11.
|
||
/]
|
||
PUSHJ P,TYPE
|
||
JRST OK
|
||
|
||
BAD11: MOVEI B,[ASCIZ /No default file for specified PDP11.
|
||
/]
|
||
PUSHJ P,TYPE
|
||
JRST OK
|
||
|
||
STTO: 1,,(SIXBIT /TTY/)
|
||
STTI: (SIXBIT /TTY/)
|
||
|
||
PLD: BLOCK 100
|
||
|
||
JCLP: 0 ;-1 => WE GOT JCL
|
||
DEBUG: 0 ;-1 => DEBUGGING.
|
||
BCMD: MOVEI B,[ASCIZ /Load from: /]
|
||
PUSHJ P,SCRS
|
||
PUSHJ P,RCH ;GET TYPED IN COMMANND
|
||
MOVE PNTR,IP
|
||
SETZB F,S
|
||
COMND: ILDB A,CMPTR
|
||
CAIN A,^Q
|
||
JRST CMDQ
|
||
CAIN A,15
|
||
JRST CMDE
|
||
CAIN A,^G
|
||
JRST BCMD
|
||
CAIN A,":
|
||
JRST CMDCOL
|
||
CAIN A,";
|
||
JRST CMDSC
|
||
CAIG A,40
|
||
JRST CMDS
|
||
SXBT: SUBI A,40
|
||
TLNE PNTR,770000 ;STOP AFTER POSITIN=0
|
||
IDPB A,PNTR
|
||
JRST COMND
|
||
CMDS: MOVE F,S
|
||
CMD1: MOVE PNTR,IP
|
||
MOVEI S,0
|
||
JRST COMND
|
||
CMDSC: MOVEM S,SNR
|
||
JRST CMD1
|
||
CMDCOL: JRST CMD1 ;FOR NOW IGNORE IT
|
||
CMDE: .SUSET [.SSNAM,,SNR]
|
||
JUMPE F,FZ
|
||
JUMPN S,SNZ
|
||
FZ: LSHC F,36. ;MOVE S TO F AND ZERO S
|
||
SZ: JUMPE F,BCMD ;TAKE IN NEW NAME
|
||
MOVE S,BIN
|
||
SNZ: MOVEM F,ADR+1
|
||
MOVEM S,ADR+2
|
||
.OPEN DSK,ADR
|
||
.LOSE 1000
|
||
JRST RDCN
|
||
SNR: 0
|
||
ADR: 2,,(SIXBIT /DSK/)
|
||
0
|
||
0
|
||
BIN: SIXBIT /BIN /
|
||
CMDQ: ILDB A,CMPTR
|
||
JRST SXBT
|
||
|
||
IP: 440600,,S
|
||
;NOW GET COMPUTER NUMBER OF 11 TO BE STUFFED
|
||
|
||
RDCN: MOVEI B,[ASCIZ /To PDP11 # :/]
|
||
PUSHJ P,SCRS
|
||
PUSHJ P,RCH
|
||
SETZB F,S
|
||
RDNXT: ILDB A,CMPTR
|
||
CAIN A,^G ;START OVER
|
||
JRST RDCN
|
||
CAIN A,15 ;END OF LINE
|
||
JRST DONEN
|
||
CAIN A,".
|
||
JRST PRD ;INPUT IS DECIMAL
|
||
CAIN A,40 ;DONE IF B > 0
|
||
JRST SPACE
|
||
SUBI A,60 ;SHOULD BE DIGIT
|
||
SKIPL A
|
||
CAIL A,10.
|
||
JRST NOTD ;NOT A DIGIT
|
||
MULI S,10. ;DECIMAL
|
||
ADD S,A
|
||
ASH F,3 ;OCTAL
|
||
ADD F,A
|
||
AOJA B,RDNXT
|
||
PRD: MOVE S,F ;USE DECIMAL VERSION
|
||
JRST DONEN
|
||
NOTD: ;NOT A DIGIT - TREAT AS SPACE
|
||
SPACE: JUMPE B,RDNXT ;IGNORE LEADING SPACES AND OTHER NON-DIGITS
|
||
DONEN: JUMPL F,RDCN
|
||
CAILE F,MAX11S
|
||
JRST RDCN
|
||
SKIPN DESC(F)
|
||
JRST [ MOVEI B,[ASCIZ /Bad PDP11 number.
|
||
/]
|
||
PUSHJ P,TYPE
|
||
JRST OK]
|
||
MOVE B,F
|
||
PUSHJ P,TYPEN
|
||
MOVEI B,[ASCIZ / selected. /]
|
||
PUSHJ P,TYPE
|
||
MOVE B,DESC(F)
|
||
MOVE A,(B) ;GET # OF PAGES IN THIS GUY
|
||
MOVEM A,NOPG
|
||
AOS B
|
||
PUSHJ P,TYPE
|
||
MOVEI B,[ASCIZ / OK?/]
|
||
PUSHJ P,TYPE
|
||
PUSHJ P,TYI
|
||
PUSHJ P,CRLF
|
||
CAIE A,"Y
|
||
JRST RDCN
|
||
JRST 11INIT
|
||
11INIT: MOVEM F,11NUM
|
||
MOVE E,F
|
||
LSH E,26.
|
||
MOVE A,NOPG ;GET NO. OF 2K 11 PGS
|
||
SOS A
|
||
MOVEI B,11LO_-10. ;WHERE 11 MEM STARTS IN 10
|
||
ADD B,A ;POINT TO LAST PAGE
|
||
11IN1: MOVE C,11MAP(A)
|
||
ADD C,E ;ADD IN 11#
|
||
.CALL [SETZ
|
||
SIXBIT /T11MP/
|
||
B
|
||
SETZ C]
|
||
.VALUE
|
||
SOS B
|
||
SOJGE A,11IN1
|
||
MOVE C,11MAP+62. ;FIRST I/O PAGE
|
||
ADD C,E
|
||
.CALL [SETZ
|
||
SIXBIT /T11MP/
|
||
[11LO_-10.+14.]
|
||
SETZ C]
|
||
.VALUE
|
||
MOVE C,11MAP+63.
|
||
ADD C,E
|
||
.CALL [SETZ
|
||
SIXBIT /T11MP/
|
||
[11LO_-10.+15.]
|
||
SETZ C]
|
||
.VALUE
|
||
;ABOVE MAPS I/O REGS INTO MAP
|
||
11IN2: MOVE A,[JMP_20.+10] ;MAKE 0 BE A 1-INSN LOOP.
|
||
MOVEM A,11LO
|
||
MOVE A,[JMP_20.] ;STORE 2 BEFORE 0 IN CASE 11 IS DOING BR . IN 0
|
||
MOVEM A,11LO
|
||
MOVE A,11LO
|
||
CAME A,[JMP_20.] ;IS THE PDP11 RUNNING?
|
||
JRST MEMLUZ
|
||
SETZM 11LO+1 ;ZERO IN 4,6 IN CASE 11 GETS A NXM.
|
||
SETZM 11LO+2 ;ALSO IN RESERVED INSN TRAP VECTOR
|
||
SETZM 11LO+3 ;AND BPT TRAP VECTOR.
|
||
SETZM 11LO+<TPBRKV/4> ;POINT TTYO BREAK VECTOR TO 0
|
||
MOVE A,[JMP_20.] ;JMP @#0
|
||
MOVEM A,11LO+<404/4> ;WRITE A CLOCK INTERRUPT ROUTINE:
|
||
MOVE A,[CLR_20.+LKS_4] ;CLR @#LKS ? JMP @#0
|
||
MOVEM A,11LO+<400/4>
|
||
MOVE A,[400_20.] ;SET UP BREAK VECTOR TO POINT AT IT.
|
||
MOVEM A,11LO+<LKBRKV/4> ;THUS NEXT CLOCK INT WILL TURN OFF CLOCK INTS.
|
||
MOVE C,11NUM
|
||
MOVE C,DESC(C) ;GET DESC VECTOR ADDR FOR THIS 11
|
||
MOVE C,3(C) ;TO SEE IF WE KNOW IT HAS A CLOCK.
|
||
MOVE A,[300_20.+4]
|
||
TRNE C,1 ;IF SO, CAUSE 1 CLOCK INT IN CASE WAS IN A WAIT INSN.
|
||
MOVEM A,11LO+<LKS/4>
|
||
MOVEI B,10
|
||
.SLEEP B, ;WAIT FOR INTS TO HAPPEN AND DO RIGHT THINGS.
|
||
MOVE B,NOPG
|
||
ASH B,10.
|
||
SUBI B,4
|
||
MOVE A,[CLRPC_20.+CLRPC_4]
|
||
11IN4: MOVEM A,11LO+3(B) ;FILL ALL OF MEMORY BUT 1ST 8 WORDS WITH CLR PC
|
||
REPEAT 2,JFCL
|
||
CAME A,11LO+3(B)
|
||
JRST MEMLUZ ;SO WHATEVER 11 WAS DOING IT WILL FALL INTO LOOP IN 0
|
||
SOJG B,11IN4
|
||
MOVE A,[RESET_20.+CLR_4]
|
||
MOVEM A,11LO+<400/4> ;400/ RESET
|
||
MOVE A,[400_20.+BR._4] ;402/ CLR 400 (TO DISTINGUISH RUNNING 11 FROM WAITING)
|
||
MOVEM A,11LO+<404/4> ;404/ BR .
|
||
MOVE A,[400_4+10] ;0/ JMP 400 SO RESET GETS DONE AND 0 IS SAFE TO MUNG.
|
||
MOVEM A,11LO
|
||
MOVEI A,10 ;GIVE IT TIME TO WORK.
|
||
.SLEEP A,
|
||
MOVE A,[JMP_20.] ;MAKE A LOOP IN 0,2 SUCH THAT WE CAN CLOBBR 2 WITH START
|
||
MOVEM A,11LO ;ADDRESS AFTER LOADING THE FILE.
|
||
MOVE A,11LO+<400/4>
|
||
LSH A,-20. ;DID THE CLR 400 GET DONE? IF 400 NONZERO,
|
||
MOVEM A,WAITFL ;THE 11 MUST BE WAITING (SINCE NOT RUNNING, NOT HALTED).
|
||
MOVE A,[CLRPC_20.+CLRPC_4]
|
||
MOVEM A,11LO+<404/4> ;406/ CLR PC TO JUMP TO 0 SO WE CAN ZERO 400, ETC.
|
||
SETZM 11LO+1 ;POINT NXM VECTOR TO 0
|
||
MOVE B,NOPG ;ZERO ALL REST OF MEMORY.
|
||
ASH B,10.
|
||
SUBI B,1
|
||
11IN5: SETZM 11LO(B)
|
||
JFCL
|
||
SOJG B,11IN5
|
||
11IN3: SKIPN 11LO ;DID 11 HALT DURING ALL THIS?
|
||
JRST MEMLUZ
|
||
SETZB PNTR,ST11AD
|
||
SETOM 11WORD
|
||
JRST STLOAD
|
||
11MAP:
|
||
REPEAT 64.,3_34.+1777+<.RPCNT*2000>_10.
|
||
NOPG: 0 ;NUMBER OF 2K 11-PAGES
|
||
11NUM: 0 ;11 BEING STUFFED
|
||
|
||
;PDP-11 MEMORY NOT WORKING. SEE IF MACHINE IS HALTED, 10-11 IS BROKEN,
|
||
;OR MEMORY IS BROKEN.
|
||
MEMLUZ: SETZM B ;B ANY BITS THAT WORK ANYWHERE
|
||
MOVN C,NOPG
|
||
LSH C,10.+18.
|
||
MEMLZ1: IOR B,11LO(C)
|
||
AOBJN C,MEMLZ1
|
||
JUMPE B,11HALT ;IF ALL LOCATIONS 0, PDP11 IS JUST HALTED
|
||
;MAYBE SOME MEMORY LOCATIONS DON'T WORK, AND SOME DO
|
||
MOVEI B,[ASCIZ/PDP11 memory seems to have problems.
|
||
/]
|
||
PUSHJ P,TYPE
|
||
MOVN C,NOPG
|
||
LSH C,10.+18.
|
||
AOBJN C,.+1 ;DON'T CLOBBER LOCATION 0, PDP11 WILL HALT
|
||
MEMLZ3: SETZM 11LO(C)
|
||
REPEAT 4,JFCL
|
||
SKIPE 11LO(C)
|
||
JRST MEMLZ4
|
||
MOVNI A,20
|
||
MOVEM A,11LO(C)
|
||
REPEAT 4,JFCL
|
||
CAME A,11LO(C)
|
||
JRST MEMLZ4
|
||
AOBJN C,MEMLZ3
|
||
JRST MEMLZ7
|
||
|
||
MEMLZ4: MOVEI B,[ASCIZ/Locations /]
|
||
PUSHJ P,TYPE
|
||
HRRZ B,C
|
||
LSH B,2
|
||
PUSHJ P,TYPEN
|
||
MEMLZ5: SETZM 11LO(C)
|
||
REPEAT 4,JFCL
|
||
MOVE 11WORD,11LO(C)
|
||
MOVNI A,20
|
||
MOVEM A,11LO(C)
|
||
REPEAT 4,JFCL
|
||
CAMN A,11LO(C)
|
||
SKIPE 11WORD
|
||
AOBJN C,MEMLZ5
|
||
MEMLZ6: MOVEI B,[ASCIZ/ through /]
|
||
PUSHJ P,TYPE
|
||
MOVEI B,-1(C)
|
||
LSH B,2
|
||
PUSHJ P,TYPEN
|
||
MOVEI B,[ASCIZ/ do not work.
|
||
/]
|
||
PUSHJ P,TYPE
|
||
JUMPL C,MEMLZ3
|
||
MEMLZ7: MOVEI B,[ASCIZ/This could be the 10-11 interface or the PDP11. Try resetting
|
||
both the PDP11 and its 11-10 interface. Type a character to try again./]
|
||
PUSHJ P,TYPE
|
||
PUSHJ P,TYI
|
||
JRST 11IN2
|
||
|
||
11HALT: MOVEI B,[ASCIZ /PDP11 not running. Put 777 (BR .) in 0, start at 0,
|
||
then type a character to retry stuffing. If that doesn't work, try resetting
|
||
PDP11 and its 11-10 interface.
|
||
/]
|
||
PUSHJ P,TYPE
|
||
PUSHJ P,TYI
|
||
JRST 11IN2
|
||
|
||
STLD4: TRNE CHK,377
|
||
.VALUE
|
||
SUMCHK: JFCL
|
||
STLOAD: SETZM CHK
|
||
STLD2: PUSHJ P,GETDSK
|
||
JUMPL A,EOFDSK
|
||
JUMPE A,STLD2 ;IGNORE ZERO WORDS; THEY DON'T START BLOCKS.
|
||
CAIE A,1 ;LOOKING FOR START OF BLOCK
|
||
JRST EOFDSK ;FOUND ANYTHING BUT A 1 => ERROR.
|
||
PUSHJ P,GETDSK ;2ND HALF OF BEGIN-BLOCK-FLAG
|
||
MOVEI BCOUNT,20 ;TO FAKE OUT GETWRD
|
||
PUSHJ P,GETWRD ;GET BYTE COUNT FOR BLOCK
|
||
SUBI B,3
|
||
MOVEM B,BCOUNT
|
||
PUSHJ P,GETWRD ;GET ADDRESS FOR BLOCK
|
||
MOVEM B,ST11AD
|
||
SKIPL BCOUNT
|
||
CAIG BCOUNT,1 ;JUMP BLOCK
|
||
JRST STUFED
|
||
MOVEI A,(B)
|
||
ADD A,BCOUNT ;WHAT IS 1ST ADDRESS THIS BLOCK WON'T REACH TO?
|
||
LSH A,-12. ;WHAT PAGE IS 1ST PAGE WE WON'T STORE IN?
|
||
CAMLE A,NOPG ;DETECT TRYING TO WRITE IN NON-EX PDP11 MEMORY.
|
||
JRST 11MPV
|
||
STLOP1: CAIGE B,4
|
||
JRST LOWLOD
|
||
STLOOP: PUSHJ P,GETDSK
|
||
JUMPL A,EOFDSK
|
||
SOJLE BCOUNT,STLD4
|
||
JSP B,STBYTE
|
||
AOJA ST11AD,STLOOP
|
||
STUFED: TRNE ST11AD,1
|
||
JRST NOSTAR
|
||
LSH ST11AD,4
|
||
TRO ST11AD,10 ;DONT STORE WORD 0
|
||
MOVEM ST11AD,11LO ;STORE START ADDR IN 2
|
||
SKIPE JCLP
|
||
JRST OK
|
||
PUSHJ P,CRLF
|
||
MOVEI B,[ASCIZ /File loaded and started at /]
|
||
SKIPE WAITFL ;IF PDP11 WAS IN A WAIT INSN DURING STUFFING, IT HASN'T STARTED.
|
||
MOVEI B,[ASCIZ /File loaded, but PDP11 is in a WAIT instruction.
|
||
Start at /]
|
||
PUSHJ P,TYPE
|
||
LSH ST11AD,-4
|
||
MOVE B,ST11AD
|
||
PUSHJ P,TYPEN
|
||
PUSHJ P,CRLF
|
||
JRST OK
|
||
|
||
WAITFL: 0 ;-1 IF WE DETECTED THAT PDP11 IS WAITING AND CAN'T BE STARTED.
|
||
|
||
NOSTAR: MOVEI B,[ASCIZ /File loaded; no start address.
|
||
/]
|
||
SKIPN JCLP
|
||
LOSE: PUSHJ P,TYPE
|
||
OK: SKIPE DEBUG
|
||
.VALUE
|
||
.LOGOUT
|
||
.BREAK 16,160000
|
||
|
||
11MPV: SKIPA B,[[ASCIZ /File needs more core than this PDP11 has.
|
||
/]]
|
||
EOFDSK: MOVEI B,[ASCIZ /File is not in PDP11 absolute loader format.
|
||
/]
|
||
JRST LOSE
|
||
|
||
LOWLOD: MOVEI B,[ASCIZ /File attempts to load into word 0 or 2.
|
||
/]
|
||
JRST LOSE
|
||
;GET NEXT WORD FROM DISK INTO A. -1 == EOF
|
||
|
||
;PNTR HAS MINUS # LEFT SO ADRS(PNTR) GIVES NEXT WORD
|
||
;WHEN IT EQUALS 0, GET NEW BLOCK. IF RETURN WITH NEG
|
||
;POINTER, WRITE NEG 1 AS EOF CHAR
|
||
|
||
GETDSK: JUMPE PNTR,RELOD ;NEED NEW BLOCK
|
||
MOVE A,ADRS(PNTR)
|
||
ADD CHK,A
|
||
AOJA PNTR,CPOPJ ;ADD ONE AND RET URN
|
||
RELOD: MOVE PNTR,DBUFP
|
||
.IOT DSK,PNTR
|
||
JUMPL PNTR,ENFIL
|
||
NPNTR: HLRE PNTR,DBUFP ;GET MIN WRD COUNT IN PNTR
|
||
JRST GETDSK
|
||
ENFIL: HRRZS PNTR ;ZERO LEFT HALF TO GET NEXT ADRESS
|
||
SETOM (PNTR) ;WRITE EOF CHAR
|
||
JRST NPNTR
|
||
|
||
DBUFP: -50,,BUFR
|
||
BUFR: BLOCK 50
|
||
ADRS=.
|
||
|
||
; GET NEXT TWO 8-BIT BYTES AND COMBINE INTO
|
||
;16 BITS IN RT END OF BOTH A AND B
|
||
|
||
GETWRD: PUSHJ P,GETDSK
|
||
ANDI A,377
|
||
LSHC A,-36. ;MOVE A TO B AND ZERO A
|
||
SOSLE BCOUNT ;IF CHECKSUM DON'T GET EXTRA BLOCK YET
|
||
PUSHJ P,GETDSK
|
||
SOS BCOUNT
|
||
AOSE A ;WAS IT A NEG 1?
|
||
SOS A ;IF NOT RESTORE, ELSE SEND ZERO
|
||
LSH A,8.
|
||
ADDB A,B
|
||
POPJ P,
|
||
ST11WD: ;STORE WORD IN B IN 11 AT CU11AD.
|
||
MOVE C,CU11AD
|
||
LSHC C,-2
|
||
CAME C,ST11AD
|
||
JRST [MOVEM 11WORD,11LO(ST11AD)
|
||
SETOM 11WORD
|
||
JRST .+1]
|
||
MOVEM C,ST11AD
|
||
JUMPL D,ST11W1
|
||
DPB B,[242000,,11WORD]
|
||
TRZ 11WORD,10
|
||
JRST ST11W2
|
||
ST11W1: DPB B,[042000,,11WORD]
|
||
TRZ 11WORD,4
|
||
ST11W2: AOS CU11AD
|
||
AOS CU11AD
|
||
POPJ P,
|
||
|
||
CU11AD: 0 ;WHERE THE STUFER WANTS WORDS PUT
|
||
;STORE BYTE IN A IN 11 AT ST11AD
|
||
STBYTE: MOVEI D,0
|
||
MOVE C,ST11AD
|
||
CIRC C,-2
|
||
DPB A,DPBT(D)
|
||
JRST (B)
|
||
DPBT: 241000,,11LO(C)
|
||
041000,,11LO(C)
|
||
341000,,11LO(C)
|
||
141000,,11LO(C)
|
||
CONSTANTS
|
||
PATCH: BLOCK 200
|
||
LOC <.+1777>&<-2000>
|
||
11LO=.
|
||
IF2,[PRINTX /NOSE
|
||
/]
|
||
END START
|
||
|