1
0
mirror of https://github.com/PDP-10/stacken.git synced 2026-03-01 01:19:17 +00:00
Files
Lars Brinkhoff 6e18f5ebef Extract files from tape images.
Some tapes could not be extracted.
2021-01-29 10:47:33 +01:00

499 lines
15 KiB
Plaintext
Raw Permalink 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.
TITLE DCRSER - CARD READER SERVICE FOR MULTIPLE RSX20F CARD READERS - V021
SUBTTL S. PAAVOLA 23 AUG 88
SEARCH F,S,DEVPRM,DTEPRM
$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
; 1977,1978,1979,1980,1982,1984,1986,1988.
;ALL RIGHTS RESERVED.
.CPYRT<1977,1988>
XP VDCRSR,021 ;DEFINE GLOBAL VERSION NUMBER FOR LOADER MAP
PRMMIN==016 ;DTEPRM MUST BE AT LEAST THIS RECENT
IFL VDTPRM-PRMMIN,<PRINTX ?PLEASE USE LATEST VERSION OF DTEPRM
PASS2
END>
DCRSER::ENTRY DCRSER
SUBTTL SYMBOL DEFINITIONS
;COLUMN 1 SPECIAL CARD CODES
COD029==5252 ;12-0-2-4-6-8
COD026==4242 ;12-2-4-8
CODEOF==7400 ;12-11-0-1
NEWEOF==0017 ;6-7-8-9
;DEVICE DEPENDENT BITS IN LEFT HALF OF DEVIOS
CR026==400 ;SET WHEN 026 TRANSLATION TO BE MADE
CRTRBL==4000 ;TROUBLE NOTICED AT INTERRUPT LEVEL
;DEVICE DEPENDENT BITS IN RIGHT HALF OF DEVIOS
SPIMBT==1B29 ;IO STATUS BIT FOR SUPER-IMAGE MODE
;BUFFER SIZES
ASBFSZ==^D18 ;BUFFER SIZE FOR ASCII MODE
BIBFSZ==^D27 ;BUFFER SIZE FOR BINARY MODE
IMBFSZ==^D28 ;BUFFER SIZE FOR IMAGE MODE
SIBFSZ==^D41 ;BUFFER SIZE FOR SUPER-IMAGE MODE
;CDR SPECIFIC STATUS BITS FROM RSX-20F
CR.RCK==1 ;READ (PHOTO) CHECK
CR.PCK==2 ;PICK CHECK
CR.SCK==4 ;STACKER CHECK
CR.HEM==10 ;HOPPER EMPTY
CR.SFL==20 ;STACKER FULL
;STATUS BITS REQUIRING OPERATOR INTERVENTION
CR.OFL==CR.RCK!CR.PCK!CR.SCK!CR.HEM!CR.SFL
SUBTTL AUTOCONFIGURE
;DRIVER CHARARCTERISTICS
; DCR = DCRCNF
; CDR = CARD READER
; 7 = MAXIMUM DEVICES IN SYSTEM
; 0 = KONTROLLER TYPE
; 0 = MAXIMUM DRIVES PER KONTROLLER
; 0 = HIGHEST DRIVE NUMBER ON KONTROLLER
; MDSEC0 = SECTION FOR KDB/UDB
; MDSEC0 = SECTION FOR DDB
DRVCHR (DCR,CDR,7,0,0,0,MDSEC0,MDSEC0,<DR.GCC!DR.NET>)
.ORG DEVLSD
DCRDUX:! BLOCK 1 ;UNIT,,DTE
DCRCDN:! BLOCK 1 ;CPU,,DTE NUMBERS
DCRCNT:! BLOCK 1 ;CARD COUNT
DCRBUF:! BLOCK ^D40 ;BUFFER FOR READING A CARD
DCRLEN:! ;LENGTH OF DTE PRINTER DDB
.ORG
$LOW
DCRDDB: DDBBEG (DCR,DCRLEN)
SETWRD (DEVCHR,<2*HUNGST,,>) ;DEVCHR
SETWRD (DEVSER,<EXP DCRDSP>) ;DEVSER
SETWRD (DEVMOD,<DVCDR+DVIN,,14403>) ;DEVMOD
SETWRD (DEVSPL,<<.TYCDR*.TYEST>!.SPCDR,,0>) ;DEVSPL
SETWRD (DEVHCW,<INSVL.(.HCT20,HC.TYP)>) ;DEVHCW
DDBEND
$HIGH
EQUATE (LOCAL,0,<DCRCKT,DCRICD,DCRICL,DCRINT,DCRKDB,DCRKLN,DCRUDB,DCRULN>)
EQUATE (LOCAL,0,<DCRULB,DCRULP>)
DCRDSX: DRVDSP (DCR,0,DCRDDB,DCRLEN,URDDIA##)
;DEFAULT MONGEN'ED DEVICE TABLE
DEFMDT: MDKL10 (7,200,0,0,<MD.KON>) ;DEVICE CODE 200
MDKL10 (7,204,0,0,<MD.KON>) ;DEVICE CODE 204
MDKL10 (7,210,0,0,<MD.KON>) ;DEVICE CODE 210
MDKL10 (7,214,0,0,<MD.KON>) ;DEVICE CODE 214
EXP 0
DCRCFG: XMOVEI T1,DCRMDT## ;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
MOVE T1,.CPCPN## ;OUR CPU NUMBER
HRRZ F,DTEMAS##(T1) ;FETCH MASTER DTE
LDB T1,[POINT 7,ETDCNI(F),9] ;GET DTE NUMBER
HRRZ T2,.CPDVC## ;AND DEVICE BEING CONFIGURED
CAIE T1,(T2) ;DOING THE MASTER DTE?
JRST CPOPJ1## ;NO
MOVSI T1,(ED.PPC) ;BIT TO TEST
TDNE T1,ETDSTS(F) ;PRIMARY PROTOCOL RUNNING?
PJRST DCRRDS ;YES--CAN REQUEST DEVICE STATUS DIRECTLY
XMOVEI T1,DCRRDS ;ROUTINE TO REQUEST DEVICE STATUS
MOVEI T2,1 ;WAIT FOR PRIMARY PROTOCOL TO START
PUSHJ P,AUTCLK## ;QUEUE UP A CLOCK REQUEST
JRST CPOPJ1## ;MAYBE OTHER DTE-BASED DEVICES EXIST
;HERE WHILE PRIMARY PROTOCOL IS RUNNING TO REQUEST DEVICE STATUS
DCRRDS: PUSHJ P,SAVE4## ;SAVE SOME ACS
MOVE T1,.CPCPN## ;OUR CPU NUMBER
HRRZ F,DTEMAS##(T1) ;FETCH MASTER DTE
LOAD. P1,ED.DTN,(F) ;GET MASTER DTE NUMBER
HRL P1,.CPCPN## ;INCLUDE OUR CPU NUMBER
MOVE P2,[.EMCDR,,.EMRDS] ;FE DEVICE CODE,,FUNCTION CODE
SETZ P3, ;START WITH UNIT ZERO
DCRRD1: HRRI P3,2 ;TWO BYTES
MOVE P4,[POINT 8,P3,9] ;BYTE POINTER TO UNIT NUMBER
SETZ S, ;NO POST ADDRESS
S0PSHJ DTEQUE## ;QUEUE UP REQUEST FOR DEVICE STATUS
JFCL ;SHOULDN'T FAIL
AOBJN P3,.+1 ;ADVANCE UNIT NUMBER
TLNN P3,-1-DCRMAX##+1 ;OVERFLOW?
JRST DCRRD1 ;LOOP BACK FOR MORE
JRST CPOPJ1## ;MAYBE OTHER DTE-BASED DEVICES EXIST
;HERE WHILE PROCESSING A DEVICE STATUS MESSAGE FOR A PREVIOUSLY
;UNKNOWN DTE-BASED DEVICE TO ACTUALLY BUILD THE DTE DEVICE DATA BASE
;P1 - P4 SETUP WITH DEVICE STATUS MESSAGE POINTERS
DCRDTS: SE1ENT ;ENTER SECTION ONE
PUSHJ P,AUTLOK## ;INTERLOCK THE DATA BASE
JRST [PUSHJ P,DCRRDS ;BUSY & INTERRUPT LEVEL--TRY AGAIN LATER
JFCL ;WILL MOST LIKELY SKIP
POPJ P,] ;CALL THIS A FAILURE
PUSH P,F ;SAVE DDB ADDRESS OR ZERO
MOVE T1,.CPCPN## ;OUR CPU NUMBER
HRRZ F,DTEMAS##(T1) ;AND THE MASTER ETD FOR THIS CPU
LDB T1,[POINT 7,ETDCNI(F),9] ;DEVICE CODE
XMOVEI T2,DCRDSX ;DRIVER DISPATCH
SETZ T3, ;NO CHANNEL
PUSHJ P,AUTSET## ;SET UP AUTCON CALLS
POP P,F ;GET FLAG BACK
JUMPN F,DCRDT1 ;JUMP IF A KNOWN DEVICE
PUSHJ P,AUTADN## ;ALLOCATE A DEVICE NUMBER
HRLI T1,'CDR' ;INCLUDE GENERIC DEVICE NAME
SETZ T2, ;LOCAL DEVICE
PUSHJ P,AUTDDB## ;CREATE A DDB
JRST [PUSHJ P,AUTULK## ;NO CORE
PJRST AUTDDN##] ;DEALLOCATE DEVICE NUMBER
DCRDT1: MOVEM P1,DCRCDN(F) ;SAVE CPU,,DTE NUMBER
HRLM P3,DCRDUX(F) ;SAVE FE UNIT (LINE) NUMBER
HRRM P1,DCRDUX(F) ;SAVE DTE NUMBER (HISTORICAL)
XMOVEI T1,DCRMDT## ;POINT TO MONGEN'ED DEVICE TABLE
XMOVEI T2,DEFMDT ;GET DEVICE CODES FROM THE DEFAULT TABLE
HRLO T3,P3 ;USE FE UNIT FOR UNIT NUMBER
SETZ T4, ;IGNORE FLAGS
PUSHJ P,AUTMDT## ;SEE IF WE HAVE DATA
JRST DCRDT2 ;THERE IS NONE
;ADD FUTURE MDT VALUE TESTS HERE
DCRDT2: PUSHJ P,AUTULK## ;RELEASE INTERLOCK
JRST CPOPJ1## ;RETURN
SUBTTL DISPATCH TABLES
;DTESER DISPATCH TABLE FOR CDR
IFIW CPOPJ## ;(-1) LOST TO-10 INDIRECT MESSAGE
FCRDSP::DTEFNC ;(??) GENERATE DUMMY TABLE ENTRIES
DTEFNC (STR,F11STR) ;(03) TAKE STRING DATA
DTEFNC (HDS,F11DVS) ;(07) TAKE DEVICE STATUS
;UUOCON DISPATCH TABLE
JRST DCROFL ;OFFLINE CHECK
JRST ECOD2## ;SPECIAL ERROR STATUS
JRST DCRBSZ ;GET BUFFER SIZE
JRST DCRINI ;INITIALIZATION
JRST DCRHNG ;HUNG DEVICE
DCRDSP::JRST DCRREL ;RELEASE
JRST ILLOUT## ;OUTPUT CLOSE
JRST ILLOUT## ;OUTPUT
JRST DCRINP ;INPUT
SUBTTL INITIALIZATION AND SOME SMALL ROUTINES
;INITIALIZATION
DCRINI: MOVEI T1,DCRCNT ;OFFSET TO CARDS READ
SKIPN CDROCR## ;ALREADY SET?
MOVEM T1,CDROCR## ;SAVE FOR GETTABS
POPJ P,
;BUFFER SIZE SETUP ROUTINE - CALLED DURING INIT UUO.
DCRBSZ: MOVEI T1,ASBFSZ ;ASSUME ASCII
TRNN M,10 ;IS IT AN ASCII MODE?
JRST DCRBSR ;YES
MOVEI T1,BIBFSZ ;NO, ASSUME BINARY
TRNE M,4 ;IS IT BINARY?
JRST DCRBSR ;YES
MOVEI T1,IMBFSZ ;NO, MUST BE IMAGE MODE
TRNE M,1B29 ;SUPER IMAGE MODE?
MOVEI T1,SIBFSZ ;YES, 40 WORDS OF DATA
POPJ P, ;DONE
DCRBSR: TRZ M,1B29 ;SUPER-IMAGE MODE NOT ALLOWED
POPJ P, ;DONE
;HUNG DEVICE TIMEOUT
DCRHNG: TLO S,CRTRBL ;GOT TROUBLE
PUSHJ P,DCRREL ;DO THE RELEASE CODE
AOS (P) ;SKIP RETURN TO AVOID HUNG MESSAGE
PJRST DEVERR## ;TELL OPERATOR
;RELEASE
DCRREL: PUSHJ P,SETIOD## ;START UP THE USER
PUSHJ P,RTEVM## ;RETURN ANY EVM
JRST CLRACT## ;CLEAR IO ACTIVE AND RETURN
;OFF-LINE CHECK
DCROFL: MOVEI T1,EM.OFL!EM.NXD ;OFF LINE BITS
TDNN T1,DEVSTS(F) ;STILL THERE
AOS (P) ;NO, GOOD RETURN
POPJ P, ;RETURN
SUBTTL INPUT UUO
;HERE ON AN INPUT UUO
DCRINP: PUSHJ P,SAVE4## ;SAVE P1-P4
DCRGO: MOVEI T1,EM.OFL!EM.NXD ;GET OFF-LINE BIT
TLZN S,CRTRBL ;TROUBLE FROM INTERRUPT LEVEL?
TDNE T1,DEVSTS(F) ; OR DEVICE OFF-LINE?
JRST TKUSER ;YES, TELL USER
TLZN S,IOBEG ;FIRST TIME HERE?
JRST DCRIN1 ;NO, SKIP FIRST TIME STUFF
TLZ S,CR026 ;YES, TURN OFF 026 MODE
MOVSI T2,PCDRAS## ;ASCII BYTE POINTER
TRNE S,10 ;IN ASCII MODE?
MOVSI T2,PCDRBI## ;NO, BYTE POINTER FOR BINARY OR IMAGE
MOVEM T2,DEVPTR(F) ;SET BYTE POINTER INTO DDB
DCRIN1: PUSHJ P,NEWBUF## ;INITIALIZE NEW BUFFER
JRST ADRERR## ;ADDRESS ERROR
MOVE P1,DCRCDN(F) ;PICK UP CPU#,,DTE#
MOVE P2,[.EMCDR,,.EMACK] ;START A CARD FEEDING
HRRI P3,2 ;ONLY THE LINE NUMBER AS DATA
MOVE P4,[POINT 8,P3,9] ;LINE NUMBER IS IN P3
MOVEM S,DEVIOS(F) ;SAVE S
SETZM S ;NO POST PROCESSING FOR THIS MESSAGE
PUSHJ P,DTEQUE## ;QUEUE THE REQUEST
JRST TKUSER ;ERROR, GO TELL USER
MOVE S,DEVIOS(F) ;GET BACK S
TRO S,IOACT ;SET IO ACTIVE
SETZM P3 ;ZERO THE BYTE COUNT IF AT INTERRUPT LEVEL
PJRST STOIOS## ;SAVE S AND RETURN
;HERE ON OFF-LINE CARD READER
TKUSER: MOVEM S,DEVIOS(F) ;SAVE DEVIOS FOR USER
HRRZ T2,DEVBUF(F) ;ADR OF BUFFER HEADER
EXCTUX <HRRZ T1,@T2> ;CURRENT USER BUFFER
PUSHJ P,UADRCK## ;ADDRESS CHECK IT
EXCTUX <SKIPGE @T1> ;ANY DATA THERE?
PJRST RTEVM## ;YES, RETURN IT TO USER
PUSHJ P,HNGSTP## ;NOTIFY OPERATOR
JRST DCRGO ;TRY AGAIN
SUBTTL STRING INPUT
;HERE FROM DTESER ON STRING INPUT FROM THE 11
F11STR: PUSHJ P,SETRGS ;SET UP INTERRUPT REGS
JRST EATMSG## ;NO DDB
MOVSI S,CRSTR1 ;PROCESSING ROUTINE WHEN DATA IS IN
HRRI P3,^D160 ;160 8 BIT BYTES
MOVEI P4,DCRBUF(F) ;GOES INTO DDB BUFFER
HRLI P4,(POINT 16,) ;16 BIT BYTES
MOVEI T1,SPIMBT ;THE SUPER IMAGE MODE BIT
TDNN T1,DEVIOS(F) ;SUPER IMAGE MODE?
POPJ P, ;NO, BACK TO DTESER FOR THE DATA
MOVSI S,CRSPIM ;YES, USE THIS ROUTINE INSTEAD
HRR P4,DEVPTR(F) ;DATA STRAIGHT TO USER
ADDI P4,1
POPJ P, ;BACK TO DTESER
;HERE FROM DTESER WHEN SUPER IMAGE MODE DATA HAS ARRIVED
CRSPIM: PUSHJ P,SETRGS ;SET UP INTERRUPT REGS
JRST EATMSG## ;NO DDB
MOVEI T1,^D40 ;JUST READ 40 WORDS
ADDM T1,DEVPTR(F) ;ADJUST POINTER APPROPRIATELY
JRST CRDON ;FINISH OFF
;HERE FROM DTESER WHEN THE DATA HAS ARRIVED FOR OTHER THAN SUPER IMAGE MODE
CRSTR1: PUSHJ P,SETRGS ;SET UP INTERRUPT REGS
JRST EATMSG## ;NO DDB
MOVE T4,P4 ;GET POINTER TO DATA
MOVEI T3,^D80 ;80 COLUMNS
CAMLE T3,DEVCTR(F) ;BUFFER SMALLER THAN A CARD?
MOVE T3,DEVCTR(F) ;YES, USE THE SMALLER NUMBER
TRNN S,7 ;ASCII OR BINARY?
TRNN S,10 ;OR NOT IMAGE?
JRST NORMOD ;YES, GO LOOK FOR EOF
;IMAGE MODE
CRIMG: ILDB T1,T4 ;GET A BYTE
IDPB T1,DEVPTR(F) ;GIVE IT TO USER
SOJG T3,CRIMG ;LOOP THROUGH CARD
JRST CRDON ;NO, FINISH OFF
;EOF CHECKS
NORMOD: ILDB T2,P4 ;PICK UP COLUMN ONE
TRZ T2,-10000 ;ONLY THE RAW DATA
CAIE T2,CODEOF+NEWEOF;EOF?
CAIN T2,CODEOF ;THIS TYPE?
JRST EOFCRD ;YES
CAIN T2,NEWEOF ;NEW TYPE EOF?
JRST EOFCRD ;YES
TRNE S,14 ;BINARY MODE?
JRST CRBIN ;YES, GO PROCESS CARD
;HERE FOR ASCII MODE TO READ EACH BYTE FROM THE CARD READER AND
; STORE THE CONVERTED CHARACTER IN THE USERS BUFFER. NOTE THAT
; OF THE 16 BITS WE GET FROM -20F, BIT 0 = INVALID MULIT-PUNCH,
; BITS 1-3 = ENCODED ROW PUNCHES 1-7, AND BITS 4-15 = 12 HOLES.
CAIN T2,COD026 ;026 CARD DEFINITION?
JRST SET026 ;YES, GO SET IT UP
CAIN T2,COD029 ;029 CARD DEFINITION?
JRST SET029 ;YES, SET THAT MODE
CRASC: ILDB T1,T4 ;PICK UP A BYTE
TRNE T1,100000 ;MULTIPUNCH COLUMN
JRST [MOVEI T1,"\" ;YES, GET "INVALID" CHARACTER
JRST CRASC1] ;AND STORE THAT
CAIN T1,5000 ;CONVERT [
MOVEI T1,24202 ; TO INTERNAL FORM
CAIN T1,3000 ;ALSO, CONVERT ]
MOVEI T1,22202 ; TO INTERNAL FORM
LDB T2,[POINT 3,T1,26] ;PICK UP ZONES PLUS LOW ENCODED BIT
TRNE T1,3 ;AN 8 OR 9 PUNCH?
TRC T2,7 ;YES, ENCODE THAT
TRZE T1,40000 ;COPY THIS BIT
TRO T2,10 ;TO HERE
TRNE T1,1 ;AND THIS BIT ON
TRO T1,10000 ;MEANS THIS BIT SHOULD BE ON
LSH T1,-^D12 ;POSITION THE REMAINING CODE BITS
TLNE S,CR026 ;026 MODE?
TRO T2,20 ;YES, ENCODE THAT
LDB T1,CRCVPT##(T1) ;PICK UP ASCII CHARACTER
CRASC1: IDPB T1,DEVPTR(F) ;PUT IT INTO USER'S BUFFER
SOJG T3,CRASC ;LOOP THROUGH CARD
MOVEI T1,15 ;TACK ON A CR
IDPB T1,DEVPTR(F) ;
MOVEI T1,12 ; AND A LF
IDPB T1,DEVPTR(F) ;
JRST CRDON ;FINISH OFF CARD
;BINARY CARD PROCESSING
CRBIN: MOVEI T1,-5(T2) ;CHECK FOR 7-9 PUNCH IN COLUMN 1
TRNE T1,17 ;THERE?
TRO S,IOIMPM ;NO, SET IMPROPER MODE BIT
LSH T2,-6 ;POSITION THE WORD COUNT
JUMPE T2,DCRGO ;IGNORE CARD IF COUNT=0
HRRM T2,@DEVPTR(F) ;STORE COUNT IN BUFFER
IMULI T2,3 ;CONVERT TO BYTE COUNT
CAMGE T2,T3 ;SMALL ENOUGH FOR BUFFER?
MOVEM T2,T3 ;YES, USE THIS COUNT
IBP T4 ;SKIP COLUMN ONE
ILDB P4,T4 ;GET COLUMN 2
TRZ P4,-10000 ;ONLY COLUMN PUNCHES
HRLM P4,@DEVPTR(F) ;STORE IN L.H. OF 1ST DATA WORD
HRLZ P4,P4 ;POSITION CHECK SUM
CRBIN1: ILDB T1,T4 ;PICK UP A COLUMN
IDPB T1,DEVPTR(F) ;PUT IT INTO USER'S BUFFER
SOJG T3,CRBIN1 ;LOOP THROUGH CARD
MOVEI T2,@DEVIAD(F) ;GET ADDRESS OF BUFFER AGAIN
PUSHJ P,CKS12## ;CALCULATE THE CHECKSUM
CAME T1,P4 ;GOOD CHECKSUM?
TRO S,IODTER ;NO, SET THE BIT
;END OF CARD PROCESSING
CRDON: MOVEI T1,@DEVPTR(F) ;PICK UP STOPPING PLACE
MOVEI T2,@DEVIAD(F) ;PICK UP STARTING PLACE
SUBI T1,1(T2) ;COMPUTE NUMBER OF WORDS STORED
HRRM T1,1(T2) ;STORE IN 1ST WORD OF BUFFER
AOS DCRCNT(F) ;INCREMENT THE CARD COUNTER
PUSHJ P,SETIOD## ;LET USER CONTINUE
PUSHJ P,ADVBFF## ;ON TO NEXT BUFFER
SKIPA
JRST DCRGO ;THERE IS ONE, START IT
PUSHJ P,RTEVM## ;NO BUFFER AVAILABLE, RETURN ANY EVM
PJRST CLRACT## ;CLEAR I/O ACTIVE AND RETURN
;MODE SETTING
SET026: TLOA S,CR026 ;PUT INTO 026 MODE
SET029: TLZ S,CR026 ;PUT INTO 029 MODE
JRST DCRGO ;START A NEW CARD
;EOF CARD PROCESSING
EOFCRD: TLO S,IOEND ;SET THE MAGIC BIT FOR UUOCON
JRST CRDON ;THAT'S ALL WITH THIS CARD
SUBTTL ACCEPT DEVICE STATUS FROM 11
;HERE FROM DTESER TO ACCEPT DEVICE STATUS FROM 11 (DTESER ALREADY RECEIVED IT)
F11DVS: PUSHJ P,SETRGS ;SET UP INTERRUPT REGS
JRST EATMSG## ;NO DDB
ILDB T2,P4 ;GET FIRST (GENERAL) STATUS BYTE
ILDB T1,P4 ;GET SECOND (CDR) STATUS BYTE
HRL T2,T1 ;REPACK THE DATA
MOVE T3,DEVSTS(F) ;PICK UP OLD STATUS
MOVEM T2,DEVSTS(F) ;PUT THE DEVICE STATUS INTO THE DDB
MOVSI T1,DVOFLN ;ASSUME DEVICE ON-LINE
TRNE T2,EM.FER ;ANY BAD ERRORS?
JRST CRDVS2 ;YES
TRNE T2,EM.OFL!EM.NXD ;OFF-LINE?
JRST CRDVS3 ;YES
ANDCAM T1,DEVCHR(F) ;
TRNE T3,EM.OFL!EM.NXD
PUSHJ P,PSIONL## ;YES, TELL USER IT IS BACK AGAIN
PJRST EATMSG## ;EAT THE REST OF THE INDIRECT DATA
CRDVS2: TRO S,IODERR ;NOTE DEVICE ERROR
TLO S,CRTRBL ;YES, NOTE TROUBLE AT INTERRUPT LEVEL
CRDVS3: TRNN S,IOACT ;ANY I/O ACTIVE?
PJRST EATMSG## ;NO, JUST EAT THE REST OF THE MESSAGE
IORM T1,DEVCHR(F) ;NOTE DEVICE OFF-LINE
MOVEM S,DEVIOS(F) ;SAVE NEW STATUS
PUSHJ P,SETIOD##
PUSHJ P,CLRACT##
PUSHJ P,DEVERR## ;NOTIFY THE USER
PJRST EATMSG## ;AND EAT THE REST OF THE MESSAGE
SUBTTL SUPPORT SUBROUTINES
;INTERRUPT REGISTER SETUP
;CALL WITH:
; P1=CPU #,,DTE #
; P3=LINE,,DATA COUNT
; P4=BYTE POINTER TO MESSAGE
SETRGS: MOVE T1,P4 ;COPY BYTE POINTER
ILDB T1,T1 ;GET GENERAL STATUS BYTE
TRNE T1,EM.NXD ;NON-EXISTANT DEVICE?
POPJ P, ;THEN WE CERTAINLY DON'T KNOW ABOUT IT
MOVE F,DDBTAB##+.TYCDR ;POINT TO PROTOTYPE DDB
SETRG1: HLRZ F,DEVSER(F) ;LINK TO NEXT
JUMPE F,SETRG2 ;GO CONFIGURE IF END OF CHAIN
LDB T1,PDVTYP## ;GET DEVICE TYPE
CAIE T1,.TYCDR ;STILL LOOKING AT RIGHT TYPE?
JRST SETRG2 ;NO--MUST CONFIGURE
HRRZ T1,DEVSER(F) ;GET DISPATCH
CAIN T1,DCRDSP ;OWNED BY US?
CAME P1,DCRCDN(F) ;AND CPU,,DTE NUMBERS MATCH?
JRST SETRG1 ;TRY NEXT DDB
HLRZ T1,DCRDUX(F) ;GET FE UNIT (LINE) NUMBER
HLRZ T2,P3 ;AND THE ONE FROM THE MESSAGE
CAIE T1,(T2) ;MATCH?
JRST SETRG1 ;TRY ANOTHER
AOS (P) ;GIVE SKIP RETURN
PJRST IOSET## ;GET THE REST OF THE AC'S
SETRG2: SETZ F, ;UNKNOWN DEVICE
PUSHJ P,DCRDTS ;AUTOCONFIGURE A CARD READER
POPJ P, ;FAILED
AOS (P) ;GIVE SKIP RETURN
PJRST IOSET## ;GET THE REST OF THE AC'S
END