Trailing-Edge
-
PDP-10 Archives
-
tops20v41_monitor_sources
-
monitor-sources/cdksdv.mac
There are 20 other files named cdksdv.mac in the archive. Click here to see a list.
;<4-1-FIELD-IMAGE.MONITOR>CDKSDV.MAC.2, 25-Feb-82 20:12:53, EDIT BY DONAHUE
; UPD ID= 996, FARK:<4-WORKING-SOURCES.MONITOR>CDKSDV.MAC.2, 22-Feb-82 09:44:53 by ZIMA
;Edit 1984 - do the following:
; CLEAR CDBLK ON TRANSITION TO ONLINE
; CORRECT DATA PASSED TO SYSERR
; FIX IONXM BUGHLTS FROM CLOSE CODE
; SAVE SPACE BY MAKING CDERBF/CDERSZ RIGHT SIZE (IMPLIES CHANGE STG TOO)
; CORRECT STATUS BLOCK DOCUMENTATION, AND WRITE THE CORRECT DATA THERE
; FIX NOT PUTTING CDST INTO SYSERR ENTRY, SHORTEN SYSERR CODE SOME
; SHORTEN KSRD A BIT
; DO FULL CONVERSION TO T ACS,...
; ADD AND CALL ROUTINE TO CHECK HOPPER/STACKER STATE
; FIX BADLY HANDLED ONLINE TRANSITIONS
; CHECK FOR HOPPER/STACKER CONDITION IN KSRD
; CHECK FOR HOPPER/STACKER CONDITION IN CDRINT
; FIX EXTRA SYSERR ENTRY PROBLEM
; FIX EXTRA "PROBLEM ON DEVICE PCDR0:" MESSAGE PROBLEM
; PREVENT SYSERR ENTRIES FOR HOPPER EMPTY CONDITION
; CHANGE CDBDIN ARGUMENT SET FROM T4 TO U
; FINISH MORE UNIVERSAL USE OF U OVER RANDOM ACS
; CHANGE SOME HLR'S TO HLRZ'S SO THAT LH IS NOT GARBAGE
; MAKE CDRSER USE UNIT NUMBER ALREADY IN BLOCK INSTEAD OF FORCING ZERO
; CHANGE MORE RANDOM INSTRUCTIONS TO MOVX
; FINISH REMOVING CDUNIT CONSTRUCT (IMPLIES CHANGE STG TOO)
; FIX INDEXING IN CDRSER SO LH OF INDEX REGISTER ALWAYS ZERO
; FIX WRONG PAGE OFFSET MASKING IN KSRD
; CHANGE NCDWA TO BUGCHK AND RECOVER (IMPLIES CHANGE BUGS TOO)
; FIX WRONG VALUES IN SYSERR BLOCK IF NOT OPEN
; SHORTEN BUFFER FORMATTING ROUTINE
; DO THE AC RESTORE BLT MORE CLEVERLY
; REMOVE CDUNIT STUFF FROM KSCLZ
; COMBINE CLOSE AND RESTART ROUTINE CODE
; ADJUST JOB ZERO SYSERR ROUTINE, REMOVE ONE WORD OF CODE
; LET JOB ZERO CODE BE SWAPPABLE
; REMOVE Q2 STUFF FROM KSINI
; REMOVE CDUNIT STUFF FROM KSINI
; REMOVE CDUNIT STUFF FROM KSRD
; REMOVE CDUNIT STUFF FROM CDKSST, IMPACTS CDRSST
;End Edit 1984 changes.
; UPD ID= 214, SNARK:<4.1.MONITOR>CDKSDV.MAC.5, 22-Jan-80 08:42:50 by OSMAN
;tco 4.2597 - prevent CDILVT bughlt at startup
;<OSMAN.MON>CDKSDV.MAC.1, 10-Sep-79 15:19:34, EDIT BY OSMAN
;TCO 4.2412 - Move definition of BUGHLTs, BUGCHKs, and BUGINFs to BUGS.MAC
;<4.MONITOR>CDKSDV.MAC.3, 4-Mar-79 14:40:02, Edit by KONEN
;UPDATE COPYRIGHT FOR RELEASE 4
;<4.MONITOR>CDKSDV.MAC.2, 12-Dec-78 16:23:52, EDIT BY KIRSCHEN
;DO NOT TREAT HOPPER EMPTY AS HARD ERROR
;DO NOT PASS .DVFLG BACK TO USER IN CDRSTT
;<4.MONITOR>CDKSDV.MAC.1, 6-Dec-78 16:00:31, EDIT BY MILLER
;FIX TEST IN CDRINT FOR ERRORS
;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1976,1977,1978,1979,1980,1981,1982 BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
;CARDREADER SERVICE FOR KS10
;SUPPORTS ONLY A SINGLE READER AS UNIT ZERO
; SUBTTL J. G. ZIMA, FEBRUARY 1982
SEARCH PROKS,PROKL,SERCOD ;NOTE: PROKL IS USED TO FETCH .FECDR
RESCD
CDVTKS==. ;DEFINE DEVICE DEPENDENT FUNCTION VECTOR TABLE
IFIW!KSRD ;RDCD - READ A CARD
IFIW!KSCLZ ;CDCLZ - CLOSE
IFIW!KSRST ;CDRST - RESTART
IFIW!KSINI ;CDINI - INITIALIZE
IFIW!CDKSST ;GCDRST - RETURN STATUS
IFIW!KSSWP ;BUFSWP - PUT BUFFER IN CORRECT FORMAT FOR KL
;KS10 RESIDENT STORAGE
ASCBSZ: POINT 18,0 ;BYTE POINTER FOR UNSWAPPED BUFFER
; USED BY CDRAII TO CONVERT TO ASCII
RS (CDRINB,4) ;FOUR WORD INTERRUPT DISPATCH BLOCK
RS (CDIACS,20) ;INTERRUPT ACS STORED HERE
CDSTSZ=40 ;SIZE OF CARDREADER STACK
RS (CDRSTK,CDSTSZ) ;CARD READER STACK
;CDRTBL - TABLE OF EXTERNAL PAGE ADDRESSES INDEXED BY UNIT NUMBER
CDRTBL::CD11BA ;BASE ADDRESS OF CD11
;KSINI - HERE TO INITIALIZE THE READER
;CALLED WITH Q2/ UNIT NUMBER (ACTUALLY ZERO, BUT WE IGNORE IT AND USE U)
KSINI: SETZ U,0 ;DO ONLY UNIT 0 (ONLY ONE SUPPORTED)
MOVX T1,KSTYP ;SET TYPE OF READER TO KS
STOR T1,CDRTYP,(U) ; IN THE CDR STATUS BLOCK
SKIPN PROFLG ;IF PROFLG NOT SET DO NOTHING MORE
RET ;JUST RETURN QUIETLY
MOVE T1,CDRTBL(U) ;GET BASE ADDRESS OF THIS UNIT
CALL UBGOOD ;CHECK FOR DEVICE
RET ;NO DEVICE, RETURN QUIETLY
SETONE CDEXST,(U) ;INFORM WORLD WE EXIST
HLRZ T2,CDRTBL(U) ;GET UBA NUMBER FOR CDR
MOVE T2,SMTEPT(T2) ;GET VECTOR TABLE ADDRESS FOR THAT UBA
MOVE T1,[XPCW CDRINB] ;POINT TO INTERRUPT ROUTINE
MOVEM T1,CDRIVT(T2) ;AND STORE INTERRUPT DISPATCH VECTOR
XMOVEI T1,CDRINT ;SET UP INTERRUPT SERVICE ROUTINE ADDRESS
MOVEM T1,CDRINB+3 ; IN INTERRUPT BLOCK
SETZM CDRINB+2 ; AND INSURE NEW FLAGS ARE ZERO
HLRZ T1,CDRTBL(U) ;GET UBA NUMBER FOR THIS CD11
MOVEI T2,1 ;ONE WINDOW NEEDED (FOR BUFFER)
CALL ALUBWA ;ALLOCATE UNIBUS WINDOW
JRST [ BUG(NCDWA) ;BUGCHK TO SAY WE CAN'T USE THE CDR
SETZRO CDEXST,(U) ;MAKE THE READER NONEXISTENT
RET] ; AND RETURN
MOVEM T1,CDUBAD(U) ;SAVE RETURNED UBA MAP REGISTER ADDRESS
MOVEM T2,CD11A(U) ;SAVE ADDRESS ON UNIBUS OF WINDOW
;KSRST - HERE ON DEVICE DEPENDENT RESTART FUNCTIONS (FALL THROUGH FROM INIT)
;KSCLZ - CLOSE ROUTINE (FLUSH)
;ASSUMES U/ UNIT NUMBER OF READER TO RESTART
;DOES POWER CLEAR OPERATION AND SETS INTERRUPT ENABLE
KSCLZ:
KSRST: JE CDEXST,(U),R ;DON'T IONXM IF NO READER PRESENT
MOVX T2,CDPWR ;GET POWER RESET COMMAND AND
WRIO T2,@CDRTBL(U) ; RESET THE READER
MOVX T2,CDIEN ;SET INTERRUPT ENABLE
WRIO T2,@CDRTBL(U) ; FOR THE READER
RET ;RETURN
;CDRINT - DEVICE INTERRUPT SERVICE ROUTINE FOR THE KS CARDREADER
CDRINT: MOVEM 17,CDIACS+17 ;SAVE A REGISTER TO DO THE BLT
MOVEI 17,CDIACS ;WHERE TO STORE THE ACS
BLT 17,CDIACS+16 ;SAVE AWAY THE ACS
MOVE P,[IOWD CDSTSZ,CDRSTK] ;INITIALIZE THE INTERRUPT STACK
SETZ U,0 ;SET UP FOR UNIT 0 (ONLY SUPPORTED UNIT FOR NOW)
JE CDOPN,(U),[
CALL CDINOK ;EXIT VIA STATUS CHECK IF NOTHING OPEN
CALL KSCLZ ;CLEAR OUT ANY GARBAGE BITS LEFT OVER
SETZRO CDBLK,(U) ;MAKE SURE NO LONGER BLOCKED
JRST CDRIXT] ; AND TERMINATE INTERRUPT
RDIO T1,@CDRTBL(U) ;READ THE STATUS REGISTER
TXNE T1,CDTOL ;COMING ONLINE?
JRST [ CALL CDINOK ;YES, DO STATUS REPORT
CALL KSCLZ ;CLEAR OUT ANY GARBAGE BITS LEFT OVER
JRST CDRIXT] ; AND TERMINATE INTERRUPT
TXNE T1,CDERR1!CDOFL ;ANY ERRORS?
JRST [ CALL CDINOK ;SOME ERROR - GO DO STATUS REPORT
CALL CDRHSC ;CHECK FOR HOPPER-EMPTY/STACKER-FULL
JRST .+1 ;EMPTY/FULL - PROCESS THE CARD READ IN
JRST CDRIXT] ;BUT JUST TERMINATE INTERRUPT FOR ERRORS
LOAD T1,CDCNT,(U) ;GET THE BYTE TRANSFER COUNT
ADDI T1,^D160 ;UPDATE COUNT (TWO 8-BIT BYTES IN 12-BIT FRAME)
STOR T1,CDCNT,(U) ;PUT IT BACK
AOS CARDCT(U) ;INDICATE ANOTHER CARD HERE
AOS CDRCT1(U) ;ONE MORE BUFFER FILLED
SETZRO CDBLK,(U) ;NOT WAITING FOR A CARD ANYMORE
CALL SETBF1 ;FIND INTERRUPT BUFFER, ADDRESS TO T1
SETCMP CDBFI,(U) ;TOGGLE INTERRUPT BUFFER BIT (***NOTE: IF
; EVER MORE THAN 2 BUFFERS, THEN LOAD/AOS/STOR)
JN CDAII,(U),[ LDB T1,[POINT 16,0(T1),15] ;IF ASCII MODE***RIGHT???
TRC T1,7417 ;SEE IF THIS IS AN EOF
TRCE T1,17 ;LOW FOUR BITS ON?
TRCN T1,7400 ;OR HIGH FOUR?
SKIPA ;YES, IS AN EOF
JRST .+1 ;NOT AN EOF
SETZRO CDATN,(U) ;MAKE SURE ATTENTION NOT SET ON EOF
JRST CDRIXT] ;AND TERMINATE WITHOUT NEW READ
SKIPG CDRCT1(U) ;ANOTHER PI BUFFER AVAILABLE?
CALL CDRHSC ;NEED TO WAIT CAUSE HOPPER-EMPTY/STACKER-FULL?
SKIPA ;EMPTY/FULL OR NO NEXT BUFFER TO USE, RETURN
CALL RDCARD ;ELSE START READ OF NEXT CARD
CDRIXT: HRLZI 17,CDIACS ;SET UP BLT POINTER TO
BLT 17,17 ; RESTORE THE ACS FROM CDIACS
XJEN CDRINB ; AND TERMINATE THE INTERRUPT
;KSRD - ROUTINE TO START READING A CARD
;CALL WITH U/ UNIT NUMBER
;RETURNS +1: IF CANNOT START READ
; +2: AFTER STARTING READ OF CARD
;USES T1,T2.
KSRD: CALL CDRHSC ;CHECK FOR HOPPER-EMPTY/STACKER-FULL
RETSKP ;EMPTY/FULL, RETURN AND TRY AGAIN LATER
LOAD T1,CDWRD,(U) ;GET ADDRESS OF BUFFER
MAP T2,0(T1) ;CONVERT TO PHYSICAL ADDRESS IN T2
ANDX T2,<7,,777777> ;MASK OFF JUNK BITS
LSH T2,-PGSFT ;MAKE PAGE ADDRESS
TXO T2,UNBD18+UNBVBT ;SET 16 BIT (DISABLE 18) XFER AND VALID BITS
WRIO T2,@CDUBAD(U) ;STORE IN UNIBUS MAP WINDOW
ANDX T1,PGSIZ-1 ;MASK VIRTUAL BUFFER ADDRESS TO PAGE OFFSET
LSH T1,2 ;MAKE INTO PDP11 BYTE ADDRESS
ADD T1,CD11A(U) ;ADD IN BASE ADDRESS OF UNIBUS WINDOW
MOVE T2,CDRTBL(U) ;GET EXTERNAL PAGE ADDRESS FOR DEVICE REGISTERS
WRIO T1,CDBA(T2) ;SET TRANSFER ADDRESS
MOVX T1,<-^D80> ;GET MINUS COLUMN COUNT
WRIO T1,CDCC(T2) ;WRITE COUNT REGISTER
MOVX T1,CDIEN+CDRED ;GET START READ + INTERRUPT ENABLE
WRIO T1,CDST(T2) ;START READING
RETSKP ; AND TAKE THE GOOD RETURN
;KSSWP - PUT BUFFER INTO THE FORM CDRSRV WANTS IT
;CONVERT BYTE FORMAT FROM 2-16-2-16 TO 16-16-4 FOR BINARY USE
;BY ROUTINE CDRAII WHICH USES ASCBSZ TO RETRIEVE BYTES.
;ASSUMES WORD ALIGNMENT OF BUFFER POINTED TO BY FILBYT(JFN)
;AND SIZE OF BUFFER EQUALS ONE CARD. LEAVES TRASH IN LAST 4 BITS.
;PRESERVES ALL ACS.
;RETURNS +1: ALWAYS
KSSWP: SAVET ;SAVE THE TEMP ACS
MOVSI T3,-^D40 ;DO 80 CHARS WORTH
HRR T3,FILBYT(JFN) ;GET THE BUFFER POINTER
KSSWLP: MOVE T1,0(T3) ;GET A WORD OF THE BUFFER
LSHC T1,-^D16 ;SECOND (LOW) CHARACTER TO T2
LSH T1,-2 ;DISCARD TWO JUNK BITS
LSHC T1,-^D16 ;SHIFT DOWN THE FIRST (HIGH) CHARACTER
MOVEM T2,0(T3) ;PUT ADJUSTED WORD BACK
AOBJN T3,KSSWLP ;LOOP OVER ALL THE BUFFER
RET ;RETURN
;CDKSST - ROUTINE TO RETURN STATUS OF THE CARDREADER
;CALL WITH U/ UNIT NUMBER
CDKSST: JE CDEXST,(U),R ;DON'T IONXM IF NO READER EXISTS
MOVX T1,CDIEN ;INTERRUPTS ENABLED BIT
TIOE T1,@CDRTBL(U) ;SEE IF WE HAVE LOST INTERRUPT ENABLE
JRST CDINOK ;ALL OK
BUG(CDBDIN,<<U,D>>) ;INFORM WORLD WE LOST INTERRUPTS
BSIOB T1,@CDRTBL(U) ;REENABLE LOST INTERRUPTS AND CONTINUE
CDINOK: ;CALLRET CDRSTT ;GET STATUS (FALL THROUGH)
;ROUTINE TO SET UP THE STATUS BLOCKS FOR THE CARD READER
;
; THE STATUS BLOCK IS IN THE FOLLOWING FORMAT:
;
;PDP11 WORD NUMBERS
;
; WORD 0 STATUS WORD 0 (.DVXXX BITS)
; WORD 1 STATUS WORD 1 (.DDXXX BITS)
; WORD 2 HIGH BYTE: # BYTES OF DEVICE DEPENDENT INFO (=0)
; LOW BYTE: # BYTES OF DEVICE REGISTERS (=10)
;
; DEVICE REGISTERS:
;
; WORD 3 STATUS AND CONTROL REGISTER (CDST)
; WORD 4 CURRENT ADDRESS REGISTER (CDBA)
; WORD 5 COLUMN COUNT REGISTER (CDCC)
; WORD 6 DATA BUFFER REGISTER (CDDB)
;
CDERSZ==4 ;SIZE OF BUFFER IN WORDS
CDSIZ==16 ;SIZE OF DATA SECTION IN 8-BIT BYTES
CDRSTT: JE CDEXST,(U),CDNEXD ;GO IF READER DOES NOT EXIST
SETONE CDSHA,(U) ;SAY THAT STATUS HAS ARRIVED
HRRZ P5,U ;COPY UNIT NUMBER TO P5
IMULI P5,CDERSZ ;GET CORRECT BLOCK
ADD P5,[POINT 8,CDERBF] ;BUILD POINTER TO STATUS BUFFER
MOVE P6,P5 ;SAVE POINTER TO BUFFER IN P6
SETZ Q3,0 ;CLEAR ACS TO BUILD STATUS
SETZB Q2,T2
MOVE T3,CDRTBL(U) ;GET UNIBUS REGISTER BASE ADDRESS TO T3
RDIO T1,CDDB(T3) ;READ SECONDARY STATUS REGISTER
TXNE T1,CDBRCK ;READ CHECK?
TXO Q2,.DDRCK ;YES
TXNE T1,CDBPCK ;PICK CHECK?
TXO Q2,.DDPCK ;YES
TXNE T1,CDBSCK ;STACK CHECK?
TXO Q2,.DDSCK ;YES
RDIO T1,CDST(T3) ;READ PRIMARY STATUS REGISTER
TXNE T1,CDOFL ;OFFLINE?
TXO T2,.DVFOL ;YES
SKIPN Q2 ;ANY HARD ERRORS NOTED YET?
TXNE T1,CDDLT+CDNXM ; OR DATA LATE OR NXM?
TXO T2,.DVFHE+.DVFOL ;YES, SET HARD ERROR BITS
TXNE T1,CREOF ;EOF BUTTON SEEN?
TXO T2,.DVFEF ;YES, SET EOF
IDPB Q3,P5 ;(0) SET FIRST STATUS (TO ZERO)
IDPB T2,P5 ;(1) SET .DVXXX FLAGS
IDPB Q3,P5 ;(2) ZERO
IDPB Q2,P5 ;(3) SECONDARY STATUS .DDXXX FLAGS
IDPB Q3,P5 ;(4) ZERO BYTES OF DEVICE DEPENDENT INFO
MOVEI T1,10 ;BUT 4 WORDS = 10 BYTES OF REGISTERS
IDPB T1,P5 ;(5) STORE COUNT OF DEVICE REGISTER BYTES
HRLI P5,(<POINT 16,0,15>) ;SET UP FOR 16 BIT BYTES (IN MID-WORD)
RDIO T1,CDST(T3) ;GET STATUS REGISTER
IDPB T1,P5 ;(6,7) STORE STATUS
RDIO T1,CDBA(T3) ;GET BUS ADDRESS
IDPB T1,P5 ;(10,11) STORE IT
RDIO T1,CDCC(T3) ;GET BYTE COUNT
IDPB T1,P5 ;(12,13) STORE IT
RDIO T1,CDDB(T3) ;GET PACKING REGISTER
IDPB T1,P5 ;(14,15) STORE IT
TXNN T2,.DVFHE ;ANY HARD ERRORS REQUIRING SYSERR ENTRY?
JRST CDNEXD ;NO, DON'T NEED TO DO SYSERR ENTRY
MOVX T1,CDSIZ+FE%LEN ;GET LENGTH OF SYSERR BUFFER NEEDED
MOVX T2,CDSIZ+FE%SIZ
CALL ALCSEB ;ALLOCATE BUFFER
JRST CDNEXD ;NO BUFFER, SO DON'T BOTHER
SETZM FE%DTE+SEBDAT(T1) ;SET NO DTE
MOVX T2,.FECDR ;GET DEVICE CODE FOR CDR
HRLI T2,0(U) ;SET THE UNIT NUMBER
MOVEM T2,FE%DEV+SEBDAT(T1) ;STORE UNIT,,DEVICE TYPE
MOVX T4,<-CDSIZ> ;GET MINUS THE SIZE
HRLM T4,FE%PTR+SEBDAT(T1) ;SAVE COUNT OF WORDS
MOVX T3,CDSIZ ;GET SIZE OF DATA SECTION IN 8-BIT BYTES
MOVEM T3,FE%BYT+SEBDAT(T1) ;STORE IT IN BUFFER
MOVE T4,P6 ;GET POINTER TO STATUS BUFFER
MOVE T2,[POINT 8,FE%INF+SEBDAT(T1)] ;POINTER TO DEVICE DATA
CDSYLP: ILDB P5,T4 ;GET STATUS BUFFER BYTES
IDPB P5,T2 ; AND STORE IN SYSERR BUFFER
SOJG T3,CDSYLP ;LOOP OVER ALL BYTES
MOVE T2,[-2,,[ SEBPTR 0,SBTEVC,SEC%FE ;"FRONT END" ERROR EVENT CODE
SEBPTR 0,SBTFNA,CDRSER]] ;ROUTINE FOR JOB ZERO TO CALL
MOVE Q2,T1 ;SAVE POINTER TO SYSERR BUFFER
CALL SEBCPY ;HAVE THE POINTERS COPIED
JFCL ;NOP IF ERROR
MOVE T1,Q2 ;RESTORE BUFFER POINTER
CALL QUESEB ;QUEUE THE ERROR BLOCK
CALL KSCLZ ;RESET THE READER
CDNEXD: MOVE T2,U ;PUT UNIT NUMBER TO T2 (REQUIRED FOR CDRTLS)
MOVE T4,P6 ;POINTER TO STATUS BUFFER
CALLRET CDRTLS ;SAY STATUS RECEIVED
;CDRHSC - ROUTINE CALLED TO CHECK FOR THE HOPPER-EMPTY/STACKER-FULL CONDITION
;EXPECTS U/ UNIT TO CHECK
;
; CALL CDRHSC
;
;RETURNS +1: ON HOPPER-EMPTY OR STACKER-FULL CONDITION
; +2: IF NEITHER
;
;***NOTE*** IN SPITE OF -11 MANUALS AND DOCUMENTATION, THE APPROPRIATE
;TESTS ARE: FOR HOPPER EMPTY: CDHCK SET IN STATUS REGISTER
; FOR STACKER FULL: CDRDK SET IN STATUS REGISTER + NOT CDHCK
; NOT CDBRCK + NOT CDBSCK + NOT CDBPCK
; (IE JUST CDRDK AND NO OTHER ERROR BITS)
;REFER TO PAGE 4-27 OF THE CD-11 HARDWARE MANUAL FICHE FOR THIS GEM.
;(OR TO THE PRINTS)
CDRHSC: RDIO T1,@CDRTBL(U) ;READ STATUS REGISTER
TXNE T1,CDHCK ;HOPPER EMPTY?
RET ;YES, NONSKIP RETURN
TXNN T1,CDRDK ;READER CHECK ERROR SET?
RETSKP ;NO, CAN'T BE STACKER FULL THEN
MOVE T1,CDRTBL(U) ;GET CDR UNIBUS REGISTER BASE ADDRESS
RDIO T1,CDDB(T1) ;READ THE SECONDARY STATUS REGISTER
TXNN T1,CDBRCK!CDBSCK!CDBPCK ;ALL CHECK CONDITIONS CLEAR?
RET ;YES, RETURN NONSKIP FOR STACKER FULL
RETSKP ;NO, CAN'T BE STACKER FULL
;CDRSER - ROUTINE CALLED BY JOB 0 SYSERR FORK TO DETERMINE OWNING PROCESS
;EXPECTS T1/ OFFSET OF SYSERR BLOCK IN SEBDAT
;RETURNS +1: ALWAYS
;USES T2,T3.
SWAPCD
CDRSER: HLRZ T2,FE%DEV+SEBDAT(T1) ;FETCH THE UNIT NUMBER WE ARE DOING
JE CDOPN,(T2),[ ;IS IT OPENED?
SETOM FE%FJB+SEBDAT(T1) ;NO. SAY UNASSIGNED FORK,,JOB
JRST CDFKS] ; AND FORGE AHEAD
LOAD T2,CDFRK,(T2) ;GET FORK NUMBER
HLRZ T3,FKJOB(T2) ;GET JOB NUMBER TO RH
HRL T2,T3 ;JOB,,FORK
MOVSM T2,FE%FJB+SEBDAT(T1) ;STORE FORK,,JOB
MOVE T2,JOBDIR(T3) ;LOGGED-IN DIRECTORY
HRLI T2,USRLH ;SET UP USER NUMBER
MOVEM T2,FE%DIR+SEBDAT(T1) ;STORE DIRECTORY NUMBER
MOVE T2,JOBPNM(T3) ;GET JOB PROGRAM NAME
MOVEM T2,FE%NAM+SEBDAT(T1) ; AND STORE
CDFKS: MOVX T2,FE%INF ;START OF ERROR WORDS
HRRM T2,FE%PTR+SEBDAT(T1) ;SET FIRST ERROR WORD
SETZM FE%ID+SEBDAT(T1) ;SET "FRONT-END" SOFTWARE VERSION NUMBER
RET ;RETURN
TNXEND
END