1
0
mirror of https://github.com/PDP-10/its.git synced 2026-03-07 19:40:48 +00:00
Files
PDP-10.its/src/syseng/11sim.428
Lars Brinkhoff bf9a101f36 Fix 11SIM bug in NG display incremental mode.
Always start reading bits starting from 7, going down.
2018-12-21 06:51:23 +01:00

12208 lines
237 KiB
Plaintext
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.
; -*-MIDAS-*-
.SYMTAB 6000.
TITLE 11SIM
VERSION==:.FVERS
; EXPUNGE PREDEFINED SYMBOLS WE USE FOR OTHER PURPOSES.
IF1 EXPUNGE %GO
IFNDEF TENEX,TENEX==IFE .OSMIDAS-SIXBIT/ITS/,[0] .ELSE [1]
DEFINE TXY
IFN TENEX,TERMIN
DEFINE TXN
IFE TENEX,TERMIN
TXY[
.DECSAV ; PRODUCE .SAV FILE INSTEAD OF .REL FILE
.VALUE==:HALTF
IFNDEF EOL,EOL==^J ; ASSUME 20X EOL CHARACTER (37 ON 10X)
]
IFNDEF 45P,45P==1 ; 1 FOR 11-45 MAP SIMULATION.
DEFINE 45Y
IFN 45P,TERMIN
DEFINE 45N
IFE 45P,TERMIN
CPRI=0
A=1
B=2
C=3
D=4
E=5
T=6
TT=7
MB=10 ;MEMORY BUFFER
MA=11 ;MEMORY ADDRESS
X=12
PC=13 ;PROGRAM COUNTER
PS=14 ;PROCESSOR STATUS
45Y 45STTM==144000 ;MASK OF MODE AND REG SET.
45Y 45CMOD==160200 ;BP TO CURRENT MODE
45Y 45MODM==140000 ;MASK OF CURRENT MODE
45Y 45PMOD==140200 ;BP TO PREVIOUS MODE.
45Y 45REGB==4000 ;REGISTER SET SPECIFIER BIT
PRI==50300 ;PRIORITY (BYTE POINTER)
TF==20
NF==10
ZF==4
VF==2
CF==1
TIME=15 ;TIME (IN TETHS OF MICROSECONDS)
I=16 ;INSTRUCTION
P=17
.XCREF A,B,C,D,E,I,MA,MB,P,PC,PS,T,TIME,TT
TXN[
ETC==0
TYIC==1
TYOC==2
LOADCH==3
LPTC==4
UTIC==5
DMPCH==6
ERRC==7
DYCH==10 ;FIRST DYNAMICLY ALLOCATED CHANNEL
DYCHN==10 ;NUM DYNAMICLY ALLOCATED CHS
DYCMSK==377_10 ;USED BY DC AND DM
]
SYMTYP=1000,,
ADRTYP=2000,,
OPENL=3000,,
6TYPE=4000,,
BLKFLS=5000,,
TTOI=6000,,
TTOA=7000,,
ERROR=10000,,
UUOMAX==10
ARGERR=ERROR [ASCIZ/ARG/]
CALL=PUSHJ P,
RETURN==POPJ P,
RET=RETURN
SAVE=PUSH P,
REST=POP P,
CRF=TTOA [ASCIZ /
/]
.XCREF CALL,RET,RETURN
IF1 EXPUNG %PC
TRPPTL==100 ;-1)*4=MAX TRAP FOR TRAP PRINT VECTOR
PDLSIZ==200 ;PDL SIZE
45Y SEGBP==140300 ;BP TO SEGMENT # FIELD IN WORD #.
IF1 EXPUNGE APR
;MEMORY ALLOCATION
;0 START OF SIMULATOR, ENDS WITH SYM TAB THAT EXPANDS UPWARD
;RKBUF=NGBLK-6000*RKNBUF ;RK BUFFERS, 3K PER.
NGBLK=274000 ;NG DIS
PDP11=300000 ;SIMULATED PDP11 MEMORY 1 WORD/WORD
.XCREF PDP11
45Y IOORG==600000 ;START OF TOP 32.K OF 11 MEMORY.
45N IOORG==PDP11
45N MAXK==28.
45N MAXCOR==100000
45N MAXBYT==200000
45Y MAXK==124.
45Y MAXCOR==400000
45Y MAXBYT==1,,
;I-O ROUTINE SYMBOL CONVENTIONS
;A!DEV: ATTACH ROUTINE
;D!DEV: DETACH ROUTINE
;W!DEV: FLAG, 0 IF DETACHED, -1 IF ATTACHED
;Z!DEV: "RESET" ROUTINE IF DIFFERENT FROM A!DEV
;REG!(HAK,HK,K): DEVICE REGISTER REG ROUTINE
;DEV!TIM: TIME CONSTANT FOR OPERATION OF DEVICE
;OTHER SYMBOL CONVENTIONS
;I!INSN: ROUTINE FOR SIMULATION OF INSTRUCTION INSN
;C!COM: ROUTINE FOR : COMMAND COM
;CS!COM: ROUTINE FOR ; COMMAND COM
ABEG: LOC 41
JSR UUOH
TXN JSR TSINT
DEFINE CONC A,B
A!B!TERMIN
DEFINE TSOPEN A,B
.OPEN A,B
OPENL B
TERMIN
DEFINE SYSCAL A,B
.CALL [SETZ ? SIXBIT/A/ ? B ((SETZ))]
.LOSE %LSFIL
TERMIN
DEFINE SYSCL A,B
.CALL [SETZ ? SIXBIT/A/ ? B ((SETZ))]
TERMIN
DEFINE INSIRP A,B
IRPS INSIR1,,[B]
A,INSIR1
TERMIN TERMIN
;PERFORM APPROPRIATE ADJUSTMENTS IF A
;NEW QUANTITY HAS BEEN LOADED IN PS
DEFINE NEWPS
45Y[ MOVE 0,PS
ANDI 0,45STTM ;GET NEW MODE AND REG SET BIT
CAME 0,45STAT ;EITHER ONE HAS CHANGED =>
CALL 45NMOD ;DO BOOKKEEPING.
]
45N ANDI PS,377
LDB CPRI,[PRI,,PS]
MOVE A,[LDB T,[061200,,I]]
TRNE PS,TF
MOVE A,[JRST TTRPIB]
MOVEM A,TRPMOD
TERMIN
;DON'T USE XXWAIT UNLESS THE PRIORITY IS REALLY 6,,
DEFINE XXWAIT X
JSP A,MTRNEW
6,,
-1
IFNB X,PUSHJ P,X
IFB X,PUSHJ P,.+1
TERMIN
IOCNUM==0 ;GET CONTROL ON IOC ERRORS
DEFINE IOCGET X
IF2 [IOCLOC==.
LOC IOCTAB+IOCNUM
IOCLOC
X
LOC IOCLOC]
IOCNUM==IOCNUM+2
TERMIN
DEFINE CSLWRD A
JSP D, CSLR!A
TERMIN ;LOAD 1 WORD FROM LOADCH INTO A (T2, T3, T5).
;MAP MACROS FOR NON-MAP VERSION:
45N[
IRPS X,,IR IW DR DW
IRPS Y,,MA TT
DEFINE 45!X!!Y X2
TERMIN
TERMIN
TERMIN
DEFINE 45PCINC X1,Y1
AOS X1,PC
SKIPGE Y1,PDP11-1(X1)
JSP D,MTRAPR
TERMIN
]
;MAP MACROS FOR VERSION WITH MAP:
45Y[
IRPS X,,IR IW DR DW,XX,,0 0 1 1
IRPS Y,,MA TT,Z,,0 1
DEFINE 45!X!!Y XY
LDB D,[SEGBP,,Y]
XCT XX,@45!X!X1+Z
XCT XY,@45!X!X2+Z
JSP A,45ASL
TERMIN
TERMIN
TERMIN
DEFINE 45PCINC X1,Y1
MOVE X1,PC
AOJ PC,
45IR!X1
SKIPGE Y1,PDP11(X1)
JSP D,MTRAPR
TERMIN
]
LOC ABEG
BEG:
TXY RESET
SETZM RUN ;RUN=0 MEANS STOP SOON (LOOKED AT BY DIRECT TO MEM DEVICES)
SETZM DDTPDP ;DDTPDP=0 MEANS NORMAL NOT IN DDT
;DDTPDP>0 NOT IN DDT BUT FAKE OUT MTRAP ETC.
;DDTPDP<0 IN DDT (SAVE PDL PNT HAS NEG COUNT IN LH)
SETOM DINITF ;WILL BE 1ST CALL TO DDT SOON.
MOVE P,[(-PDLSIZ)PDL]
SETZB PC,PS
NEWPS
SETZM LPTFLG
PUSHJ P,MERRV
TXN[ MOVE A,[-3,,[ .RUNAME,,UNAME
.RXUNAME,,XUNAME
.RHSNAME,,HSNAME
]]
.SUSET A
.OPEN TYOC,[%TJDIS+.UAO,,'TTY]
.LOSE %LSFIL ;IF NO TYPEOUT.
MOVE A,[-BSUSL,,BSUST]
.SUSET A ;SET UP INTERRUPTS
.OPEN TYIC,[.UII,,'TTY]
TTOA [ASCIZ /
TYPE IN FAILS/]
.STATUS TYIC,A
ANDI A,77
CAIN A,2
SETOM GETTY ;SET GETTY TO -1 IF GRAPHICS TTY.
.CALL TTYGT
.LOSE %LSFIL
TLZ A,%TSACT
MOVEM A,TTYM1A ;SET UP ORDINARY TTYSET,
TLO A,%TSACT
MOVEM A,TTYMAA ;ACTIVATE-ON-NEXT-CHAR TTYSET.
]
TXY[ MOVEI A,.FHSLF ;SETUP TENEX INTERRUPT SYSTEM
CIS
MOVE B,[LEVTAB,,CHNTAB]
SIR
EIR
MOVE B,CHNMSK
AIC
MOVE A,[.TICCX,,0] ; ^X - CHANNEL 0
ATI
MOVE A,[.TICCW,,1] ; ^W - CHANNEL 1
ATI
MOVE A,[.TICCS,,2] ; ^S - CHANNEL 2
ATI
MOVE A,[.TICCV,,3] ; ^V - CHANNEL 3
ATI
MOVE A,[.TICCG,,4] ; ^G - CHANNEL 4
ATI
MOVEI A,.PRIIN ; SET TERMINAL BREAKS
RFMOD
IORI B,TT%WKF\TT%WKN\TT%WKP\TT%WKA ; TO ALL CHARACTERS
SFMOD
]
6TYPE [45N[SIXBIT/1120./] 45Y[SIXBIT/1145./]]
TTOA [.RADIX 10.,.ASCII "!<VERSION> "]
PUSHJ P,BLKGET ;GET PDP-11 I-O BLOCK
600000,,IOORG+76000 ;SET TO NXM
45Y CALL AI45
CALL CZTIME ;MUST FOLLOW SETUP OF NXM INTERRUPTS & LOCATIONS
CRF
PUSHJ P,WRDINS ;SET UP STATUS, PC, SWITCH REG
600000+NPS,,RPS
600000+NSWR,,RSWR
REPEAT 3,600000+NCSX,,RCSX+.RPCNT+1
0,,RCSX
0
PUSHJ P,XRESET ;INITIALIZE AND ATTACH VARIOUS DEVICES
TXN[ .CALL [ SETZ ? SIXBIT/OPEN/ ? 1000,,UTIC
[SIXBIT/DSK/] ? XUNAME ? [SIXBIT/PDP11/] ? SETZ HSNAME ]
JRST BEG2
TTOA [ASCIZ /INIT
!/]
SETOM FILINF
JRST DIEDIE
]
BEG2: MOVEI T5,8
SKIPN KCOUNT ;IF NO CORE YET,
PUSHJ P,CCORE1 ;GET 8 K.
TTOI "!
JRST DIEDIE
TXN[
FILINF: 0
]
;NOTE THAT IF DDTPDP IS NEG, THE SIMULATED TIME WILL BE IN RTIME NOT TIME
TXN[
;INTERRUPT HANDLER
TSINT: 0
0
PUSH P,A
PUSH P,B
PUSH P,C
PUSH P,40
PUSH P,UUOH
SETZM INTINS
SKIPGE DEBUGP
.SUSET [.RJPC,,INTJPC]
SKIPL A,TSINT
JRST OTHERI ;FIRST WORD INT
TRNN A,1_TYIC+DYCMSK
JRST BADINT ;SECOND WORD BUT NOT VALID CHANNEL
TRNN A,1_TYIC
JRST DYCINT ;NOT TYI
MOVEI A,TYIC
.ITYIC A,
JRST DYCINT
AOSN ICTLQF
JRST TSINT2
CAIN A,^Q
JRST TSINTQ
CAIE A,^W
CAIN A,^S
JRST TSILNT
CAIN A,^V
SETOM TYOFLG
CAIN A,^B
JRST TSINTB
CAIN A,^E
JRST TSINTE
CAIN A,^G
JRST TSQUIT
TSINT2: SKIPGE DDTPDP
JRST DYCINT
CALL TSINNS ;STOP SLEEPING, PC INTO A.
SKIPN TKBUSY ;IF WON'T LOOK FOR ANOTHER CHAR,
CALL TKB224 ;LOOK FOR IT NOW.
JRST DYCINT
TSINNS: HRRZ A,TSINT+1
CAIN A,IWAITS ;DON'T RETURN TO .SLEEP .
AOS TSINT+1
RETURN
TSQUIT: SKIPGE DDTPDP ;IF INSIDE DDT,
.DISMI [DERR] ;RETURN TO MAIN LOOP RIGHT AWAY.
AOS A,QUITF
CAIL A,2
.DISMI [QUIT] ;3 ^G'S - STOP IMMEDIATELY.
TTOA [ASCIZ/
^G /]
PUSHJ P,CLRRUN ;STOP AFTER INSN.
CAIE A,1
JRST DYCINT
TSILNT: SETZM TYOFLG
PUSHJ P,TRESET
JRST DYCINT
TSINTQ: SETOM ICTLQF
DYCINT: MOVE A,TSINT
TRNN A,DYCMSK
JRST TSINTX
MOVE C,[-DYCHN,,DYCH]
DYCIN2: TDNE A,DYCBIT-DYCH(C)
PUSHJ P,DYCINR
AOBJN C,DYCIN2
JRST TSINTX
DYCINR: HRRZ B,C ;INTERRUPT ON DYNAMICALLY ALLOCATED CHANNEL
SKIPE DYCTYP-DYCH(C) ;SKIP IF TTY
JRST DYCINS
.ITYIC B, ;MUST ITYIC IF TTY
POPJ P,
DYCINS: PUSH P,A
CALL TSINNS ;STOP A WAIT INSN.
DYCILY: MOVE A,DYCBPT-DYCH(C)
SKIPL 1(A) ;IF MAIN PROGM NOT LOOKING AT THIS CHNL,
JRST POPAJ
SAVE C
MOVE C,TIME
SKIPGE DDTPDP
MOVE C,RTIME
SKIPN QFLAG
PUSHJ P,CTRDES ;TELL IT TO LOOK SOON.
CAMN A,QFLAG ;IF MAIN PROGM NOW QUEUEING THIS BLOCK,
JRST POPCAJ ;NEED NOT DO ANYTHING NOW.
SKIPE QFLAG
PUSHJ P,MTRDES
POPCAJ: REST C
POPAJ: POP P,A
POPJ P,
TRESET: .RESET TYOC,
SKIPE LPTFLG
.RESET LPTC,
RETURN
QUIT: SAVE TSINT+1 ;DDT WILL RETURN TO INTERRUPTED SIMULATION.
SAVE [DDT] ;RSTALL WILL RETURN TO DDT.
PUSHJ P,SAVALL
PUSHJ P,MERRV
TTOA [ASCIZ/
^GSUPER-QUIT! /]
MOVEI A,TRUNBK
PUSHJ P,QDEL
JRST RSTALL ;RESTORE ACS, RETURN(TO DDT).
OTHERI: TRNE A,200000
TTOA [ASCIZ /
PDL OVERFLOW/]
TRNE A,400
JRST OTHIOC ;IOC INT
TRNN A,20000
JRST BADINT
MOVSI A,600000 ;NON-EX MEM
MOVEM A,NXMCLB
HRRZ A,TSINT+1
CAIL A,SYMTAB
TTOA [ASCIZ/
NXM OUTSIDE PROGRAM AREA/]
SKIPA A,-1(A)
NXMX2: MOVE A,(A)
HRRI A,@A
; TRNN A,400000 ;THIS TEST FOULS UP ON BYTE INSNS.
; TRNN A,300000
; TTOA [ASCIZ/
;NXM OUTSIDE VIRT. MEM/]
AND A,[777740,,-1]
TLC A,(XCT)
TLNN A,777000
JRST NXMX2 ;XCT, GO DOWN CHAIN
TLC A,(XCT)
HRRI A,NXMCLB
JRST NXMXIT
OTHIO4: MOVE A,1(A)
NXMXIT: MOVEM A,INTINS
TSINTX: POP P,UUOH
POP P,40
POP P,C
POP P,B
POP P,A
SKIPN INTINS
.DISMI TSINT+1
AOS TSINT+1 ;TAKE CARE OF SKIPPING INSNS.
XCT INTINS
SOS TSINT+1
.DISMI TSINT+1
OTHIOC: HRRZ C,TSINT+1
MOVEI A,IOCTAB
OTHIO2: CAMN C,(A)
JRST OTHIO4
ADDI A,2
CAIE A,IOCEND
JRST OTHIO2
TTOA [ASCIZ /
IOC ERROR IN /]
SOS TSINT+1 ;RETURN TO THE .IOT .
JRST BADINU
NXMCLB: 0 ;MAY BE CLOBBERED
INTJPC: 0
INTINS: 0
BSUST: .SMASK,,[220400]
.SPICL,,[-1]
.SMSK2,,[1_TYIC+DYCMSK]
BSUSL==3
UNAME: 0
XUNAME: 0
HSNAME: 0
BADINT: PUSHJ P,MERRV
TTOA [ASCIZ /
BAD INTERRUPT IN 
INT: /]
MOVE B,TSINT
PUSHJ P,FOCTP
BADINU: REST UUOH ;RESTORE EVERYTHING SAVED.
REST 40
REST C
REST B
REST A
.VALUE [ASCIZ*INTJPC/ *]
.DISMI TSINT+1 ;STOP BEFORE NEXT INSN.
LPTFIL: 1,,SIXBIT / LPT/
SIXBIT /WALL PAPER/
] ; END OF ITS INTERRUPT HANDLER
TXY[
;TENEX INTERRUPT HANDLER
CHNMSK: 760000,,0000 ; ACTIVATE CHANNELS 0-4
LEVTAB: 0 ; ONLY USE INTERRUPT LEVEL 2
PC2
0
PC2: 0
CHNTAB: 2,,TSINTQ ; 0 - ^X
2,,TSILNT ; 1 - ^W
2,,TSILNT ; 2 - ^S SAME AS ^W
2,,TSINTV ; 3 - ^V
2,,TSQUIT ; 4 - ^G
REPEAT 31.,0
DEFINE SVSTAT
PUSH P,A
PUSH P,B
PUSH P,C
PUSH P,40
PUSH P,UUOH
TERMIN
TSINTQ: SVSTAT
SETOM ICTLQF
TSINTX: POP P,UUOH
POP P,40
POP P,C
POP P,B
POP P,A
DEBRK
TSILNT: SVSTAT ; MAKE TERMINAL SILENT
TSILNA: SETZM TYOFLG
MOVEI A,.PRIOU ; CLEAR OUTPUT BUFFER
CFOBF
JRST TSINTX
TSINTV: SVSTAT
SETOM TYOFLG
TSINNS: HRRZ A,PC2 ; DON'T RETURN TO SLEEP
CAIN A,IWAITS
AOS PC2
JRST TSINTX
TSQUIT: SVSTAT
SKIPGE DDTPDP
JRST [MOVEI A,DERR
HRRM A,PC2
JRST TSINTX]
SETZM QUITF
MOVEI A,.PRIOU
CFOBF
TTOA [ASCIZ /^G
/]
PUSHJ P,CLRRUN
JRST TSINNS
]
QUITF: -1
ICTLQF: 0
RUNTB: 0 ;RUN TIME BASE
;UUO HANDLER
UUOH: 0
PUSH P,A
PUSH P,B
PUSH P,C
PUSH P,40 ;4O MUST BE NEXT TO LAST PUSHED
PUSH P,UUOH ;UUOH MUST BE LAST PUSHED
HRRZ A,40
LDB C,[331100,,40]
SKIPE C ;JUMP WILL CLOBBER JPC
CAILE C,UUOMAX
SKIPA
JRST @UUODIS-1(C)
UUOHE:
TXN .SUSET [.RJPC,,20]
PUSHJ P,MERRV
TTOA [ASCIZ /
ILLEGAL UUO IN 
.JPC/]
REST UUOH
REST 40
REST C
REST B
REST A
SOS UUOH ;POINT TO UUO.
TXN .VALUE [ASCIZ*20/*]
TXY .VALUE
JRST @UUOH ;STOP BEFORE THE UUO.
UUODIS: XSYMTY
XADRTY
TXN UOPENL
TXY UUOHE ; NOT LEGAL IN TENEX VERSION
U6TYPE
UBLKFL
UTTOI
UTTOA
UERROR
UTTOA: LDB B,[270400,,40] ;SKIP BY C(AC FIELD)
ADDM B,(P)
HRLI A,440700
SAVE MCTLVF
MES2: ILDB B,A
CAIG B,^F
XCT MESTAB(B)
CAIN B,^K
JRST MCTLK ;DECP
CAIN B,^V
JRST MCTLV
TTOI (B)
JRST MES2
MCTLV: SETOM MCTLVF
JRST MES2
MESTAB: JRST MESXIT ;^@
JRST MFOCTP ;^A
JRST OPPNT ;^B
JFCL ;^C
JRST MCTLD ;SYMTYP
JRST MCTLE
JRST MCTLF ;ADRTYP
MERRV: SETOM TYOFLG
TXN SETZM DISOUT
RETURN
MCTLVF: 0 ;FORCE TTY OUTPUT FOR ERROR MESSAGES
MESXIT: REST MCTLVF
JRST UUOXIT
MFOCTP: PUSHJ P,UGQUAN
PUSHJ P,FOCTP
JRST MES2
FOCTP: LSHC B,-43 ;FULL WORD OCTAL PRINT
LSH C,-1
DIVI B,8
HRLM C,(P)
SKIPE B
PUSHJ P,FOCTP
HLRZ C,(P)
TTOI "0(C)
RETURN
UGQUAN: ILDB B,A ;GET QUANTITY
CAIL B,"8
JRST UGQUA2
HRRZ B,R0-"0(B)
RETURN
UGQUA2: CAIE B,"A
SKIPA B,QT
MOVE B,QA
RETURN
OPPNT: PUSH P,[MES2]
PUSHJ P,SAVALL
SKIPL DDTPDP
AOS DDTPDP
SKIPL DDTPDP
HRLZ SF,%TMODE
SKIPGE DL,OPC
JRST OPPNT1
LSH DL,1
PUSHJ P,DPINSN
SKIPA
OPPNT1: TTOA [ASCIZ/--DDT--/]
SKIPL DDTPDP
SOS DDTPDP
JRST RSTALL
MCTLF: SKIPA C,[ADRTYP QD]
MCTLD: MOVE C,[SYMTYP QD]
PUSHJ P,UGQUAN
MOVEM B,QD
PUSH P,[MES2]
PUSHJ P,SAVALL
SKIPL DDTPDP
HRLZ SF,%TMODE
XCT C
JRST RSTALL
TXN[
MCTLE: .VALUE ;FATAL ERROR
SKIPGE DDTPDP
.DISMI [DERR]
.DISMI [BEG]
]
TXY[
MCTLE: .VALUE ;FATAL ERROR
JRST .-1
]
MCTLK: PUSHJ P,UGQUAN
PUSHJ P,DECP
JRST MES2
OCTP: SKIPA C,[8]
DECP: MOVEI C,10.
HRRM C,ANYP
ANYP: IDIVI B,.
HRLM C,(P)
SKIPE B
PUSHJ P,ANYP
HLRZ B,(P)
TTOI "0(B)
CPOPJ: RETURN
UBLKFL: HRRZ B,(P) ;FLUSH QUEUE BLOCKS
ADD B,[<222200,,>-1]
UBLKF2: ILDB A,B
TLNE B,770000
AOS (P)
JUMPE A,UUOXIT
PUSH P,B
PUSHJ P,QDEL
POP P,B
JRST UBLKF2
UTTOI: SKIPE MCTLVF
JRST UTTOI1
TXN[ SKIPE DISOUT
JRST UDISCH
]
SKIPE TYOFLG
UTTOI1:
TXY PBOUT
TXN[ .IOT TYOC,A ;THE ONLY TYPE OUT IOT
SKIPE LPTFLG
.IOT LPTC,A
]
JRST UUOXIT
TXN[
UDISCH: PUSHJ P,DISCH
]
UUOXIT: POP P,UUOH
POP P,40
POP P,C
POP P,B
POP P,A
JRST 2,@UUOH
U6TYPE: MOVE B,@40
MOVE A,[440600,,B]
U6TYP2: ILDB C,A
JUMPE C,UUOXIT
TTOI 40(C)
JRST U6TYP2
TXN[
UOPENL: .SUSET [.RBCHN,,C] ;OPENL UUO, GET # OF CHANNEL.
CAIE C,LPTC
JRST UOPNL1
SETZM LPTCNT
SETZM LPTFLG
UOPNL1: DPB C,[270400,,OPNLX1]
DPB C,[270400,,OPNLX2]
OPNLX1: .STATUS .,OPLERR
HLR C,(A)
CAIE C,4^5 ;NEW SYSTEM CALL OPEN, DON'T GET DEV NAME.
TRNE C,1
JRST UOPNL3 ;OUTPUT LOST
.SUSET [.RSNAME,,LSNAME]
.SUSET [.SSNAME,,[SIXBIT /PDP11/]]
OPNLX2: .OPEN .,(A)
JRST UOPNL2
.SUSET [.SSNAME,,LSNAME]
JRST UUOXIT
UOPNL2: .SUSET [.SSNAME,,LSNAME]
UOPNL3: .OPEN ERRC,ERRFIL
JRST .-1
PUSHJ P,MERRV
UOPNL4: .IOT ERRC,B
CAIE B,14
CAIN B,3
JRST UOPNL6
TTOI (B)
JRST UOPNL4
UOPNL6: CAIN C,4^5
JRST DERR
HRLZ B,(A)
6TYPE B
JRST DERR
]
ERRFIL: (SIXBIT /ERR/)
3
OPLERR: .
LSNAME: 0 ;LAST SYSTEM NAME
WRDINS: PUSH P,A ;WORD INSERT
PUSH P,B
PUSH P,C
MOVE A,-3(P)
WRDIN2: SKIPN B,(A)
JRST WRDIN4
LDB C,[MARPOS,,(B)]
SKIPE C
TLO B,400000
HLLZM B,(B)
DPB C,[MARPOS,,(B)]
AOS A,-3(P)
JRST WRDIN2
WRDIN4: POP P,C
POP P,B
POP P,A
JRST POPJ1
;IN DDT, PRINTS MESSAGE & CAUSES ERROR, DOESN'T RETURN.
;OUTSIDE DDT, PRINTS MESSAGE, CAUSES DDT TO BE CALLED, RETURNS.
UERROR: PUSHJ P,MERRV ;TURN ON TTY FOR ERROR MSG.
SKIPN DEBUGP
JRST UERRO1
TTOA [ASCIZ/
10PC: /]
MOVE B,(P) ;IF DEBUGGING,
PUSHJ P,FOCTP ;PRINT ADDR AFTER ERROR UUO.
CRF
UERRO1: SKIPGE DDTPDP
TTOA [ASCIZ/ /]
TTOA (A)
SKIPGE DDTPDP
JRST DERR
PUSHJ P,CLRRUN
LDB B,[270400+P,,-1]
JUMPE B,UUOXIT ;AC FIELD 0 - NO POPJS.
TXN[ MOVNI B,-POP14J(B)]
TXY[ MOVNI B,B
ADDI B,POP14J
]
HRRM B,(P) ;EXIT TO RTN TO POPJ SEVERAL TIMES.
JRST UUOXIT
REPEAT 14.,REST POP14J
RETURN
POP14J: 0 ;EXCESS WDS ON PDL THROWN AWAY HERE.
TYI1:
TXN .IOT TYIC,MB
TXY PUSHJ P,PTYIC
CAIN MB,^Q
JRST TYI4
CAIE MB,^E
CAIN MB,^V
JRST TYI1
CAIE MB,^B
CAIN MB,^W
JRST TYI1
CAIE MB,^S
RETURN
SETOM TYOFLG
JRST TYI1
TYI4:
TXN .IOT TYIC,MB
TXY PUSHJ P,PTYIC
RETURN
TXY[
PTYIC: PUSH P,A ; INPUT A CHARACTER INTO MB
PBIN
MOVE MB,A
POP P,A
POPJ P,
]
TXN[
TSINTB: SAVE [DYCINT]
DGLNCB: SKIPN LPTFLG
PUSHJ P,OPNLPT
SETOM LPTFLG
RETURN
TSINTE: SAVE [DYCINT]
DGLNCE: SKIPN LPTFLG
RETURN
SETZM LPTFLG
JRST CLSLPT
CWALLP: MOVEI A,LPTFIL ;^B TO FILE
PUSHJ P,DGFIL
PUSHJ P,OPNLPU
SKIPE LPTFLG
RETURN
SETOM LPTFLG
AOS LPTCNT
RETURN
OPNLPT: AOS C,LPTCNT
SOJN C,CPOPJ
OPNLPU: .OPEN LPTC,LPTFIL
JRST .+2
RETURN
TSOPEN LPTC,TPLFIL
TTOA [ASCIZ /USING TPL/]
RETURN
TPLFIL: SIXBIT / !TPLWALL PAPER/
]
ACORE: HRRZ A,KCOUNT ;ATTACH CORE
SKIPN T5
JRST ACORE4
CAIL A,MAXK
JRST ACORE2
LSH A,10.
PUSHJ P,BLKGET
PDP11(A)
AOS KCOUNT
SOJA T5,ACORE
ACORE2: TTOI "?
ACORE4: MOVEM A,QT
LSH A,11.
HRRM A,%CORE
TTOA [ASCIZ /CORE = T.K
/]
RETURN
DCORE: HRRZ A,KCOUNT ;DETACH CORE
SKIPN T5
JRST ACORE4
JUMPE A,ACORE2
LSH A,10.
PUSHJ P,BLKZAP
PDP11-2000(A)
SOS KCOUNT
SOJA T5,DCORE
KCOUNT: 0
BLKGET: PUSH P,MA ;GET CORE BLOCK
PUSH P,MB
MOVE MA,@-2(P)
MOVEI MA,@MA
LSH MA,-1
TRZ MA,777
IOR MA,[4000,,400000]
MOVEM MA,QA
TXN[ .CBLK MA,
TTOA [ASCIZ /
BLKGET CBLK FAILED
A/]
]
HLLZ MB,@-2(P)
JUMPGE MB,POMBA1 ;ALLOW NEG FROBS TO SET TO NXM
LSH MA,1
MOVEM MB,(MA)
HRLS MA
AOS MA
HLRZ MB,MA
BLT MA,1777(MB)
POMBA1: POP P,MB
POMAJ1: POP P,MA
AOS (P)
RETURN
BLKZAP: PUSH P,MA ;FLUSH CORE BLOCK
MOVE MA,@-1(P)
MOVEI MA,@MA
LSH MA,-1
ANDI MA,377000
MOVEM MA,QA
TXN[ .CBLK MA,
TTOA [ASCIZ /
BLKZAP CBLK FAILED
A/]
]
JRST POMAJ1
;
;******************************************************************
; THE SIMULATOR
;
INEZCF: TROA PS,ZF\CF
INENEG: TRO PS,NF
INEND: ;INSTRUCTION END
CAMGE CPRI,@TRINF+1 ;CHECK TRAP QUEUE
JRST QTRZAP
CAML TIME,@CLINF+1 ;CHECK CLOCK QUEUE
JRST QCLZAP
INBEG:
45Y[ MOVE MA,PC
45IRMA
SKIPGE I,PDP11(MA)]
45N SKIPGE I,PDP11(PC) ;FETCH INSTRUCTION WORD
JSP D,MTRAPI
HRRZM PC,OPC
TRPMOD: LDB T,[061200,,I] ;(OR JRST TTRPIB) SEE NEWPS
AOJA PC,@I1TAB(T)
45N[
TTRPIB: CALL TTRPBJ
LDB T,[061200,,I]
AOJA PC,@I1TAB(T)]
;SIGN BIT => 2-ADDRESS INSN.
;4.8 BIT => WORD INSN.
;(BOTH USED BY PAGE-FAULT ROUTINES ONLY)
I1TAB: I0000
IJMP
IRTS ;+IOPR
MOVE ISWAB
REPEAT 4,IBR
REPEAT 4,IBNE
REPEAT 4,IBEQ
REPEAT 4,IBGE
REPEAT 4,IBLT
REPEAT 4,IBGT
REPEAT 4,IBLE
REPEAT 8,IJSR
MOVE ICLR
MOVE ICOM
MOVE IINC
MOVE IDEC
MOVE INEG
MOVE IADC
MOVE ISBC
MOVE ITST
MOVE IROR
MOVE IROL
MOVE IASR
MOVE IASL
IMARK ;I45
MOVE IMFPI
MOVE IMTPI
MOVE ISXT ;I45
REPEAT 8,I1ILL
REPEAT 64.,TRN IMOV
REPEAT 64.,TRN ICMP
REPEAT 64.,TRN IBIT
REPEAT 64.,TRN IBIC
REPEAT 64.,TRN IBIS
REPEAT 64.,TRN IADD
REPEAT 8,MOVE IIMUL ;I45
REPEAT 8,MOVE IIDIV ;I45
REPEAT 8,MOVE IASH ;I45
REPEAT 8,MOVE IASHC ;I45
REPEAT 8,MOVE IXOR ;I45
REPEAT 16.,I1ILL
REPEAT 8,ISOB ;I45
REPEAT 4,IBPL
REPEAT 4,IBMI
REPEAT 4,IBHI
REPEAT 4,IBLOS
REPEAT 4,IBVC
REPEAT 4,IBVS
REPEAT 4,IBCC
REPEAT 4,IBCS
REPEAT 4,IEMT
REPEAT 4,ITRAP
ICLRB
ICOMB
IINCB
IDECB
INEGB
IADCB
ISBCB
ITSTB
IRORB
IROLB
IASRB
IASLB
IMTPS
MOVE IMFPD
MOVE IMTPD
IMFPS
REPEAT 8,I1ILL
REPEAT 64.,SETZ IMOVB
REPEAT 64.,SETZ ICMPB
REPEAT 64.,SETZ IBITB
REPEAT 64.,SETZ IBICB
REPEAT 64.,SETZ IBISB
REPEAT 64.,TRN ISUB
REPEAT 64.,I1ILL
I1ILL: ADDI TIME,15.
JSP A,IILL
DBNDE: SKIPL DBNDBK+1 ;DELAYED BOUND ERROR
JRST (D)
MOVEM D,DBNDE.
MOVEI A,DBNDBK
MOVSI C,5
CALL MTRDES
JRST (D)
DBNDBK: 0
-1
JRST DBNDTR
DBNDE.: 0
DBNDTR: MOVE A,DBNDE.
SETOM ODDPC
JRST BOUNDE
QTRZAP: MOVE B,TRINF+1 ;DO QUEUE'ED TRAP REQUEST
MOVE A,1(B)
SETOM 1(B)
MOVEM A,TRINF+1
XCT 2(B)
JRST INEND
QCLZAP: MOVE B,CLINF+1 ;DO QUEUE'ED CLOCK REQUEST
MOVE A,1(B)
SETOM 1(B)
MOVEM A,CLINF+1
XCT 2(B)
JRST INEND
45N[
TTRPBJ: JSP A,MTRNEW
TTRPBK: 4,,
-1
JRST TTRAP
]
CLRRUN: SETZM RUN
JSP A,MTRNEW
TRUNBK: 2,,
-1
PUSHJ P,CLRRN2
CLRRN2: PUSH P,[DDTXIT]
SETOM DDONXT ; ;N WILL DO NEXT INSN.
JRST DDT1
CNTINS: SOSG INSCNT ;IF DID THAT MANY INSNS, STOP.
JRST CNTIN2
CAIN PC,@%CSN ;IF RETURNED FROM ;N, STOP.
JRST CNTIN1
45Y[ MOVE MA,PC
JRST INBEG+1]
45N[ SKIPGE I,PDP11(PC)
JSP D,MTRAPI
JRST INBEG+2]
CNTIN1: HLLOS %CSN ;LEAVE ;N MODE.
CNTIN2: TTOA [ASCIZ/
COUNT: /]
CALL CLRRN2
JRST INBEG
;OPEN CODED BRANCH
DEFINE OBRANC X
ADDI TIME,11.
IFB X,[ ANDI I,377
ADD PC,BRAT(I)]
IFNB X, ADD PC,BRAT-X(I)
ANDI PC,77777
OBRAN1
TERMIN
;TERMINATE AN INSN THAT SETS THE PC.
DEFINE OBRAN1
HRRZ B,OPC ;OR JRST INEND IF TRPPNT HOLDS 0,
;OR JRST BRPNT IF IT HOLDS 2 OR 3.
MOVEM B,JPC
JRST INEND
OBRAN2 ;LINK ALL OBRAN1'S TOGETHER.
OBRAN2==.-1
TERMIN
OBRAN2==0
DEFINE IZNEND
TRZ PS,16
TRNE MB,100000
JRST INENEG
TRNN MB,177777
TRO PS,ZF
JRST INEND
TERMIN
DEFINE IZMEND
TRNE MB,100000
JRST INENEG
TRNN MB,177777
TRO PS,ZF
JRST INEND
TERMIN
IBR: ADDI TIME,26.
ADD PC,BRAT-400(I)
ANDI PC,77777
OBRAN1
BRAT: REPEAT 200,,.RPCNT
REPEAT 200,,.RPCNT-200
IBNE: ADDI TIME,15.
TRNE PS,ZF
JRST INEND
OBRANC 1000
IBEQ: ADDI TIME,15.
TRNN PS,ZF
JRST INEND
OBRANC 1400
IBGE: ADDI TIME,15.
IBGT2: TRNN PS,NF\VF
JRST BRANCH ;BOTH OFF
TRNE PS,NF
TRNN PS,VF
JRST INEND
BRANCH: OBRANC ;BOTH ON
IBLT: ADDI TIME,15.
IBLE2: TRNN PS,NF
TRNN PS,VF
JRST IBLT2
OBRANC
IBLT2: TRNE PS,NF
TRNE PS,VF
JRST INEND
OBRANC
IBGT: ADDI TIME,15.
TRNE PS,ZF
JRST INEND
JRST IBGT2
IBLE: ADDI TIME,15.
TRNN PS,ZF
JRST IBLE2
OBRANC
IJSR: ADDI TIME,44.
ANDI I,77
XCT JD2CWT(I)
LSH PC,1
XCT IJSRT-40(T)
HRRM PC,R0-40(T)
HRRZ PC,MA
MOVE MA,R6
SUBI MA,2
CAMGE MA,RSLR1
JSP D,HPDLOV
ANDI MA,177777
HRRM MA,R6
TRNE MA,1
JSP A,BOUNDE
LSH MA,-1
45DWMA
SKIPGE PDP11(MA)
JSP D,MTRAPW
HRRM MB,PDP11(MA)
OBRAN1
IJSRT: REPEAT 7,MOVE MB,R0+.RPCNT
SKIPA MB,PC
I0000: JRST @I0000T(I)
I0000T: IHALT
IWAIT
IRTI
IBPT
IIOT
IRESET
IRTT ;I45
REPEAT 64.-7,I2ILL
I2ILL: ADDI TIME,15.
JSP A,IILL
IJMP: ADDI TIME,12.
ANDI I,77
XCT JD2CWT(I)
MOVE PC,MA
OBRAN1
IMARK: SKIPL WI45
JSP A,IILL
ANDI I,77
LSH I,1
ADD I,R6
ANDI I,177777
HRRM I,R6
MOVEI I,205 ;DUMMY UP AN RTS %5
IRTS: TRNE I,70
JRST IOPR
ADDI TIME,35.
HRRZ MA,R6
TRNE MA,1
JSP A,BOUNDE
LSH MA,-1
45DRMA
SKIPGE MB,PDP11(MA)
JSP D,MTRAPR
XCT IRTST-200(I)
HRRM MB,R0-200(I)
TRNE PC,1
JSP A,BOUNDE
LSH PC,-1
MOVEI MA,2 ;INCREMENT THE STACK PTR.
ADDM MA,R6
OBRAN1
IRTST: REPEAT 7,HRRZ PC,R0+.RPCNT
SKIPA PC,MB
IOPR: ADDI TIME,15.
XCT OPRT-200(I)
JRST INEND
OPRT: REPEAT 24.,JSP A,IILL
REPEAT 8,JRST ISPL ;I45
JRST INEND
REPEAT 15.,TRZ PS,.RPCNT+1
JRST INEND
REPEAT 15.,TRO PS,.RPCNT+1
ISPL: SKIPL WI45
JSP A,IILL
45Y[ SKIPE 45MODE ;IGNORE EXCEPT IN KERNEL MODE..
JRST INEND]
DPB I,[PRI,,PS]
NEWPS
JRST INEND
ISWAB: ADDI TIME,23.
XCT ODACWT-300(I)
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
LDB T,[1000,,MB]
LSH MB,-8
45Y TRZ PS,17
45N TRZ PS,17-VF
XCT BYTRPS(MB)
DPB T,[101000,,MB]
HRRM MB,PDP11(MA)
JRST INEND
IHALT:
45Y[ SKIPE 45MODE ;ILLEGAL EXCEPT IN KERNEL MODE.
JRST IHALTL]
ADDI TIME,18.
TTOA [ASCIZ *
HALT: *]
JRST DIEDIE
WAITTS==80000. ;WAIT TOO SHORT TIME
IWAIT: SETOM WAITFL
ADDI TIME,18.
AOS INSCNT ;SINCE WILL RE-EXECUTE WAIT.
IWAIT0: CAMGE CPRI,@TRINF+1
SOJA PC,INEND ;PENDING TRAP
MOVE MB,@CLINF+1
SUB MB,TIME
CAIGE MB,WAITTS
SOJA PC,IWAITX ;TOO SHORT
CAILE MB,200000.
MOVEI MB,200000. ;WAS TOO LONG
ADD TIME,MB
TXN[ IDIVI MB,20000.
IWAITS: .SLEEP MB,
]
TXY[ IDIVI MB,10000.
IMULI MB,30.
MOVE A,MB
IWAITS: DISMS
]
JRST IWAIT0
IWAITX: MOVE TIME,@CLINF+1
JRST INEND
WAITFL: 0
IRESET:
45Y[ SKIPE 45MODE ;IGNORE UNLESS KERNEL MODE
JRST INEND]
ADDI TIME,200000.
PUSHJ P,XRESET
JRST INEND
XRESET: PUSHJ P,ZLK
TXN PUSHJ P,ZPK
SKIPE WTK
PUSHJ P,ZTK
SKIPE WTP
PUSHJ P,ZTP
TXN[
SKIPE WPR
PUSHJ P,ZPR
SKIPE WPP
PUSHJ P,ZPP
]
SKIPE WEAE
PUSHJ P,AEAE
SKIPE WI45
PUSHJ P,ZI45
TXN[ SKIPE WNGDIS
PUSHJ P,ANGDIS
SKIPE WET
PUSHJ P,ZET
SKIPE DMCNT
PUSHJ P,ZDM
SKIPE WRK
CALL ZRK
JRST ZDF
]
TXY POPJ P,
IRTT: SKIPL WI45
JSP A,IILL
TDZA MB,MB
IRTI: SETO MB,
ADDI TIME,48.
HRRZ MA,R6
TRNE MA,1
JSP A,BOUNDE
LSH MA,-1
45Y MOVE TT,MA
45Y 45DRMA
SKIPGE PC,PDP11(MA)
JSP D,MTRAPR
TRNE PC,1
JSP D,DBNDE
LSH PC,-1
45N AOS TT,MA
45Y AOS MA,TT
AOJ TT,
45DRMA
DPB TT,[011700,,R6]
45N SKIPGE PS,PDP11(MA)
45Y SKIPGE TT,PDP11(MA)
JSP D,MTRAPR
;IN 11-45, PROTECT CMODE,PMODE,REG SET, PRIORITY.
45Y[ SKIPN 45MODE ;BUT NOT IN KERNEL MODE.
TDZA PS,PS
ANDI PS,45MMDS+340 ;IOR THE OLD MODES WITH SPEC'D MODES.
TRNN PS,100000 ;IF HAD BEEN IN USER MODE,
TRZA PS,340
TRZ TT,340 ;DON'T CHANGE PRIORITY.
IORI PS,(TT) ]
NEWPS
JUMPL MB,IRTI1
TRNN PS,TF ;FOR RTT, SUPRESS T TRAP.
JRST IRTI1
MOVE A,[LDB T,[061200,,I]]
MOVEM A,TRPMOD
MOVEI A,PSTRB ;DO 1 INSN THEN REEXAMINE PS.
MOVE C,TIME
AOJ C,
CALL CTRDES
IRTI1: OBRAN1
ICLR: ADDI TIME,23.
XCT ODACWT-5000(I)
TRZ PS,13
TRO PS,ZF
SKIPGE PDP11(MA)
JSP D,MTRAPW
HLLZS PDP11(MA)
JRST INEND
ICOM: ADDI TIME,23.
XCT ODACWT-5100(I)
TRO PS,CF
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
TRC MB,177777
HRRM MB,PDP11(MA)
IZNEND
IINC: ADDI TIME,23.
XCT ODACWT-5200(I)
TRZ PS,16
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
AOS MB
ANDI MB,177777
HRRM MB,PDP11(MA)
CAIN MB,100000 ;CORRECT
JRST IINC2
IZMEND
IINC2: TRO PS,VF\NF
JRST INEND
IDEC: ADDI TIME,23.
XCT ODACWT-5300(I)
TRZ PS,16
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
SOS MB
ANDI MB,177777
HRRM MB,PDP11(MA)
CAIN MB,77777
JRST IDEC2
IZMEND
IDEC2: TRO PS,VF
JRST INEND
INEG: ADDI TIME,23.
XCT ODACWT-5400(I)
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
MOVNS MB
ANDI MB,177777
HRRM MB,PDP11(MA)
TRZ PS,17
SKIPE MB
TRO PS,CF
CAIN MB,100000
JRST INEG2
IZMEND
INEG2: TRO PS,VF\NF
JRST INEND
ITST: ADDI TIME,23.
XCT ODACRT-5700(I)
SKIPGE MB,PDP11(MA)
JSP D,MTRAPR
TRZ PS,17
IZMEND
IADC: ADDI TIME,23.
XCT ODACWT-5500(I)
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
TRNE PS,CF
JRST IADC2
IZNEND
IADC2: TRZ PS,17
AOS MB
TRZ MB,200000
HRRM MB,PDP11(MA)
JUMPE MB,INEZCF
CAIN MB,100000
JRST IADC5
IZMEND
IADC5: TRO PS,VF\NF
JRST INEND
ISBC: ADDI TIME,23.
XCT ODACWT-5600(I)
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
TRNE PS,CF
JRST ISBC2
TRZ PS,17
IZMEND
ISBC2: TRZ PS,17
SOS MB
ANDI MB,177777
HRRM MB,PDP11(MA)
CAIN MB,77777
JRST ISBC4
CAIN MB,177777
IORI PS,CF
IZMEND
ISBC4: TRO PS,VF
JRST INEND
45N[
DEFINE ROTPSX
XCT ROTPST(PS)
JRST INEND
TERMIN
ROTPST: REPEAT 16.,[
REPEAT 4, JRST INEND ? TRO PS,VF
REPEAT 4, TRO PS,VF ? JRST INEND
]
]
45Y[
DEFINE ROTPSX
TRNN PS,NF
XORI PS,VF
TRNN PS,CF
XORI PS,VF
JRST INEND
TERMIN ]
IROR: ADDI TIME,23.
XCT ODACWT-6000(I)
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
MOVE T,PS
TRZ PS,17
TRNE MB,1
TRO PS,CF
LSH MB,-1
TRNE T,CF
TRO MB,100000
HRRM MB,PDP11(MA)
SKIPN MB
TRO PS,ZF
TRNE MB,100000
TRO PS,NF
ROTPSX
IROL: ADDI TIME,23.
XCT ODACWT-6100(I)
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
MOVE T,PS
TRZ PS,17
TRZE MB,100000
TRO PS,CF
LSH MB,1
TRNE T,CF
TRO MB,1
HRRM MB,PDP11(MA)
SKIPN MB
TRO PS,ZF
TRNE MB,100000
TRO PS,NF
ROTPSX
IASR: ADDI TIME,23.
XCT ODACWT-6200(I)
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
TRZ PS,17
TRNE MB,1
TRO PS,CF
LSH MB,-1
TRNE MB,40000
TRO MB,100000
HRRM MB,PDP11(MA)
SKIPN MB
TRO PS,ZF
TRNE MB,100000
TRO PS,NF
ROTPSX
IASL: ADDI TIME,23.
XCT ODACWT-6300(I)
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
TRZ PS,17
TRZE MB,100000
TRO PS,CF
LSH MB,1
HRRM MB,PDP11(MA)
SKIPN MB
TRO PS,ZF
TRNE MB,100000
TRO PS,NF
ROTPSX
ISXT: SKIPL WI45
JSP A,IILL
ADDI TIME,22. ;EST
XCT ODACWT-6700(I)
SKIPGE PDP11(MA)
JSP D,MTRAPW
TRNE PS,NF
JRST ISXT2
TRO PS,ZF
HLLZS PDP11(MA)
TRZ PS,VF
JRST INEND
ISXT2: TRZ PS,ZF\VF
MOVEI MB,177777
HRRM MB,PDP11(MA)
JRST INEND
IMOV: ADDI TIME,23.
XCT OSACWT-100(T)
SKIPGE MB,PDP11(MA)
JSP D,MTRAPR
ANDI I,77
XCT OD2CWT(I)
SKIPGE PDP11(MA)
JSP D,MTRAPW
HRRM MB,PDP11(MA)
IZNEND
ICMP: ADDI TIME,22. ;TIME APPROX
XCT OSACWT-200(T)
SKIPGE MB,PDP11(MA)
JSP D,MTRAPR
LSH MB,20.
ANDI I,77
XCT OD2CWT(I)
SKIPGE TT,PDP11(MA)
JSP D,MTRAPR
LSH TT,20.
ICMPB2: SETCMM MB
JFCL 17,.+1
ADD MB,TT
SETCMM MB
TRZ PS,17
JFCL 10,ICMP2
JFCL 4,ICMP4
JUMPG MB,INEND
JUMPL MB,INENEG
TRO PS,ZF
JRST INEND
ICMP2: TROA PS,VF
ICMP4: TROA PS,CF
JFCL 4,.-1
JUMPG MB,INEND
JUMPL MB,INENEG
TRO PS,ZF
JRST INEND
IBIT: ADDI TIME,28. ;TIME APPROX
XCT OSACWT-300(T)
SKIPGE MB,PDP11(MA)
JSP D,MTRAPR
ANDI I,77
XCT OD2CWT(I)
SKIPGE TT,PDP11(MA)
JSP D,MTRAPR
AND MB,TT
IZNEND
IBIC: ADDI TIME,29.
XCT OSACWT-400(T)
SKIPGE MB,PDP11(MA)
JSP D,MTRAPR
ANDI I,77
XCT OD2CWT(I)
SKIPGE TT,PDP11(MA)
JSP D,MTRPW
ANDCA MB,TT
HRRM MB,PDP11(MA)
IZNEND
IXOR: SKIPL WI45
JSP A,IILL
ADDI TIME,23. ;EST
CAIN T,747 ;R7 AS SOURCE IS SPECIAL.
SKIPA MB,PC
SKIPA MB,R0-740(T)
LSH MB,1 ;R7 MUST BE SHIFTED, BUT NOT OTHER ACS.
ANDI I,77
XCT OD2CWT(I)
SKIPGE TT,PDP11(MA)
JSP D,MTRPW
XOR MB,TT
HRRM MB,PDP11(MA)
IZNEND
IIMUL: SKIPL WI45
JSP A,IILL
ADDI TIME,80. ;EST
HRRZ MB,R0-700(T)
TRNE MB,100000
ORCMI MB,177777
ANDI I,77
XCT OD2CRT(I)
SKIPGE TT,PDP11(MA)
JSP D,MTRAPR
TRNE TT,100000
ORCMI TT,177777
TRZ PS,17
IMUL MB,TT
SKIPN MB
TRO PS,ZF
ROT MB,-20
DPB MB,[2000,,R0-700(T)]
TRO T,1
ROT MB,20
DPB MB,[2000,,R0-700(T)]
JUMPE MB,INEND
CAME MB,[-1]
TRO PS,CF
JRST INEND
IIDIV: SKIPL WI45
JSP A,IILL
ADDI TIME,160. ;EST
TRZ PS,17
ANDI I,77
XCT OD2CRT(I)
SKIPGE TT,PDP11(MA)
JSP D,MTRAPR
TRNN T,177777
JRST IIDIV2
TRNE TT,100000
ORCMI TT,177777
HRRZ MB,R0-710(T)
TRNE MB,100000
ORCMI MB,177777
MOVE D,T
TRO T,1
HRRZ MA,R0-710(T)
ASH MB,20
IOR MB,MA
IDIV MB,TT
CAML MB,[-1,,600000]
CAIL MB,100000
JRST IIDIV4
DPB MB,[2000,,R0-710(D)]
TRO D,1
DPB MA,[2000,,R0-710(D)]
IZNEND
IIDIV2: SUBI TIME,120. ;DIVIDE BY ZERO
TRO PS,VF\CF
JRST INEND
IIDIV4: SUBI TIME,80. ;OVERFLOW
TRO PS,VF
JRST INEND
ISOB: SKIPL WI45
JSP A,IILL
ADDI TIME,23. ;EST
HRRZ MB,R0-770(T)
SOJE MB,ISOB2
HRRM MB,R0-770(T)
ANDI I,77
SUB PC,I
ANDI PC,77777
JRST INEND
ISOB2: ANDI MB,177777
HRRM MB,R0-770(T)
JRST INEND
IASH: SKIPL WI45
JSP A,IILL
ADDI TIME,24. ;EST
HRRZ MB,R0-720(T)
LSH MB,2
HRREI MB,(MB)
ANDI I,77
XCT OD2CRT(I)
SKIPGE I,PDP11(MA)
JSP D,MTRAPR
TRNE I,40
JRST IASH2
ANDI I,77
HLRZ TT,MB
ASH MB,(I)
TRZ PS,17
TLNE MB,1
TRO PS,CF
XCT (TT)[CAMGE MB,[-400000]
CAIL MB,400000]+1
TRO PS,VF
IASH4: LSH MB,-2
DPB MB,[2000,,R0-720(T)]
IZMEND
IASH2: TRO I,777700
ASH MB,(I)
TRZ PS,17
TRNE MB,2
TRO PS,CF
JRST IASH4
IASHC: SKIPL WI45
JSP A,IILL
ADDI TIME,30. ;EST
HRL TT,R0-730(T)
SAVE T
TRO T,1
HRRZ MB,R0-730(T)
ASH MB,2
HLL MB,TT
LSH MB,2
ANDI I,77
XCT OD2CRT(I)
SKIPGE I,PDP11(MA)
JSP D,MTRAPR
ANDI I,77
TRNE I,40
JRST IASHC2
ASH MB,-2(I)
TRZ PS,17
TLNE MB,200000
TRO PS,CF
XOR TT,MB
TLNE MB,100000
TRO PS,VF
IASHC4: SKIPN MB
TRO PS,ZF
REST D
ROT MB,-22
DPB MB,[2000,,R0-730(D)]
ROT MB,20
TRO D,1
DPB MB,[2000,,R0-730(D)]
TLNE MB,100000
JRST INENEG
JRST INEND
IASHC2: TRO I,777700
ASH MB,-2(I)
TRZ PS,17
TRNE MB,2
TRO PS,CF
JRST IASHC4
45Y[
IMFPI: ANDI I,77
TRNN I,70 ;REGISTER DESTINATIONS SPECIAL.
JRST IMFPD3
XCT JD2CWT(I) ;CALC. ADDRESS, IN CURRENT MODE.
LDB T,[45PMOD,,PS] ;FIND WHICH MODE TO MOVE FROM.
IMFPD5: LDB D,[SEGBP,,MA]
XCT @IMFPI1(T) ;THESE INSNS DO 45IRMA BUT IN THAT MODE.
XCT 45FDA,@IMFPI2(T)
JSP A,45ASL
IMFPD0: SKIPGE MB,PDP11(MA) ;GET THE LOCATION MAPPED.
JSP D,MTRAPR
HRRZ MA,R6
SUBI MA,2
ANDI MA,177777 ;PREPARE TO PUSH ON STACK.
HRRZI TT,(MA)
LSH MA,-1
45DWMA 45FDA
SKIPGE PDP11(MA)
JSP D,MTRAPW
HRRM MB,PDP11(MA)
HRRM TT,R6
IZNEND ;SET FLAGS & RETURN.
IMFPD3: LDB T,[45PMOD,,PS]
CAME T,45MODE
CAIE I,6 ;FOR REGISTER 6 IN SOME OTHER MODE,
JRST IMFPD4
MOVEI MA,45REG6-PDP11(T) ;FIND IT IN ITS SPECIAL HOME.
JRST IMFPD0
IMFPD4: MOVEI T,1(I) ;ANY OTHER REGISTER DEST, PRETEND TO
MOVEI I,26
JRST IMOV ;BE A MOV INSN.
IMFPD: ANDI I,77
TRNN I,70
JRST IMFPD3
XCT JD2CWT(I)
LDB T,[45PMOD,,PS]
MOVE D,45DSNB(T) ;IF PREV. MODE'S DATA SPACE IS DISABLED
TDNN D,RSSR3 ;REFER TO I SPACE INSTEAD.
JRST IMFPD5
LDB D,[SEGBP,,MA]
XCT 1,@IMFPD1(T)
XCT 45FDA,@IMFPD2(T)
JSP A,45ASL
JRST IMFPD0
IMFPI1: 45IRK1(D) ? 45IRS1(D) ? @45IWXX ? 45IRU1(D)
IMFPI2: 45IRK2(D) ? 45IRS2(D) ? @45IWXX ? 45IRU2(D)
IMFPD1: 45DRK1(D) ? 45DRS1(D) ? @45IWXX ? 45DRU1(D)
IMFPD2: 45DRK2(D) ? 45DRS2(D) ? @45IWXX ? 45DRU2(D)
IRPS AA,,I D
IFE .IRPCN,IMTPI:
.ELSE IMTPD: ;NOT IMTP!AA: SO THAT TECO @ WILL SEE LABEL.
HRRZ MA,R6
LSH MA,-1
45DRMA ;GET THE WD ON BOTTOM OF STACK.
SKIPGE MB,PDP11(MA)
JSP D,MTRAPR
HRRZ MA,R6 ;INCREMENT STACK PTR.
ADDI MA,2
DPB MA,[2000,,R6]
ANDI I,77
TRNN I,70
JRST IMTPI3 ;SPECIAL FOR REGISTER DESTINATION.
SETOM IMTPR6 ;PAGE FAULT SHOULD KNOW R6 WAS INCR'D.
XCT JD2CWT(I) ;NOW CALCULATE THE ADDR, IN CURRENT MODE,
LDB T,[45PMOD,,PS]
IFN .IRPCN,[MOVE D,45DSNB(T) ;IF MTPD BUT PREVIOUS MODE'S D-SPACE DISABLED,
TDNN D,RSSR3
JRST IMTPD8] ;REFER TO I-SPACE INSTEAD.
.ELSE IMTPD8:
LDB D,[SEGBP,,MA]
XCT .IRPCN,@IMTP!AA!1(T)
XCT 45FDA,@IMTP!AA!2(T) ;45MTP SAYS R6 WAS INCREMENTED (IN CASE PG FLT)
JSP A,45ASL
SETZM IMTPR6
IMTP!AA!7: SKIPGE PDP11(MA)
JSP D,MTRAPW
HRRM MB,PDP11(MA)
IZNEND
IMTP!AA!1:
45!AA!WK1(D) ? 45!AA!WS1(D) ? @45IWXX ? 45!AA!WU1(D)
IMTP!AA!2:
45!AA!WK2(D) ? 45!AA!WS2(D) ? @45IWXX ? 45!AA!WU2(D)
TERMIN
IMTPI3: CAIE I,6 ;MTPI SAME AS MTPD FOR REGISTER.
JRST IMTPI4
LDB T,[45PMOD,,PS] ;REGISTER IS R6,
CAMN T,45MODE ;IF CURRENT MD = PREV, FIND R6 LIKE OTHER REGS.
JRST IMTPI5
MOVEI MA,45REG6-PDP11(T) ;ELSE FIND IT WHERE IT'S SWAPPED OUT.
JRST IMTPI7
IMTPI4: CAIN I,7
JRST IMTPI6 ;MTPI %7
IMTPI5: MOVEI MA,R0-PDP11(I) ;DEST. IS ORDINARY REGISTER.
JRST IMTPI7
IMTPI6: ROT MB,-1 ;MTPI %7
HRRZ PC,MB
JUMPGE MB,.+2
JSP D,DBNDE ;CAUSE ABORT BEFORE NEXT INSN FOR ODD PC.
IZNEND
IMTPR6: 0 ;-1 DURING IMTPI, IMTPD SAYING R6 WAS INCR'D
;SO SSR1 CAN BE SET RIGHT IN CASE PAGE FAULT.
] ;END 45Y
45N IMFPI==I1ILL ? IMFPD==I1ILL ? IMTPI==I1ILL ? IMTPD==I1ILL
IADD: ADDI TIME,23.
XCT OSACWT-600(T)
SKIPGE MB,PDP11(MA)
JSP D,MTRAPR
LSH MB,20.
ANDI I,77
XCT OD2CWT(I)
SKIPGE TT,PDP11(MA)
JSP D,MTRPW
LSH TT,20.
JFCL 17,.+1
ADD MB,TT
LSH MB,-2
HLRM MB,PDP11(MA)
TRZ PS,17
JFCL 10,IADD2
JFCL 4,IADD4
TLNE MB,100000 ;DATA IN LEFT HALF
JRST INENEG
TLNN MB,177777
TRO PS,ZF
JRST INEND
IADD2: TROA PS,VF
IADD4: TROA PS,CF
JFCL 4,.-1
TLNE MB,100000 ;DATA IN LEFT HALF
JRST INENEG
TLNN MB,177777
TRO PS,ZF
JRST INEND
ISUB: ADDI TIME,23.
XCT OSACWT-1600(T)
SKIPGE MB,PDP11(MA)
JSP D,MTRAPR
LSH MB,20.
ANDI I,77
XCT OD2CWT(I)
SKIPGE TT,PDP11(MA)
JSP D,MTRPW
LSH TT,20.
SETCMM TT
JFCL 17,.+1
ADD MB,TT
SETCMM MB
LSH MB,-2
HLRM MB,PDP11(MA)
TRZ PS,17
JFCL 10,IADD2
JFCL 4,IADD4
TLNE MB,100000 ;DATA IN LEFT HALF
JRST INENEG
TLNN MB,177777
TRO PS,ZF
JRST INEND
IBIS: ADDI TIME,23.
XCT OSACWT-500(T)
SKIPGE MB,PDP11(MA)
JSP D,MTRAPR
ANDI I,77
XCT OD2CWT(I)
SKIPGE PDP11(MA)
JSP D,MTRPW
IORB MB,PDP11(MA)
IZNEND
IBPL: ADDI TIME,15.
TRNE PS,NF
JRST INEND
OBRANC 100000
IBMI: ADDI TIME,15.
TRNN PS,NF
JRST INEND
OBRANC 100400
IBHI: ADDI TIME,15.
TRNE PS,CF\ZF
JRST INEND
OBRANC 101000
IBLOS: ADDI TIME,15.
TRNN PS,CF\ZF
JRST INEND
OBRANC 101400
IBVC: ADDI TIME,15.
TRNE PS,VF
JRST INEND
OBRANC 102000
IBVS: ADDI TIME,15.
TRNN PS,VF
JRST INEND
OBRANC 102400
IBCC: ADDI TIME,15.
TRNE PS,CF
JRST INEND
OBRANC 103000
IBCS: ADDI TIME,15.
TRNN PS,CF
JRST INEND
OBRANC 103400
TRO PS,NF ;-1
BYTEPS: TRO PS,ZF
REPEAT 177,JRST INEND
REPEAT 200,TRO PS,NF
TRO PS,ZF ;400
TRO PS,NF
BYTVPS: TRO PS,ZF
REPEAT 177,JFCL
IORI PS,NF\VF
REPEAT 177,TRO PS,NF
TRO PS,ZF
BYTRPS: TRO PS,ZF
REPEAT 177,JFCL
REPEAT 200,TRO PS,NF
ICLRB: ADDI TIME,23.
XCT ODACBW-105000(I)
MOVEI X,0
TRZ PS,13
TRO PS,4
SKIPGE PDP11(MA)
JSP D,MTRAPW
MOVEI MB,0
DPB MB,11BYTE(X)
JRST INEND
ICOMB: ADDI TIME,23.
XCT ODACBW-105100(I)
MOVEI X,0
TRZ PS,16
TRO PS,CF
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
XCT 11BFIX(X)
TRC MB,377
DPB MB,11BYTE(X)
XCT BYTEPS(MB)
JRST INEND
IINCB: ADDI TIME,23.
XCT ODACBW-105200(I)
MOVEI X,0
TRZ PS,16
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
XCT 11BFIX(X)
AOS MB
DPB MB,11BYTE(X)
XCT BYTVPS(MB)
JRST INEND
IDECB: ADDI TIME,23.
XCT ODACBW-105300(I)
MOVEI X,0
TRZ PS,16
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
XCT 11BFIX(X)
SOS MB
DPB MB,11BYTE(X)
CAIN MB,177
TROA PS,VF
XCT BYTEPS(MB)
JRST INEND
INEGB: ADDI TIME,23.
XCT ODACBW-105400(I)
MOVEI X,0
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
XCT 11BFIX(X)
MOVNS MB
DPB MB,11BYTE(X)
ANDI MB,377
TRZ PS,17
CAIE MB,
TROA PS,CF
TROA PS,ZF
ISBCB4: XCT BYTVPS(MB)
JRST INEND
ITSTB: ADDI TIME,23.
XCT ODACBR-105700(I)
MOVEI X,0
SKIPGE MB,PDP11(MA)
JSP D,MTRAPR
XCT 11BFIX(X)
TRZ PS,17
XCT BYTEPS(MB)
JRST INEND
IADCB: ADDI TIME,23.
XCT ODACBW-105500(I)
MOVEI X,0
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
XCT 11BFIX(X)
TRNE PS,CF
JRST IADCB2
TRZ PS,17
XCT BYTEPS(MB)
JRST INEND
IADCB2: TRZ PS,17
AOS MB
DPB MB,11BYTE(X)
CAIN MB,400
TROA PS,ZF\CF
XCT BYTVPS(MB)
JRST INEND
ISBCB: ADDI TIME,23.
XCT ODACBW-105600(I)
MOVEI X,0
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
XCT 11BFIX(X)
TROE PS,CF
JRST ISBCB2
TRZ PS,17
XCT BYTEPS(MB)
JRST INEND
ISBCB2: TRZ PS,16
SOS MB
DPB MB,11BYTE(X)
JUMPN MB,ISBCB4
XORI PS,ZF\CF
JRST INEND
IRORB: ADDI TIME,23.
XCT ODACBW-106000(I)
MOVEI X,0
SKIPE X
ADDI TIME,6 ;1.2
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
XCT 11BFIX(X)
MOVE T,PS
TRZ PS,17
TRNE MB,1
TRO PS,CF
LSH MB,-1
TRNE T,CF
TRO MB,200
DPB MB,11BYTE(X)
XCT BYTRPS(MB)
ROTPSX
IROLB: ADDI TIME,23.
XCT ODACBW-106100(I)
MOVEI X,0
SKIPE X
ADDI TIME,6 ;1.2
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
XCT 11BFIX(X)
MOVE T,PS
TRZ PS,17
TRZE MB,200
TRO PS,CF
LSH MB,1
TRNE T,CF
TRO MB,1
DPB MB,11BYTE(X)
XCT BYTRPS(MB)
ROTPSX
IASRB: ADDI TIME,23.
XCT ODACBW-106200(I)
MOVEI X,0
SKIPE X
ADDI TIME,6 ;1.2
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
XCT 11BFIX(X)
TRZ PS,17
TRNE MB,1
TRO PS,CF
LSH MB,-1
TRNE MB,100
TRO MB,200
DPB MB,11BYTE(X)
XCT BYTRPS(MB)
ROTPSX
IASLB: ADDI TIME,23.
XCT ODACBW-106300(I)
MOVEI X,0
SKIPE X
ADDI TIME,6 ;1.2
SKIPGE MB,PDP11(MA)
JSP D,MTRPW
XCT 11BFIX(X)
TRZ PS,17
TRZE MB,200
TRO PS,CF
LSH MB,1
DPB MB,11BYTE(X)
XCT BYTRPS(MB)
ROTPSX
45Y[
ROTPST: REPEAT 16.,[REPEAT 4,[JRST INEND
TRO PS,VF
]
REPEAT 4,[TRO PS,VF
JRST INEND
]]
]
DEFINE IZZBND
TRZ PS,NF\ZF\VF
ANDI MB,377
XCT BYTEPS(MB)
JRST INEND
TERMIN
IMOVB: ADDI TIME,23.
XCT OSACBT-1100(T)
ANDI I,77
XCT OD2CBW(I)
JRST IMOVBR ;REGISTER DESTINATION
SKIPGE PDP11(MA)
JSP D,MTRAPW
DPB MB,11BYTE(X)
IZZBND
IMOVBR: ANDI MB,377
TRNE MB,200
TRO MB,177400
SKIPGE PDP11(MA)
JSP D,MTRAPW
HRRM MB,PDP11(MA)
IZZBND
IMFPS: ADDI TIME,23. ; EST.
MOVE MB,PS
XCT OD2CBW-106700(I)
JRST IMOVBR ; REGISTER DESTINATION
SKIPGE PDP11(MA)
JSP D,MTRAPW
DPB MB,11BYTE(X)
IZZBND
IMTPS: ADDI TIME,23. ; EST.
XCT ODACBR-106400(I)
MOVEI X,0
SKIPGE MB,PDP11(MA)
JSP D,MTRAPR
XCT 11BFIX(X)
DPB MB,[1000,,PS]
TRZ PS,NF\ZF\VF
XCT BYTEPS(MB)
NEWPS
JRST INEND
ICMPB: ADDI TIME,22. ;APPROX
XCT OSACBT-1200(T)
LSH MB,28.
ANDI I,77
XCT OD2CBR(I)
MOVEI X,0
SKIPGE PDP11(MA)
JSP D,MTRAPR
LDB TT,11BYTE(X)
LSH TT,28.
JRST ICMPB2
IBITB: ADDI TIME,28.
XCT OSACBT-1300(T)
ANDI I,77
XCT OD2CBR(I)
MOVEI X,0
SKIPGE TT,PDP11(MA)
JSP D,MTRAPR
SKIPE X
LSH TT,-8
AND MB,TT
IZZBND
IBICB: ADDI TIME,29.
XCT OSACBT-1400(T)
ANDI I,77
XCT OD2CBW(I)
MOVEI X,0
SKIPGE TT,PDP11(MA)
JSP D,MTRPW
SKIPE X
LSH TT,-8
ANDCA MB,TT
DPB MB,11BYTE(X)
IZZBND
IBISB: ADDI TIME,23.
XCT OSACBT-1500(T)
ANDI I,77
XCT OD2CBW(I)
MOVEI X,0
SKIPGE TT,PDP11(MA)
JSP D,MTRPW
SKIPE X
LSH TT,-8
IOR MB,TT
DPB MB,11BYTE(X)
IZZBND
11BYTE: 1000,,PDP11(MA)
101000,,PDP11(MA)
11BFIX: ANDI MB,377
LSH MB,-8
OSACBT: REPEAT 7,HRRZ MB,R0+.RPCNT
JSP E,SABPC
REPEAT 7,JSP E,SABRD
JSP E,SABRD7
REPEAT 6,JSP E,SACBI
JSP E,SACBI6
JSP E,SACBI7
REPEAT 7,JSP E,SABID
JSP E,SABID7
REPEAT 6,JSP E,SACBD
JSP E,SACBD6
JSP E,SACBD7
REPEAT 6,JSP E,SABDD
JSP E,SABDD6
JSP E,SABDD7
REPEAT 7,JSP E,SACBX
JSP E,SACBX7
REPEAT 7,JSP E,SABXD
JSP E,SABXD7
DEFINE SACBXX X1
LSHC MA,-1
45DRMA X1
SKIPGE MB,PDP11(MA)
JSP D,MTRAPR
JUMPGE X,(E)
ADDI TIME,6
LSH MB,-8
JRST (E)
TERMIN
SABPC: HRRZ MB,PC
LSH MB,1
JRST (E)
SABRD: ADDI TIME,15.
ANDI T,77
MOVE MA,R0-10(T)
SACBXX
SABRD7: ADDI TIME,15.
45Y MOVE MA,PC
45Y 45IRMA
45Y SKIPGE MB,PDP11(MA)
45N SKIPGE MB,PDP11(PC)
JSP D,MTRAPR
JRST (E)
SACBI: ADDI TIME,15.
ANDI T,77
MOVE MA,R0-20(T)
MOVEI TT,1(MA)
ANDI TT,177777
HRRM TT,R0-20(T)
SACBXX 45FSA
SACBI6: ADDI TIME,15.
HRRZ MA,R6
MOVEI TT,2(MA)
ANDI TT,177777
HRRM TT,R6
SACBXX 45FSA
SACBI7: ADDI TIME,15.
45Y[ MOVE MA,PC
45IRMA
SKIPGE MB,PDP11(MA)]
45N SKIPGE MB,PDP11(PC)
JSP D,MTRAPR
AOJA PC,(E)
SABID: ADDI TIME,27.
ANDI T,77
MOVE TT,R0-30(T)
MOVEI MA,2(TT)
ANDI MA,177777
HRRM MA,R0-30(T)
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
45DRTT 45FSA
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
SACBXX 45FSA
SABID7: ADDI TIME,27.
45PCINC TT,MA
SACBXX
SACBD: ADDI TIME,15.
ANDI T,77
MOVE MA,R0-40(T)
SOJGE MA,.+2
MOVEI MA,177777
HRRM MA,R0-40(T)
SACBXX 45FSA
SACBD6: ADDI TIME,15.
HRRZ MA,R6
SUBI MA,2
CAMGE MA,RSLR1
JSP D,HPDLOV
ANDI MA,177777
HRRM MA,R6
SACBXX 45FSA
SACBD7: ADDI TIME,15.
SOSGE MA,PC
JRST SABD72
SABD74: 45IRMA
SKIPGE MB,PDP11(MA)
JSP D,MTRAPR
JRST(E)
SABD72: MOVEI MA,77777
MOVEI PC,77777
JRST SABD74
SABDD: ADDI TIME,27.
ANDI T,77
MOVE TT,R0-50(T)
SUBI TT,2
ANDI TT,177777
HRRM TT,R0-50(T)
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
SBDD72: 45DRTT 45FSA
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
SACBXX 45FSA
SABDD6: ADDI TIME,27.
HRRZ TT,R6
SUBI TT,2
CAIGE TT,RSLR1
JSP D,HPDLO1
ANDI TT,177777
HRRM TT,R6
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
45DRTT 45FSA
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
SACBXX 45FSA
SABDD7: ADDI TIME,27.
SOSL TT,PC
JRST SBDD72
MOVEI PC,77777
MOVEI TT,77777
JRST SBDD72
SACBX: ADDI TIME,27.
45PCINC TT,MA
ANDI T,77
ADD MA,R0-60(T)
TRZ MA,200000
SACBXX
SACBX7: ADDI TIME,27.
45PCINC TT,MA
LSHC MA,-1
ADD MA,PC
TRZ MA,100000
45DRMA
SKIPGE MB,PDP11(MA)
JSP D,MTRAPR
JUMPGE X,(E)
ADDI TIME,6
LSH MB,-8
JRST (E)
SABXD: ADDI TIME,39.
45PCINC MA,TT
ANDI T,77
ADD TT,R0-70(T)
TRZ TT,200000
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
45DRTT
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
SACBXX
SABXD7: ADDI TIME,39.
45PCINC MA,TT
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
ADD TT,PC
TRZ TT,100000
45DRTT
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
SACBXX
IF1 [
;ASSEMBLE ADDRESSING ROUTINES FOR DESTINATION BYTE.
;TYPE IS R OR W FOR READ OR WRITE.
DEFINE DACBZZ TYPE
ODACB!TYPE:
REPEAT 8,MOVEI MA,R0-PDP11+.RPCNT
REPEAT 6,JSP E,DACB!TYPE-DACBR+DABRD
JSP E,DACB!TYPE-DACBR+DABRD
JSP E,DACB!TYPE-DACBR+DABRD7
REPEAT 6,JSP E,DACB!TYPE-DACBR+DACBI
JSP E,DACB!TYPE-DACBR+DACBI6
JSP E,DACB!TYPE-DACBR+DACBI7
REPEAT 6,JSP E,DACB!TYPE-DACBR+DABID
JSP E,DACB!TYPE-DACBR+DABID
JSP E,DACB!TYPE-DACBR+DABID7
REPEAT 6,JSP E,DACB!TYPE-DACBR+DACBD
JSP E,DACB!TYPE-DACBR+DACBD6
JSP E,DACB!TYPE-DACBR+DACBD7
REPEAT 6,JSP E,DACB!TYPE-DACBR+DABDD
JSP E,DACB!TYPE-DACBR+DABDD6
JSP E,DACB!TYPE-DACBR+DABDD7
REPEAT 6,JSP E,DACB!TYPE-DACBR+DACBX
JSP E,DACB!TYPE-DACBR+DACBX
JSP E,DACB!TYPE-DACBR+DACBX7
REPEAT 6,JSP E,DACB!TYPE-DACBR+DABXD
JSP E,DACB!TYPE-DACBR+DABXD
JSP E,DACB!TYPE-DACBR+DABXD7
OD2CB!TYPE:
REPEAT 8,MOVEI MA,R0-PDP11+.RPCNT
REPEAT 6,JSP E,DACB!TYPE-DACBR+D2BRD
JSP E,DACB!TYPE-DACBR+D2BRD
JSP E,DACB!TYPE-DACBR+DABRD7
REPEAT 6,JSP E,DACB!TYPE-DACBR+D2CBI
JSP E,DACB!TYPE-DACBR+DACBI6
JSP E,DACB!TYPE-DACBR+DACBI7
REPEAT 6,JSP E,DACB!TYPE-DACBR+D2BID
JSP E,DACB!TYPE-DACBR+D2BID
JSP E,DACB!TYPE-DACBR+DABID7
REPEAT 6,JSP E,DACB!TYPE-DACBR+D2CBD
JSP E,DACB!TYPE-DACBR+DACBD6
JSP E,DACB!TYPE-DACBR+DACBD7
REPEAT 6,JSP E,DACB!TYPE-DACBR+D2BDD
JSP E,DACB!TYPE-DACBR+DABDD6
JSP E,DACB!TYPE-DACBR+DABDD7
REPEAT 6,JSP E,DACB!TYPE-DACBR+D2CBX
JSP E,DACB!TYPE-DACBR+D2CBX
JSP E,DACB!TYPE-DACBR+DACBX7
REPEAT 6,JSP E,DACB!TYPE-DACBR+D2BXD
JSP E,DACB!TYPE-DACBR+D2BXD
JSP E,DACB!TYPE-DACBR+DABXD7
DEFINE DACBXX X1
IDIVI MA,2
45D!TYPE!MA [<IFB X1,[45FDN]+X1>]
JUMPE X,1(E)
ADDI TIME,6
JRST 1(E)
TERMIN
DACB!TYPE: OFFSET DACBR-.
;THESE LABELS ALL GET ASSEMBLED TWICE.
;THE OFFSET IS SO THEY GET THE SAME VALUE BOTH TIMES.
;THE ONLY DIFFERENCE BETWEEN THE TWO SETS OF ROUTINES
;IS THAT ONE HAS 45DRMA, ETC. AND THE OTHER HAS 45DWMA, ETC.
DABRD: ANDI I,77
D2BRD: ADDI TIME,14.
MOVE MA,R0-10(I)
DACBXX
DABRD7: ADD TIME,14.
HRRZ MA,PC
45I!TYPE!MA
JRST (E)
DACBI: ANDI I,77
D2CBI: ADDI TIME,14.
MOVE MA,R0-20(I)
MOVEI TT,1(MA)
ANDI TT,177777
HRRM TT,R0-20(I)
DACBXX 45FDA
DACBI6: ADDI TIME,14.
HRRZ MA,R6
MOVEI TT,2(MA)
ANDI TT,177777
HRRM TT,R6
DACBXX 45FDA
DACBI7: ADDI TIME,14.
MOVE MA,PC
45I!TYPE!MA
AOJA PC,(E)
DABID: ANDI I,77
D2BID: ADDI TIME,26.
MOVE TT,R0-30(I)
MOVEI MA,2(TT)
ANDI MA,177777
HRRM MA,R0-30(I)
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
45DRTT 45FDA
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
DACBXX 45FDA
DABID7: ADDI TIME,26.
45PCINC TT,MA
DACBXX
DACBD: ANDI I,77
D2CBD: ADDI TIME,14.
MOVE MA,R0-40(I)
SOJGE MA,.+2
MOVEI MA,177777
HRRM MA,R0-40(I)
DACBXX 45FDA
DACBD6: ADDI TIME,14.
HRRZ MA,R6
SUBI MA,2
CAMGE MA,RSLR1
JSP D,HPDLOV
ANDI MA,177777
HRRM MA,R6
DACBXX 45FDA
DACBD7: ADDI TIME,14.
SOSL MA,PC
45Y JRST .+3
45N JRST (E)
MOVEI MA,77777
MOVEI PC,77777
45I!TYPE!MA
JRST (E)
DABDD: ANDI I,77
D2BDD: ADDI TIME,26.
MOVE TT,R0-50(I)
SUBI TT,2
ANDI TT,177777
HRRM TT,R0-50(I)
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
DBDD72: 45DRTT 45FDA
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
DACBXX 45FDA
DABDD6: ADDI TIME,26.
HRRZ TT,R6
SUBI TT,2
CAMGE TT,RSLR1
JSP D,HPDLO1
ANDI TT,177777
HRRM TT,R6
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
45DRTT 45FDA
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
DACBXX 45FDA
DABDD7: ADDI TIME,26.
SOSL TT,PC
JRST DBDD72
MOVEI TT,77777
MOVEI PC,77777
JRST DBDD72
DACBX: ANDI I,77
D2CBX: ADDI TIME,26.
45PCINC TT,MA
ADD MA,R0-60(I)
TRZ MA,200000
DACBXX
DACBX7: ADDI TIME,26.
45PCINC TT,MA
ADD MA,PC
ADD MA,PC
TRZ MA,200000
DACBXX
DABXD: ANDI I,77
D2BXD: ADDI TIME,38.
45PCINC MA,TT
ADD TT,R0-70(I)
TRZ TT,200000
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
45DRTT
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
DACBXX
DABXD7: ADDI TIME,38.
45PCINC MA,TT
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
ADD TT,PC
TRZ TT,100000
45DRTT
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
DACBXX
OFFSET 0
TERMIN ;END OF DACBZZ MACRO DEFINITION.
]
DACBZZ R
DACBZZ W
IF1 [
DEFINE DACWZZ TYPE
DEFINE DACWXX X1
LSHC MA,-1
45D!TYPE!MA X1
JUMPGE X,(E)
JSP A,BOUNDE
TERMIN
ODAC!TYPE!T:
REPEAT 8,MOVEI MA,R0-PDP11+.RPCNT
REPEAT 7,JSP E,DAC!TYPE-DACR+DAWRD
JSP E,DAC!TYPE-DACR+DAWRD7
REPEAT 7,JSP E,DAC!TYPE-DACR+DACWI
JSP E,DAC!TYPE-DACR+DACWI7
REPEAT 7,JSP E,DAC!TYPE-DACR+DAWID
JSP E,DAC!TYPE-DACR+DAWID7
REPEAT 6,JSP E,DAC!TYPE-DACR+DACWD
JSP E,DAC!TYPE-DACR+DACWD6
JSP E,DAC!TYPE-DACR+DACWD7
REPEAT 6,JSP E,DAC!TYPE-DACR+DAWDD
JSP E,DAC!TYPE-DACR+DAWDD6
JSP E,DAC!TYPE-DACR+DAWDD7
REPEAT 7,JSP E,DAC!TYPE-DACR+DACWX
JSP E,DAC!TYPE-DACR+DACWX7
REPEAT 7,JSP E,DAC!TYPE-DACR+DAWXD
JSP E,DAC!TYPE-DACR+DAWXD7
OD2C!TYPE!T:
REPEAT 8,MOVEI MA,R0-PDP11+.RPCNT
REPEAT 7,JSP E,DAC!TYPE-DACR+D2WRD
JSP E,DAC!TYPE-DACR+DAWRD7
REPEAT 7,JSP E,DAC!TYPE-DACR+D2CWI
JSP E,DAC!TYPE-DACR+DACWI7
REPEAT 7,JSP E,DAC!TYPE-DACR+D2WID
JSP E,DAC!TYPE-DACR+DAWID7
REPEAT 6,JSP E,DAC!TYPE-DACR+D2CWD
JSP E,DAC!TYPE-DACR+DACWD6
JSP E,DAC!TYPE-DACR+DACWD7
REPEAT 6,JSP E,DAC!TYPE-DACR+D2WDD
JSP E,DAC!TYPE-DACR+DAWDD6
JSP E,DAC!TYPE-DACR+DAWDD7
REPEAT 7,JSP E,DAC!TYPE-DACR+D2CWX
JSP E,DAC!TYPE-DACR+DACWX7
REPEAT 7,JSP E,DAC!TYPE-DACR+D2WXD
JSP E,DAC!TYPE-DACR+DAWXD7
DAC!TYPE: OFFSET DACR-.
DAWRD: ANDI I,77
D2WRD: ADDI TIME,14.
MOVE MA,R0-10(I)
DACWXX
DAWRD7: ADDI TIME,14.
MOVE MA,PC
45I!TYPE!MA
JRST (E)
DACWI: ANDI I,77
D2CWI: ADDI TIME,14.
MOVE MA,R0-20(I)
MOVEI TT,2(MA)
ANDI TT,177777
HRRM TT,R0-20(I)
DACWXX 45FDA
DACWI7: ADDI TIME,14.
MOVE MA,PC
45I!TYPE!MA
AOJA PC,(E)
DAWID: ANDI I,77
D2WID: ADDI TIME,26.
MOVE TT,R0-30(I)
MOVEI MA,2(TT)
ANDI MA,177777
HRRM MA,R0-30(I)
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
45DRTT 45FDA
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
DACWXX 45FDA
DAWID7: ADDI TIME,26.
45PCINC TT,MA
DACWXX
DACWD: ANDI I,77
D2CWD: ADDI TIME,14.
MOVE MA,R0-40(I)
SUBI MA,2
ANDI MA,177777
HRRM MA,R0-40(I)
DACWXX 45FDA
DACWD6: ADDI TIME,14.
HRRZ MA,R6
SUBI MA,2
CAMGE MA,RSLR1
JSP D,HPDLOV
ANDI MA,177777
HRRM MA,R6
DACWXX 45FDA
DACWD7: ADDI TIME,14.
SOSL MA,PC
45Y JRST .+3
45N JRST (E)
MOVEI MA,77777
MOVEI PC,77777
45I!TYPE!MA
JRST (E)
DAWDD: ANDI I,77
D2WDD: ADDI TIME,26.
MOVE TT,R0-50(I)
SUBI TT,2
ANDI TT,177777
HRRM TT,R0-50(I)
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
DWDD72: 45DRTT 45FDA
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
DACWXX 45FDA
DAWDD6: ADDI TIME,14.
HRRZ TT,R6
SUBI TT,2
CAMGE TT,RSLR1
JSP D,HPDLO1
ANDI TT,177777
HRRM TT,R6
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
45DRTT 45FDA
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
DACWXX 45FDA
DAWDD7: ADDI TIME,26.
SOSL TT,PC
JRST DWDD72
MOVEI TT,77777
MOVEI PC,77777
JRST DWDD72
DACWX: ANDI I,77
D2CWX: ADDI TIME,26.
45PCINC TT,MA
ADD MA,R0-60(I)
TRZ MA,200000
DACWXX
DACWX7: ADDI TIME,26.
45PCINC TT,MA
LSHC MA,-1
ADD MA,PC
TRZ MA,100000
45D!TYPE!MA
JUMPGE X,(E)
JSP A,BOUNDE
DAWXD: ANDI I,77
D2WXD: ADDI TIME,38.
45PCINC MA,TT
ADD TT,R0-70(I)
TRZ TT,200000
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
45DRTT
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
DACWXX
DAWXD7: ADDI TIME,38.
45PCINC MA,TT
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
ADD TT,PC
TRZ TT,100000
45DRTT
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
DACWXX
OFFSET 0
TERMIN .SEE DACWZZ
] ;END IF1
DACWZZ R
DACWZZ W
DEFINE JACWXX
LSHC MA,-1
JUMPGE X,(E)
JSP A,BOUNDE
TERMIN
JD2CWT: REPEAT 8,JSP A,ILLINS
REPEAT 7,JSP E,JAWRD
JSP E,JAWRD7
REPEAT 7,JSP E,J2CWI
JSP E,JACWI7
REPEAT 7,JSP E,JAWID
JSP E,JAWID7
REPEAT 6,JSP E,JACWD
JSP E,JACWD6
JSP E,JACWD7
REPEAT 6,JSP E,JAWDD
JSP E,JAWDD6
JSP E,JAWDD7
REPEAT 7,JSP E,JACWX
JSP E,JACWX7
REPEAT 7,JSP E,JAWXD
JSP E,JAWXD7
J2CWI: ADDI TIME,14.
MOVE MA,R0-20(I)
45N[ ADDI MA,2
TRZ MA,200000
HRRM MA,R0-20(I)
]
45Y[ MOVEI TT,2(MA)
ANDI TT,177777
HRRM TT,R0-20(I)
]
JACWXX
JACWI7: ADDI TIME,14.
45N[ AOS MA,PC
JRST (E)]
45Y[ MOVEI MA,(PC)
AOJA PC,(E)
]
JAWRD: ADDI TIME,14.
MOVE MA,R0-10(I)
JACWXX
JAWRD7: ADDI TIME,14.
MOVE MA,PC
JRST (E)
JAWID: ADDI TIME,26.
MOVE TT,R0-30(I)
MOVEI MA,2(TT)
ANDI MA,177777
HRRM MA,R0-30(I)
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
45DRTT 45FDA
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
JACWXX
JAWID7: ADDI TIME,26.
45PCINC TT,MA
JACWXX
JACWD: ADDI TIME,14.
MOVE MA,R0-40(I)
SUBI MA,2
ANDI MA,177777
HRRM MA,R0-40(I)
JACWXX
JACWD6: ADDI TIME,14.
HRRZ MA,R6
SUBI MA,2
CAMGE MA,RSLR1
JSP D,HPDLOV
ANDI MA,177777
HRRM MA,R6
JACWXX
JACWD7: ADDI TIME,14.
SOSL MA,PC
JRST (E)
MOVEI MA,77777
MOVEI PC,77777
JRST (E)
JAWDD: ADDI TIME,26.
MOVE TT,R0-50(I)
SUBI TT,2
ANDI TT,177777
HRRM TT,R0-50(I)
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
JWDD72: 45DRTT 45FDA
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
JACWXX
JAWDD6: ADDI TIME,14.
HRRZ TT,R6
SUBI TT,2
CAMGE TT,RSLR1
JSP D,HPDLO1
ANDI TT,177777
HRRM TT,R6
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
45DRTT 45FDA
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
JACWXX
JAWDD7: ADDI TIME,26.
SOSL TT,PC
JRST JWDD72
MOVEI TT,77777
MOVEI PC,77777
JRST JWDD72
JACWX: ADDI TIME,26.
45PCINC TT,MA
ADD MA,R0-60(I)
TRZ MA,200000
JACWXX
JACWX7: ADDI TIME,26.
45PCINC TT,MA
LSHC MA,-1
ADD MA,PC
TRZ MA,100000
JUMPGE X,(E)
JSP A,BOUNDE
JAWXD: ADDI TIME,38.
45PCINC MA,TT
ADD TT,R0-70(I)
TRZ TT,200000
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
45DRTT
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
JACWXX
JAWXD7: ADDI TIME,38.
45PCINC MA,TT
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
ADD TT,PC
TRZ TT,100000
45DRTT
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
JACWXX
DEFINE SACWXX X1
LSHC MA,-1
45DRMA X1
JUMPGE X,(E)
JSP A,BOUNDE
TERMIN
OSACWT: REPEAT 7,MOVEI MA,R0-PDP11+.RPCNT
JSP E,SAWPC
REPEAT 7,JSP E,SAWRD
JSP E,SAWRD7
REPEAT 7,JSP E,SACWI
JSP E,SACWI7
REPEAT 7,JSP E,SAWID
JSP E,SAWID7
REPEAT 6,JSP E,SACWD
JSP E,SACWD6
JSP E,SACWD7
REPEAT 6,JSP E,SAWDD
JSP E,SAWDD6
JSP E,SAWDD7
REPEAT 7,JSP E,SACWX
JSP E,SACWX7
REPEAT 7,JSP E,SAWXD
JSP E,SAWXD7
SAWPC: HRRZ MB,PC
LSH MB,1
JRST 2(E)
SAWRD: ANDI T,77
ADDI TIME,15.
MOVE MA,R0-10(T)
SACWXX
SAWRD7: ADDI TIME,15.
MOVE MA,PC
45IRMA
JRST (E)
SACWI: ADDI TIME,15.
ANDI T,77
MOVE MA,R0-20(T)
MOVEI TT,2(MA)
ANDI TT,177777
HRRM TT,R0-20(T)
SACWXX 45FSA
SACWI7: ADDI TIME,15.
45Y[ MOVE MA,PC
45IRMA
SKIPGE MB,PDP11(MA)]
45N SKIPGE MB,PDP11(PC)
JSP D,MTRAPR
AOJA PC,2(E)
SAWID: ADDI TIME,27.
ANDI T,77
MOVE TT,R0-30(T)
MOVEI MA,2(TT)
ANDI MA,177777
TRZ MA,200000
HRRM MA,R0-30(T)
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
45DRTT 45FSA
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
SACWXX 45FSA
SAWID7: ADDI TIME,27.
45PCINC TT,MA
SACWXX
SACWD: ADDI TIME,15.
ANDI T,77
MOVE MA,R0-40(T)
SUBI MA,2
ANDI MA,177777
HRRM MA,R0-40(T)
SACWXX 45FSA
SACWD6: ADDI TIME,15.
HRRZ MA,R6
SUBI MA,2
CAMGE MA,RSLR1
JSP D,HPDLOV
ANDI MA,177777
HRRM MA,R6
SACWXX 45FSA
SACWD7: ADDI TIME,15.
SOSL MA,PC
45Y JRST .+3
45N JRST (E)
MOVEI MA,77777
MOVEI PC,77777
45IRMA
JRST (E)
SAWDD: ADDI TIME,27.
ANDI T,77
MOVE TT,R0-50(T)
SUBI TT,2
ANDI TT,177777
HRRM TT,R0-50(T)
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
SWDD72: 45DRTT 45FSA
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
SACWXX 45FSA
SAWDD6: ADDI TIME,27.
HRRZ TT,R6
SUBI TT,2
CAMGE TT,RSLR1
JSP D,HPDLO1
ANDI TT,177777
HRRM TT,R6
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
45DRTT 45FSA
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
SACWXX 45FSA
SAWDD7: ADDI TIME,27.
SOSL TT,PC
JRST SWDD72
MOVEI TT,77777
MOVEI PC,77777
JRST SWDD72
SACWX: ADDI TIME,27.
45PCINC TT,MA
ANDI T,77
ADD MA,R0-60(T)
TRZ MA,200000
SACWXX
SACWX7: ADDI TIME,27.
45PCINC TT,MA
LSHC MA,-1
ADD MA,PC
TRZ MA,100000
45DRMA
JUMPGE X,(E)
JSP A,BOUNDE
SAWXD: ADDI TIME,39.
45PCINC MA,TT
ANDI T,77
ADD TT,R0-70(T)
TRZ TT,200000
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
45DRTT
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
SACWXX
SAWXD7: ADDI TIME,39.
45PCINC MA,TT
TRNE TT,1
JSP A,BOUNDE
LSH TT,-1
ADD TT,PC
TRZ TT,100000
45DRTT
SKIPGE MA,PDP11(TT)
JSP D,MTRAPR
SACWXX
IIOT: ADDI TIME,21.
MOVEI T,4
JSP A,TRPINS
IBPT: ADDI TIME,21.
MOVEI T,3
JSP A,TRPINS
IEMT: ADDI TIME,21.
MOVEI T,6
JSP A,TRPINS
ITRAP: ADDI TIME,21.
MOVEI T,7
JSP A,TRPINS
45Y TTRPIB:
TTRAP: MOVEI T,3 ;TRACE TRAP
JSP A,TVTRAP
LBUSER: MOVE MA,[LBUSET-4,,LBUSET-8]
BLT MA,LBUSET-1
MOVE MA,OPC
MOVEM MA,LBUSEP
MOVE MA,@(P)
MOVEM MA,LBUSEM
MOVEM TIME,LBUSET
MOVEM A,LBUSES
JRST POPJ1
BLOCK 8 ;PREVIOUS ERRORS
LBUSET: BLOCK 1
LBUSEP: BLOCK 1
LBUSES: BLOCK 1
LBUSEM: BLOCK 1 ;CLEARED AT CZTIME
CBUSS: PUSH P,PC
PUSH P,OPC
MOVEI T,0
PUSHJ P,CBUSSP
JRST CBUNOE
TTOA [ASCIZ /LAST/]
MOVEI T,-4
PUSHJ P,CBUSSP
JRST CBUSSX
TTOA [ASCIZ /PREVIOUS/]
MOVEI T,-8
PUSHJ P,CBUSSP
JRST CBUSSX
TTOA [ASCIZ /EARLIER/]
CBUSSX: POP P,OPC
TTOA [ASCIZ /CURRENT TIME: /]
PUSHJ P,CTIME
POP P,PC
RETURN
CBUSSP: SKIPN LBUSEM(T)
RETURN
AOS (P)
XCT @(P)
AOS (P)
MOVE T2,LBUSEP(T)
MOVEM T2,OPC
TTOA [ASCIZ / BUSS ERR AT 
/]
SKIPN DEBUGP
JRST CBUSP2
MOVE T2,LBUSES(T)
MOVEM T2,QA
TTOA [ASCIZ /SIM. PC. = A
/]
CBUSP2: TTOA @LBUSEM(T)
TTOA [ASCIZ / TIME: /]
MOVE T2,LBUSET(T)
JRST CBUSS2
CBUNOE: TTOA [ASCIZ /NO BUSS ERRORS
/]
JRST CBUSSX
NXMNXM: SUB P,[1,,1] ;NXM - THROW AWAY RET ADDR IN MTRAP.
PUSHJ P,LBUSER
[ASCIZ /TIME OUT/]
JRST BUSSE
45N[
ILLINS: PUSHJ P,LBUSER
[ASCIZ /ILLEGAL INSTRUCTION/]
JRST BUSSE ;ILLEGAL INSTRUCTION (JMP (JSR) %X)
]
45Y[
IHALTL: CALL LBUSER
[ASCIZ/HALT/]
JRST BUSSE
]
BOUNDE: PUSHJ P,LBUSER
[ASCIZ /BOUNDARY ERROR/]
BUSSE: SKIPE INVTRP
JRST TRPBDE
SKIPA T,[600000,,1] ;BUS ERROR (SETZ FOR HPDLOV TEST)
45Y ILLINS:
IILL: MOVEI T,2 ;RESERVED INSTRUCTION
TRPINS: PUSHJ P,TTPDFL
JRST VTRAP
TVTRAP: PUSHJ P,PDLFLS
;COME HERE TO PERFORM A VIRTUAL TRAP. <TRAP VECTOR ADDR>/4 IN T.
.SEE HPDLOV ;(IF CALLED FROM VTRAP, LOOKS AT T TO CHECK FOR BUSS ERROR TRAPS)
VTRAP: SKIPE WAITFL
AOJA PC,VTRAPW ;FINSH A WAIT INSN.
VTRAP0: SKIPE B,TRPPNT(T)
PUSHJ P,VTRPPT
SETOM INVTRP
LSH T,1
MOVE MA,T ;MA HAS WORD # OF TRAP VECTOR.
45Y[ SKIPL 45SGON ;NO PAGING => USE UNMAPPED ADDR.
JRST VTRAP5
XCT 45IRK1 ;ELSE MAP ADDR - WE KNOW IT'S IN
XCT 45IRK2 ;KERNEL I SPACE SEGMT 0.
JSP A,45ASL
VTRAP5:]
SKIPGE PDP11(MA) ;FETCH THE WORDS IN THE TRAP VECTOR.
JSP D,MTRAPR
MOVE TT,PDP11(MA)
AOS MA,T ;MUST RE-MAP THE ADDR OF THE 2ND WD.
45Y[ SKIPL 45SGON
JRST VTRAP6
XCT 45IRK1
XCT 45IRK2
JSP A,45ASL
VTRAP6:]
MOVEM PS,VTRAPS'
SKIPGE PDP11(MA)
JSP D,MTRAPR
MOVE PS,PDP11(MA) ;MUST SET PS FROM VECTOR BEFORE PUSHING
NEWPS ;SO THAT THE RIGHT R6 WILL BE USED.
45Y[ LDB D,[45CMOD,,VTRAPS] ;PUT OLD CURRENT PROCESSOR MODE
DPB D,[45PMOD,,PS]] ;INTO PREVIOUS MODE OF CURRENT PS.
ADDI TIME,72.
HRRZ MA,R6
SUBI MA,2
CAMGE MA,RSLR1
JSP D,HPDLOV
ANDI MA,177777
LSHC MA,-1
JUMPL X,BOUNDE
45DWMA
SKIPGE PDP11(MA)
JSP D,MTRAPW
MOVE MB,VTRAPS
HRRM MB,PDP11(MA) ;PUSH THE OLD PS.
HRRZ MA,R6 ;MUST RE-MAP FOR THE SECOND PUSH.
SUBI MA,4
CAMGE MA,RSLR1
JSP D,HPDLOV
ANDI MA,177777
MOVEI MB,(MA)
LSH MA,-1
45DWMA
SKIPGE PDP11(MA)
JSP D,MTRAPW
HRRM MB,R6 ;CAN UPDATE R6 NOW THAT CAN'T TAKE PAGE FAULT.
HRRM PC,PDP11(MA)
ADDM PC,PDP11(MA)
AOSN ODDPC
AOS PDP11(MA)
HRRZ PC,TT ;NOW SET PC TO WHAT WE FETCHED AT THE BEGINNING.
TRNE PC,1
JSP D,DBNDE
LSH PC,-1
SETZM INVTRP
SETZM DDONXT ;STOP IGNORING MTRAPI.
SETZM PDLFT ;NO LONGER DOING FATAL STACK OV TRAP.
SETZM PDLNFT
45N[
VTRAP4: MOVSI T,1
CAML T,@TRINF+1
JRST INBEG ;ALWAYS EXECUTE FIRST INST OF TRAP ROUTINE
MOVE B,TRINF+1
MOVE A,1(B)
SETOM 1(B)
MOVEM A,TRINF+1
XCT 2(B)
JRST VTRAP4
]
45Y JRST INEND
VTRAPW: SETZM WAITFL
SOS INSCNT
JRST VTRAP0
VTRPPT: SOJE B,VTRPP3
CRF
VTRPP1: HRRZM A,QT
LSH T,2
MOVEM T,QA
LSH T,-2
AOS OPC
TTOA [ASCIZ /TRAP THROUGH A FROM 
/]
SOS OPC
SKIPE DEBUGP
TTOA [ASCIZ/SIM. PC. =T
/]
VTRPP2: CAIL B,2
JRST CLRRUN
RETURN
BRPNT: MOVE B,TRPPNT ;(JUMP HERE FROM END OF BRANCH, JMP, ETC)
MOVEM PC,QA
ADDM PC,QA
TTOA [ASCIZ /
BRANCH:  --> A
/]
CAIL B,3
CALL CLRRUN
JRST INEND
VTRPP3: MOVE B,OPC ;MODE 1 -- JUST SAVE ADDR OF TRAP.
MOVEM B,JPC
RETURN
CDEBUG: SETCMB A,DEBUGP
SKIPL A
TTOA 1,[ASCIZ/OFF
/]
TTOA [ASCIZ/ON
/]
RETURN
DEBUGP: 0
;BUS ERROR IN PROCESSING TRAP
TRPBDE: TTOA [ASCIZ/
BUSS ERROR IN /]
MOVEI B,2
PUSHJ P,VTRPP1
SETZM INVTRP
PUSHJ P,TTPDFL
DIEDIE: PUSHJ P,CLRRUN
JRST INEND
;JSP D,HERE WHEN DETECT R6 < RSLR1, AND TT HOLDS NEW CONTENTS OF R6.
HPDLO1:
45Y[ SKIPL PDLFT ;PDL ALWAYS SEEMS OVERFLOWED DURING FATAL OV TRAP.
SKIPE 45MODE ;NO PDL OV CHECKING EXCEPT IN KERNEL MODE.
JRST (D)
MOVEI A,20(TT)
JRST HPDLO2]
;JSP D,HERE INSTEAD OF HPDLO1 IF NEW R6 IS IN MA.
HPDLOV:
45Y[ SKIPL PDLFT
SKIPE 45MODE
JRST (D)
MOVEI A,20(MA)
HPDLO2: CAMGE A,RSLR1 ;BELOW FATAL LIMIT?
JRST PDLTR1 ;YES - IF K MODE, FATAL TRAP.
MOVEI A,-14(A)
CAMGE A,RSLR1
JRST (D) ;ELSE, IF WE'RE EXACTLY AT THE SOFT LIMIT, DO A SOFT TRAP.
]
SKIPL PDLNFT ;PDL OV TRAP'S PUSHES SHOULDN7T CAUSE ANOTHER.
SKIPL PDLTRB+1
JRST (D) ;ALREADY SPRUNG
45N[ SKIPE INVTRP
CAIE T,3
JRST .+2
JRST (D) ;ALREADY TRAPPED
]
MOVEM D,PDLOV.
MOVEI A,PDLTRB
CALL MTRNEW
JRST (D)
PDLTRB: 3,,
-1
JRST PDLTR2
45Y[
PDLTR1: MOVEI A,4
HRRM A,R6 ;CLOBBER SATACK PTR T0 4, TRAP IMMEDIATELY.
SETOM PDLFT ;R6 HOLDS 4 SO VTRAP WOULD DETECT PDL OV UNLESS TOLD NOT TO.
SKIPA A,D
]
PDLTR2: MOVE A,PDLOV.
SETOM PDLNFT
PUSHJ P,LBUSER
[ASCIZ /STACK OVERFLOW/]
MOVEI A,PDLTRB
CALL QDEL
MOVEI T,1
JRST VTRAP
PDLNFT: 0 ;-1 DURING NONFATAL PDL OV TRAP.
PDLFT: 0 ;-1 DURING FATAL STACK OVFLO TRAP.
RSLR1: 400
PDLOV.: 0
ODDPC: 0
TTPDFL:
45N[ SKIPL TTRPBK+1 ;FLUSH TRACE TRAP IF PENDING
JRST TTPD2
]
PDLFLS: SKIPL PDLTRB+1 ;FLUSH PDL OV IF PENDING
JRST PDLFL2
RETURN
45N[
TTPD2: BLKFLS TTRPBK
PDLTRB,,0
RETURN
]
PDLFL2: BLKFLS PDLTRB
0
RETURN
;WORD IN MEM
;4.9=0 => NO HACKS
;4.9=1
;4.8=0 BREAK ONLY
;4.7=0,1 DO, DON'T STOP AFTER MESS
;4.1=1 TRAP ON FETCH & TURN THIS BIT OFF.
;4.2=1 TRAP ON DIRECT TO MEM DEV WRITE
;4.3=1 TRAP ON DIRECT TO MEM DEV READ
;4.4=1 TRAP ON INST REF
;4.5=1 TRAP ON WRITE
;4.6=1 TRAP ON READ (BUT NOT INST)
;4.8=1 I/O DEV + POSSIBLE BREAK
;3.1-3.9 DEVICE INDEX
DEVPOS=221100
MARPOS=340600
MTRAPI: HRLZI B,11000 ;INSTRUCTION
JRST MTRAP
MTRPW: HRLZI B,60000 ;READ-PAUSE-WRITE
JRST MTRAP
MTDMRW: SKIPA B,[6000,,1]
NGMTRW: MOVE B,[6000,,2]
JRST MTRAP
MTRDFR: SKIPA B,[4000,,3]
MTRDFW: MOVE B,[2000,,3]
JRST MTRAP
MTRRKR: SKIPA B,[4000,,5]
MTRRKW: MOVE B,[2000,,5]
JRST MTRAP
MTDMRD: SKIPA B,[4000,,1]
MTDMWR: MOVE B,[2000,,1]
JRST MTRAP
TXN[
MTETRD: SKIPA B,[4000,,4]
MTETWR: MOVE B,[2000,,4]
PUSH P,D ;RSTALL WILL POPJ THIS.
CALL SAVALL
MOVE A,ETDRIV ;SAVE B'S REAL CONTENTS
MOVEM A,B-SAVLNG(P)
JSP D,MTRAP
JRST RSTALL ;MTRAP WILL COME BACK HERE.
]
MTRDVT:
TXN[ SIXBIT/DM/
SIXBIT/NGDIS/
SIXBIT/DF/
SIXBIT/DT/
SIXBIT /RK/
]
MTDVTL==.-MTRDVT
MTRAPW: SKIPA B,[20000,,] ;WRITE
MTRAPR: HRLZI B,40000 ;READ
MTRAP: MOVE A,@-2(D)
TLNE A,200000
JRST MTRDEV
MTRAP1: SKIPN DDTPDP
TLNN A,77000
JRST MTRAPX
HLR A,A ;SEE IF THIS REFERENCE SHOULD BREAK.
TLNN B,(A)
JRST MTRAPX ;IF NOT.
TLNE B,1000 ;IF TRIPPING AN AUTOFLUSH, STOP BEFORE INSN.
JRST MTRIPT
TLNE A,100000 ;IF STOPPING BREAKPOINT,
JRST MTRAP6
TLNE B,10000 ;IF INSN FETCH, STOP BEFORE INSN.
JRST MTRIPT
MTRAP2: PUSHJ P,CLRRUN ;ELSE STOP AFTER INSN.
MTRAP6: SKIPE TYOFLG ;DON'T TAKE LOTS OF TIME IF TYPEOUT OFF.
PUSHJ P,MTRPNT ;TYPE BREAKPOINT MESSAGE.
MTRAPX: MOVE A,@-2(D)
LDB B,[270400,,-2(D)]
SKIPE B
HRRZM A,(B)
JRST (D)
MTRIPT: SKIPN WAITFL
SKIPE DDONXT ;DO NOTHING IF JUST LEFT DDT.
JRST MTRAPX
TLNN B,10000 ;IF ONLY WAS AUTOFLUSH,
TTOA 1,[ASCIZ/
BREAK(F): /] ;SAY BREAK IS REMOVED.
TTOA [ASCIZ/
BREAK: /] ;ELSE NORMAL MSG.
TLZ A,1000 ;CLEAR ANY AUTOFLUSH BREAK.
TLNN A,377000 ;IF THAT WAS ONLY HACK,
TLZ A,400000 ;INDICATE NO HACKS.
HLLM A,@-2(D)
MOVEI A,(PC)
LSH A,1
HRRM A,%B
PUSHJ P,CLRRN2 ;CALL DDT RIGHT AWAY,
JRST INBEG ;START INSN OVER.
MTRDEV: LDB C,[DEVPOS,,A] ;DEVICE
CAIL C,MAXDEV
.VALUE ;?
PUSHJ P,@MDEVTB(C) ;CALL DEVICE
MOVE A,@-2(D)
JRST MTRAP1
NXMHAK: TRNE B,-1
JRST NXMTKD ;SOME DIRECT TO MEM DEVICE
SKIPN DDTPDP
JSP A,NXMNXM
TLNN B,20000 ;DON'T TYPE ON WRITING.
TTOA [ASCIZ /NXM? /]
RETURN
NXMTKD: XCT NXMDVT-1(B)
JRST MTRAP1
NXMDVT:
TXN[ JRST NXMDML ;DM
JRST NGRNXM ;NGDIS
JRST DFNXM0 ;DSK NXM
JRST ETNXM0
JRST RKNXM0
]
IFN .-NXMDVT-MTDVTL,[PRINTX /NXMDVT .NE. MTRDVT
/]
MTRPNT: TTOA [ASCIZ /
BREAK: /]
PUSHJ P,SAVALL
SKIPL DDTPDP
AOS DDTPDP
HRLZ SF,%TMODE
MOVE B,B-SAVLNG(P)
MOVEI DO,@-2(D) ;ADDR. OF BREAKPOINT.
TRNE B,-1 ;IF REFERENCE WAS BY A DEVICE,
6TYPE MTRDVT-1(B) ;PRINT ITS NAME.
TRNE B,-1
TTOI "
MTRPN3: TLNE B,10000
JRST MTRPN4 ;SPECIAL ACTION FOR FETCH BREAK.
TLNE B,44000
TTOI "R
TLNE B,22000
TTOI "W
TTOA [ASCIZ / /]
MOVEI DL,-PDP11(DO)
LSH DL,1 ;VIRT. ADDR. OF BREAKPOINT.
ADRTYP DL
HRRM DL,%B ;STORE AS ADDR OF LAST BREAKPOINT.
TTOA [ASCIZ ./ .]
HRRZ DL,(DO) ;GET WORD'S CONTENTS, CLEAR FLAGS.
SYMTYP DL ;PRINT CONTENTS OF WORD WITH BKPT.
TTOA [ASCIZ/
FROM: 
/]
MTRPN2: SKIPL DDTPDP
SOS DDTPDP
JRST RSTALL
MTRPN4: TTOA [ASCIZ/I %OPC]
FROM: /]
MOVEI DL,(PC)
LSH DL,1 ;ADDR. OF BREAKPOINT.
HRRM DL,%B
CALL DPINSN ;PRINT BREAKING INSN.
CRF
JRST MTRPN2
MDEVTB: OFFSET -.
IRP X,,[NXM,CSX,CPAT] ;THE POSITION OF THESE ENTRIES
N!X::
X!HAK
TERMIN ;MUST NOT BE CHANGED, SINCE THEY ARE IN DUMP FILES.
TXN[
IRP X,,[PS,PC,SWR,PIR,LKS,TKS,TKB,TPS,TPB
PRS,PRB,PPS,PPB,DIV,MQ,MUL,NOR,LGS,ARS
DCS,CMA,DAE,ADS,PKC,CSR,BAR,BCR,TBR,LPS,LPB]
N!X::
X!HAK
TERMIN
]
TXY[
IRP X,,[PS,PC,SWR,PIR,LKS,TKS,TKB,TPS,TPB
DIV,MQ,MUL,NOR,LGS,ARS,PKC]
N!X::
X!HAK
TERMIN
]
TXN[
IRP X,,[SCSR,RCSR,RBUF,TSCR,TBUF,TCCM,TCST
RKDS,RKER,RKCS,RKBA]
N!X::
X!HK
TERMIN
IRP X,,[PKCSR,PKCSB,NGCSR]
N!X::
X!K
TERMIN
]
TXY[
NSCSR:: SCSRHK
IRP X,,[PKCSR,PKCSB]
N!X::
X!K
TERMIN
]
45Y[
NSAR:: SARHAK
NSDR:: SDRHAK
NSLR:: SLRHAK
IRP X,,[SARU,SDRU,SSR0,SSR2,SSR3]
N!X:: X!HK
TERMIN ]
OFFSET 0
MAXDEV==.-MDEVTB
;PROCESSOR STATUS REGISTER
PSHAK: SKIPE DDTPDP
JRST PSHAK1
ANDI PC,77777
HRRM PS,RPS
PSHAK1: TLNN B,20000
RETURN
JSP A,MTRNEW
PSTRB: 10,,
-1
PUSHJ P,PSHTRP
MTRNEW: SKIPL 1(A)
RETURN
PUSH P,T
PUSH P,B
PUSHJ P,TRQQA
POP P,B
POP P,T
RETURN
MTRDES: PUSH P,T
PUSH P,B
PUSHJ P,TRQADD
POP P,B
POP P,T
RETURN
PSHTRP: SKIPE DDTPDP
SAVE PS
45N HRRZ PS,RPS
45Y[ SKIPE DDTPDP
SETZ PS, ;THIS STUFF PREVENTS CLOBBERAGE OF T BIT
HRRZ A,RPS ;EXCEPT FROM DDT.
ANDCMI A,TF
ANDI PS,TF
IORI PS,(A)
HRRM PS,RPS ]
NEWPS
SKIPE DDTPDP
REST PS
RETURN
;PROGRAM COUNTER REGISTER
PCHAK: SKIPE DDTPDP
RETURN
TLNN B,50000
JRST PCHAKW
HRRM PC,R7
ADDM PC,R7
PCHAKW: TLNN B,20000
RETURN
JSP A,MTRNEW
7,,
-1
JRST PCTRP
PCTRP: HRRZ PC,R7
TRNE PC,1
JSP D,DBNDE
LSH PC,-1
OBRAN1
;LINE FREQUENCY CLOCK
LKSHAK: TLNN B,54000
RETURN
ANDI A,100
AOSN CLOCK
TRO A,200
HRRM A,RLKS
RETURN
CLOCK: 0
WLK: -1
LKTIM: 166667.
CLKSBK: 0
-1
PUSHJ P,.+1
TXN .SUSET [.RRUNT,,A]
TXY[ MOVEI A,400000
RUNTM
IMULI A,250.
]
SUB A,RUNTB
MOVE B,TIME
IDIVI B,40.
IDIV A,B
HRRM A,RATE
JRST CLKTR2
ALK: JUMPE T5,ZLK2 ;ATTACH LINE CLOCK
MOVE A,[10000000.] ;ARG=CYCLES/SEC
IDIV A,T5
MOVEM A,LKTIM
ZLK2: SKIPE WLK
PUSHJ P,DLK
PUSHJ P,WRDINS
600000+NLKS,,RLKS
0
SETOM WLK
SKIPA C,TIME
CLKTR2: MOVE C,CLKSBK
ADD C,LKTIM
MOVEI A,CLKSBK
PUSHJ P,CTRDES
SETOM CLOCK
LDB A,[60100,,RLKS]
JUMPE A,CPOPJ
JSP A,MTRNEW
LKSBK2: 6
-1
JRST .+1
MOVEI T,20
JSP A,VTRAP
DLK: BLKFLS CLKSBK ;DETACH LINE CLOCK
LKSBK2,,0
SETZM WLK
PUSHJ P,WRDZAP
RLKS,,RLKS
RETURN
ZLK: SKIPN WLK
RETURN
JRST ZLK2
ATK: JUMPE T5,ZTK ;ATTACH TELETYPE KEYBOARD
MOVE A,[1000000.]
IDIV A,T5
MOVEM A,TKTIM
ZTK: SKIPE WTK
PUSHJ P,DTK
PUSHJ P,WRDINS
600000+NTKS,,RTKS
600000+NTKB,,RTKB
0
SETOM WTK
SETZM TKDONE
SETZM TKBUSY
RETURN
DTK: BLKFLS CTKSBK ;DETACH TELETYPE KEYBOARD
TKSBK2,,0
SETZM WTK
PUSHJ P,WRDZAP
RTKS,,RTKB
RETURN
TKSHAK: TLNN B,54000
JRST TKSWRT
ANDI A,100
SKIPE TKDONE
IORI A,200
TKSHA4: SKIPE TKBUSY
TRO A,4000
HRRM A,RTKS
TKSWRT: TLNN B,22000
RETURN
XXWAIT TKSINT
TKBHAK: SKIPE TKDONE
TLNN B,54000
RETURN
SETZM TKDONE
RETURN
TKB224: SETOM TKBUSY
MOVEI A,CTKSBK
MOVE C,TIME
ADD C,TKTIM
MOVEM C,CTKSBK
SKIPN QFLAG
JRST CTRDES
XXWAIT TKB224
;FROM INTERRUPT OUT OF HACKING CLOCK QUEQUE
CTKTRP: SETZM TKBUSY
TXN[ .STATUS TYIC,A ;REALLY HAVE A CHAR?
TRNE A,2000
]
TXY[ MOVEI A,.PRIIN
SIBE
SKIPA
]
JRST TKSINT
PUSH P,MB
PUSHJ P,TYI1 ;YES, READ IT.
HRRM MB,RTKB
POP P,MB
SETOM TKDONE
PUSHJ P,TKB224 ;CHECK FOR ANOTHER.
TKSINT: MOVEI A,TKSBK2
SKIPN TKDONE
JRST QDEL
LDB B,[60100,,RTKS]
JUMPE B,QDEL
JRST MTRNEW
TKSBK2: 4
-1
JRST .+1
MOVEI T,14
JSP A,VTRAP
TKTIM: 1000.
TKDONE: 0
TKBUSY: 0
WTK: -1
CTKSBK: 0
-1
PUSHJ P,CTKTRP
ATP: JUMPE T5,ZTP ;ATTACH TELETYPE PRINTER
MOVE A,[1000000.]
IDIV A,T5
MOVEM A,TPTIM
ZTP: SKIPE WTP
PUSHJ P,DTP
PUSHJ P,WRDINS
600000+NTPS,,RTPS
600000+NTPB,,RTPB
0
SETOM WTP
SETOM TPREDY
RETURN
DTP: BLKFLS CTPBBK ;DETACH TELETYPE PRINTER
TPSBK2,,0
SETZM WTP
PUSHJ P,WRDZAP
RTPS,,RTPB
RETURN
TPSHAK: TLNN B,54000
JRST TPSHK2
ANDI A,104
SKIPE TPREDY
TRO A,200
HRRM A,RTPS
TPSHK2: TLNN B,22000
RETURN
XXWAIT
CTPTR2: MOVEI A,TPSBK2
SKIPN TPREDY
JRST QDEL
LDB C,[60100,,RTPS]
JUMPE C,QDEL
JRST MTRNEW
TPSBK2: 4
-1
JRST .+1
MOVEI T,15
JSP A,VTRAP
TPBHAK: HLLZS RTPB
TLNN B,22000
RETURN
XXWAIT
SKIPN TPREDY
RETURN ;DATA LOST
SETZM TPREDY
TXN[ HRRZ C,RTPB
SYSCAL IOT,[1000,,TYOC ? 5000,,%TJSIO ? C]
]
TXY[ HRRZ A,RTPB
PBOUT
]
MOVE C,TIME
ADD C,TPTIM
MOVEI A,CTPBBK
CTRDES: PUSH P,T
PUSH P,B
PUSHJ P,CLQADD
POP P,B
POP P,T
RETURN
CTPBBK: 0
-1
PUSHJ P,CTPTRP
CTPTRP: SETOM TPREDY
JRST CTPTR2
TPTIM: 900.
TPREDY: -1
WTP: -1
TXN[
APRA: TDZA T5,T5
APRI: MOVEI T5,4
HRLM T5,PTRFIL
MOVEI A,PTRFIL ;ATTACH PAPER TAPE READER
PUSHJ P,DGFIL
SKIPE WPR
PUSHJ P,DPR
MOVEI A,PTRFIL
APR1: CALL GETCHP ;GET CHANNEL & OPEN.
HRRZM C,PRCHAN ;REMEMBER WHAT CHANNEL.
ZPR: PUSHJ P,WRDINS
600000+NPRS,,RPRS
600000+NPRB,,RPRB
0
BLKFLS PRCQB
PRSBK2,,
SETZM PRDONE
SETZM PRERR
SETZM PRBUSY
SETZM PRCHAR
SETOM WPR
RETURN
PTRFIL: SIXBIT/ DSKPTR INPUT/
APR: SKIPE WPR
PUSHJ P,DPR
MOVEI A,[SIXBIT/ (PTRPTR INPUT/]
JRST APR1
DPRI:DPRA:
DPR: BLKFLS PRCQB ;DETACH PAPER TAPE READER
PRSBK2,,0
PUSHJ P,WRDZAP
RPRS,,RPRB
SETZM WPR
DPR1: SKIPGE C,PRCHAN
RET ;CHANNEL ALREADY FREED.
SETOM PRCHAN
JRST CLOSEC ;ELSE FREE IT.
PRSHAK: TLNN B,54000
JRST PRSWRT
ANDI A,100
SKIPE PRDONE
TRO A,200
SKIPE PRBUSY
TRO A,4000
SKIPE PRERR
TRO A,100000
HRRM A,RPRS
PRSWRT: TLNN B,22000
RETURN
XXWAIT
SKIPE PRERR
JRST
LDB C,[100,,RPRS]
JUMPE C,PRTRAP
SETZM PRCHAR
SETOM PRBUSY
MOVEI A,PRCQB
MOVE C,TIME
ADD C,PRTIM
PUSHJ P,CTRDES
PRTRAP: MOVEI A,PRSBK2
SKIPN PRERR
SKIPE PRDONE
SKIPA
JRST QDEL
LDB C,[60100,,RPRS]
JUMPE C,QDEL
JRST MTRNEW
PRSBK2: 4
-1
JRST .+1
MOVEI T,16
JSP A,VTRAP
PRBHAK: MOVE A,PRCHAR
HRRM A,RPRB
TLNE B,54000
SETZM PRDONE
RETURN
PRCQB:: 0
-1
PUSHJ P,PRCTRP
PRCTRP: SETZM PRBUSY
SETOM PRDONE
SYSCL IOT,[PRCHAN ? C]
IOCGET JFCL
CAIA
JUMPGE C,PRCTR1
CALL DPR1 ;DON'T REALLY NEED CHANNEL ANY MORE.
SETOM PRERR ;END OF TAPE
PRCTR1: HRRM C,PRCHAR
JRST PRTRAP
WPR: 0
PRDONE: 0
PRBUSY: 0
PRERR: 0
PRCHAR: 0
PRCHAN: -1 ;PR CHANNEL OR -1 IF NONE ALLOC'D.
PRTIM: 60.
APP: SKIPE WPP ;DETACH FIRST IF ALREADY ATTACHED.
CALL DPP
MOVEI A,[SIXBIT/ )PTPPTP OUTPUT/]
JRST APP1
APPA: SKIPA T5,[1] ;ASCII TAPE PUNCH, MODE 1.
APPI: MOVEI T5,5 ;IMAGE TAPE PUNCH, MODE 5.
HRLM T5,PTPFIL
MOVEI A,PTPFIL ;ATTACH PAPTER TAPE PUNCH
PUSHJ P,DGFIL
SKIPE WPP
PUSHJ P,DPP
MOVEI A,PTPFIL
APP1: CALL GETCHP ;GET CHANNEL & OPEN ON IT.
HRRZM C,PPCHAN
ZPP: PUSHJ P,WRDINS
600000+NPPS,,RPPS
600000+NPPB,,RPPB
0
BLKFLS PPCQB
PPSBK2,,0
SETOM PPDONE
SETZM PPERR
SETOM WPP
RETURN
PTPFIL: SIXBIT / DSK/
SIXBIT/PTP OUTPUT/
DPPA:DPPI:
DPP: BLKFLS PPCQB ;DETACH PAPER TAPE PUNCH
PPSBK2,,0
PUSHJ P,WRDZAP
RPPS,,RPPB
SETZM WPP
SKIPGE C,PPCHAN
RET ;NO CHANNEL ALLOCATED.
SETOM PPCHAN ;ELSE FREE IT.
JRST CLOSEC
PPSHAK: TLNN B,54000
JRST PPSWRT
ANDI A,100
SKIPE PPDONE
TRO A,200
SKIPE PPERR
TRO A,100000
HRRM A,RPPS
PPSWRT: TLNN B,22000
RETURN
XXWAIT PPSTRP
WPP: 0
PPDONE: 0
PPERR: 0
PPTIM: 300.
PPCHAN: -1 ;-1, OR CHANNEL BEING USED BY PP.
PPCTRP: SETOM PPDONE
PPSTRP: MOVEI A,PPSBK2
SKIPN PPDONE
SKIPE PPERR
JRST .+2
JRST QDEL
LDB C,[60100,,RPPS]
JUMPE C,QDEL
JRST MTRNEW
PPSBK2: 4
-1
JRST .+1
MOVEI T,17
JSP A,VTRAP
PPBHAK: HLLZS RPPB
TLNN B,22000
RETURN
XXWAIT
SETZM PPDONE
PUSHJ P,PPSTRP
SYSCL IOT,[PPCHAN ? RPPB]
IOCGET JFCL
SETOM PPERR
ADD C,PPTIM
JSP A,CTRDES
PPCQB: 0
-1
PUSHJ P,PPCTRP
ZLP: SKIPN WLP
POPJ P,
ALP: SKIPE WLP ;ATTACH LINE PRINTER
PUSHJ P,DLP
MOVEI A,LPTFIL
PUSHJ P,DGFIL
PUSHJ P,OPNLPT
PUSHJ P,WRDINS
600000+NLPS,,RLPS
600000+NLPB,,RLPB
0
SETOM WLP
SETOM LPDONE
SETZM LPERR
RETURN
DLP: PUSHJ P,WRDZAP ;DETACH LINE PRINTER
RLPS,,RLPB
BLKFLS LPBTIM
LPSBRK,,0
SETZM WLP
CLSLPT: SOSG LPTCNT
.CLOSE LPTC,
RETURN
LPBHAK: HLLZS RLPB
TLNN B,22000
RETURN
XXWAIT
SKIPN LPDONE
RETURN
SETZM LPDONE
PUSHJ P,LPSINT
HRRZ A,RLPB
.IOT LPTC,A
IOCGET SETOM LPERR
MOVE C,TIME
ADD C,LPTIM
JSP A,CTRDES
LPBTIM: .
-1
PUSHJ P,.+1
SETOM LPDONE
JRST LPSINT
LPSHAK: TLNN B,54000
JRST LPSWRT
ADDI A,100
SKIPE LPDONE
TRO A,200
SKIPE A,LPERR
TRO A,100000
HRRM A,RLPS
TLNN B,22000
RETURN
LPSWRT: XXWAIT
LPSINT: MOVEI A,LPSBRK
SKIPN LPDONE
JRST QDEL
LDB B,[60100,,RLPS]
JUMPE B,QDEL
JRST MTRNEW
LPSBRK: 4
-1
JRST .+1
MOVEI T,40
JSP A,VTRAP
WLP: 0
LPDONE: 0
LPERR: 0
LPTIM: 60.
]
;CONSOLE DATA SWITCHES REGISTER
SWRHAK: SKIPN DDTPDP
TLNN B,20000
RETURN
MOVE A,RSWR
MOVEM A,SWR
XXWAIT
MOVE A,SWR
HRRM A,RSWR
RETURN
SWR: 0
;SOME PDP11/45 FEATURES
WI45: 0
;CODES IN AC FLD OF 2ND XCT OF A 45IRMA, ETC.
45FSN==0 ;NO REGS MIGHT HAVE BEEN ALTERED.
45FSA==1 ;REGS IN THE SRC ADDRESS MIGHT HAVE BEEN ALTERED.
45FDN==1
45FDA==3 ;REGS IN SRC AND DEST ADDRS MAY HAVE BEEN ALTERED.
45FMTP==4 ;SAYS R6 WAS INCR'D, AND CHECK DEST REGS.
DI45: BLKFLS PIRBLK
45Y[45TRAB],,0
PUSHJ P,WRDZAP
RPIR,,RPIR
45Y[ CALL WRDZAP
RSSR0,,RSSR2
CALL WRDZAP
RSSR3,,RSSR3
CALL WRDZAP
RSDR0+40,,RSDR0+137
CALL WRDZAP
RUSDR0,,RUSDR0+37 ] ;END 45Y
SETZM WI45
JRST DPKBLK ;I45 NO LONGER NEEDS PAGE IT SHARES WITH DEVICE PK.
ZI45: BLKFLS PIRBLK
45Y[45TRAB],,0
SKIPN WI45
RET
JRST ZI45A
AI45: SKIPE WI45
CALL DI45
CALL APKBLK ;GET THE PAGE THAT RSDR0 IS IN.
ZI45A: PUSHJ P,WRDINS
600000+NPIR,,RPIR
45Y[
IRP C0,,[U,S,K]C1,,[RUSDR0-RSDR0,40,100]C2,,U
IRPS A0,,I D,A1,,0 10
IRPS B0,,D A,B1,,0 20
REPEAT 8,600000+NS!B0!R!C2,,RSDR0+A1+B1+C1+.RPCNT
TERMIN TERMIN TERMIN
600000+NSSR0,,RSSR0
RSSR1
600000+NSSR2,,RSSR2
600000+NSSR3,,RSSR3
600000+NSLR,,RSLR
]
0
45Y[ MOVE A,[JSP A,45TRAP]
MOVEM A,45IRU1 ;INIT. ALL SEGT TABLES TO REFLECT
MOVE A,[45IRU1,,45IRU1+1] ;INITIAL SETTING OF SDRS.
BLT A,45IRU5-1
MOVSI A,(JFCL) ;BUT 45IRU5 AND 45IRU7 VARS ARE ASSUMED
MOVEM A,45IRU5 ;NEVER TO JUMP AWAY.
MOVE A,[45IRU5,,45IRU5+1]
BLT A,45IRUE-1
CALL SSR0H2 ;INIT. X TABLES FOR NO PAGING.
]
SETOM WI45
RETURN
45Y[
;11-45 MAP CONSTANTS.
;BITS IN SSR0: (ALL KEPT IN RSSR0)
45BANR==100000 ;ABORT-NON-RESEIDENT.
45BASL==40000 ;ABORT-SEGMENT-LENGTH
45BARO==20000 ;ABORT-READ-ONLY.
45BMMT==10000 ;MEMORY MANAGEMENT TRAP.
45BPAT==4000 ;PROGRAMMER'S AID SYSTEM TRAP (NOT IMPLEMENTED)
45MR0U==2400 ;(UNUSED BIT AND UNIMPLEMENTED MAINT BIT)
45BTPE==1000 ;MEM MGMT TRAP ENABLE.
45PTPE==110100
45BIC==200 ;INSTRUCTION COMPLETED
45PSGN==10600 ;BP TO SEG #, MODE # AND I/D FIELDS.
45BSGE==1 ;ENABLE PAGING.
;BITS IN SDR.
45MSDU==100000 ;UNUSED BITS IN SDR.
45PSLF==100700 ;BP TO SEG LENGTH FLD.
45BACC==200 ;"A" BIT - SEG MET CONDITION FOR MEM MGMT TRAP.
45BWRT==100 ;"W" BIT - PAGE WAS WRITTEN IN.
45BED==10 ;EXPANSION DIRECTION (1 => DOWN)
45PACF==300 ;BP TO ACCESS CTL FIELD.
;IN SAR.
45MSAF==7777 ;MASK OF SEGMT ADDR FIELD.
45PSAF==1400 ;BP TO IT.
;IN PS REGISTER.
45MMDS==174000 ;CURRENT MODE, PREVIOUS MODE AND REGISTER SET.
;11-45 MAP VARIABLES:
;X TABLES: ONE FOR EACH SPACE AND TYPE OF ACCESS.
;THESE TABLES ARE XCT'D BY THE 45!<I OR D>!<R OR W>!<MA OR TT> MACROS.
;THE 1ST ENTRY OF EACH IS FOR MA, THE SECOND FOR TT.
;THE X1 TABLES HOLD THE 1ST INSN TO XCT; THE X2'S, THE 2ND.
;IF PAGING IS OFF, THE X TABLES CONTAIN A COPY OF 45IWXI, ETC.
;IF PAGING ON, CONTENTS DEPEND ON PROCESSOR'S CURRENT MODE,
;AND WILL BE A COPY OF 45IWXK, 45IWXS OR 45IWXU; OR, IF THE
;MODE IS 2 (ILLEGAL), EVERY WD WILL CONTAIN A COPY OF 45IWXX.
;IF THE D-SPACE IS DISABLED IN THE CURRENT MODE, 45DWX1 AND ON
;WILL CONTAIN THE SAME THINGS AS 45IWX1 THRU 45DWX1-1.
45IWXX: [JSP A,45TRA4] ;(THIS WD ISN'T REALLY PART OF THE X TABLES)
45IWX1: 45IWK1(D) ;D IS EXPECTED TO HOLD SEGMENT #.
45IWK3(D)
45IWX2: 45IWK2(D)
45IWK4(D)
45IRX1: 45IRK1(D)
45IRK3(D)
45IRX2: 45IRK2(D)
45IRK4(D)
45DWX1: 45DWK1(D)
45DWK3(D)
45DWX2: 45DWK2(D)
45DWK4(D)
45DRX1: 45DRK1(D)
45DRK3(D)
45DRX2: 45DRK2(D)
45DRK4(D)
45IWXE==.-1 ;END OF X TABLES.
;THESE WDS HOLD WHAT IS TO BE COPIED INTO THE X TABLES
;WHEN THE PROCESSOR SWITCHES MODE. THERE IS ONE SET FOR EACH MODE.
;THESE TABLES ARE CONSTANT.
IFN 0,[ 45IWXK: 45IWXS: 45IWXU: ] ;THESE ARE THE LABELS DEFINED BY THE IRPC.
IRPC CC,,KSU
45IWX!CC:
IRPS AA,,IW IR DW DR
IRPC BB,,1324
45!AA!!CC!!BB(D)
TERMIN TERMIN TERMIN
;CONTENTS OF X TABLES WHEN PAGING IS DISABLED.
;EVERY X1 ENTRY IS A JFCL, EVERY X2 A CAIA.
45IWXI: REPEAT 4,[ 45IWI1(D) ? 45IWI3(D) ? [CAIA] ? [CAIA] ? ]
45IWI1: REPEAT 7,JFCL
MOVEI MA,300000(MA) ;RELOC ADDRS IN TOP 4 K TO IO REG AREA.
45IWI3: REPEAT 7,JFCL
MOVEI TT,300000(TT)
;THE ACTUAL PAGE TABLES: ONE SET FOR EACH SEGMENT.
;A SEGMENT IS IDENTIFIED BY ITS POSITION IN THE MAP (0 - 8),
;ITS MODE (U, S OR K) AND ITS SPACE (I OR D).
;A SEG'T'S IDX IS THE DISPLACEMENT OF ITS SDR FROM RSDR0.
;NOTE THAT USER MODE SDRS AND SARS, THOUGH ADDRESSED BY THE 11
;STARTING AT RUSDR0, ARE REALLY STORED STARTING AT RSDR0,
;JUST BEFORE THE S-MODE SDRS AND SARS. THE WDS AT RUSDR0 ARE HACKED
;UP TO REFER INDIRECTLY TO THOSE AT RSDR0 (VIA MTRAP).
;U-MODE SDRS HAVE INDICES FROM 0 TO 37;
;S-MODE, FROM 40 TO 77; K-MODE, FROM 100 TO 137.
;THE ENTRIES FOR ANY ONE SEGMENT DEPEND ONLY ON WHAT IS IN
;THE SDR AND SAR OF THAT SEGMENT.
;THE 10. WDS FOR ANY ONE SEGMENT CAN BE OBTAINED BY INDEXING
;ONE OF THE FOLLOWING SYMBOLS BY THE SEGMENT'S IDX:
;45IRU1, 45IRU2, 45IRU3, 45IRU4
; (INSN TO RELOC ADDR IN MA, OR JSP A,45TRAP FOR SPECIAL HACKS,
; INSN TO SKIP IF ADDR VALID (NOT BEYOND BNDRY),
; 2 SIMILAR INSNS FOR ADDR IN TT)
;45IWU1, 45IWU2, 45IWU3, 45IWU4
; (LIKE THE 1ST 4 BUT FOR WRITING)
;45IRU5, 45IRU7 (THOSE HOLD WHAT 45IRU1, 45IRU3 WOULD HOLD
; IF THERE WERE NO NEED TO TRAP FOR THIS SEGMENT.
; WHEN AN INTERNAL TRAP IS DONE TO SET THE W OR A BIT,
; 45IRU1, 45IRU3, 45IWU1, 45IWU3 FOR THE SEGT MAY BE RESTORED
; FROM THEM)
IRPS A1,,R W R W R,B1,,12 12 34 34 57
IRPC CC,,UUSSKK,BB,,B1!B1!B1
IRPS A0,,I D
45!A0!!A1!!CC!!BB: REPEAT 8,JSP A,45TRAP
TERMIN TERMIN TERMIN
45IRUE: ;1 + END OF SEGMT TABLES.
;THE MULTIPLE GENERAL REGISTER SETS:
;THE CONTENTS OF THE REG SET IN USE ARE KEPT IN R0...R5,
;WHILE THOSE OF THE SET NOT IN USE ARE KEPT IN THE SET ITSELF
;(45REG0 OR 45REG1)
45REGY: R0,,45REG0 ;R0,,<REG SET NOW IN USE>
45REGN: R0,,45REG1 ;R0,,<REG SET NOT NOW IN USE>
45REG0: BLOCK 6 ;THE 2 REGISTER SETS.
45REG1: BLOCK 6
45REG6: BLOCK 4 ;THE 4 REGISTER 6'S.
;AGAIN, THE REAL CONTENTS OF THE R6 THAT'S IN USE
;ARE NOT HERE, BUT IN R6.
;RANDOM VARIABLES:
45MODE: 0 ;CURRENT PROCESSOR MODE
;(0=KERNEL, 1=SUP, 2 UNUSED, 3=USER)
45STAT: 0 ;CURRENT STATE (MODE AND REGISTER SET BIT)
45SGON: 0 ;-1 => SEGMENTATION ENABLED.
RSSR2A: 0 ;REAL CONTENTS OF SSR2 KEPT HERE.
ROSSR0: 0 ;RSSR0'S ERROR FLAGS SAVED HERE AT 45TRAP
;IF ROSSR0 ISN'T 0, RSSR0 ISN'T ALTERED.
;ROUTINE CALLED FROM NEWPS MACRO IF EITHER THE MODE OR THE REGISTER SET
;HAS CHANGED (THAT IS, IF THE CURRENT STATE HAS CHANGED)
45NMOD: EXCH 0,45STAT
XORI 0,(PS) ;IS THE OLD STATE SAME AS NEW?
TRNN 0,45MODM
JRST 45NMO2 ;THE MODE IS THE SAME, SIMPLE.
LDB A,[45CMOD,,PS] ;MODE HAS BEEN CHANGED
SAVE B ;SET UP THE R6 FOR THE NEW MODE.
MOVE B,45REG6(A) ;GET IT FROM ITS RESTING PLACE,
EXCH B,R6 ;PUT IT WHERE INSNS CAN USE IT,
EXCH A,45MODE
MOVEM B,45REG6(A) ;PUT OLD MODE'S R6 BACK IN HANGER.
SKIPE 45SGON ;IF PAGING IS ENABLED, UPDATE X-TABLES
CALL SSR0H4 ;TO POINT TO SEGMENTS OF THE NEW CURRENT MODE.
REST B
45NMO2: TRNN 0,45REGB ;HAS THE REGISTER SET CHANGED?
RET
MOVE A,45REGN ;YES, SWITCH THE ONE IN USE
EXCH A,45REGY ;WITH THE ONE NOW NOT IN USE.
MOVEM A,45REGN
MOVE 0,A ;COPY CONTENTS OF THAT NO LONGER IN USE
BLT 0,5(A) ;INTO THEIR RESTING PLACE (45REG0 OR 45REG1)
MOVS 0,45REGY ;MOVE CONTENTS OF THOSE NOW IN USE
BLT 0,R5 ;TO WHERE INSNS WILL BE ABLE TO FIND THEM.
RET
45NMO3: 45IWXK,,45IWX1 ;BLT PTR FOR LOADING X TABLES FOR KERNEL MODE.
45IWXS,,45IWX1
45IWXX,,45IWX1 ;BLT PTR TO PROPAGATE [JSP A,45TRA4] THRU X TABLES.
45IWXU,,45IWX1 ;BLT PTR FOR LOADING X TABLES FOR USER MODE.
45DSNB: 4 ;INDEX THIS TABLE BY THE MODE NUMBER,
2 ;TO GET THE BIT IN RSSR3 WHICH, IF ON,
0 ;ENABLES THE D-SPACE OF THE MODE.
1
;ROUTINE FOR THE STACK LIMIT REGISTER.
;THE VALUE IS REALLY KEPT IN RSLR BUT A SLIGHTLY MODIFIED VALUE
;IS KEPT IN 45SLR FOR FASTER CHECKING FOR PDL OV.
SLRHAK: TLNN B,220000 ;WHEN RSLR IS MODIFIED,
RET
XXWAIT ;MUST UPDATE RSLR1 TO REFLECT IT.
HRROI B,177400 ;FLUSH LOW BYTE.
ANDB B,RSLR
ADDI B,400 ;GET ADDR OF WARNING STACK BNDRY.
HRRZM B,RSLR1
RET
SSR3HK: TLNN B,220000
RET
XXWAIT
SKIPE 45SGON ;SSR3 ALTERED - MAYBE THE D-SPACE OF THE CURRENT
CALL SSR0H4 ;MODE WAS ENABLED OR DISABLED.
RET ;REINIT THE X-TABLES JUST IN CASE.
SSR2HK: MOVE A,RSSR2A ;SSR2 IS READ-ONLY - PUT THE REAL VALUE
HRRM A,RSSR2 ;WHERE THE SIMULATED INSN CAN FIND IT.
RET
;DEVICE REG RTN FOR A U-MODE SAR - REFER INDIRECTLY TO WHERE
;INFO IS REALLY STORED (NEAR RSAR0)
SARUHK: MOVEI A,@-2(D) ;GET ADDR OF THE SAR,
MOVE C,RSDR0-RUSDR0(A) ;GET VALUE FROM WHERE SAR REALLY KEPT,
HRRM C,(A) ;PUT IT WHERE PRGM WILL SEE IT.
;ROUTINE FOR ORDINARY SARS, KEPT WHERE THEY'RE USED.
SARHAK: TLNN B,220000 ;NOTHING TO DO IF NOT WRITING.
RET
MOVEI A,@-2(D) ;ALL THE SARS SHARE THIS CODE, FIND OUT WHICH THIS IS.
MOVEM A,45DWRT
XXWAIT
MOVE A,45DWRT
HRROI B,45MSAF
ANDM B,(A) ;FLUSH ALL BUT THE SEGT LENGTH FIELD.
SUBI A,RSAR0 ;GET # OF SAR REL TO 1ST.
CAIGE A,140 ;IF THIS IS U-MODE SAR, RELOC ADDR TO GET IDX.
JRST 45DHA1 ;RECOMPUTE SEGMT TAB WDS FOR THIS SEGT
MOVE B,RSAR0(A)
SUBI A,RUSDR0-RSDR0
HRRM B,RSAR0(A) ;PUT WHAT USER WROTE IN PLACE
JRST 45DHA1 ;THAT IT IS NORMALLY STORED.
;ROUTINE FOR U-MODE SDRS.
SDRUHK: MOVEI A,@-2(D)
MOVE C,RSDR0-RUSDR0(A)
HRRM C,(A)
;ROUTINE FOR ORDINARY SDRS.
SDRHAK: TLNN B,220000
RET
MOVEI A,@-2(D)
MOVEM A,45DWRT
XXWAIT
MOVE A,45DWRT
MOVEI B,100300 ;TURN OFF IN THE SDR WHAT USER
ANDCAB B,(A) ;ISN'T SUPPOSED TO SET.
SUBI A,RSDR0
CAIGE A,140 ;IF THIS IS U-MODE SDR,
JRST 45DHA1
SUBI A,RUSDR0-RSDR0 ;GET OFFSET OF REAL SDR INSTEAD PHONY.
HRRM B,RSDR0(A)
;DROPS THROUGH.
;DROPS THROUGH.
;RECOMPUTE THE SEGMT TAB WDS FOR ONE SEGT WHOSE SAR OR SDR WAS CHANGED.
;A HAS OFFSET OF THE SEGT'S ASR FROM THE 1ST ASR.
45DHA1: MOVE B,RSDR0(A) ;GET SEGT'S SDR,
LDB C,[45PSLF,,B] ;CALCULATE AMOUNT TO RELOCATE AN ADDR BY.
LSH C,5
LDB D,[45PSAF,,RSAR0(A)]
LSH D,5
ADD C,D
TRNN B,45BED
ADDI C,40 ;IF EXPAND UP, THAT'S 1ST WD OF LAST BLOCK
HRLI C,(CAIL MA,)
TRNE B,45BED
TLC C,(CAIGE#CAIL) ;IF DOWN, IT'S 1ST WD OF 1ST BLOCK.
MOVEM C,45IRU2(A) ;INSN TO CHECK THAT ADDR IN MA
MOVEM C,45IWU2(A) ;IS IN RANGE.
TLC C,(<0 MA,>#<0 TT,>)
MOVEM C,45IRU4(A) ;INSN TO CHECK ADDR IN TT.
MOVEM C,45IWU4(A)
LDB C,[300,,A]
LSH C,14
SUB D,C
HRLI D,(MOVEI MA,(MA)) ;INSN TO RELOCATE ADDR THE RIGHT AMOUNT.
MOVEM D,45IRU1(A)
MOVEM D,45IWU1(A)
MOVEM D,45IRU5(A)
HRLI D,(MOVEI TT,(TT))
MOVEM D,45IRU3(A) ;SIMILAR BUT FOR ADDR IN TT.
MOVEM D,45IWU3(A)
MOVEM D,45IRU7(A)
MOVE D,[JSP A,45TRAP] ;BUT PERHAPS WE SHOULD TRAP INSTEAD.
LDB C,[45PACF,,B]
JRST @.+1(C)
45DHA2
45DHA2
45DHA3
45DHA2
45DHA2
45DHA3
45DHA4
45DHA2
45DHA2: MOVEM D,45IRU1(A) ;CATCH READS AND WRITES IN THIS SEG.
MOVEM D,45IRU3(A)
45DHA3: MOVEM D,45IWU1(A) ;CATCH ONLY WRITES.
MOVEM D,45IWU3(A)
RET
45DHA4: TRNN B,45BWRT
JRST 45DHA3 ;READ WRITE BUT NOT WRITTEN IN YET =>
;MUST CATCH WRITES TO SET WRITTEN BIT.
RET
45DWRT: 0
45ASLP: 0 ;WHILE IN 45TRAP, -1 IFF SEGMENT LENGTH VIOLATION.
;COME HERE WHEN TRY TO DO ACCESS IN MODE 2 (WHICH IS ILLEGAL)
45TRA4: JSR 45TRAI ;PUSHES A, SETS ROSSR0 FROM RSSR0
SAVE B
SAVE C
SAVE D
LDB C,[270400,,-1(A)] ;GET AC FLD OF 1ST XCT, WHICH SAYS
DPB C,[30100,,D] ;0 FOR I SPACE, 1 FOR D SPACE.
ADDI D,40 ;PUT 2 IN AS MODE; D HAS SEG # FOR SSR0.
SKIPN ROSSR0 ;DON'T CHANGE SSR0 IF ERROR FLAGS SET.
DPB D,[45PSGN,,RSSR0]
JRST 45TRAA
;45IRMA, ETC. MACROS DO JSP A,45ASL
;WHEN THERE IS AN ABORT-SEGMENT-LENGTH CONDITION.
45ASL: SUBI A,2 ;MAKE A -> THE 2ND XCT OF THE 45IRMA.
JSR 45TRAI ;PUSHES A, SETS ROSSR0.
MOVEI A,45BASL ;INDICATE THIS IS SEGT LENGTH FAILURE.
SKIPN ROSSR0
IORM A,RSSR0
SETOM 45ASLP ;TELL 45TRAP THIS IS SEG'T LENGTH FAILURE, NOT ACCESS CODE LOSSAGE.
SKIPA A,(P)
;1ST INSN XCT'D DOES JSP A,45TRAP IF REFS TO THAT SEGT MUST BE CAUGHT.
45TRAP: JSR 45TRAI ;IN THIS CASE, A ALREADY -> 2ND XCT.
SAVE B
SAVE C
SAVE D
MOVEI B,@-1(A) ;GET ADDR THAT 1ST XCT XCTED.
;(THIS WILL BE AN ENTRY IN 45IRU1 OR 45IRU3)
CAIL B,45IRU3 ;IF IN 45IRU3, MAKE -> CORRESP ENTRY IN 45IRU1
SUBI B,45IRU3-45IRU1 ;(ALSO 45IWU3 BECOMES 45IWU1)
CAIL B,45IWU1 ;IF WERE WRITING, REMEMBER THAT FACT IN SIGN(D)
HRLI D,4^5
CAIL B,45IWU1 ;NOW GET ADDR OF SEGT'S 45IRU1 ENTRY.
SUBI B,45IWU1-45IRU1
SUBI B,45IRU1 ;NOW B HAS SEGMENTS IDX.
CAIGE B,140
JUMPGE B,.+2
.VALUE ;RIDICULOUS SEGT IDX.
HRRI D,(B)
LDB A,[50200,,D] ;LOW 4 BITS OF D HAVE SEGT # AND I VS D.
ANDCMI D,-20
ADD D,[3_4 ? 1_4 ? 0](A) ;NOW NEXT 2 BITS HAVE SEGT'S MODE.
SKIPN ROSSR0
DPB D,[45PSGN,,RSSR0] ;STORE THAT INFO FOR PRGM.
MOVE C,RSDR0(B) ;GET SDR FOR THIS SEG.
LDB A,[45PACF,,C]
MOVE A,45TRA2(A) ;NOW DISPATCH ON ACCESS ALLWED FOR SEG
JUMPGE D,(A) ;AND DIRECTION OF ACCESS.
IORI C,45BWRT ;IF WERE WRITING, SET "WRITTEN" BIT FOR SEG.
HRRM C,RSDR0(B)
HLRZ A,A
JRST (A)
;FOR EACH ACCESS TYPE, 2 LETTERS (GIVING 2 HALFWDS)
;A FOR ABORT, W FOR ABORT-READ-ONLY, M FOR MEM MGMT TRAP,
;N FOR DO NOTHING (IF WRITE), E FOR DO NOTHING (IF READ)
45TRA2: .BYTE 18.
IRPS AA,,AA WM WE AA MM ME NE AA
IRPC BB,,AA
45TRA!BB
TERMIN TERMIN
.BYTE
;COME HERE TO GIVE READ-ONLY ABORT.
45TRAW: SKIPA D,[45BARO] ;SET APPRO BIT IN RSSR0.
;COME HERE FOR NOT-RESIDENT ABORT.
45TRAA: SKIPE DDTPDP
ERROR [ASCIZ/NONRES/]
MOVEI D,45BANR
IORM D,RSSR0
45TRAL: MOVEI D,45BIC ;INSN NOT COMPLETED - WE ABORTED.
ANDCAM D,RSSR0
HRRZ D,OPC ;GIVE PRGM ADDR OF START OF INSN.
LSH D,1
HRRM D,RSSR2A
;NOW FIGURE OUT WHICH REGISTERS WERE AUTOINCREMENTED
;OR DECREMENTED, AND PUT THE INFO IN SSR1.
HLLZS RSSR1
LDB A,[270400,,@-3(P)] ;AC FLD OF 2ND XCT.
AOSN IMTPR6 ;IF TRAPPED OUT OF MTPI,
JRST [MOVEI MA,26 ;SAY WD WAS POPPED OFF R6.
HRRM MA,RSSR1
JRST .+1]
JUMPE A,45FALX ;THIS 45IRMA SAID NO REGS COULD HAVE CHANGED.
;(TAKES CARE OF FUNNY CASES SUCH AS FAULT
;DURING INSN FETCH OR VTRAP)
SAVE MA ;ELSE GROVEL AROUND.
HRRZ MA,OPC ;RE-FETCH THE INSN BEING EXECUTED.
LDB D,[SEGBP,,MA]
XCT 45IRU5(D) ;(DON'T USE 45IRU1 SINCE MIGHT JSP TO 45TRAP)
MOVE B,PDP11(MA) ;DON'T CALL MTRAPR A SECOND TIME.
LDB MA,[061200,,B] ;GET IDX INTO I1TAB.
SKIPL I1TAB(MA) ;THIS INSN NOT 2 ADDRESS INSN =>
ANDCMI A,1 ;DON'T WORRY ABOUT SRC ADDRESS.
JUMPE A,45FALZ
HLL A,I1TAB(MA) ;BIT 4.8 SAYS WHETHER WD INSN OR BYTE.
TRZN A,1 ;LOOK AT SRC ADDR IF NEC.
JRST 45FAL1
45FAL0: LDB MA,[110300,,B] ;GET ADDRESS MODE OF THIS ADDR.
CAILE MA,1 ;IS IT AUTOINC OR AUTODEC?
CAIL MA,6
JRST 45FAL1 ;NO.
LDB D,[060300,,B]
CAIN D,7 ;R7 TAKEN CARE OF BY SSR2, IGNORE IT HERE.
JRST 45FAL1
ROT MA,-1 ;(INDIRECT BIT IN SIGN)
CAIN D,6 ;R6 MOVES EVEN # ALWAYS, SO PRETEND
TLO MA,400000 ;THIS WAS A WORD INSN.
ADD D,45FAL3-1(MA) ;SAY THIS REG CHANGED BY 1.
SKIPL MA ;BUT IF INDIRECT ADDR OR WD INSN
TLNE A,200000
ADD D,45FAL3-1(MA) ;IT WAS CHANGED BY 2.
LDB MA,[1000,,RSSR1]
DPB MA,[101000,,RSSR1]
DPB D,[1000,,RSSR1] ;PUT THIS INFO IN SSR1.
45FAL1: LSH B,8 ;MOVE DEST ADDR WHERE SRC ADDR SHOULD BE,
TRZE A,2 ;LOOK AT DEST ADDR IF NEC.
JRST 45FAL0
45FALZ: REST MA
45FALX: JRST 45TRA3
45FAL3: 10 ;AUTOINCR MOVES UP 1,
-10 ;AUTODECR MOVES DOWN.
;COME IF READING AND NO SPECIAL HACK REQUIRED BY ACCESS CODE.
45TRAE: SKIPE 45ASLP ;THE ONLY THING THAT COULD GET HERE IS
JRST 45TRAL ;A SEGMENT LENGTH ABORT.
.VALUE
;COME HERE TO GIVE MEM MGMT TRAP AND SET A-BIT IN SDR.
45TRAM: SKIPE DDTPDP
JRST 45TRAX ;NO MEM MGMT TRAPS FROM DDT REFERENCES.
IORI C,45BACC ;SET THE A-BIT.
HRRM C,RSDR0(B)
SKIPE 45ASLP ;IF GOT HERE FROM 45ASL, LET
JRST 45TRAL ;ABORT TAKE PRECEDENCE OVER TRAP.
MOVE A,45IRU5(B) ;NOW THAT A-BIT SET, NO NEED
MOVEM A,45IRU1(B) ;FOR FUTURE REFS TO SEGT TO SET IT.
TRNE C,45BWRT
MOVEM A,45IWU1(B)
MOVE A,45IRU7(B)
MOVEM A,45IRU3(B)
TRNE C,45BWRT
MOVEM A,45IWU3(B)
LDB A,[45PTPE,,RSSR0]
JUMPE A,45TRAX ;IF INT NOT ENABLED, NO TRAP.
MOVEI C,45BMMT+45BIC ;ELSE SAY TRAPPING AND INSN COMPLETED.
IORM C,RSSR0
MOVEI A,45TRAB
CALL MTRNEW
45TRAX: REST D
REST C
REST B
REST A
JRST -1(A) ;RETRY THE RELOCATION PROCESS
;(CAN'T GET HERE FROM 45ASL)
45TRAB: 4,,500000
-1
JRST .+1
MOVEI T,250/4
JRST VTRAP ;TAKE MEM MGMT TRAP.
45TRAN: SKIPE 45ASLP ;WRITING BUT NOTHING SPECIAL TO DO:
JRST 45TRAL ;CAME FROM 45ASL => DO THE ABORT.
MOVE A,45IRU1(B) ;ELSE WE ALREADY SET THE WRITTEN BIT, SO
MOVEM A,45IWU1(B) ;FUTURE WRITES NEEDN'T BE CAUGHT.
MOVE A,45IRU3(B)
MOVEM A,45IWU3(B)
JRST 45TRAX
45TRA3: SUB P,[4,,4] ;FLUSH THE PUSHED ACS.
MOVEI T,250/4 ;ABORT DUE TO PAGE FAULT.
JRST TRPINS
;INITIALIZE AT ENTRY TO PAGE TRAP RTNS.
;SAVE A, AND COPY THE ERROR FLAGS FROM RSSR0P0 TO ROSSR0.
;PAGE TRAP RTNS SHOULD NOT ALTER RSSR0 IF ROSSR0 IS NONZERO.
45TRAI: 0 ;CALL WITH JSR.
SETZM 45ASLP ;THIS ISN'T A SEG'T LENGTH PROBLEM.
SAVE A
MOVE A,RSSR0
ANDI A,45BANR+45BASL+45BARO+45BMMT+45BPAT
SKIPE DDTPDP ;IN DDT, PREVENT MODIFICATION OF RSSR0
SETO A,
MOVEM A,ROSSR0 ;REMEMBER WHAT THE ERROR FLAGS ARE.
MOVE A,(P)
JRST @45TRAI
;ROUTINE FOR REFERENCE TO SSR0.
SSR0HK: TLNN B,220000 ;IF NOT WRITIG, NOTHING SPECIAL.
RET
XXWAIT
MOVEI B,45MR0U ;USER HAS WRITTEN: CLEAR THE UNUSED BITS.
ANDCAB B,RSSR0
MOVEI A,45TRAB ;IF MEM MGMT TRAP PENDING BUT USER
TRNN B,45BTPE ;HAS JUST DISABLED THEM, FLUSH IT.
CALL QDEL
TRNN B,45BSGE ;SEE IF USER HAS TURNED PAGING ON OR OFF.
JRST SSR0H1
SKIPE 45SGON ;NOW ON: WAS IT OFF?
RET
SETOM 45SGON ;YES, SAY NOW ON,
SSR0H4: MOVE A,45MODE ;NOW LOAD THE APPROPRIATE STUFF
MOVE B,45DSNB(A)
MOVE A,45NMO3(A) ;INTO THE X TABLES.
TDNE B,RSSR3 ;CURRENT MODE'S D-SPACE ENABLED =>
JRST [BLT A,45IWXE ;2ND HALF OF X-TABLES PTS TO D-SPACE SEGS.
RET]
BLT A,45DWX1-1 ;ELSE MAKE I-SPACE PART NORMAL
MOVE A,[45IWX1,,45DWX1]
BLT A,45IWXE ;THEN MAKE 2ND HALF PT TO I-SPACE, TOO.
RET
SSR0H1: SKIPL 45SGON ;NOW OFF: WAS IT ON?
RET
SSR0H2: SETZM 45SGON ;YES, SAY NOW OFF,
MOVE B,[45IWXI,,45IWX1]
BLT B,45IWXE ;FILL X TABLES WITH THEIR NON-PAGING VALUES.
RET
] ;END 45Y
PIRHAK: TLNN B,22000 ;PROGRAMMED INTERRUPT
RETURN
XXWAIT
MOVEI A,PIRBLK
PUSHJ P,QDEL
HRRZ B,RPIR
TRZ B,777
HRRM B,RPIR
JFFO B,.+2
RETURN
SUBI C,27. ;GET NEG OF PRIORITY
MOVNS C
DPB C,[10300,,RPIR]
DPB C,[50300,,RPIR]
JSP A,MTRDES
PIRBLK: 0
-1
JRST .+1
MOVEI A,PIRBLK
PUSHJ P,MTRNEW
MOVEI T,240/4
JSP A,VTRAP
; THE EAE
AEAE: PUSHJ P,WRDINS
IRPS X,,[DIV,MQ,MUL,SCSR,NOR,LGS,ARS]
600000+N!X,,R!X
TERMIN
0,,RAC
0
SETOM WEAE
RETURN
DEAE: PUSHJ P,WRDZAP
RDIV,,RARS
SETZM WEAE
RETURN
;SET WORD IN RANGE TO NXM
; PUSHJ P,WRDZAP
; FROM,,TO ;INCLUSIVE
;
WRDZAP: HLRZ A,@(P) ;SET WORDS TO NXM
HRRZ B,@(P)
SUBM A,B
SOS B
HRL A,B
MOVSI B,600000
WRDZP2: LDB C,[MARPOS,,(A)]
MOVEM B,(A)
DPB C,[MARPOS,,(A)]
AOBJN A,WRDZP2
POPJ1: AOS (P)
RETURN
DIVHAK: HLLZS RDIV
TLNN B,22000
RETURN
XXWAIT
HRRZ A,RMQ
LSH A,2
HRL A,RAC
TLNE A,100000
TLO A,600000
HRRZ C,RDIV
LSH C,2
TRNE C,400000
TLO C,-1
JFCL 17,.+1
IDIV A,C
ASH B,-2
MOVEI C,3
SKIPL A
MOVEI C,0
DPB C,[160200,,SCSR]
DPB A,[2000,,RMQ]
DPB B,[2000,,RAC]
JFCL 10,DIVOVF
MOVMS A
CAIGE A,20000
RETURN
DIVOVF: TRC C,2
DPB C,[160200,,SCSR]
RETURN
MQHAK: TLNN B,22000
RETURN
XXWAIT
MOVE A,RMQ ;EXTEND SIGN INTO AC
TRNN A,100000
JRST MQTRP2
MOVEI A,177777
HRRM A,RAC
RETURN
MQTRP2: HLLZS RAC
RETURN
MULHAK: HLLZS RMUL
TLNN B,22000
RETURN
XXWAIT
HRRZ A,RMQ
LSH A,2
TRNE A,400000
TLO A,-1
HRRZ C,RMUL
LSH C,2
TRNE C,400000
TLO C,-1
IMUL A,C
MOVEI C,3
SKIPL A
MOVEI C,0
DPB C,[160200,,SCSR]
LSH A,-2
HLRM A,RAC
LSH A,-2
DPB A,[2000,,RMQ]
RETURN
SCSRHK: TLNN B,54000
JRST SCSRH2
HRRZ C,SCSR
TRZ C,37000
HRRZ A,RMQ
TRNN A,177777
TRO C,6000 ;MQ=0 (ALSO SET AC=MQ=0)
HRRZ B,RAC
TRCN B,177777
TRO C,10000 ;AC=0
TRNN B,177777
TRO C,20000 ;AC=-1
TRNN C,10000
TRZ C,2000 ;TURN OFF AC=MQ=0
TRNN A,100000
TRNN C,10000
SKIPA
TRO C,1000 ;SINGLE PRECISION
TRNE A,100000
TRNN C,20000
SKIPA
TRO C,1000 ;"
HRRM C,RSCSR
SCSRH2: TLNN B,22000
RETURN
XXWAIT
MOVE A,RSCSR
ANDI A,140477
HRRM A,SCSR
RETURN
SCSR: 0
WEAE: -1
LGSHAK: HLLZS RLGS
TLNN B,22000
RETURN
XXWAIT LGSTRP
ARSHAK: HLLZS RARS
TLNN B,22000
RETURN
XXWAIT
SKIPA C,RARS
LGSTRP: HRRZ C,RLGS
TRNE C,100000
TRO C,600000
HRRZ B,RMQ
LSH B,2
HRL B,RAC
LSH B,2
AND C,[400000,,77]
TRNE C,40
TRO C,777700
SKIPGE C
SKIPL B
TDZA A,A
MOVNI A,1
JFCL 17,.+1
SKIPL C
LSHC A,(C)
SKIPGE C
ASHC A,(C)
TRNE C,400000
LDB A,[30100,,B]
TRNN C,400000
ANDI A,1
DPB A,[80100,,SCSR] ;LAST BIT SHIFTED OUT
MOVEI A,1
SKIPL B
SOJA A,ARLGPS
DPB A,[160100,,SCSR]
JFCL 10,[SOJA A,.+1]
DPB A,[170100,,SCSR]
ARLGPT: LSH B,-2
HLRM B,RAC
LSH B,-2
DPB B,[2000,,RMQ]
MOVE A,SCSR
TRZ A,77
HRRM A,SCSR
RETURN
ARLGPS: DPB A,[160100,,SCSR]
JFCL 10,[AOJA A,.+1]
DPB A,[170100,,SCSR]
JRST ARLGPT
NORHAK: MOVE A,SCSR
ANDI A,77
HRRM A,RNOR
TLNN B,22000
RETURN
XXWAIT
HRRZ B,RMQ
LSH B,2
HRL B,RAC
LSH B,2
JUMPE B,NORZRO
CAMN B,[-1,,777760]
JRST NORMON
CAMN B,[777774,,]
JRST NORHLF
TDZA C,C
NORLUP: LSHC A,1
TLNN B,400000
JRST NORTR2
TLNE B,200000
AOJA C,NORLUP
NORTR4: MOVE I,SCSR
TRZ I,77
TRO I,(C)
HRRM I,SCSR
ANDI A,1
DPB A,[80100,,SCSR]
MOVEI A,3
SKIPL B
MOVEI A,0
DPB A,[160200,,SCSR]
LSH B,-2
HLRM B,RAC
LSH B,-2
DPB B,[2000,,RMQ]
RETURN
NORTR2: TLNN B,200000
AOJA C,NORLUP
JRST NORTR4
NORZRO: MOVEI C,31.
MOVEI A,0
JRST NORTR4
NORMON: SKIPA C,[30.]
NORHLF: MOVEI C,30.-16.
MOVSI A,600000
JRST NORTR4
TXN[
ANULDI: PUSHJ P,DNGDIS
PUSHJ P,BLKGET
600000,,RNGCSR
PUSHJ P,WRDINS
0,,RNGCSR
0,,RNGREL
0
POPJ P,
DNULDI: PUSHJ P,BLKZAP
RNGCSR
POPJ P,
;NG DISPLAY
ANGDIS: SKIPE WNGDIS
PUSHJ P,DNGDIS
.DSTART NULDIS
JRST DISLOS
PUSHJ P,BLKGET
600000,,RNGCSR
PUSHJ P,BLKGET
NGBLK
PUSHJ P,BLKGET
NGBLK+2000
PUSHJ P,WRDINS
600000+NNGCSR,,RNGCSR
0,,RNGREL
0
SETOM WNGDIS
SETZM NGSTOP
SETZM NGLNXM
MOVE A,[-5,,NGDATA]
HRRM A,NGMBE-NGDATA(A)
SETZM (A)
AOBJN A,.-2
MOVE B,[20154,,221000]
MOVEM B,(A)
MOVE B,[120000,,600001]
MOVEM B,1(A)
MOVE B,[20000,,220000]
MOVEM B,2(A)
MOVE B,[121000,,600400]
MOVEM B,3(A)
MOVEI B,3000
MOVEM B,4(A)
MOVEM B,5(A)
ADDI A,6
MOVEM A,NGMBE+5
JRST NGSIMD
NGDMOD==136
WNGDIS: 0
DISOUT: 0
NGCURC: -1 ;CURRENT "CONSOLE" #
NGMBE=NGBLK
NGSTOP=NGMBE+6 ;-1=CONSOLE STROP INTERRUPT REQ
NGLNXM=NGSTOP+1
NGCURP=NGLNXM+1 ;CURRENT CONSOLE POINTER
NGPCPC=NGCURP+1 ;CURRENT CONSOLE #
NGXCO=NGPCPC+3
NGYCO=NGXCO+3
NGDATA=NGYCO+3
DNGDIS: .DCLOSE
PUSHJ P,BLKZAP
RNGCSR
PUSHJ P,BLKZAP
NGBLK
BLKFLS NGSIMB
NGINTB,,NGCNS0
NGCNS1,,NGCNS2
0
SETZM WNGDIS
SETZM DISOUT
RETURN
NGSIMD: SKIPL NGCURC
RETURN
MOVEM TIME,RTIME
MOVEI I,3
PUSHJ P,NGOPEN
MOVEI X,1
PUSHJ P,NGSMOD
MOVEI X,220777
PUSHJ P,DISINS
MOVEI X,1000
PUSHJ P,DISINS
SETZM NGCMOD
SETOM DISOUT
PUSHJ P,CREGS
PUSHJ P,CBUSS
SETZM DISOUT
PUSHJ P,NGSTRT
MOVE C,TIME
ADDI C,2*WAITTS
JSP A,CTRDES
NGSIMB: 0
-1
PUSHJ P,NGSIMD
NGFRZ: BLKFLS NGCNS0
NGCNS1,,NGCNS2
0
NGCINT: JSP A,MTRDES
NGINTB: 5
-1
JRST .+1
SETZM NGSTOP
MOVEI T,56
JSP A,VTRAP
NGCSRK: TLNN B,54000
JRST NGCSRW
ANDI A,170407
IOR A,NGLNXM
HRRM A,RNGCSR
TLNN B,22000
RETURN
NGCSRW: XXWAIT
HRRZ B,RNGCSR
MOVEI I,0
PUSHJ P,NGGOGO
MOVEI I,1
PUSHJ P,NGGOGO
MOVEI I,2
PUSHJ P,NGGOGO
TRNE B,60000
TROA B,100000 ;NXM FROM EXTENSION BITS
TRNE B,100000
TRNN B,10000
SKIPA
JRST NGFRZ
TRNE B,400
AOSE NGSTOP
RETURN
JRST NGCINT
NGINFO: 1,,NGCNS0
2,,NGCNS1
4,,NGCNS2
IRPC X,,[012]
NGCNS!X: 6,,
-1
PUSHJ P,NGCNR!X
TERMIN
NGGOGO: HRRZ A,NGINFO(I)
HLRZ C,NGINFO(I)
TRNN B,(C)
JRST QDEL
SKIPL 1(A)
RETURN
PUSHJ P,MTRNEW
MOVE A,I
MOVEM A,NGPCPC(I)
SETZM NGXCO(I)
SETZM NGYCO(I)
RETURN
NGCNR0: TDZA I,I
NGCNR1: MOVEI I,1
SKIPA
NGCNR2: MOVEI I,2
PUSHJ P,NGOPEN
MOVEI X,1
PUSHJ P,NGSMOD
MOVEI X,220000
ADD X,NGYOF(I)
ADDI X,400
PUSHJ P,DISINR
MOVEI X,0
ADD X,NGXOF(I)
ADDI X,400
PUSHJ P,DISINR
SETZM NGCMOD
MOVE MA,NGPCPC(I)
NGMLUP: ANDI MA,77777
MOVE TT,MA
PUSHJ P,NGGETL
MOVE MB,T
TRNN MB,140000
AOJA MA,NGMLUP
TRNN MB,100000
JRST NGMLP0
TRNN MB,40000
JRST NGMLPJ
TRNE MB,20000
AOJA MA,NGMLUP
TRNN MB,14000
JRST NGMLCN
TRNN MB,10000 ;POINT MODE
JRST NGMXYY
LDB X,[800,,MB]
ADDB X,NGXCO(I)
ADDI X,200
ANDI X,377
LSH X,1
ADD X,NGXOF(I)
PUSHJ P,NGXYIN
NGMXYY: TRNN MB,4000
AOJA MA,NGMLUP
LDB X,[800,,MB]
ADDB X,NGYCO(I)
ADDI X,200
ANDI X,377
LSH X,1
ADD X,NGYOF(I)
TRO X,200000
PUSHJ P,NGXYIN
AOJA MA,NGMLUP
NGXOF: 0
1000
0
NGYOF: 1000
1000
0
NGPOP: MOVEI TT,8(I)
PUSHJ P,NGGETL
ADDI T,2
ANDI T,177777
HRRM T,PDP11(TT)
LSH T,-1
SOS TT,T
ANDI TT,77777
NGGETL: MOVE T,RNGREL
LSH T,-1
ADD TT,T
TRNE TT,700000
JRST NGTNXM
SKIPGE T,PDP11(TT)
JSP D,NGMTRW
RETURN
NGRNXM: SUB P,[1,,1]
NGTNXM: SUB P,[1,,1]
.VALUE
NGXYIN: TRNE MB,2000
TRO X,2000 ;INTENSIFY
PUSH P,X
MOVEI X,1
PUSHJ P,NGSMOD
POP P,X
SETZM NGCMOD
DISINR: HRRZ T,NGCURP
ADDI T,2
CAML T,NGMBE+1(I)
JRST DISERR
IDPB X,NGCURP
RETURN
DISERR: HRRZM I,QT
TTOA [ASCIZ /
OVERFLOW DIS CONSOLE T/]
SUB P,[1,,1]
JRST NGMSTP
NGMLPJ: EXCH MA,MB ;PUSHJ
AOS MB
ANDI MB,77777
LSH MB,1
MOVEI TT,8(I)
PUSHJ P,NGGETL
SUBI T,2
ANDI T,177777
HRRM T,PDP11(TT)
MOVE TT,T
LSH TT,-1
PUSHJ P,NGGETL
HRRM MB,PDP11(TT)
JRST NGMLUP
NGMLP0: MOVEI X,6 ;INCREMENT
PUSHJ P,NGSMOD
LDB E,[130300,,MB] ;DIRECTION
LDB TT,[100300,,MB] ;COUNT
SKIPN TT
MOVEI TT,8
MOVNM TT,NGTEM
MOVE T,[100,,MB]
MOVEI TT,8
DPB TT,[360600,,T]
MOVE TT,T
NGMLPZ: ILDB T,TT
LDB T,NGLDB(E)
XCT NGXINC(T)
XCT NGYINC(T)
LSH T,@NGCMD2
LDB X,NGCURP
IOR X,T
DPB X,NGCURP
MOVNI X,4
ADDB X,NGCMD2
SKIPGE X
PUSHJ P,NGSTIN
AOSGE NGTEM
JRST NGMLPZ
AOJA MA,NGMLUP
NGTEM: 0
NGLDB: REPEAT 8,40000*.RPCNT+400,,NGLDC(T)
NGLDC: 05460634202
35677735652
NGXINC: REPEAT 8,JFCL
REPEAT 4,AOS NGXCO(I)
REPEAT 4,SOS NGXCO(I)
NGYINC: REPEAT 4,[JFCL
JFCL
AOS NGYCO(I)
SOS NGYCO(I)
]
NGMLCN: TRNE MB,2000 ;CONTROL COMMAND
SETZM NGXCO(I) ;RESET X
TRNE MB,1000
SETZM NGYCO(I) ;RESET Y
TRNE MB,200
PUSHJ P,NGPOP
TRNE MB,400
JRST NGMSTP
TRNN MB,100
AOJA MA,NGMLUP
PUSHJ P,NGPOP
LSH T,-1
HRRZ MA,T
JRST NGMLUP
NGMSTP: HLRZ A,NGINFO(I)
ANDCAM A,RNGCSR
SETOM NGSTOP
JRST NGSTRT
;OPEN SPACE TO PUT IN DISPLAY COMMANDS
NGOPEN: SKIPL NGCURC
NGOPNF: TTOA [ASCIZ /
DISPLAY PHASE ERROR/]
MOVEM I,NGCURC
.DSTOP
MOVE MA,NGMBE+5
CAILE MA,NGBLK+4000
NGOPNE: TTOA [ASCIZ /
DISPLAY POINTERS ERROR/]
CAIL MA,NGBLK+4000
JRST NGOPE4
MOVEI MB,NGBLK+4000
MOVEM MB,NGMBE+5
MOVEI X,4
NGOPE2: SOS MA
SOS MB
MOVE T,(MA)
MOVEM T,(MB)
CAMLE MA,NGMBE(X)
JRST NGOPE2
CAME MA,NGMBE(X)
JRST NGOPNE
HRRM MB,NGMBE(X)
CAIGE I,-1(X)
SOJA X,NGOPE2
CAIE I,-1(X)
JRST NGOPNE
NGOPE4: MOVE X,NGMBE(I)
TLO X,442200
MOVEM X,NGCURP
MOVEI X,NGDMOD
IDPB X,NGCURP
SETZM NGCMOD
RETURN
]
;LIST PROCESS GENERAL REGISTERS AND CONTENTS
CREGS: MOVSI T6,REGBIT
PUSH P,SF
SKIPL DDTPDP ;IF NOT IN DDT,
HRLZ SF,%TMODE ;GET TEMP. MODES.
CREGS2: MOVE T,R0(T6)
MOVEM T,QT
CRF
ADRTYP T6
TTOA [ASCIZ &/ T&]
AOS T6
TRNN T6,10
JRST CREGS2
POP P,SF
CRPOPJ: CRF
RETURN
TXN[
DISINS: HRRZ T,NGCURP ;DISPLAY INSERT
CAMGE T,NGMBE+1(I)
IDPB X,NGCURP
RETURN
DISIN0: PUSH P,X
MOVEI X,0
PUSHJ P,DISINS
POP P,X
RETURN
NGSMOD: CAMN X,NGCMOD ;SET MODE
RETURN
HRRZ T,NGCMOD
JRST .+1(T)
JRST NGSTRM
JRST NGSTRM
.VALUE
JRST NGCHEX
JRST NGVIEX
JRST NGVIEX
JRST NGVIEX
.VALUE
NGSTRM: LDB T,NGCURP
DPB X,[150300,,T]
DPB T,NGCURP
MOVEM X,NGCMOD
JRST .+1(X)
RETURN
RETURN
.VALUE
JRST NGSTCH
RETURN
RETURN
JRST NGSTIN
.VALUE
NGCHEX: PUSH P,[NGVIEY]
PUSH P,I
PUSH P,X
PUSH P,T
PUSH P,A
MOVEI A,37
JRST DISCHH
NGVIEX: LDB T,NGCURP
TRO T,400000
DPB T,NGCURP
NGVIEY: SETZM NGCMOD
PUSHJ P,DISIN0
JRST NGSMOD
NGSTCH: PUSHJ P,DISIN0
NGST14: MOVEI T,14
MOVEM T,NGCMD2
RETURN
NGSTIN: PUSH P,X
MOVEI X,200000
PUSHJ P,DISINS
POP P,X
JRST NGST14
NGCMOD: 0 ;CURRENT HWD MODE
NGCMD2: 0 ;IF CUR MODE IS CHAR OR INC, HAS P OF NEXT FREE FIELD
DISCH: PUSH P,I
MOVEI I,3
PUSH P,X
PUSH P,T
PUSH P,A
MOVEI X,3
PUSHJ P,NGSMOD
ANDI A,177
CAIN A,12
JRST DISLF
CAIN A,15
JRST DISCR
CAIL A,140
SUBI A,40
SUBI A,40
SKIPGE A
TTOA [ASCIZ /
BAD DISPLAY CHAR/]
XORI A,40
ANDI A,77
DISCHH: LSH A,@NGCMD2
LDB X,NGCURP
IOR X,A
DPB X,NGCURP
MOVNI X,6
ADDB X,NGCMD2
SKIPGE X
PUSHJ P,NGSTCH
DCHRET: POP P,A
POP P,T
POP P,X
POP P,I
RETURN
DISLF: MOVEI A,33
JRST DISCHH
DISCR: MOVEI X,1
PUSHJ P,NGSMOD
MOVEI X,1016
PUSHJ P,DISINS
MOVEI X,3
PUSHJ P,NGSMOD
JRST DCHRET
;CLOSE UP DISPLAY LIST AND START
NGSTRT: SKIPGE I,NGCURC
JRST NGOPNF
MOVEI X,0
PUSHJ P,NGSMOD
MOVE MA,NGCURP
TLNE MA,770000
PUSHJ P,DISIN0
MOVEI MA,1(MA)
CAMLE MA,NGMBE+1(I)
JRST NGOPNE
CAML MA,NGMBE+1(I)
JRST NGSTR4
MOVE X,NGMBE+1(I)
HRL MB,X
HRR MB,MA
SUBB MA,X
ADD MA,NGMBE+5
BLT MB,-1(MA)
NGSTR2: ADDM X,NGMBE+1(I)
AOS I
CAIGE I,5
JRST NGSTR2
NGSTR4: SETOM NGCURC
.DSTART [-4000+NGDATA-NGBLK,,NGDATA-1]
JRST DISLOS
RETURN
AMASTE: TLOA A,-1
DMASTE: TLZ A,-1
.MASTER A,
JRST MSTLOS
RETURN
MSTLOS: TTOA 1,[ASCIZ /
MASTER MODE/]
DISLOS: TTOA [ASCIZ /
DISPLAY/]
TTOA [ASCIZ / NOT AVAILABLE/]
RETURN
NULDIS: -3,,. ;NULL DISPLAY LIST
3000
3000
;THE RK11 DISK
;FUNCTIONS: RKF!FNC
IRPS Y,,CRS WRT RED WCH SEK RCH DRS WLK
RKF!Y==.IRPCN
TERMIN
;BITS IN RKDS REGISTER
;KEPT IN RKDDSR WORDS UNLESS SAYS OTHERWISE IN PARENS.
RKBSOK==400 ;SECTOR COUNT VALID (COMPUTED FROM TIME WHEN RKDS READ)
RKBDRY==200 ;DRIVE READY (IE ATTACHED)
RKBARDY==100 ;ACCESS READY, NOT DOING A SEEK.
RKBWPS==40 ;WRITE-LOCKED.
RKBSCA==20 ;SELECTED SECTOR UNDER HEADS NOW (COMPUTED FROM TIME)
;BITS IN RKER REGISTER (ALL ACTUALLY KEPT IN RRKER1)
RKBDRE==100000 ;RKBDRY WASN'T ON WHEN USED DRIVE.
RKBOVR==40000 ;OVERFLOWED OUT OF LAST CYL.
RKBWLO==20000 ;WROTE ON WRITE LOCKED PACK.
RKBSKE==10000 ;SEEK ERROR.
RKBPGE==4000 ;"PROGRAMMING ERROR"
RKBNXM==2000 ;RK REFERENCED NON EX MEM.
RKBDLT==1000 ;ACCOMPANIES RKBNXM, "DATA LATE".
RKBNXD==200 ;TRIED TO USE NON EX DRIVE.
RKBNXC==100 ;NON EX CYL.
RKBNXS==40 ;NON EX SECTOR (>12.)
RKBWCE==1 ;WRITE-CHECK ERROR (SOFT ERROR)
;BITS IN RKCS REGISTER (KEPT THERE UNLESS SAYS NOT)
RKBERR==100000 ;ERROR (READ AS 1 IF RRKER1 NOT 0)
RKBHE== 40000 ;HARD ERROR (READ AS 1 IF RRKER1 NOT 0 OR 1)
RKBSCP==20000 ;SEARCH COMPLETE
RKBINH==10000 ;INHIBIT MA INCR.
RKBFMT==4000 ;"FORMAT" (IGNORED)
RKBRWA==2000 ;READ-WRITE ALL (IGNORED)
RKBSSE==400 ;STOP ON SOFT ERROR.
RKBRDY==200 ;CONTROL READY (READ AS 1 IF RKRDY NOT 0)
RKBIDE==100 ;INTERRUPT ENABLE.
RKPXM==040200 ;BP TO MA EXTENSION BITS.
RKBGO== 1 ;GO.
RKNSEC==12. ;# SECTORS/TRACK.
RKNCYL==313 ;# CYLS/DRIVE.
IFNDEF RKNDRV,RKNDRV==2 ;2 DRIVES.
IFNDEF RKNBUF,RKNBUF==8 ;8 BUFFERS.
IFNDEF DFNDRV,DFNDRV==2 ;2 RF-11 DISKS.
RKBUF=NGBLK-6000*RKNBUF ;START OF 1ST BUFFER.
RKDRIV: 0 ;RKDTAB IDX OF CURRENTLY SELECTED DRIVE.
;THIS TABLE HAS 1 ENTRY FOR EACH RK OR DF DRIVE.
RKDTAB:
REPEAT RKNDRV+DFNDRV,[
0 ? -1
CALL RKDWA1 ;CLOCK QUEUE BLOCK FOR DRIVE.
0 ;PC TO RESTART AT CLOCK QUEUE.
.RPCNT_15+RKBSOK ;DSR FOR DRIVE (DRIVE NUM. IN ID FIELD)
0 ;SELECTED CYL AND SECTOR NUM.
'DSK ;FILENAME BLOCK.
IFL .RPCNT-RKNDRV, 'RK11_14
.ELSE 'DF11_14
'DRIVE0+.RPCNT
0 ;SNAME.
'DSK,, ;LEFT-JUST DEV NAME FOR .CALL OPEN.
0 ;CURRENT FUNCTION, -1 => WANTS SEARCH COMPLETE INT.
RKDIR+.RPCNT*RKNCYL*2(D) ;-> ROOM IN RKDIR OR DFDIR FOR
;THIS DRIVE'S DIRECTORY. INDEX OF D FOR INDIRECTION.
]
RKDTBL==<.-RKDTAB>/<RKNDRV+DFNDRV> ;LENGTH OF ENTRY.
DFDRVI==RKDTBL*RKNDRV ;IDX OF 1ST RF-11 DRIVE.
IF1 [
IRPS YY,,QBL UNUS UNUS PC DSR ADR FIL FN1 FN2 SNM DEV FNC DIR
RKD!YY=.IRPCNT+RKDTAB
DEFINE RKC!YY
RKD!YY(B)TERMIN
TERMIN
] ;END IF1.
RKDIR: REPEAT RKNDRV,BLOCK 2*RKNCYL ;ONE DIRECTORY PER DRIVE.
DFDIR: REPEAT DFNDRV,BLOCK 2*RKNCYL
;EACH DRIVE'S DIRECTORY HAS 2 HALVES, EACH 1 WORD PER CYL.
;1ST HALF: 1 WD FOR EACH CYL OF ADDRESS SPACE IN THE DISK.
;0 => NO SPACE ALLOCATED, >0 => POSITION IN FILE OF SPACE
;(1 MEANS STARTS AT 1K, 2 MEANS 4K, 3 MEANS 7K, ETC)
;<0 => IN CORE, LH IS 1'S COMP. OF BUFFER #,
;RH 1'S COMP. OF POSITION IN FILE OF SPACE TO SWAP OUT INTO.
;2ND HALF: 1 WD FOR EACH 3K OF SPACE IN FILE:
;0 => SPACE IS UNUSED. >0 => 1'S COMP. OF # OF CYL ALLOCATED TO
;BUFFER TABLES, INDEX BY BUFFER NUM.
RKBFT0: REPEAT RKNBUF,0 ;POSITIVE => BUFFER HAS BEEN WRITTEN IN.
RKBFT1: REPEAT RKNBUF,-1 ;-1 IF FREE, ELSE DRIVE IDX,,ADDR OF RKDIR ENTRY FOR CYL.
RKBFT2: REPEAT RKNBUF,-1 ;-1 IF FREE, ELSE NUMBER OF LAST TRANSACTION.
RKBFT3: REPEAT RKNBUF, -6000,,RKBUF+6000*.RPCNT ;AOBJN -> BUFFER.
RKCNT: 0 ;INCREMENTED FOR EACH TRANSACTION, PUT IN RKBFT2 ENTRY
;(FOR SWAPPING OUT LEAST RECENTLY USED)
RKCHAN: -1 ;CHANNEL NUMBER ALLOCATED TO RK11 AND RF11, OR -1 IF NONE.
RKDOPN: 0 ;NONNEG => RKDTAB IDX OF DRIVE OPEN FOR INPUT ON RKCHAN,
; NEG => 1'S COMPLEMENT OF IDX OF DRIVE OPEN FOR WRITING.
WRK: 0 ;-1 IFF RK ATTACHED.
RKDCNT: 0 ;# DRIVES ATTACHED.
RKRDY: -1 ;READY
RRKER1: 0 ;ERROR BITS KEPT HERE.
RKSERC: 0 ;-1 IFF SOME DRIVE(S) WAITING FOR SEARCH-COMPLETE INT.
RKINSD: 0 ;# OF DRIVE THAT HAS BEEN ALLOWED TO INT SEARCH-COMPLETE.
RKLOCP: 0 ;BP. IN BUFFER, FOR TRANSFERS.
RKSCWC: 0 ;# WDS LEFT THIS SECTOR.
RKWIOR: 0 ;ON WRITE, IOR OF ALL WORDS WRITTEN.
RKTIM: 32500. ;SECTOR ROTATION TIME
RKCTIM: 3350. ;EXTRA SEEK TIME PER CYL
RKXTIM: 100000. ;BASIC SEEK TIME.
RKCSHK: MOVE A,RRKCS ;GET ACTUAL VALUE,
MOVEM A,RRKOCS' ;SAVE OLD VALUE BEFORE PROGRAM WROTE IT.
TLNN B,54000 ;CTRL, STATUS REG.
JRST RKCSWR
ANDCMI A,RKBRDY+RKBERR+RKBHE+RKBGO ;BITS NOT REALLY KEPT THERE.
SKIPE RKRDY
IORI A,RKBRDY ;TURN ON READY BIT IF NEC.,
SKIPE C,RRKER1
IORI A,RKBERR ;ERROR BIT IF ERROR REG NONXERO,
TRNE C,177774
IORI A,RKBHE ;HARD ERROR IF NEC.
HRRM A,RRKCS
TLNN B,22000
POPJ P,
RKCSWR: XXWAIT
MOVE A,RRKCS ;GET VALUE WRITTEN,
ANDCMI A,RKBRDY+RKBERR+RKBHE+RKBGO ;FLUSH BITS KEPT ELSEWHERE.
EXCH A,RRKCS ;GET BACK THE RKBGO THAT WAS WRITTEN.
TRNN A,RKBGO
JRST [ANDCM A,RRKOCS ;IF GO WASN'T SET,
SKIPE RKRDY ;AND WE'RE READY,
TRNN A,RKBIDE ;AND IDE HAS JUST BEEN SET,
RET
JRST RKINTR] ;GIVE INTERRUPT.
MOVEI A,RKBWCE
ANDCAM A,RRKER1 ;NEW FUNCTION, CLEAR SOFT ERRORS.
LDB A,[010300,,RRKCS]
JUMPE A,RKGOCR ;CONTROL RESET DOESN'T SELECT A DRIVE.
LDB B,[150300,,RRKDA]
MOVEI C,RKBNXD
CAIL B,RKNDRV
JRST RKERR ;ELSE ERROR IF DRIVE NUM. TOO LARGE.
IMULI B,RKDTBL ;COMPUTE RKDTAB IDX OF DRIVE.
MOVEM B,RKDRIV ;THIS DRIVE NOW SELECTED.
MOVEI C,RKBDRE
MOVE T,RKCDSR ;GET DRIVE'S STATUS,
TRNN T,RKBDRY
JRST RKERR ;NOT ATTACHED => DRIVE ERROR.
JRST @.(A) ;ELSE DISPATCH TO FUNCTION.
REPEAT 5,RKGOSK ;SEEK AND ALL TRANSFER OPERATIONS.
RKGODR
RKGOWL
;SEEK, READ, WRITE ETC. COME HERE TO ACCESS.
RKGOSK: MOVEI C,RKBSKE ;SEEK ERROR IF HEADS MOVING.
TRNN T,RKBARDY
JRST RKERR
TRNE T,RKBWPS
CAIE A,RKFWRT ;WRITING AND WRITE LOCKED => ERROR.
JRST RKGOS0
MOVEI C,RKBWLO
JRST RKERR
RKGOS0: SETZB C,RKRDY
LDB T,[400,,RRKDA]
CAIL T,RKNSEC
IORI C,RKBNXS ;SECTOR NUM. TOO LARGE.
LDB T,[051000,,RRKDA]
CAIL T,RKNCYL
IORI C,RKBNXC ;CYL NUM. TOO LARGE.
JUMPN C,RKERR ;ANY OF THOSE ERRORS => SAY SO.
MOVEM A,RKCFNC ;ELSE REMEMBER WHAT FUNCTION THIS DRIVE DOING,
CAIN A,RKFSEK
CALL RKINTR ;IF SEEK, CONTROLLER READY NOW, MAYBE INTERRUPT.
MOVEI C,RKBARDY
ANDCAM C,RKCDSR ;THIS DRIVE'S HEADS NOW MOVING.
LDB C,[1500,,RRKDA]
EXCH C,RKCADR ;REMEMBER WHAT CYL AND SECT SELECTED.
LDB C,[051000,,C]
SUB C,T ;# CYLS MUST MOVE THE HEADS.
MOVMS C
JUMPE C,RKGOS3 ;TAKES NO TIME IF SAME CYL.
IMUL C,RKCTIM
ADD C,RKXTIM ;TIME SEEKING WILL TAKE.
JSP A,RKDWAT ;QUEUE UP DRIVE TAT LONG FROM NOW, RETURN.
RKGOS3: MOVEI C,RKBARDY
IORM C,RKCDSR ;REACHED CYL, SAY HEADS NO LONGER MOVING.
MOVE A,RKCFNC
CAIE A,RKFSEK
JRST RKGOS2 ;NOT SEEK => FIND THE RIGHT SECTOR.
SETOM RKCFNC ;SAY WANT A SEARCH-COMPLETE INTERRUPT.
SETOM RKSERC ;SAY THAT SOME DRIVE WANTS ONE.
JRST RKINSC ;TRY TO TAKE INT NOW; RETURN.
;COME FOR READ, WRITE, ETC AFTER REACHED SELECTED CYL.
;REACHED FROM CLOCK QUEUE.
RKGOS2: CALL RKSECT ;PUT CURRENT SECTOR NUM. IN A.
LDB C,[400,,RKCADR]
SUB C,A ;SELECTED-CURRENT.
CAIGE C,
ADDI C,RKNSEC ;SUBTRACT MOD 12.
IMUL C,RKTIM
JSP A,RKDWAT ;WAIT TILL SHOULD START TRANSFER.
MOVEI C,RKWCHK ;GET ADDR. OF RTN FOR THIS OPERATION.
CAIN A,RKFWRT
MOVEI C,RKWRIT
CAIN A,RKFRED
MOVEI C,RKREAD
CAIN A,RKFRCH
MOVEI C,RKRCHK
LDB A,[130100,,RRKCS]
HRLI C,(JRST) ;INH BAR INC
SKIPN A
HRLI C,(AOJA MA,)
MOVEM C,RKLOOP ;SAVE INSN TO INCR MA (MAYBE) AND DO NEXT WD.
LDB D,[051000,,RRKDA]
CALL RKSETU ;SWAP IN THE CYL, RETURN BP IN C.
JRST [ MOVEI D,RKWRTN ;WRITING IN CYL WITH NO SPACE ALLOC'D,
HRRM D,RKLOOP ;SEE IF WRITING ANY NONZEROS BEFORE
JRST .+1] ;TRYING TO ALLOCATE SPACE.
MOVEM C,RKLOCP
LDB D,[0500,,RRKDA] ;GET SECTOR NUM,
TRZE D,20
ADDI D,14 ;CHANGE TO # OF SECTOR WITHIN CYL,
MOVEI C,(D)
IMULI C,200 ;FIND THAT SECTOR'S OFFSET IN BUFFER,
ADDM C,RKLOCP ;MAKE BP -> THAT SECTOR.
SETZM RKWIOR ;(INIT. SO CAN TELL IF WROTE A NONZERO WORD)
RKGOT6: MOVE C,RKTIM ;COMEE HERE TO HANDLE NEXT SECTOR IN CYL.
JSP A,RKDWAT ;WAIT TILL TRANSFER SHOULD BE OVER BEFORE DOING IT.
LDB D,[0500,,RRKDA]
TRZE D,20
ADDI D,14 ;CALC. SECTOR NUMBER AGAIN.
LDB MA,[011700,,RRKBA]
LDB C,[RKPXM,,RRKCS]
DPB C,[170200,,MA] ;PUT TOP 2 BITS INTO ADDRESS.
MOVEI C,400
MOVEM C,RKSCWC ;INIT. COUNT OF WDS IN SECTOR.
ADDI D,1 ;INCREMENT SECTOR ADDR,
CAIG D,13
JRST RKGOT3
SUBI D,14 ;SECOND SURFACE MAYBE (IE CHANGE TO SURFACE NUM AND SECT NUM)
TRO D,20
CAIN D,34 ;MAYBE OVERFLOWED TO NEXT CYL.
MOVEI D,40
RKGOT3: DPB D,[0500,,RRKDA]
ANDI D,40
ADDM D,RRKDA ;HANDLE OVERFLOW TO NEXT CYL.
JRST @RKLOOP ;HANDLE 1ST WORD.
RKGET: MOVSI TT,-RKNBUF ;NO, FIND BUFFER TO READ INTO.
MOVSI C,200000 ;LARGE POS. NUM FOR HOW-GOOD-IS-BEST-SO-FAR.
RKGET2: CAMG C,RKBFT2(TT)
JRST RKGET3 ;THIS BUFFER NOT BETTER.
MOVE C,RKBFT2(TT) ;IT IS BETTER, REPLACE BEST SO FAR.
MOVEI T,(TT)
RKGET3: AOBJN TT,RKGET2
JUMPL C,CPOPJ ;DONE IF BUFFER FREE.
SKIPG RKBFT0(T) ;NO, WRITTEN IN?
JRST [HRRZ C,RKBFT1(T) ;WASN'T WRITTEN, JUST SAY THAT TRACK
HRRZS (C) ;IS NO LONGER IN CORE.
RET]
SAVE B ;WAS WRITTEN IN, MUST SWAP OUT.
HLRZ B,RKBFT1(T) ;WHICH DRIVE'S IS IT?
CALL RKOUTO ;OPEN THAT DRIVE FOR OUTPUT.
REST B
RKGET6: HRRZ C,RKBFT1(T) ;GET ADDR OF RKDIR ENTRY,
HRRZS C,(C) ;GET BLOCK NUM IN FILE, ALSO SAY CYL NOT IN CORE.
JRST RKXFER ;WRITE THE BUFFER OUT.
RKSETU: SKIPN A,@RKCDIR ;A_RKDIR ENTRY FOR THIS CYL.
JRST [MOVE A,RKCFNC ;CYL NOT IN FILE,
CAIN A,RKFWRT
JRST RKNEW1 ;WRITING, SEE IF WRITING ZEROS.
JRST RKGOT4] ;NOT WRITING, FAKE BP TO READ 0'S.
JUMPL A,RKGOT2 ;ALREADY IN CORE?
CALL RKGET ;OBTAIN BUFFER TO READ INTO, IDX IN T.
CALL RKINO ;OPEN DRIVE FOR INPUT.
RKGET5: HRRZ C,@RKCDIR
CALL RKXFER ;READ CYL FROM FILE INTO BUFFER.
RKNEW4: SETCM C,T
HRLM C,@RKCDIR ;PUT -1#<BUFFER NUM> INTO LH OF RKDIR ENTRY.
SETZM RKBFT0(T) ;BUFFER NOT WRITTEN IN YET.
MOVEI C,@RKCDIR
HRLI C,(B) ;REMEMBER DRIVE,,RKDIR-ADDR FOR BUFFER.
MOVEM C,RKBFT1(T)
JRST RKGOT1
RKGOT2: HLRO T,A ;CYL ALREADY IN CORE,
SETCA T, ;GET BUFFER NUMBER.
RKGOT1: AOS C,RKCNT ;GET NUMBER OF THIS TRANSFER,
MOVEM C,RKBFT2(T) ;REMEMBER SO CAN SWAP OUT LEAST RECENTLY USED.
HRRZ C,RKCFNC
CAIN C,RKFWRT ;WRITING => SAY THIS BUFFER MODIFIED.
AOS RKBFT0(T)
HRRZ C,RKBFT3(T) ;GET ADDR BEG OF BUFFER,
HRLI C,442200 ;RETURN BP TO ILDB FROM BUFFER.
JRST POPJ1
RKNEW1: MOVSI C,442200 ;CYL NOT ALLOC'D => NEED LH OF BP FOR IBP'S.
RET ;NO SKIP => CYL NOT ALLOC'D AND WRITING.
RKGOT4: SETZ C, ;READING EMPTY CYL => FETCH ZERO-BYTES.
JRST POPJ1
RKWRTN: SKIPGE MB,PDP11(MA) ;WRITE IN CYL WHICH IS EMPTY.
JSP D,MTRRKR
JUMPE MB,[IBP RKLOCP ? JRST RKINCR]
LDB D,[051000,,RRKDA]
MOVE B,RKDRIV
CALL RKNEW5 ;CREATE THE CYL.
JFCL
ANDI C,-1
ADDM C,RKLOCP ;UPDATE BP SO POINTS TO BUFFER.
MOVEI C,RKWRIT
HRRM C,RKLOOP
JRST (C)
RKNEW5: CALL RKGET ;GET BUFFER (IDX IN T)
MOVE C,RKBFT3(T) ;CREATING A CYL, GOT THE BUFFER..
SETZM (C)
AOBJN C,.-1 ;CLEAR IT OUT.
SAVE D ;REMEMBER CYL NUM.
MOVEI D,RKNCYL ;LOOK FOR FREE SLOT IN FILE.
SKIPE @RKCDIR
AOJA D,.-1
REST C
SETCAM C,@RKCDIR ;SAY THIS CYL USING THE SLOT.
EXCH C,D
SUBI C,RKNCYL-1 ;GET # OF SLOT, (1ST SLOT # 1)
MOVEM C,@RKCDIR ;SAY THIS CYL HAS IT.
JRST RKNEW4
RKWRIT: SKIPGE MB,PDP11(MA)
JSP D,MTRRKR
IDPB MB,RKLOCP
IORM MB,RKWIOR
JRST RKINCR
RKREAD: SKIPGE PDP11(MA)
JSP D,MTRRKW
ILDB MB,RKLOCP
HRRM MB,PDP11(MA)
JRST RKINCR
RKWCHK: SKIPGE MB,PDP11(MA)
JSP D,MTRRKR
ILDB TT,RKLOCP
CAIN TT,(MB)
JRST RKINCR
MOVEI C,RKBWCE ;WRITE-CHECK ERROR.
IORM C,RRKER1
AOS T,RRKWC ;BUT UPDATE RKWC, RKBA.
JRST RKINC1
RKRCHK: IBP RKLOCP
RKINCR: AOS T,RRKWC ;INCR. WORD COUNT.
TRNN T,177777
JRST RKINC1 ;XFER COMPLETE.
SOSLE RKSCWC ;STILL SAME SECTOR =>
RKLOOP: 0 ;INCR. MA AND DO NEXT WD.
RKINC1: DPB T,[2000,,RRKWC] ;DON'T LET RRKWC GET TO BE 200000 .
HLRZ D,RKLOOP ;INCR. MA OVER LAST WD XFERED IF NEC.
CAIN D,(AOJA MA,)
AOJ MA,
DPB MA,[011700,,RRKBA] ;PRETEND HAD BEEN INCR'ING THIS INSTEAD MA.
LSH MA,-17 ;GET UPDATED TOP 2 BITS OF ADDRESS
DPB MA,[RKPXM,,RRKCS] ;STORE WHERE THEY'RE REALLY KEPT.
TRNN T,177777
JRST [HRRZ A,RKLOOP ;TRANSFER FINISHED -
CAIE A,RKWRIT
JRST RKINTR
JRST RKWRT0] ;WRITING, ZERO REST OF SECTOR.
MOVE B,RKDRIV ;MTRRKR AND MTRRKW CLOBBER B.
LDB D,[0500,,RRKDA]
TRNE D,37
JRST RKGOT6 ;SAME CYL, JUST REINIT RKSCWC AND INCR SECTOR NUM.
LDB D,[051000,,RRKDA] ;CYL. NUM.
MOVEI C,RKBOVR
CAIL D,RKNCYL
JRST RKERR ;PAST END OF DISK, ERROR.
MOVE A,RKCFNC
JRST RKGOS0 ;SEEK TO THAT CYL AND KEEP GOING.
RKWRT0: SETZ A,
RKWRT1: SOSG RKSCWC ;COUNT WDS LEFT IN SECTOR,
JRST RKINTR
IDPB A,RKLOCP ;STORE 0 IN EACH.
JRST RKWRT1
RKNXM0: DPB MA,[011700,,RRKBA] ;SAVE THE UPDATED VALUE.
SUB P,[1,,1] ;FLUSH RET ADDR IN MTRAP.
MOVEI C,RKBNXM
;CALL HERE TO RECORD AN ERROR (BIT IN C) AND MAYBE INTERRUPT.
RKERR: IORB C,RRKER1
TRNE C,177774
JRST RKINTR ;HARD ERROR, TRY TO INTERRUPT.
MOVE C,RRKCS ;IT'S SOFT,
TRNN C,RKBSSE ;MAYBE INTERRUPT.
RET
RKINTR: SETOM RKRDY ;CONTROLLER READY, MAYBE INTERRUPT.
MOVE C,RRKCS
TRNN C,RKBIDE
JRST RKINSC ;NOT ENABLED, GO FLUSH RQS FOR SEARCH-COMPLETE INT.
JSP A,MTRNEW ;ENABLED, INTERRUPT.
RKINTB: 5
-1
JRST .+1
MOVEI A,RKBSCP
ANDCAM A,RRKCS
JRST RKINT1
;CHECK FOR ANY DRIVES THAT WANT SEARCH-COMPLETE INTS.
;IF INTS DISABLED, FLUSH RQS.
;IF ENABLED, PICK ONE AND ARRANGE FOR IT TO INTERRUPT.
RKINSC: SKIPE RKRDY ;CONTROLLER NOT READY OR NOONE WANTS ONE => DONE.
SKIPL RKSERC
RET
SKIPL RKINTB+1 ;CAN'T GIVE 2 INTS AT ONCE.
RET
MOVSI B,-RKNDRV ;ELSE CHECK EACH DRIVE.
RKINS1: SKIPL RKCFNC
JRST RKINS2 ;THIS DRIVE DOESN'T WANT ONE.
MOVE A,RRKCS
TRNN A,RKBIDE
JRST RKINS4 ;INTS NOT ENABLED - FLUSH THE RQ.
MOVEM B,RKINSD ;ELSE LET THIS DRIVE INT.
JSP A,MTRNEW
RKINSB: 5
-1
JRST RKINS3
RKINS4: SETZM RKCFNC ;THIS DRIVE NO LONGER WANTS ONE.
RKINS2: ADDI B,RKDTBL-1
AOBJN B,RKINS1
SETZM RKSERC ;NO DRIVE WANTS ONE NOW.
RET
RKINS3: MOVE B,RKINSD ;TAKE A SEARCH-COMPLETE INT. HERE.
SETZM RKCFNC ;THIS DRIVE GOT ONE, SO DOESN'T WANT ONE.
MOVEM B,RKDRIV ;IT IS NOW SELECTED SO ITS DSR IS IN RKDS.
MOVEI B,RKBSCP
IORM B,RRKCS ;SAY THIS IS SEARCH-COMPLETE INT.
RKINT1: CALL RKINSC ;MAYBE ANOTHER DRIVE WANTS ONE TOO.
MOVEI T,44
JRST VTRAP ;TRAP THRU VECTOR 220.
;ACCESS 6000-WORD BLOCK WHOSE NUMBER IS IN C.
RKACC: IMULI C,6000
SUBI C,4000 ;GET ADDR IN FILE.
RKACC1: .CALL [SETZ ? 'ACCESS ? RKCHAN ? SETZ C]
.LOSE %LSFIL
RET
;TRANSFER BLOCK W/ NUM IN C INTO BUFFER (NUM. IN T)
RKXFER: CALL RKACC
MOVE C,RKBFT3(T) ;GET AOBJN -> BUFFER,
RKIOT: .CALL [SETZ ? 'IOT,,? RKCHAN ? SETZ C]
.LOSE %LSFIL
JUMPL C,.-1
RET
RKOPNB: SETZ
SIXBIT/OPEN/
RKCHAN
RKCDEV
RKCFN1
RKCFN2
RKCSNM
404000,,C ;OPEN-MODE IN C.
RKSECT: SAVE B
MOVE A,TIME ;COMPUTE CURRENT SECTOR NUM, LEAVE IN A.
IDIV A,RKTIM ;A HAS # SECTORS TOTAL.
IDIVI A,12. ;B HAS SECTOR NOW AT.
MOVE A,B
POPBJ: REST B
RET
;JSP A, WITH C=TIME TO WAIT, B=DRIVE.
;USE THE CLOCK QUEUE BLOCK IN RKDTAB ENTRY.
RKDWAT: MOVEM A,RKCPC
MOVEI A,RKCQBL
ADD C,TIME
JRST CLQADD
;CLOCK QUEUE CALLS HERE WHEN TIME COMES.
RKDWA1: SUBI B,RKDTAB ;SET UP DRIVE IDX.
MOVE A,RKCFNC ;LEAVE FUNCTION CODE IN A.
JRST @RKCPC ;RESTART AFTER JSP TO RKDWAT.
RKERHK: TLNN B,54000 ;ERROR REGISTER.
POPJ P, ;WRITE
MOVE A,RRKER1 ;GET REAL ERROR REGISTER,
MOVEM A,RRKER ;SUPPLY TO USER.
RET
RKBAHK: TRZ A,1 ;RKBA - DON'T LET LOW BIT BE READ AS 1.
HRRM A,RRKBA
RET
RKDSHK: TLNN B,54000 ;RKDS - READ ONLY REGISTER.
RET ;NOT READING, DO NOTHING.
MOVE B,RKDRIV ;GET SELECTED DRIVE'S IDX,
CALL RKSECT ;PUT CURRENT SECTOR NUM. IN A,
IOR A,RKCDSR ;MERGE WITH SELECTED DRIVE'S STATUS,
HRRM A,RRKDS ;LEAVE THAT TO BE READ.
RET
;WRITE-LOCK FUNCTION.
RKGOWL: MOVEI A,RKBWPS
IORM A,RKCDSR ;SET DRIVE'S WRITE-LOCKED BIT.
JRST RKINTR
;DRIVE RESET FUNCTION.
RKGODR: MOVEI A,(B)
CALL QDEL ;STOP THE DRIVE FROM ACTING.
MOVE B,RKDRIV
SETOM RKCFNC ;DRIVE WANTS SEARCH-COMPLETE INT.
SETOM RKSERC
MOVEI A,RKBWPS
ANDCAM A,RKCDSR ;DRIVE NOT WRITE-LOCKED,
MOVEI A,RKBARDY
IORM A,RKCDSR ;HEADS NOT MOVING.
JRST RKINTR ;GIVE THE 1ST INT - SUCCESSFULLY INITTED.
;ATTACH RK-11 DRIVE.
ARK: SKIPN WRK
CALL ARK0 ;CREATE REGS, BUFFERS, ETC. IF NONEXISTENT.
TLNN SF,NUMFND
RET ;NO DRIVE NUM. GIVEN => THAT'S ALL.
CALL ARKGDN ;GET DRIVE IDX IN B.
ADF1: MOVE C,RKCDSR
TRNE C,RKBDRY
CALL RKSWP ;ALREADY ATTACHED => WRITE OUT PAGES AND DIR.
.SUSET [.RSNAM,,OSNAM] ;ARRANGE TO RESTORE SNAME ON ERROR.
MOVE A,RKCSNM
.SUSET [.SSNAM,,A]
MOVEI A,RKCFIL
CALL DGFIL ;READ NEW FILE NAMES TO USE.
CALL OSNAMR ;RESTORE SNAME UNLESS SPEC'D, GET NEW IN A.
MOVE A,NSNAM ;GET DEFAULT OR SPEC'D SNAME.
MOVEM A,RKCSNM ;SAVE SNAME OF FILE FOR DRIVE.
HRRZ A,RKCFIL
HRLZM A,RKCDEV ;SAVE LEFT-JUST DEV FOR .CALL OPEN.
MOVE C,RKCDSR
TRO C,RKBARDY ;HEADS NOT MOVING.
TRON C,RKBDRY ;IF HADN'T BEEN ATTACHED,
AOS RKDCNT ;1 MORE DRIVE ATTACHED NOW.
MOVEM C,RKCDSR
ARK1: MOVEI C,6 ;TRY TO OPEN FOR READING.
.CALL RKOPNB
JRST ARKCR ;FAIL => NEW FILE.
CALL RKDXFR ;READ IN THE DIRECTORY.
MOVEM B,RKDOPN ;THIS DRIVE OPEN FOR READING.
RET
ARKCR: MOVSI C,-RKNCYL*2
HRR C,RKCDIR
MOVE A,C
SETZM (C) ;NEW FILE, ZERO THE DIRECTORY,
AOBJN C,.-1
HRROS RKDOPN ;NO DRIVE OPEN.
MOVEI C,7 ;CREATE THE FILE.
.CALL RKOPNB
OPENL RKOPNB
SETCAM B,RKDOPN ;THIS DRIVE NOW OPEN FOR WRITING.
MOVE C,A
REPEAT 1000/RKNCYL,[ ;MAKE SURE WRITE OUT 1 WHOLE K.
CALL RKIOT
MOVE C,A] ;WRITE OUT ALMOST 1K, IN RKNCYL-SIZED CHUNKS,
HRLI C,1000/RKNCYL*RKNCYL*2-2000
JRST RKIOT ;WRITE OUT THE REMAINDER.
ARKGDN: MOVEI B,(DL) ;COPY ARG SUPPLIED,
CAIL B,RKNDRV ;ERROR UNLESS VALID # OF DRIVE.
ERROR [ASCIZ/DRIVE/]
IMULI B,RKDTBL ;CONVERT TO DRIVE #.
RET
;CREATE THE RK11 CONTROLLER.
ARK0: CALL WRDINS ;CREATE THE REGISTERS.
IRPS X,,RKDS RKER RKCS RKBA
TRN (N!X)R!X
TERMIN
RRKWC ? RRKDA ? 0
CALL ARKBUF ;ALLOCATE CHANNEL AND BUFFERS IF NEC.
SETOM WRK
ZRK: MOVSI B,-RKNDRV ;SWAP OUT EVERYTHING.
ZRK0: CALL RKSWP ;SWAP OUT ONE DRIVE.
ADDI B,RKDTBL-1
AOBJN B,ZRK0
RKGOCR: SETZM RRKDA
SETOM RKRDY
SETZM RRKER1 ;CLEAR ERROR BITS.
ARK3: BLKFLS RKINTB
.BYTE 18.
REPEAT RKNDRV,RKDTAB+.RPCNT*RKDTBL
RKINSB ? 0
.BYTE
RET
ARKBUF: SKIPL RKCHAN
RET ;CHNL AND BUFS ALREADY EXIST.
MOVEI A,['NUL] ;ALLOCATE A CHANNEL,
CALL GETCHP ;USE NUL: SO OPEN CAN'T FAIL.
HRRZM C,RKCHAN
MOVSI T,-3*RKNBUF
ARK2: CALL BLKGET ;GET CORE FOR BUFFERS.
RKBUF(T)
ADDI T,1777
AOBJN T,ARK2
RET
;OPEN DRIVE <- B FOR OUTPUT UNLESS ALREADY OPEN.
RKOUTO: SETCM C,B
CAMN C,RKDOPN
RET ;ALREADY OPEN.
RKOUTP: SETCAM B,RKDOPN ;WILL BE OPEN NOW.
MOVEI C,100007
.CALL RKOPNB
.LOSE %LSFIL
RET
RKINO: CAMN B,RKDOPN
RET ;ALREADY OPEN.
MOVEM B,RKDOPN
MOVEI C,6
.CALL RKOPNB
.LOSE %LSFIL
RET
;DETACH THE RK OR 1 DRIVE.
DRK: SKIPN WRK
RET ;NOT ATTACHED.
TLNE SF, NUMFND
JRST DRK1 ;DETACH 1 DRIVE.
SETZ B, ;DETACH ALL DRIVES.
DRK0: CALL DRK2 ;DETACH THE NEXT DRIVE,
ADDI B,RKDTBL
CAIGE B,RKDTBL*RKNDRV
JRST DRK0 ;DO THAT TO EACH DRIVE.
CALL ZRK ;GET RID OF QUEUE BLOCKS.
CALL WRDZAP ;GET RID OF DEVICE REGS.
RRKDS,,RRKBA
SETZM WRK
SKIPE WDF ;IF NEITHER DF NOR RK ATTACHED,
RET
DRK4: MOVSI T,-3*RKNBUF
DRK3: CALL BLKZAP ;FREE BUFFER PAGES.
RKBUF(T)
ADDI T,1777
AOBJN T,DRK3
MOVE C,RKCHAN
SETOM RKCHAN
JRST CLOSEC ;FREE THE CHANNEL.
DRK1: CALL ARKGDN ;PUT IDX OF SPEC'D DRIVE IN B.
DRK2: MOVE C,RKCDSR
TRNN C,RKBDRY ;NOT ATTACHED => DONE.
RET
CALL RKSWP ;WRITE OUT DIR AND BUFFERS.
SYSCAL CLOSE,RKCHAN
HRROS RKDOPN ;SAY NOTHING OPEN IN EITHER DIRECTION.
MOVEI A,RKBDRY+RKBWPS
ANDCAM A,RKCDSR
SOS RKDCNT ;1 LESS DRIVE IN USE.
RET
RKSWP: MOVE C,RKCDSR
TRNN C,RKBDRY
RET ;DO NOTHING IF THIS DRIVE NOT ATTACHED.
CALL RKOUTO ;OPEN THIS DRIVE FOR OUTPUT.
MOVSI T,-RKNBUF ;LOOK AT ALL BUFFERS.
RKSWP0: HLRZ A,RKBFT1(T) ;WHICH DRIVE THIS BUFFER?
CAIE A,(B)
JRST RKSWP1 ;SOME OTHER DRIVE.
HRRZ A,RKBFT1(T)
HRRZS C,(A) ;THIS DRIVE, SAY CYL NOT IN CORE,
CALL RKXFER ;WRITE IT OUT.
SETOM RKBFT1(T) ;BUFFER FREE.
SETZM RKBFT0(T)
SETOM RKBFT2(T)
RKSWP1: AOBJN T,RKSWP0
RKDXFR: SETZ C, ;TRANSFER THE DIRECTORY.
CALL RKACC1
HRRZ C,RKCDIR
HRLI C,-2*RKNCYL
JRST RKIOT
;RF-11 DISK (DEVICE DF) PARAMETERS:
;BITS AND FIELDS IN DCS REGISTER:
;(1ST 7 KEPT IN DFERR1, REST IN RDCS)
DFBERR==100000 ;ERROR (IOR OF NEXT 6 BITS)
DFBFRZ==40000 ;FREEZE (IOR OF HIGH BITS OF RDAE1)
DFBWCE==20000 ;WRITE-CHECK ERROR (DIDN'T MATCH)
DFBDPE==10000 ;DISK PARITY ERROR.
DFBNED==4000 ;NON-EX DISK (BAD DISK ADDR)
DFBWLO==2000 ;WRITE-LOCKED AREA OF DISK WRITTEN IN.
DFBMXF==1000
DFBCLR==400 ;CLEAR. SETTING THIS RESETS CONTROLLER.
DFBRDY==200 ;READY (READ AS 1 IF DFRDY NONZERO)
DFBENB==100 ;INT ENABLE.
DFPXM==040200 ;BP TO CMA EXTENSION BITS
DFBMA==10 ;MAINTENANCE BIT (DOES NOTHING)
DFPFNC==010200 ;BP TO FUNCTION FIELD.
DFBGO==1 ;SETTING THIS CAUSES FUNCTION TO BE PERFORMED.
DFBERS=177000 ;BITS WHICH CORRESPOND TO ERRORS.
;BITS IN DAE REGISTER: (KEPT IN RDAE, OR RDAE1 IF READ-ONLY)
DFBNEM==2000 ;NON EX MEM REFERENCED BY DISK CTLR. (IN RDAE1)
DFBINH==400 ;INHIBIT CMA INCR.
DFBDRL==200
DFBDAO==40 ;DISK ADDR OVFLO (IN RDAE1)
DFPDAE==500 ;BP TO ADDRESS EXTENSION BITS.
DFRDY: -1 ;READY
RDAE1: 0 ;READ-ONLY BITS OF RDAE KEPT HERE.
DFDRIV: 0 ;IDX (IN RKDTAB) OF SELECTED DF-11 DRIVE.
DFDELA: 0 ;# WDS WORTH OF XFER TIME MUST WAIT BEFORE SET READY.
DFLOCP: 0 ;BP INTO BUFFER FOR TRANSFER.
DFSCWC: 0 ;# WDS LEFT IN BUFFER (OR IN DISK)
DFERR1: 0 ;READ-ONLY BITS OF DCS KEPT HERE.
DFOWC: 0 ;WHAT RWC HELD AT START OF TRANSFER.
WDF: 0
DFTIM: 165. ;BASIC DSK TIME QUANTUM.
;THE RF11/RS11 DSK
ADF: SKIPN WDF
PUSHJ P,ADF2
CALL ADFGDN ;GET IDX OF DF AS DRIVE OF RK11
JRST ADF1
ADF2: PUSHJ P,WRDINS
IRPS X,,[DCS,CMA,DAE,ADS]
600000+N!X,,R!X
TERMIN
0,,RWC
0,,RDAR
0
CALL ARKBUF ;ALLOCATE DF AND RK CHANNEL AND BUFFERS IF NEC.
SETOM WDF
JRST ZDF
ADFGDN: MOVEI B,RKNDRV(T5)
CAIL B,RKNDRV+DFNDRV
ERROR [ASCIZ/DRIVE/]
IMULI B,RKDTBL
RET
DDF: SKIPN WDF ;DETACH DISK
RET
TLNN SF,NUMFND ;NUMERIC ARG =>
JRST DDF1
CALL ADFGDN ;DETACH SPEC'D DRIVE ONLY.
JRST DRK2
DDF1: MOVEI B,DFDRVI ;NO NUMERIC ARG => DETACH EVERY DRIVE
DDF2: CALL DRK2
ADDI B,RKDTBL
CAIE B,RKDTBL*<RKNDRV+DFNDRV>
JRST DDF2
PUSHJ P,ZDF ;THEN FLUSH DEVICE REGS & QUEUE BLOCKS.
SETZM WDF
PUSHJ P,WRDZAP
RDCS,,RADS
SKIPE WRK ;IF NEITHER DF NOR RK ATTACHED,
RET
JRST DRK4 ;FREE CHANNEL AND BUFFERS.
ZDF: SKIPN WDF
POPJ P,
SETOM DFRDY
SETZM RDAE1
SETZM DFERR1
HLLZS RDAE
HLLZS RWC
HLLZS RDAR
HLLZS RCMA
HLLZS RDCS
BLKFLS RKDTAB+DFDRVI
0
DKINTF: MOVEI A,DSKINT
JRST QDEL
DCSHAK: TLNN B,54000
JRST DCSWRT
PUSHJ P,DCSCMP ;READ CYCLE
HRRM A,RDCS
TLNN B,22000
POPJ P,
DCSWRT: XXWAIT
MOVE T,RDCS
TRNE T,400
JRST ZDF ;POWER CLEAR BIT ON, DO NOTHING ELSE
TRNN T,1 ;GO
JRST DSKINQ
HRRZ A,RDCS
TRNE A,DFBFRZ
JRST DCSTR2
TRZ A,DFBERS
MOVEI D,DFBDAO
ANDCAM D,RDAE1
HRRM A,RDCS
DCSTR2: TRNN A,6
RETURN ;NO OP
SETZM DFRDY ;ABOUT TO START FUNCTION: NOT READY
;COME BACK HERE ON TRANSFERING PAST BOUNDARY OF 3K BLOCK OR
;BOUNDARY OF A DISK DRIVE.
DFRSTR: LDB A,[DFPDAE,,RDAE]
HRRZ D,RDAR ;A HAS HIGH BITS OF DISK ADDR, D LOW BITS.
DPB A,[200200,,D]
LSH A,-2 ;D HAS ADDR IN DRIVE, A HAS DRIVE #.
MOVEI C,DFBNED
CAIL A,DFNDRV ;DOES THAT DRIVE EXIST?
JRST DFERR
IMULI A,RKDTBL
ADDI A,DFDRVI ;GET RKDTAB IDX OF THAT DRIVE.
MOVEM A,DFDRIV
MOVEI B,(A)
MOVEM D,RKCADR ;REMEMBER ADDR WITHIN DRIVE.
MOVE D,TIME ;COMPUTE ROTATIONAL LATENCY AS # WDS
IDIV D,DFTIM ;DISK MUST ROTATE THROUGH.
LDB D,[1200,,RDAR] ;E HAS CURRENT WD, D HAS DESIRED.
SUB D,E
SKIPGE D ;MUST BE GE SO SPIRAL XFER WON'T WAIT TOO LONG.
ADDI D,2000
MOVEM D,DFDELA .SEE DFDONE
LDB A,[DFPFNC,,RDCS]
MOVEM A,RKCFNC ;REMEMBER FUNCTION TO PERFORM.
MOVE C,DFFTAB(A) ;ADDR TO LOOP THRU FOR THAT FUNC. (DFREAD, ETC)
MOVE T,RDAE
TRNE T,DFBINH ;LH(C) HAS AOJA MA, UNLESS
HRLI C,(JRST) ;MA INC INH SET, IN WHICH CASE JRST.
MOVEM C,DFLOOP
MOVE D,RKCADR
IDIVI D,6000*2 ;GET # OF 3K BLOCK XFER STARTS IN.
CALL RKSETU ;SWAP THAT BLOCK IN.
JRST [MOVEI D,DFWRTN ;WRITING IN UNALLOCATED BLOCK,
HRRM D,DFLOOP ;SEE IF WRITING ANY NONZERO
JRST .+1] ;BEFORE TRYING TO ALLOCATE.
MOVEM C,DFLOCP ;C HAS BP TO BUFFER SWAPPED INTO.
MOVE D,RWC ;REMEMBER RWC AT START OF XFER. USED TO FIND
MOVEM D,DFOWC .SEE DFNXM1 ;HOW MANY WDS WERE XFERED.
SETZ D,
ROTC D,-1
ADDM E,DFLOCP ;MAKE POINT WITHIN BUFFER TO PLACE XFER STARTS.
MOVEI E,22 ;IF STARTING ON ODD NUMBERED WORD,
SKIPGE D
DPB E,[360600,,DFLOCP] ;IT IS IN THE RH OF A BUFFER WORD.
MOVE D,RKCADR
IDIVI D,6000*2
SUBI E,6000*2 ;-<# WDS LEFT IN 3K BLOCK AFTER WHERE STARTING>
MOVE D,RKCADR
SUB D,[1,,] ;-<# WDS LEFT THIS DRIVE>
CAMG D,E ;GET WHICHEVER IS SMALLER (THAT IS,
MOVE D,E ;-<# WDS TO XFER BEFORE GO TO DFRSTR>)
MOVNM D,DFSCWC
LDB MA,[011700,,RCMA] ;GET LOW 17 BITS OF WORD ADDRESS,
LDB D,[DFPXM,,RDCS] ;MERGE IN TOP 2 BITS OF ADDRESS.
DPB D,[170200,,MA]
JRST @DFLOOP
DFWRTN: SKIPGE MB,PDP11(MA) ;LOOP RTN FOR WRITING IN UNALLOCATED BLOCK.
JSP D,MTRDFR
JUMPE MB,[IBP DFLOCP ? JRST DFINCR]
MOVE B,DFDRIV
MOVE D,RKCADR ;TRYING TO WRITE SOMEHING NONZERO -
IDIVI D,6000*2 ;MUST ALLOCATE SPACE FOR BLOCK.
CALL RKNEW5 ;DO SO, RET. ADDR OF BFR IN RH(C)
JFCL
ANDI C,-1
ADDM C,DFLOCP ;(PTS TO CORRECT WD DUE TO IBP 6 LINES AGO)
MOVEI C,DFWRIT
HRRM C,DFLOOP ;CHANGE TO ORDINARY WRITE.
DFWRIT: SKIPGE MB,PDP11(MA) ;LOOP ROUTINE FOR WRITING.
JSP D,MTRDFR
IDPB MB,DFLOCP
JRST DFINCR
DFREAD: SKIPGE PDP11(MA)
JSP D,MTRDFW
ILDB MB,DFLOCP
HRRM MB,PDP11(MA)
JRST DFINCR
DFWCHK: SKIPGE MB,PDP11(MA)
JSP D,MTRDFR
ILDB TT,DFLOCP
CAIN TT,(MB)
JRST DFINCR
MOVEI C,DFBWCE
IORM C,DFERR1
AOS T,RWC
JRST DFINC1
;COMMON END FOR ALL FUNCTION LOOPS.
;INCREMENT VARIOUS VARIABLES AND MAYBE BRANCH BACK.
DFINCR: AOS T,RWC
TRNN T,177777
JRST DFINC1 ;TRANSFER DONE.
SOSLE DFSCWC ;MORE WDS LEFT IN CURRENT BUFFER?
DFLOOP: 0 ;AOJA MA, OR JRST TO DFWRIT, DFREAD, DFWRTN, OR DFWCHK
DFINC1: HLRZ D,DFLOOP ;CAN'T JUST KEEP ON GOING.
CAIN D,(AOJA MA,)
AOJ MA,
DFNXM1: DPB MA,[011700,,RCMA] ;STORE UPDATED VALUES IN ACTUAL REGISTERS.
LSH MA,-17
DPB MA,[DFPXM,,RDCS]
ANDI T,177777
HRRM T,RWC
MOVE B,DFDRIV ;MRTDFR CLOBBERS B.
SUB T,DFOWC ;GET # WDS TRANSFERED SO FAR.
ANDI T,177777
ADDM T,DFDELA ;MUST WAIT THAT MUCH LONGER BEFORE OFFICIALLY DONE.
ADD T,RKCADR ;INCREM. DISK ADDR BY THAT MUCH.
LDB A,[20300,,RDAE]
LSH A,22
ADD T,A ;ADD IN THE DRIVE NUMBER IN CASE CARRY.
DPB T,[2000,,RDAR]
LSH T,-20
DPB T,[DFPDAE,,RDAE]
MOVE C,DFDELA ;WAIT THE AMOUNT OF TIME XFER
IMUL C,DFTIM
JSP A,RKDWAT ;SUPPOSEDLY TOOK.
HRRZ T,RWC
JUMPE T,DFINTR ;TRANSFER DONE, DECIDE WHETHER TO INTERRUPT.
SKIPE DFERR1
JRST DFINTR ;STOP IF ERROR.
MOVE A,RKCFNC ;ELSE START OVER, SWAPPING IN ANOTHER BUFFER.
JRST DFRSTR
DFFTAB: .VALUE ;NO FUNCTION LOOP FOR NOOP.
AOJA MA,DFWRIT
AOJA MA,DFREAD
AOJA MA,DFWCHK
DFNXM0: MOVEI C,DFBNEM ;COME HERE FOR NXM ON MEM REF BY DF
IORM C,RDAE1
MOVEI C,DFBFRZ ;SET AN ERROR BIT SO XFER WILL STOP.
IORM C,DFERR1
SUB P,[1,,1] ;FLUSH THE RET ADDR IN MTRAP.
JRST DFNXM1 ;GO UPDATE DEVICE REGS AND STOP.
DCSCMP: MOVE A,RDCS ;DCS COMPUTE
ANDI A,166
SKIPE DFRDY
TRO A,DFBRDY
IOR A,DFERR1 ;INCLUDE READ-ONLY BITS.
TRNE A,DFBERS
TRO A,DFBERR
RETURN
DFERR: IORM C,DFERR1
DFINTR: SETOM DFRDY
DSKINQ: MOVE T,RDCS
MOVEI A,DSKINT
TRNN T,100
JRST QDEL
SKIPE DFRDY
JRST MTRNEW
PUSHJ P,DCSCMP
TRNN A,100000
JRST DKINTF
JSP A,MTRNEW
DSKINT: 5 ;TRAP PRIORITY 5 TO LOCATION 204
-1
JRST .+1
MOVEI T,41
JSP A,VTRAP
DAEHAK: TLNN B,54000 ;DAE
RET
ANDI A,637
IOR A,RDAE1
HRRM A,RDAE
RETURN
CMAHAK: TRZ A,1
HRRM A,RCMA
POPJ P,
ADSHAK: MOVE A,TIME ;COMPUTE "POSITION" OF DISK
IDIV A,DFTIM
ANDI A,3777
HRRM A,RADS
POPJ P,
]
;THE KW11-P PROGRAMMABLE CLOCK
APK: JUMPE T5,ZPK2
MOVE A,[10000000.] ;ARG=CYCLES/SEC
IDIV A,T5
MOVEM A,PKTIM
ZPK2: SKIPE WPK
PUSHJ P,DPK
CALL APKBLK ;CREATE THE PAGE THE PK'S REGS GO IN, IF NEC.
PUSHJ P,WRDINS
600000+NPKCSR,,RPKCSR ;CONTROL & STATUS REGISTER
600000+NPKCSB,,RPKCSB ;COUNTER SET BUFFER
600000+NPKC,,RPKC ;COUNTER
0
SETOM WPK
SETOM PKERR
SETZM PKCBUF
SETZM PKCNT
MOVEM TIME,ORGTIM
RETURN
DPK: BLKFLS PKINTB ;DETACH PROGRAMMABLE CLOCK
PKCLKB,,0
SETZM WPK
DPKBLK: SOSL WPKBLK ;ONE LESS DEVICE USING PK'S PAGE.
RET
PUSHJ P,BLKZAP ;NO LONGER IN USE, FREE IT.
RPKCSR
RETURN
ZPK: SKIPE WPK
JRST ZPK2
RETURN
PKCHAK: TLNN B,54000
RETURN
UPDATE: MOVE C,RPKCSR
TRNN C,1
JRST UPDAT2 ;RUN OFF
SKIPL PKERR
TRNE C,10 ;MODE BIT
JRST .+2
JRST UPDAT2 ;STOPPED BY OVERFLOW
LSH C,-1
ANDI C,3
MOVE A,TIME
SUB A,ORGTIM
XCT TIMTAB(C)
UPDAT4: ADDB A,PKCNT
HRRM A,RPKC
SUBM TIME,B
MOVEM B,ORGTIM
RETURN
PKCNT: 0
PKERR: -1 ;O="DONE" ;+="DONE" & ERR
PKCBUF: 0
ORGTIM: 0
WPK: 0
WPKBLK: -1 ;-1+<USAGE COUNT OF PK'S PAGE>
PKTIM: 166667.
APKBLK: AOSE WPKBLK ;PAGE IN USE ONCE MORE.
RET
CALL BLKGET ;CREATE IT IF IT DOESN'T EXIST.
600000,,RPKCSR
RET
TIMTAB: IDIVI A,100.
IDIVI A,1000.
IDIV A,PKTIM
UPDAT2: SETZB A,B
JRST UPDAT4
PKCSRK: TLNN B,54000
JRST PKCSRW
ANDI A,177
SKIPL PKERR
TRO A,200
SKIPLE PKERR
TRO A,10000
HRRM A,RPKCSR
TLNN B,22000
RETURN
PKCSRW: PUSHJ P,UPDATE
XXWAIT
MOVE A,RPKCSR
TRNN A,200
SETOM PKERR
TRNN A,40 ;FIX
JRST PKCSR2
TRNN A,20 ;UP/DN
JRST PKCSR4
AOS C,PKCNT
ANDI C,177777
MOVEM C,PKCNT
PKCSR2: PUSHJ P,PKINTQ
JRST PKSTUP
PKCSR4: SOSL C,PKCNT
JRST PKCSR2
TRNN A,10
SETZM PKCBUF
MOVE C,PKCBUF
MOVEM C,PKCNT
AOS PKERR
JRST PKCSR2
PKINTQ: MOVEI A,PKINTB
SKIPGE PKERR
JRST QDEL
LDB B,[60100,,RPKCSR]
JUMPE B,QDEL
JRST MTRNEW
PKINTB: 6
-1
JRST .+1
SETOM PKERR
MOVEI T,21
JSP A,VTRAP
PKCSBK: HLLZS RPKCSB
TLNN B,22000
RETURN
XXWAIT
HRRZ A,RPKCSB
HRRM A,PKCNT
HRRM A,PKCBUF
PKSTUP: PUSHJ P,PKCLKF
HRRZ B,RPKCSR
TRNE B,1
TRNE B,20 ;UP/DN
RETURN
HRRZ C,PKCNT
LSH B,-1
ANDI B,3
XCT TABTIM(B)
ADD C,TIME
MOVEI A,PKCLKB
JRST CTRDES
TABTIM: IMULI C,100.
IMULI C,1000.
IMUL C,PKTIM
RETURN
PKCLKF: JSP A,QDEL
PKCLKB: 0
-1
PUSHJ P,.+1
AOS PKERR
PUSHJ P,PKINTQ
MOVE A,RPKCSR
HRRZ B,PKCBUF
TRNN A,10
MOVEI B,0
HRRM B,PKCBUF
HRRM B,PKCNT
TRNN A,10
RETURN
JRST PKSTUP
;DC ASYNCHRONOUS LINE INTERFACE
TXN[
ADC: PUSHJ P,ADCR ;ATTACH SAME FILE DC TRANSMIT & RECEIVE
TLO SF,D1CHAR
ADCT: SKIPE WDCT ;ATTACH DC TRANSMIT
PUSHJ P,DDCT
MOVEI A,DCFIL
PUSHJ P,DGFIL
MOVEI T6,1
HRLM T6,DCFIL
PUSHJ P,GETCHO
DPB C,[270400,,DCTCX1]
HRRM C,DCTCX2
DPB C,[270400,,DCTCX3]
SETOM WDCT
SETOM DCREDY
SKIPE WDCR
RETURN
DCINS: PUSHJ P,WRDINS
600000+NTSCR,,RTSCR ;TRANSMITTER STATUS REGISTER
600000+NTBUF,,RTBUF ;TRANMSITTER BUFFER
600000+NRCSR,,RRCSR ;R STATUS
600000+NRBUF,,RRBUF ;R BUFFER
0
RETURN
DDC: PUSHJ P,DDCR
DDCT: SKIPN WDCT
RETURN
DCTCX2: MOVEI C,.
PUSHJ P,CLOSEC ;DETACH DC TRANSMIT
SETZM DCREDY
SETZM WDCT
BLKFLS TSCRB2
TBUFB1,,0
SKIPE WDCR
RETURN
DCZAP: PUSHJ P,WRDZAP
RRCSR,,RTBUF
RETURN
ADCR: SKIPE WDCR ;ATTACH DC RECEIVE
PUSHJ P,DDCR
MOVEI A,DCFIL
PUSHJ P,DGFIL
HRRZS DCFIL
PUSHJ P,GETCHO
MOVEI B,RBUFBI
MOVEM B,DYCBPT-DYCH(C)
HRRZM C,DCRCH.
DPB C,[270400,,DCRCX2]
DPB C,[270400,,DCRCX4] ;PUT CHNL NUM IN .OPER'S.
SKIPE DYCTYP-DYCH(C)
JRST ADCR2
ADCRTT: .CALL ADMRTS ;IF TTY, INT. ON ALL CHARS.
.LOSE %LSFIL
ADCR2: SKIPGE DYCTYP-DYCH(C) ;IF NOT INT. DEV.,
CALL RBUFB2 ;ALREADY GOT 1 CHAR.
SETOM DCCRTR
SETOM WDCR
SKIPN WDCT
JRST DCINS
RETURN
DDCR: SKIPN WDCR
RETURN
MOVE C,DCRCH. ;DETACH DC RECEIVE
PUSHJ P,CLOSEC
SETZM DCDONE
SETZM WDCR
SETOM DCCRTR
BLKFLS RCSRB2
RBUFB1,,0
SKIPN WDCT
JRST DCZAP
RETURN
DCFIL: BLOCK 3
WDCR: 0
WDCT: 0
DCDONE: 0
DCREDY: 0
DCCRTR: 0 ;CARRIER TRANSITION
DCRCH.: 0
DCRTIM: 0 ;TIMING, OR 0 => READ CHARS WHEN RQ'D.
DCTTIM: 500.
RBUFBI: 0 ;INT. ON CHAR RECEIVED QUEUES THIS BLOCK.
-1
CALL RBUFB3
RCSRHK: TLNN B,54000
JRST RCSRWR
ANDI A,3533
SKIPE DCDONE
TRO A,200
SKIPE WDCR
TRO A,4
SKIPE DCCRTR
TRO A,140000
SETZM DCCRTR
HRRM A,RRCSR
TLNN B,22000
RETURN
RCSRWR: XXWAIT
HRRZ A,RRCSR
TRNE A,2
DCTCX1: .IOT .,[0] ;"BREAK"
IOCGET [CALL DDCT]
POPJ P,
RCSRI: MOVEI A,RCSRB2
SKIPN DCDONE
JRST QDEL
LDB B,[60100,,RRCSR]
JUMPE B,QDEL
JRST MTRNEW
RCSRB2: 5
-1
JRST .+1
MOVEI T,60
JSP A,VTRAP
TSCRHK: TLNN B,54000
POPJ P,
ANDI A,531
SKIPE DCREDY
TRO A,200
SKIPE WDCT
TRO A,2
HRRM A,RTSCR
RETURN
TSCRI: MOVEI A,TSCRB2
SKIPN DCREDY
JRST QDEL
LDB B,[60100,,RTSCR]
JUMPE B,QDEL
JRST MTRNEW
TSCRB2: 5
-1
JRST .+1
MOVEI T,61
JSP A,VTRAP
TBUFHK: HLLZS RTBUF
SKIPE DCREDY
TLNN B,22000
RETURN
XXWAIT
SETZM DCREDY
DCTCX3: .IOT .,RTBUF
IOCGET [CALL DDCT]
PUSHJ P,TSCRI
MOVE C,TIME
ADD C,DCTTIM
JSP A,CTRDES
TBUFB1: 0
-1
PUSHJ P,.+1
SETOM DCREDY
JRST TSCRI
RBUFHK: TLNE B,54000
SKIPN DCDONE
RETURN
SETZM DCDONE
SKIPGE RBUFB1+1 ;IF NOT GOING TO READ ANOTYER CHAR,
SKIPE DCRTIM ;AND TIMING IS 0,
CAIA
CALL RBUFB2 ;READ ANOTHER SINCE WE'RE THRU WITH LAST ONE.
JRST RCSRI ;MAYBE STOP VTRAP RQ.
RBUFB2: MOVE C,TIME ;EVERY 100 VUSEC LOOK FOR NEXT CHAR.
ADD C,DCRTIM
JSP A,CTRDES
RBUFB1: 0
-1
PUSHJ P,.+1
RBUFB3: SKIPN DCRTIM ;IN READ-WHEN-REQUESTED MODE,
SKIPN DCDONE
CAIA
RET ;DON'T READ ANOTHER TILL USE PREVIOUS.
MOVE C,DCRCH. ;DCR CHNLNUM.
SKIPE DYCTYP-DYCH(C)
JRST DCRCX2
DCRCX4: .STATUS .,A ;IF A TTY, SEE IF ANYTHING IN BUFFER.
TRNE A,2000
JRST RCSRI ;NOTHING, STOP CLOCK-TRAPPING.
DCRCX2: .IOT .,A
IOCGET [CALL DDCR]
JUMPL A,CPOPJ ;IF STY HAS NO CHARS
HRRM A,RRBUF
SETOM DCDONE
CALL RCSRI ;MAYBE REQUEST INTERRUPT.
JRST RBUFB2
;DYNAMICLY ALLOCATED I-O CHANNEL ROUTINES
;CALL WITH C(A) POINTING TO FILE BLOCK
;IF SUCCESSFUL RETURNS WITH CHANNEL NUMBER AS C(C)
GETCHO: MOVSI C,10
ANDCAM C,(A) ;WANT 10 BIT FOR STY'S ONLY.
GETCHP: HRRZ C,(A)
CAIN C,(SIXBIT /TTY/)
JRST GCHTTY
CAIN C,(SIXBIT /LPT/)
JRST GCHLPT
MOVE C,[-DYCHN,,DYCH]
SKIPL DYCTAB(C)
AOBJN C,.-1
JUMPGE C,[ERROR [ASCIZ /
NO I-O CHANNELS LEFT/]]
HRRZS C
DPB C,[270400,,GETCH1]
DPB C,[270400,,GETCH1+1]
GETCH1: TSOPEN .,(A) ;BOTH INSNS ARE IMPURE.
AOS DYCTAB(C) ;INDICATE CHANNEL IN USE.
PUSH P,A
DPB C,[270400,,.+1]
.STATUS .,A
ANDI A,77
CAIE A,1
CAIN A,2
SETZM DYCTYP-DYCH(C) ;A TTY - SAY SO.
HRLI A,1
CAME A,[1,,25]
JRST POPAJ
HLRZM A,DYCTYP-DYCH(C) ;A STY - SAY SO,
REST A
SAVE C
MOVSI C,10
IORM C,(A)
REST C
XCT GETCH1 ;REOPEN WITH BIT 10 SET.
XCT GETCH1+1
RETURN
DYCTAB==.-DYCH
REPEAT DYCHN,-1
DYCBPT: BLOCK DYCHN ;RECEIVE INT BLOCK POINTERS
DYCBIT: REPEAT DYCHN,1_<DYCH+.RPCNT>
DYCTYP: REPEAT DYCHN,-1 ;-1 FOR FILE, 0 FOR TTY, +1 FOR PSEDO-TTY
GCHTTY: HLRZ C,(A)
TRNN C,1
SKIPA C,[TYIC]
MOVEI C,TYOC
GCHLPU: SETOM DYCTYP-DYCH(C) ;DON'T SCREW UP CONSOLE TTY
RETURN
GCHLPT: HLRZ C,(A)
TLNN C,1
ERROR [ASCIZ /INPUT FROM LPT/]
PUSHJ P,OPNLPT
MOVEI C,LPTC
JRST GCHLPU
CLOSEC: HRRZS C
CAIN C,LPTC
JRST CLSLPT ;MAYBE CLOSE LPTC
CAIL C,DYCH
CAIL C,DYCH+DYCHN
RETURN ;IGNORE TYIC, TYOC
SYSCAL CLOSE,[C]
SETOM DYCTAB(C)
SETZM DYCBPT-DYCH(C)
SETOM DYCTYP-DYCH(C)
POPJ P,
;DM ASYNCHRONOUS 16-LINE SINGLE SPEED INTERFACE
ADM: ;ATTACH
PUSHJ P,ADMT
TLO SF,D1CHAR
ADMR: TDZA B,B ;ATTACH RECEIVE ONLY
ADMT: MOVEI B,1 ;ATTACH TRANSMIT ONLY
TLNN SF,NUMFND
JRST DMSTAT
CAIL DL,16.
DMTSLN: ERROR [ASCIZ/NON-EX. LINE/]
MOVEI A,DMFIL
PUSHJ P,DGFIL
HRRZ C,DMFIL
HRLM B,DMFIL
PUSHJ P,GETCHO
PUSH P,C
JUMPE B,ADM2
SKIPN C,DMTTAB(DL)
AOSA A,DMOCNT
PUSHJ P,CLOSEC
POP P,DMTTAB(DL)
JRST ADM3
ADM2: SKIPGE DYCTYP-DYCH(C)
JRST ADMR2
HRROS (P)
.CALL ADMRTS
.LOSE %LSFIL
MOVE A,DL
IMULI A,DMRLNG
ADDI A,DMRBLK
HRRM A,DYCBPT-DYCH(C)
ADMR2: SKIPN C,DMRTAB(DL)
AOSA A,DMOCNT
PUSHJ P,CLOSEC
POP P,DMRTAB(DL)
SKIPGE DMRTAB(DL)
JRST ADM3 ;JUMP IF TTY OR STY
MOVE T5,DL
IMULI T5,DMRLNG
MOVEI A,DMRBLK(T5)
LDB B,[100,,RCSR]
SKIPE B
PUSHJ P,CTR100
ADM3: EXCH A,DMCNT
JUMPN A,CPOPJ
ADM4: PUSHJ P,WRDINS ;FIRST ATTACH
600000+NCSR,,RCSR
600000+NBAR,,RBAR
600000+NBCR,,RBCR
600000+NTBR,,RTBR
0
SETZM DMNXM
SETZM DCRFLG
SETZM DCRTTP
SETZM DMRFLG
RETURN
ADMRTS: SETZ
SIXBIT /TTYSET/
C
[131313,,131313]
[131313,,131313]
SETZ [0]
ZDM: PUSH P,RTBR
PUSHJ P,ADM4
POP P,RTBR
BLKFLS DCRBLK
REPEAT 16.,DMRBLK+DMRLNG*.RPCNT,,DMTBLK+DMTLNG*.RPCNT
DCTBLK,,
POPJ P,
DDM: ;DETACH
PUSHJ P,DDMT
TLO SF,D1CHAR
DDMR: TDZA B,B ;DETACH RECEIVE ONLY
DDMT: MOVEI B,1 ;DETACH TRANSMIT ONLY
TLNN SF,NUMFND
JRST DMSTAT
CAIL DL,16.
JRST DMTSLN
MOVE A,DL
JUMPE B,DDM2
SKIPN C,DMTTAB(DL)
JRST DMTLNA
SETZM DMTTAB(DL)
BCRDDM: IMULI A,DMTLNG
ADDI A,DMTBLK
JRST DDM3
DDM2: SKIPN C,DMRTAB(DL)
JRST DMTLNA
SETZM DMRTAB(DL)
DMRDDM: IMULI A,DMRLNG
ADDI A,DMRBLK
DDM3: PUSHJ P,QDEL
PUSHJ P,CLOSEC
SOS A,DMOCNT
MOVEM A,DMCNT
JUMPN A,CPOPJ
PUSHJ P,WRDZAP ;LAST DETACH
RCSR,,RTBR
RETURN
NXMDML: SUB P,[1,,1] ;NON-EX MEMORY REFERENCE
SETOM DMNXM
JRST CSRINT
DMTLNA: TTOA [ASCIZ /UNATTACHED LINE
/]
DMSTAT: JUMPN B,DMSTA2 ;IF DMT, PRINT TRANSMIT LINES.
TTOA [ASCIZ /RECEIVE LINES ACTIVE: /] ;IF DMR,...
MOVE E,[-16.,,]
SKIPN DMRTAB(E)
DMSTA1: AOBJN E,.-1
JUMPGE E,CRPOPJ
HRRZM E,QT
TTOA [ASCIZ / T./]
JRST DMSTA1
;PRINT TRANSMIT LINE STATUS.
DMSTA2: TTOA [ASCIZ /TRANSMIT LINES ACTIVE:/]
MOVE E,[-16.,,]
SKIPN DMTTAB(E)
DMSTA3: AOBJN E,.-1
JUMPGE E,CRPOPJ
HRRZM E,QT
TTOA [ASCIZ / T./]
JRST DMSTA3
DMTTAB: BLOCK 16. ;TRANSMIT LINE CHNL NUM. OR 0 IF UNATTACHED.
DMRTAB: BLOCK 16. ;RECEIVE LINE CHNL NUM., OR 0. (LH=-1 IF TTY)
DMOCNT: 0
DMCNT: 0 ;COUNT OF ACTIVE LINES
DMFIL: BLOCK 3
DMNXM: 0
DCRFLG: 0 ;CHAR RECEIVED & NOT YET RECEIVE INTERRUPT
DCRTTP: -1 ;TUMBLE TABLE POINTER
DMRFLG: 0 ;PREVIOUS RECEIVER ENABLE FLAG
DMTIM: 30000.
TBRHAK: ANDI A,177400 ;TABLE BASE REGISTER
HRRM A,RTBR
TLNN B,22000
RETURN
XXWAIT
HRRZ A,RTBR
ANDI A,177400
HRRM A,RTBR
RETURN
BCRHAK: TLNN B,22000 ;BREAK CONTROL REGISTER
RETURN
XXWAIT
HRLZ A,RBCR
MOVSI E,-16.
LSH A,-1
TRNN A,400000
BCRHK2: AOBJN E,.-2
JUMPGE E,CPOPJ
SKIPN C,DMTTAB(E)
JRST BCRHK2
DPB C,[270400,,.+1]
.IOT .,[0] ;"BREAK"
IOCGET [CALL BCRLOS]
JRST BCRHK2
BCRLOS: MOVE A,E
JRST BCRDDM
CSRHAK: TLNN B,54000 ;CONTROL AND STATUS REGISTER
JRST CSRWRT
ANDI A,110363
SKIPE DMNXM
TRO A,40000
HRRM A,RCSR
TLNN B,22000
RETURN
CSRWRT: XXWAIT
LDB B,[100,,RCSR]
EXCH B,DMRFLG
XOR B,DMRFLG
SKIPE B
JRST CSRREN
CSRINT: HRRZ B,RCSR
PUSHJ P,DCRINT
DCTINT: MOVEI A,DCTBLK
TRNN B,10000
JRST QDEL
SKIPE DMNXM
JRST MTRNEW
TRNN B,100000
JRST QDEL
JRST MTRNEW
DCRINT: MOVEI A,DCRBLK
TRNE B,100
SKIPN DCRFLG
JRST QDEL
JRST MTRNEW
DCRBLK: 5 ;RECEIVE INTERRUPT
-1
JRST .+1
SETZM DCRFLG
HRRZ T,%DMRV
LSH T,-2
JSP A,VTRAP
DCTBLK: 5 ;TRANSMIT INTERRUPT
-1
JRST .+1
HRRZ T,%DMTV
LSH T,-2
JSP A,VTRAP
CSRREN: SETOM DCRTTP
MOVSI E,-16. ;CHANGE IN STATE OF RECEIVE ENABLE (CSR)
SKIPA A,[DMRBLK]
CSRREM: ADDI A,DMRLNG
SKIPN C,DMRTAB(E)
JRST CSRREL
SKIPN DMRFLG
PUSHJ P,QDEL
SKIPL DYCTYP-DYCH(C)
JRST CSRREL
SKIPE DMRFLG
PUSHJ P,CTR100
CSRREL: AOBJN E,CSRREM
JRST CSRINT
DMRBLK: REPEAT 16.,[0
-1
PUSHJ P,.+1
MOVEI I,.RPCNT
JRST DMRBRK
] DMRLNG==5
DMTBLK: REPEAT 16.,[0
-1
PUSHJ P,.+1
MOVEI I,.RPCNT
JRST DMTBRK
] DMTLNG==5
BARHAK: TLNN B,22000 ;BUFFER ACTIVE REGISTER
RETURN
XXWAIT
MOVSI E,-16.
HRRZ B,RBAR
MOVEI A,DMTBLK
BARHK2: SKIPN DMTTAB(E)
JRST BARHK4
TRNE B,1
PUSHJ P,CTR0
TRNN B,1
BARHK4: PUSHJ P,QDEL
ADDI A,DMTLNG
LSH B,-1
AOBJN E,BARHK2
RETURN
DMTBRK: SKIPN DMTTAB(I)
JRST BARFLB
HRRZ MB,RTBR
LSH MB,-1
DPB I,[400,,MB]
SKIPGE T,PDP11+20(MB)
JSP D,MTDMRW
AOS T
ANDI T,177777
HRRM T,PDP11+20(MB)
MOVE A,I
JUMPE T,DMTBR2
IMULI A,DMTLNG
ADDI A,DMTBLK
PUSHJ P,CTR100
SKIPGE T,PDP11(MB)
JSP D,MTDMRW
AOS T
ANDI T,177777
HRRM T,PDP11(MB)
SOS T
ANDI T,177777
DMTBR4: ROT T,-1
SKIPGE TT,PDP11(T)
JSP D,MTDMRD
SKIPGE T
LSH TT,-8
ANDI TT,177
MOVE C,DMTTAB(I)
DPB C,[270400,,.+1]
.IOT .,TT
IOCGET SKIPA
RETURN
SETZM DMTTAB(I)
MOVE A,I
JRST BCRDDM
DMTBR2: PUSHJ P,BARFLB
SKIPGE T,PDP11(MB)
JSP D,MTDMRW
JRST DMTBR4 ;DON'T INCREMENT LAST TIME
BARFLB: MOVEI C,1 ;TRANSMIT COMPLETE
LSH C,(I)
ANDCAM C,RBAR ;FLUSH BIT IN BAR
MOVEI C,1
DPB C,[170100,,RCSR]
JRST CSRINT
DMRBRK: LDB T,[100,,RCSR]
JUMPE T,CPOPJ ;RECEIVER NOT ENABLED
SKIPN C,DMRTAB(I)
POPJ P,
SKIPN DYCTYP-DYCH(C) ;IF TTY, GO SEE IF ANY CHARS.
JRST DMRTRK
DMRTR0: DPB C,[270400,,.+1]
.IOT .,MB
IOCGET SKIPA ;DO NOT CHANGE TO JRST
CAIA
JRST DMRLOS
JUMPL MB,CPOPJ ;GIVE UP IF STY HAS NO CHARS.
DMRTRL: AOS MA,DCRTTP
ANDI MA,77
HRRM MA,DCRTTP
MOVE T,RTBR
LSH T,-8
DPB T,[70800,,MA]
SKIPGE PDP11+100(MA)
JSP D,MTDMWR
TRO MB,120000 ;ODD PARITY CHAR
DPB I,[90400,,MB] ;CONSOLE #
HRRM MB,PDP11+100(MA)
SKIPGE DMRTAB(I)
JRST DMRBRL
MOVE A,I
IMULI A,DMRLNG
ADDI A,DMRBLK
PUSHJ P,CTR100
DMRBRL: AOS DCRFLG
JRST CSRINT
CTR100: MOVE C,TIME
ADD C,DMTIM
MOVEM C,(A)
JRST CTRDES
DMRLOS: SETZM DMRTAB(I)
MOVE A,I
JRST DMRDDM
CTR0: MOVE C,TIME
ADDI C,300.
JRST CTRDES
DMRTRK: DPB C,[270400,,.+1]
.STATUS .,A
TRNE A,2000
RET ;IF BUFFER EMPTY.
JRST DMRTR0 ;ELSE GO READ CHAR.
;ET ERROR BITS:
ETENDZ==100000 ;SEL. DRIVE IN END ZONE.
ETILO==10000 ;ILL. OPERATION.
ETSELE==4000 ;FAILED TO SELECT UNIQUE DRIVE.
ETBLKM==2000 ;WAITED TOO LONG AFTER READING BLOCK NUMBER.
ETNEX==400 ;ET GOT A NXM.
;GENERAL ET STATUS:
ETNFIN: 0 ;SET IF DT COMMANDS WERE GIVEN BUT NOT FINALIZED.
WET: 0 ;SET IF DT IS ATTACHED.
ETUNIT: -1 ;NUMBER OF SELECTED ET UNIT, OR -1 IF NONE.
ETDRIV: 0 ;PTR TO INFO ON CURRENTLY SELECTED DRIVE, OR <= 0 IF NONE.
ETDOPN: 0 ;-> DRIVE WHOSE FILE IS OPEN, OR 0.
ETDDIC: 0 ;-> DRIVE WHOSE DIR IS IN ETBTAB, OR 0.
ETERRO: 0 ;ERROR BITS IN TCST.
ETREDY: 0 ;ET IS READY IF THIS # 0.
ETBTIM=20000. ;TIME TO READ BLOCK.
ETSTIM=100000. ;TIME TO STOP OR START.
;DRIVE-SPECIFIC INFO:
ETNDRV==10 ;NUMBER OF DECTAPE DRIVES.
ETDTAB:
REPEAT ETNDRV,[
0 ;TIME TO REACH NEXT BLOCK.
-1
CALL ETTRP ;ET MOTION RTN.
-1 ;ETDUNI -- UNIT SWITCHES.
0 ;ETDUPS -- -1 IF UP TO SPEED.
0 ;ETDPOS -- CURRENT BLOCK NUM.
0 ;ETDDIR -- DIRECTION (1 - FWD, -1 - BACK).
0?0?0 ;ETDFIL -- FILENAME.
0 ;ETDSNM -- SNAME.
0 ;ETDENA -- NOT 0 IFF DRIVE WRITE-ENABLED.
0 ;ETDIOP -- NOT 0 IFF RDATA, WDATA OK.
]
ETCLEN==3
IRP A,,[UNI,UPS,POS,DIR,FIL,JUNK,JUNK,SNM,ENA,IOP]
ETD!A==ETCLEN
DEFINE ETC!A
ETD!A(B)!TERMIN
ETCLEN==ETCLEN+1
TERMIN
;UNIT-SPECIFIC INFO - -1 IF NO CORRESPONDING DRIVE,
; 0 IF >1 DRIVE,
; --> ENTRY IN ETDTAB FOR DRIVE IF EXACTLY 1.
ETUTAB: REPEAT 10,-1 ;INITIALLY NO UNIT HAS DRIVE.
ETBTAB: BLOCK 578. ;ADDR IN FILE OF VIRT BLOCK.
BLOCK 578. ;VIRT. NUM. OF REAL BLOCK, OR 0.
;ET MOTION TRAPS CALL HERE TO MOVE TAPE 1 POSITION,
;ALSO, FOR SELECTED DRIVE, PROCESS COMMANDS.
ETTRP: HRRE A,ETCDIR ;GET CURRENT DIR.
CAME A,ETCDIR ;IF LH. WAS CHANGED,
JRST ETREV ;MUST REVERSE TAPE.
MOVEM A,ETCUPS ;INDICATE UP TO SPEED.
ADDB A,ETCPOS ;INDICATE TAPE'S MOVED 1 BLOCK.
CAML A,[-20.]
CAIL A,600. ;IF POS. OUT OF RANGE,
JRST ETREW ;TAPE'S RUN OFF REEL.
CAMN B,ETDRIV
JRST ETSEL ;SPECIAL PROCESSING FOR SELECTED UNIT.
ETTRPX: SETZM ETCIOP ;RDATA NOT OK (BLOCK MISSED)
ETTRPY: MOVEI C,ETBTIM ;TIME TO MOVE 1 BLK.
ETREV1: ADD C,(B) ;TRAP AGAIN WHEN GET TO NEXT BLOCK.
MOVEI A,(B)
CALL CTRDES
JRST ETINT ;DECIDE WHETHER WANT VIRT TRAP.
ETREV: MOVNM A,ETCDIR ;CHANGE DIRECTION.
SETZM ETCUPS ;NO LONGER UP TO SPEED.
MOVEI C,2*ETSTIM ;TIME TO STOP, START.
JRST ETREV1
ETREW: SETZM ETCDIR ;STOP TAPE.
SETZM ETCUPS
MOVEI T,-ETDTAB(B)
IDIVI T,ETCLEN ;COMPUTE NUMBER OF DRIVE.
MOVEM T,QT
TTOA [ASCIZ/
DT DRIVE T RAN OFF /]
SKIPL A
TTOA 1,[ASCIZ/LEFT/]
TTOA [ASCIZ/RIGHT/]
ERROR [ASCIZ/ REEL
/]
JRST ETINT
;COME HERE WITH ERROR BIT IN A.
ETERR: IORM A,ETERRO ;INDICATE THE ERROR.
;DECIDE WHETHER VIRT TRAP DESIRED.
;ALL RTNS WHICH CHANGE ETERRO, ETREDY OR INT-ENB MUST COME HERE.
ETINT: MOVEI A,ETINTB
SKIPE ETERRO ;IF ERROR THEN SET READY.
SETOM ETREDY
MOVE B,RTCCM
TRNE B,100 ;IF READY&INT-ENB THEN INTERRUPT
SKIPN ETREDY
JRST QDEL ;ELSE WITHDRAW REQUEST.
JRST MTRNEW
ETINTB: 6 ;PRIORITY.
-1
JRST .+1
MOVEI T,214/4 ;ADDR OF VECTOR.
JRST VTRAP ;CAUSE TRAP.
;COME HERE WHEN SELECTED DRIVE MOVES 1 BLK.
ETSEL: CAIL A,579.
SKIPG ETCDIR ;IF GOING FWD PAST END,
JRST .+2
JRST ETEND ;SET ENDZ ERROR.
CAMG A,[-2]
SKIPL ETCDIR ;ALSO IF GOING BACK PAST BEGINNING.
JRST .+2
JRST ETEND
SKIPE ETREDY ;IF READY SET,
JRST ETTRPX ;NO COMMAND TO PROCESS.
LDB T,[010300,,RTCCM]
XCT ETCMDT(T) ;PROCESS THE FUNCTION SPECIFIED.
ETCMDT: .VALUE ;SAT FN SHOULDN'T COME HERE.
JRST ETRNUM
JRST ETRDAT
JRST ETRALL
JRST ETSST ;STOP SELECTED TAPE.
JRST ETWRTM ;WRTM FN ALWAYS ILLEGAL.
JRST ETWDAT ;WDATA FN.
JRST ETWALL ;WALL FN.
;READ BLOCK NUMBER FN. - (PUT IT IN TCDT).
ETRNUM: JUMPL A,ETTRPX ;IF POS. OUT OF RANGE,
CAILE A,577.
JRST ETTRPX ;WE'RE NOT COMING TO A BLOCK.
HRRM A,RTCDT ;STORE BLK. NUM.
SETOM ETREDY ;FN IS COMPLETED.
SETOM ETCIOP ;RDATA NOW OK.
JRST ETTRPY
;END ZONE - INDICATE ERROR AND STOP TAPE.
ETEND: MOVEI A,ETENDZ
IORM A,ETERRO
;STOP SELECTED TAPE FN.
ETSST: SETZM ETCUPS
SETZM ETCDIR
SETOM ETREDY
JRST ETINT
;ILLEGAL FNS COME HERE TO CAUSE ILO ERROR.
ETWRTM: ;WILL ALWAYS BE ILLEGAL.
ETWALL: ;MAY SOMEDAY BE LEGAL.
ETRALL: ;DITTO.
ETWDAT: ;SOON BE LEGAL.
MOVEI A,ETILO
JRST ETERR
ETRDAT: SKIPN ETCIOP ;IF NOT AFTER RDATA OR RNUM,
JRST ETBLM ;BLKM ERROR.
CAME B,ETDDIC ;IF THIS DRIVE'S DIR NOT IN BTAB,
CALL ETGBTB ;READ IT IN.
MOVE A,ETCFIL
TLZN A,1 ;MAKE SURE THIS DRV READING ON ETC.
CAME B,ETDOPN
CALL ETOPEN
MOVE A,ETCPOS ;FIND ADDR. OF CURRENT BLOCK.
SKIPE A,ETBTAB(A)
.ACCES ETC,A ;IF REAL, -> IT.
HRRZ MA,RTCBA ;PDP11 ADDR TO STORE INTO.
MOVNI X,400 ;DON'T READ >1 BLOCK.
HRRZ TT,RTCWC ;OR MORE THAN WANTED.
ORCMI TT,-200000
ETRDA0: SKIPE E,A ;USE REAL CONTENTS OR 0.
.IOT ETC,E
SKIPGE PDP11(MA)
JSP D,MTETWR ;MAYBE TRAP STORING.
HRRM E,PDP11(MA)
ADDI MA,2 ;ADVANCE 1 WD.
DPB MA,[2000,,RTCBA]
AOJ TT,
DPB TT,[2000,,RTCWC]
JUMPGE TT,ETRDA1 ;IF DID ALL REQUESTED, STOP.
AOJL X,ETRDA0 ;AFTER WHOLE BLK, STOP.
ETRDA1: SKIPL TT
SETOM ETREDY ;UNLESS MORE BLKS TO GO.
JRST ETTRPY ;KEEP MOVING.
;READ IN DIR. OF CURRENT DRIVE.
ETGBTB: MOVE A,ETCFIL
TLZN A,1 ;GET DRIVE OPEN FOR READING.
CAME B,ETDOPN
CALL ETOPEN
.ACCES ETC,[0] ;DIR. AT FRONT OF FILE.
MOVSI A,-2*578.
.IOT ETC,ETBTAB(A)
AOBJN A,.-1 ;READ IN THE DIR.
MOVEM B,ETDDIC ;SAY HAVE THIS DRIVE'S DIR.
RETURN
;OPEN CURRENT DRIVE, DIRECTION IN A.
ETOPEN: MOVEM A,ETCFIL
ETOPE1: MOVE A,ETCSNM
.SUSET [.SSNAM,,A]
.OPEN ETC,ETCFIL
JRST ETOPNL
MOVEM B,ETDOPN ;SAY THIS DRIVE IS OPEN.
RETURN
ETOPNL: TTOA [ASCIZ/
DT FILE NOT FOUND, SUPERQUIT
SET FILE AND PROCEDE /]
CALL DDT
JRST ETOPE1
ETBLM:: ;PREVENT ASSEMBLY ERROR.
;DECTAPE COMMAND REGISTER.
TCCMHK: TLNN B,54000
JRST TCCMWR
CALL ETCCM ;IF READING, COMPUTE TCCM.
TCCMWR: TLNN B,22000
RETURN
XXWAIT
HRRZ A,RTCCM ;IF WRITING, SEE NEW VALUE.
SKIPE ETERRO
TRNE A,100000 ;IF ERROR BIT WAS LOADED W/ 0,
JRST TCCM1
MOVEI T,ETENDZ+ETNEX+ETBLKM
ANDCAM T,ETERRO ;CLEAR SOME ERRORS.
TCCM1: TRNN A,1 ;IF DO WASN'T SET, EXIT.
JRST ETINT
MOVEI T,ETSELE+ETILO
ANDCAM T,ETERRO ;CLEAR SOME ERRORS SINCE NEW FN.
SETZM ETREDY
TRNN A,16 ;IF FN IS 0,
JRST ETSAT ;STOP ALL TAPES RIGHT NOW.
LDB B,[100300,,A] ;GET SELECTED UNIT'S NUM.
MOVEM B,ETUNIT ;STORE NUM. OF SELECTED UNIT.
MOVE B,ETUTAB(B) ;GET PTR--> INFO ON COR. DRIVE.
MOVEM B,ETDRIV ;SAY IT'S SELECTED DRIVE.
JUMPLE B,ETESEL ;IF DIDN'T SELECT UNIQUE DRIVE, SELE ERROR.
SKIPN ETCDIR ;IF DRIVE MOVING,
JRST ETSTRT
HRRZS ETCDIR ;SET L.H. TO NEW DIRECTION.
TRNE A,4000 ;(TAPE WILL REVERSE ITSELF IF NEC.).
HRROS ETCDIR
JRST ETINT
;COME HERE IF TAPE NOT MOVING.
ETSTRT: TRNN A,4000
AOSA C,ETCDIR ;DIR _ IF FWD THEN 1 ELSE -1.
SOS C,ETCDIR
ADDM C,ETCPOS ;STARTING TAKES 2 BLKS.
SETZM ETCIOP ;RDATA NOT OK.
MOVEI A,(B)
MOVE C,TIME
ADDI C,ETSTIM ;GIVES TIME ET'LL HAVE STARTED.
CALL CTRDES
JRST ETINT
;COMPUTE TCCM.
ETCCM: HRRZ A,RTCCM ;INT-ENB KEPT IN RTCCM.
ANDCMI A,160201
SKIPE ETERRO
IORI A,100000 ;GET ERROR BIT.
SKIPE ETREDY
IORI A,200 ;GET READY BIT.
HRRM A,RTCCM
RETURN
;DECTAPE STATUS REGISTER.
TCSTHK: TLNN B,54000
RETURN ;WRITING HAS NO EFFECT.
HRRZ A,RTCST
ANDI A,3 ;DATA EXTENSION BITS KEPT IN RTCST.
IOR A,ETERRO ;GET ERROR BITS.
MOVE B,ETDRIV
JUMPLE B,TCST0 ;IF NO SELECTED DRIVE.
SKIPE ETCUPS
IORI A,200 ;INDICATE IF SEL. DRIVE UP TO SPEED.
TCST0: HRRM A,RTCST
RETURN
;RESET DECTAPE.
ZET: SKIPN WET
RETURN ;...IF NOT ATTACHED.
HLLZS RTCWC ;ZERO THE REGS.
HLLZS RTCBA
HLLZS RTCDT
HLLZS RTCST
HLLZS RTCCM
SETZM ETERRO
;STOP ALL TAPES.
ETSAT: MOVE B,[-10,,ETDTAB]
ETSAT1: HRRE A,ETCDIR
ADDM A,ETCPOS ;STOPPING TAKES 1 BLK.
SETZM ETCDIR
SETZM ETCUPS
SAVE B
MOVEI A,(B)
CALL QDEL ;STOP THE CLOCK TRAPS FOR MOTION.
REST B
ADDI B,ETCLEN-1
AOBJN B,ETSAT1
SETOM ETREDY
JRST ETINT
;DETACH.
DET: CALL ZET
SETZM WET
CALL WRDZAP ;FLUSH THE REGS TO NXM.
RTCST,,RTCDT
RETURN
ETNXM0: MOVEI D,.+3 ;RETURN AFTER JRST.
MOVEM D,-SAVLNG(P)
JRST RSTALL
MOVEI A,ETNEX
IORM A,ETERRO ;SET NXM ERROR.
JRST ETTRPX
;ATTACH DECTAPE.
CDT:
AET: SKIPE WET ;IF REGS NOT SET UP,
JRST AET0
CALL WRDINS ;SET THEM UP.
RTCCM (NTCCM+600000)
RTCST (NTCST+600000)
RTCWC
RTCBA
RTCDT
0
SETOM WET ;INDICATE THEY'RE SET UP.
CALL ZET ;INITIALIZE THEM.
AET0: MOVEI T3,(DL) ;IF WAS ARG, SELECT THAT DRIVE.
TLNN SF,NUMFND
SETO T3, ;ELSE NO DRIVE SELECTED.
SETZM AETCRP
SETZM AETLFL
CALL GPASST ;IF NO CMDS ON THIS LINE
CAIE T0,^M
JRST AET2
SETOM AETLFL ;READ SEVERAL.
AET1: CALL GPASST
CAIE T0,^M
SETZM AETCRP ;CLEAR AFTER NON-CR.
CAIN T0,^M
JRST AETCR
AET2: CAIN T0,",
JRST AET1 ;IGNORE SPACE, COMMA, CR.
CALL DGSYM ;READ NAME OF OPTION.
HLLZS T2 ;TRUNCATE TO 3 CHARS.
JUMPE T2,ETOERR ;ERROR IF NO SYMBOL.
MOVSI T5,-ETONUM ;AOBJN PTR -> OPTION.
AOJ T5,
CAME T2,ETOTAB-1(T5)
AOBJN T5,.-2 ;SEARCH TABLE FOR SYMBOL READ.
JUMPGE T5,ETOERR ;ERROR IF CAN'T FIND SYMBOL.
CALL @ETOTAB(T5) ;CALL RTN FOR OPTION.
CALL ETOFIN ;RECOMPUTE DRIVE ASSIGNMENTS.
TLO SF,D1CHAR ;WILL MAKE GPASST ACT LIKE PASSPS.
JRST AET1
ETOTAB: ;LIST OF DT OPTIONS.
IRP X,,[BLOCK,DONE,DRIVE,DSTAT,ENABLE,FILE,LIST,LOCK
NEW,OFF,RESET,RO,STATUS,STOP,SUNIT,UNIT,WE,WL]
(SIXBIT/ X/) ;USE 1ST 3 CHARS ONLY.
ETO!X
TERMIN
ETONUM=<.-ETOTAB>/2
ETOERR: ERROR [ASCIZ/BAD OPTION/]
AETCR: SKIPN AETLFL ;IF END OF 1ST LINE,
SKIPE AETCRP ;OR 2ND CR IN ROW,
RETURN
SETOM AETCRP ;ELSE GOT 1ST CR.
JRST AET1
AETLFL: 0
AETCRP: 0
; STATUS OPTION -- GIVES STATUS OF ALL DRIVES.
ETOSTA: CRF
TTOA ETSMSG
SAVE T3
SETZ T3,
CALL ETODS1 ;PRINT STATUS OF EACH DRIVE
CAIGE T3,ETNDRV-1
AOJA T3,.-2 ;UNTIL ALL DONE.
REST T3
CRF
RETURN
; DSTAT OPTION -- STATUS OF CHOSEN DRIVE. FINISHES.
ETODST: TTOA ETSMSG
ETODS1: CALL ETOGDV ;SET UP FOR SELECTED DRIVE.
SAVE SF
TLO SF,DNUMM
TTOA [ASCIZ/ /]
SYMTYP T3 ;PRINT DRIVE NUM.
TTOI ^I
SKIPGE T5,ETCUNI ;PRINT CORR. UNIT NUM.
TTOA 2,[ASCIZ/ OFF/]
TTOA [ASCIZ/ /]
SYMTYP T5
CAMN B,ETDRIV
TTOA [ASCIZ/ */] ;IF SELECTED, SAY SO.
TTOI ^I
HRRZ T5,ETCPOS ;PRINT TAPE POSITION.
TTOA [ASCIZ/ /]
SYMTYP T5
TTOI ^I
SKIPN ETCENA ;SAY WHETHER WRITE-ENABLED.
TTOA 1,[ASCIZ/WL /]
TTOA [ASCIZ/WE /]
SKIPN ETCDIR
TTOA 3,[ASCIZ/STOP /] ;IF DRIVE NOT MOVING.
SKIPL ETCDIR
TTOA 1,[ASCIZ/FWD /] ;IF FORWARD.
TTOA [ASCIZ/BACK /] ;IF BACKWARD.
HRLZ T5,ETCFIL ;GET DEV. NAME.
6TYPE T5 ;PRINT DEV. NAME,
TTOI ":
6TYPE ETCSNM ;SNAME.
SKIPE ETCSNM
TTOI ";
6TYPE 1+ETCFIL ;FILENAMES.
TTOI "
6TYPE 2+ETCFIL
CRF
POPSFJ: REST SF
RETURN
ETSMSG: ASCIZ/DRIVE UNIT POS. W? DIR FILE
/
; BLOCK OPTION - MOVE DECTAPE TO SPECIFIED POSITION.
ETOBLO: CALL ETOARG
-20.,,600. ;LIMITS ON RANGE OF VALID ARGS.
CALL ETOGDV ;MAKE SURE DRIVE CHOSEN.
MOVEM T2,ETCPOS ;SET THAT DRIVE'S POSITION.
SETZM ETCDIR
JRST ETOST1 ;STOP THE DRIVE (WAS PUT ON LOCAL).
; DRIVE OPTION -- CHOSE A SPECIFIC DRIVE.
ETODRI: CALL ETOARG ;READ ARG.
0,,ETNDRV
MOVEI T3,(T2) ;SET DRIVE NUM.
RETURN
; ENABLE OPTION (ALSO WE) -- ENABLE WRITING.
ETOENA:
ETOWE: CALL ETOGDV
SETOM ETCENA ;WRITE-ENABLE.
RETURN
; LOCK OPTION (ALSO RO, WL) -- LOCK OUT WRITING.
ETOLOC:
ETORO:
ETOWL: CALL ETOGDV
SETZM ETCENA
RETURN
; FILE OPTION -- SET FILE ASSOCIATED WITH DRIVE. STOPS DRIVE.
ETOFIL: CALL ETOGDV
MOVEI A,ETCFIL
SAVE B
SAVE T3
CALL DGFIL ;READ FILE NAME.
REST T3
REST B
.SUSET [.RSNAM,,A]
MOVEM A,ETCSNM ;SET SNAME TOO.
CAMN B,ETDDIC ;IF THIS DRIVE'S DIR WAS IN,
SETZM ETDDIC ;NO LONGER.
CAME B,ETDOPN
RETURN
SETZM ETDOPN
.CLOSE ETC,
RETURN
; OFF OPTION -- SET OFFLINE (NOT ASSIGNED TO ANY UNIT).
ETOOFF: CALL ETOGDV
SETOM ETCUNI
SETOM ETNFIN ;HAVE CHANGED UNIT ASSIGNMENTS.
RETURN
; STOP OPTION -- STOP DRIVE.
ETOSTO: CALL ETOGDV
ETOST1: HRRE A,ETCDIR ;STOPPING TAKES 1 BLOCK.
ADDM A,ETCPOS
SETOM ETNFIN ;INDICATE FINISHING NEEDED.
SETZM ETCDIR ;SAY ISN'T MOVING.
SETZM ETCUPS
MOVEI A,(B)
JRST QDEL ;STOP TRAPS FOR ITS MOTION.
; SUNIT OPTION -- SET UNIT ASSIGNMENT.
ETOSUN: CALL ETOARG
0,,7
CALL ETOGDV ;SET UP CHOSEN DRIVE.
HRRZM T2,ETCUNI ;SET UNIT NUM. WORD.
SETOM ETNFIN ;MUST RECOMPUTE UNIT-ASSIGNMENTS.
RETURN
; UNIT OPTION -- CHOSE DRIVE WITH SPECIFIED UNIT NUM. MUST FINISH.
ETOUNI: CALL ETOFIN ;SO CAN KNOW WHICH DRIVE GOES WITH UNIT.
CALL ETOARG
0,,7
SKIPN T2,ETUTAB(T2) ;GET -> INFO FOR CORRSP. DRIVE.
ERROR [ASCIZ/DRIVE NOT UNIQUE/]
SKIPG T2
ERROR [ASCIZ/UNIT HAS NO DRIVE/]
SUBI T2,ETDTAB ;COMPUTE DRIVE NUM. FROM PTR.
IDIVI T2,ETCLEN
MOVEI T3,(T2)
RETURN
; RESET OPTION -- STOP ALL TAPES, ETC.
ETORES==ZET
; LIST OPTION -- LIST NAMES OF OPTIONS.
ETOLIS: MOVE T1,[-ETONUM,,ETOTAB]
JRST CLCOMS
; NEW OPTION -- UN-CHOSE THE CHOSEN DRIVE, CAUSE NEW DRIVE
; TO BE CHOSEN NEXT TIME ONE'S NEEDED.
ETONEW: SETO T3,
RETURN
;READ IN AN ARG, SAVING T3. ERROR IF NO ARG OR REGISTER.
; CALL ETOARG
; LOW,, HIGH ;RANGE OF ADMISSIBLE VALUES.
ETOARG: SAVE T3
CALL DGVPSP ;TRY READING VALUE.
REST T3
SKIPN DGVALP
ERROR [ASCIZ/NO ARG/]
TLNE T2,REGBIT
ERROR [ASCIZ/ACCUM./]
HRREI T2,(T2) ;EXTEND ARG TO FULL WORD.
HLRE T5,@(P) ;LOW END OF RANGE,
HRRE T6,@(P) ;HIGH END.
CAML T2,T5
CAILE T2,(T6)
ERROR [ASCIZ/ARG OUT OF RANGE/]
AOS (P)
RETURN
; FINISH OPTION -- RECOMPUTE CORRESPONDENCE BETWEEN DRIVES AND UNITS.
;IF THE SELECTED DRIVE'S UNIT HAS CHANGED, OR IT HAS BEEN STOPPED,
;AND READY IS OFF, A SELECTION ERROR IS CAUSED.
;EXITS TO ETINT ALWAYS SINCE MIGHT HAVE CHANGED READY OR ERROR.
ETOFIN: SKIPN ETNFIN
RETURN ;IF NOTHING TO DO. ELSE,
SETZM ETNFIN ;INDICATE HAVE FINISHED.
MOVSI T5,-10
SETOM ETUTAB(T5) ;SO FAR, EACH UNIT HAS NO DRIVES.
AOBJN T5,.-1
MOVE B,[-ETNDRV,,ETDTAB]
ETOX0: SKIPGE T5,ETCUNI ;IF DRIVE OFFLINE, SKIP IT.
JRST ETOX1
SKIPL ETUTAB(T5) ;IF ITS UNIT HAS A DRIVE ALREADY,
SETZM ETUTAB(T5) ;IT NOW HAS >1, NOT SELECTABLE.
SKIPGE ETUTAB(T5) ;OTHERWISE IT HAS 1 DRIVE (THIS ONE).
HRRZM B,ETUTAB(T5)
ETOX1: ADDI B,ETCLEN-1
AOBJN B,ETOX0
SKIPGE T5,ETUNIT ;IF A UNIT IS SELECTED,
JRST ETINT
MOVE B,ETUTAB(T5)
EXCH B,ETDRIV ;UPDATE SELECTED DRIVE.
CAMN B,ETDRIV ;IF IT HAS CHANGED,
JRST ETOX2
ETOX3: SKIPE ETREDY ;IF WERE IN MIDDLE OF DT OPERATION,
JRST ETINT
SETOM ETUNIT ;INDICVATE NONE SELECTED,
SETOM ETDRIV
TTOA [ASCIZ/CAUSED SELE ERROR
/]
ETESEL: MOVEI A,ETSELE ;CAUSE ERROR.
JRST ETERR
ETOX2: SKIPE ETCDIR ;IF DRIVE STILL SAME, BUT HAS BEEN STOPPED,
JRST ETINT
JRST ETOX3 ;MAY ALSO CAUSE SELE ERROR.
;MAKE SURE A DRIVE HAS BEEN CHOSEN. IF NOT, CHOSE AN OFFLINE DRIVE.
;SET B UP -> INFO ON DRIVE.
ETOGDV: JUMPGE T3,ETOGD2 ;IF DRIVE ALREADY CHOSEN.
MOVSI T3,-ETNDRV
MOVEI B,ETDTAB ;ELSE SEARCH THRU ETDTAB
ETOGD0: SKIPGE ETCUNI ;FOR A DRIVE THAT'S OFFLINE.
JRST ETOGD1 ;IF FOUND.
ADDI B,ETCLEN ;ELSE TRY NEXT ONE.
AOBJN T3,ETOGD0
ERROR [ASCIZ/WHAT DRIVE/] ;IF ALL ONLINE.
ETOGD1: MOVEI T3,(T3) ;T3, B BOTH SET UP NOW.
RETURN
ETOGD2: MOVEI B,(T3) ;COMPUTE B FROM T3.
IMULI B,ETCLEN
ADDI B,ETDTAB
RETURN
]
;BLOCK FORMAT
;WD1 TIME OR PRIORITY
;WD2 -1=IDLE, ELSE LINK
;WD3 INST TO XCT
;10 PS
;7 PC
;6 XXWAIT
;5 DEFERRED BNDRY ERROR (PC SET TO ODD ADDR)
;4,,500000 MEMORY MANAGEMENT TRAP.
;4 TT
;3 PDLOV
;2 STOP
TRQADD: SKIPL 1(A) ;TRAP QUEUE ADD
RETURN ;ALREADY IN QUEQUE
MOVEM C,(A)
TRQQA: MOVEI B,TRINF
TLZ A,-1
QADD: MOVE C,B
MOVE B,1(C)
MOVE T,(B)
CAML T,(A)
JRST QADD
MOVEM A,1(C)
MOVEM B,1(A)
RETURN
CLQADD: SKIPL 1(A) ;CLOCK QUEUE ADD
RETURN ;ALREADY IN QUEQUE
MOVEI B,CLINF
MOVEM C,(A)
TLZ A,-1
QADD2: MOVEM A,QFLAG ;SAY THIS BLOCK BEING QUEUED AT MAIN PROG LVL.
MOVE C,B
MOVE B,1(C)
MOVE T,(B)
CAMGE T,(A)
JRST QADD2
MOVEM A,1(C) ;MAKE PREV POINT TO NEW
MOVEM B,1(A) ;MAKE NEW POINT TO NEXT
SETZM QFLAG
RETURN
QDEL: SKIPGE 1(A) ;QUEUE ITEM DELETE
RETURN ;ALREADY IDLE
MOVE B,A
QDEL2: MOVE C,B
MOVE B,1(C)
CAIN B,CLINF
MOVEM A,QFLAG
CAME B,A
JRST QDEL2
MOVE B,1(A)
SETOM 1(A)
MOVEM B,1(C)
SETZM QFLAG
RETURN
TRINF: -1 ;ROOT OF TRAP QUEUE
TRINF
.VALUE
CLINF: 377777,, ;ROOT OF CLOCK QUEUE
CLINF
TTOA [ASCIZ /
THIS PROGRAM HAS REACHED THE AGE OF MANDATORY RETIRMENT/]
PDL: BLOCK PDLSIZ
BLOCK 20 ;SO PDL OVERFLOW DOESN'T CLOBBER THINGS
PAT:
PATCH: BLOCK 100
TYOFLG: -1 ;OUTPUT TO TTY
LPTFLG: 0 ;OUTPUT TO LPT
LPTCNT: 0 ;NUM TIMES LPT OPEN
QFLAG: 0 ;IN CLQADD OR QDEL FOR CLQUEUE
RUN: 0
TRPPNT: 1 ;TPV
BLOCK TRPPTL-1
INVTRP: 0 ;IN VTRAP
QA: 0
QD: 0
QT: 0
RTIME: 0
CONSTANTS
RNGCSR=IOORG+72020 ;NG DIS
RNGREL=IOORG+72021
45Y[
RSDR0=IOORG+172100/2
RSAR0=IOORG+172140/2
RSSR3=IOORG+172516/2
]
RPKCSR=IOORG+75260 ;KW11 PROGRAMMABLE CLOCK
RPKCSB=IOORG+75261
RPKC=IOORG+75262
RRCSR=IOORG+76000 ;DC11 ASYNCHRONOUS LINE INTERFACE
RRBUF=IOORG+76001
RTSCR=IOORG+76002
RTBUF=IOORG+76003
RCSR=IOORG+76400 ;DM11 ASYNCHRONOUS 16-LINE SINGLE SPEED INTERFACE
RBAR=IOORG+76401
RBCR=IOORG+76402
RTBR=IOORG+76403
RDIV=IOORG+77540 ;EAE
RAC=IOORG+77541
RMQ=IOORG+77542
RMUL=IOORG+77543
RSCSR=IOORG+77544
RNOR=IOORG+77545
RLGS=IOORG+77546
RARS=IOORG+77547
RTCST=IOORG+77560 ;777340 DECTAPE
RTCCM=IOORG+77561 ;777342
RTCWC=IOORG+77562 ;777344
RTCBA=IOORG+77563 ;777346
RTCDT=IOORG+77564 ;777350
RRKDS=IOORG+77600 ;RK11 DSK
RRKER=IOORG+77601
RRKCS=IOORG+77602
RRKWC=IOORG+77603
RRKBA=IOORG+77604
RRKDA=IOORG+77605
RRKMR=IOORG+77606
RRKDB=IOORG+77607
RDCS=IOORG+77630 ;RF11/RS11 DSK
RWC=IOORG+77631
RCMA=IOORG+77632
RDAR=IOORG+77633
RDAE=IOORG+77634
RDBR=IOORG+77635
RMA=IOORG+77636
RADS=IOORG+77637
RLPS=IOORG+77646
RLPB=IOORG+77647
RLKS=IOORG+77663
RPRS=IOORG+77664
RPRB=IOORG+77665
RPPS=IOORG+77666
RPPB=IOORG+77667
RTKS=IOORG+77670
RTKB=IOORG+77671
RTPS=IOORG+77672
RTPB=IOORG+77673
RSWR=IOORG+77674
45Y[
RSSR0=IOORG+177572/2
RSSR1=IOORG+177574/2
RSSR2=IOORG+177576/2
RUSDR0=IOORG+177600/2
]
RCSX=IOORG+77750 ;& NEXT TWO WORDS
RATE=IOORG+77774
RPIR=IOORG+77775 ;11/45
45Y RSLR==IOORG+177774/2 ;STACK LIMIT REGISTER.
RPS=IOORG+77777
;DEFINE ACCUMULATORS
I1=4
SF=5
DO=6 ;IF POSITIVE, VIRT. ADDRESS OF OPEN LOC.
DL=7 ;HOLDS %Q OR ARG.
T0=10 ;HOLDS LAST CHAR, EXCEPT IN INSN PRINTING.
T1=11 ;TEMP FOR INST HANDLERS
T2=12 ;USED BY ADDRESS COMPUTATION RTNS.
T3=13
DLEN=14 ;HOLDS LENGTH OF %Q OR ARG IN WORDS.
T5=15 ;EXTREMELY TEMPORARY.
T6=16 ; " " " " .
.XCREF SF,DL,T0,T1,T2,T3,T5,T6
;FLAGS IN SFLAGS, LEFT HAND SIDE
DBYTM==200000 ;REGISTER OPEN IN BYTE MODE.
DEXCM==100000 ;IN DON'T PRINT CONTENTS MODE.
DINSM==40000 ;PRINT AS INSTRUCTION.
DSYMM==20000 ;PRINT NUMBERS, ADDRESSES SYMBOLICALLY.
DASCM==10000 ;PRINT NUMBERS AS ASCII.
DNUMM==4000 ;PRINT NUMBERS NUMERICALLY. ABOVE DSYMM.
DDECM==2000 ;WHEN PRINTING NUMERICALLY, USE BASE 10. .
DREGM==1000 ;PRINT REGISTER NUMS NUMERICALLY.
NUMFND==200 ;SET AT ENTRY TO COMMAND IF HAS ARG.
DSEMFL==100 ;IF SET, RUBBING-OUT SHOULD BE STOPPED BY NON-DIGITS.
CSSFLG==40 ;SET DURING ;S -- CAUSES INPUT FROM LOADCH.
D1CHAR==20 ;RE-READ THE CHAR IN T0, IN NEXT GETCHR.
BYTOPN==10 ;CURRENTLY OPEN LOC. IS BYTE.
DMODES==DBYTM+DEXCM+DINSM+DSYMM+DASCM+DNUMM+DDECM+DREGM
JRSTF==JRST 2,0
IF2 CDDT==CALL DDT ;USED FROM HACTRN WITH $X.
IF2 GETCHR==CALL DGCHR ;NEXT INPUT CHAR, IN DDT.
;FLAG IN AC CONTAINING ADDRESS (IN DDT)
REGBIT==1 ;INDICATES ADDR. IS REGISTER NUM.
.5KBIT==400000 ;INDICATES .5KILLED SYMBOL .
XREGTY: TLNE SF,DREGM
JRST XREGT1
SKIPN XSYMTA
TLNN SF,DNUMM
TLNN SF,DSYMM
JRST XREGT1 ;IF SHOULDN'T PRINT SYMBOL.
HRLI B,1 ;TYPE-CODE FOR REG. SYM.
HRRZ A,SYMEND
XREGT0: CAME B,1(A) ;IF THIS STE'S VALUE IS REG. TO TYPE,
JRST XREGT5
6TYPE (A) ;PRINT NAME OF SYMBOL.
JRST UUOXIT
XREGT5: SUBI A,2
CAIE A,SYMDRG ;NO NEED TO CHECK INSNS AND %1...%7 .
JRST XREGT0
XREGT1: SKIPN XREGTF ;NO SYMBOL, PRINT NUMERICALLY.
TTOI "% ;INDICATE IS REG. UNLESS TOLD NO NEED TO.
XNUMTY: ANDI B,-1
MOVEI C,DECP
TLNN SF,DDECM ;IF DECIMAL, CALL DECP,
MOVEI C,OCTP
PUSHJ P,(C) ;CALL PRINT RTN.
TLNE SF,DDECM ;IN DECIMAL MODE, PRINT ".".
TTOI ".
JRST UUOXIT
XASCTY: CAILE B,377 ;1 CHAR?
JRST XASCT1 ;NO, 2.
TTOI "' ;1.
TTOI (B) ;PRINT IT.
JRST UUOXIT
XASCT1: TTOI "" ;2 CHARS.
TTOI (B) ;PRINT 1ST (LOW) CHAR.
LSH B,-10
JRST XASCT1-2
XREGTF: 0 ;IF #0, OK TO OMIT % WHEN PRINTING REG. VAL.
XSYMTA: 0
;PRINT AN ADDRESS SYMBOLICALLY:
XADRTY: SETOM XSYMTA ;INDICATE ADRTYP.
JRST .+2
;PRINT NUMBER IN CURRENT MODE.
XSYMTY: SETZM XSYMTA
MOVE B,(A) ;WORD TO PRINT.
TLNE B,REGBIT ;IF REGISTER NUM, SPECIAL HANDLING
JRST XREGTY
SKIPE XSYMTA ;IF NOT PRINTING ADDRESS TO OPEN,
JRST XSYMT3
TLNE SF,DNUMM ;CHECK FOR NUMERIC AND ASCII MODES.
JRST XNUMTY
TLNE SF,DASCM
JRST XASCTY
XSYMT3: TLNN SF,DSYMM ;IF NOT IN SYMBOLIC MODE,
JRST XNUMTY ;PRINT NUMERICALLY.
TRZ B,600000
PUSH P,T
PUSH P,D ;NAME OF BEST SYMBOL SO FAR.
PUSH P,E ;VALUE OF BEST SYMBOL SO FAR.
SETZ D, ;NO SYMBOL FOUND.
SETO E, ;BEST SYMBOL'S VALUE IS -1.
HRRZ C,SYMEND
XSYMT0: SKIPL T,1(C) ;ONLY NON-.5KILLED NORMAL SYMBOLS O.K.
TLNE T,-1
JRST XSYMT1
CAIG T,(B) ;ACCEPTABLE ONLY IF <= NUM. TO BE PRINTED.
CAIL E,(T) ;CLOSER THAN BEST SO FAR?
JRST XSYMT1
MOVE D,(C) ;YES, REPLACE BEST SO FAR'S NAME, VALUE.
MOVEI E,(T)
XSYMT1: SUBI C,2 ;SEARCH TABLE BACKWARDS TO GET USER
CAIL C,SYMDRG ;SYMBOLS BEFORE PREDEFINED ONES.
JRST XSYMT0
JUMPE D,XSYMT2 ;IF NO SUITABLE SYMBOL, PRINT NUMERICALLY.
SUBM B,E ;E HAS OFFSET OF VALUE FROM SYMBOL.
CAIL E,200 ;TOO FAR AWAY => PRINT NUMERICALLY.
JRST XSYMT2
MOVEI B,(E) ;ELSE THE # TO PRINT IS THE OFFSET.
6TYPE D
JUMPE B,XSYMT4 ;IFF OFFSET, --
TTOI "+
XSYMT2: TLO B,200000 ;NO SYMBOL- MAKE SURE TYPE ADDR. EVEN IF 0.
XSYMT4: POP P,E
POP P,D
POP P,T
JUMPE B,UUOXIT
JRST XNUMTY ;PRINT OFFSET IF ANY.
;GET NEXT INPUT CHAR. OUT OF LINE BUFER.
;IF BUFFER EMPTY, READ+ECHO UNTIL BREAK CHAR.
DGCHR1: PUSHJ P,DGLIN ;READ & ECHO LINE.
DGCHR: TLZE SF,D1CHAR ;IF SET, REREAD CHAR. IN T0.
RETURN
SETZM DGLCQF
DGCHR0:
TXN[ SKIPE FILINF ;IF :XFILING,
JRST DGCHRF ;READ FROM UTIC.
]
SOSGE DGLCNT ;COUNT CHARS. IN BUFFER.
JRST DGCHR1 ;IF NONE LEFT, GET NEW LINE.
ILDB T0,DGLPTR ;GET NEXT CHAR.
DGCHR2: CAIN T0,^Q ;IF CHAR IS ^Q,
SKIPE DGLCQF ;NOTQQUOTED BY PREV. ^Q,
RETURN
SETOM DGLCQF ;INDICATE NEXT CHAR IS QUOTED,
JRST DGCHR0 ;READ IT.
DGCHCS:
DGCHRF:
TXN[ .IOT UTIC,T0
MOVEI T0,(T0)
TTOI (T0) ;ECHO.
CAIE T0,^J
JRST .+3
SKIPE DGCHRC ;FLUSH LF'S AFTER CR'S IN FILES.
JRST DGCHRF
SETZM DGCHRC
CAIN T0,^M
SETOM DGCHRC ;INDICATE HAD CR AS LAST CHAR.
CAIN T0,^C ;IF EOF, GO BACK TO TTY.
JRST DGCHCC
SKIPE DGLCQF ;IF CHAR NOT ^Q-QUOTED,
JRST DGCHR2
IRPC CHAR,,BEWVS
CAIN T0,^CHAR ;CHECK FOR IO CTL CHARS
JRST DGCHC!CHAR
TERMIN
JRST DGCHR2
DGCHCB: CALL DGLNCB ;OPEN LPT.
JRST DGCHCS
DGCHCE: CALL DGLNCE ;END OUTPUT TO LPT.
JRST DGCHCS
DGCHCV: SETOM TYOFLG ;TURN ON TTY OUTPUT.
JRST DGCHCS
DGCHCW: SETZM TYOFLG ;TURN IT OFF.
CALL TRESET
JRST DGCHCS
DGCHCC: .CLOSE UTIC, ;ON EOF, CLOSE FILE,
SETZM FILINF
JRST DGCHR ;AND GO BACK TO TTY.
]
ETODON:
POP1J: SUB P,[1,,1]
RETURN
;READ FROM TTY UP TILL ACTIVATION NECESSARY,
;PROCESSING RUBOUTS UNTIL THEN.
;WHEN DONE, RETURN WITH DGLCNT=NUM CHARS,
;DGLPTR=B.P. TO CHARS.
DGLIN: PUSH P,T1
SETZM DGLRCT
MOVE T1,[440700,,DGLBUF] ;INITIAL B.P.
MOVEM T1,DGLPTR ;USED TO STORE CHARS.
MOVE T1,DGLINF
MOVEM T1,DGLINS
DGLRB0: SETZM DGLCNT ;RE-INIT. AFTER RUBOUT, THEN RE-READ.
SETZM DGLNQC
SETZM DGLCQF ;1ST CHAR NOT ^Q'D.
TLZ SF,DSEMFL
SETZM DGLALF
TXN[ .CALL TTYM1
.LOSE %LSFIL
]
DGLIN1: SETZM DGLCQF ;NORMALLY, CHAR NOT ^Q-QUOTED.
DGLIN0: SKIPN DGLRCT ;IF CHARS LEFT BEFORE RUBOUT,
JRST DGLIN2
ILDB T0,DGLRBP ;RE-READ THEM.
SOSG DGLRCT ;IF THE LAST CHAR LEFT
SKIPE DGLCQF ;IS AN UN-^Q-QUOTED ^Q,
JRST DGLIN3
CAIE T0,^Q ;IT HAD QUOTED THE CHAR RUBBED OUT,
JRST DGLIN3
TTOI ^Q ;SO RUB OUT THE ^Q, TOO.
DGLIN2:
TXN[ TLNE SF,DSEMFL ;IF AFTER A ';',
.CALL TTYMA ;ACTIVATE ON EACH CHARACTER.
JFCL
.IOT TYIC,T0 ;ELSE, READ NEW CHAR.
]
TXY[ PUSH P,A
PBIN
MOVE T0,A
CAIN T0,^M
PBIN
CAIN T0,37
MOVEI T0,^M
POP P,A
]
;NOW DECIDE WHAT TO DO WITH THE CHAR. JUST READ.
DGLIN3: SKIPE DGLCQF ;UNLESS CHAR WAS ^Q-QUOTED,
JRST DGLIT5
CAIN T0,^Q ;PROCESS ^Q,
JRST DGLCTQ
CAIN T0,177 ;RUBOUT SPECIALLY.
JRST DGLRUB
DGLIT5: SKIPE DGLNQC ;NEXT THREE TESTED EVEN IF ^Q-QUOTED:
JRST DGLQTD ;IF QUOTED BY ' OR ".
SKIPE DGLALF
JRST DGLAL1 ;IF AFFECTED BY PREV. ALTMODE.
TLNE SF,DSEMFL
JRST DGLSM1 ;IF AFTER UNQUOTED ";".
CAILE T0,"Z
JRST DGLIT6
SKIPN DGLCQF
CAIL T0,"A ;ELSE DON'T BOTHER TESTING
JRST DGLREG ;ALPHABETIC CHARS, ^Q-QUOTED CHARS.
DGLIT6: SKIPE DGLINF
JRST DGLIT2 ;IN LINE MODE ^M IS ONLY BREAK CHAR.
;NORMAL BREAK CHARS:
CAIE T0,"[
CAIN T0,"]
JRST DGLBK
CAIN T0,^]
JRST DGLBK
IRP C1,,[^L,^N,"/,"=,"_]C2,,[^\,^P,^I,^J,"^]
CAIE T0,C1
CAIN T0,C2
JRST DGLBK
TERMIN
CAIN T0,"'
JRST DGLQUO ;QUOTES NEXT CHAR.
CAIN T0,""
JRST DGL2Q ;QUOTES 2 CHARS.
CAIN T0,":
JRST DGLCOL ;ENTERS LINE MODE TO READ COMMAND.
CAMN T0,SEMICL
JRST DGLSEM ;READS NUMBER, THEN LETTER.
CAMN T0,ALTMOD
JRST DGLALT ;QUOTES ALL CHARS EXCEPT ALTMODE.
DGLIT2: CAIN T0,^M
JRST DGLBK
;THESE CHARS ARE TESTED FOR IN ALL STATES
;EXCEPT WHEN ^Q-QUOTED.
DGLIT3: SKIPN DGLCQF
JRST DGLIT4 ;IGNORE IF ^Q QUOTED.
CAIN T0,^S
JRST DGLCTS ;^S TURNS OUTPUT BACK ON WHEN READ.
CAIE T0,^B
CAIN T0,^E
JRST DGLIN1 ;^B, ^E, ^W, ^V SIGNIF. ONLY AT
CAIE T0,^V ;INTERRUPT LEVEL,
CAIN T0,^W ;IGNORED HERE.
JRST DGLIN1
DGLIT4: TLNE SF,DSEMFL ;AFTER A ";", ALL NORMAL CHARS
JRST DGLBK ;ARE BREAK CHARS.
SETZM DGLALF
JRST DGLREG
;ROUTINES TO HANDLE VARIOUS TYPES OF CHARS.
DGL2Q: AOS DGLNQC ;INSERT, QUOTE NEXT 2 CHARS.
DGLQUO: AOSA DGLNQC ;QUOTE ONLY 1 CHAR.
DGLQTD: SOS DGLNQC ;THIS CHAR IS QUOTED.
DGLREG: SETZM DGLCQF ;TURN OFF AFTER OTHER THAN ^Q.
SKIPA
DGLCTQ: SETOM DGLCQF ;^Q - INDICATE NEXT CHAR ^Q-QUOTED.
AOS DGLCNT
IDPB T0,DGLPTR
JRST DGLIN0
; ^S - TURN ON TYPOUT, PASS IT BY.
DGLCTS: SETOM TYOFLG
JRST DGLIN1
;BREAK CHAR - INSERT AND EXIT.
DGLBK: AOS DGLCNT
IDPB T0,DGLPTR
MOVE T1,[440700,,DGLBUF]
MOVEM T1,DGLPTR ;SET UP PTR FOR UNPACKING.
SETZM DGLINF
DGLINX: POP P,T1
RETURN
; ";" - ALL EXCEPT DIGITS, " ", "." ARE BREAK CHARS.
DGLSEM: TLO SF,DSEMFL
JRST DGLREG ;INSERT THE ";".
DGLSM1: CAIN T0,"-
JRST DGLREG
CAIE T0,"
CAIN T0,".
JRST DGLREG
CAIL T0,"0
CAILE T0,"9
JRST DGLIT3 ;NON-DIGIT, IGNORE OR BREAK.
JRST DGLREG
DGLCOL: SETOM DGLINF ;":" - READ UNTIL CR.
JRST DGLREG
;COME HERE IF CHAR AFFECTED BY PREVIOUS ALTMODE.
DGLAL1: CAIN T0,"-
JRST DGLALT ;- SIGN DOESN'T END TYPEOUT MODE CMD.
CAME T0,ALTMOD
JRST DGLIT3
DGLALT: SETOM DGLALF
JRST DGLREG
;COME HERE TO HANDLE RUBOUT.
DGLRUB: SOSGE T1,DGLCNT ;NUM. CHARS NOT RUBBED.
JRST DERR ;IF NO CHAR TO RUB.
MOVEM T1,DGLRCT ;RE-READ THOSE CHARS.
LDB T0,DGLPTR
TTOI (T0) ;ECHO RUBBED CHAR.
MOVE T1,[440700,,DGLBUF]
MOVEM T1,DGLRBP ;PTR FOR RE-READING.
MOVEM T1,DGLPTR
MOVE T1,DGLINS ;RESTORE INITIAL DGLINF.
MOVEM T1,DGLINF
JRST DGLRB0
DGLNQC: 0 ;NUM. OF NEXT CHARS TO QUOTE.
DGLRBP: 0 ;B.P. FOR RE-READING AFTER RUBOUT.
DGLRCT: 0 ;NUM. CHARS TO RE-READ.
DGLCNT: 0 ;NUM. CHARS READ.
DGLPTR: 0 ;B.P. FOR STORING CHARS READ.
DGLINF: 0 ;IF SET, READ UNTIL CR.
DGLINS: 0 ;SAVES INITIAL VALUE OF DGLINF.
DGLALF: 0 ;SET AFTER ALTMODE.
DGCHRC: 0 ;NONZERO IF FILINF AND LAST CHAR WAS CR.
DGLCQF: 0 ;CONTROL Q FLAG
DGLBUF: BLOCK 60 ;RUBOUT PROCESSING AND I-O BUFFER.
;DDT ENTRY-SAVES ACS 1-16.
DDT: POP P,QA
PUSH P,QA
TXN[ SKIPE DEBUGP
.VALUE [ASCIZ*:SIM. PC.
QA/ :VP *]
]
PUSH P,[DDTXIT] ;RTN TO CHANGE ACS AFTER RESTORATION.
SETZM DDONXT ; ;N STOPS AFTER THIS INSN.
DDT1:
TXN[ SKIPE WNGDIS
PUSHJ P,NGSIMD
]
PUSHJ P,MERRV ;TURN ON TTY OUTPUT.
PUSHJ P,SAVALL
SETZM RUN
MOVEM P,DDTPDP ;SAVE P FOR RESTORATION ON ERROR.
LSH PC,1
HRRM PC,R7
HRRM PC,%PC
HRRZ DL,OPC
LSH DL,1
SKIPL DL
HRRM DL,%OPC ;SET UNLESS HAVE JUST LEFT DDT.
HRRZ DL,JPC
LSH DL,1
HRRM DL,%JPC
HRRM PS,RPS
45Y[ MOVE T5,45REGY ;STORE AWAY CURRENT REGISTER SET, SO BOTH SETS'
MOVE T6,T5 ;VALUES LIVE IN THEIR BACKUP HOMES.
BLT T5,5(T6)
LDB T5,[45CMOD,,PS] ;GET CURRENT PROCESSOR MODE.
MOVE T6,R6
HRRM T6,45REG6(T5) ;STORE SELECTED R6 IN ITS BACKUP HOME.
MOVEI T5,4(T5) ;SET MODE OF OPENING IN DDT TO CURRENT PROCESSOR MODE.
MOVE T6,RSSR0 ;PAGING OFF => SET UNMAPPED MODE.
TRNN T6,45BSGE
MOVEI T5,6
MOVEM T5,OPNMD1
]
MOVEM TIME,RTIME
HRLZ SF,%TMODE
SKIPE DINITF
JRST DDT3 ;DON'T PRINT INSN ON STARTING PDP11.
HRRZ DL,R7
TLO SF,NUMFND ;CAUSE . TO BE SET BY DARG.
45Y[ TTOI @ALTMOD ;PRINT THE ADDRESS MODE THE NEXT INSTRUCTION IS IN
MOVE T5,OPNMD1
TTOA CTABTB(T5)
]
CALL DPINSN ;AND THEN PRINT THE PC AND THAT INSTRUCTION.
HRRM DLEN,%IL ;SAVE LENGTH, FOR ;N'S SAKE.
HRROI DO,(DO) ;DON'T ALLOW ACCIDENTAL CHANGES.
TTOA [ASCIZ/ /]
DDT2:
TXN[ SETZM FILINF
.CLOSE UTIC,
.RESET TYIC,
]
DDT3: SETZM DINITF ;THAT FLAG SET 1ST TIME ONLY.
SETOM DGVLVL
SETOM QUITF
JRST DLOOP
;PUSHJ HERE, AND IT RETURNS WITH ACS 1-16 SAVED.
SAVLNG==16 ;NUM LOCATIONS PUSHED
SAVALL: EXCH A,(P) ;SAVE REG. 1.
PUSH P,B
MOVEI B,1(P) ;SET UP BLT POINTER.
HRLI B,C
ADD P,[14,,14] ;POINT TO LAST PLACE TO PUSH TO.
BLT B,(P)
JRST (A)
;PASS SPACES.
GPASST: GETCHR
PASSPS: CAIN T0,"
JRST GPASST
RETURN
;COME HERE FOR NEXT COMMAND.
DLOOP: TLZ SF,DMODES ;RESTORE TEMPORARY MODES.
TLO SF,@%TMODE
MOVE T6,OPNMDT
MOVEM T6,OPNMD1
DLOOP1: MOVE T6,DL
TLO T6,.5KBIT
MOVEM T6,%Q ;SET %Q FROM DL, .5KILLED.
HRRM DLEN,%L ;SAVE LENGTH IN CASE ERROR.
DLOOP2: CALL DGVAL ;TRY TO GET A NUMERIC VALUE.
SKIPN DGVALP ;IF HAD ARG,
JRST DLOOP3
SETZM S%OLFL ;STOP UPDATING LENGTH OF WHAT'S OPEN
TLO SF,NUMFND ;TELL COMMAND ABOUT ARG
SKIPA DL,T2 ;SET %Q TO ARG.
DLOOP3: HRRZ DLEN,%L ;ELSE RESTORE LENGTH.
JSP T1,DDECOD ;JUMP ACCORDING TO FIRST CHAR. AFTER NUM.
"/,,CSLASH
"[,,CLB
"],,CRB
^I,,CTAB
^J,,CLF
^K,,CCTLK
^M,,CCR
"^,,CUPAR
"=,,CEQ
";,,CSEM
",,CALT
"_,,CBACK
">,,CGT
":,,CCOL
^N,,CCN
^P,,CSP
^L,,CFORMF
^\,,CCBSL
^],,CCRB
" ,,DLOOP1
DERR ;IF NOT FOUND.
;LOOK IN TABLE AT (T1) FOR ENTRY WITH LH=(T0),
;THEN JRST TO @RH OF ENTRY.
DDECOD: CAIL T0,"A+40 ;CONVERT LOWER CASE TO UPPER CASE.
CAILE T0,"Z+40
CAIA
SUBI T0,40
DDECO1: HLRZ T5,(T1) ;LH, FOR COMPARISON.
HRRZ T6,(T1) ;RH FOR JUMP.
CAIN T0,(T5) ;FOUND ENTRY?
JRST (T6) ;YES, GO THERE.
JUMPE T5,(T6) ;IF LH IS 0, GO THERE ANYWAY(END OF TABLE).
AOJA T1,DDECO1 ;TRY NEXT ENTRY.
;READ A CHAR, PASS SPACES, READ A VALUE.
DGVGCH: GETCHR
;PASS SPACES AND READ IN A VALUE.
DGVPSP: PUSHJ P,PASSPS
;READ IN A VALUE WHOSE 1ST CHAR HAS BEEN READ ALREADY.
DGV1CH: TLO SF,D1CHAR
;GET A VALUE, AND PUT IT IN T2. SET NUMFND IF VALUE AVAILABLE.
;T0 CONTAINS CHAR. FOLLOWING VALUE, OR 1ST CHAR, AT EXIT.
;SETS T1 .
DGVAL: SETZ T1, ;START ON LEVEL 0.
AOSE DGVLVL ;IF OUTERMOST CALL TO DGVAL,
JRST .+4
MOVE T5,[004400,,DRNEXT]
MOVEM T5,DRNEXT ;SET UP B.P. FOR EXTRA WDS,
MOVEI DLEN,2 ;INITIALIZE LENGTH.
PUSH P,DGVRGP
SETZM DGVRGP ;AS YET, THIS VALUE ISN'T A REGISTER NUM.
PUSH P,[DGVXIT]
DGVAL0: HLRZ T1,T1 ;PUT LEVEL IN RH.
SETZM DGVALP
PUSHJ P,DGVCAL ;TRY TO GET VALUE ON NEXT LEVEL.
SKIPN DGVALP ;IF CAN'T, RETURN NO VALUE.
RETURN
DGVAL1: HRRZ T5,DGVT2(T1) ;ADDR. OF OP TABLE FOR THIS LEVEL.
HRRZ T6,(T5) ;SEARCH FOR ENTRY WITH RH=NEXT CHAR.
CAIN T0,(T6)
JRST DGVAL2 ;FOUND.
SKIPE (T5) ;0 MARKS END OF TABLE.
AOJA T5,.-4 ;TRY NEXT ENTRY.
RETURN
DGVAL2: HLL T2,(T5) ;SAVE OPERATION TYPE NO.
PUSH P,T2 ;AND LAST VALUE.
CAIE T0,"@ ;"@" DOESN'T EVAL THE 2ND ARG.
PUSHJ P,DGVCAL ;TRY TO GET VALUE ON NEXT LEVEL.
REST T5 ;GET 1ST ARG, OP. NUM.
HLRZ T6,T5 ;GET OP. NUM.
SKIPE DGVALP ;IF NO 2ND ARG,
JRST DGVAL3
JUMPG T6,DERR ;ERROR UNLESS OP. IS " ",
HRRZ T2,T5 ;IN WHICH CASE RETURN 1ST ARG.
RETURN
DGVAL3: HRREI T2,(T2) ;GOT 2ND ARG - EXTEND SIGNS OF ARGS,
HRREI T5,(T5)
XCT DGVT3(T6) ;PERFORM OPERATION.
JRST DGVAL1 ;LOOK FOR ANOTHER OP.
DGVCAL: PUSH P,T1 ;SAVE LEVEL NO.
MOVE T1,DGVT1(T1) ;GET NEXT LEVEL NO., ADDR. TO CALL.
PUSHJ P,(T1) ;GET VALUE ON NEXT LEVEL.
POP P,T1 ;RESTORE LEVEL NO.
RETURN
DGVT1: 1,,DGVAL0 ;FROM LEVEL 0, CALL SELF ON LEVEL 1.
2,,DGVAL0
3,,DGVAL0
4,,DGVAL0
5,,DGTRM
DGVAL ;DGTRM CALLS BACK ON LEVEL 3.
DGVT2: DGVL0T ;LEVEL 0 OP. TABLE.
DGVL1T ;LEVEL 1 OP. TABLE.
DGVL2T
DGVL3T
DGVL4T
DGVL5T
DGVL0T: 0,," ;SPACE - LOW PRIOR. ADDITION.
0
DGVL1T: 5,,"& ;LOGICAL OPS. LOWEST IN PRIOR.
6,,"\
8,,"#
0
DGVL2T: 3,,"+
4,,"-
0
DGVL3T: 1,,"* ;MULT., DIV. SEPARATE TERMS.
2,,"!
0
DGVL4T: 9,,"@
0
DGVL5T: 7,,", ;ANGLE-BRACKETS CONTAIN ORDINARY EXPRESSIONS
0 ;SEPARATED BY COMMAS.
DGVT3: ADDM T5,T2 ;SPACE - MUST HAVE CODE 0.
IMULI T2,(T5) ;1ST INSNS OF OPERATIONS.
IDIVM T5,T2
ADD T2,T5
SUBM T5,T2
ANDM T5,T2
IORM T5,T2
PUSHJ P,DGVCOM
XORM T5,T2
CALL DGVMAP
DGVMAP: SKIPE DGVRGP
ERROR [ASCIZ /REGISTER AS 1ST ARG OF @/]
SETZ T2,
GETCHR
SAVE T5
CALL CALT3 ;READ AND DECODE THE CHAR AFTER THE @.
REST T5
LDB T3,[12100,,T5]
CALL DCLOS3 ;MAP THE ADDR.
DPB T3,[12100,,T5]
MOVE T2,T5
SETZM OPNMD1
JRST DGCHR
DGVCOM: SKIPE DGVLVL ;IF WITHIN INNER BRACKETS,
JRST DGVCO2 ;THROW AWAY EXTRA WORD.
CAILE DLEN,10. ;CAN'T HAVE MORE THAN 5 EXTRA WDS.
ERROR [ASCIZ/> 6 WORDS/]
IDPB T2,DRNEXT ;2ND VALUE IS EXTRA WORD.
MOVE T2,T5
AOJ DLEN,
AOJA DLEN,CPOPJ
DGVCO2: MOVE T2,T5
RETURN
DGVXIT: SOS DGVLVL
HRLI T2,.5KBIT ;SINCE MUST .5KILL %P.
SKIPE DGVRGP ;IF THIS IS TO BE A REGISTER NUM.,
TLO T2,REGBIT ;SAY SO IN THE VALUE.
MOVEM T2,%P
POP P,DGVRGP
POPJ P, ;NOT AN OP. FOR THIS LEVEL, RETURN.
;GET A TERM, INTO T2. CLEAR NUMFND IF CAN'T GET ONE, SET IF CAN.
DGTRM: PUSHJ P,DGNUM ;TRY TO GET NUMBER.
SKIPE DGVALP ;IF FOUND, RETURN IT.
RETURN
PUSHJ P,DGSYM ;OTHERWISE, TRY TO GET SYMBOL.
JUMPE T2,DGTRM1 ;IF NO SYMBOL, TRY OTHER THINGS.
PUSHJ P,DLKSYM ;LOOK UP SYMBOL.
JUMPE T5,[ERROR [ASCIZ/U/]] ;UNDEFINED.
LDB T2,[220400+T5,,1]
JRST @.+1(T2) ;INDEX ON SYMBOL TYPE.
DGTRM2 ;ORDINARY SYMBOL.
DGVREG ;REGISTER SYMBOL.
DR2AR ;2-OP INSN.
DR2AR ;1-OP INSN.
DRJSR ;JSR.
DRJSR ;RTS.
DRDBR ;BRANCH INSN.
DREMT
DRSFL
DGTSER
[ERROR [ASCIZ/U/]]
DRSPEC ;SOB, MARK, SPL.
DRASH ;MUL, DIV, ASH, ASHC.
DRFPMS ;2-OP FP11 INSN, MEMORY SOURCE.
DRFPMD ;2-OP FP11 INSN, MEMORY DESTINATION.
DGTSER
;JRST THRU STE TO HERE TO GET VALUE OF REGISTER SYMBOL.
DGVREG: SETOM DGVRGP
;JRST HERE FOR NORMMAL SYMBOL.
DGTRM2: AOS DGVALP
HRRE T2,1(T5)
RETURN
DGTSER: CRF
6TYPE (T5)
MOVE T5,1(T5)
MOVEM T5,QA
ERROR [ASCIZ/ HAS IMPOSSIBLE STE! - A/]
;COME HERE TO CHECK FOR UNARY +,-.
DGTRM1: CAIE T0,"- ;FOR MINUS SIGN,
JRST DGTRM3
PUSHJ P,DGTRM ;GET A TERM AND NEGATE IT.
MOVN T2,T2
RETURN
DGTRM3: CAIN T0,"+ ;FOR + SIGN, START OVER.
JRST DGTRM
CAIE T0,"' ;'''' MEANS ASCII CHAR INPUT.
JRST DGTRM4
GETCHR
MOVEI T2,(T0)
DGTRM6: GETCHR ;GET CHAR AFTER TERM.
DGVRET: AOS DGVALP
RETURN
DGTRM4: CAIE T0,"" ;2 ASCII CHARS INPUT.
JRST DGTRM5
GETCHR
MOVEI T2,(T0)
GETCHR
LSH T0,10 ;2ND CCHAR INTO HIGH BYTE
ADD T2,T0
JRST DGTRM6
DGTRM5: CAIE T0,"< ;OPEN BRACKET?
POPJ P, ;NO, RETURN NO TERM.
PUSHJ P,DGVAL0 ;TRY TO GET VALUE.
CAIE T0,"> ;IF NOT CLOSED BY >, ERROR.
ERROR [ASCIZ/UNBAL/]
GETCHR ;PASS BY >.
RETURN
;CONVERT ARG TO RANGE OF ADDRS AND NUMBER.
;DEFAULTS ARE RANGE (AOBJN PTR IN T0): 0 - %CORE, NUMBER (IN T2): 0.
;IF 1 WD. IN ARG, IT SPECIFIES NUMBER.
;IF 2, THEY ARE RANGE,
;IF 3, 1ST 2 ARE RANGE, 3RD IS NUMBER.
DGRAN: SETZB T0,T2 ;PUT IN DEFAULTS.
HRRZ T1,%CORE
MOVEI T1,-2(T1)
TLNN SF,NUMFND
JRST DGRAN1 ;USE THEM IF NO ARG.
CAIN DLEN,2
JRST DGRAN2 ;1 ARG ==> SET LOCATIONS TO IT.
MOVEI T0,(DL) ;>= 2 ARGS ==> FIRST 2 ARE RANGE.
HRRZ T1,DRNEXT+1
CAIN DLEN,6 ;3RD ARG IS NUMBER TO STORE, IF PRESENT.
HRRZ T2,DRNEXT+2
JRST DGRAN1
DGRAN2: MOVEI T2,(DL)
DGRAN1: ANDI T0,MAXBYT-1
LSH T0,-1 ;CHANGE ADDRS TO WORD NOS.
LSH T1,-1
SUBM T0,T1
HRLI T0,-1(T1) ;AOBJN PTR -> BLOCK TO STORE IN.
TLO T0,-MAXCOR
ANDI T2,177777
RETURN
;READ A NUMBER INTO T2, PUT NEXT CHAR INTO T0.
;AT EXIT, NUMFND INDICATES NUMBER WAS THERE.
DGNUM: SETZB T2,DGVALP
SETZ T3, ;T2 ACCUMULATES OCTAL; T3, DECIMAL.
DGNUM1: GETCHR
SKIPN DGLCQF ;^Q-QTD CHARS NOT DIGITS.
CAIGE T0,"0 ;A DIGIT?
JRST DGNUM2 ;IF NOT, CHECK FOR ".".
CAILE T0,"9
JRST DGNUM2
AOS DGVALP ;FOUND A NUMBER.
LSH T2,3 ;PUT THIS DIGIT IN.
ADDI T2,-"0(T0)
IMULI T3,10. ;PUT IT IN DECIMAL NUM, TOO.
ADDI T3,-"0(T0)
JRST DGNUM1 ;TRY FOR ANOTHER DIGIT.
DGNUM2: SKIPE DGVALP ;IF HAD A NUMBER,
CAIE T0,". ;FOLLOWED BY ".",
JRST DGNUM3
MOVEI T2,(T3) ;USE DEC NUM, NOT OCT NUM.
GETCHR
DGNUM3: HRREI T2,(T2)
RETURN
;OPEN REGISTER WHOSE ADDR. IS IN DL.
DARG: MOVE DO,DL
TLZ DO,.5KBIT ;INSURE DO POSITIVE SINCE HAVE OPEN LOC.
MOVE T6,DO
TLO T6,.5KBIT
MOVEM T6,DOPEN ;SET SYMBOL %. .
TLZE SF,NUMFND ;IF ADDR WAS ARG,
MOVEM T6,DPNT ;ALSO SET SYMBOL . .
MOVE T6,OPNMD1
MOVEM T6,OPNMDL
MOVEI DLEN,2 ;ASSUME LENGTH IS 2 UNLESS PROVED LONGER.
HRRM DLEN,%OL
PUSHJ P,DCLOS0 ;T3 _ CORE ADDR OF LOC., -PDP11.
SKIPGE PDP11(T3)
JSP D,MTRAPR
HRRZ DL,PDP11(T3) ;GET WORD FROM OPEN REG.
TLZ SF,BYTOPN
TLNE DO,REGBIT ;REGISTERS NEVER BYTES.
RETURN
TRNN DO,1 ;IF ADDR ODD,
TLNE SF,DBYTM ;OR IN BYTE MODE,
TLOA SF,BYTOPN ;OPEN AS A BYTE,
RETURN
TRNE DO,1
LSH DL,-10
ANDI DL,377 ;RETURN ONLY THE DESIRED BYTE.
RETURN
;COME HERE ON ERROR.
DERR:
TXN CALL OSNAMR ;RESTORE OLD SNAME IF DESIRED.
SETOM DGVLVL ;IN CASE ERRED WITHIN DGVAL.
CALL MERRV ;TURN ON TTY OUTPUT.
TXN[ .CLOSE UTIC,
SETZM FILINF
.CLOSE LOADCH,
]
TTOA [ASCIZ/ ? /]
MOVE P,DDTPDP ;RESET STACK.
TXN .RESET TYIC,
TXY[ PUSH P,A
MOVEI A,.PRIIN
CFIBF
POP P,A]
SETZM XREGTF
SETZM DGLINF
SETZM DGLCNT
HRRZ DL,%Q ;DON'T CLOBBER DL WITH ERROR.
HRRZ DLEN,%L
TLZ SF,D1CHAR+NUMFND+CSSFLG+DSEMFL
JRST DLOOP1
TXN[
;READ A FILESPEC, PUT NAMES IN OPEN BLOCK <- A.
DGFIL: SETZM FILFLG
SETZ T3,
SETOM DGLINF ;INDICATE READING FILENAME.
DGFIL0: SETZ T2,
MOVE D,[440600,,T2]
DGFIL1: GETCHR
SKIPE DGLCQF ;^Q-QUOTED CHARS TREATED AS ORDINARY.
JRST DGFIL2
JSP T1,DDECOD
";,,DGFILS
":,,DGFILC
" ,,DGFILN
^M,,DGFILN
",,,DGFILN
,,DGFIL2 ;ORDINARY CHAR.
DGFIL2: MOVEI T0,-40(T0) ;CONV. TO SIXBIT.
TRNN D,1 ;UNLESS HAVE OVERFLOWED INTO T3,
IDPB T0,D ;STORE NEXT CHAR.
JRST DGFIL1
;COME HERE WHEN SPACE OR CR TERMINATES NAME.
DGFILN: JUMPE T2,DGFILM ;DO NOTHING IF NO NAME.
XCT DGFILT(T3) ;STORE NAME PROPERLY.
AOJ T3, ;SUCCESSIVE NAMES ARE FN1, FN2, DEV, SNAME.
DGFILX: SETOM FILFLG
DGFILM: CAIE T0,^M
CAIN T0,", ;^M AND ", TERMINATE FILSPC.
SKIPA
JRST DGFIL0 ;AFTER SPACE, TRY AGAIN.
SETZM DGLINF
OSNAMR: .SUSET [.RSNAM,,NSNAM] ;SAVE DEFAULT SNAME OR SPEC'D.
.SUSET [.SSNAM,,OSNAM] ;IF NOT SPEC'D, RESTORE CURRENT.
SETZM OSNAM ;NO LONGER NEED TO RESTORE.
RET
DGFILT: MOVEM T2,1(A) ;STORE FN1.
MOVEM T2,2(A) ;FN2.
HLRM T2,(A) ;STORE DEV.
DGFILS: CALL [ .SUSET [.SSNAM,,T2] ;STORE SNAME.(DOES NOTHING IF T2 ZERO)
SETZM OSNAM ;DON'T RESTORE SNAME LATER.
RET]
JRST DGFILX
DGFILC: JUMPE T2,DGFILX
HLRM T2,(A) ;COLON: ALWAYS STORE AS DEVICE.
JRST DGFILX
FILFLG: 0 ;SETOM'ED IF A "FILSPEC" ACTUALLY TYPED
;(DESIGNED SO CAN BE FAKED OUT BY : OR ; WITHOUT NAME)
OSNAM: 0 ;NONZERO => RESTORE SNAME ON ERROR OR RETURN FROM DGFIL.
NSNAM: 0 ;SNAME BEFORE RETURN FROM DGFIL AND RESTORE OSNAM.
]
;READ IN A SYMBOL, IF POSSIBLE.
;T2 GETS NAME IN SIXBIT IF SYMBOL, 0 OTHERWISE.
;ASSUMES 1ST CHAR IN T0. LEAVES FOLLOWING CHAR THERE.
DGSYM: TDZA T2,T2 ;NO CHARS YET. DON'T READ 1ST CHAR.
GETCHR
SKIPE DGLCQF ;IF ^Q-QUOTED,
MOVEI T5,-40(T0) ;ALWAYS USE IT.
SKIPN DGLCQF ;ELSE USE ONLY SQUOZE CHARS.
CALL D7TO6
DGSYM1: TLNE T2,770000 ;IF NOT FULL,
JRST DGSYM2
LSH T2,6 ;PUT IN THIS CHAR(OR BLANK).
ADDI T2,(T5)
JUMPE T2,CPOPJ ;IF NO SYMBOL, RETURN.
JUMPE T5,DGSYM1 ;IF NOT SYMBOL CHAR, LEFT-JUSTIFY.
DGSYM2: JUMPN T5,DGSYM+1 ;KEEP READING CHARS PAST END OF SYMBOL.
RETURN
;LOOK UP THE SYMBOL WHOSE SIXBIT IS IN T2.
;RETURNS IN T5 PTR TO STE (0 IF NONE).
DLKSYM: MOVE T6,SYMEND
TXN MOVNI T5,2-SYMTAB(T6) ;2*NUMBER OF SYMBOLS.
TXY[ MOVEI T5,SYMTAB
SUBI T5,2(T6)
]
DLKSY0: LSH T5,17. ;LH_ - NUM.SYMS.
HRRI T5,3(T6) ;RH _ LAST SYM + 3.
MOVSI C,DLKSY1
BLT C,C ;PUT LOOP IN ACS 0-3.
CALL
CAME T2,(T5) ;IF NOT FOUND, RETURN 0.
SETZ T5,
RETURN
DLKSY1: SUBI T5,3 ;MOVE TO PREV. STE.
CAME T2,(T5) ;IF NOT FOUND & MORE STE'S
AOBJN T5, ;GO LOOK AT THEM.
RETURN
;CONVERT AN ASCII CHAR TO SIXBIT, IF IT CAN GO IN A SYMBOL.
;IF IT CAN'T GO IN ONE, RETURN 0 (IN T5). ARG IN T0.
D7TO6: SETZ T5,
CAIL T0,"A+40
CAILE T0,"Z+40 ;LOWER CASE LETTERS OK
CAIA
JRST [MOVEI T5,-100(T0)
RETURN]
CAILE T0,"Z
RETURN
CAIL T0,"A
JRST D7TO6X ;ALPHABETIC CHARS O.K.
CAILE T0,"9
RETURN
CAIGE T0,"0
CAIN T0,". ;DIGITS AND ".", TOO.
JRST D7TO6X
CAIL T0,"&
RETURN
CAIL T0,"$ ;ALSO "%", "$".
D7TO6X: MOVEI T5,-40(T0)
RETURN
;DEFINE THE FOLLOWING SYMBOL
CGT: TLZ SF,NUMFND
CALL GPASST
PUSHJ P,DGSYM ;TRY GETTING SYMBOL, ERROR IF NONE.
JUMPE T2,DERR
MOVEI T6,SYMDMP
TXN MOVNI T5,2-SYMTAB(T6) ;SEARCH UNSETTABLES, SYMTAB THRU SYMDMP-2 .
TXY[ MOVEI T5,SYMTAB
SUBI T5,(T6)
]
CALL DLKSY0
SKIPE T5
ERROR [ASCIZ/UNSETTABLE SYMBOL/] ;IF FOUND THERE.
CALL DEFSYM ;GET OLD STE OR MAKE NEW ONE.
CALL PASSPS ;GET 1ST NONBLANK CHAR.
TLZ DL,.5KBIT
CAIE T0,^K
TLOA SF,D1CHAR ;IF NOT ^K, REREAD IT.
TLO DL,.5KBIT ;IF ^K, .5KILL THE SYMBOL.
MOVEM DL,1(T5) ;STORE VALUE, FLAGS.
JRST DLOOP
; ^K COMMAND - COMPLEMENT .5KILL BIT FOR FOLLOWING SYMBOL.
CCTLK: PUSHJ P,GPASST
PUSHJ P,DGSYM
JUMPE T2,DNOARG
PUSHJ P,DLKSYM
JUMPE T5,DLOOP ;IF UNDEFINED, NO-OP.
MOVSI T6,400000 ;COMPLEMENT HALF-KILL FLAG.
XORM T6,1(T5)
TLZ SF,NUMFND
TLO SF,D1CHAR
JRST DLOOP
;COME HERE TO LOOK FOR OLD STE, MAKE NEW ONE & STORE NAME IF NOT FOUND.
;NAME TAKEN IN T2, STE ADDR RET. IN T5.
DEFSYM: MOVE T6,SYMEND ;SEARCH SETTABLE SYMBOLS,
TXN MOVNI T5,2-SYMDMP(T6) ;SYMDMP AND UPWARD.
TXY[ MOVEI T5,SYMTAB
SUBI T5,2(T6)
]
CALL DLKSY0
JUMPN T5,CPOPJ ;IF DEFINED, RETURN OLD STE.
;COME HERE IF UNDEFINED.
DEFSY0: HRRZ T5,SYMEND
MOVEI T5,2(T5) ;ADDR OF NEXT STE,
TRNE T5,1777 ;IF OVERFLOW TO NEW PAGE
JRST DEFSY1
PUSHJ P,BLKGET ;ADD A PAGE
(T5)
DEFSY1: HRRZM T5,SYMEND ;IT'S NOW LAST STE.
MOVEM T2,(T5) ;PUT IN NAME.
RETURN
SYMNSP==7 ;# PREDEF SETTABLE SYMS.
;DEFINE SYMBOL DURING LOADING.
DEFSY2: SKIPN CSLFLG ;IF NOT DOING ;L,
JRST DEFSYM ;MAYBE WAS DEFINED BEFORE THIS CMD.
REPEAT SYMNSP,[
CAMN T2,SYMDMP+2*.RPCNT
JSP T5,DEFSY3 ;TEST FOR PREDEFINED SETTABLE SYM.
] JRST DEFSY0 ;NOT PREDEF, MUST BE UNDEF.
DEFSY3: MOVEI T5,SYMDMP-DEFSY2-4(T5)
RETURN ;T5 HAS ADDR OF PREDEF STE.
;READ IN A GENERALIZED OPERAND ADDRESS.
;PUT 6-BIT ADDRESS MODE IN T2.
;RETURN NEW VALUE OF %S OR %D IN T3 .
;IF INDEXED, RELATIVE OR IMMEDIATE, UPDATE DLEN, STORE EXTRA WORD.
DRADDR: PUSHJ P,PASSPS
PUSH P,DRINDP
SETZM DRINDP
CAIE T0,"@ ;INDIRECT MODE?
JRST .+3
AOS DRINDP ;YES, REMEMBER IT AND PASS @ SIGN.
GETCHR
JSP T1,DDECOD ;DECODE 1ST CHAR.
"#,,DRIMM ;IMMEDIATE MODE.
"-,,DRDEC ;AUTODECREMENT OR UNARY -.
"(,,DRPAR ;REGISTER INDIRECT OR AUTOINCREMENT.
DRADD ;REGISTER, RELATIVE OR INDEXED.
DRADD: PUSHJ P,DGV1CH ;GET ADDRESS, 1ST CHAR READ ALREADY.
SKIPN DGVALP ;IF NONE, BAD FORMAT
JRST DERR
DRADD0: MOVE T3,T2
CAIN T0,"( ;INDEXED?
JRST DRNDX ;YES.
TLZE T2,REGBIT ;ADDR. IS A REGISTER?
JRST DRREG ;YES.
SUBI T2,(DO) ;CALCULATE DISPLACEMENT.
SUBI T2,2(DLEN)
PUSHJ P,DGVCOM ;STORE EXTRA WORD.
MOVEI T2,67 ;RELATIVE ADDRESS, MODE 67.
DRXIT: SKIPE DRINDP ;IF READ "@",
IORI T2,10 ;CHANGE MODE TO INDIRECT.
TLO T3,.5KBIT ;%S, %D SHOULD ALWAYS BE .5KILLED.
POP P,DRINDP
RETURN
DRNDX: PUSHJ P,DGVCOM ;STORE EXTRA WORD.
PUSH P,T3 ;SET %D TO DISPL., NOT REG.
PUSHJ P,DRPAR1 ;GET REGISTER NO.
POP P,T3
ADDI T2,60 ;MODE 6N, N=REGISTER NUM.
JRST DRXIT
DRREG: ANDI T2,7 ;REGISTER ADDRESS, MODE 0N, N=REGISTER NO.
JRST DRXIT
;IMMEDIATE MODE - COME HERE IF FIND #.
DRIMM: PUSHJ P,DGVGCH ;GET IMMED. OPERAND.
SKIPN DGVALP ;MUST BE ONE.
JRST DERR
MOVEI T3,(T2)
PUSHJ P,DGVCOM ;STORE EXTRA WORD.
MOVEI T2,27 ;RETURN (PC)+ MODE.
JRST DRXIT
;COME HERE IF READ ( - MUST BE (REG) OR (REG)+.
DRPAR: PUSHJ P,DRPAR1 ;GET REG. NO.
CAIE T0,"+ ;CLOSE-PAR. FOLLOWED BY +?
JRST DRPAR2 ;NO, (R) OR @(R) .
GETCHR ;YES, SKIP PAST +.
ADDI T2,20 ;AUTOINCREMENT IS MODE 2.
JRST DRXIT
;COME HERE IF (R) OR @(R), AFTER READING ALL.
DRPAR2: ADDI T2,10 ;SET UP IN CASE MODE 1.
SKIPN DRINDP
JRST DRXIT ;IF MODE 1.
MOVEI T5,60(T2) ;ELSE MODE 7,
SETZ T2,
PUSHJ P,DGVCOM ;STORE ZERO AS EXTRA WD.
JRST DRXIT ;DGVCOM DID T2_T5.
;AFTER READING A (, READ IN REGISTER NO., CHECK VALIDITY,
;CHECK FOR ), AND SKIP OVER IT.
DRPAR1: PUSHJ P,DGVGCH ;READ THE NO.
CAIN T0,") ;IF NOT FOLLOWED BY ), ERROR.
SKIPN DGVALP ;IF NO NUMBER, ERROR.
JRST DERR
MOVEI T3,(T2)
TLO T3,REGBIT
MOVEI T2,(T2) ;REMOVE REGISTER VS. CORE INDICATOR.
CAILE T2,7 ;IF NOT <= 7,
JRST DERR ;NOT REGISTER NUMBER, ERROR.
GETCHR ;READ PAST ).
RETURN
;COME HERE AFTER READING - SIGN -- MIGHT BE AUTODECREMENT,
;MIGHT BE UNARY MINUS ON ADDRESS.
DRDEC: TLO SF,D1CHAR ;TELL DGVAL 1ST CHAR ALREADY READ.
PUSHJ P,DGVAL ;IT WILL USE THE - AS A UNARY, IF IT CAN.
SKIPE DGVALP ;IF IT CAN'T,
JRST DRADD0 ;TREAT AS IF GOT ADDR RIGHT AWAY.
CAIE T0,"( ;OTHERWISE, SEE IF VALID AUTODECREMENT.
JRST DERR ;IF NO (.
PUSHJ P,DRPAR1 ;GET REGISTER NO.
ADDI T2,40 ;MODE 4.
JRST DRXIT
DRNEXT: 0?0?0?0?0?0
DRINDP: 0 ;IF NONZERO, THIS ADDR WAS PRECEDED BY "@".
;READ IN A STANDARD 1 OR 2 OPERAND INSN.
;COME HERE WITH T5-> STE, WHOSE 2ND WORD HAS OP CODE.
;BIT 17 OF 1(T5) IS ZERO IF 2-OPERAND INSN, 1 IF 1 OPERAND.
DR2AR: PUSHJ P,DRINSP
PUSHJ P,DRADDR ;GET 1ST ADDRESS.
DR2AR0: LSH I1,6 ;PUT IN WITH OP CODE.
DR2AR2: JUMPL I1,DR2AR1 ;IF 1 OPERAND INSN.
MOVEM T3,%S ;SINCE MUST BE 2-OP, SET %S.
ADDI I1,(T2)
CAIN T0,", ;SKIP OVER A COMMA.
GETCHR
PUSHJ P,DRADDR ;GET DESTINATION ADDRESS.
LSH I1,6 ;PUT IN INSN.
DR2AR1: MOVEM T3,%D
ADDI T2,(I1)
POP P,I1
AOS DGVALP
JRST DGNUM3 ;EXTEND SIGN.
;READ IN THE ADDR OF A BRANCH, MAKE THE INSN.
DRDBR: PUSHJ P,DRINSP ;SAVE REGS, ETC.
SETOM DRDBRF ;INDICATE BRANCH INSN. RATHER THAN SOB .
DRDBR1: PUSHJ P,DGVPSP ;PASS SPACES, READ IN NUMBER.
MOVEI T3,(T2) ;PREPARE TO SET %D .
SKIPN DGVALP
ERROR [ASCIZ/WHITHER/] ;IF NO ADDR.
TLNE T2,REGBIT ;CAN'T BRANCH INTO REGISTER.
ERROR [ASCIZ/TO ACCUM./]
TRNE T2,1 ;ERROR IF ODD ADDR.
ERROR [ASCIZ/ODD ADDR/]
SUBI T2,2(DO) ;COMPUTE OFFSET.
LSH T2,-1 ;AS NUMBER OF WORDS.
SKIPN DRDBRF ;ONLY 6 BITS FOR SOB.
JRST DRSOB1
TRCN T2,377600 ;SEE IF IN RANGE.
JRST DRDBR9
TRNE T2,377600
DRSOB2: ERROR [ASCIZ/ADDR. OUT OF RANGE/]
DRDBR9: XORI T2,377600 ;SET TOP BITS TO WHAT THEY WERE.
DRDBR2: ANDI T2,377 ;GET LOW BYTE.
DREMT2: TLO T3,.5KBIT
JRST DR2AR1
DRSOB1: MOVNS T2 ;IN SOB, OFFSET IS SUBTRACTED (ADDED FOR BRANCHES)
TRNE T2,777700
JRST DRSOB2 ;TOO LARGE OR FORWARD.
JRST DREMT2
;HANDLE 2-OP FP11 INSN, MEMORY SOURCE.
DRFPMS: PUSHJ P,DRINSP
PUSHJ P,DRADDR ;GET 1ST ADDRESS.
LSH I1,8. ;PUT IN WITH OP CODE.
MOVEM T3,%S ;THIS IS THE SOURCE OPERAND.
ADDI I1,(T2)
CAIN T0,", ;SKIP OVER A COMMA.
GETCHR
PUSHJ P,DRFPAC ;GE FP11 ACCUMULATOR.
MOVEI T3,(T2)
TLO T3,REGBIT+.5KBIT
LSH T2,6
JRST DR2AR1
;HANDLE 2-OP FP11 INSN, MEMORY DESTINATION.
DRFPMD: PUSHJ P,DRINSP
PUSHJ P,DRFPAC ;GET FP11 ACCUMULATOR.
LSH I1,2 ;MAKE ROOM FOR REG. NUM.
MOVEI T3,(T2) ;PREPARE TO SET %S
TLO T3,REGBIT+.5KBIT ;TO A REG. NUM.
JRST DR2AR2
DRFPAC: PUSHJ P,DGVPSP ;GET ACCUMULATOR NO.
MOVEI T2,(T2)
SKIPE DGVALP ;IF NO NUMBER,
CAILE T2,3 ;OR OUT OF RANGE,
JRST DERR ;(>7), ERROR.
POPJ P,
;HANDLE JSR, RTS.
DRJSR: PUSHJ P,DRINSP
PUSHJ P,DRJSR1 ;READ REG. NUM.
JRST DR2AR2
DRJSR1: PUSHJ P,DGVPSP ;GET REGISTER NO.
MOVEI T2,(T2)
SKIPE DGVALP ;IF NO NUMBER,
CAILE T2,7 ;OR OUT OF RANGE,
JRST DERR ;(>7), ERROR.
LSH I1,3 ;MAKE ROOM FOR REG. NUM.
MOVEI T3,(T2) ;PREPARE TO SET %S OR %D
TLO T3,REGBIT+.5KBIT ;TO A REG. NUM.
RETURN
DRASH: CALL DRINSP
CALL DRADDR ;READ SRC (GOES IN LOW 6 BITS)
MOVEM T3,%S
LSH I1,11 ;MAKE ROOM FOR LOW 6 BITS.
ADDI I1,(T2)
CAIN T0,",
GETCHR ;PASS COMMA.
CALL DRJSR1 ;READ DEST (REGISTER #)
LSH I1,-3 ;UNDO SHIFT DONE BY DRJSR.
LSH T2,6 ;REG # READ GOES BEFORE SRC.
JRST DR2AR1
DRSPEC: PUSHJ P,DRINSP
JRST @.+1(I1) ;OP-CODE SAYS TYPE OF INSN.
DRSOB
DRMARK
DRSPL
DRSOB: PUSHJ P,DRJSR1 ;READ REG. NUM.
MOVEI I1,770(T2) ;SET UP OP-CODE FOR FUNNY BRANCH.
LSH I1,6
CAIN T0,",
GETCHR
SETZM DRDBRF ;INDICATE ONLY 6 BITS FOR OFFSET.
JRST DRDBR1
DRMARK: MOVEI I1,6400
PUSHJ P,DGVPSP
CAIL T2,100
JRST DERR ;WON'T FIT IN 6 BITS.
JRST DREMT1
DRSPL: PUSHJ P,DGVPSP
MOVEI I1,230 ;OP-CODE.
CAILE T2,7
JRST DERR ;IF NOT NUM. OF REG.
TLZ T2,REGBIT
JRST DREMT1
;READ IN THE CODE FOR EMT OR TRAP, MAKE INSN.
DREMT: PUSHJ P,DRINSP
PUSHJ P,DGVPSP ;GET EMT OR TRAP CODE.
DREMT1: TLNN T2,REGBIT ;IF REGISTER NO.,
SKIPN DGVALP ;OR NO NO.,
JRST DERR ;ERROR.
CAILE T2,400 ;MUST FIT IN BYTE.
JRST DERR
JRST DREMT2
;READ IN A CFL OR SFL INSN.
DRSFL: PUSHJ P,DRINSP
PUSHJ P,DGVPSP ;TRY TO GET NUMBER.
SKIPN DGVALP
JRST DRSFL1 ;IF CAN'T, MIGHT BE SPECIAL FMT.
TLNN T2,REGBIT ;IF REGISTER NO.,
CAILE T2,17 ;OR OUT OF RANGE, ERROR.
JRST DERR
JRST DR2AR1 ;COMBINE NO. AND OP-CODE.
DRSFL1: CAIE T0,"@ ;SPECIAL FMT. STARTED BY @.
JRST DERR
SETZ T2, ;INITIALLY, NO FLAGS TO BE SET OR CLEARED.
DRSFL0: GETCHR
SETZ T6,
IRPC X,,ZNVC
CAIN T0,"X
MOVEI T6,X!F
TERMIN
JUMPE T6,DR2AR1 ;IF NOT PART OF INSN, FINISH.
IORI T2,(T6) ;INSN WILL SET SPECIFIED FLAG.
JRST DRSFL0
;INITIALIZATION FOR INSN READIN RTNS.
DRINSP: EXCH I1,(P)
PUSH P,I1
MOVE I1,1(T5)
TLO I1,777776 ;MAKE LH. SAME AS BIT 17.
TLNN I1,1
TLZ I1,-1
RETURN
;CLOSE THE OPEN REGISTER, IF ANY, STORING CHANGES, IF ANY.
DCLOSE: MOVE T5,OPNMDL ;MUST STORE CHANGES
MOVEM T5,OPNMD1 ;IN SAME SPACE LOC. WAS OPENED IN.
DCLOSB: JUMPL DO,CPOPJ ;NOTHING OPEN.
TLZN SF,NUMFND ;CHANGES MADE?
RETURN
HRRM DLEN,%OL ;LENGTH OF OPENED STUFF_LENGTH OF NEW STUFF.
SETZM S%OLFL
PUSHJ P,DCLOS0 ;T3_CORE ADDR. OF LOC., -PDP11 .
SKIPGE PDP11(T3)
JSP D,MTRAPW
TLNE SF,BYTOPN ;IF WAS OPENED AS BYTE,
JRST DCLOS1 ;STORE A BYTE.
DPB DL,[2000+T3,,PDP11] ;OTHERWISE STORE WORD.
MOVN T1,DLEN
LSH T1,17.
HRRI T1,DRNEXT ;AOBJN -> WORDS TO STORE.
DCLOSA: AOBJP T1,DCLOST ;ANY MORE TO BE STORED?
LDB T3,[12100,,DO]
TXN ADDI T3,-DRNEXT(T1) ;YES, GET ADDR TO STORE IT IN,
TXY[ SUBI T3,DRNEXT
ADDI T3,(T1)
]
CALL DCLOS3 ;MAP IT,
MOVE T5,(T1) ;GET THE WD TO BE STORED.
ANDI T5,177777
SKIPGE PDP11(T3)
JSP D,MTRAPW
HRRM T5,PDP11(T3)
JRST DCLOSA
;COME HERE TO STORE CHANGES IN A BYTE.
DCLOS1: TRNN DO,1
DPB DL,[001000+T3,,PDP11] ;IF EVEN BYTE.
TRNE DO,1
DPB DL,[101000+T3,,PDP11] ;IF ODD BYTE.
DCLOST: MOVSI A,6 ;IN CASE WE DEPOSITED IN A DEVICE REGISTER,
CAMLE A,@TRINF+1
RET
MOVE B,TRINF+1 ;PROCEDE THE DEV REG RTN FROM ANY XXWAIT.
MOVE A,1(B)
SETOM 1(B)
MOVEM A,TRINF+1
SAVE SF
SAVE DO
SAVE DL
SAVE DLEN
XCT 2(B)
REST DLEN
REST DL
REST DO
REST SF
JRST DCLOST
;MAPPING MEANS FINDING THE ADDR (RELATIVE TO PDP11) IN MEMORY
;OF THE WORD CORRESPONDING TO A SPEC'D ADDRESS.
;THE MAPPING PROCESS DEPENDS ON THE MODE IN USE -
; $0, $2, $4, $6, $KI, $SI, $A, $UI, $KD, $SD, <MISSING>, $UD
;ARE THE MODES, IN ORDER. THE MODE TO BE USED IS IN OPNMD1.
;MAP UNSHIFTED ADDR IN DO. IT MAY BE AN ACCUMULATOR.
DCLOS0: TLNE DO,REGBIT
JRST DCLREG
LDB T3,[12100,,DO] ;GET ADDR, SHIFT RIGHT 1.
;MAP THE SHIFTED ADDR IN T3, KNOWN NOT TO BE AN ACCUMULATOR.
DCLOS3: 45N ANDI T3,MAXCOR-1
MOVE T6,OPNMD1
XCT DCLOS2(T6) ;MAP THE ADDR IF DESIRED.
RETURN
DCLOS2: JFCL ;MODE 0 - NO CHANGE
ADDI T3,100000 ;MODES 1,2,3 SELECT THAT 1/4 OF CORE.
ADDI T3,200000
ADDI T3,300000
CALL DCLOM ;MODE 4 - KERNEL I-SPACE MAPPING.
CALL DCLOM ;MODE 5 - SUPERV. I-SPACE MAPPING.
CALL [ ANDI T3,77777
45Y[ CAIL T3,70000 ;MODE 6 - MAP AS IF PAGING IS OFF.
ADDI T3,300000]
RET]
CALL DCLOM ;MODE 7 - USER I-SPACE MAPPING.
CALL DCLOM ;MODE 10 - KERNEL D-SPACE.
CALL DCLOM ;MODE 11 - SUPERV. D-SPACE.
.VALUE
CALL DCLOM ;MODE 13 - USER D-SPACE.
DCLOM: ;MAP ADDR IN T3 USING PROCESSOR MODE IN T6.
45Y[ SAVE D
SAVE MA
MOVE MA,T3
ANDI MA,77777
;THE NEXT 3 INSNS ARE A 45IRMA OR A 45DRMA, IN WHICHEVER MODE.
LDB D,[SEGBP,,MA]
XCT @(T6)[ 45IRK1(D)
45IRS1(D)
[.VALUE]
45IRU1(D)
45DRK1(D)
45DRS1(D)
[.VALUE]
45DRU1(D)]-4
XCT @(T6)[ 45IRK2(D)
45IRS2(D)
[.VALUE]
45IRU2(D)
45DRK2(D)
45DRS2(D)
[.VALUE]
45DRU2(D)]-4
ERROR [ASCIZ/SEGLEN/]
MOVE T3,MA
REST MA
REST D
]
RET
;HERE TO MAP THE ADDRESS OF AN ACCUMULATOR.
DCLREG: MOVEI T3,(DO)
45N[ MOVEI T3,R0-PDP11(T3)
RET
]
45Y[
MOVEI T0,(T3)
CAIN T0,7 ;REGISTER 7 IS ALWAYS IN R7
JRST [ MOVEI T3,R7-PDP11
RET]
CAIE T0,6 ;REGISTER 6 DEPENDS ON PROCESSOR MODE.
JRST DCLR0
MOVE T6,45MODE ;SO GET CURRENT PROCESSOR MODE, PERHAPS OVERRIDEN
MOVE T0,OPNMD1 ;BY CURRENT OPEN MODE.
XCT (T0)[ REPEAT 4,JFCL ;UNMAPPED MODES
REPEAT 2,[
MOVEI T6,0 ;KI AND KD MODES
MOVEI T6,1 ;SI AND SD MODES
MOVEI T6,0 ;A MODE AND IMPOSSIBLE MODE
MOVEI T6,3 ;UI AND UD MODES
]]
MOVEI T3,45REG6-PDP11(T6)
RET ;RETURN THE ADDRESS (REL PDP11) OF THAT COPY OF R6.
DCLR0: HRRZ T3,45REGY ;R0 THRU R5. NORMALLY, USE THE SELECTED REGISTER SET,
MOVE T6,OPNMD1 ;BUT IN OPEN MODE $3,
CAIN T6,3
HRRZ T3,45REGN ;USE THE OTHER REGISTER SET
ADD T3,T0
MOVEI T3,-PDP11(T3)
RET
]
;LEFT BRACKET - PRINT AS NUMBER (POSSIBLY SYMBOLIC, ETC.)
CLB: TLZ SF,DEXCM+DINSM ;PRINT AS SYMBOL.
JRST CSLASH
;BACKARROW - REOPEN IN CURRENT MODE.
CBACK: TLZ SF,NUMFND
MOVE DL,DO
;SLASH
CSLASH: CALL DPRINT
JRST DLOOPT
;SUBROUTINE TO PRINT AS INSN.
DPINSN: ADRTYP DL ;PRINT ADDR BEING OPENED,
TTOI "/
TLO SF,DINSM
TLZ SF,DEXCM+DBYTM
;SUBROUTINE, OPEN DL AND PRINT IN CURRENT MODE.
DPRINT: CALL DARG ;OPEN LOC ADDRESSED BY DL. SET UP NEW DL, T3.
SETOM S%OLFL
TLNE SF,DEXCM
RETURN ;DON'T PRINT IF ! MODE.
TTOA [ASCIZ/ /]
TLNN DO,REGBIT ;CONTENTS OF REGISTER NOT AN INSN.
TLNE SF,BYTOPN ;CAN'T CONSIDER A BYTE AN INSN.
JRST DLB1
MOVE I1,OPNMDL
CAIL I1,10 ;OPENING A DATA SPACE =>
JRST DLB1 ;DON'T PRINT AS INSN.
LDB I1,[221100+T3,,PDP11]
CAIE I1,NCPAT ;IF LOC. IS A PATCH DEVICE,
JRST DLB0
ADRTYP DL ;PRINT DEST. OF PATCH.
HRLI DL,.5KBIT
MOVEM DL,%D ;SET %D.
RETURN
DLB0: TLNE SF,DINSM
JRST DRB ;IF I MODE, PRINT AS INSN.
DLB1: SYMTYP DL ;ELSE PRINT CONTENTS AS QTY.
RETURN
DRB: HRRZ T1,PDP11(T3) ;1ST WORD OF INSN.
SETZ T2,
LSHC T1,-14 ;PREPARE TO DECODE.
SKIPL DRB2T(T1) ;IF >0, JRST TO THAT ADDR. (NOT 2-OP. INSN)
JRST @DRB2T(T1)
TTOA DRB2T(T1) ;IF 2-OP, TYPE ITS NAME.
TTOI "
PUSHJ P,DPADDR ;DECODE AND PRINT SOURCE ADDR.
DPDEST: MOVE T6,%D ;WE SHOULD HAVE DEFINED %S FOR SOURCE.
MOVEM T6,%S
TTOI ",
JRST DPADDR ; " " " DEST. ADDR.
DRB2T: DRB00
ASCIZ/MOV/
ASCIZ/CMP/
ASCIZ/BIT/
ASCIZ/BIC/
ASCIZ/BIS/
ASCIZ/ADD/
DRB07
DRB10
ASCIZ/MOVB/
ASCIZ/CMPB/
ASCIZ/BITB/
ASCIZ/BICB/
ASCIZ/BISB/
ASCIZ/SUB/
DRB17
;INSNS STARTING WITH 0000.
DRB00: JUMPL T2,DRB1 ;1-OPER. WORD INSN.
LSHC T1,4
JUMPE T1,DRBS ;NOT A BRANCH.
TTOA DRB00T-1(T1)
DRBBR: TTOI "
DRBBR1: HLRE T6,T2 ;GET OFFSET.
ASH T6,-9 ;AS NO. OF WORDS.
ANDCMI T6,1
ADDI T6,2(DO) ;DESTINATION ADDR OF BRANCH.
ADRTYP T6
HRLI T6,.5KBIT
MOVEM T6,%D
RETURN
DRB00T: ASCIZ/BR/
ASCIZ/BNE/
ASCIZ/BEQ/
ASCIZ/BGE/
ASCIZ/BLT/
ASCIZ/BGT/
ASCIZ/BLE/
; INSTRUCTIONS OF FORM 17XXXX.
DRB17: LSHC T1,4
CAIGE T1,362
JRST DRB170
SKIPL T6,DRB17T-362(T1)
JRST DRB17A
LDB T3,[420200,,T2]
SAVE T3
LSHC T1,2
6TYPE T6
TTOI "
CALL DPADDR
MOVE T5,%D
MOVEM T5,%S
TTOI ",
REST T5
JRST DPAREG
DRB17A: MOVNS T6
6TYPE T6
TTOI "
LDB T5,[420200,,T2]
CALL DPAREG
MOVE T5,%D
MOVEM T5,%S
TTOI ",
LSHC T1,2
JRST DPADDR
DRB17T: SIXBIT/MULF/
SIXBIT/MODF/
SIXBIT/ADDF/
SIXBIT/LDF/
SIXBIT/SUBF/
SIXBIT/CMPF/
-SIXBIT/STF/ ;NEGATED MEANS MEMORY OPERAND LAST
SIXBIT/DIVF/
-SIXBIT/STEXP/
-SIXBIT/STCFI/
-SIXBIT/STCFF/
SIXBIT/LDEXP/
SIXBIT/LDCIF/
SIXBIT/LDCFF/
DRB170: LSHC T1,2
CAIGE T1,1701
JRST DR1700
6TYPE DR170T-1701(T1)
TTOI "
JRST DPADDR
DR170T: SIXBIT/LDFPS/
SIXBIT/STFPS/
SIXBIT/STST/
SIXBIT/CLRF/
SIXBIT/TSTF/
SIXBIT/ABSF/
SIXBIT/NEGF/
DR1700: LSHC T1,6
CAIL T1,170013
JRST DLB1
SKIPN D1700T-170000(T1)
JRST DLB1
6TYPE D1700T-170000(T1)
RETURN
D1700T: SIXBIT/CFCC/
SIXBIT/SETF/
SIXBIT/SETI/
0
0
0
0
0
0
SIXBIT/SETD/
SIXBIT/SETL/
; INSTRUCTIONS OF FORM 10XXXX.
DRB10: JUMPL T2,DRB1B
LSHC T1,4
TTOA DRB10T-200(T1) ;PRINT NAME OF BRANCH.
JRST DRBBR
DRB10T: ASCIZ/BPL/
ASCIZ/BMI/
ASCIZ/BHI/
ASCIZ/BLOS/
ASCIZ/BVC/
ASCIZ/BVS/
ASCIZ/BHIS/
ASCIZ/BLO/
DRB07: SKIPN WI45 ;DON'T PRINT 11-45 INSNS
JRST DLB1 ;UNLESS THEY'RE ATTACHED.
LSHC T1,3
SKIPN DRB07T-70(T1)
JRST DLB1 ;CHECK FOR UNUSED OPCODES.
TTOA DRB07T-70(T1) ;AN INSN, TYPE ITS NAME.
TTOI 40
LDB T5,[410300,,T2] ;REG. NUM. FROM INSN.
LSH T2,3
CAIGE T1,74
JRST DRB07A ;MUL, DIV, ETC.
PUSHJ P,REGTYP ;PRINT REGISTER NUMBER, % NOT NEEDED.
TTOI ",
MOVE T5,%D ;WE SHOULD HAVE DEFINED %S FOR SOURCE.
MOVEM T5,%S
CAIE T1,77
JRST DPADDR ;PRINT DEST ADDR FOR ALL BUT SOB.
LSH T2,-2 ;PRETEND SOB'S 6-BIT OFFSET WAS 8-BITS.
MOVNS T2 ;FOR SOB, OFFSET IS SUBTRACTED.
JRST DRBBR1
DRB07A: SAVE T5 ;REG IS DEST IN THESE INSNS (MUL, ETC)
CALL DPADDR ;PRINT ADDR IN DEST-POSITION (REALLY SRC)
TTOI ",
MOVE T6,%D ;DPADDR ALWAYS SETS %D.
MOVEM T6,%S
REST T5
JRST REGTYP ;NOW TYPE THE REGISTER #.
DRB07T: ASCIZ/MUL/
ASCIZ/DIV/
ASCIZ/ASH/
ASCIZ/ASHC/
ASCIZ/XOR/
0
0
ASCIZ/SOB/ ;77.
DRB1: LSHC T1,6
CAIGE T1,50 ;JSR?
JRST DRBJSR ;YES.
SKIPN WI45 ;DON'T PRINT 11-45 INSNS
CAIGE T1,64 ;UNLESS THEY'RE ENABLED.
CAIL T1,70
JRST DLB1 ;NOT INSN.
SKIPN DRB1T-50(T1) ;NO OPCODE IN TABLE => NOT INSN.
JRST DLB1
TTOA DRB1T-50(T1) ;PRINT OP-CODE.
CAIN T1,64
JRST DRBMRK ;MARK INSN SPECIAL.
DRB1X: TTOI <" >
JRST DPADDR ;DEST. ADDRESS.
DRB1T: ASCIZ/CLR/
ASCIZ/COM/
ASCIZ/INC/
ASCIZ/DEC/
ASCIZ/NEG/
ASCIZ/ADC/
ASCIZ/SBC/
ASCIZ/TST/
ASCIZ/ROR/
ASCIZ/ROL/
ASCIZ/ASR/
ASCIZ/ASL/
ASCIZ/MARK/
ASCIZ/MFPI/
ASCIZ/MTPI/
ASCIZ/SXT/
DRB1B: LSHC T1,6
CAIGE T1,1050 ;TRAP? EMT?
JRST DRBTE ;YES.
CAIL T1,1064
JRST DRB1C ;NOT INSN.
TTOA DRB1T-1050(T1)
TTOI "B
JRST DRB1X
DRB1C: CAILE T1,1067
JRST DLB1
TTOA [ASCIZ/MTPS/ ? ASCIZ/MFPD/ ? ASCIZ/MTPD/ ? ASCIZ/MFPS/]-1064(T1)
JRST DRB1X
;INSNS WITH 1ST 10 BITS =0.
DRBS: LSHC T1,2 ;DECODE NEXT 2 BITS.
JUMPG T1,DRBS1
LSHC T1,6 ;ALL BUT LAST 2 OCTITS =0. DECODE THEM.
SKIPN WI45
CAIE T1,6 ;RTT IS AN 11-45 INSN.
CAILE T1,6
JRST DLB1 ;NOT INSN.
6TYPE DRBST1(T1) ;PRINT OP-CODE
RETURN
DRBST1: SIXBIT /HALT/
SIXBIT /WAIT/
SIXBIT /RTI/
SIXBIT /BPT/
SIXBIT /IOT/
SIXBIT /RESET/
SIXBIT /RTT/
DRBS1: CAIN T1,2
JRST DCORTS ;CONDITION CODE OP OR RTS.
LSH T1,-1 ;WAS 1 OR 3, NOW IS 0 OR 1.
TTOA DRBS1T(T1) ;OP CODE.
JRST DRB1X
DRBS1T: ASCIZ/JMP/
ASCIZ/SWAB/
DCORTS: LSHC T1,6 ;LAST 2 OCTITS.
CAIL T1,240 ;RTS?
JRST DCCOP
CAIL T1,230
JRST DRBSPL
CAIL T1,210
JRST DLB1
TTOA [ASCIZ/RTS /] ;YES.
MOVEI T5,-200(T1) ;REG. NUM.
JRST REGTYP ;PRINT WITHOUT "%".
DRBSPL: SKIPN WI45
JRST DLB1
TTOA [ASCIZ/SPL /]
TTOI 60-230(T1) ;PRIORITY VALUE.
RETURN
DCCOP: TRNE T1,20 ;SET OR CLEAR?
TTOI "S ;SET.
TRNN T1,20
TTOI "C ;CLEAR
TTOA [ASCIZ/FL @/]
IRPC X,,NZVC
TRNE T1,X!F
TTOI "X
TERMIN
RETURN
DRBJSR: TTOA [ASCIZ/JSR /]
MOVEI T5,-40(T1) ;NUMBER OF REGISTER.
PUSHJ P,REGTYP
JRST DPDEST ;PRINT DEST. ADDR.
DRBTE: TRNE T1,4 ;EMT OR TRAP?
TTOA [ASCIZ/TRAP /]
TRZN T1,4
TTOA [ASCIZ/EMT /]
DRBTE1: LSHC T1,6
LDB T5,[1000,,T1] ;GET 8 LOW BITS.
JRST DPADX2 ;GO SYMTYP, SET %D.
DRBMRK: TTOI 40
SETZ T1, ;CODE IS ONLY 6 BITS.
JRST DRBTE1
;DECODE AND PRINT ADDRESS.
DPADDR: SETZ T1,
LSHC T1,2
LDB T5,[400300,,T2] ;GET REGISTER NUMBER.
ROT T2,4 ;SHIFT NEXT ADDR TO TOP.
TRNN T2,10 ;IF THIS ONE'S INDIRECT, PRINT @.
JRST @DPATAB(T1)
JUMPE T1,DPADD1 ;REGISTER INDIRECT MODE IS SPECIAL.
TTOI "@ ;OTHER INDIRECT MODE.
JRST @DPATAB(T1) ;BRANCH ON MODE.
DPATAB: DPAREG
DPADIM
DPADDM
DPADXM
DPADIM: CAIN T5,7 ;IMMEDIATE?
JRST DPADI1 ;YES.
PUSHJ P,DPADD1 ;PRINT "("!!REGNO!!")".
TTOI "+
RETURN
DPADI1: PUSHJ P,DPADT0 ;INCR. FETCHING LOC.
TTOI "#
DPADI2: MOVEI T5,(T1)
JRST DPADX2
DPADDM: CAIN T5,7 ;DECREMENT OF PC??
MOVEI DLEN,-2(DLEN) ;INSN 1 WORD SHORTER.
TTOI "- ;NO, '-(R)'.
DPADD1: TTOI "(
PUSHJ P,REGTYP ;PRINT REG SYM, OR NUM. WITHOUT "%".
TTOI ")
RETURN
DPADXM: PUSHJ P,DPADT0
CAIN T5,7 ;RELATIVE ADDRESSING?
JRST DPADX1 ;YES.
PUSH P,T5
PUSHJ P,DPADI2 ;TYPE DISPLACEMENT.
POP P,T5
JRST DPADD1 ;PRINT '(R)'.
DPADX1: MOVEI T5,(T1)
ADDI T5,(DO)
ADDI T5,(DLEN)
DPADX2: ANDI T5,177777
SYMTYP T5
HRLI T5,.5KBIT
MOVEM T5,%D
RETURN
DPADT0: MOVEI DLEN,2(DLEN) ;SET UP TO GET NEXT WD OF INSN.
HRRM DLEN,%OL
MOVEI T3,-2(DLEN)
ADDI T3,(DO)
LSH T3,-1
CALL DCLOS3
SKIPGE T1,PDP11(T3)
JSP D,MTRAPR
RETURN
;PRINT THE REGISTER NUMBER IN T5, EITHER SYMBOLICALLY OR NUMERICALLY,
;ACCORDING TO CURRENT MODE.
;IF NUMERICALLY, DON'T PRINT "%".
;SAVE REGISTER NUM. AS VALUE OF %D .
REGTYP: SETOM XREGTF ;INDICATE "%" NOT NEEDED.
;COME HERE INSTEAD IF "%" IS NEEDED.
DPAREG: HRLI T5,REGBIT
ADRTYP T5
SETZM XREGTF
TLO T5,.5KBIT
MOVEM T5,%D ;STORE REG. NUM. AS DEST ADDR, .5KILLED.
RETURN
CTAB: PUSHJ P,DCLOSE ;STORE CHANGES.
CTAB1: TLO SF,NUMFND ;CHANGE . .
TTOA [ASCIZ/
/]
MOVE T5,OPNMD1
CAMN T5,OPNMDP
JRST CTAB2 ;IF NOT OPENING IN NORMAL MAPPING MODE,
TTOI @ALTMOD ;SAY WHICH MODE OPENING IN.
TTOA CTABTB(T5)
CTAB2: ADRTYP DL ;PRINT LOCATION OPENED.
TTOI "/
JRST CSLASH
CTABTB: IRPC XX,,0246
ASCIZ/XX /
TERMIN
ASCII /KI /
ASCII /SI /
ASCII /A /
ASCII /UI /
ASCII /KD /
ASCII /SD /
0
ASCII /UD /
CUPAR: PUSHJ P,DCLOSE
MOVE DL,DPNT ;DL _ VAL(.).
HRRI DL,-1(DL)
TLNE SF,BYTOPN ;IF BYTE, OPEN NEXT AS BYTE.
JRST CLF2
TLNN DL,REGBIT ;UNLESS REGISTER NUM,
HRRI DL,-1(DL) ;MOVE BACK 1 WORD.
JRST CTAB1
CCR: PUSHJ P,DCLOSE ;MAKE CHANGES.
MOVE T5,%PMODE ;RESET TEMPORARY MODES.
MOVEM T5,%TMODE ;TO PERMANENT ONES.
MOVE T5,OPNMDP
MOVEM T5,OPNMDT
SETO DO, ;NO LOCATION OPEN.
TTOI "!
JRST DLOOP
CLF: PUSHJ P,DCLOSE
MOVE DL,DPNT ;DL _ VAL(.).
HRRI DL,1(DL)
TLNN DL,REGBIT ;IF NOT REGISTER OR BYTE,
TLNE SF,BYTOPN
JRST CLF2
ADDI DL,@%OL ;MOVE DOWN BY LENGTH OF QTY.
MOVEI DL,-1(DL)
JRST CTAB1
CLF2: TLO SF,DBYTM ;OPEN NEXT LOC. AS BYTE, TOO.
JRST CTAB1
; = - RETYPE AS NUMBER.
CEQ: TLO SF,DNUMM
; ] - TYPE IN CURRENT MODE.
CRB: TLZ SF,NUMFND ;ELIMINATE ARG.
SYMTYP DL
MOVEI DLEN,2 ;NOW A 1-WORD OBJECT, IF NOT BYTE.
SKIPE S%OLFL ;IF RETYPING WHAT WAS OPENED,
HRRM DLEN,%OL ;UPDATE LENGTH OF WHAT'S OPENED.
DLOOPT: TTOA [ASCIZ/ /]
JRST DLOOP
;ACTUAL CHARACTER ALTMODE.
CALT: SKIPE CALTSF ;IF $ AND ; WERE SWITCHED,
JRST CSEM0 ;TREAT $ AS ; .
CALT0: SETZB T2,T3
PUSH P,[DLOOP1]
CALT1: GETCHR ;DECODE NEXT CHAR.
CAIL T0,"A+40
CAILE T0,"Z+40
CAIA
SUBI T0,40
CAMN T0,ALTMOD
AOJA T2,CALT1 ;COUNT ALTMODES.
CAIN T0,"-
JRST CALTM ;INDICATE GOT '-'.
CAIN T0,"I
MOVEI T3,DINSM
CAIN T0,"D
MOVEI T3,DDECM
CAIN T0,"!
MOVEI T3,DEXCM
CAIN T0,"B
MOVEI T3,DBYTM
CAIN T0,"'
MOVEI T3,DBYTM+DASCM
CAIN T0,""
MOVEI T3,DASCM
CAIN T0,"N
MOVEI T3,DNUMM
CAIN T0,"R
MOVEI T3,DREGM
JUMPE T3,CALT3
CALTX: TLZ SF,(T3) ;CLEAR FLAG FOR 1 TIME.
JUMPL T2,.+2 ;IF NO - SIGN,
TLO SF,(T3) ;SET AGAIN.
MOVEI T1,%TMODE ;IF >1 ALTMODE, CHANGE TEMP. MODE SAME WAY.
PUSHJ P,CALTX2
MOVEI T1,%PMODE ;IF >2 ALTMODES, CHANGE PERM. MODE.
CALL CALTX2
POPJ P,
CALTX2: TRNE T2,-1 ;IF ENOUGH ALTMODES, CONTINUE.
JRST CALTX3
POP P,T5 ;SCRATCH RETURN ADDR.
POPJ P,
CALTX3: MOVE T5,(T1) ;GET WORD TO BE CHANGED.
ANDCMI T5,(T3) ;INITIALLY TURN OFF.
JUMPL T2,.+2 ;IF SETTING, TURN BACK ON.
IORI T5,(T3)
MOVEM T5,(T1) ;STORE BACK.
SOJA T2,CPOPJ ;1 ALTMODE HANDLED.
CALTM: TLC T2,-1 ;COMPLEMENT MINUS INDICATOR.
JRST CALT1
CALT3: 45N ERROR [ASCIZ/MODE/]
45Y[ ANDI T2,-1 ;DECODE MAPPING MODES.
JSP T1,DDECOD
CALT3A: "0,,CALT4
"2,,CALT4
"4,,CALT4
"6,,CALT4
"K,,CALT5
"S,,CALT5
"A,,CALT4
"U,,CALT5
[ERROR [ASCIZ/MODE/]]
CALT5: GETCHR ;AFTER "K", "S" AND "U",
CAIL T0,140
SUBI T0,40
CAIN T0,"I ;LOOK FOR "I" OR "D".
JRST CALT4
CAIE T0,"D
ERROR [ASCIZ/MODE/]
ADDI T1,4
CALT4: SUBI T1,CALT3A ;T1 HAS IDX OF CHAR IN THE ABOVE TABLE.
HRRZM T1,OPNMD1 ;SET 1-SHOT, TEMP AND PERM
SOJL T2,CPOPJ
HRRZM T1,OPNMDT ;ACC. TO # OF ALTMODES.
SOJL T2,CPOPJ
HRRZM T1,OPNMDP
RET
]
; COLON - DECODE FOLLOWING SYMBOL AS SPECIAL COMMAND.
CCOL: MOVE T1,[-NUMCOM,,COMTAB]
JSP T3,CCOL1 ;SEARCH COMTAB
JRST (T2) ;CCOL1 PUSHJ'S BACK
COMTAB:
TXN[
IRP CMD,,[LCOMS,ADUMP,ALTSEM,BUSS,CDMP,CORE,DEBUG,DEVTIM,DMP,DMPCOR
DMPSYM,DMPTPV,DT,FLSYMS,LOAD,LOD,LODCOR,LODPTR,LODSYM,LOOKUP,LBRKS
LSYMS,ODMP,PAT,REGS,RESET,S%CSX,TIME,WALLP,XFILE,ZTIME]
SIXBIT/CMD/
C!CMD
TERMIN
]
TXY[
IRP CMD,,[LCOMS,ALTSEM,BUSS,CORE,DEBUG,DEVTIM,FLSYMS,LBRKS
LSYMS,PAT,REGS,RESET,S%CSX,TIME,ZTIME]
SIXBIT/CMD/
C!CMD
TERMIN
]
NUMCOM==<.-COMTAB>/2
ASCIZ/CMD/ ;MESSAGE IF NOT FOUND.
; :LSYMS - LIST DEFINITIONS OF ALL NON-SPECIAL SYMBOLS.
CLSYMS: MOVEI T5,SYMLST
PUSH P,SF
TLO SF,DNUMM ;DON'T WANT "XXXY=XXXY" TO PRINT.
CLSYM0: 6TYPE (T5) ;PRINT SYMBOL NAME.
SKIPGE T6,1(T5)
TTOI "= ;INDICATE IF .5KILLED.
TTOI "=
SYMTYP T6 ;PRINT VALUE.
CRF
CLSYM1: ADDI T5,2
CAMG T5,SYMEND
JRST CLSYM0
POP P,SF
RETURN
; :FLSYMS -- FLUSH USER SYMBOLS.
CFLSYM: SETZM LASTST+2
MOVE T5,[LASTST+2,,LASTST+3]
MOVE T6,SYMEND ;ZERO ALL USER SYMBOLS' STES.
BLT T5,1(T6)
MOVEI T5,LASTST
MOVEM T5,SYMEND
RETURN
; :TIME - PRINTS SIMULATED RUN TIME.
CTIME: MOVE T2,RTIME
CBUSS2: JUMPGE T2,CTIME1
TTOI "-
MOVM T2,T2 ;IF TIME IS <0.
CTIME1: IDIVI T2,10.
MOVEM T2,QA
MOVEM T3,QT
TTOA [ASCIZ/ A. T
/]
RETURN
;SEMICOLON - READ IN NUMBER (NOT EXPRESSION), AND LETTER.
CSEM: SKIPE CALTSF ;IF $ AND ; WERE SWITCHED,
JRST CALT0 ;TREAT ; AS $.
CSEM0: PUSHJ P,GPASST ;SKIP SPACES,
TLO SF,D1CHAR ;RE-READ 1ST NON-SPACE.
PUSHJ P,DGNUM
PUSHJ P,PASSPS
CSEM2: JSP T1,DDECOD
TXN[
IRPC CMD,,ABDFGILNPQRTUWYZX
"CMD,,CS!CMD
TERMIN
]
TXY[
IRPC CMD,,ABDFGILNPRTUWZX
"CMD,,CS!CMD
TERMIN
]
"-,,CSEM1
[ERROR [ASCIZ/COMMAND/]]
CSEM1: HRROS T2 ;INDICATE GOT - .
PUSHJ P,GPASST ;SKIP TO NEXT NONBLANK.
JRST CSEM2 ;DECODE IT AS COMMAND.
TXN[
; QUIT -- EXIT COMMAND
CSQ: movei a,300000
.BREAK 12,a
JRST CCRLF
]
;PROCEED ARG (OR 1) INSNS.
CCN: HLLOS %CSN ;LEAVE ;N MODE.
MOVEI T0,1
TLNE SF,NUMFND ;IF NO ARG, DO 1 INSN.
MOVEI T0,(DL)
SUB T0,DDONXT
MOVEM T0,INSCNT
JRST CSN1 ;SET UP SINGLE-STEP AND PROCEED.
; ;Z -- READS STANDARD RANGE & NUMBER, SETS EACH WORD IN RANGE TO NUMBER.
CSZ: PUSHJ P,DGRAN
SKIPGE PDP11(T0)
JSP D,MTRAPW
HRRM T2,PDP11(T0)
AOBJN T0,.-3
JRST CCRLF
; ;I -- RESET DEVICES, PS, TIME.
CSI: PUSHJ P,XRESET
PUSHJ P,CZTIME
HLLZS RPS
SETOM PC-SAVLNG(P) ;WILL ALWAYS SEEM PC WAS CHANGED.
SETZM LBUSEM ;FORGET OLD BUSS ERRORS.
CCRLF: CRF
JRST CCR
; ;T -- TURN TRAP PRINTING ON OR OFF.
CST: SAVE [DLOOPT]
TLZN SF,NUMFND ;IF ARG,
JRST CST1
MOVEI T1,(DL) ;SET PRINTING FOR THAT TRAP.
LSH T1,-2
CAIL T1,TRPPTL
ERROR [ASCIZ/TRAP THROUGH THERE/]
MOVEM T2,TRPPNT(T1)
JRST CSLTP1
CST1: MOVEM T2,TRPPNT+1 ;NO ARG - SET FOR ALL TRAPS.
MOVE T2,[TRPPNT+1,,TRPPNT+2]
BLT T2,TRPPNT+TRPPTL-1
JRST CSLTP1
; ;U -- SAME AS ;B, BUT IF NO 2ND ARG, REMOVE A BREAKPOINT.
CSU: AOS DGVALP ;PRETEND 0 IN T2 IS 2ND ARG.
; ;B -- SET BREAKPOINT OF TYPE (2ND ARG) AT LOCATION (1ST ARG).
;IF SECOND ARG MISSING, USE 7 (ALWAYS BREAK AND STOP).
;IF 1ST ARG HAS 2 WORDS, IT IS RANGE OF LOCATIONS TO PUT BREAKPOINTS AT.
;IF 1ST ARG MISSING, PUT BREAKPOINTS AT ALL LOCATIONS.
CSB: SKIPN DGVALP ;IF NO 2ND ARG, REPLACE BY 7.
MOVEI T2,7
CSB0: LSH T2,35 ;POSITION FOR STORAGE.
TLZE T2,400000 ;TOP BIT -> 4.1 (AUTOFLUSH)
TLO T2,400
TLOE T2,200000 ;NEXT 2 BITS GO TO 4.3, 4.2 .
TLO T2,2000
TLZE T2,100000
TLO T2,1000
LSH T2,1 ;FINISH POSITIONING.
TLNN SF,NUMFND ;IF NO 1ST ARG,,
JRST CSB1 ;GO MAKE AOBJN PTR->ALL LOCS.
MOVEI T1,(DL)
TLNE DL,REGBIT ;CAN'T PUT BREAKPOINTS IN REGISTERS.
ERROR [ASCIZ/BKPT ON ACCUM./]
LSH T1,-1 ;GET WORD NUM.
CAIN DLEN,2 ;IF 2ND WORD,
JRST CSB5
HRRZ T3,DRNEXT+1 ;SET LH OF AOBJN PTR.
LSH T3,-1
SUBM T1,T3 ;TO NUM. WORDS IN RANGE.
HRLI T1,-1(T3)
TLO T1,700000
TLZ SF,NUMFND ;INDICATE SETTING AT MANY PLACES.
JRST CSB2
CSB5: MOVE T3,T1 ;ONE ARG TO ;B => MAP IT.
CALL DCLOS3
MOVE T1,T3
JRST CSB2
CSB1: MOVN T1,KCOUNT ;GET NUM. LOCATIONS EXISTING.
LSH T1,28.
CSB2: MOVE T3,PDP11(T1)
TLZ T3,177000 ;TURN OFF BREAKPOINT BITS.
IOR T3,T2 ;SET THEM.
TLNN T3,377000 ;IF THIS LOC. NOW NORMAL MEM.,
MOVEI T3,(T3) ;TURN OFF SIGN.
MOVEM T3,PDP11(T1)
CSB4: AOBJN T1,CSB2
TLZ SF,NUMFND
JRST DLOOPT
; ;F - IF NO NUMBER, ASSUME 1.
CSF: SKIPN DGVALP
MOVEI T2,1
JRST CSB0
; ;W, ;R -- LIKE ;F, BUT ASSUME 2, 4.
CSW: SKIPN DGVALP
MOVEI T2,2
JRST CSB0
CSR: SKIPN DGVALP
MOVEI T2,4
JRST CSB0
; :LBRKS - PRINT A SEQUENCE OF ;B COMMANDS THAT WOULD CREATE THE
;BREAKPOINTS THAT NOW EXIST.
CLBRKS: PUSHJ P,DGRAN
MOVSI T2,177000
CLBRK0: JUMPGE T0,CPOPJ
TDNN T2,PDP11(T0)
AOBJN T0,.-1
JUMPGE T0,CPOPJ
MOVEI T3,(T0)
LSH T3,1
HLLZ T1,PDP11(T0)
AND T1,T2
CLBRK1: MOVE T5,PDP11(T0)
AND T5,T2
CAMN T1,T5
AOBJN T0,CLBRK1
MOVEI T5,-1(T0)
LSH T5,1
CAIE T5,(T3)
JRST CLBRK2
ADRTYP T5
JRST CLBRK3
CLBRK2: TTOA [ASCIZ /< /]
ADRTYP T3
TTOA [ASCIZ /, /]
ADRTYP T5
TTOA [ASCIZ / >/]
CLBRK3: TTOA [ASCIZ / $ /]
TLZE T1,1000
IORI T1,1
TLZE T1,2000
TLO T1,200000
TLZE T1,4000
TLO T1,400000
ROT T1,6
TLO SF,DNUMM
SYMTYP T1
TTOA [ASCIZ / B
/]
JRST CLBRK0
IFN 0,[
; ;S COMMAND -- LOAD SYMBOLS FROM PALX11 LISTING.
CSS: TTOI "
MOVEI A,CSSDEV
PUSHJ P,DGFIL
TSOPEN LOADCH,CSSDEV ;OPEN LISTING FILE.
TLO SF,CSSFLG ;INPUT COMES FROM IT.
CSSFF: GETCHR ;NEW PAGE ... SKIP 2 LINES.
CAIE T0,^J
JRST CSSFF
CSSNXT: GETCHR ;GO TO END OF LINE.
CAIE T0,^J
JRST CSSNXT
CSSLI1: GETCHR
CAIN T0,^L
JRST CSSFF
CAIE T0,^I ;ELIM. SPECIAL MESSAGES.
JRST CSSNXT
CSSLIN: GETCHR ;SKIP FORMAT CHARS.
CAIE T0,^I
CAIN T0,"
JRST CSSLIN
CAIE T0,^J
CAIN T0,^M
JRST CSSNXT
CAIL T0,"0 ;DON'T LET SYMBOLS START WITH DIGITS.
CAILE T0,"9
JRST .+2
JRST CSSNXT
PUSHJ P,DGSYM ;READ IN THE SYMBOL.
JUMPE T2,CSSNXT ;IF LINE DOESN'T START WITH SYMBOL, SKIP IT.
MOVEM T2,CSSA ;SAVE NAME.
PUSHJ P,DGNUM ;READ ITS VALUE.
EXCH T2,CSSA
PUSHJ P,DEFSYM ;DEFINE THE SYMBOL,
HRRZ T2,CSSA
JUMPN T2,.+2
MOVSI T2,400000 ;IF VALUE IS 0, HALF-KILL.
CAIE T0,"R ;IF REG. SYM.,
JRST .+3
HRLI T2,400001 ;ADJUST DEF,
GETCHR ;PASS THE "R".
CAIE T0,"H ;HALF-KILL IF SPECIFIED.
JRST .+3
GETCHR
TLO T2,400000
MOVEM T2,1(T5) ;AND STORE THE VALUE.
JRST CSSLI1 ;LOOK FOR ANOTHER SYMBOL ON THIS LINE.
CSSA: 0
CSSDEV: 2,,(SIXBIT/DSK/)
0?SIXBIT/BIN/
] ;END IFN 0.
; ;A -- ATTACH DEV.
CSA: SETOM CSAF
JRST .+2
; ;D -- DETACH DEV.
CSD: SETZM CSAF
MOVE T1,[-NUMDEV,,DEVTAB]
TTOI "
SETOM DGLINF
JSP T3,CCOL1 ;FIND DEVICE
SKIPE CSAF ;CCOL1 PUSHJ'S HERE
HLRZS T2 ;LH FOR ;A RH FOR ;D
JRST (T2)
CCOL1: PUSH P,[CCR]
CCOL2: PUSHJ P,GPASST
PUSHJ P,DGSYM ;GET DEV. NAME.
SETZM DGLINF
TLNN SF,NUMFND
TDZA T5,T5
MOVEI T5,(DL) ;T5_ARG OR 0 IF NONE.
JUMPE T2,CSA2
CSA0: CAME T2,(T1)
AOJA T1,CSA1
MOVE T2,1(T1) ;FOUND - GET DISPATCH WORD
TLO SF,D1CHAR ;RE-READ CHAR FOLLOWING DEV. NAME.
PUSHJ P,(T3) ;CALL OUR CALLER BACK
CSA4: TLZ SF,NUMFND+D1CHAR ;SO CCR WON'T STORE CHANGES.
SETZM DGLCNT
POPJ P,
CSA1: AOBJN T1,CSA0
ERROR (T1) ;PRINT MESSAGE AFTER PARTICULAR TABLE
TXN[
DEVTAB:IRPS X,,[MASTER,CORE,DC,DCR,DCT,DF,DM,DMR,DMT,EAE
I45,LK,LP,NGDIS,NULDIS,PK,PP,PPA,PPI,PR,PRA,PRI,RK,TK,TP]
SIXBIT/X/
A!X,,D!X
TERMIN
SIXBIT/DT/
AET,,DET
]
TXY[
DEVTAB:IRPS X,,[CORE,EAE,I45,LK,TK,TP]
SIXBIT/X/
A!X,,D!X
TERMIN
]
NUMDEV==<.-DEVTAB>/2
ASCIZ/DEVICE/
CSA2: PUSH P,[CSA4]
ADD T1,[1,,2]
CLCOMS: 6TYPE (T1)
CRF
AOBJP T1,CPOPJ
AOJA T1,CLCOMS
CSAF: 0
;SET A DEVICE'S BASIC TIME UNIT. ARG IN VIRT. 10^-7 SEC.
CDEVTI: MOVE T1,[-CRESTL,,CRESTB]
JSP T3,CCOL2 ;WILL PUSHJ TO .+1 .
TLNE SF,NUMFND
MOVEM T5,(T2)
MOVE T2,(T2)
JRST CBUSS2
;RESET A DEVICE.
CRESET: MOVE T1,[-CRESTL,,CRESTB]
JSP T3,CCOL2
HLRZS T2
JRST (T2)
I45TIM: 0 ;DUMMY TO MAKE :DEVTIM I45 DO NOTHING.
CRESTB: 0?0
TXN[ IRPS X,,DCR DCT DF DM I45 LK LP PK PP PR RK RKC RKX TK TP
IF2 IFNDEF Z!X,Z!X==CRESE1
SIXBIT /X/
Z!X,,X!TIM
TERMIN
]
TXY[ IRPS X,,I45 LK TK TP
IF2 IFNDEF Z!X,Z!X==CRESE1
SIXBIT/X/
Z!X,,X!TIM
TERMIN
]
CRESTL==<.-CRESTB>/2
ASCIZ /DEVICE/
CRESE1: ERROR [ASCIZ /NO RESET ROUTINE/]
; ;L COMMAND - LOAD FROM FILE, ZEROING CORE AND SYMBOLS.
TXN[
CSL: SETOM CSLFLG ;INDICATE ;L VERSUS :LOAD.
PUSH P,[CCR]
TTOI "
SKIPA T0,[" ] ;DON'T REREAD THE "L".
CLOD: ; :LOAD AND :LOD COMMANDS.
CLOAD: SETZM CSLFLG
MOVEI T5,CSLTAB ;NORMAL LOAD-TABLE.
CLOAD1: HRRM T5,CLOADT
PUSHJ P,LODFL.
SETOM CSLBFL ;USING BLOCK-MODE.
SETZM CSLBCT ;NO WORDS IN BUFFER YET.
TLZ SF,NUMFND
TSOPEN LOADCH,DSLDEV
MOVE A,[-1,,B] ; READ ONE WORD INTO A
.IOT LOADCH,A ;
.ACCESS LOADCH,[0] ; reset input pointer
CAIE B,1 ; NORMAL LOAD FILE START WITH A 1
JRST NEWBIN ; IF NOT, TRY NEWBIN FORMAT
SKIPN CSLFLG ;IF WAS ;L, ZERO CORE AND SYMBOLS.
JRST CSL0
SETZM LBUSEM ;FORGET OLD BUSS ERRORS.
SETOM PC-SAVLNG(P) ;WILL ALWAYS SEEM PC WAS CHANGED IN DDT.
PUSHJ P,XRESET
PUSHJ P,CZTIME
PUSHJ P,CS%CSX ;RESET %CSX ADDR.
HLLZS RPS
PUSHJ P,CFLSYM
MOVE T5,[.5KBIT,,1]
MOVEM T5,%PATCH ;ELIMINATE PATCH AREA ADDR.
HRRZ T5,KCOUNT
LSH T5,10. ;NUM. WDS. CORE.
MOVE T6,[PDP11,,PDP11+1]
SETZM PDP11
SKIPE KCOUNT
BLT T6,PDP11-1(T5) ;ZERO ALL CORE.
CSL0: PUSH P,%CSX
CSL1: CSLWRD T3 ;READ 1 WD. =BLOCK TYPE.
JUMPL T3,DSLDEE
CAIL T3,CSLMAX ;IF BAD FORMAT,
ERROR [ASCIZ/BINARY FILE/]
PUSHJ P,@CLOADT
JRST CSL1
CSL2: .CLOSE LOADCH,
POP P,T2 ;IF %CSX WAS LOADED, MOVE CSX DEVS
EXCH T2,%CSX
JRST CS%CS0
CSLTAB: OFFSET -.
CPOPJ ;0 DOESN'T START A BLOCK.
LDABS:: DSLABS ;ABSOLUTE LOADER BLOCK.
LDSYMS::DSLASY ;ENTIRE SYMBOL-TABLE.
LDCOR:: DSLCOR ;LOAD BLOCK OF CORE.
LDDSK:: CSKIPC ;USED TO LOAD BLOCK OF DISK (OBSOLETE)
LDSTE:: DSLSYM ;DEFINE SYMBOL.
LDEND:: POPJ1 ;NO MORE BLOCKS.
LDCORZ::DSLZER ;BLOCK OF ZEROS.
LDTRK:: DSLABB ;USED TO MAKE SURE DISK BLOCK EXISTS (OBSOLETE)
LDAK:: CSLAK ;INSURE MINIMUM AMOUNT OF CORE.
LDTPV:: CSLTPV ;LOAD TRAP-ACTION-TABLE.
LDDSKZ::DSLABB ;USED TO ZERO SOME DSK (OBSOLETE)
OFFSET 0
CSLMAX==.-CSLTAB
; :LODPTR - READ FROM PTR IN 8-BIT MODE.
CLODPT: SETZM CSLBFL ;USE UNIT MODE.
MOVEI T5,CSLTAB
HRRM T5,CLOADT
TLZ SF,NUMFND
TSOPEN LOADCH,[[10,,(SIXBIT/PTR/)]]
JRST CSL0
; :LODCOR -- LOAD, BUT IGNORE NON-CORE ITEMS.
CLODCO: SETZM CSLFLG
JSP T5,CLOAD1 ;SPECIAL TABLE TO LOAD CORE ONLY.
CPOPJ?DSLABS?DSLASY?DSLCOR?CSKIPC?DSLABW?POPJ1
DSLZER?DSLABB?CSLAK?CSKIPT?DSLABB
;:LODSYM COMMAND - LOAD SYMBOLS ONLY.
CLODSY: SETZM CSLFLG ;DON'T CLEAR CORE.
JSP T5,CLOAD1
CPOPJ?CLODS1?DSLASY?CSKIPC?CSKIPC?DSLSYM?POPJ1
DSLABB?DSLABB?DSLABB?CSKIPT?DSLABB
CLODS1: CSLWRD T5 ;SKIP AN ABS LDR BLOCK.
CALL DSLABW ;READ BLOCK LENGTH
MOVNI T3,-3(T1) ;PREPARE TO SKIP THE REST.
HRLZI T3,(T3) ;T3 HAS -<# WDS LEFT, INCL CKSUM>,,
CAIE T1,6 ;IF NOT A JUMP BLOCK, SKIP IT.
JRST CLODS2
JRST CLODS3 ;A JUMP-BLOCK: PROCESS IT AND FOLLOWING SYMTAB.
<EFBFBD>
IRPC X,,235
CSLRT!X: SOSGE CSLBCT
CALL CSLRBF
ILDB T!X,CSLBBP
JRST (D)
TERMIN
CSLRBF: SKIPN CSLBFL
JRST CSLRD1
MOVE T5,[-100,,CSLBUF] ;AOBJN PTR->BUFFER.
.IOT LOADCH,T5
CAMN T5,[-100,,CSLBUF] ;ERROR IF EOF.
ERROR [ASCIZ/BINARY FILE/]
HLRZ T5,T5
MOVEI T5,77(T5) ;NUM. WDS. READ.
MOVEM T5,CSLBCT
CSLRD2: MOVE T5,[444400,,CSLBUF]
MOVEM T5,CSLBBP
RETURN
CSLRD1: SETZM CSLBCT
.IOT LOADCH,CSLBUF ;IF USING UNIT MODE.
IOCGET SKIPA
JRST CSLRD2
ERROR [ASCIZ/BINARY FILE/]
CADMPB: 1?0?0?0?0?0
CSLBUF: BLOCK 100
CSLBCT: 0
CSLBBP: 0
CSLBFL: 0 ;NONZERO IF BLOCK MODE.
CLOADT: @(T3) ;R.H. WILL HAVE ADDR. OF CMD TABLE.
CSKIPT: SKIPA T3,[-TRPPTL,,] ;SKIP TPV BLOCK.
CSKIPC: CSLWRD T3 ;SKIP CORE-BLOCK.
CLODS2: CSLWRD T2
AOBJN T3,.-1
RETURN
DSLDEE: CSLWRD T2 ;EACH WD FILLS 2 PDP11 WDS.
HLRM T2,PDP11(T3)
AOBJP T3,.+3
HRRM T2,PDP11(T3)
AOBJN T3,DSLDEE
CSLWRD T3 ;NEXT BLOCK.
JUMPL T3,DSLDEE
JRST CSL2 ;POSITIVE MEANS DONE.
DSLABS: CSLWRD T5 ;FLUSH 1 WD.
PUSHJ P,DSLABW ;READ BLOCK LENGTH.
CLODS3: MOVEI T6,-6(T1) ;GET DATA LENGTH.
PUSHJ P,DSLABW ;READ ORIGIN.
MOVEI T5,(T1)
ADDI T5,3777(T6) ;LAST ADDR TO LOAD INTO +1K.
ROT T1,-1 ;INDEXING POSITION.
JUMPE T6,DSLABJ ;IF JUMP-BLOCK (NO DATA).
LSH T5,-11. ;MIN. K NEEDED.
TLC T1,700000
TLCE T1,700000 ;UNLESS LOADING INTO DEVICE REGS,
PUSHJ P,CSLAK1 ;INSURE THAT MUCH.
DSLAB1: CSLWRD T2 ;NEXT WORD (=NEXT DATA BYTE).
JUMPGE T1,.+3 ;IF STORING INTO LOW BYTE.
DPB T2,[101000+T1,,PDP11] ;STORE INTO HIGH BYTE,
AOJA T1,.+2 ;GO TO NEXT WORD.
DPB T2,[001000+T1,,PDP11] ;STORE INTO LOW BYTE.
TLC T1,400000 ;COMPLEMENT ADDRESS LOW BIT.
SOJG T6,DSLAB1 ;LOOP COUNTER FOR DATA WORDS.
CSLWRD T5 ;READ & THROW AWAY CHECKSUM.
RETURN
DSLABJ: JUMPL T1,.+3 ;IF ADDRESS EVEN,
ROT T1,1 ;PUT IN 11-WORD FMT,
HRRM T1,%GO ;SET STARTING ADDRESS.
CSLWRD T5 ;THROW AWAY CHECKSUM.
CSLWRD T5 ;GET SYM. TAB. TYPE
CAIE T5,2
JRST POPJ1 ;2 IS ONLY TYPE NOW.
AOS (P) ;EXIT AFTER READING SYMBOLS.
DSLASY: CSLWRD T2 ;GET NEXT SYMBOL'S NAME.
JUMPE T2,CPOPJ ;BLOCK TERMINATED BY 0.
CSLWRD T3 ;VALUE, FLAGS.
TLNE T3,10000
JRST DSLASY ;SKIP SYMBOL IF UNDEF.
TLZ T3,353760 ;CONVERT PALX11 TYPE BITS TO 11SIM'S.
TLZE T3,4000
TLOA T3,1 ;MOVE REGISTER FLAG. ELSE,
TRNE T3,-1 ;IF VALUE IS 0, .5KILL .
TLZE T3,20000
TLO T3,400000 ;MOVE .5KILL FLAG.
PUSHJ P,DEFSY2
MOVEM T3,1(T5)
JRST DSLASY
DSLABW: CSLWRD T2 ;READ 2 BYTES,
MOVE T1,T2
DSLABB: CSLWRD T2
LSH T2,10 ;COMBINE INTO WORD.
ADDI T1,(T2)
RETURN
DSLCOR: CSLWRD T3 ;AOBJN PTR->BLOCK.
HRRI T3,1(T3) ;VIRT. ADDR. TO LOAD 1ST WORD.
CSLWRD T5
MOVEM T5,PDP11(T3) ;READ IN NEXT WD.
AOBJN T3,.-2
RETURN
DSLZER: CSLWRD T3 ;AOBJN PTR ->BLOCK TO BE ZEROED.
HRRI T3,1(T3) ;VIRT. ADDR. OF 1ST WD. TO ZERO.
SETZM PDP11(T3)
AOBJN T3,.-1
RETURN
DSLSYM: CSLWRD T2 ;READ SYMBOL NAME.
PUSHJ P,DEFSY2 ;DEFINE IT, GET STE.
MOVEI T3,(T5)
CSLWRD T2
MOVEM T2,1(T3) ;READ SYMBOL TYPE, VALUE INTO STE.
RETURN
CSLAK: CSLWRD T5 ;CORE MINIMUM.
CSLAK1: SUB T5,KCOUNT
JUMPLE T5,CPOPJ ;IF ALREADY ENOUGH.
JRST ACORE
CSLTPV: MOVSI T3,-TRPPTL
CSLWRD T5
MOVEM T5,TRPPNT(T3)
AOBJN T3,.-2
]
; ;L <FILENAME> COMMAND FOR TOPS20/TENEX
TXY[
CSL: TTOI <" > ; SPACE BEFORE FILE NAME
MOVSI A,(GJ%OLD\GJ%FNS\GJ%SHT)
MOVE B,[.PRIIN,,.PRIOU]
GTJFN ; GET FILE NAME FROM TERMINAL
ERROR [ASCIZ /NO SUCH FILE/]
MOVEM A,LODJFN ; SAVE FILE DESCRIPTOR
MOVE B,[8._30.\OF%RD\1] ; 1?
OPENF
ERROR [ASCIZ /CAN'T OPEN FILE/]
]
TXN[
NEWBIN:
;; SUBSTITUTE FOR TWNX BIN JSYS..
move a,[041000,,ldword-1]
movem a,ldptr
define bin
pushj p,itsbin
termin
]
SETZM LBUSEM ; FORGET OLD BUS ERRORS
PUSHJ P,XRESET
PUSHJ P,CZTIME
PUSHJ P,CS%CSX
HLLZS RPS
PUSHJ P,CFLSYM
MOVE T5,[.5KBIT,,1] ; ELIMINATE PATCH AREA
MOVEM T5,%PATCH
HRRZ T5,KCOUNT
LSH T5,10. ; ZERO MEMORY
MOVE T6,[PDP11,,PDP11+1]
SETZM PDP11
SKIPE KCOUNT
MOVE T6,[PDP11,,PDP11+1]
SETZM PDP11
SKIPE KCOUNT
BLT T6,PDP11-1(T5)
CSNL1: MOVE A,LODJFN ; READ THE LEADER
BIN
JUMPE B,CSNL1
CAIE B,1 ; MUST FOLLOW WITH A 1
CSLERR: ERROR [ASCIZ /ILLEGAL LDA FILE/]
BIN ; THEN A 0
JUMPN B,CSLERR
PUSHJ P,CSWRD ; GET BYTE COUNT
MOVEI T6,-6(B) ; STORE IT IN T6
PUSHJ P,CSWRD ; GET ADDRESS
MOVE T5,B ; CALCULATE HOW MUCH MEMORY NEEDED
ADDI T5,3777(T6)
LSH T5,-11.
MOVE T1,B ; GENERATE POINTER TO WORD
ROT T1,-1 ; TURN INTO WORD POINTER
JUMPE T6,CSLEND ; JUMP BLOCK?
TLC T1,700000 ; EXTEND DEVICE ADDRESSES TO 18 BITS
TLCE T1,700000
SUB T5,KCOUNT
SKIPLE T5
PUSHJ P,ACORE
CSNL2: MOVE A,LODJFN ; GET A BYTE TO STORE
BIN
JUMPGE T1,.+3
DPB B,[101000+T1,,PDP11]
AOJA T1,.+2
DPB B,[001000+T1,,PDP11]
TLC T1,400000
SOJG T6,CSNL2
MOVE A,LODJFN ; SKIP THE CHECKSUM
BIN
JRST CSNL1 ; END OF BLOCK
CSLEND: JUMPL T1,.+3
ROT T1,1
HRRM T1,%GO
MOVE A,LODJFN
BIN ; IGNORE THE CHECKSUM
;;; READ SYMBOL TABLE.
BIN
CAIE B,2 ; SYMBOLS?
JRST CSSEND ; NO, DONE
CSSL1: CALL CSWRD
JUMPE B,CSSEND ; 0 MARKS END OF SYMBOLS
CALL CSUNPK
MOVE T1,B
CALL CSWRD
CALL CSUNPK
HRLZ T2,T1 ;DEFSY2 ARG: T2 = SIXBIT SYMBOL NAME
HRR T2,B ; ...
PUSH P,T2
CALL CSWRD ;GET PALX FLAGS
HRLZ T3,B
CALL CSWRD ;GET VALUE
HRR T3,B
POP P,T2
TLNE T3,10000
JRST CSSL1 ;SKIP SYMBOL IF UNDEF.
TLZ T3,353760 ;CONVERT PALX11 TYPE BITS TO 11SIM'S.
TLZE T3,4000
TLOA T3,1 ;MOVE REGISTER FLAG. ELSE,
TRNE T3,-1 ;IF VALUE IS 0, .5KILL .
TLZE T3,20000
TLO T3,400000 ;MOVE .5KILL FLAG.
PUSHJ P,DEFSY2 ;DEFINE IT, GET STE.
MOVEM T3,1(T5)
JRST CSSL1
CSSEND: MOVE A,LODJFN
TXY[ CLOSF
TDN ]
TXN[ .CLOSE LOADCH,]
JRST CCR
CSWRD: MOVE A,LODJFN ; READ LOW ORDER BYTE
BIN
MOVE T2,B
BIN
LSH B,8.
IOR B,T2
RETURN
CSUNPK: IDIVI B,50*50
IDIVI C,50
MOVE B,R50SIX(B)
LSH B,6
IOR B,R50SIX(C)
LSH B,6
IOR B,R50SIX(D)
RETURN
R50SIX: '
REPEAT 26., .RPCNT+'A
'$
'.
'%
REPEAT 10., .RPCNT+'0
LODJFN: -1
TXN[
itsbin: push p,d ; save d
move a,ldptr ; get byte pointer
move d,[-1,,ldword]
tlnn a,700000 ; byte pointer at end of word?
.iot loadch,d ; no, read a word
tlnn a,700000 ; byte pointer at end of word?
hrri a,ldword-1 ; reset word part
ildb b,a ; load a byte into B
movem a,ldptr
pop p,d
popj p, ; return
]
;UPDATE ALL OBRAN1 MACROS WHEN TRPPNT MIGHT HAVE CHANGED.
;OBRAN1 IS USED TO EXIT FROM A BRANCH INSN, TO EXECUTE
;THE ACTIONS NECESSARY FOR TRPPNT VALUES 0 AND 1 AS FAST AS POSSIBLE.
CSLTP1: MOVE T3,TRPPNT
MOVE T3,[JRST INEND ;IF TRPPNT 0, NO DEBUGGING ACTION.
MOVE B,OPC ;1, MOVE OPC INTO JPC.
JRST BRPNT ;2, GO TO PRINT RTN.
JRST BRPNT](T3);3, DITTO.
MOVEI T5,CSLTP3 ;GET ADDR OF OBRAN1 LIST HEADERR.
CSLTP2: SKIPN T5,(T5) ;T5 -> NEXT OBRAN1'S LAST WD.
RET ;ALL HANDLED.
MOVEM T3,-3(T5) ;CLOBBER 1ST WD OF THE OBRAN1.
JRST CSLTP2
TXN[
; :XFILE COMMAND -- EXECUTE COMMAND FILE.
CXFILE: MOVEI A,CXFILN
TLO SF,D1CHAR ;IN CASE CMD WAS FOLLOWED BY CR.
PUSHJ P,DGFIL
TSOPEN UTIC,CXFILN
SETOM FILINF
RETURN
CXFILN: SIXBIT/ DSK XCT/
]
; :CORE COMMAND -- SET TOTAL AMOUNT OF CORE TO ARG.
CCORE: TLNN SF,NUMFND
SKIPA T5,KCOUNT ;IF NO ARG, JUST PRINT NUM. K.
MOVEI T5,(DL)
CCORE1: SUB T5,KCOUNT ;AMOUNT OF K TO GO OR COME.
JUMPGE T5,ACORE ;IF >0, ATTACH. IF=0, JUST PRINT NUM. K.
MOVM T5,T5
JRST DCORE ;ELSE GO DETACH.
; ^L ROUTINE.
CFORMF: SKIPE GETTY
TTOA [ASCIZ/C/] ;CLEAR SCREEN.
JRST DLOOP1
TXN[
; :LOOKUP -- FIND ADDR OF STE OF FOLLOWING SYMBOL.
CLOOKU: PUSHJ P,GPASST
PUSHJ P,DGSYM
JUMPE T2,DERR
PUSHJ P,DLKSYM ;SEARCH FOR STE.
MOVEI DL,(T5)
.VALUE [ASCIZ \T5/ '
\]
RETURN
]
; :ZTIME -- SET CUMULATIVE RUN TIME TO 0.
CZTIME: MOVN B,RTIME ;-THE TIME.
MOVEI A,CLINF ;WILL SHIFT ALL REMEMBERED TIMES SAME AMOUNT.
CZTIM0: MOVE A,1(A) ;ADDR OF NEXT BLOCK.
CAIN A,CLINF
JRST CZTIM1 ;ALL DONE WHEN GET BACK TO CLINF.
ADDM B,(A) ;ELSE ADJUST THE TIME,
JRST CZTIM0 ;DO NEXT BLOCK.
CZTIM1: ADDM B,ORGTIM ;ADJUST PK'S BASE TIME.
ADDM B,LBUSET ;ADJUST REMEMBERED TIMES OF BUSS ERRORS.
ADDM B,LBUSET-4
ADDM B,LBUSET-8
SETZM RTIME ;FINALLY ZERO TIME.
HLLZS RATE
TXN .SUSET [.RRUNT,,RUNTB]
TXY[ MOVEI A,400000
RUNTM
IMULI A,250.
MOVEM A,RUNTB
]
RETURN
TXN[
DCKSUM: 0
CADUMP: PUSHJ P,DMPFL. ;GET THE DUMP FILE NAME
TSOPEN DMPCH,DSLDEV
PUSHJ P,DGRAN ;GET ARG TO COMMAND
MOVN A,T1 ;LAST ADDRESS TO DUMP
ANDI T0,77777
MOVE T1,T0 ;FIRST ADDRESS TO DUMP
ADD A,T0
LSH T1,1 ;T0 IS A POINTER INTO CORE, T1 IS THE ASSOCIATED PDP11 ADDRESS
LSH A,1 ;MAKE INTO PDP11 ADDRESS
MOVEI T2,177777 ;16 BITS
CADMP1: SETZM DCKSUM
MOVNI T3,2 ;RELATIVE ADDRESS OF START ADDRESS IN BUFFER
TDNE T2,PDP11(T0) ;SEARCH FOR A NON-ZERO WORD
JRST CADMP2 ;FOUND ONE
ADDI T1,2 ;NEXT PDP11 ADDRESS
CAMGE T1,A ;ARE WE OVER THE TOP OF WHAT WE SHOULD DUMP?
AOJA T0,CADMP1 ;NO, INCREMENT PDP10 ADDRESS AND CONTINUE LOOKING
JRST CADMP3 ;CORE IS ALL ZERO, GO DUMP SYMBOLS
CADMP2: MOVE T6,T1 ;OUTPUT START ADDRESS
PUSHJ P,CADOUT
CADMP4: MOVE T6,PDP11(T0) ;GET A WORD TO DUMP
PUSHJ P,CADOUT ;DUMP THE WORD
ADDI T1,2 ;NEXT PDP11 ADDRESS
CAIGE T3,70 ;IS THE BUFFER FULL?
CAML T1,A ;OR ARE WE AT THE TOP OF THE SPACE TO BE DUMPED?
JRST CADMP5 ;YES, DUMP THE BLOCK
MOVEI T6,10(T1)
CAML T6,A ;ARE WE NEAR THE TOP OF THE SPACE TO BE DUMPED?
AOJA T0,CADMP4 ;YES, INC PDP10 ADDRESS AND DUMP RIGHT UP TO THE TOP
TDNE T2,PDP11+1(T0) ;IF THERE ARE NOT 3 CONSECUTIVE ZEROS
AOJA T0,CADMP4 ;INC THE PDP10 ADDRESS AND KEEP DUMPING
TDNE T2,PDP11+2(T0)
AOJA T0,CADMP4
TDNE T2,PDP11+3(T0)
AOJA T0,CADMP4
CADMP5: MOVEI T6,6(T3) ;DUMP THE CURRENT BLOCK
MOVNI T3,4 ;PLACE TO PUT THE BYTE COUNT
PUSHJ P,CADOUT ;OUTPUT THE COUNT
MOVN T3,DCKSUM ;GET CHECKSUM
SUBI T3,1 ;THE 1 AT THE BEGINING OF THE BLOCK WAS NOT ADDED BEFORE
ANDI T3,377 ;MASK TO 8 BITS
MOVEM T3,CADMPB(T6) ;STORE CHECKSUM
MOVNI T6,1(T6) ;NEGATIVE COUNT OF BYTES (1 ADDED TO COUNT CHECKSUM)
HRLZS T6 ;MAKE AOBJN POINTER
HRRI T6,CADMPB
.IOT DMPCH,T6 ;OUTPUT BLOCK TO DISK
AOJA T0,CADMP1 ;INC PDP10 ADDRESS AND SEARCH FOR NON-ZERO CORE
CADMP3: MOVEI T0,6 ;GET READY TO OUTPUT START (JUMP) BLOCK
MOVEM T0,DCKSUM ;INIT CHECKSUM
MOVEM T0,CADMPB+2 ;SET BYTE COUNT
MOVNI T3,2 ;PLACE FOR ADDRESS
MOVE T6,%GO ;STARTING ADDRESS
PUSHJ P,CADOUT ;OUTPUT TO BUFFER
MOVN T0,DCKSUM ;GET CHECKSUM
SUBI T0,1 ;CORRECT IT
ANDI T0,377 ;MASK TO 8 BITS
MOVEM T0,CSLBUF ;THIS IS WHERE IT BLONGS
MOVE T0,[-7,,CADMPB] ;JUMP BLOCK IS ALWAYS THIS LONG
.IOT DMPCH,T0
HRROI T0,[LDSYMS] ;START OF SYMBOLS
.IOT DMPCH,T0
;THE FOLLOWING CHANGES 11SIM TYPE FLAGS TO PALX11 TYPE FLAGS
MOVEI T0,SYMDMP+1
MOVSI T1,1
MOVSI T2,4000
MOVSI T3,20000
MOVSI T5,24000
CADMP6: TDZ T5,(T0)
TDNE T1,(T0)
TDO T2,(T0)
SKIPGE (T0)
TDO T3,(T0)
ADDI T0,2
CAMG T0,SYMEND
JRST CADMP6
MOVEI T0,SYMDMP ;NOW MAKE UP AN AOBJN POINTER
SUB T0,SYMEND ;WHICH WE CAN USE
HRLZS T0 ;TO OUTPUT THE SYMBOL TABLE
HRRI T0,SYMDMP
.IOT DMPCH,T0 ;ALL AT ONCE
MOVE T0,[-1,,[0]]
.IOT DMPCH,T0 ;OUTPUT A ZERO FOR THE END TEST
.CLOSE DMPCH,
RETURN
CADOUT: PUSH P,T6 ;BREAK A PDP11 WORD INTO BYTES AND OUTPUT IT TO THE BUFFER
ANDI T6,377
MOVEM T6,CSLBUF(T3)
ADDM T6,DCKSUM
AOS T3
MOVE T6,(P)
LSH T6,-10
ANDI T6,377
MOVEM T6,CSLBUF(T3)
ADDM T6,DCKSUM
AOS T3
POP P,T6
RETURN
DEFINE DMPOW A
HRROI T6,A
.IOT DMPCH,T6
TERMIN
;OPEN A TEMPORARY DUMP FILE FOR CURRENT COMMAND ONLY.
CODMP1: SKIPE DDUMPF
POPJ P, ;IF PERMANENT DUMP FILE, USE IT.
JRST CODMP2 ;ELSE, OPEN A FILE.
; :ODMP -- OPEN A FILE FOR SEVERAL DUMP COMMANDS.
CODMP: SKIPE DDUMPF
ERROR [ASCIZ/WITHOUT CLOSING THE OTHER ONE/]
PUSHJ P,CODMP2 ;OPEN PERM. FILE.
SETOM DDUMPF ;IF SUCCEED, INDICATE ONE IS OPEN.
RETURN
CODMP2: PUSHJ P,DMPFL.
TSOPEN DMPCH,DSLDEV
RETURN
; ;Y -- ALMOST SAME AS :DMP
CSY: PUSH P,[CCR]
SKIPE DDUMPF
CRF ;IF PERM FILE, NEED NO ARG.
SKIPN DDUMPF
TTOI "
MOVEI T0," ;DON'T REREAD "Y".
; :DMP -- DUMP RANGE OF CORE, AND SYMBOLS.
CDMP: PUSHJ P,CODMP1 ;OPEN TEMP. FILE IF NECESSARY.
PUSHJ P,CSD0 ;DUMP RANGE OF CORE.
PUSHJ P,DMPTPV ;DUMP TRAP ACTION CODES.
CDMP2: PUSHJ P,DMPSYM ;DUMP SYMBOLS.
JRST CDUMPX ;CLOSE FILE IF TEMPORARY.
; :DMPCOR -- DUMP SPECIFIED RANGE OF CORE, ONLY.
CDMPCO: PUSHJ P,CODMP1
PUSHJ P,CSD0
CDUMPX: SKIPE DDUMPF ;IF DUMP FILE TEMPORARY, CLOSE IT.
RETURN
DMPOW [[LDEND]] ;OUTPUT AN END BLOCK,
.CLOSE DMPCH,
RETURN
; :DMPSYM -- DUMP SYMBOLS ONLY.
CDMPSY: PUSHJ P,CODMP1
JRST CDMP2
;READ A FILENAME INTO DSLDEV FOR LOADING, DUMPING RESP.
LODFL.: SKIPA A,[6,,]
DMPFL.: MOVSI A,7
HLLM A,DSLDEV
MOVEI A,DSLDEV
TLO SF,D1CHAR
JRST DGFIL
; :DMPTPV - DUMP TRAP-ACTION-CODES.
CDMPTP: PUSHJ P,CODMP1
PUSHJ P,DMPTPV
JRST CDUMPX
DMPTPV: DMPOW [[LDTPV]]
MOVE T6,[-TRPPTL,,TRPPNT]
.IOT DMPCH,T6
RETURN
; :CDMP -- CLOSE PERMANENT DUMP FILE.
CCDMP: SETZM DDUMPF
JRST CDUMPX
DMPSYM: DMPOW [[LDSYMS]]
MOVN T6,SYMEND
HRLZI T6,SYMDMP-2(T6)
HRRI T6,SYMDMP
.IOT DMPCH,T6
DMPOW [[0]]
RETURN
DSLDEV: SIXBIT/ DSK BIN/
;INTERPRET ARG AS RANGE OF CORE TO DUMP.
CSD0: PUSHJ P,DGRAN
MOVE T5,T0
;DUMP OUT ALL CORE, AS BLOCK TYPES COR AND ZER.
DSD1: DMPOW [[LDAK]] ;BLOCK TO INSURE ENOUGH CORE
HLRO T2,T5
MOVN T2,T2 ;NUM. WDS. BEING DUMPED.
ADDI T2,1777(T5)
LSH T2,-10. ;NUM. OF THE K CONTAINING LAST WD DUMPED.
DMPOW T2
SKIPE PDP11(T5) ;WHICH TYPE BLOCK FIRST?
JRST CSDCOR ;IF NONZERO, COR BLOCK FIRST.
CSDZER: MOVEI T2,-1(T5) ;WD BEFORE 1ST IN BLOCK.
CSDZE0: SKIPN PDP11(T5)
AOBJN T5,CSDZE0 ;MOVE TILL NONZERO WD OR END OF RANGE.
MOVEI T1,1(T2)
SUBI T1,(T5)
HRLI T2,(T1) ;IOWD LENGTH, ADDR .
MOVEI T1,LDCORZ
MOVE T6,[-2,,T1]
.IOT DMPCH,T6
JUMPGE T5,CPOPJ ;IF EXHAUSTED RANGE TO DUMP.
CSDCOR: MOVEI T2,-1(T5) ;WD BEFORE 1ST IN BLOCK.
CSDCO1: SKIPN PDP11(T5)
SKIPE PDP11+1(T5)
AOBJN T5,CSDCO1 ;ADVANCE TILL END, OR 2 ZEROS.
MOVEI T1,1(T2)
SUBI T1,(T5)
HRLI T2,(T1) ;IOWD LENGTH, ADDR .
MOVEI T1,LDCOR
MOVE T6,[-2,,T1]
.IOT DMPCH,T6
HRRI T2,1+PDP11(T2) ;AOBJN PTR FROM IOWD.
.IOT DMPCH,T2
JUMPL T5,CSDZER ;IF NOT AT END.
RETURN
]
; ;X - EXECUTE THE FOLLOWING INSN.
CSX: TTOI "
SETOM CSXR1
MOVE T5,R1
ANDI DL,177777
TLNE SF,NUMFND ;IF HAD ARG,
HRRZM T5,CSXR1 ;SAVE R1,
TLZE SF,NUMFND
HRRM DL,R1 ;PUT ARG II IT.
HRRZ DO,%CSX ;ADDR. TO STORE INSN IN.
ANDCMI DO,1
SETOM DGVLVL
TLZ SF,DBYTM
PUSHJ P,DGVAL ;READ THE INSN.
TLO SF,NUMFND
MOVE T5,OPNMDP ;STORE INSN IN I-SPACEE OF CURRENT
MOVEM T5,OPNMD1 ;PROCESSOR MODE.
MOVEI DL,(T2)
SKIPE DGVALP ;IF GOT ONE, STORE IT.
PUSHJ P,DCLOSB
HRRO T5,R7
MOVEM T5,CSXPC ;SAVE PC WHILE SIMULATING INSN.
MOVE T5,PC-SAVLNG(P) ;GET SAVED OLD PC.
MOVEM T5,CSXSPC ;REMEMBER IT.
ANDI DO,177777
HRRM DO,R7
MOVE T5,DDONXT
MOVEM T5,CSXDNX
MOVE T5,%IL
MOVEM T5,CSXIL ;SAVE LENGTH OF NEXT INSN.
MOVE T5,%CSN
MOVEM T5,CSXCSN ;SAVE ;N MODE, LEAVE IT.
HLLOS %CSN
MOVE T5,-17(P) ;SAVE DDT'S CURRENT RETADDR.
MOVEM T5,CSXRET
JRST CSP
CSXPC: 0
CSXR1: 0
CSXDNX: 0
CSXRET: 0
CSXSPC: 0
CSXIL: 0
CSXCSN: 0
CSXHAK: SKIPL DDTPDP
TLNN B,10000 ;ATTEMPTED TO FETCH INSN AFTER
RETURN ; ;X'ED INSN:
SKIPN CSXPC ;RETURN TO DDT.
RETURN
REST B
HRRZ PC,CSXPC
HRRM PC,R7
HRRM PC,%PC
MOVE PC,CSXSPC ;RESTORE SAVED ENTRY PC.
SAVE CSXRET ; RETURN ADDR,
SAVE [DDTXIT]
SETZM CSXPC
CALL SAVALL
SETZM RUN
MOVEM P,DDTPDP ;ENTER DDT WITHOUT PRINTING INSN.
MOVEM TIME,RTIME
HRRM PS,RPS
MOVE T5,CSXDNX
MOVEM T5,DDONXT
MOVE T5,CSXCSN
MOVEM T5,%CSN
MOVE T5,CSXIL
MOVEM T5,%IL
SKIPL T5,CSXR1 ;RESTORE R1 IF WAS SAVED.
HRRM T5,R1
PUSHJ P,MERRV ;TURN ON TTY.
45Y[ MOVE T5,45REGY ;STORE AWAY CURRENT REGISTER SET, SO BOTH SETS'
MOVE T6,T5 ;VALUES LIVE IN THEIR BACKUP HOMES.
BLT T5,5(T6)
LDB T5,[45CMOD,,PS] ;GET CURRENT PROCESSOR MODE.
MOVE T6,R6
HRRM T6,45REG6(T5) ;STORE SELECTED R6 IN ITS BACKUP HOME.
]
HRLZ SF,%TMODE
TTOI "!
JRST DDT2
; :S%CSX - SET %CSX AND STORE CSX DEVICES.
CS%CSX: MOVEI T2,45Y[600000+]177720 ;NORMAL VAL. OF %CSX IS DEFAULT.
TLNE SF,NUMFND
MOVE T2,DL
CS%CS0: TLNE T2,REGBIT
ERROR [ASCIZ/TO ACCUM./]
TRNE T2,1
ERROR [ASCIZ/ODD ADDRESS/]
HRRZ T5,%CSX ;OLD ADDR.
LSH T5,-1
HRLI T5,-3 ;REMOVE THE 3 OLD CSX DEVICES:
CS%CS2: MOVE T6,PDP11+1(T5)
TLZ T6,777 ;REMOVE THE DEVICE CODE.
TLNN T6,177000 ;UNLESS BKPT THERE,
TLZ T6,400000 ;TURN OFF SPECIAL BIT.
MOVEM T6,PDP11+1(T5)
AOBJN T5,CS%CS2
HRRM T2,%CSX ;STORE NEW ADDR.
ROT T2,-1
ANDI T2,77777
HRLI T2,-3
CS%CS1: MOVE T5,PDP11+1(T2) ;STORE CSX DEVS THERE+1 THRU THERE+3 .
TLZ T5,777
TLO T5,600000+NCSX
MOVEM T5,PDP11+1(T2)
AOBJN T2,CS%CS1
RET
; ^\ COMMAND - ALMOST AS IN HACTRN.
CCBSL: MOVE DL,%PATCH ;PATCH WILL -> PATCH AREA.
PUSHJ P,CPAT0 ;STORE THE PATCH.
JRST CTAB ;OPEN LOC. ADDRESSED BY PATCH.
; ^] COMMAND
CCRB: JUMPL DO,CPATNO ;IF NO LOC. OPEN.
TLNN SF,NUMFND ;IF HAVE ARG,
JRST CCRB1
CALL DCLOSE ;STORE IT,
ADDI DO,(DLEN) ;PATCH AFTER IT.
CCRB1: HRRZ DL,%PATR ;PATCH BACK INTO SEQUENCE.
SETOM CPATTY
CALL CPAT3 ;STORE THE PATCH.
ADDI DO,2
HRRM DO,%PATCH ;UPDATE PATCH AREA ADDR.
HRRM DL,DPNT ;SET . TO PLACE PATCH WAS FROM (%PATR).
JRST CCRLF
; :PAT - PUT IN THE OPEN LOC., A PATCH DEVICE -> ARG.
CPAT: CALL DGVPSP ;READ ADDR. OF PATCH.
MOVE DL,T2
SKIPE DGVALP ;REQUIRES AN ARG.
CAIE DLEN,2 ;MUST HAVE ARG OF LENGTH 2.
ERROR [ASCIZ/WHITHER/]
CPAT0: JUMPL DO,CPATNO ;IF NO LOC. OPEN.
SETZM CPATTY
CPAT3: TLNE SF,BYTOPN
ERROR [ASCIZ/PATCH BYTE/]
TLNE DO,REGBIT
ERROR [ASCIZ/PATCH ACCUM./]
TLNE DL,REGBIT
ERROR [ASCIZ/TO ACCUM./]
TRNE DL,1
ERROR [ASCIZ/TO ODD ADDRESS/]
TLZ SF,NUMFND ;ENSURE ADDR. IS STORED.
MOVE T5,OPNMDL
MOVEM T5,OPNMD1
PUSHJ P,DCLOS0 ;SET UP ADDR IN T3.
SKIPGE PDP11(T3)
JSP D,MTRAPW
DPB DL,[2000+T3,,PDP11]
MOVEI T5,600000+NCPAT
HRLM T5,PDP11(T3) ;TURN LOC. INTO A PATCH.
SKIPE CPATTY ;IF NOT ^],
RET
ADDI DO,@%OL ;FIND END OF INSN REPLACED,
HRRM DO,%PATR ;^] WILL PATCH BACK THERE.
RET
;COME HERE ON ACCESSING A PATCH-DEVICE.
CPATHA: SKIPE DDTPDP
JRST CPAT1
POP P,(P) ;DELETE RET. ADDR. IN MTRAP.
TLNE B,66000
JRST MTRAP2 ;IF RRAD OR WROTE, TREAT AS BKPT.
CPAT2: MOVEI PC,(A) ;IF FETCHING,
LSH PC,-1 ;BRANCH TO ADDRESSED LOC.
OBRAN1
;COME HERE IF ACCESSED BY DDT.
CPAT1: TLNE B,20000
SETZM @-2(D) ;IF WRITING, FLUSH THE PATCH.
TLNN B,20000 ;IF READING,
TLNE SF,DEXCM ;IF NOT ! MODE,
RETURN
TTOA [ASCIZ/ :PAT/] ;ANNOUNCE THE PATCH.
RETURN
CPATNO: ERROR [ASCIZ/WHENCE/]
; :ALTSEM -- EXCHANGE FUNCTIONS OF ; AND $ IN COMMANDS.
CALTSE: SETCMM CALTSF
MOVEI T5,"
MOVEI T6,";
SKIPN CALTSF ;IF NOW SWITCHED STATE,
JRST CALTS0
MOVEM T5,SEMICL ;$ TREATED AS ;,
MOVEM T6,ALTMOD ;; TREATED AS $.
TTOA [ASCIZ/SWITCHED
/]
RETURN
CALTS0: MOVEM T5,ALTMOD ;NORMAL STATE, $ TREATED AS $,
MOVEM T6,SEMICL ;; TREATED AS ;.
TTOA [ASCIZ/NORMAL
/]
RETURN
; ;N - LIKE $$^N IN 10-DDT.
CSN: TLNE SF,NUMFND ;IF NO ARG,
JRST CSN2
HRRZ DL,%PC ;USE ADDR AFTER END OF NEXT INSN.
ADDI DL,@%IL
CSN2: LSH DL,-1 ;WILL COMPARE WITH PC.
ANDI DL,77777
HRRM DL,%CSN ;RUN TILL GET THERE.
HRLOI T5,277777
MOVEM T5,INSCNT
JRST CSN1
;GO TO ADDRESS ARG.
CSG: TLNN SF,NUMFND
HRRZ DL,%GO ;IF NO ARG, USE STARTING ADDR.
ANDI DL,177777
HRRM DL,R7 ;IF HAD ARG, GO TO THAT ADDR.
SETOM PC-SAVLNG(P) ;INDICATE TERMINATE INSN.
AOJ T2,
MOVEM T2,INSCNT ; ;G WITH INNER ARG MEANS STEP
SKIPE DGVALP ;THAT MANY INSNS.
JRST CSN1
CSP: MOVE T5,%CSN ;IF IN ;N MODE
CAME T5,[.5KBIT,,-1]
CSN1: SKIPA T2,[JRST CNTINS]
45N MOVE T2,[SKIPGE I,PDP11(PC)]
45Y MOVE T2,[MOVE MA,PC]
CSP1: MOVEM T2,INBEG
TXN[ SKIPE ETNFIN ;IF DT WAS CHANGED, NOT FINISHED,
CALL ETOFIN ;FINISH IT NOW.
]
HRRZ T5,R7
TRNE T5,1 ;TRAP IF NEW PC ODD.
JSP D,DBNDE
MOVE C,RTIME ;TURN OFF DDONXT AFTER 1 INSN AT MOST.
AOS C
MOVEI A,DDTXTP
PUSHJ P,CLQADD
RSTALL: HRLZI T6,-SAVLNG+1(P) ;SET UP BLT POINTER.
HRRI T6,A
BLT T6,T6
SUB P,[SAVLNG,,SAVLNG] ;POINT TO BEFORE SAVED REGS.
POP P,RSTPC ;RESTORE FLAGS.
JRSTF @RSTPC
DDTXIT: HRRZ TIME,R7
ROT TIME,-1
CAMN TIME,PC ;IF PC CHANGED,
JRST DDTXI1
INSIRP SETZM 0,DDONXT WAITFL PDLFT PDLNFT
45Y SETZM IMTPR6
SETZM (P) ;START AT BEGINNING OF INSN.
MOVEI PC,(TIME)
DDTXI1: MOVE TIME,RTIME
TXN .RESET TYIC,
CRF
TXN[ .CALL TTYM2
.LOSE %LSFIL
]
SETZM DDTPDP
SETOM RUN
45Y[
MOVS A,45REGY ;COPY THE RIGHT SET OF REGISTERS INTO R0-R5
BLT A,R5
MOVE A,45MODE
MOVE A,45REG6(A)
HRRM A,R6 ;SELECT THE RIGHT COPY OF R6.
]
HRRZ PS,RPS ;NOW RESELECT THE RIGHT PROCESSOR MODE
NEWPS ;IN CASE USER DEPOSITED IN %PS.
SETOM OPC ;INDICATE JUST LEFT DDT.
POP P,RSTPC
SKIPE RSTPC
JRSTF @RSTPC
MOVE P,[-PDLSIZ,,PDL]
JRST INEND ;RET. ADDR. 0 MEANS RESTART.
DDTXTP: 0
-1
SETZM DDONXT
TXN[
TTYGT: SETZ
SIXBIT/TTYGET/
[TYIC]
2000,,T0
2000,,T0
402000,,A
;NORMAL DDT TTYSET.
TTYM1: SETZ
SIXBIT/TTYSET/
[TYIC]
[232420,,222222]
[230222,,220222]
400000,,TTYM1A
;NORMAL SIMULATOR TTYSET.
TTYM2: SETZ
SIXBIT/TTYSET/
[TYIC]
[131313,,131313]
[131313,,131313]
400000,,TTYM1A
;DDT TTYSET TO ACTIVATE ON NEXT CHAR.
TTYMA: SETZ
SIXBIT/TTYSET/
[TYIC]
[232420,,222222]
[230222,,220222]
400000,,TTYMAA
]
TTYM1A: 0 ;SET UP AFTER TTYGT AFTER $G'D.
TTYMAA: 0
IOCTAB: BLOCK IOCNUM
IOCEND:
ALTMOD: " ;CHAR TREATED AS $ (EITHER $ OR ;).
SEMICL: "; ;CHAR TREATED AS ; (EITHER $ OR ;, NOT=ALTMOD).
CALTSF: 0 ;NOT 0 IFF $ AND ; ARE SWITCHED.
OPC: 0 ;ADDR OF CURRENT OR PREVIOUS INSN.
JPC: 0 ;ADDR OF LAST INSN THAT CHANGED THE PC, OR TRAPPED.
;PROVIDED FEATURE ENABLED FOR THAT TYPE OF TRAP.
;SEE ;T COMMAND. AND TRPPNT VECTOR.
GETTY: 0 ;SET IFF GRAPHICS TTY.
INSCNT: 0 ;NUM. INSNS TO EXECUTE IN SNGL-STEP MD.
CPATTY: 0 ;LOCAL TO CPAT, CCRB, CCBSL.
RSTPC: 0
DDTPDP: 0
DDONXT: 0
CSLFLG: 0
DRDBRF: 0
DINITF: 0
DGVLVL: -1 ;LEVEL OF RECURSION AT DGVAL.
DGVRGP: 0 ;NONZERO IF THIS VALUE IS REGISTER NUM.
DGVALP: 0 ;NONZERO IF DGVAL, DGNUM ETC. FINDS A VALUE.
S%OLFL: 0 ;SET WHILE %Q REMAINS WHAT WAS OPENED.
DDUMPF: 0 ;SET IF PERMANENT DUMP FILE OPEN.
OPNMD1: 0 ;1-SHOT MAPPING MODE FOR OPENING LOCATIONS.
OPNMDT: 0 ;TEMP "
OPNMDP: 0 ;PERM "
OPNMDL: 0 ;MAPPING MODE USED TO OPEN CURREENTLY OPEN LOC.
LDPTR: 0 ; stores byte pointer used in newbin loading
LDWORD: 0 ; word for above
DNOARG: ERROR [ASCIZ/ARG/]
EXPUNG OBRAN1
CSLTP3: OBRAN2 ;HEAD OF CHAIN THAT RUNS THRU ALL OBRAN1'S.
IRP REGNUM,,[0,1,2,3,4,5,6]
R!REGNUM: 0
TERMIN ;PDP11 REGISTERS HERE.
R7: 600000+NPC,,0
VARIABLES
CONSTANTS ;DON'T WANT CONSTANTS AT END SO SYM TAB CAN VARY IN LENGTH
SYMEND: LASTST ;ALWAYS -> LAST STE IN USE.
;INITIAL SYMBOL TABLE
;FORMAT OF STE:
; WORD 1: NAME OF SYMBOL, IN SIXBIT.
; WORD 2: SIGN BIT: IF SET, SYMBOL IS HALF-KILLED.
; REST OF LH: SYMBOL TYPE.
; RH: VALUE.
DEFINE .5KILL A,B,C
SIXBIT/A/
IFSN C,,C:
IFSE C,,A:
.5KBIT,,IFSN B,,B
TERMIN
TXY[.=<<.+1>/2>*2] ;GO TO EVEN ADDR.
TXN[ .=.+<.&1>] ;GO TO EVEN ADDR.
SYMTAB: REPEAT 10,[
<'%_36>+<<'0+.RPCNT>_30>
1,,.RPCNT
] ;DEFINE %0 ... %7 .
;INSN. SPECIAL SYMBOLS.
INSNUM==0
IRP INSN,,[MOV,CMP,BIT,BIC,BIS]
INSNUM==INSNUM+1
SIXBIT/INSN/
2,,INSNUM
SIXBIT/INSN!B/ ;BYTE INSN DEF.
2,,10+INSNUM
TERMIN
SIXBIT/ADD/ ;2 EXCEPTIONS.
2,,6
SIXBIT/SUB/
2,,16
;SINGLE OPERAND INSN SYMBOLS.
INSNUM==0
IRP INSN,,[CLR,COM,INC,DEC,NEG,ADC,SBC,TST,ROR,ROL,ASR,ASL]
SIXBIT/INSN/
3,,INSNUM+50 ;WORD INSN.
SIXBIT/INSN!B/
3,,INSNUM+1050 ;BYTE INSN.
INSNUM==INSNUM+1
TERMIN
IRPS INSN,,[JMP 1,SWAB 3,SXT 67,MFPI 65,MTPI 66,MTPS 1064,MFPD 1065,MTPD 1066,MFPS 1067]
IFE 1&.IRPCN,SIXBIT/INSN/
.ELSE 3,,INSN
TERMIN
;BRANCH INSN SYMBOLS:
INSNUM==0
IRP INSN,,[BR,BNE,BEQ,BGE,BLT,BGT,BLE]
INSNUM==INSNUM+1
SIXBIT/INSN/
6,,INSNUM*400
TERMIN
INSNUM==100000
IRP INSN,,[BPL,BMI,BHI,BLOS,BVC,BVS,BCC,BCS]
SIXBIT/INSN/
6,,INSNUM
INSNUM==INSNUM+400
TERMIN
SIXBIT/BHIS/
6,,103000
SIXBIT/BLO/
6,,103400
SIXBIT/JSR/
4,,4
SIXBIT/XOR/
4,,74
SIXBIT/RTS/
5,,20
SIXBIT/TRAP/
7,,104400
SIXBIT/EMT/
7,,104000
SIXBIT/SFL/
10,,260
SIXBIT/CFL/
10,,240
SIXBIT/SOB/
13,,0
SIXBIT/MARK/
13,,1
SIXBIT/SPL/
13,,2
INSNUM==70
IRP INSN,,[MUL,DIV,ASH,ASHC]
SIXBIT/INSN/
14,,INSNUM
INSNUM==INSNUM+1
TERMIN
INSNUM==0
IRP INSN,,[HALT,WAIT,RTI,BPT,IOT,RESET,RTT]
SIXBIT/INSN/
INSNUM
INSNUM==INSNUM+1
TERMIN
IRP INSN,,[CFCC,SETF,SETI,SETD,SETL]
SIXBIT/INSN/
INSNUM
TERMIN
INSNUM==1701
IRP INSN,,[LDFPS,STFPS,STST,CLRF,TSTF,ABSF,NEGF]
SIXBIT/INSN/
3,,INSNUM
INSNUM==INSNUM+1
TERMIN
INSNUM==362
IRP INSN,,[MULF,MODF,ADDF,LDF,SUBF,CMPF]
SIXBIT/INSN/
15,,INSNUM
INSNUM==INSNUM+1
TERMIN
SIXBIT/STF/
16,,370
SIXBIT/DIVF/
15,,371
SIXBIT/STEXP/
16,,372
SIXBIT/STCFI/
16,,373
SIXBIT/STCFF/
16,,374
SIXBIT/LDEXP/
15,,375
SIXBIT/LDCIF/
15,,376
SIXBIT/LDCFF/
15,,377
SYMDRG:
IRPS AA,,[
%TKS 177560,%TKB 177562,%TKV 60
%TPS 177564,%TPB 177566,%TPV 64
%PKC 172544,%PKCSB 172542,%PKCSR 172540,%PKV 104
%PPS 177554,%PPB 177556,%PPV 74
%PRS 177550,%PRB 177552,%PRV 70
%RKDS 177400,%RKER 177402,%RKCS 177404,%RKWC 177406
%RKBA 177410,%RKDA 177412,%RKV 220
%LKS 177546,%LKV 100
%LPS 177514,%LPB 177516,%LPV 200
%NGCSR 164040,%NGREL 164042
%ERRV 4,%BPTV 14,%IOTV 20,%PWRV 24,%EMTV 30,%TRPV 34
%DIV 177300,%AC 177302,%MQ 177304,%MUL 177306
%SR 177310,%SC 177311,%NOR 177312,%LGS 177314,%ARS 177316
%PS 177776,%SWR 177570,%PIR 177772,%PIRV 240
%CSR 175000,%BAR 175002,%BCR 175004,%TBR 175006
%RCSR 174000,%RBUF 174002,%TSCR 174004,%TBUF 174006,%DCRV 300,%DCTV 304
%DCS 177460,%DWC 177462,%DCA 177464,%DAR 177466
%DAE 177470,%DBR 177472,%DSA 177476,%DV 204
%WC 177462,%CMA 177464,%ADS 177476
%TCST 177340,%TCCM 177342,%TCWC 177344,%TCBA 177346
%TCDT 177350,%TCV 214
%SLR 177774,%PAGV 250,%SSR0 177572,%SSR1 177574,%SSR2 177576,%SSR3 172516
%SARU0 177640,%SDRU0 177600,%SARS0 172240,%SDRS0 172200,%SARK0 172340,%SDRK0 172300
]
IFE 1&.IRPCN, SIXBIT/AA/
.ELSE IFL AA-400,[SETZ] AA
TERMIN
SYMLST: .5KILL .,0,DPNT, ;SYMBOL . .
.5KILL %Q,0 ;LAST QTY IN OR OUT.
.5KILL %P,0 ;LAST PART OF MULTI-WORD EXP.
.5KILL %D,0 ;LAST DEST. ADDR.
.5KILL %S,0 ;LAST SRC. ADDR.
.5KILL %L,0 ;LENGTH OF LAST QTY IN OR OUT.
.5KILL %OL,0 ;LENGTH OF WHAT WAS LAST OPENED.
.5KILL %IL,0 ;LENGTH OF INSN %PC POINTS TO.
.5KILL %CSN,-1 ;RH IS -1 OR HALF PC TO STOP AT (;N).
.5KILL %.,0,DOPEN, ;LOCATION OPEN.
.5KILL %OPC,0 ;PC OF CURRENT OR LAST INS.
.5KILL %B,0 ;ADDR OF LAST BREAKPOINT.
.5KILL %CORE,0 ;NUM. BYTES CORE.
.5KILL %,0,%PC, ;PC AT ENTRY TO DDT.
.5KILL %JPC,0 ;SOMETIMES, ADDR OF LAST PC CHANGE.
.5KILL %PATR,0 ;ADDR AFTER PLACE PATCH WAS PUT.
OMODE==DINSM+DSYMM
SYMDMP: .5KILL %CSX,2*<RCSX-PDP11> ;ADDR FOR ;X .
.5KILL PATCH,1,%PATCH, ;PATCH AREA FOR ^\, ^].
.5KILL %PMODE,OMODE ;PERMANENT MODE.
.5KILL %TMODE,OMODE ;TEMPORARY MODE.
.5KILL %GO,0 ;STARTING ADDRESS FOR ;G.
.5KILL %DMRV,310 ;DM DEVICE RECEIVE TRAP VECTOR
.5KILL %DMTV,314 ;DM TRANSMIT TRAP VECTOR.
IFN .-SYMDMP-SYMNSP*2,.ERR EDIT AT DEFSY2
LASTST=.-2
END BEG