1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-16 08:24:38 +00:00
PDP-10.its/src/sysen2/stuff.92
2018-06-13 21:01:39 +02:00

696 lines
15 KiB
Plaintext
Executable File
Raw 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.

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