1
0
mirror of https://github.com/PDP-10/its.git synced 2026-02-15 20:36:13 +00:00

STUFF - load PDP-11 through 10-11.

This commit is contained in:
Lars Brinkhoff
2018-06-13 10:16:59 +02:00
parent 63aefb2432
commit e52a580532
3 changed files with 700 additions and 0 deletions

695
src/sysen2/stuff.92 Executable file
View File

@@ -0,0 +1,695 @@
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î/
ASCII /XGPî/
ASCII /LISPî/
ASCII /CHESS/
ASCII /LOGOî/
; 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