TITLE DSKINT - PDP-10 RC-10 DISK INTERRUPT SERVICE V403S SUBTTL A. FRANTZ/TH TS 5 FEB 69 XP VDSKIT,403 ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP ENTRY RCXINT ;THIS SYMBOL IS SOLELY TO PERMIT SYSTEM RCXINT: ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE. INTERNAL DSKINT,DFWRT,DFRED,DSKFDG,DISKUP,FTCHECK,FTMONP,FTRCHK EXTERNAL DSKCHN,DSKBIT,DSKSAV,DFINT,RCXIOC,RCXCCW DSK=170 ;DEVICE NUMBER ASSIGNED TO THE MODEL RC-10 DISK SYNCHRONIZER. ;CONI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER -- ;BITS 00 - 17 MAINTENANCE PANEL SWITCH SETTINGS INDICATORS -- ;BITS 00 - 04 UNUSED MSS=1B5 ;SET INDICATES "MAINTENANCE SEGMENT SELECTED" (SEGMENT 81), PLGSW=1B6 ;1 = WRITE-PROTECT EVERYTHING BELOW (LESS THAN) THE BOUNDARY, ; 0 = WRITE-PROTECT EVERYTHING ABOVE (GREATER THAN) BOUNDARY, ;THE CURRENT IMPLEMENTATION OF THE RC-10 DISK SYNCHRONIZER ; DOES NOT PERMIT SENSING THE INCLUSION OF THE BOUNDARY. ;BITS 07 - 17 THE WRITE-PROTECTION THE INCLUSION OF THE BOUNDARY. DTOP=1B18 ;SET INDICATES DATA TRANSFER IN PROGRESS. ;BITS 19 -29 ERROR CONDITIONS INDICATORS (ERROR WHEN SET) -- SRCHE=1B19 ;SEARCH ERROR (DISK TIMING TRACK PROBLEMS!!) DDE=1B20 ;DISK DESIGNATION ERROR TSE=1B21 ;TRACK SELECT ERROR (OR EXCEEDS SYSTEM CAPACITY) NRDY=1B22 ;DISK NOT READY (OR NON-EXISTENT DISK REFERENCED) PSF=1B23 ;POWER SUPPLY FAILURE DPAR=1B24 ;DISK PARITY ERROR CHDPAR=1B25 ;CHANNEL DATA PARITY ERROR CHCPAR=1B26 ;CHANNEL CONTROL PARITY ERROR NXMEM=1B27 ;NON-EXISTENT MEMORY REFERENCED WRPE=1B28 ;ATTEMPTED TO WRITE IN PROTECTED DISK AREA (SEE BITS 06 - 17) OVR=1B29 ;OVERRUN, I.E., MEMORY DIDN'T RESPOND QUICKLY ENOUGH ;BIT 30 CHANNEL CONTROL WORD WRITTEN IN MEMORY (THIS BIT IS ;TURNED ON ON ALMOST ALL TERMINATIONS.) BUSYBT=1B31 ;BUSY (SYNCHRONIZER PERFORMING A COMMAND SEQUENCE) DONEFLG=1B32 ;DONE -- THIS ACTUALLY CAUSES THE INTERRUPT. ;BITS 33 - 35 PI CHANNEL SELECTION BITS. ;COMBINATIONS OF ERRO BITS GROUPED BY TYPE -- DATERR=DPAR!CHDPAR ;DATA ERRORS. DEVERR=SRCHE!PSF!CHCPAR!OVR ;DEVICE ERRORS. SETERR=DDE!TSE!NRDY!NXMEM ;SOFTWARE-PREVENTABLE ERRORS. ALLERR=DATERR!DEVERR!SETERR!WRPE ;ALL POSSIBLE ERRORS. ;CONO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER ;BITS 00 - 17 UNUSED ;BITS 18 - 19 SELECT DISK FOR SECTOR COUNTER READ-OUT A(SEE DATAI BITS 28-35) ;BITS 20 - 29 RESET THE CORRESPONDING CONI ERROR BIT ;(BUT PSE MAY REFUSE TO BE RESET) WRCCWD=1B30 ;WRITE THE CHANNEL CONTROL WORD INTO MEMORY (NOW!) STPBIT=1B31 ;STOP -- IMMEDIATELY CEASE PRESENT I/O AND CLEAR THE CHANNEL. RESETB=1B32 ;RESET THE DONE FLAG (CORRESPONDING CONI BIT) TO CLEAR INTERRUPT ;BITS 33 - 35 PI CHANNEL SELECTION BITS ;DATAI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER -- ;BITS 00 - 17 UNUSED ;BITS 18 - 23 PARITY REGISTER ;BITS 24 - 25 UNUSED ;BITS 26 - 27 DISK SELECTED BY BITS 18-19 OF LAST CONO ;BITS 28 - 35 CURRENT SECTOR POSITION OF SELECTED DISK (FOR LATENCY OPTIMIZATION!) ;DATAO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER -- ;BITS 00 - 17 DISK ADDRESS ELECTION ;BITS 00 - 01 DISK SELECT ;BITS 02 - 10 TRACK SELECT (BCD, BUT FIRST CHAR IS JUST 1 BIT) ;BITS 11 - 17 SEGMENT SELECT (BCD, BUT FIRST CHAR HAS ONLY 3 BITS) ;BITS 18 - 23 INITIAL PARITY REGISTER SETTING 9ZERO EXCEPT FOR DIAGNOSTIC PROGRAMS) DDSKPE=1B24 ;DISABLE DISK PARITY ERROR STOP DCHNPE=1B25 ;DISABLE CHANNEL DATA PARITY ERROR STOP WRBIT=1B26 ;SET MEANS WRITE ON DISK, RESET MEANS READ FROM DISK ;BITS 27 - 34 ;CORRESPONDING BITS OF INITIAL CHANNEL CONTROL ADDRESS, HENCE, ; THIS ADDRESS MUST BE EVEN AND IN THE FIRST 1K OF CORE MEMORY! ;BIT 35 ;WRITE EVEN PARITY DATA INTO MEMORY (DIAGNOSTICS ONLY!) ;SUBROUTINE "DFWRT" IS CALLED TO START UP A WRITE ON THE DISK. ;CALLING SEQUENCE -- ; PUSHJ PDP,DFWRT ; RETURN WHEN WRITE HAS BEEN STARTED. ;ENTRY CONDITIONS -- ; C(TAC 18-35) = LOGICAL BLOCK NUMBER AT WHICH TO START WRITING, ; C(TAC1) = IOWD, I.E., ; C(TAC1 00-17) = 2'S COMPLEMENT OF WORD COUNT TO BE WRITTEN ; C(TAC1 18-25) = ADDRESS OF FIRST DATA WORD TO BE WRITTEN ;EXIT CONDITIONS -- ; THE REQUESTED WRITE HAS BEEN BEGUN ; TAC AND TAC1 HAVE BEEN DESTORYED DFWRT: CONSZ DSK,BUSYBT ;FOR SAFETY SAKE BE SURE THE DISK IS JRST .-1 ; FREE NOW (THIS MAY BE A REDUNDANT CHECK). MOVEM TAC1,WRCHNL ;SET UP CHANNEL COMMAND SEQUENCE. SETZM WRCHNL+1 ;MAKE SURE NEXT COMMAND IS 0, SO CHANNEL ; WILL NOT WRITE ALL OVER DISK IFN FTRCHK,< EXTERN SATM2 MOVEI TAC1,1(TAC1) ;CLEAR LH AND COMPARE WITH ; FIRST WORD AFFECTED CAIG TAC1,SATM2 ;COMPARE ABS CORE ADDRESS TO BEGINNING ;OF SAT TABLE-2 HALT . ;HALT - DO NOT WRITE OUT MONITOR - CONTINUE ;WILL LOOP > MOVEI TAC1,WRCHNL MOVEM TAC1,RCXIOC ;RCXIOC IS MAGIC EVEN LOCATION IN FIRST 1K OF CORE. PUSHJ PDP,CNVBLK ;CONVERT LOGICAL BLOCK NO. INTO PHYSICAL DISK ADDRESS. ORI TAC,WRBIT ;REQUEST WRITE (INSTEAD OF READ) DFWRTC: ORI TAC,RCXIOC MOVEM TAC,DFORDR ;SAVE RC-10 DATAO COMMAND DSKFDG: HRRZI TAC,DSKCHN ;THIS INSTRUCTION TEMPORARILY ALTERED DURING "ONCE". IORI TAC,ALLERR!RESETB HRLI TAC,DONEFLG ;TO SET INTERRUPT CONDITIONS IN DSKCON. ;READY THE DISK SYNCHRONIZER --- STARTDV DSK HRRZ TAC,@RCXIOC ;COMPUTE AND SAVE THE VALUE WHICH THE HLRE TAC1,@RCXIOC ; CHANNEL CONTROL WORD SHOULD CONTAIN UPON SUB TAC,TAC1 ; SUCCESSFUL COMPLETION OF THE DISK OPERATION. MOVE TAC1,RCXIOC HRLI TAC,1(TAC1) MOVEM TAC,RCXFIN SETZM RCXCCW ;ZERO THE LOCATION WHERE THE DISK SYNCRONIZER WILL ; STORE THE CHANNEL CONTROL WORD. DATAO DSK,DFORDR ;START UP DISK AND DATA CHANNEL. POPJ PDP, ;SUBROUTINE EXIT.,......*** ;SUBROUTINE "DFRED" IS CALLED TO START UP A READ FROM THE DISK. ;THE CALLING SEQUENCE, ENTRY CONDITIONS, AND EXIT CONDITIONS ARE EXACTLY ; SIMILAR TO THOSE FOR SUBROUTINE "DFWRT" ABOVE. DFRED: CONSZ DSK,BUSYBT ;POSSIBLY REDUNDANT CHECK TO BE JRST .-1 ; SURE THE DISK IS FREE. MOVEM TAC1,RDCHNL ;SET UP READ CHANNEL ORDERS IN A SEPARATE SETZM RDCHNL+1 ;MAKE SURE NEXT COMMAND IN LIST IS 0 ; SO CHANNEL WILL NOT WRITE ALL OVER MEMORY IFN FTRCHK,< EXTERN SATM2 MOVEI TAC1,1(TAC1) ;CLEAR LH AND COMPARE WITH FIRST WORD AFFECTED CAIG TAC1,SATM2 ;COMPARE ABS CORE ADDRESS TO BEGINNING ;OF SAT TABLE-2 HALT . ;HALT - DO NOT WRITE OUT MONITOR,CONTINUE WILL LOOP > MOVEI TAC1,RDCHNL ; PLACE FROM WRITE CONTROL WORDS FOR MOVEM TAC1,RCXIOC ; BETTER FOOTPRINTS IN CASE OF A CRASH. PUSHJ PDP,CNVBLK ;CONVERT LOGICAL BLOCK NUMBER TO PHYSICAL DISK ADDRESS. JRST DFWRTC ;REMAINDER OF THIS READ ROUTINE IS ; IDENTICAL TO WRITING. ;DISK INTERRUPTS COME HERE TO BE SERVICED -- DSKINT: CONSO DSK,@DSKCON ;*DID THE DISK SYNCHRONIZER CAUSE THE INTERRUPT ON JRST .-1 ;* THIS CHANNEL? IF NOT, GO TO THE NEXT DEVICE ON ;* THE SAME PRIORTY INTERRUPT CHANNEL. ; NOTE: THE "JRST .-1" IS ALTERED BY THE SYSTEM BUILDER PROGRAM. CONI DSK,DSKISV ;*SOLELY TO LEAVE FOOTPRINTS. JSR DSKSAV ;*SAVE ACCUMULATORS, ETC. SETZB IOS,DSKCON ;*CLEAR THE DSK I/O STATUS ACCUMULATOR, AND ;* THE INTERRUPT ENABLED MARKER, CONSZ DSK,DATERR ;*SET APPROPRIATE ERROR BITS (IF TRO IOS,IODTER ;* ANY) IN ACCUMULATOR IOS FOR CONSZ DSK,DEVERR!SETERR ;* DEVICE INDEPENED ROUTINE TO HANDLE. TRO IOS,IODERR ;* CONSZ DSK,WRPE ;* TRO IOS,IOIMPM ;* ;CLEAR OUT THE DISK SYNCHRONIZER AND LEAVE IT DETACHED FROM ITS INTERRUPT CHANNEL. CONO DSK,ALLERR!RESETB MOVE TAC,RCXCCW ;*PICK UP THE FINAL VALUE FO THE CHANNEL CONTROL WORD. CAMN TAC,RCXFIN ;*DOES IT AGREE WITH THE SAVED VALUE WE EXPECTED ? JRST DFINT ;*YES, EXIT TO THE DEVICE INDEPENDENT INTERRUPT ;* HANDLING ROUTINE IN "DSKSER"......... MOVE TAC1,DSKISV ;* TRNE TAC1,CHCPAR ;*CHANNEL CONTROL WORD PARITY ERROR DETECTED ? JRST DSKNT2 ;*YES, SET ERROR BIT, EXIT TO DSKSER TO TRY 2 TIMES, HRRZ TAC1,RCXFIN ;*NO, STOP AND DEAD UNLESS THE LAST DATA ADDRES CAIGE TAC1,(TAC) ;* REFERENCED WAS WITHIN THE RANGE OF THE REQUESTED JRST DSKNT1 ;* TRANSFER, IF IT WAS IN RANGE, SOME ERROR MUST HRRZ TAC1,@RCXIOC ;* HAVE ABORTED PART OF THE DATA TRANSFER, THUS THE CAILE TAC1,(TAC) ;* "DEVICE ERROR" BIT SHOULD BE TURNED BEFORE JRST DSKNT1 ;* EXITING TO THE DEVICE INDEPENDENT ROUTINE. DSKNT2: TRO IOS,IODERR ;* JRST DFINT ;* DSKNT1: SKIPE RCXCCW ;*MAYBE CHANNEL WAS TURNED OFF ? HALT . ;*NO--SERIOUS CHANNEL MALFUNCTION--CALL REPAIR MAN! PUSH PDP,ITEM ;* MOVEI ITEM,0 ;*SEND ERROR MESSAGE TO OPERATOR CONSOLE JSP TAC,ERRPNT ;* ASCIZ /DISK DATA CHANNEL TURNED ON ? / POP PDP,ITEM ;* JRST DSKNT2 ;* ;A ROUTINE CALLED DURING SYSTEM INITIALIZATION TO BE SURE DISK IS READY, ; NOTE: THIS ROUTINE DESTROYS ACCUMULATOR TAC. DISKUP: CONO DSK,ALLERR!RESETB ;CLEAR THE DISK SYNCHRONIZER. CONSZ DSK,NRDY!PSF!BUSYBT!DONEFLG ;ANYTHING AMISS OR STUCK ? JRST DISKUP ;IF SO, JUST HANGE HERE IN A LOOP. DATAI DSK,TAC ;IS THE SECTOR COUNTER GOING ? JUMPE TAC,.-1 ;IF NOT, JUST LOOP HERE. ;*** THIS LOOP ABOVE WILL OCCUR DURING INITIALIZATION IF THE DISK IS OFF-LINE. *** HRRZI TAC,DSKBIT ;IF NOT, ENABLE DISK INTERRUPTS ON THE CONO PI,2200(TAC) ; APPRORIATE PRIORITY INTERRUPT CHANNEL. POPJ PDP, ;SUBROUTINE EXIT.....,*** ;SUBROUTINE TO CONVERT LOGICAL BLOCK NUMBERS TO PHYSICAL DISK ADDRESSES ;CALLING SEQUENCE -- ; PUSHJ PDP,CNVBLK ; NORMAL RETURN (ONE "IMPOSSIBLE" ERROR COULD OCCUR) ;ENTRY CONDITIONS-- ; C(TAC) = RH IS THE LOGICAL BLOCK NUMBER TO BE CONVERTED; LH MAY BE NON-ZERO ;EXIT CONDITIONS-- ; C(TAC) = C(DFORDR0 = THE CORRESPONDING PHYSICAL DISK ADDRESS CORRECTLY ; POSITIONED FOR A DATAO TO THE RC-10 DISK SYNCHRONIZER. EXTERNAL ERRPNT,ERRPTU CNVBLK: MOVEM TAC,SVLBLK ;ONLY FOR FOOTPRINTS IN CASE OF CRASH. TLZ TAC,-1 ;CLEAR NON-USEFUL LEFT HALF OF LOGICAL BLOCK NUMBER. INTERNAL FTRCHK IFN FTRCHK, < CAMLE TAC,LBHIGH ;IS LOGICAL BLOCK NUMBER IN RANGE? SKIPN LBHIGH ;NO. BUT IF LBHIGH IS STILL 0 WE MUST STILL BE JRST CNVBK1 ; DOING THE INTITIALIZATION IN "ONCE", SO IT'S OKAY. ;INTERNAL MONITOR ERROR IF DSKSER OR SCHEDU COMES HERE WITH A LOGICAL ; DISK BLOCK NUMBER THAT IS OUT OF RANGE..... HALT .+1 ;HALT ON THIS IMPOSSIBLE ERROR POP PDP,DSKISV ;CORRECT PUSH DOWN POINTER AND LEAVE ;INDICATOR MOVEI IOS,IODERR ;UPON CONTINUING PREDEDN I/O COMPLETED ;WITH DEVICE ERROR, JRST DFINT CNVBK1: > PUSH PDP,TAC1 ;THIS RTN SAVES AND RESTORES TAC1. IDIVI TAC,^D4000 ;DETERMINE DISK NUMBER ROT TAC,-2 MOVEM TAC,DFORDR ;SAVE DISK NUMBER AWAY. MOVE TAC,TAC1 IDIVI TAC,^D20 ;SELECT TRACK NUMBER. PUSH PDP,TAC1 IDIVI TAC,^D10 ;CONVERT TRACK NUMBER TO BCD. CAIL TAC,^D10 ADDI TAC,6 ;SHORT-CUT BECAUSE FIRST DIGIT IS 0 OR 1. LSH TAC,4 OR TAC,TAC1 ROT TAC,-^D11 ORM TAC,DFORDR ;PUT TRACK NUMBER AWAY ALSO. POP PDP,TAC ;NOW RETRIEVE SEGMENT NUMBER. LSH TAC,2 ;MULTIPLY BY 4 (FOR PHYSICAL IDIVI TAC,^D10 ; SEGMENTS PER LOGICAL BLOCK) LSH TAC,4 OR TAC,TAC1 ;SEGMENT NUMBER MUST BE IN BCD ALSO. HRLZS TAC ORB TAC,DFORDR ;FINALLY, JOIN SEGMENT NUMBER TO POP PDP,TAC1 ; EARLIER CALCULATED PARTS OF ADDRESS, POPJ PDP, ;SUBROUTINE EXIT.,....*** IFN FTCHECK+FTMONP, < EXTERNAL RCXDAT ;TO CAUSE THE CORRECT COPY OF "DSKDAT" TO BE ; RETRIEVED BY THE SYSTEM BUILDER. EXTERNAL DSKCON,WRCHNL,RDCHNL,DSKISV,RCXFIN EXTERNAL SVLBLK,DFORDR > IFE FTCHECK+FTMONP, < INTERNAL DSKCON,LBHIGH,WRCHNL,RDCHNL,DSKISV,RCXFIN,SVLBLK,DFORDR DSKCON: 0 ;ENABLED INTERRUPT CONDITIONS STORED HERE BY "STARTDV", LBHIGH: 0 ;HIGHEST LEGAL LOGICAL BLOCK NUMBER. WRCHNL: 0 ;CHANNEL CONTROL WORD OF LAST DISK WRITE. Z ;CHANNEL TERMINATION WORD. RDCHNL: 0 ;CHANNEL CONTROL WORD OF LAST DISK READ. Z ;ZERO WORD TO TERMINATE CHANNEL. DSKISV: 0 ;RESULT OF LAST CONI ON A DISK INTERRUPT. RCXFIN: 0 ;EXPECTED VALUE OF CHANNEL CONTROL WORD (RCXCCW) AT ; THE END OF THE CURRENT DISK TRANSFER. SVLBLK: 0 ;LAST LOGICAL BLOCK NUMBER CONVERTED. DFORDR: 0 ;ITS CORRESPONDING PHYSICAL DISK ADDRESS. > DSKEND: END