mirror of
https://github.com/PDP-10/stacken.git
synced 2026-03-04 02:14:37 +00:00
1965 lines
61 KiB
Plaintext
1965 lines
61 KiB
Plaintext
TITLE TX1KON - TU70 DEVICE DEPENDENT CODE FOR TAPSER V165
|
||
SUBTTL L. BOSACK/TAH/TW/DPM 09-AUGUST-88
|
||
|
||
SEARCH F,S,DEVPRM
|
||
$RELOC
|
||
$HIGH
|
||
|
||
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED
|
||
; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
|
||
;
|
||
;COPYRIGHT (c) DIGITAL EQUIPMENT CORPORATION
|
||
; 1974,1975,1976,1977,1978,1979,1980,1982,1984,1986,1988.
|
||
;ALL RIGHTS RESERVED.
|
||
|
||
.CPYRT<1974,1988>
|
||
|
||
|
||
XP VTX1KN,165 ;VERSION NUMBER FOR LINKEDIT MAP
|
||
SALL
|
||
|
||
TX1KON::ENTRY TX1KON
|
||
;BIT DEFINITIONS ETC
|
||
|
||
;DEVICE CONI BITS
|
||
|
||
CI.RUN==1B17 ;MICROPROCESSOR RUN
|
||
CI.ICP==^D24 ;ICPC BIT POSITION
|
||
CI.CSR==1B25 ;CSR FLAG
|
||
CI.UPE==1B26 ;MICROPROCESSOR ERROR
|
||
CI.MPE==1B27 ;MEMORY PARITY ERROR
|
||
CI.NXM==1B28 ;NONEX MEMORY
|
||
CI.STA==1B29 ;STATUS AVAILABLE
|
||
CI.CON==1B32 ;CONTINUE
|
||
CI.ERR==CI.CSR!CI.UPE!CI.MPE!CI.NXM
|
||
|
||
;DEVICE CONO BITS
|
||
|
||
CO.ICP==CI.ICP ;ICPC BIT POSITION
|
||
CO.ILI==1B25 ;INHBIT LOAD ICPC
|
||
CO.UPE==CI.UPE ;CLEAR MICROPROCESSOR ERROR
|
||
CO.MPE==CI.MPE ;CLEAR MEM PAR ERR
|
||
CO.NXM==CI.NXM ;CLEAR NXM
|
||
CO.STA==CI.STA ;CLEAR STAT AVAIL
|
||
CO.SRQ==1B30 ; STATUS REQUEST
|
||
CO.CLR==1B31 ;CLEAR
|
||
CO.CON==CI.CON ;CONTINUE
|
||
|
||
;DEVICE DATAO BITS
|
||
|
||
DO.RES==1B16 ;LOCAL RESET
|
||
DO.LRS==1B17 ;LOAD RSEL REGISTER
|
||
DO.BCD==0 ;BYTE COUNTER AND DAC/CPC HIGH ORDER BITS
|
||
DO.DR==1 ;DATA REGISTER (READ TWICE, BLECHHH)
|
||
DO.TAG==2 ;TAG REGISTERS
|
||
DO.BUS==3 ;BUS REGISTERS
|
||
DO.UC0==4 ;MICROPROCESSOR CONTROL 0
|
||
DO.UC1==5 ;MICROPROCESSOR CONTROL 1
|
||
DO.RFL==6 ;LOW ORDER BITS OF SELECTED REG.FILE REGISTER
|
||
DO.RFH==7 ;HIGH ORDER ...
|
||
DO.MRL==10 ;LOW ORDER BITS OF MR
|
||
DO.MRH==11 ;HIGH ORDER BITS OF MR
|
||
DO.DAC==12 ;LOW ORDER BITS OF DAC
|
||
DO.CPC==13 ;LOW ORDER BITS OF CPC
|
||
DO.FR==14 ;FR
|
||
DO.UPS==15 ;MICROPRCESSOR STATES
|
||
DO.ICP==16 ;ICPC
|
||
DU0HLT==1B19 ;UP CTL 0 HALT
|
||
DU0CON==1B20 ;UP CTL 0 CONTINUE
|
||
DU0EXM==1B22 ;UP CTL 0 FORCE EXAMINE
|
||
DU0WRT==1B23 ;UP CTL 0 FORCE WRITE
|
||
DU0MDP==^D35 ;UP CTL 0 MD POSITION
|
||
DU0MDS==^D12 ;UP CTL 0 MD SIZE
|
||
|
||
DU1MEM==1B18 ;MEMORY USER BIT (0=DAC, 1=CPC)
|
||
DU1RUN==1B21 ;UP RUN BIT
|
||
DU1MAP==^D35 ;UP CTL 1 MA POSITION
|
||
DU1MAS==^D12 ;UP CTL 1 MA SIZE
|
||
|
||
DOYU0D: POINT DU0MDS,T2,DU0MDP ;BYTE POINTER TO MD FIELD IN DATAO UP CTL 0
|
||
DOYU1A: POINT DU1MAS,T2,DU1MAP ;BYTE POINTER TO MA FIELD UN UP DTL 1
|
||
|
||
;MICROPROCESSOR PARAMETERS
|
||
|
||
UP.SA==200 ;STARTING ADDRESS IN CTL MEM
|
||
UP.RA==201 ;RESTART ADDRESS
|
||
;OFFSETS IN ICPC BLOCK
|
||
|
||
CP.ICW==0 ;INITIAL COMMAND WORD
|
||
CP.ST1==1 ;STATUS WORD 1 (DSR,CSR,SEQ.COD,DAR)
|
||
CP.ST2==2 ;STATUS WORD 2 (CPC,BYTE COUNT)
|
||
CP2BCP==^D13 ;RESIDUAL BYTE COUNT POSITION
|
||
CP2BCS==^D14 ;RESIDUAL BYTE COUNT SIZE
|
||
CP.STS==3 ;POINTER TO TERMINATION STATUS
|
||
CP.RBC==3 ;ACCUMULATED BYTE COUNT (NO ERROR)
|
||
|
||
;OFFSETS INTO TERMINATION STATUS AREA
|
||
|
||
XS.RBC==0 ;ACCUMULATED BYTE COUNT (ERROR)
|
||
XS.TAG==1 ;TAGS AND BUS
|
||
XS.DAC==2 ;DAC
|
||
XS.FR==3 ;FR,,STATUS
|
||
XS.S0==4 ;SENSE BYTES 0 - 3
|
||
XS.S4==5 ;SENSE BYTES 4 - 7
|
||
XS.S8==6 ;SENSE BYTES 8 - 11
|
||
XS.S12==7 ;SENSE BYTES 12 - 15
|
||
XS.S16==10 ;SENSE BYTES 16 - 19
|
||
XS.S20==11 ;SENSE BYTES 20 - 23
|
||
;REMAINING ENTRIES ARE COPIED FROM ELSEWHERE
|
||
XS.CNI==12 ;CONI
|
||
XS.ST1==13 ;CP.ST1
|
||
XS.ST2==14 ;CP.ST2
|
||
XS.CPC==15 ;CPC
|
||
XS.CMD==16 ;COPY OF CHL CMD (OR MODE SET)
|
||
XS.CM1==17 ;COPY OF CHL CMD
|
||
XS.MD==20 ;MD AND CPMA
|
||
XS.DR==21 ;DR
|
||
XS.DIAG==22 ;DIAGNOSTIC ERROR CODE
|
||
XS.MR1==23 ;MEMORY REGISTER
|
||
XS.END==23 ;END OF EXTENDED STATUS AREA
|
||
|
||
CPY2BC: POINT CP2BCS,CP.ST2(T4),CP2BCP ;POINTER TO RESIDUAL BYTE COUNT
|
||
;BITS IN CP.ST1
|
||
|
||
;DSR - DEVICE STATUS REGISTER
|
||
|
||
DS.ATN==1B0 ;ATTENTION
|
||
DS.STM==1B1 ;STATUS MODIFIER
|
||
DS.CUE==1B2 ;CONTROL UNIT END
|
||
DS.BSY==1B3 ;BUSY
|
||
DS.CHE==1B4 ;CHANNEL END
|
||
DS.DVE==1B5 ;DEVICE END
|
||
DS.UCH==1B6 ;UNIT CHECK
|
||
DS.UEX==1B7 ;UNIT EXCEPTION
|
||
|
||
;CSR - CHANNEL STATUS REGISTER
|
||
|
||
CS.PGS==1B8 ;PROGRAM STATUS
|
||
CS.STP==^D10 ;STATUS TYPE POSITION
|
||
CS.STS==2 ;STATUS TYPE SIZE
|
||
CS.STX==0 ;INITIAL SELECTION
|
||
CS.STE==1 ;ENDING STATUS
|
||
CS.STC==2 ;CU INTERRUPT STATUS
|
||
CS.STI==3 ;IDLE STATUS
|
||
CS.SLE==1B11 ;SELECTION ERROR
|
||
CS.SQE==1B12 ;SEQUENCE ERROR
|
||
CS.DPE==1B13 ;DEVICE PARITY ERROR
|
||
CS.LNE==1B14 ;LENGTH ERROR
|
||
CS.SLI==1B15 ;SUPRESS INCORRECT LENGTH INDICATION
|
||
CS.IOP==1B16 ;ILLEGAL OPERATION
|
||
CS.DSF==1B17 ;DSR FLAG
|
||
|
||
;RANDOM BIT IN STATUS 1
|
||
ST1NFG==1B18 ;STATUS AND SENSE STORED NO GOOD
|
||
ST1INC==1B19 ;OP INCOMPLETE (RUNAWAY TAPE)
|
||
|
||
CP1DIS==^D8 ;SIZE OF DARI
|
||
CP1DIP==^D35 ;POSITION OF DARI
|
||
CP1SQS==^D5 ;SEQUENCE ERR CODE
|
||
CP1SQP==^D27 ;POSITION
|
||
|
||
CPSBCS==^D14 ;BYTE COUNT SIZE
|
||
CPSBCP==^D13 ;BYTE COUNT POSITION
|
||
CPSNSB==^D24 ;NUMBER OF SENSE BYTES
|
||
CPSNSW==<CPSNSB/4>+4 ;WORDS FOR STORAGE PLUS OVERHEAD
|
||
|
||
;INTO ICPC
|
||
STYDAI: POINT CP1DIS,CP.ST1(T4),CP1DIP ;DARI
|
||
STYTYP: POINT CS.STS,CP.ST1(T4),CS.STP ;STATUS TYPE
|
||
;BITS IN THE SENSE BYTES
|
||
|
||
;XS.S0 HAS SENSE BYTES 0 - 3
|
||
|
||
SB0CMR==1B0 ;COMMAND REJECT
|
||
SB0IRQ==1B1 ;INTERVENTION REQUIRED
|
||
SB0BOC==1B2 ;BUS OUT CHECK
|
||
SB0EQC==1B3 ;EQUIPMENT CHECK
|
||
SB0DC==1B4 ;DATA CHECK
|
||
SB0OVR==1B5 ;OVERRUN
|
||
SB0WCZ==1B6 ;WORD COUNT ZERO
|
||
SB0DCC==1B7 ;DATA CONVERTER CHECK
|
||
SB0==SB0CMR!SB0IRQ!SB0BOC!SB0EQC!SB0DC!SB0OVR!SB0WCZ!SB0DCC
|
||
|
||
SB1NSE==1B8 ;NOISE
|
||
SB1TUA==1B9 ;TU STATUS A
|
||
SB1TUB==1B10 ;TU STATUS B
|
||
SB17TK==1B11 ;7 TRACK
|
||
SB1BOT==1B12 ;LOAD POINT
|
||
SB1WRS==1B13 ;WRITE STATUS & SELECTED
|
||
SB1WTL==1B14 ;WRITE LOCK
|
||
SB1NC==1B15 ;NOT CAPABLE
|
||
|
||
;SENSE BYTE 2 IS TRACK IN ERROR BYTE
|
||
|
||
|
||
;SENSE BYTE 3
|
||
SB3D16==1B29 ;1600 BPI TAPE
|
||
|
||
;SENSE BYTE 5
|
||
SB5NSS==1B9 ;NEW SUB-SYSTEM (TX02)
|
||
SB5PID==1B11 ;PE ID BURST CHECK
|
||
|
||
;SENSE BYTE 6
|
||
SB67TK==1B16 ;7 TRACK
|
||
SB6D62==1B18 ;6250 BPI TAPE
|
||
|
||
;BYTE POINTERS
|
||
|
||
XSYSB2: POINT 8,XS.S0(T2),23 ;POINTER TO SB2 (TRACK IN ERROR)
|
||
|
||
|
||
TX1MVR==1500,,0 ;MINIMUM MICROCODE VERSION ALLOWED
|
||
|
||
;MAGIC 8A LOCS AND VALUES
|
||
LOCVER==3 ;WHERE MICROCODE VERSION IS STORED
|
||
DXVER==TX1MVR_-30 ;WE NEED AT LEAST THIS VERSION OF THE MICROCODE
|
||
LOCMAG==17 ;MAGIC ADDRESS
|
||
DXMAG==4756 ;MAGIC VALUE
|
||
;CCW BIT AND BYTE DEFNS
|
||
|
||
CC.OPP==1 ;POSITION OF OP CODE FIELD IN CCW
|
||
CC.OPS==2 ;SIZE OF OP CODE FIELD IN CCW
|
||
CCOCHN==0 ;CHANNEL CONTROL OP CODE
|
||
CCODVC==1 ;DEVICE COMMAND
|
||
CCODAT==2 ;MASK FOR DATA XFR OPERATION
|
||
|
||
;CHANNEL CONTROL CCW
|
||
|
||
CCHADS==^D22 ;SIZE OF NEW CPC FIELD IN CHAN CTL OP
|
||
CCHADP==^D35 ;POSITION OF NEW CPC FIELD IN CHAN CTL OP
|
||
CCHGO==1B2 ;GO BIT IN CHAN CTL OP
|
||
CCHJMP==1B3 ;JUMP BIT IN CHAN CTL OP
|
||
CCHSTS==1B4 ;STORE STATUS BIT IN CHAN CTL OP
|
||
CCHFRC==1B5 ;FORCE SENSE BYTES TO BE STORED
|
||
CCHSAV==1B6 ;SAVE BYTE COUNT OF PREVIOUS RECORD
|
||
CCHJGO==:CCHJMP!CCHGO ;JUMP AND GO FOR REST OF MON
|
||
|
||
;DEVICE CONTROL CCW
|
||
|
||
CCDSLI==1B2 ;SUPRESS INCORRECT LENGTH INDICATION
|
||
CCDAER==1B3 ;AUTOMATIC RETRY ON ERROR
|
||
CCDISL==1B4 ;IGNORE SHORT LENGTH ERROR
|
||
CCDREC==1B7 ;READ (SOFT) ERROR COUNTER
|
||
CCDIGN==1B13 ;GUARANTEED IGNORED BY DX10
|
||
CCDMDS==2 ;SIZE OF MODE FIELD
|
||
CCDMDP==6 ;POSITION OF MODE FIELD
|
||
CCDDCS==^D8 ;SIZE OF DEVICE COMMAND FIELD
|
||
CCDDCP==^D23 ;POSITION OF DEVICE COMMAND FIELD
|
||
CCDDAS==^D8 ;ADDRESS OF DEVICE ADDRESS FIELD
|
||
CCDDAP==^D35 ;POSITON OF DEVICE ADDR FIELD
|
||
|
||
;DATA XFR CCW
|
||
|
||
CCXBCP==^D13 ;POSITION OF BYTE COUNT
|
||
CCXBCS==^D13 ;SIZE OF BYTE COUNT IN DATA XFR CCW
|
||
CCXADS==^D22 ;SIZE OF ADDRESS IN DATA XFR CCW
|
||
CCXADP==^D35 ;POSITION OF ADDRESS IN DATA XFR CCW
|
||
|
||
;ODD PARITY BIT IN SET MODE DEVICE COMMAND
|
||
MS1ODD==20
|
||
|
||
CCYOP: POINT CC.OPS,(T4),CC.OPP ;POINTER TO OP CODE IN CCW
|
||
CHYADR: POINT CCHADS,(T4),CCHADP ;POINTER TO NEW CPC IN CHAN CTL CCW
|
||
CDYMOD: POINT CCDMDS,(T4),CCDMDP ;DATA MODE IN DEVICE CTL CCW
|
||
CDYDCR: POINT CCDDCS,(T4),CCDDCP ;DEVICE COMMAND IN DEVICE CTL OP
|
||
CDYDAD: POINT CCDDAS,(T4),CCDDAP ;DEVICE ADDRESS IN DEVICE CTL CCW
|
||
|
||
CXYCNT: POINT CCXBCS,(T4),CCXBCP ;BYTE COUNT IN DATA XFR
|
||
CXYADR: POINT CCXADS,(T4),CCXADP ;ADDRESS IN DATA XFR
|
||
TX1DMX==20 ;MAXIMUM DRIVES PER KONTROLLER
|
||
TX1HDN==TX1DMX-1 ;HIGHEST DRIVE NUMBER ON KONTROLLER
|
||
TX1ELN==^D20 ;SIZE OF FEP TABLE
|
||
|
||
|
||
;DRIVER CHARARCTERISTICS
|
||
; TX1 = TX1CNF
|
||
; MTA = MAGTAPE
|
||
; 0 = MAXIMUM DEVICES IN SYSTEM (NO LIMIT)
|
||
; K.TX1 = KONTROLLER TYPE
|
||
; TX1DMX = MAXIMUM DRIVES PER KONTROLLER
|
||
; TX1HDN = HIGHEST DRIVE NUMBER ON KONTROLLER
|
||
; MDSEC0 = SECTION FOR KDB/UDB
|
||
; MDSEC0 = SECTION FOR DDB
|
||
DRVCHR (TX1,MTA,0,K.TX1,TX1DMX,TX1HDN,MDSEC0,MDSEC0,<DR.XAD!DR.MCD!DR.DPU!DR.UCK!DR.GCC!DR.DDN>)
|
||
|
||
.ORG TKBUDB ;START OF TX01 SPECIFIC DATA
|
||
TX1UTB:! BLOCK TX1DMX ;TABLE OF POINTERS TO UDBS
|
||
TX1TMP:! BLOCK 1 ;TEMP LOC FOR DX10
|
||
TX1ULB:! BLOCK .ULLEN ;MICROCODE LOADER BLOCK
|
||
TX1SNS:! BLOCK CPSNSW+1 ;SENSE BYTE STORAGE
|
||
TX1SUN:! BLOCK 1 ;NON-EXISTANT DRIVE BEING SENSED
|
||
TX1IUM:! BLOCK TX1DMW ;IGNORE UNIT MASK
|
||
TX1NUM:! BLOCK TX1DMW ;NEW UNIT MASK
|
||
TX1KLN:! ;LENGTH OF KDB
|
||
.ORG
|
||
|
||
.ORG TUBLEN
|
||
TX1IST:! BLOCK TX1ELN ;LAST ERROR INITIAL STATUS
|
||
TX1FST:! BLOCK TX1ELN ;LAST ERROR FINAL STATUS
|
||
TX1ULN:! ;LENGTH OF UDB
|
||
.ORG
|
||
|
||
|
||
TX1KDB: KDBBEG (TX1,TX1KLN)
|
||
SETWRD (KDBNAM,<SIXBIT/MT/>) ;KONTROLLER NAME
|
||
SETWRD (KDBIUN,<TKBUDB>) ;INITIAL POINTER TO UDBS
|
||
SETWRD (KDBCUN,<TKBUDB>) ;CURRENT POINTER TO UDBS
|
||
SETWRD (KDBIUM,<TX1IUM>) ;OFFSET TO IGNORE UNIT MASK
|
||
SETWRD (KDBNUM,<TX1NUM>) ;OFFSET TO NEW UNIT MASK
|
||
SETWRD (KDBSTS,<INSVL.(1,KD.MPT)>) ;INITIALLY ONE PATH
|
||
IFN FTMP,<SETWRD (TKBFCT,<TKBICT##>)> ;FAIRNESS COUNTER FOR QUEUED I/O
|
||
KDBEND
|
||
|
||
|
||
TX1UDB: UDBBEG (TX1,TX1ULN)
|
||
SETWRD (UDBNAM,<SIXBIT/MT/>) ;DRIVE NAME
|
||
SETWRD (UDBPCC,< TX1ELN,,TX1FST>) ;PHYSICALLY CONTIGUOUS CORE
|
||
SETWRD (TUBIEP,<-TX1ELN,,TX1IST>) ;INITIAL ERROR POINTER
|
||
SETWRD (TUBFEP,<-TX1ELN,,TX1FST>) ;FINAL ERROR POINTER
|
||
UDBEND
|
||
|
||
EQUATE (LOCAL,CPOPJ##,<TX1IDL>)
|
||
|
||
TX1ICD==TAPICD## ;PROTOTYPE INTERRUPT CODE ADDRESS
|
||
TX1ICL==TAPICL## ;PROTOTYPE INTERRUPT CODE ADDRESS
|
||
TX1INT==TAPINT## ;INTERRUPT SERVICE
|
||
|
||
TX1DSP: DRVDSP (TX1,TAPCHN##,TDVDDB##,TDVLEN##,TPMDIA##)
|
||
TPK (TX1,YES,377777) ;SERVICE DEPENDENT DISPATCH
|
||
|
||
TX1CKT: EXP K.TX1,K.DX2,K.TS1,0 ;COMPATIBLE KONTROLLER TABLE
|
||
|
||
TX1NBF: TPNBF (RW,RU) ;NON-BLOCKING FUNCTION MASK
|
||
|
||
;DEFAULT MONGEN'ED DEVICE TABLE
|
||
DEFMDT: MDKL10 (7,220,0,0,<MD.KON>) ;DEVICE CODE 220
|
||
MDKL10 (7,224,0,0,<MD.KON>) ;DEVICE CODE 224
|
||
MDKL10 (7,034,0,0,<MD.KON>) ;DEVICE CODE 034
|
||
MDTERM ;TERMINATE TABLE
|
||
|
||
;PROTOTYPE MICROCODE LOADER BLOCK
|
||
TX1ULP: EXP .BTTX1## ;MICROCODE INDEX
|
||
XWD 0,0 ;DEVICE CODE,,MASSBUS UNIT NUMBER
|
||
SIXBIT /TX01/ ;INTERFACE NAME
|
||
SIXBIT /DX10/ ;CHANNEL NAME
|
||
EXP TX1MVR ;MINIMUM MICROCODE VERSION
|
||
EXP 0 ;DATE/TIME OF LOAD SUCCESS OR FAILURE
|
||
EXP 0 ;MICROCODE VERSION
|
||
EXP 0 ;POINTER TO MAGIC TABLE
|
||
EXP 0 ;MICROCODE LENGTH
|
||
EXP 0 ;MICROCODE ADDRESS
|
||
SUBTTL INTERRUPT SERVICE
|
||
|
||
;CALED HERE FROM TAPSER WHEN AN INTERRUPT HAPPENS FOR THIS KONTROLLER
|
||
;W/ KDB ADDRESS
|
||
|
||
TX1ISR: XCT KDBCNI(W) ;GET CONI INTO T1
|
||
PUSHJ P,SETXS ;SETUP EXTENDED STATUS
|
||
;ON RETURN, T4=ICPC, T3=CP.ST1,,,,RH(CONI)
|
||
TRNE T1,CI.UPE!CI.MPE!CI.NXM ;CHANNEL ERROR?
|
||
JRST ERRCH1 ;YES, ALAS
|
||
TRNN T1,CI.STA ;STATUS STORED?
|
||
JRST ERRUPE ;TREAT AS UP ERROR
|
||
TLNE T3,(CS.SLE!CS.SQE) ;SELECTION ERROR (ETC.)?
|
||
JRST ERRCH2 ;YES - SICK CHANNEL MAYBE
|
||
LDB T1,STYTYP ;GET STATUS TYPE
|
||
CAIN T1,CS.STI ;IDLE STATUS
|
||
JRST ERRINT ;YES, FAKED-UP INTERRUPT TO HANDLE AN ERROR
|
||
JUMPN U,@TPIDSP(T1) ;DISPATCH IF WE HAVE A UDB
|
||
LDB T2,STYDAI ;GET DRIVE WHICH INTERRUPTED
|
||
HRRE T3,TX1SUN(W) ;AND DRIVE WE MAY HAVE REQUESTED
|
||
CAIN T2,(T3) ;INTERRUPT FOR NON-EXISTANT DRIVE?
|
||
JRST ERRCH4 ;YES--JUST CLEAR STATUS AVAILABLE AND DISMISS
|
||
JRST ERRUPE ;ELSE REAL ERROR
|
||
|
||
;DISPATCH TABLE ON STATUS TYPE
|
||
|
||
TPIDSP: IFIW ERRCH3 ;INITIAL SELECTION STATUS
|
||
IFIW TPINT1 ;ENDING STATUS
|
||
IFIW TPINT2 ;CU INTERRUPT STATUS
|
||
|
||
|
||
;HERE ON IDLE-STATUS INTERRUPT.
|
||
;THIS WAS GENERATED WHEN WE HAD AN ERROR IN A MULTI-BLOCK XFER
|
||
ERRINT: MOVE U,@KDBCUN(W) ;SET U TO RIGHT UDB
|
||
SKIPN T1,TUBCNI(U) ;INTRPT BECAUSE OF AN ERROR?
|
||
SOJA T1,CLRSTA ;NO, INDICATE TIME FOR A SCHEDULE CYCLE
|
||
HRRZ T2,TUBFEP(U) ;POINT TO EXTENDED AREA
|
||
ADD T2,U ;RELOCATE
|
||
MOVE T1,T2 ;COPY EXTENDED AREA ADDRESS
|
||
SKIPL CP.STS(T4) ;ALREADY NEGATIVE?
|
||
TLOA T2,(-<CPSNSB>B<CPSBCP>) ;NO, MAKE SURE IT LOOKS THAT WAY
|
||
HLL T2,CP.STS(T4)
|
||
HLLM T2,CP.STS(T4)
|
||
MOVE T3,XS.ST1(T1)
|
||
MOVEM T3,CP.ST1(T4)
|
||
MOVE T3,XS.ST2(T1)
|
||
MOVEM T3,CP.ST2(T4)
|
||
MOVE T3,TUBCNI(U) ;STATUS INTO T3
|
||
HRRZM T3,T1 ;CONI BITS INTO T1
|
||
SETZM TUBCNI(U) ;CLEAR THE ERROR-WORD
|
||
JRST TPINT1 ;AND PRETEND ITS A REAL INTERRUPT
|
||
;HERE ON AN INTERRUPT WITH CU INT. STATUS STORED
|
||
|
||
TPINT2: MOVSI T1,TKSOFL## ;UNIT ON LINE?
|
||
TDNN T1,TUBSTS(U) ; ...
|
||
JRST TPIN2A ;YES - SEE IF RUNL TERMINATION
|
||
TLNN T3,(DS.DVE) ;DEVICE END?
|
||
JRST ERRUPE ;NO, CALL IT A MICROPROCESSOR ERROR
|
||
ANDCAM T1,TUBSTS(U) ;UNIT NOW ON LINE
|
||
;NO - LONGER REWINDING EITHER
|
||
|
||
;HERE IF CU STORED STATUS AND UNIT WAS ON LINE
|
||
;THE ONLY CASES OF THIS ARE THE TERMINATION OF A REWIND OR REWIND AND UNLOAD
|
||
;OR DSE
|
||
|
||
TPIN2A: PUSH P,T3
|
||
MOVSI T1,TUSREW## ;IF UNIT ISN'T REWINDING
|
||
TDNN T1,TUBSTS(U)
|
||
PUSHJ P,TPMONL## ;IT JUST CAME ON-LINE, TELL MDC
|
||
PUSHJ P,REWDON## ;FLAG AS DONE REWINDING
|
||
POP P,T3 ;RESTORE CONI BITS
|
||
TLNN T3,(DS.UCH) ;UNLOAD?
|
||
JRST TPINT3 ;NO
|
||
HRRZ T2,TUBFEP(U) ;OFFSET TO FINAL ERROR POINTER
|
||
ADD T2,U ;RELOCATE
|
||
MOVE T2,XS.S0(T2) ;FETCH SENSE BYTES 0 - 3
|
||
TLNN T2,(SB1TUA) ; OR DSE ERROR
|
||
JRST TPIN2B ;IT WAS UNLOAD
|
||
TLNE T2,(SB1TUB) ;NOT READY DURING DSE?
|
||
JRST ERROFL ;YES
|
||
TPIN2B: MOVSI T1,TUSBOT##
|
||
ANDCAM T1,TUBSTS(U) ;TURN OFF BOT
|
||
MOVSI T1,TKSOFL##
|
||
IORM T1,TUBSTS(U) ;TURN ON OFL
|
||
|
||
|
||
;HERE ON AN INTERRUPT WITH IDLE STATUS STORED
|
||
;ALSO A COMMON EXIT
|
||
|
||
TPINT3: MOVNI T1,1 ;ASSUME SCHED CYCLE WANTED
|
||
MOVSI T2,TKSSEL## ;IF CHANNEL ALREADY SELECTED
|
||
TDNE T2,TKBSTS(W) ; ...
|
||
MOVEI T1,0 ;SELECTED - NO SCHED CYCLE
|
||
|
||
;AND FALL INTO CLRSTA
|
||
;HERE TO CLEAR STATUS AVAILABLE ONLY
|
||
;IS TRANSPARENT WRT ALL AC'S
|
||
|
||
CLRSTA: PUSH P,T1 ;SAVE T1
|
||
XCT KDBCNI(W) ;GET BITS
|
||
TRZ T1,-1-CO.CLR!CO.CON ;PRESERVE CLR & CONT
|
||
IORI T1,CO.ILI!CO.STA+TAPCHN## ;ONLY CLEAR STAT AVAIL
|
||
TLNN T1,1 ;UP STILL RUNNING ?
|
||
TRZ T1,TAPCHN## ;NO, DON'T LIGHT PI
|
||
XCT KDBCNO(W) ;SEND TO DEVICE
|
||
JRST TPOPJ##
|
||
;HERE ON ENDING STATUS INTERRUPT
|
||
|
||
TPINT1: PUSHJ P,CHKIRB## ;SANITIZE IORB QUEUE
|
||
JRST [PUSHJ P,CLRSTA ;NONE, CLEAR STATUS AVAIL
|
||
JRST TAPDIS##] ; AND EXIT THE INTERRUPT
|
||
MOVE T2,CP.ST1(T4) ;GET STATUS WORD
|
||
TRNE T2,ST1NFG ;WAS EXTENDED STATUS STORED?
|
||
JRST ERRUPE ;NO - TREAT AS UP ERR
|
||
TRNE T2,ST1INC ;OPERATION COMPLETE
|
||
JRST ERROF1 ;NO - TREAT AS OFF-LINE
|
||
MOVSI T2,TUSBOF## ;CLEAR BOT AND OFL
|
||
ANDCAM T2,TUBSTS(U) ; ...
|
||
HRRZ T2,TUBFEP(U) ;OFFSET TO FINAL ERROR POINTER
|
||
ADD T2,U ;RELOCATE
|
||
MOVE T2,XS.S0(T2) ;FETCH SENSE BYTES 0 - 3
|
||
TLNE T2,(SB0WCZ) ;WORD COUNT 0 AND NO MOTION?
|
||
JRST ERRRD0 ;YES, SET NO MOTION
|
||
LDB T2,PRBFCN## ;NO, GET FUNCTION
|
||
JRST @TP1DSP(T2) ;OK - DISPATCH
|
||
|
||
;DISPATCH TABLE FOR ENDING STATUS
|
||
|
||
;WHEN THESE ROUTINES ARE ENTERED, W AND U ARE SETUP WITH KDB AND UDB
|
||
;T1 HAS THE IORB ADDRESS
|
||
;T4 HAS THE ICPC ADDRESS, T3 HAS CP.ST1 FROM THE ICPC AREA
|
||
|
||
TP1DSP: IFIW TAPIFI## ;(00) ILLEGAL
|
||
IFIW TP1RD ;(01) READ
|
||
IFIW TP1WT ;(02) WRITE
|
||
IFIW TP1RB ;(03) READ BACKWARDS
|
||
IFIW TP1SR ;(04) SKIP RECORD
|
||
IFIW TP1BR ;(05) BACKSPACE RECORD
|
||
IFIW TP1SF ;(06) SKIP FILE
|
||
IFIW TP1BF ;(07) BACKSPACE FILE
|
||
IFIW TP1ERG ;(10) ERASE GAP
|
||
IFIW TP1DSE ;(11) DATA SECURITY ERASE
|
||
IFIW TP1REW ;(12) REWIND
|
||
IFIW TP1RUN ;(13) REWIND AND UNLOAD
|
||
IFIW TP1WTM ;(14) WRITE TAPE MARK
|
||
IFIW TAPIFI## ;(15) YELLOW BALL
|
||
IFIW TP1CR ;(16) CORRECTION READ
|
||
IFIW TP1RD ;(17) JUST PLAIN READ HERE
|
||
TPI1MX==.-TP1DSP-1
|
||
SUBTTL ENDING INTERRUPT PROCESSING OF A READ AND CORRECTION READ
|
||
|
||
TP1CR:
|
||
TP1RD: PUSHJ P,STRDWT ;SETUP
|
||
MOVEI T2,TUC7TK##
|
||
TDNN T2,TUBCNF(U) ;IF 7 TRACK
|
||
PUSHJ P,CHKXSP ;OR NO EXTENDED STATUS
|
||
JRST TP1RD2 ;CAN'T READ DENSITY
|
||
PUSH P,T4 ;SAVE AN AC
|
||
HRL T4,XS.S0(T2) ;DENSITY IS IN SENSE BYTES
|
||
TLNE T4,SB3D16
|
||
JRST [MOVEI T2,RB.D16
|
||
JRST TP1RD1] ;1600
|
||
HRL T2,XS.S4(T2)
|
||
HRRI T2,RB.D8 ;ASSUME 800
|
||
TLNE T2,SB6D62
|
||
HRRI T2,RB.D62 ;NO, IT IS 6250
|
||
TP1RD1: DPB T2,PRBDEN## ;TELL THE WORLD
|
||
POP P,T4 ;RESTORE T4
|
||
TP1RD2: TRNN T3,CI.CSR ;CSR FLAG UP?
|
||
JRST RDOK2 ;NO, ALL IS WELL
|
||
TLNN T3,(CS.DSF) ;IS DSR FLAG UP?
|
||
JRST T1RDOK ;NO - MUST BE LENGTH ERR OR DEV PARITY
|
||
TLNN T3,(DS.UEX) ;UNIT EXCEPTION?
|
||
JRST ERRRD2 ;NO - JUST ANOTHER ERROR
|
||
PUSHJ P,NXTFIL ;1 FILE FARTHER ALONG
|
||
|
||
T1RDOK: TLNE T3,(DS.UCH!CS.DPE) ;UNIT CHECK?
|
||
JRST ERRRD2 ;YES - AN ERROR ALONG WITH TPM
|
||
TLNN T3,(CS.LNE) ;LENGTH ERROR?
|
||
JRST RDOK2 ;NO
|
||
LDB T2,CPY2BC ;GET RESIDUAL BYTE COUNT
|
||
JUMPN T2,RDOK1 ;IF NON ZERO, RECORD WAS TOO SHORT
|
||
MOVSI T2,RB.STL!RB.SER ;ELSE TOO LONG
|
||
IORM T2,TRBSTS(T1) ;FLAG IN IORB
|
||
JRST RDOK2
|
||
RDOK1: TLNN T3,(DS.UEX) ;RECORD SHORT - EOF?
|
||
AOS TUBREC(U) ;NO, COUNT THE RECORD
|
||
RDOK2: PUSHJ P,CHKRBC ;GET BYTE COUNT
|
||
MOVE T2,XS.RBC(T2) ;FROM RIGHT AREA
|
||
RDOK3: MOVEM T2,TRBRCT(T1) ;STORE IN IORB
|
||
;*********PROBLEM WITH MULTIPLE COMMANDS********
|
||
ADDM T2,TUBCRD(U) ;UPDATE STATISTICS
|
||
ADDM T2,.CPTFI##
|
||
LDB T3,PRBMOD## ;GET MODE
|
||
IDIV T2,TMODTB##(T3) ;GET NUMBER OF WORDS AND RESIDUE
|
||
HRLM T2,TUBCHR(U) ;STORE WORD COUNT
|
||
DPB T3,PMTNCR## ;STORE REMAINDER
|
||
PUSHJ P,CSDMP## ;MAKE SURE WE GET BYTE COUNTS FROM
|
||
; PHYSICAL MEMORY AND NOT FOR CACHE
|
||
|
||
;HERE TO EXIT FROM AN INTERRUPT AND RETURN THE IORB ADDR IN T1
|
||
|
||
DONE: MOVE F,TUBCUR(U) ;GET DDB
|
||
MOVSI T3,IOSRTY## ;GET RETRY BIT
|
||
ANDCAM T3,DEVIOS(F) ;CLEAR (TAPUUO WILL RESET IF NECESSARY)
|
||
HLRZ T3,TRBSTS(T1) ;SEE IF ANY FLAGS ARE ON
|
||
MOVSI T2,RB.EXC ;GET BIT
|
||
SKIPE T3 ;ANY FLAGS?
|
||
IORM T2,TRBLNK(T1) ;STORE
|
||
PUSHJ P,FXLST ;BLESS XFER LIST
|
||
PUSHJ P,CLRICP ;SETUP ICPC AREA FOR IDLENESS
|
||
PJRST CLRSTA ;CLEAR STATUS AVAILABLE
|
||
|
||
;ERROR HANDLERS FOR READ AND READ LIKE OPERATIONS
|
||
|
||
ERRRD0: MOVSI T2,RB.SNM!RB.SED ;HERE WHEN NO TAPE MOTION
|
||
IORM T2,TRBSTS(T1) ;FLAG IN IORB
|
||
|
||
ERRRD1: PUSHJ P,ERRANL ;ANALYZE SENSE BYTE 0 ETC.
|
||
JRST DONE ;TERMINATE
|
||
|
||
ERRRD2: PUSHJ P,ERRANL ;ANL..
|
||
JRST RDOK2 ;COPY BYTE COUNT
|
||
SUBTTL ENDING INTERRUPT PROCESSING OF READ BACKWARDS
|
||
|
||
TP1RB: SOS TUBREC(U) ;DECREMENT RECORD COUNT
|
||
TRNN T3,CI.CSR ;CSR FLAG UP?
|
||
JRST T1RBOK ;NO - WIN
|
||
TLNE T3,(DS.UEX) ;UNIT EXCEPTION?
|
||
PUSHJ P,LSTFIL ;YES, 1 FEWER FILES
|
||
TLNN T3,(DS.UCH) ;UNIT CHECK?
|
||
JRST T1RB2 ;NO - LOOK CLOSER
|
||
PUSHJ P,ITUCOK ;IS THIS UNIT CHECK OK?
|
||
JRST ERRRD2 ;NO - BOMB
|
||
MOVSI T2,RB.SBT!RB.SNM ;BOT AND NO MOTION
|
||
SKIPN TUBREC(U) ;AT BOT PREVIOUSLY?
|
||
SKIPE TUBFIL(U) ; ???
|
||
SETZ T2, ;NO - JUST HIT BOT
|
||
IORM T2,TRBSTS(T1) ; ...
|
||
T1RB2: TLNE T3,(CS.DPE) ;PAR ERR?
|
||
JRST ERRRD2 ;YES
|
||
T1RBOK: HRRZ T2,TUBFEP(U) ;OFFSET TO FINAL ERROR POINTER
|
||
ADD T2,U ;RELOCATE
|
||
MOVE T2,XS.S0(T2) ;FETCH SENSE BYTES 0 - 3
|
||
TLNE T2,(SB1BOT) ;AT BOT?
|
||
PUSHJ P,SETBOT ;FLAG AS BOT
|
||
JRST T1RDOK ;JOIN READ PROCESSING
|
||
|
||
;****** ALWAYS CHECK BOT ON ANY BACKWARD-MOVING OPERATION*******
|
||
|
||
|
||
LSTFIL: SOSA TUBFIL(U) ;1 LESS FILE
|
||
NXTFIL: AOS TUBFIL(U) ;1 MORE FILE
|
||
SETZM TUBREC(U) ;AT ZEROTH RECORD
|
||
MOVSI T2,RB.STM ;TAPE MARK
|
||
IORM T2,TRBSTS(T1) ;FLAG IN IORB
|
||
POPJ P, ;AND RETURN
|
||
SUBTTL ENDING INTERRUPT PROCESSING OF A WRITE
|
||
|
||
TP1WT: PUSHJ P,STRDWT ;SETUP
|
||
TRNN T3,CI.CSR ;IS CSR FLAG UP?
|
||
JRST T1WTOK ;NO - OK
|
||
TLNN T3,(DS.UEX) ;UNIT EXCEPTION?
|
||
JRST ERRWT1 ;ERROR
|
||
MOVSI T2,RB.SET ;SET END OF TAPE BIT IN IORB
|
||
IORM T2,TRBSTS(T1) ; ...
|
||
TLNE T3,(DS.UCH!CS.DPE) ;UNIT CHECK
|
||
JRST ERRWT1 ;ERROR
|
||
|
||
T1WTOK: PUSHJ P,CHKRBC ;GET BYTE COUNT FROM THE RIGHT AREA
|
||
MOVE T2,XS.RBC(T2) ;GET COUNT FROM THERE
|
||
T1WOK2:
|
||
;**************PROBLEM***************
|
||
ADDM T2,TUBCWR(U) ;UPDATE STATS
|
||
ADDM T2,.CPTFO##
|
||
JRST DONE ;EXIT
|
||
|
||
;ERROR HANDLERS FOR WRITE AND WRITE LIKE OPERATIONS
|
||
|
||
ERRWT1: PUSHJ P,ERRANL ;ANALYZE SENSE BYTE 0 ETC
|
||
TLNN T4,(SB1WTL) ;WRITE LOCKED?
|
||
JRST DONE ;NO - TERMINATE
|
||
MOVSI T2,RB.SLK ;FLAG WRITE LOCK
|
||
IRBDON: IORM T2,TRBSTS(T1) ;IN IORB
|
||
JRST DONE ;TERMINATE
|
||
;COMMON CODE FROM READ AND WRITE INTERRRUPT ROUTINES
|
||
|
||
STRDWT: MOVE T2,TKBCNT(W) ;NUMBER OF RECS DONE THIS TIME
|
||
SOJLE T2,STRDW4 ;NOTHING FANCY IF ONLY 1
|
||
TRNN T3,CI.CSR ;MULTIPLE RECS, ANY ERRORS?
|
||
JRST STRDW5 ;NO, EXIT
|
||
|
||
;HERE IF THERE WAS AN ERROR ON SOME RECORD IN THE CHAIN
|
||
HRRO F,CP.ST2(T4) ;WHERE DX10 STOPPED
|
||
SUBI F,1 ;IT POINTS 1 PAST NEXT DEV COMMAND WORD
|
||
STRDW2: LDB T2,[POINT 9,(F),8] ;GET THE OP CODE
|
||
CAIN T2,<(CCHGO+CCHSAV)>/1000 ;IF A SAVE-WRDCNT WORD
|
||
AOJA F,STRDW2 ; IGNORE IT
|
||
LSH T2,-7 ;GET LEFTMOST 2 BITS
|
||
JUMPE T2,STRDW3 ;GO IF A JUMP-WORD
|
||
SOSN T2 ;IS IT A DEVICE-COMMAND WORD?
|
||
SOSA TKBCNT(W) ;YES, DECREMENT COUNT OF RECORDS
|
||
AOJA F,STRDW2 ;GO LOOK AT NEXT CHANNEL COMMAND
|
||
TLZN F,-1 ;1ST COMMAND AFTER ERROR RECORD?
|
||
AOJA F,STRDW2 ;NO, PROCEED
|
||
MOVSI T2,(CCHSTS) ;YES, CONVERT COMMAND TO HALT
|
||
DPB T2,[POINT 2,(F),1] ; SO IF WE RETRY WITH THIS LIST
|
||
IORM T2,(F) ; WE WILL ONLY WRITE 1 RECORD
|
||
AOJA F,STRDW2
|
||
STRDW3: HRRZ F,(F) ;JUMP-WORD, GET ITS ADDRESS
|
||
JUMPN F,STRDW2 ;CONTINUE IF NOT THE END
|
||
SOS T2,TKBCNT(W) ;DECR 1 FOR THE ERROR-RECORD
|
||
JUMPE T2,STRDW6 ;ERROR WAS ON 1ST REC IF 0
|
||
MOVEM T3,TUBCNI(U) ;SOME GOOD RECS - SAVE ERR STATUS
|
||
SETZ T3, ;PRETEND NO ERRORS FOR THIS BUNCH
|
||
MOVSI T2,RB.SEN ;TELL TAPUUO TO USE THE WORDCOUNT
|
||
IORM T2,TRBSTS(T1) ;; FROM THE USER'S BUFFER FOR ALL RECS
|
||
JRST STRDW5 ;UPDATE TUBREC AND EXIT
|
||
STRDW4: SKIPE CP.STS(T4) ;IS THERE AN EXTENDED STATUS AREA?
|
||
JRST STRDW5 ;YES, USE IT
|
||
HRLI T2,(-<CPSNSB>B<CPSBCP>)
|
||
HLLM T2,CP.STS(T4)
|
||
STRDW5: SKIPN T2,TKBCNT(W) ;GET NUMBER OF BLOCKS XFERRED
|
||
STRDW6: AOSA TUBREC(U) ;ERROR ON 1ST RECORD
|
||
ADDM T2,TUBREC(U) ;UPDATE UDB ACCORDINGLY
|
||
POPJ P, ;RETURN TO CALLER
|
||
SUBTTL ENDING INTERRUPT PROCESSING OF A BACKSPACE BLOCK
|
||
|
||
TP1BR: TRNN T3,CI.CSR ;CSR FLAG UP?
|
||
JRST T1BR2 ;NO - NOTHING SPECIAL
|
||
TLNN T3,(DS.UEX) ;UNIT EXCEPTION?
|
||
JRST T1BR1 ;UNIT CHECK
|
||
SETOM TUBREC(U) ;AT AN EOF
|
||
SOS TUBFIL(U) ;ONE FILE LESS
|
||
MOVSI T2,RB.STM ;SEEN TAPE MARK
|
||
JRST IRBDON ;SET BIT IN IORB AND DONE
|
||
|
||
T1BR1: TLNE T3,(DS.UCH) ;UNIT CHECK?
|
||
PUSHJ P,ITUCOK ;IS THIS UNIT CHECK OK?
|
||
JRST ERRRD1 ;TREAT AS READ ERROR
|
||
SKIPN TUBREC(U) ;PREVIOUSLY AT BOT?
|
||
SKIPE TUBFIL(U) ; ???
|
||
JRST T1BROK ;NO
|
||
PUSHJ P,SETBOT ;SET LOAD POINT
|
||
MOVSI T2,RB.SNM ;NM
|
||
JRST IRBDON ;STORE BIT IN IORB AND DONE
|
||
|
||
T1SROK: AOS TUBREC(U) ;INCREMENT POSITION
|
||
JRST RPTDON ;CHECK REPEAT
|
||
T1BR2: SOS TUBREC(U) ;DECREMENT POSITION
|
||
T1BROK: HRRZ T2,TUBFEP(U) ;OFFSET TO FINAL ERROR POINTER
|
||
ADD T2,U ;RELOCATE
|
||
MOVE T2,XS.S0(T2) ;FETCH SENSE BYTES 0 - 3
|
||
TLNN T2,(SB1BOT) ;LOAD POINT?
|
||
JRST RPTDON ;NO - ALL DONE BUT CHECK REPEAT
|
||
PUSHJ P,SETBOT ;FLAG AT BOT
|
||
JRST DONE ;LEAVE
|
||
SUBTTL ENDING INTERRUPT PROCESSING OF A WRITE TAPE MARK
|
||
|
||
TP1WTM: TRNN T3,CI.CSR ;CSR FLAG UP?
|
||
JRST INCFIL ;NO - WIN EASY
|
||
TLNN T3,(DS.UEX) ;UNIT EXCEPTION?
|
||
JRST ERRWT1 ;NO - UNIT CHECK OR SOME HORROR
|
||
MOVSI T2,RB.SET ;FLAG END OF TAPE
|
||
IORM T2,TRBSTS(T1) ;...
|
||
TLNE T3,(DS.UCH!CS.DPE) ;ALSO UNIT CHECK?
|
||
JRST ERRWT1 ;YES
|
||
INCFIL: SETZM TUBREC(U) ;AT ZEROTH RECORD
|
||
AOS TUBFIL(U) ;AND ONE MORE FILE
|
||
JRST DONE ;ALL DONE
|
||
SUBTTL ENDING INTERRUPT PROCESSING OF SKIP BLOCK
|
||
TP1SR: TRNN T3,CI.CSR ;CSR FLAG UP?
|
||
JRST T1SROK ;NO - ALL IS WELL
|
||
TLNN T3,(DS.UEX) ;UNIT EXCEPTION?
|
||
JRST ERRRD1 ;NO - MUST BE ERRORS
|
||
PUSHJ P,NXTFIL ;AT NEXT FILE
|
||
JRST DONE ;ALL DONE
|
||
SUBTTL ENDING INTERRUPT PROCESSING OF A FORWARD SKIP FILE
|
||
|
||
TP1SF: TLNE T3,(DS.UCH) ;SOME HORROR HAPPEN?
|
||
JRST ERRRD1 ;YES
|
||
PUSHJ P,NXTFIL ;AT NEXT FILE
|
||
JRST DONE
|
||
SUBTTL ENDING INTERRUPT PROCESSING OF A BACKSPACE FILE
|
||
|
||
TP1BF: TLNN T3,(DS.UCH) ;SOMETHING MIGHT BE WRONG?
|
||
JRST TP1BF2 ;NO
|
||
PUSHJ P,ITUCOK ;MAYBE IT'S OK
|
||
JRST ERRRD1 ;ERROR
|
||
SKIPN TUBFIL(U) ;SHOULD BE AT BOT
|
||
SKIPE TUBREC(U) ;ARE WE?
|
||
JRST TP1BF3 ;NO?
|
||
PUSHJ P,SETBOT ;SET AT BOT
|
||
MOVSI T2,RB.SNM ;NM
|
||
JRST IRBDON
|
||
|
||
TP1BF2: SOS TUBFIL(U) ;PREVIOUS
|
||
SETOM TUBREC(U) ;..
|
||
TP1BF3: PUSHJ P,ITUCOK ;CHECK FOR EXTENDED SENSE BYTES, ETC.
|
||
JRST RPTDON ;THERE ARE NONE
|
||
MOVE T4,XS.S0(T2) ;GET SENSE BYTE WORD
|
||
TLNN T4,(SB1BOT) ;LOAD POINT?
|
||
JRST RPTDON ;NO
|
||
PUSHJ P,SETBOT ;FLAG AT BOT
|
||
JRST DONE
|
||
SUBTTL ENDING INTERRUPT PROCESSING OF A REWIND
|
||
|
||
TP1RUN: MOVE T2,TKBCCL+5(W) ;SOFT ERROR COUNTER STORED BY DX10
|
||
ROT T2,-^D12
|
||
HRRZM T2,TUBSWE(U) ;SOFT WRITE ERROR COUNT
|
||
LSH T2,-^D24
|
||
MOVEM T2,TUBSRE(U) ;SOFT READ ERROR COUNT
|
||
SETZ T2, ;CAUSE CAIN TO FAIL
|
||
;FALL INTO TP1REW
|
||
|
||
TP1REW: TRNE T3,CI.CSR ;CSR FLAG UP?
|
||
JRST ERRREW ;YES - ERROR
|
||
CAIN T2,RB.FRW ;DONE IF REWIND AND UNLOAD
|
||
SKIPL CP.STS(T4) ;SEE IF THIS IS THE SENSE CMD
|
||
JRST T1RWOK ;ITS NOT - OK THEN
|
||
HRRZ T2,TUBFEP(U) ;OFFSET TO FINAL ERROR POINTER
|
||
ADD T2,U ;RELOCATE
|
||
MOVE T2,XS.S0(T2) ;FETCH SENSE BYTES 0 - 3
|
||
MOVSI T3,TUSWTL## ;WRITE LOCKED STATUS BIT
|
||
TLNE T2,(SB1WTL) ;WRITE LOCKED?
|
||
IORM T3,TUBSTS(U) ;YES, SET THE BIT
|
||
TLNN T2,(SB1WTL) ;ARE WE WRITE LOCKED
|
||
ANDCAM T3,TUBSTS(U) ;NO, CLEAR THE BIT
|
||
TLNE T2,(SB1BOT) ;ARE WE AT BOT ALREADY
|
||
JRST REWFIN ;YES- FINISH UP
|
||
MOVEI T1,CO.ILI!CO.STA!CO.CON+TAPCHN## ;NO - CONTINUE CHL PGM
|
||
PJRST RETZC ;TO DO REWIND
|
||
|
||
T1RWOK: MOVSI T2,TUSREW## ;INDICATE REWIND IN PROGRESS
|
||
IORM T2,TUBSTS(U)
|
||
PJRST DONE ;AND SIGNAL COMPLETION NOW
|
||
|
||
;HERE ON AN ERROR STARTING A REWIND OR REWIND AND UNLOAD.
|
||
;WE DO NOT HAVE THE LUXURY OF THE SENSE BYTES IN THESE CASES
|
||
|
||
ERRREW: MOVSI T2,RB.SED!RB.SNM!RB.SOL ;ERROR, NO MOTION, OFFLINE
|
||
IORM T2,TRBSTS(T1) ; FLAG
|
||
REWFIN: PUSHJ P,REWDON## ;CLR REW STATUS
|
||
JRST DONE
|
||
SUBTTL EIP OF DSE,ERB,YB
|
||
|
||
;ENDING INTERRUPT PROCESSING OF AN ERASE GAP
|
||
|
||
TP1ERG: TRNN T3,CI.CSR ;CSR FLAG UP?
|
||
JRST RPTDON ;NO - NO OTHER SIDE EFFECTS
|
||
TLNN T3,(DS.UEX) ;UNIT EXCEPTION?
|
||
JRST ERRWT1 ;NO - TRY WRITE ERROR ANALYSIS
|
||
MOVSI T2,RB.SET ;ELSE SAW END OF TAPE
|
||
IORM T2,TRBSTS(T1) ; ...
|
||
TLNE T3,(DS.UCH!CS.DPE) ;UNIT CHECK?
|
||
JRST ERRWT1 ;YES - ANALYZE
|
||
JRST RPTDON ;ELSE RPTDON
|
||
|
||
;ENDING INTERUPT OF DATA SECURITY ERASE
|
||
|
||
TP1DSE: TLNN T3,(DS.UCH) ;UNIT CHECK?
|
||
JRST DONE ;NO - OK
|
||
JRST ERROFL ;YES - OFFLINE THEN
|
||
SUBTTL RANDOM SMALL UTILITIES
|
||
|
||
;HERE TO CHECK IF REPEATED OP SHOULD RESTART OR TERMINATE
|
||
|
||
RPTDON: HRRZ T2,TRBXCW(T1) ;COUNT IS WHERE XFR LIST WOULD BE
|
||
SUBI T2,1 ;ONE LESS
|
||
HRRM T2,TRBXCW(T1) ;RESTORE
|
||
JUMPLE T2,DONE ;IF NO MORE TO DO, DONE
|
||
HLRZ T3,TRBSTS(T1) ;ANYTHING WRONG?
|
||
JUMPN T3,DONE ;WHICH FORCES TERMINATION
|
||
PUSHJ P,SETXSP ;SET UP XS AREA
|
||
MOVEI T1,CO.ILI!CO.STA!CO.CLR!CO.CON+TAPCHN## ;RESTART IO
|
||
RETZC: XCT KDBCNO(W)
|
||
RETZER: MOVEI T1,0 ;INDICATE ANOTHER INTERRUPT TO COME
|
||
POPJ P, ;RETURN TO TAPSER
|
||
|
||
;HERE WHEN A FATAL ERROR IS TO BE SIGNALED
|
||
|
||
FATAL: MOVSI T2,RB.SER!RB.SED ;NON REC + SOME ERROR
|
||
JRST IRBDON ;SET IN IORB, JOIN OTHER PROCESSING
|
||
|
||
;HERE TO CHECK IF THERE WAS A TRANSFER ACTIVE ON THE
|
||
;UDB POINTED TO BY TKBCUN
|
||
|
||
WATA: SKIPN U,@KDBCUN(W) ;GET CURRENT UDB POINTER
|
||
POPJ P, ;NONE ACTIVE
|
||
MOVSI T2,TKSSTD## ;SEE IF SELECTED
|
||
TDNE T2,TUBSTS(U) ; ...
|
||
AOS (P) ;YES - SKIP
|
||
POPJ P, ;NO - CAN'T BE ACTIVE
|
||
|
||
;HERE TO RESET THE INTERRUPT CAUSING BITS
|
||
|
||
CLRCHN: PUSH P,T1 ;BE TRANSPARENT
|
||
MOVE T1,KDBICP(W) ;GET ICPC ADDRESS
|
||
LSH T1,^D33-CO.ICP ;POSITION IN CONO
|
||
IORI T1,CO.UPE!CO.MPE!CO.NXM!CO.STA+TAPCHN## ;RESET
|
||
XCT KDBCNO(W) ;SEND TO THE DEVICE
|
||
PJRST TPOPJ## ;RESTORE T1
|
||
|
||
;HERE TO RESET THE ICPC AREA - PREPARE FOR IDLENESS
|
||
|
||
CLRICP: MOVE T4,KDBICP(W) ;GET ICPC BASE
|
||
SETZM CP.STS(T4) ;CLEAR XS POINTER
|
||
POPJ P, ;RETURN
|
||
|
||
;HERE TO SET BOT
|
||
|
||
SETBOT: MOVSI T2,RB.SBT ;SET BOT
|
||
IORM T2,TRBSTS(T1) ;IN IORB
|
||
PJRST UNIBOT## ;SET TUSBOT, CLEAR TUBREC,TUBFIL
|
||
;MICROPROCESSOR CONTROL RTNS
|
||
|
||
UPHALT: MOVEI T2,DO.UC0 ;SELECT CTL 0
|
||
PUSHJ P,UPRSEL ; ...
|
||
MOVEI T2,DU0HLT ;SET HALT
|
||
PJRST UPGO
|
||
|
||
UPSTRT: MOVEI T2,DO.UC1 ;SELECT CTL 1
|
||
PUSHJ P,UPRSEL ; ...
|
||
SETZ T2, ;BUILD ADDR
|
||
DPB T3,DOYU1A ; ...
|
||
XCT KDBDTO(W) ; SEND OUT
|
||
MOVEI T2,DO.UC0 ;SELECT CTL 0
|
||
PUSHJ P,UPRSEL ; ...
|
||
MOVEI T2,DU0CON ;SET CONTINUE
|
||
PJRST UPGO
|
||
|
||
;READ AN IBUS REGISTER
|
||
|
||
UPREAD: PUSHJ P,UPRSEL ;SELECT REGISTER
|
||
XCT KDBDTI(W) ;READ CONTENTS
|
||
POPJ P,
|
||
|
||
UPRSEL: TLOA T2,(DO.LRS) ;LOAD REG SELECT BIT
|
||
UPRES: MOVSI T2,(DO.RES) ;ISSUE RESET COMMAND
|
||
UPGO: XCT KDBDTO(W) ;SELECT REGISTER
|
||
POPJ P,
|
||
|
||
;READ UP MEMORY.
|
||
;ADDR IN T3, RESULT IN T2
|
||
|
||
UPMRD: MOVEI T2,DO.UC1 ;SELECT CTL 1
|
||
PUSHJ P,UPRSEL ; ...
|
||
MOVEI T2,0 ;BUILD ADDR
|
||
DPB T3,DOYU1A ; ...
|
||
XCT KDBDTO(W) ;SEND ADDR
|
||
MOVEI T2,DO.UC0 ;SEL CTL 0
|
||
PUSHJ P,UPRSEL ; ...
|
||
MOVEI T2,DU0EXM ;FORCE EXAMINE BIT
|
||
XCT KDBDTO(W) ;SEND OUT
|
||
XCT KDBDTI(W) ;GET DATA
|
||
LDB T2,DOYU0D ; ...
|
||
POPJ P,
|
||
;MORE SMALL UTILITIES
|
||
|
||
;CALL WITH IORB ADDR IN T1
|
||
;SKIP RETURNS END OF LIST IT T4
|
||
;NON SKIP RETURN IF NO LIST
|
||
|
||
GETEXL: LDB T2,PRBFCN## ;GET FUNCTION
|
||
SKIPL IOFTAB(T2) ;IS A DATA XFR LIST NEEDED?
|
||
POPJ P, ;NO - RETURN NON SKIP
|
||
HLRZ T4,TRBEXL(T1) ;GET END FROM IORB
|
||
JUMPN T4,CPOPJ1## ;SKIP RETURN
|
||
POPJ P,
|
||
|
||
;HERE TO COPY USEFUL THINGS INTO THE EXTENDED STATUS AREA
|
||
;ASSUMES T1=CONI
|
||
;EXITS WITH T4=ICPC; T3=CP.ST1,,RH(CONI)
|
||
|
||
SETXS: MOVE T4,KDBICP(W) ;GET ICPC
|
||
LDB T2,STYDAI ;GET THE UNIT NUMBER
|
||
SETZM U
|
||
CAIG T2,TX1HDN ;RANGE CHECK UNIT NUMBER
|
||
PUSHJ P,SETUDB## ;GET THE UDB
|
||
JRST SETXS1 ;UNKNOWN DRIVE
|
||
HRRZ T2,TUBFEP(U) ;GET FINAL ERROR POINTER
|
||
ADD T2,U ;OFFSET INTO UDB
|
||
MOVE T3,TKBCCL(W) ;GET CMD(S)
|
||
MOVEM T3,XS.CMD(T2)
|
||
MOVE T3,TKBCCL+1(W) ;...
|
||
MOVEM T3,XS.CM1(T2) ;STORE IN UDB STATUS
|
||
MOVE T3,CP.ST2(T4) ;GET CP.ST2
|
||
MOVEM T3,XS.ST2(T2) ;STORE
|
||
MOVE T3,CP.ST1(T4) ;GET CP.ST1
|
||
MOVEM T3,XS.ST1(T2) ;STORE
|
||
MOVEM T1,XS.CNI(T2) ;SAVE CONI
|
||
HRR T3,T1 ;ALSO IN RH(T3)
|
||
POPJ P,
|
||
SETXS1: CAILE T2,TX1HDN ;OUT OF RANGE?
|
||
POPJ P, ;GIVE UP
|
||
MOVE T1,BITTBL##(T2) ;GET ASSOCIATED BIT
|
||
PUSH P,T1 ;SAVE T1
|
||
TDNN T1,TX1IUM(W) ;WANT TO IGNORE THIS DRIVE?
|
||
PUSHJ P,TX1DC2 ;NO--BUT DOES DRIVE REALLY EXIST?
|
||
JRST SETXS2 ;DON'T TRY TO CONFIGURE THIS DRIVE
|
||
MOVE T1,(P) ;GET BIT BACK
|
||
IORM T1,TX1NUM(W) ;REMEMBER WHICH NEW DRIVE TO CONFIGURE
|
||
HRROS KDBNUM(W) ;FLAG IT FOR THE ONCE-A-SECOND CODE
|
||
SETXS2: HRROS TX1SUN(W) ;OK TO CHECK ANOTHER DRIVE NOW
|
||
POP P,(P) ;PHASE STACK
|
||
XCT KDBCNI(W) ;GET DEVICE STATUS BACK
|
||
MOVE T3,CP.ST1(T4) ;AND CP.ST1
|
||
POPJ P, ;AND RETURN
|
||
|
||
|
||
;HERE TO DETERMINE IF A UNIT CHECK IS OK.
|
||
;RETURNS SKIP IF OK.
|
||
|
||
ITUCOK: PUSHJ P,CHKXSP ;GET STATUS
|
||
JRST CPOPJ1## ;NONE
|
||
TLNN T4,(SB0!SB1TUB!SB1NC) ;CAUSES OF ERRORS
|
||
AOS (P) ;NOT A REAL ERROR
|
||
POPJ P, ;UNIT CHECK IS A REAL ERROR
|
||
;ROUTINE TO CLEAN UP XFER LIST
|
||
|
||
FXLST: PUSHJ P,GETEXL ;GET END OF XFER LIST IN T4
|
||
POPJ P, ;NO XFR LIST
|
||
SETZM (T4) ;RESTORE LAST WORD
|
||
MOVEI T4,0 ;CLEAR CHL JMP WORD
|
||
;AND FALL INTO EXLJMP
|
||
|
||
;ROUTINE TO FIXUP CHL JMP FOR DX10
|
||
;WILL CONVERT EITHER DIRECTION
|
||
;C(T4) := DESIRED LH
|
||
;T1 SAVED
|
||
|
||
EXLJMP: PUSH P,T1 ;SAVE T1
|
||
HRRZ T1,TRBXCW(T1) ;PNTR TO XFER LIST
|
||
JUMPE T1,TPOPJ##
|
||
EXLJM1: MOVE T2,3(T1) ;WORD TO CONSIDER
|
||
JUMPE T2,TPOPJ## ;ALL DONE IF ZERO
|
||
HLRZ T3,T2 ;ISOLATE LHS
|
||
SKIPE T3 ;OK IF ZERO
|
||
CAIN T3,(CCHJMP!CCHGO) ; OR IF CHL JMP
|
||
JRST EXLJM2 ;PROCESS JMP WORD
|
||
ADDI T1,4 ;ADVANCE TO NEXT BLOCK
|
||
JRST EXLJM1 ;TRY AGAIN
|
||
|
||
EXLJM2: HLLM T4,3(T1) ;CHANGE JMP WORD
|
||
HRRZ T1,T2 ;ADVANCE ALONG JMP
|
||
JRST EXLJM1 ;KEEP GOING
|
||
SUBTTL ERROR HANDLERS
|
||
|
||
ERRCH1: TRNN T1,7 ;CHECK PIA
|
||
JRST [MOVEI T1,CO.ILI!CO.UPE!CO.MPE!CO.NXM!CO.STA
|
||
XCT KDBCNO(W) ;CLEAR ERROR IF IN BOOTDX
|
||
JRST TPOPJ##] ;RETURN UP A LEVEL
|
||
JUMPN U,ERRCHT ;IF NO UNIT
|
||
SKIPN U,@KDBCUN(W) ;GET CURRENT UNIT
|
||
JRST ERRUPE ;BAIL OUT IF U=0
|
||
ERRCHT: TRNN T1,CI.UPE ;MICROPROCESSOR ERROR?
|
||
JRST ERRMEM ;NO - MEMORY ERROR OF SOME SORT
|
||
PUSHJ P,ERRUP1 ;LOG UP ERROR INFO
|
||
ERRUPE: PUSHJ P,UPRES ;HALT 8
|
||
PUSHJ P,UPHALT ;STOP UP
|
||
MOVE T1,KDBICP(W) ;RESET ICPC
|
||
LSH T1,^D33-CO.ICP ;CORRECT POSITION IN CONO
|
||
IORI T1,CO.UPE!CO.MPE!CO.NXM!CO.STA
|
||
XCT KDBCNO(W) ;OF MICROPROCESSOR
|
||
HLLZS @KDBCSO(W) ;REMOVE FROM INTERRUPT CHAIN
|
||
MOVSI T1,TKSOFL## ;MARK AS OFFLINE
|
||
IORM T1,TKBSTS(W) ; ...
|
||
JUMPE U,RETZER
|
||
PUSHJ P,ERRCHX ;CHECK ON XFER ACTIVE
|
||
JRST ERRUP2 ;LOG ERROR - AND RETURN ZERO
|
||
MOVSI T2,RB.SOL!RB.SMO ;INDICATE MONITOR DIRECTED OFF-LINE
|
||
IORM T2,TRBSTS(T1)
|
||
POPJ P, ;YES - RETURN IORB IN T1
|
||
|
||
;HERE TO CHECK ON ACTIVE XFER AND SET ERROR BITS IF SO
|
||
|
||
ERRCHX: PUSHJ P,WATA ;WAS A TRANSFER ACTIVE?
|
||
POPJ P, ;NO -EXIT
|
||
HRRZ T1,TUBQUE(U) ; ?
|
||
JUMPE T1,CPOPJ## ;NO ACTIVITY - EXIT
|
||
MOVSI T2,RB.SER!RB.SED ;NON REC + ERROR DETECTED
|
||
IORM T2,TRBSTS(T1) ;SET IN IORB
|
||
MOVSI T2,RB.EXC ;SET EXCEPTION ALSO HERE
|
||
IORM T2,TRBLNK(T1) ;...
|
||
PUSHJ P,GETEXL ;FIND END OF LIST
|
||
JRST CPOPJ1## ;SKIP RETURN
|
||
SETZM 0(T4) ;CLEAR IT
|
||
MOVEI T4,0 ;CLEAR JMPS
|
||
PUSHJ P,EXLJMP ;...
|
||
PJRST CPOPJ1## ;SKIP RETURN
|
||
;ROUTINE TO LOG MP ERRORS WHEN THERE ARE NO ACTIVE TRANSFERS
|
||
;C(U) :=UDB (PROBABLY UNIT 0, SINCE CP.ST1 IS ZERO)
|
||
;USE PROTOTYPE IF THERE IS NO DDB FOR THIS UNIT
|
||
ERRUP2: MOVSI T1,(1B1) ;MDO IS UNRECOVERABLE
|
||
IORM T1,TUBTRY(U) ;
|
||
MOVSI T1,TX1FST(U) ;COPY FROM "AT END"
|
||
HRRI T1,TX1IST(U) ; TO "AT ERROR"
|
||
BLT T1,TX1IST+TX1ELN-1(U) ; FOR SYSERR
|
||
SKIPN F,TUBCUR(U) ;IF DDB USE IT
|
||
XMOVEI F,TDVDDB## ;NO - USE PROTOTYPE
|
||
MOVEI T1,.ERTAP ;ERROR TYPE TO DAEMON
|
||
HRL T1,F ;DDB
|
||
PUSHJ P,DAEERR## ;TELL DAEMON
|
||
PJRST RETZER ;RETURN ZERO
|
||
;MEMORY ERRORS COME HERE
|
||
;C(T1) :=CONI
|
||
;C(U) :=UDB
|
||
|
||
ERRMEM: PUSHJ P,UPHALT ;STOP UPROCESSOR
|
||
PUSHJ P,RDIBUS ;STORE SOME IBUS REGISTERS
|
||
PUSHJ P,UPRES ;ISSUE RESET
|
||
MOVEI T3,UP.RA ;RESTART ADDR
|
||
PUSHJ P,UPSTRT ;START
|
||
PUSHJ P,CLRCHN ;RESET ICPC ETC.
|
||
PUSHJ P,SAVE3##
|
||
HRRZ T3,TUBFEP(U) ;PNTR TO EXTENDED
|
||
ADD T3,U ;STATUS AREA
|
||
MOVE P1,KDBCHN(W) ;GET CHAN DATA BLOCK
|
||
MOVE F,TUBCUR(U) ;GET DDB
|
||
MOVE P2,XS.CPC(T3) ;GET CPC
|
||
MOVE P3,XS.DAC(T3) ;GET DAC
|
||
MOVE T1,XS.CNI(T3) ;SEE IF NXM OR MPE
|
||
MOVEI T2,CHENXM## ;ROUTINE TO CALL
|
||
MOVSI T3,IOCHNX ;ASSUMING NXM
|
||
TRNE T1,CI.MPE ;UNLESS A MPE
|
||
MOVEI T2,CHEMPE## ; ...
|
||
TRNE T1,CI.MPE ; ...
|
||
MOVSI T3,IOCHMP ; ...
|
||
IORM T3,CHNNUM(P1) ;MARK MEMORY ERROR FOR LATER SWEEP
|
||
MOVE T1,T4 ;ICPC NEEDED IN T1
|
||
SKIPN TUBERR(U) ;CALL ERRCON ON FIRST ERROR ONLY
|
||
PUSHJ P,(T2) ;CALL
|
||
PUSHJ P,ERRCHX ;CHECK ACTIVE XFER
|
||
PJRST TPINT3 ;NO - EXIT
|
||
MOVSI T2,RB.SER ;UNCORRECTABLE ERROR
|
||
JRST IRBDON ;MARK IN IORB AND RETURN
|
||
|
||
;READ SOME IBUS REGISTERS AND STORE IN TUBFEP
|
||
;ENTER WITH T4 := ICPC ADDR
|
||
|
||
RDIBUS: PUSHJ P,SETXSP ;GET XS POINTER
|
||
MOVE T3,T2
|
||
PUSHJ P,RDCPCA ;GET CPC AND CPMA/CPMD
|
||
MOVEI T2,DO.DR ;GET DATA REGISTER 0-17
|
||
PUSHJ P,UPREAD ;IBUS 1
|
||
HRLZM T2,XS.DR(T3) ;STORE IT
|
||
MOVEI T2,DO.DR ;GET DATA REGISTER 18-35
|
||
PUSHJ P,UPREAD ;IBUS 1
|
||
HRRM T2,XS.DR(T3) ;STORE IT
|
||
MOVEI T2,DO.DAC ;GET DAC 18-35
|
||
PUSHJ P,UPREAD ;IBUS 12
|
||
HRRZM T2,XS.DAC(T3) ;STORE IT
|
||
MOVEI T2,DO.BCD ;GET DAC 14-17
|
||
PUSHJ P,UPREAD ;IBUS 0
|
||
ANDI T2,17 ;. . .
|
||
HRLM T2,XS.DAC(T3) ;STORE IT
|
||
MOVEI T2,DO.TAG ;GET TAG LINES
|
||
PUSHJ P,UPREAD ;IBUS 2
|
||
HRLZM T2,XS.TAG(T3) ;STORE IT
|
||
MOVEI T2,DO.BUS ;GET BUS LINES
|
||
PUSHJ P,UPREAD ;IBUS 3
|
||
HRRM T2,XS.TAG(T3) ;STORE IT
|
||
MOVEI T2,DO.MRL ;GET MR LOW
|
||
PUSHJ P,UPREAD ;IBUS 10
|
||
HRLZM T2,XS.MR1(T3) ;STORE IT
|
||
MOVEI T2,DO.MRH ;GET MR HIGH
|
||
PUSHJ P,UPREAD ;IBUS 11
|
||
HRRM T2,XS.MR1(T3) ;STORE IT
|
||
POPJ P,0 ;RETURN
|
||
;HERE ON MICRO-PROCESSOR ERRORS
|
||
;C(T1) :=CONI
|
||
;C(U) :=UDB
|
||
|
||
ERRUP1: TLNE T1,(CI.RUN) ;UP RUNNING ?
|
||
PUSHJ P,UPRES ;YES - RESET IT
|
||
PUSHJ P,UPHALT ;HALT IT
|
||
HRRZ T3,TUBFEP(U) ;GET XS POINTER
|
||
ADD T3,U ;OFFSET INTO UDB
|
||
PUSHJ P,RDCPCA ;GET CPC AND CPMA/CPMD
|
||
TLNE T1,(CI.RUN) ;WAS THE -8A RUNNING ?
|
||
POPJ P,0 ;YES - THEN WE ARE DONE
|
||
MOVE T1,T3 ;SAVE XS POINTER
|
||
MOVEI T3,5 ;READ -8A LOCATION 5
|
||
PUSHJ P,UPMRD ;
|
||
HRRM T2,XS.DIAG(T1) ;STORE DIAGNOSTIC ERROR CODE
|
||
POPJ P,0 ;RETURN
|
||
|
||
;HERE TO READ CPC AND CPMA/CPMD
|
||
;CALLED FOR MEMORY ERRORS AND UP ERRORS
|
||
;C(T3) :=XS POINTER
|
||
;DESTROYS T2
|
||
|
||
RDCPCA: MOVEI T2,DO.UC0 ;GET MEMORY DATA
|
||
PUSHJ P,UPREAD ;IBUS 4
|
||
HRRZM T2,XS.MD(T3) ;STORE IT
|
||
MOVEI T2,DO.UC1 ;GET MEMORY ADDRESS
|
||
PUSHJ P,UPREAD ;IBUS 5
|
||
HRLM T2,XS.MD(T3) ;STORE IT
|
||
MOVEI T2,DO.CPC ;GET LOW ORDER CPC
|
||
PUSHJ P,UPREAD ;IBUS 13
|
||
HRRZM T2,XS.CPC(T3) ;STORE IT
|
||
MOVEI T2,DO.BCD ;GET HIGH ORDER CPC
|
||
PUSHJ P,UPREAD ;IBUS 0
|
||
ANDI T2,17 ;MASK ADDRESS 14-17
|
||
HRLM T2,XS.CPC(T3) ;STORE IT
|
||
POPJ P,0 ;RETURN
|
||
;HERE ON SELECT ERROR OR SEQ ERROR
|
||
|
||
ERRCH2: LDB T2,STYTYP ;GET STATUS TYPE
|
||
TLNE T3,(CS.SLE) ;SELECTION ERROR
|
||
CAIN T2,CS.STI ;AND INITIAL SELECTION STATUS
|
||
JRST ERRUPE ;NO - SEQ ERR.
|
||
ERROFL: PUSHJ P,WATA ;WAS A TRANSFER ACTIVE
|
||
JRST TPINT3 ;NO - GO AWAY
|
||
PUSHJ P,CHKIRB## ;INSURE GOODNESS
|
||
JRST TAPDIS## ;NONE - DISMISS
|
||
ERROF1: MOVSI T2,TKSOFL##
|
||
IORM T2,TUBSTS(U) ;MARK UNIT OFF-LINE
|
||
MOVSI T2,RB.SER!RB.SED!RB.SOL!RB.SNM ;NON REC, ERR, OFL
|
||
JRST IRBDON ;LIGHT BITS IN IORB AND EXIT
|
||
|
||
;HERE ON INITIAL SELECTION STATUS
|
||
;C(T3) := STATUS WORD CP.ST1
|
||
|
||
ERRCH3: PUSHJ P,CHKIRB## ;BLESS QUEUE
|
||
JRST ERRCH4 ;NONE
|
||
MOVSI T2,RB.SNM ;NEVER MOVES TAPE
|
||
IORM T2,TRBSTS(T1) ;MARK IN IORB
|
||
TLNE T3,(CS.IOP) ;ILLEGAL OPERATION?
|
||
JRST ERRILG ;YES - GO HANDLE
|
||
PUSHJ P,CHKXSP ;ARE SENSE BYTES AVAILABLE?
|
||
JRST FATAL ;NO - NO DISTINCTION.
|
||
MOVE T3,T2 ;PUT IN T3
|
||
MOVE T2,XS.S0(T3) ;GET SB 0 - 3
|
||
TLNN T2,(SB1TUA) ;UNIT READY?
|
||
JRST ERROFL ;NO - FLAG AS OFFLINE
|
||
TLNN T2,(SB1WTL) ;WRITE LOCKED?
|
||
JRST FATAL ;NO
|
||
MOVSI T2,RB.SLK ;INDICATE IN IORB
|
||
IORM T2,TRBSTS(T1) ; ...
|
||
MOVSI T2,TUSWTL##
|
||
IORM T2,TUBSTS(U) ;AND IN TUB
|
||
JRST FATAL
|
||
ERRCH4: PUSHJ P,CLRSTA ;CLEAR STATUS AVAILABLE
|
||
PJRST TAPDIS## ;AND DISMISS
|
||
;ERROR ANALYSIS OF SENSE BYTE 0. THIS ANALYSIS IS THAT
|
||
;SUGGESTED BY IBM GA32-0020-3
|
||
|
||
ERRANL: PUSH P,T4 ;SAVE T4
|
||
PUSHJ P,CHKXSP ;GET XS AREA
|
||
JRST ERREQC ;NONE - CALL IT NON-RECOVERABLE
|
||
MOVE T4,XS.S0(T2) ;GET SB 0 - 3
|
||
SETZ T2, ;CLEAR OUT T2
|
||
TLNE T4,(SB0EQC) ;EQUIPMENT CHECK?
|
||
JRST ERREQC ;YES
|
||
TLNE T4,(SB0BOC) ;BUS OUT CHECK?
|
||
JRST ERRBOC ;YES
|
||
TLNE T4,(SB0IRQ) ;INTERVENTION REQUIRED?
|
||
JRST ERRIRQ ;YES - MAY CONTINUE ANALYSIS
|
||
ERRAN1: TLNE T4,(SB0CMR) ;COMMAND REJECT?
|
||
JRST ERRCMR ;YES
|
||
TLNE T4,(SB1NC) ;NOT CAPABLE?
|
||
JRST ERRNC ;YES
|
||
TLNE T4,(SB0OVR) ;OVERRUN?
|
||
JRST ERROVR ;YES
|
||
TLNE T4,(SB0DC) ;DATA CHECK?
|
||
JRST ERRDC ;YES
|
||
TLNE T3,(CS.DPE) ;DEVICE PAR ERR?
|
||
TLO T2,RB.SED ;YES - FLAG ERROR
|
||
|
||
SKIPN T2 ;ANYTHING?
|
||
;IF NOTHING, MAKE IT NON-RECOVERABLE
|
||
;COMMAND REJECT AND EQUIPMENT CHECK ARE CONSIDERED FATAL
|
||
;(NOT TO BE RETRIED) ERRORS.
|
||
|
||
ERRCMR:
|
||
ERREQC: MOVSI T2,RB.SER!RB.SED ;NON REC + ERROR
|
||
ERRXIT: MOVE F,TUBCUR(U) ;DDB
|
||
MOVE S,DEVIOS(F) ;S
|
||
TLNN S,IOSRTY## ;IF DX DID ERROR RECOVERY
|
||
TLO T2,RB.SER ; THEN THIS IS A HARD ERROR
|
||
IORM T2,TRBSTS(T1) ;SET DEV INDEP ERROR BITS
|
||
JRST T4POPJ## ;RESTO T4 AND RETURN
|
||
|
||
;BUS OUT CHECK WITHOUT DEV END MEANS NO TAPE MOTION
|
||
;OTHERWISE, RETRY
|
||
|
||
ERRBOC: TLNN T3,(DS.DVE) ;DEVICE END?
|
||
MOVSI T2,RB.SNM ;NO - DONT REPOSITION
|
||
TLO T2,RB.SED ;ERROR DETECTED
|
||
JRST ERRXIT
|
||
|
||
;INTERVENTION REQUIRED WITHOUT DEVICE END MEANS
|
||
;THE DEVICE IS OFFLINE OR NONEX
|
||
|
||
ERRIRQ: TLNE T3,(DS.DVE) ;DEVICE END?
|
||
JRST ERRAN1 ;YES - MORE ANALYSIS
|
||
MOVSI T2,RB.SOL!RB.SNM ;OFFLINE AND NO MOTION
|
||
JRST ERRXIT
|
||
|
||
;MORE OF SENSE BYTE 0 ANALYSIS
|
||
|
||
;OVERRUN SHOULD CAUSE REPOSITION AND RETRY
|
||
|
||
ERROVR: MOVSI T2,RB.SED ;WHICH IS WHAT NORMALLY HAPPENS
|
||
JRST ERRXIT ;ON AN ERROR
|
||
|
||
;DATA CHECK CALLS FORTH A RATHER ELABORATE RETRY PROCEDURE
|
||
|
||
ERRDC: MOVSI T2,RB.SED!RB.SDE ;ERROR + DATA ERROR
|
||
JRST ERRXIT ;SEE TAPSER
|
||
|
||
;NOT CAPABLE COMES UP READING 800 BPI ON TU72, DX10 HANGS ON 2ND INPUT
|
||
;TUBCNI IS CHECKED AT TX1SIO
|
||
|
||
ERRNC: MOVEM T3,TUBCNI(U) ;NO MORE IO FOR THIS TAPE
|
||
JRST ERRCMR ;FLAG IT
|
||
;DEVICE RESET - CALL HERE TO STOP A HUNG TRANSFER
|
||
TX1RES: MOVSI T1,TKSOFL## ;IS KON ALREADY OFFLINE?
|
||
TDNE T1,TKBSTS(W) ; ???
|
||
POPJ P, ;YES - RETURN
|
||
SETZ T1, ;DEAS PIA
|
||
XCT KDBCNO(W) ;...
|
||
PUSHJ P,UPHALT ;STOP UP
|
||
MOVE T4,KDBICP(W) ;SETUP T4 FOR RDIBUS
|
||
PUSHJ P,RDIBUS ;STORE IBUS REGS IN TUBFEP
|
||
PUSHJ P,UPRES ;RESET
|
||
HRRZ T1,TUBQUE(U) ;GET HEAD OF Q
|
||
SKIPE T1 ;OK IF NONE
|
||
PUSHJ P,FXLST ;FIX UP XFER LIST
|
||
MOVEI T3,UP.SA ;START UP
|
||
PUSHJ P,UPSTRT ; ...
|
||
PUSHJ P,CLRICP ;RESET ICPC AREA
|
||
PJRST CLRCHN ;SET ICPC AND INT CHANNEL
|
||
|
||
;TABLE OF LOCATIONS TO CHECK IN UCODE
|
||
|
||
UPMTAB: XWD 17,4756
|
||
XWD 200,5210
|
||
XWD 210,6007
|
||
XWD 211,3777
|
||
XWD 212,3774
|
||
XWD 215,6502
|
||
UPMTBL==.-UPMTAB
|
||
TX1CFG: XMOVEI T1,TX1MDT## ;MONGEN'ED DEVICE TABLE
|
||
XMOVEI T2,DEFMDT ;DEFAULT TABLE
|
||
MOVNI T3,1 ;NO MASSBUS UNIT OR DRIVE INFORMATION
|
||
MOVEI T4,MD.KON ;MATCH ON KONTROLLER DEFINITION
|
||
PUSHJ P,AUTMDT## ;SCAN THE TABLES
|
||
JRST CPOPJ1## ;NO MATCHES
|
||
PUSHJ P,SAVE2## ;SAVE P1-2
|
||
TRNN T1,-1 ;IF NO PORT INFO,
|
||
HRRI T1,-1 ;SETUP TO TRUST THE TX
|
||
MOVE P2,T1 ;SAVE MDT DATA WORD
|
||
MOVSI P1,-1 ;NOT MULTI-UNIT, DRIVE 0
|
||
MOVSI T1,CP.DX1 ;DX10 CHANNEL
|
||
PUSHJ P,AUTCHN## ;BUILD A CHANNEL DATA BLOCK
|
||
POPJ P, ;NO CORE
|
||
HLRZ T1,P1 ;NOT MULTI-UNIT, BUT MUST DO ANYWAY
|
||
PUSHJ P,AUTKDB## ;BUILD A KDB
|
||
POPJ P, ;GIVE UP IF NO CORE
|
||
PUSHJ P,TAPCSA## ;SET UP CSO CONI ADDRESS
|
||
PUSHJ P,TX1LOD ;LOAD THE MICROCODE
|
||
POPJ P, ;FAILED
|
||
SETOM TX1SUN(W) ;NOT SENSING NON-EXISTANT UNITS
|
||
|
||
TX1CF1: PUSHJ P,TX1DRV ;AUTOCONFIGURE A SINGLE DRIVE
|
||
JFCL ;IGNORE ERRORS
|
||
HRRZ T1,P1 ;GET DRIVE NUMBER
|
||
CAIGE T1,TX1HDN ;DONE ALL DRIVES?
|
||
AOJA P1,TX1CF1 ;LOOP BACK FOR MORE
|
||
POPJ P, ;ALL DONE WITH THIS CHANNEL
|
||
TX1DRV: PUSHJ P,TX1DCK ;CHECK FOR DRIVE EXISTANCE
|
||
JRST TX1DR4 ;NOT THERE
|
||
MOVE T1,TX1SNS+XS.S12(W) ;SENSE BYTES 12-15
|
||
TLZ T1,777600 ;ISOLATE BYTE 13 (HIGH BYTE OF TX UNIT S/N)
|
||
LSH T1,-14 ;ISOLATE BYTE 14 (LOW BYTE OF TX UNIT S/N)
|
||
SKIPN T1 ;HAVE A NON-ZERO S/N?
|
||
HRRZ T1,.CPDVC## ;USE DEVICE CODE
|
||
TRNN P1,TX1DMX/2 ;CU FOR LOW NUMBERED DRIVES?
|
||
MOVEM T1,KDBSER(W) ;YES
|
||
TRNE P1,TX1DMX/2 ;CU FOR HIGH NUMBERED DRIVES?
|
||
MOVEM T1,KDBSER+1(W) ;YES
|
||
MOVE T1,TX1SNS+XS.S16(W) ;SENSE BYTES 16-19
|
||
TLNN T1,(S172CH) ;TWO CHANNEL SWITCH CAPABILITY?
|
||
TLZ T1,(S17SWF) ;NO, STRIP PORT INFO
|
||
LDB T1,[POINTR (T1,S17SWF)] ;GET SWITCH FEATURES
|
||
ANDI T1,3 ;STRIP OFF HI/LO UNIT BIT
|
||
AOS T1 ;GET MAXIMUM NUMBER OF PORTS
|
||
LSH T1,1 ;ACCOUNT FOR A/B PATH PER TCU
|
||
CAILE T1,(P2) ;IF MDT KNOWS BETTER THAN WE DO,
|
||
HRRZ T1,P2 ;TRUST IT
|
||
DPB T1,[POINTR (KDBSTS(W),KD.MPT)] ;SAVE
|
||
MOVSI T2,(KD.MPD) ;GET A BIT
|
||
CAIE T1,1 ;IF MORE THAN ONE PATH,
|
||
IORM T2,KDBSTS(W) ;THEN SAY MULTI-PORTED DEVICE
|
||
|
||
TX1DR1: MOVSI T1,(SB5NSS) ;BIT TO TEST
|
||
TDNN T1,TX1SNS+XS.S4(W) ;NEW SUBSYSTEM?
|
||
JRST TX1DR2 ;MUST DUMMY UP S/N IF A TX01
|
||
MOVE T1,TX1SNS+XS.S12(W) ;SENSE BYTES 12-15
|
||
MOVE T2,TX1SNS+XS.S16(W) ;SENSE BYTES 16-19
|
||
LSH T1,-4 ;POSITION HIGH ORDER S/N BITS
|
||
ANDI T1,377 ;ISOLATE HIGH ORDER S/N BITS
|
||
LSHC T1,-34 ;MERGE HIGH AND LOW BITS
|
||
JUMPN T2,TX1DR3 ;CONTINUE IF S/N IS NON-ZERO
|
||
|
||
TX1DR2: MOVE T1,TX1SNS+XS.S12(W) ;SENSE BYTES 12-15
|
||
TLZ T1,777600 ;ISOLATE BYTE 13 (HIGH BYTE OF TX UNIT S/N)
|
||
LSH T1,-14 ;ISOLATE BYTE 14 (LOW BYTE OF TX UNIT S/N)
|
||
HRRZ T2,P1 ;MAKE WORD 2 = DRIVE NUMBER
|
||
|
||
TX1DR3: DMOVEM T1,.CPTSN## ;SAVE TEMPORARILY
|
||
HRRZ T3,P1 ;GET PHYSICAL DRIVE NUMBER
|
||
PUSHJ P,AUTDPU## ;LINK UP DUAL PORTED DRIVES
|
||
JFCL ;MUST PROCEED EVEN IF DUAL PORTED
|
||
MOVE T2,TX1SNS+XS.S4(W) ;SENSE BYTES 4-7
|
||
MOVEI T1,TUCD80##+TUCD16## ;ASSUME TU70
|
||
TLNE T2,(SB67TK) ;7 TRACK?
|
||
MOVEI T1,TUCD20##+TUCD55##+TUCD80##+TUC7TK##
|
||
TRNE T2,SB6D62 ;6250 DRIVE?
|
||
MOVEI T1,TUCD16##+TUCD62##
|
||
TRO T1,TUCIRD##+K.TX1 ;INCLUDE REWIND INTERRUPT AND KONT TYPE
|
||
MOVE T2,T1 ;COPY DRIVE INFO
|
||
HRLZ T1,P1 ;PHYSICAL DRIVE NUMBER
|
||
HRR T1,P1 ;UDB TABLE INDEX
|
||
XMOVEI T3,HNGTBL ;POINT TO HUNG TIMER TABLE
|
||
PUSHJ P,TAPDRV## ;BUILD AND LINK UP UDB AND DDB
|
||
JFCL ;FAILED
|
||
DMOVE T1,.CPTSN## ;RETRIEVE DRIVE SERIAL NUMBER
|
||
DMOVEM T1,UDBDSN(U) ;SAVE IN UDB
|
||
AOS (P) ;SUCCESS
|
||
|
||
TX1DR4: MOVEI T1,CO.ILI!CO.STA!CO.UPE ;CLEAR DX10
|
||
XCT KDBCNO(W) ;CLEAR STATUS AVAILABLE AND UP ERROR
|
||
POPJ P, ;AND RETURN
|
||
TX1DCK: HRRZ T1,P1 ;GET UNIT
|
||
MOVE T1,BITTBL##(T1) ;AND IT'S BIT
|
||
TDNE T1,TX1IUM(W) ;WANT TO IGNORE THIS DRIVE?
|
||
POPJ P, ;SAY IT DOESN'T EXIST
|
||
SETZM TX1SNS(W) ;CLEAR FIRST WORD
|
||
MOVEI T1,CPSNSW ;WORD COUNT
|
||
XMOVEI T2,TX1SNS(W) ;START OF SENSE BYTES
|
||
XMOVEI T3,TX1SNS+1(W) ;BLT POINTER
|
||
EXTEND T1,[XBLT] ;CLEAR SENSE BYTE STORAGE
|
||
XMOVEI T1,TKBCCL(W) ;POINT TO COMMAND BLOCK
|
||
MOVSI T3,200000 ;DEVICE COMMAND
|
||
TRO T3,30000(P1) ;NO-OP, DRIVE NUMBER
|
||
MOVEM T3,(T1) ;SAVE SENSE
|
||
MOVSI T3,(CCHSTS!CCHFRC) ;STORE STATUS, FORCE EXTENDED SENSE
|
||
MOVEM T3,1(T1) ;SECOND CHAN CONTROL WORD
|
||
SETZM 2(T1) ;MAKE SURE WE TERMINATE
|
||
MOVE T4,KDBICP(W) ;GET ICPC ADDR
|
||
XMOVEI T2,TX1SNS(W) ;SENSE BYTE STORAGE
|
||
PUSHJ P,MAPIT ;TRANSLATE TO PHYSICAL ADDRESS
|
||
TLO T2,(<-CPSNSB_<^D35-CPSBCP>>) ;NUMBER OF SENSE BYTES
|
||
MOVEM T2,CP.STS(T4) ;STORE IN ICPC AREA
|
||
XMOVEI T2,TKBCCL(W) ;BUILD INITIAL JUMP
|
||
PUSHJ P,MAPIT ;CONVERT TKBCCL TO A PHYSICAL ADDRESS
|
||
TLO T2,(CCHJMP!CCHGO) ;BUILD JUMP
|
||
MOVEM T2,(T4) ; ...
|
||
MOVE T1,KDBICP(W) ;GET ICPC ADDRS
|
||
LSH T1,^D33-CO.ICP ;POSITION
|
||
IORI T1,CO.CLR!CO.CON ;START THE SENSE
|
||
SKIPL TX1SUN(W) ;SENSING NON-EXISTANT UNITS?
|
||
TRO T1,TAPCHN## ;YES--WANT AN INTERRUPT WHEN COMPLETED
|
||
XCT KDBCNO(W) ;START THE SENSE OPERATION
|
||
SKIPL TX1SUN(W) ;DOING FULL AUTOCONFIGURE?
|
||
POPJ P, ;NO--NEVER WAIT
|
||
MOVEI T2,10000 ;HOW LONG TO WAIT
|
||
|
||
TX1DC1: XCT KDBCNI(W) ;CONI
|
||
TRNN T1,CI.STA ;STATUS AVAILABLE?
|
||
SOJG T2,TX1DC1 ;NO, WAIT SOME MORE
|
||
JUMPE T2,CPOPJ## ;NOT THERE
|
||
|
||
TX1DC2: MOVE T1,TX1SNS+XS.S0(W) ;SENSE BYTES 0-3
|
||
MOVE T2,TX1SNS+XS.S4(W) ;SENSE BYTES 4-7
|
||
TLNE T1,(SB1TUA+SB1TUB) ;DRIVE THERE?
|
||
JRST CPOPJ1## ;YES
|
||
HRRZ T1,P1 ;GET DRIVE NUMBER
|
||
SETCA T1,BITTBL##(T1) ;TRANSLATE DRIVE NUMBER TO A BIT
|
||
SETZ T2, ;ASSUME NO OTHER NEW DRIVES
|
||
SYSPIF ;AVOID RACE WITH INTERRUPT LEVEL
|
||
ANDB T1,TX1NUM(W) ;CLEAR SINCE DRIVE IS NO LONGER "NEW"
|
||
SKIPE T1 ;WORK PENDING FOR OTHER DRIVES?
|
||
MOVNI T2,1 ;YES
|
||
HLLM T2,KDBNUM(W) ;UPDATE FLAG
|
||
SYSPIN ;RELEASE INTERLOCK
|
||
XCT KDBCNI(W) ;READ DEVICE STATUS
|
||
TLNE T1,(CI.RUN) ;MICROPROCESSOR RUNNING?
|
||
POPJ P, ;RETURN
|
||
MOVEI T3,UP.RA ;RESTART ADDRESS
|
||
PUSHJ P,UPSTRT ;KICK START THE DX10
|
||
XCT KDBCNI(W) ;GET NEW CONI
|
||
POPJ P, ;AND RETURN
|
||
;ENABLE/DISABLE MICROCODE LOADING
|
||
TX1EDL: SE1ENT ;ENTER SECTION ONE
|
||
HRRZS W ;REMOVE JUNK IN LH
|
||
MOVE T2,T1 ;COPY BIT
|
||
XMOVEI T1,TX1ULB(W) ;POINT TO UCODE LOADER BLOCK IN KDB
|
||
PJRST BTUEDL## ;ENABLE OR DISABLE
|
||
;LOAD MICROCODE
|
||
TX1LOD: SE1ENT ;ENTER SECTION ONE
|
||
HRRZS W ;REMOVE JUNK IN LH
|
||
PUSHJ P,SAVE4## ;SAVE SOME ACS
|
||
XMOVEI P1,TX1ULB(W) ;POINT TO UCODE LOADER BLOCK IN KDB
|
||
MOVE T1,KDBDVC(W) ;GET DEVICE CODE
|
||
LSH T1,2 ;MAKE 9 BITS
|
||
HRLOM T1,.ULDEV(P1) ;SAVE
|
||
PUSHJ P,UPRES ;RESET THE DX10
|
||
PUSHJ P,UPHALT ;HALT IT TOO
|
||
MOVE T1,P1 ;POINT TO MICROCODE LOADER BLOCK
|
||
PUSHJ P,BTUCOD## ;FETCH WORD COUNT AND ADDRESS
|
||
PJRST LOAD6 ;NOT AVAILABLE
|
||
MOVEI P2,10000 ;SIZE OF PDP-8/A MEMORY
|
||
MOVSI P3,(<POINT 12,,>!1B12) ;2-WORD BYTE POINTER
|
||
MOVE P4,.ULADR(P1) ;GET ADDRESS OF MICROCODE
|
||
MOVE T2,[DO.LRS!DO.UC1] ;SELECT CPMA ON IBUS
|
||
XCT KDBDTO(W) ;DATAO
|
||
MOVEI T2,0 ;PDP-8/A ADDRESS 0
|
||
XCT KDBDTO(W) ;DATAO
|
||
MOVE T2,[DO.LRS!DO.UC0] ;SELECT PDP-8/A CONTROL REGISTER
|
||
XCT KDBDTO(W) ;DATAO
|
||
|
||
LOAD1: ILDB T2,P3 ;GET A BYTE
|
||
TRO T2,DU0WRT ;ENABLE DEPOSIT
|
||
XCT KDBDTO(W) ;DEPOSIT
|
||
SOJG P2,LOAD1 ;LOOP
|
||
MOVE T2,[DO.LRS!DO.UC1] ;SELECT CPMA ON IBUS
|
||
XCT KDBDTO(W) ;DATAO
|
||
MOVEI T2,LOCMAG ;MAGIC PDP-8/A ADDRESS
|
||
XCT KDBDTO(W) ;DATAO
|
||
MOVE T2,[DO.LRS!DO.UC0] ;SELECT PDP-8/A CONTROL REGISTER
|
||
XCT KDBDTO(W) ;DATAO
|
||
MOVEI T2,DXMAG!DU0WRT ;GET MAGIC CONSTANT AND ENABLE DEPOSIT
|
||
XCT KDBDTO(W) ;DATAO
|
||
|
||
; THE DX10 IS NOW LOADED
|
||
LOAD2: MOVEI T1,CI.UPE!CI.MPE!CI.NXM!CI.STA ;BITS WHICH CAUSE INTS
|
||
HRRM T1,@KDBCSO(W) ;STORE IN SKIP CHAIN
|
||
XCT KDBCNI(W) ;GET CONI
|
||
PUSHJ P,UPRES ;RESET
|
||
PUSHJ P,UPHALT ;SET HALT BIT
|
||
MOVSI T4,-UPMTBL ;NO - SEE IF MAGIC LOCS OK.
|
||
LOAD3: HLRZ T3,UPMTAB(T4) ;GET ADDRESS
|
||
PUSHJ P,UPMRD ;READ CONTENTS
|
||
HRRZ T3,UPMTAB(T4) ;GET EXPECTED CONTENTS
|
||
CAME T2,T3 ;SAME?
|
||
JRST LOAD4 ;NO - LEAVE HALTED
|
||
AOBJN T4,LOAD3 ;YES - TRY NEXT ONE
|
||
MOVEI T3,UP.SA ;START UP
|
||
PUSHJ P,UPSTRT ; ...
|
||
PUSHJ P,CLRICP ;RESET ICPC AREA
|
||
PUSHJ P,CLRCHN ;SET ICPC AND INT CHANNEL
|
||
XCT KDBCNI(W) ;CONI
|
||
TLNE T1,(CI.RUN) ;RUNNING?
|
||
JRST LOAD5 ;YES
|
||
LOAD4: MOVEI T1,.UEMPC ;CALL IT A MICROPROCESSOR CHECK
|
||
DPB T1,ULBEBP## ;STORE
|
||
SKIPA ;ONWARD
|
||
LOAD5: AOS (P) ;SKIP
|
||
LOAD6: MOVE T1,P1 ;POINT TO MICROCODE LOADER BLOCK
|
||
PJRST BTURPT## ;REPORT LOAD SUCESS OR FAILURE AND RETURN
|
||
SUBTTL START IO
|
||
;CALL HERE WHEN IO IS TO BE STARTED. THE USER JOB MUST BE LOCKED
|
||
TX1SIO: SKIPN TUBCNI(U) ;ERROR ON LAST GLUMP OF RECORDS?
|
||
JRST SIO0 ;NO
|
||
MOVEI T1,CO.ILI!CO.SRQ+TAPCHN##
|
||
XCT KDBCNO(W) ;YES, JUST FAKE AN INTERRUPT
|
||
POPJ P,
|
||
SIO0: MOVSI T2,TUSWTL## ;CLEAR WRITE-LOCK
|
||
ANDCAM T2,TUBSTS(U) ;WILL SET IF WE REALLY ARE
|
||
MOVE T4,KDBICP(W) ;GET ICPC ADDR
|
||
PUSHJ P,SETXSP ;SETUP EXTENDED STATUS
|
||
MOVSI T2,(CCHJMP!CCHGO) ;BUILD JUMP
|
||
MOVEM T2,(T4) ; ...
|
||
XMOVEI T2,TKBCCL(W) ;GET COMMAND LIST ADDRESS
|
||
PUSHJ P,MAPIT ;CONVERT TO PHYSICAL ADDRESS
|
||
DPB T2,CHYADR ;STORE IN COMMAND
|
||
XMOVEI T4,TKBCCL(W) ;MOVE TO CCW LIST
|
||
SETZM (T4) ;CLEAR WORD
|
||
LDB T2,PRBFCN## ;CHECK ODDBALL
|
||
SKIPN IOFTAB(T2) ;CHECK LEGAL FCN
|
||
JRST ERRILG ;NO - SET ILLEGAL
|
||
PUSHJ P,INSMOD ;BUILD SET MODE IF NEEDED
|
||
AOJ T4, ;BUMP POINTER
|
||
SETZM (T4) ;CLEAR WORD
|
||
PUSHJ P,INSSPC ;CALL EXIT ROUTINE IF NEEDED
|
||
PUSHJ P,INSDVC ;BUILD DEVICE COMMAND
|
||
AOJ T4, ;BUMP POINTER
|
||
SETZM (T4) ;CLEAR WORD
|
||
PUSH P,T4 ;SAVE EOL
|
||
PUSHJ P,GETEXL ;GET END OF XFR LIST
|
||
JRST SIO1 ;NO LIST PRESENT
|
||
EXCH T4,(P) ;SAVE END OF LIST AND RESTORE CURRENT CCW LIST PTR
|
||
HRRZ T2,TRBXCW(T1) ;GET XFR LIST ADDR
|
||
DPB T2,CHYADR ;STORE IN COMMAND
|
||
MOVSI T2,(CCHJMP!CCHGO) ;BUILD JUMP
|
||
IORM T2,(T4) ; ...
|
||
MOVSI T4,(CCHJMP!CCHGO) ;DESIRED LHS
|
||
PUSHJ P,EXLJMP ;BUILD JMPS
|
||
MOVE T4,(P) ;RESTORE END OF XFR LIST
|
||
SIO1: MOVSI T2,(CCHSTS) ;STORE STATUS
|
||
HLLZ T3,TUBSTS(U) ;GET STATUS
|
||
HRR T3,TUBCNF(U) ;AND CONFIG INFO
|
||
TDNN T3,[TUSBOT##,,TUCSNS##] ;AT BOT OR FORCED USER SENSE?
|
||
JRST SIO2 ;NO - SKIP
|
||
LDB T3,PRBFCN## ;GET FUNCTION
|
||
CAIE T3,RB.FRW ;IS IT A REW?
|
||
CAIN T3,RB.FRU ;...
|
||
JRST SIO2 ;REW/UNL - NO SENSE
|
||
TLO T2,(CCHFRC) ;OK - SET FORCE SENSE
|
||
SIO2: IORM T2,(T4) ;AND HALT
|
||
MOVE T1,KDBICP(W) ;GET ICPC ADDRS
|
||
LSH T1,^D33-CO.ICP ;POSITION
|
||
IORI T1,CO.CLR!CO.CON+TAPCHN## ;START THE IO
|
||
XCT KDBCNO(W) ; ...
|
||
JRST T2POPJ## ;REMOVE JUNK FROM PDL AND RETURN
|
||
|
||
;HERE ON ILLEGAL FUNCTION
|
||
ERRILG: MOVSI T2,RB.SIL!RB.SER!RB.SNM ; SET COND BITS
|
||
JRST IRBDON ;SET IN IORB, EXIT WITH ERROR
|
||
;ROUTINE TO CONVERT A VIRTUAL ADDRESS TO A PHYSICAL ADDRESS
|
||
;ENTER WITH T2=VIRTUAL ADDRESS, EXIT WITH PHYSICAL ADDRESS
|
||
MAPIT: MAP T2,(T2) ;DX10 WANTS A PHYSICAL ADDRESS
|
||
TLZ T2,(MP.NAD)
|
||
POPJ P,
|
||
|
||
;HERE TO BUILD A SET MODE CCW IF ONE IS NEEDED
|
||
;RETURNS NON SKIP IF A COMMAND WAS INSERTED, SKIP IF NONE NEEDED
|
||
|
||
INSMOD: MOVEI T2,TUC7TK## ;SEVEN TRACK?
|
||
TDNN T2,TUBCNF(U) ;??
|
||
JRST INSMD9 ;NO - GO DO 9 TRACK
|
||
LDB T2,PRBFCN## ;SEE IF MODE SET IS NEEDED
|
||
MOVSI T3,(IOFMS7) ;...
|
||
TDNN T3,IOFTAB(T2) ;...
|
||
JRST CPOPJ1## ;NO - RETURN SKIP
|
||
LDB T2,PRBDEN## ;GET DENSITY
|
||
CAILE T2,RB.D8 ;HIGHER THAN 800?
|
||
MOVEI T2,RB.D8 ;YES - LOWER TO 800
|
||
DPB T2,PRBDEN## ;SAVE SELECTED DENSITY
|
||
MOVE T3,SM7DEN(T2) ;GET DEV CMD FOR THAT DENSITY
|
||
MOVSI T2,RB.PAR ;CHECK PARITY
|
||
TDNN T2,TRBLNK(T1) ; ...
|
||
IORI T3,MS1ODD ;ODD PARITY
|
||
DPB T3,CDYDCR ;SET DCR
|
||
JRST INSDC1 ;EXIT BUILDING DEV CMD
|
||
|
||
INSMD9: LDB T2,PRBFCN## ;CHECK IF MODE SET NEEDED
|
||
MOVSI T3,(IOFMS9) ; ...
|
||
TDNN T3,IOFTAB(T2) ; ...
|
||
JRST CPOPJ1## ;NONE NEEDED - SKIP RETURN
|
||
MOVSI T2,TUSBOT## ;SEE IF AT BOT
|
||
TDNN T2,TUBSTS(U) ;??
|
||
JRST CPOPJ1## ;NO - NO MODE SET NECESSARY
|
||
LDB T2,PRBDEN## ;GET DENSITY
|
||
CAIGE T2,RB.D8 ;LOWER THAN 800?
|
||
MOVEI T2,RB.D8 ;YES - RAISE TO 800
|
||
CAILE T2,RB.D62 ;.GT. MAX?
|
||
MOVEI T2,RB.D62 ;YES - SET TO MAX (6250)
|
||
DPB T2,PRBDEN## ;SAVE SELECTED DENSITY
|
||
SUBI T2,RB.D8 ;TABLE BEGINS AT 800
|
||
MOVE T2,SM9DEN(T2) ;GET APPROPRIATE MODE SET
|
||
DPB T2,CDYDCR ;SET DCR IN CCW
|
||
JRST INSDC1 ;EXIT FINISHING COMMAND
|
||
;HERE TO INSERT THE DEVICE CONTROL CCW CORRESOPNDING TO THE
|
||
;IORB FUNCTION AND MODE
|
||
|
||
INSDVC: MOVSI T3,(CCDIGN+CCDISL+CCDREC+CCDAER) ;NOT RH20 + NO SHORT
|
||
; LENGTH ERRORS + READ SOFT ERROR COUNT
|
||
; + AUTOMATIC ERROR RETRIES
|
||
SKIPN TUBFIL(U) ;SITTING AT FILE 0
|
||
SKIPE TUBREC(U) ; AND RECORD 0 (BOT)?
|
||
CAIA ;NO, LEAVE RETRY BIT ALONE
|
||
TLO S,IOSRTY## ;DIABLE DX10 RETRIES (IT MISSES ERRORS)
|
||
PUSHJ P,STORS7## ;MAKE BIT AVAILABLE AT INTERRUPT EXIT
|
||
TLNE S,IOSRTY## ;DID USER REQUEST NO RETRIES?
|
||
TLZ T3,(CCDAER) ;THEN DISABLE DX10 AUTOMATIC RETRY
|
||
MOVEM T3,(T4)
|
||
LDB T3,PRBFCN## ;GET FUNCTION
|
||
MOVE T3,IOFTAB(T3) ;GET HARDWARE FCN
|
||
DPB T3,CDYDCR ;STORE DEVICE COMMAND
|
||
JUMPGE T3,INSDC1 ;JUMP IF NO MODE NEEDED
|
||
LDB T2,PRBMOD## ;GET IORB MODE
|
||
MOVE T2,IOMTAB(T2) ;TRANSLATE TO WHAT THE HDW WANTS
|
||
DPB T2,CDYMOD ;STORE
|
||
INSDC1: MOVEI T2,CCODVC ;DEVICE CONTROL OP
|
||
DPB T2,CCYOP ;STORE IN CCW
|
||
MOVE T2,UDBPDN(U) ;PHYSICAL DRIVE NUMBER
|
||
DPB T2,CDYDAD ;STORE
|
||
TLNE T3,(IOFAC) ;IS THERE ANOTHER COMMAND ALREADY SET UP?
|
||
ADDI T4,1 ;YES, POINT PAST IT
|
||
POPJ P,
|
||
|
||
;HERE TO SETUP CP.STS. SOME COMMANDS CANNOT REQUEST XS.
|
||
;CALL WITH T4 POINTING TO THE ICPC, T1 POINTING TO AN IORB
|
||
;RETURN WITH T2 POINTING TO THE (VIRTUAL ADDRESS OF) EXTENDED
|
||
;STATUS AREA IN THE UDB
|
||
SETXSP: HRRZ T2,TUBFEP(U) ;GET SENSE INFO ADDR
|
||
ADD T2,U ;RELOCATE
|
||
PUSH P,T2 ;PRESERVE VIRTUAL ADDRESS
|
||
PUSHJ P,MAPIT ;CONVERT TO PHYSICAL ADDRESS
|
||
TLO T2,(<-CPSNSB>B<CPSBCP>) ;NUMBER OF SENSE BYTES
|
||
MOVEM T2,CP.STS(T4) ;STORE IN ICPC AREA
|
||
JRST T2POPJ ;RESTORE T2 AND RETURN
|
||
|
||
|
||
;HERE TO CHECK POINTER TO EXTENDED STATUS AREA OR BYTE COUNT.
|
||
;ENTER WITH T4 POINTING TO ICP. EXIT WITH T2=POINTER TO EXTENDED
|
||
;STATUS AREA IF IT EXISTS, OTHERWISE WITH BYTE COUNT
|
||
|
||
CHKRBC: SKIPA T2,[SKIPGE T2,CP.RBC(T4)] ;CHECKING ON CP.RBC POSITIVE
|
||
CHKXSP: MOVE T2,[SKIPL T2,CP.STS(T4)] ;CHECKING ON CP.STS NEGATIVE
|
||
XCT T2 ;DO THE RIGHT CHECK
|
||
SOS (P) ;PROPER NON-SKIP RETURN
|
||
JUMPGE T2,CPOPJ1## ;GIVE IT IF NO MORE TO GET
|
||
HRR T2,TUBFEP(U) ;ELSE GET VIRTUAL POINTER
|
||
ADD T2,U ;TO XS AREA
|
||
JRST CPOPJ1## ;DONE
|
||
|
||
|
||
;HERE TO ZERO THE EXTENDED STATUS AREA
|
||
;PRESERVES T1
|
||
|
||
CLRXS: PUSH P,T1 ;SAVE T1
|
||
HLRE T1,TUBFEP(U) ;-LENGTH
|
||
MOVNS T1 ;MAKE POSITIVE
|
||
HRRZ T2,TUBFEP(U) ;START OF AREA
|
||
MOVEI T3,1(T2) ;START OF AREA PLUS ONE
|
||
ADD T2,U ;RELOCATE START
|
||
ADD T3,U ;COMPLETE BLT POINTER
|
||
SETZM (T2) ;CLEAR FIRST WORD
|
||
EXTEND T1,[XBLT] ;ZERO EXTENDED SENSE AREA
|
||
POP P,T1 ;RESTORE T1
|
||
POPJ P, ;DONE
|
||
;HERE TO CALL AN EXIT ROUTINE FOR THOSE WIERD COMMANDS THAT
|
||
;REQUIRE ONE.
|
||
|
||
INSSPC: LDB T2,PRBFCN## ;GET FUNCTION
|
||
LDB T2,IOYXR ;GET XR FIELD
|
||
JUMPE T2,CPOPJ## ;NONE REQUIRED
|
||
PUSHJ P,@IOXTAB(T2) ;CALL EXIT RTN
|
||
AOJ T4, ;MOVE ALONG IN CCW LIST
|
||
SETZM (T4) ;CLEAR NEW WORD
|
||
POPJ P,
|
||
|
||
;EXIT ROUTINE FOR DATA SECURITY ERASE. DSE MUST BE COMMAND CHAINED
|
||
;TO AN ERASE GAP.
|
||
|
||
INSDSE: HRRZ T2,RB.FLG+IOFTAB ;GET DEVICE COMMAND FOR ERASE GAP
|
||
DPB T2,CDYDCR ;SET DEV COMMAND
|
||
PJRST INSDC1 ;COMPLTE DEVICE COMMAND
|
||
;RETURN AND INSERT DSE ITSELF
|
||
|
||
;HERE TO DO SETUP FOR CORRECTION READ. THIS INVOLVES TRANSFERRING
|
||
;THE TRACK IN ERROR BYTE BACK TO THE CONTROLLER AND THEN DOING
|
||
;THE READ. THIS REQUIRES WE SETUP A DATA TRANSFER FOR THE
|
||
;TIE BYTE.
|
||
|
||
;*****TEST SOME BIT SOMEWHERE, DONT DO IF TU4-COMPAT*****
|
||
|
||
INSCR: MOVEI T2,33 ;TRACK IN ERROR DEV COMMAND
|
||
DPB T2,CDYDCR ;SET DCR
|
||
PUSHJ P,INSDC1 ;FINISH COMMAND
|
||
AOJ T4, ;NEXT WORD IN CCW LIST
|
||
SETZM (T4) ; ...
|
||
MOVEI T2,CCODAT ;DATA XFR COMMAND
|
||
DPB T2,CCYOP ;STORE
|
||
MOVNI T2,1 ;BYTE COUNT
|
||
DPB T2,CXYCNT ;STORE
|
||
XMOVEI T2,TX1TMP(W) ;WHERE TIE BYTE WILL BE
|
||
PUSHJ P,MAPIT ;TRANSLATE TO PHYSICAL ADDRESS
|
||
DPB T2,CXYADR ;STORE IN CCW
|
||
HRRZ T2,TUBFEP(U) ;GET TIE BYTE
|
||
ADD T2,U ;RELOCATE
|
||
LDB T2,XSYSB2 ;THE BYTE
|
||
ROT T2,-10 ;POSITION AT START OF WORD
|
||
MOVEM T2,TX1TMP(W) ;STORE
|
||
POPJ P,
|
||
;EXIT ROUTINE FOR REWIND. WE WILL ATTEMPT TO DO A NO-OP FOLLOWED
|
||
;BY A FORCED STORE STATUS CMD. THIS WILL ALLOW US TO SEE IF THE
|
||
;DRIVE IS WRITE-LOCKED OR ALREADY AT BOT...
|
||
|
||
INSRW: MOVEI T2,3 ;NO-OP
|
||
DPB T2,CDYDCR ;SET DCR
|
||
PUSHJ P,INSDC1 ;FINISH COMMAND
|
||
MOVSI T2,(CCHSTS!CCHFRC) ;FORCE STATUS AND HALT
|
||
MOVEM T2,1(T4) ;STORE IN NEXT LOC
|
||
AOJA T4,CPOPJ## ;BUMP T4 AND GENERATE THE REW COMMAND
|
||
|
||
;EXIT ROUTINE FOR REWIND/UNLOAD
|
||
INSRUN: XMOVEI T2,TKBCCL+5(W) ;WHERE TO STORE THE COUNTER
|
||
PUSHJ P,MAPIT ;CONVERT TO PHYSICAL ADDRESS
|
||
TLO T2,700000 ;DATA COMMAND
|
||
MOVEM T2,1(T4) ;TELL THE DX10 TO READ ERROR COUNTER
|
||
JRST CPOPJ1##
|
||
|
||
;ROUTINE TO ALLOW DMS ON WRITE FOR FAULT INSERTION
|
||
|
||
INSDMS: MOVEI T2,TUCDMS## ;BIT TO TEST
|
||
TDNN T2,TUBCNF(U) ;WANT DMS?
|
||
JRST CPOPJ1## ;NO-SKIP RETURN
|
||
|
||
MOVEI T2,13 ;FCN DMS (0B)
|
||
DPB T2,CDYDCR ;SET IN DCR
|
||
PJRST INSDC1 ;FINISH CMD
|
||
|
||
;TABLE OF EXIT ROUTINES
|
||
|
||
IOXTAB: PHASE 0
|
||
IFIW -1 ;ILLEGAL
|
||
XDSE:! IFIW INSDSE ;DSE EXIT
|
||
XCR:! IFIW INSCR ;CR EXIT
|
||
XRW:! IFIW INSRW ;REWIND EXIT
|
||
XRUN:! IFIW INSRUN ;UNLOAD EXIT
|
||
XWRT:! IFIW INSDMS ;INSERT DIAG MODE SET
|
||
DEPHASE
|
||
;TABLES FOR VARIOUS TRANSLATIONS
|
||
|
||
;TABLE TO TRANSLATE FROM THE MODE IN THE IORB TO
|
||
;THE MODE WANTED BY THE HARDWARE
|
||
|
||
IOMTAB: EXP -1 ;0 IS ILLEGAL
|
||
EXP 0 ;CORE DUMP
|
||
EXP 1 ;BYTE
|
||
EXP 3 ;SIXBIT
|
||
EXP 2 ;SEVEN BIT (MAVELOUS ASCII)
|
||
EXP 3 ;SEVEN TRACK CORE DUMP
|
||
IOMTMX==.-IOMTAB-1
|
||
|
||
;TABLES FOR BUILDING MODE SET COMMANDS
|
||
|
||
SM7DEN: EXP -1 ;0 IS ILLEGAL
|
||
EXP 043 ;200 BPI
|
||
EXP 143 ;556 BPI
|
||
EXP 243 ;800 BPI
|
||
|
||
SM9DEN: EXP 313 ;800 BPI NRZI
|
||
EXP 303 ;1600 BPI PE
|
||
EXP 323 ;6250 BPI GCR
|
||
SM9DMX==.-SM9DEN-1 ;LARGEST RELATIVE ENTRY
|
||
|
||
|
||
;HUNG TIMER TABLE
|
||
EXP ^D320 ;MAXIMUM TIMEOUT VALUE
|
||
HNGTBL: BYTE(9) ^D000,^D031,^D031,^D031 ;IL,RD,WT,RB
|
||
BYTE(9) ^D031,^D031,^D320,^D320 ;SR,BR,SF,BF
|
||
BYTE(9) ^D031,^D320,^D090,^D090 ;LG,SE,RW,RU
|
||
BYTE(9) ^D031,^D031,^D031,^D031 ;TM,YB,CR,RL
|
||
;MACRO TO BUILD TABLE ENTRIES IN IOFTAB
|
||
|
||
DEFINE OP(HEX,FLGS,XR<0>)<
|
||
.XCREF
|
||
..T==0
|
||
IRPC HEX,<
|
||
IFGE "HEX"-"A",<..T==..T*^D16+^D10+"HEX"-"A">
|
||
IFLE "HEX"-"9",<..T==..T*^D16+"HEX"-"0">
|
||
>
|
||
EXP FLGS+<XR>B<IOFXRP>+..T
|
||
.CREF
|
||
>
|
||
|
||
|
||
;FLAGS IN IOFTAB
|
||
|
||
IOFDXP==0 ;1 IF A DATA XFR LIST IS NEEDED
|
||
IOFDX==1B<IOFDXP>
|
||
IOFXSP==1 ;1 IF EXTENDED STATUS SHOULD BE REQUESTED
|
||
IOFXS==1B<IOFXSP>
|
||
IOFM7P==2 ;1 IF MODE SET NEEDED ON 7 TRACK
|
||
IOFMS7==1B<IOFM7P>
|
||
IOFM9P==3 ;1 IF MODE SET NEEDED ON 9 TRACK
|
||
IOFMS9==1B<IOFM9P>
|
||
IOFACF==4 ;1 IF ANOTHER COMMAND FOLLOWS THIS ONE (AND IS ALREADY SET UP)
|
||
IOFAC==1B<IOFACF>
|
||
IOFXRP==^D17 ;POSITION OF EXIT ROUTINE BYTE
|
||
IOFXRS==3 ;SIZE
|
||
|
||
IOYXR: POINT IOFXRS,IOFTAB(T2),IOFXRP ;BYTE POINTER
|
||
|
||
;TABLE TO GET DEVICE COMMAND CODES FROM IORB FUNCTON CODES.
|
||
;BIT 0 IS ON IF A DATA XFER LIST IS NEEDED BY THE FUNCTION.
|
||
|
||
IOFTAB: 0 ;ILLEGAL
|
||
OP(02,IOFDX+IOFXS+IOFMS7) ;1 - FORWARD READ
|
||
OP(01,IOFDX+IOFXS+IOFMS7+IOFMS9,XWRT) ;2 - FORWARD WRITE
|
||
OP(0C,IOFDX+IOFXS+IOFMS7) ;3 - READ BACKWARDS
|
||
OP(37,IOFXS+IOFMS7) ;4 - FORWARD SPACE BLOCK
|
||
OP(27,IOFXS+IOFMS7) ;5 - BACKSPACE BLOCK
|
||
OP(3F,IOFXS+IOFMS7) ;6 - FORWARD SPACE FILE
|
||
OP(2F,IOFXS+IOFMS7) ;7 - BACKSPACE FILE
|
||
OP(17,IOFXS+IOFMS7+IOFMS9) ;10 - ERASE GAP
|
||
OP(97,IOFXS,XDSE) ;11 - DATA SECURITY ERASE
|
||
OP(07,IOFXS,XRW) ;12 - REWIND
|
||
OP(0F,IOFXS+IOFAC,XRUN) ;13 - REWIND / UNLOAD
|
||
OP(1F,IOFXS+IOFMS7+IOFMS9) ;14 - WRITE TAPE MARK
|
||
0 ;15 - ILLEGAL
|
||
OP(02,IOFDX+IOFXS+IOFMS7,XCR) ;16 - CORRECTION READ
|
||
OP(02,IOFDX+IOFXS+IOFMS7) ;17 - READ LOW THRESHOLD
|
||
IOFTMX==.-IOFTAB-1
|
||
SUBTTL CHECK FOR KONTROLLER BUSY
|
||
|
||
|
||
;CHECK FOR KONTROLLER BUSY
|
||
;CALL: MOVE W, KDB ADDRESS
|
||
; MOVE U, UDB FOR DRIVE TRYING TO SCHEDULE
|
||
; PUSHJ P,TX1BSY
|
||
; <NON-SKIP> ;BUSY
|
||
; <SKIP> ;NOT-BUSY
|
||
;
|
||
;USES T1 AND T2
|
||
|
||
TX1BSY: PUSHJ P,SAVE2## ;SAVE P1 AND P2
|
||
PUSH P,U ;SAVE U
|
||
MOVE P1,KDBIUN(W) ;POINT TO START OF DRIVE TABLE
|
||
MOVSI P2,-<TX1DMX/2> ;ACTUAL RANGE OF DRIVES PER KONT
|
||
MOVE T1,UDBPDN(U) ;GET PHYSICAL DRIVE NUMBER
|
||
TRZ T1,<TX1DMX/2>-1 ;MASK OUT DRIVE LEAVING KONTROLLER OFFSET
|
||
ADDI P1,(T1) ;ADJUST STARTING TABLE INDEX
|
||
|
||
TX1BS1: SKIPE U,(P1) ;GET A TUB ADDRESS
|
||
PUSHJ P,CHKIRB## ;SEE IF IT HAS A VALID IORB
|
||
JRST TX1BS2 ;TRY ANOTHER DRIVE
|
||
LDB T2,PRBFCN## ;GET FUNCTION CODE
|
||
MOVE T2,BITTBL## ;NOT PICK UP THE ASSOCIATED BIT
|
||
TDNN T2,TX1NBF ;NON-BLOCKING FUNCTION?
|
||
POPJ P, ;NO--KONT IS BUSY
|
||
|
||
TX1BS2: AOBJN P2,TX1BS1 ;LOOP BACK IF MORE DRIVES TO CHECK
|
||
JRST UPOPJ1## ;RESTORE U AND RETURN KONT NOT BUSY
|
||
SUBTTL ONL AND CMD ENTRIES
|
||
|
||
;HERE TO CHECK IF THE CONTROLLER WHOSE KDB IS IN W
|
||
;IS ON LINE. IF SO, SKIP.
|
||
|
||
TX1ONL: XCT KDBCNI(W) ;GET CONI
|
||
TLNN T1,(CI.RUN) ;UP RUNNING?
|
||
POPJ P, ;NO - NON SKIP
|
||
SKIPL @KDBCHN(W) ;CHANNEL BUSY?
|
||
JRST CPOPJ1## ;LEAVE IT ALONE
|
||
SKIPE T1,TX1NUM(W) ;GET BIT MASK
|
||
JFFO T1,TX1ON3 ;FIND FIRST UNIT NUMBER
|
||
HRRZS KDBNUM(W) ;INDICATE NO DRIVES TO CONFIGURE
|
||
SKIPL T1,TX1SUN(W) ;GET NON-EXISTANT UNIT BEING SENSED
|
||
JRST CPOPJ1## ;DO NOTHING IF SENSE IN PROGRESS
|
||
PUSHJ P,SAVE1## ;SAVE P1
|
||
AOS T1 ;ADVANCE TO NEXT UNIT
|
||
HRRZS T1 ;CLEAR LH FLAG
|
||
CAILE T1,TX1HDN ;OVERFLOW?
|
||
MOVEI T1,0 ;START WITH DRIVE ZERO
|
||
ADD T1,KDBIUN(W) ;INDEX INTO TABLE
|
||
|
||
TX1ON1: SKIPN (T1) ;KNOWN UNIT?
|
||
JRST TX1ON2 ;NO
|
||
CAMGE T1,KDBFUN(W) ;END OF TABLE?
|
||
AOJA T1,TX1ON1 ;TRY ANOTHER
|
||
SETOM TX1SUN(W) ;RESET COUNTER
|
||
JRST CPOPJ1## ;AND INDICATE CONTROLLER ONLINE
|
||
|
||
TX1ON2: SUB T1,KDBIUN(W) ;REDUCE TO A DRIVE NUMBER
|
||
MOVEM T1,TX1SUN(W) ;SAVE FOR NEXT TIME
|
||
HRRO P1,T1 ;GET MASSBUS UNIT (NONE),,DRIVE NUMBER
|
||
PUSHJ P,TX1DCK ;QUEUE UP SENSE REQUEST
|
||
JFCL ;SHOULD NEVER SKIP
|
||
JRST CPOPJ1## ;RETURN
|
||
|
||
TX1ON3: PUSHJ P,AUTLOK## ;GET AUTCON INTERLOCK
|
||
JRST CPOPJ1## ;TRY AGAIN NEXT TIME
|
||
HRRO P1,T2 ;GET MASSBUS UNIT (NONE),,DRIVE NUMBER
|
||
MOVE T1,KDBDVC(W) ;DEVICE CODE
|
||
XMOVEI T2,TX1DSP ;DISPATCH
|
||
MOVE T3,KDBCHN(W) ;CHANNEL DATA BLOCK
|
||
PUSHJ P,AUTSET## ;SET UP CPU VARIABLES
|
||
PUSHJ P,TX1DRV ;TRY TO CONFIGURE A DRIVE
|
||
JFCL ;IGNORE ERRORS
|
||
PUSHJ P,AUTULK## ;RELEASE AUTCON INTERLOCK
|
||
JRST CPOPJ1## ;TELL TAPSER THE CONTROLLER IS ALIVE
|
||
|
||
|
||
;HERE TO FINISH OFF THIS COMMAND OR START A NEW ONE
|
||
;T2 POSITIVE TO INSERT DEVICE COMMAND FOR NEW OPERATION
|
||
; LH(P2)=LOC OF IORB
|
||
;T2 NEGATIVE TO FINISH THIS COMMAND (SET FOR STORE WRDCNT)
|
||
; LH(P2)=LOC OF MAPPED IOWD
|
||
|
||
TX1CMD: PUSHJ P,SAVT## ;SAVE ALL REGISTERS
|
||
JUMPL T2,TX1CM1
|
||
PUSH P,U ;SAVE U
|
||
SETZ U, ;IT ISNT AN RH20
|
||
PUSHJ P,CHKMOR## ;GET IOWD SPACE
|
||
PJRST UPOPJ##
|
||
POP P,U
|
||
HLRZ T1,P2 ;YES, RESTORE L(IORB)
|
||
HRRZ T4,P1
|
||
PUSHJ P,INSDVC ;GO OR THE DEV COMMAND INTO THE LIST
|
||
AOBJN P1,CPOPJ1## ;COUNT THE WORD AND RETURN
|
||
JRST CPOPJ1##
|
||
|
||
TX1CM1: MOVEI T2,<(CCHGO+CCHSAV)>/100
|
||
HLRZ T1,P2
|
||
DPB T2,[POINT 12,(T1),11]
|
||
POPJ P,
|
||
|
||
;HERE TO CAUSE AN INTERRUPT ON THE DEVICE TO FORCE A SCHEDULE
|
||
;CYCLE
|
||
|
||
TX1SCH: MOVEI T1,CO.ILI!CO.SRQ+TAPCHN## ;REQUEST STATUS
|
||
XCT KDBCNO(W)
|
||
POPJ P,
|
||
|
||
|
||
TX1END: END
|