1 TITLE DSKINT - PDP-10 RC-10 DISK INTERRUPT SERVICE V403S
\r
2 SUBTTL A. FRANTZ/TH TS 5 FEB 69
\r
4 ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP
\r
6 ENTRY RCXINT ;THIS SYMBOL IS SOLELY TO PERMIT SYSTEM
\r
7 RCXINT: ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE.
\r
9 INTERNAL DSKINT,DFWRT,DFRED,DSKFDG,DISKUP,FTCHECK,FTMONP,FTRCHK
\r
11 EXTERNAL DSKCHN,DSKBIT,DSKSAV,DFINT,RCXIOC,RCXCCW
\r
13 DSK=170 ;DEVICE NUMBER ASSIGNED TO THE MODEL RC-10 DISK SYNCHRONIZER.
\r
16 ;CONI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER --
\r
18 ;BITS 00 - 17 MAINTENANCE PANEL SWITCH SETTINGS INDICATORS --
\r
19 ;BITS 00 - 04 UNUSED
\r
20 MSS=1B5 ;SET INDICATES "MAINTENANCE SEGMENT SELECTED" (SEGMENT 81),
\r
21 PLGSW=1B6 ;1 = WRITE-PROTECT EVERYTHING BELOW (LESS THAN) THE BOUNDARY,
\r
22 ; 0 = WRITE-PROTECT EVERYTHING ABOVE (GREATER THAN) BOUNDARY,
\r
23 ;THE CURRENT IMPLEMENTATION OF THE RC-10 DISK SYNCHRONIZER
\r
24 ; DOES NOT PERMIT SENSING THE INCLUSION OF THE BOUNDARY.
\r
25 ;BITS 07 - 17 THE WRITE-PROTECTION THE INCLUSION OF THE BOUNDARY.
\r
26 DTOP=1B18 ;SET INDICATES DATA TRANSFER IN PROGRESS.
\r
27 ;BITS 19 -29 ERROR CONDITIONS INDICATORS (ERROR WHEN SET) --
\r
28 SRCHE=1B19 ;SEARCH ERROR (DISK TIMING TRACK PROBLEMS!!)
\r
29 DDE=1B20 ;DISK DESIGNATION ERROR
\r
30 TSE=1B21 ;TRACK SELECT ERROR (OR EXCEEDS SYSTEM CAPACITY)
\r
31 NRDY=1B22 ;DISK NOT READY (OR NON-EXISTENT DISK REFERENCED)
\r
32 PSF=1B23 ;POWER SUPPLY FAILURE
\r
33 DPAR=1B24 ;DISK PARITY ERROR
\r
34 CHDPAR=1B25 ;CHANNEL DATA PARITY ERROR
\r
35 CHCPAR=1B26 ;CHANNEL CONTROL PARITY ERROR
\r
36 NXMEM=1B27 ;NON-EXISTENT MEMORY REFERENCED
\r
37 WRPE=1B28 ;ATTEMPTED TO WRITE IN PROTECTED DISK AREA (SEE BITS 06 - 17)
\r
38 OVR=1B29 ;OVERRUN, I.E., MEMORY DIDN'T RESPOND QUICKLY ENOUGH
\r
39 ;BIT 30 CHANNEL CONTROL WORD WRITTEN IN MEMORY (THIS BIT IS
\r
40 ;TURNED ON ON ALMOST ALL TERMINATIONS.)
\r
41 BUSYBT=1B31 ;BUSY (SYNCHRONIZER PERFORMING A COMMAND SEQUENCE)
\r
42 DONEFLG=1B32 ;DONE -- THIS ACTUALLY CAUSES THE INTERRUPT.
\r
43 ;BITS 33 - 35 PI CHANNEL SELECTION BITS.
\r
45 ;COMBINATIONS OF ERRO BITS GROUPED BY TYPE --
\r
46 DATERR=DPAR!CHDPAR ;DATA ERRORS.
\r
47 DEVERR=SRCHE!PSF!CHCPAR!OVR ;DEVICE ERRORS.
\r
48 SETERR=DDE!TSE!NRDY!NXMEM ;SOFTWARE-PREVENTABLE ERRORS.
\r
49 ALLERR=DATERR!DEVERR!SETERR!WRPE ;ALL POSSIBLE ERRORS.
\r
51 ;CONO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER
\r
53 ;BITS 00 - 17 UNUSED
\r
54 ;BITS 18 - 19 SELECT DISK FOR SECTOR COUNTER READ-OUT A(SEE DATAI BITS 28-35)
\r
55 ;BITS 20 - 29 RESET THE CORRESPONDING CONI ERROR BIT
\r
56 ;(BUT PSE MAY REFUSE TO BE RESET)
\r
57 WRCCWD=1B30 ;WRITE THE CHANNEL CONTROL WORD INTO MEMORY (NOW!)
\r
58 STPBIT=1B31 ;STOP -- IMMEDIATELY CEASE PRESENT I/O AND CLEAR THE CHANNEL.
\r
59 RESETB=1B32 ;RESET THE DONE FLAG (CORRESPONDING CONI BIT) TO CLEAR INTERRUPT
\r
60 ;BITS 33 - 35 PI CHANNEL SELECTION BITS
\r
62 ;DATAI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER --
\r
64 ;BITS 00 - 17 UNUSED
\r
65 ;BITS 18 - 23 PARITY REGISTER
\r
66 ;BITS 24 - 25 UNUSED
\r
67 ;BITS 26 - 27 DISK SELECTED BY BITS 18-19 OF LAST CONO
\r
68 ;BITS 28 - 35 CURRENT SECTOR POSITION OF SELECTED DISK (FOR LATENCY OPTIMIZATION!)
\r
70 ;DATAO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER --
\r
72 ;BITS 00 - 17 DISK ADDRESS ELECTION
\r
73 ;BITS 00 - 01 DISK SELECT
\r
74 ;BITS 02 - 10 TRACK SELECT (BCD, BUT FIRST CHAR IS JUST 1 BIT)
\r
75 ;BITS 11 - 17 SEGMENT SELECT (BCD, BUT FIRST CHAR HAS ONLY 3 BITS)
\r
76 ;BITS 18 - 23 INITIAL PARITY REGISTER SETTING 9ZERO EXCEPT FOR DIAGNOSTIC PROGRAMS)
\r
77 DDSKPE=1B24 ;DISABLE DISK PARITY ERROR STOP
\r
78 DCHNPE=1B25 ;DISABLE CHANNEL DATA PARITY ERROR STOP
\r
79 WRBIT=1B26 ;SET MEANS WRITE ON DISK, RESET MEANS READ FROM DISK
\r
80 ;BITS 27 - 34 ;CORRESPONDING BITS OF INITIAL CHANNEL CONTROL ADDRESS, HENCE,
\r
81 ; THIS ADDRESS MUST BE EVEN AND IN THE FIRST 1K OF CORE MEMORY!
\r
82 ;BIT 35 ;WRITE EVEN PARITY DATA INTO MEMORY (DIAGNOSTICS ONLY!)
\r
84 ;SUBROUTINE "DFWRT" IS CALLED TO START UP A WRITE ON THE DISK.
\r
86 ;CALLING SEQUENCE --
\r
88 ; RETURN WHEN WRITE HAS BEEN STARTED.
\r
89 ;ENTRY CONDITIONS --
\r
90 ; C(TAC 18-35) = LOGICAL BLOCK NUMBER AT WHICH TO START WRITING,
\r
91 ; C(TAC1) = IOWD, I.E.,
\r
92 ; C(TAC1 00-17) = 2'S COMPLEMENT OF WORD COUNT TO BE WRITTEN
\r
93 ; C(TAC1 18-25) = ADDRESS OF FIRST DATA WORD TO BE WRITTEN
\r
95 ; THE REQUESTED WRITE HAS BEEN BEGUN
\r
96 ; TAC AND TAC1 HAVE BEEN DESTORYED
\r
98 DFWRT: CONSZ DSK,BUSYBT ;FOR SAFETY SAKE BE SURE THE DISK IS
\r
99 JRST .-1 ; FREE NOW (THIS MAY BE A REDUNDANT CHECK).
\r
100 MOVEM TAC1,WRCHNL ;SET UP CHANNEL COMMAND SEQUENCE.
\r
101 SETZM WRCHNL+1 ;MAKE SURE NEXT COMMAND IS 0, SO CHANNEL
\r
102 ; WILL NOT WRITE ALL OVER DISK
\r
106 MOVEI TAC1,1(TAC1) ;CLEAR LH AND COMPARE WITH
\r
107 ; FIRST WORD AFFECTED
\r
108 CAIG TAC1,SATM2 ;COMPARE ABS CORE ADDRESS TO BEGINNING
\r
110 HALT . ;HALT - DO NOT WRITE OUT MONITOR - CONTINUE
\r
114 MOVEM TAC1,RCXIOC ;RCX10C IS MAGIC EVEN LOCATION IN FIRST 1K OF CORE.
\r
115 PUSHJ PDP,CNVBLK ;CONVERT LOGICAL BLOCK NO. INTO PHYSICAL DISK ADDRESS.
\r
116 ORI TAC,WRBIT ;REQUEST WRITE (INSTEAD OF READ)
\r
117 DFWRTC: ORI TAC,RCXIOC
\r
118 MOVEM TAC,DFORDR ;SAVE RC-10 DATAO COMMAND
\r
119 DSKFDG: HRRZI TAC,DSKCHN ;THIS INSTRUCTION TEMPORARILY ALTERED DURING "ONCE".
\r
120 IORI TAC,ALLERR!RESETB
\r
121 HRLI TAC,DONEFLG ;TO SET INTERRUPT CONDITIONS IN DSKCON.
\r
122 ;READY THE DISK SYNCHRONIZER ---
\r
124 HRRZ TAC,@RCXIOC ;COMPUTE AND SAVE THE VALUE WHICH THE
\r
125 HLRE TAC1,@RCXIOC ; CHANNEL CONTROL WORD SHOULD CONTAIN UPON
\r
126 SUB TAC,TAC1 ; SUCCESSFUL COMPLETION OF THE DISK OPERATION.
\r
130 SETZM RCXCCW ;ZERO THE LOCATION WHERE THE DISK SYNCRONIZER WILL
\r
131 ; STORE THE CHANNEL CONTROL WORD.
\r
132 DATAO DSK,DFORDR ;START UP DISK AND DATA CHANNEL.
\r
133 POPJ PDP, ;SUBROUTINE EXIT.,......***
\r
135 ;SUBROUTINE "DFRED" IS CALLED TO START UP A READ FROM THE DISK.
\r
137 ;THE CALLING SEQUENCE, ENTRY CONDITIONS, AND EXIT CONDITIONS ARE EXACTLY
\r
138 ; SIMILAR TO THOSE FOR SUBROUTINE "DFWRT" ABOVE.
\r
140 DFRED: CONSZ DSK,BUSYBT ;POSSIBLY REDUNDANT CHECK TO BE
\r
141 JRST .-1 ; SURE THE DISK IS FREE.
\r
142 MOVEM TAC1,RDCHNL ;SET UP READ CHANNEL ORDERS IN A SEPARATE
\r
143 SETZM RDCHNL+1 ;MAKE SURE NEXT COMMAND IN LIST IS 0
\r
144 ; SO CHANNEL WILL NOT WRITE ALL OVER MEMORY
\r
147 MOVEI TAC1,1(TAC1) ;CLEAR LH AND COMPARE WITH FIRST WORD AFFECTED
\r
148 CAIG TAC1,SATM2 ;COMPARE ABS CORE ADDRESS TO BEGINNING
\r
150 HALT . ;HALT - DO NOT WRITE OUT MONITOR - CONTINUE
\r
153 MOVEI TAC,RDCHNL ; PLACE FROM WRITE CONTROL WORDS FOR
\r
154 MOVEM TAC,RCXIOC ; BETTER FOOTPRINTS IN CASE OF A CRASH.
\r
155 PUSHJ PDP,CNVBLK ;CONVERT LOGICAL BLOCK NUMBER TO PHYSICAL DISK ADDRESS.
\r
156 JRST DFWRTC ;REMAINDER OF THIS READ ROUTINE IS
\r
157 ; IDENTICAL TO WRITING.
\r
159 ;A ROUTINE CALLED DURING SYSTEM INITIALIZATION TO BE SURE DISK IS READY,
\r
160 ; NOTE: THIS ROUTINE DESTROYS ACCUMULATOR TAC.
\r
162 DISKUP: CONO DSK,ALLERR!RESETB ;CLEAR THE DISK SYNCHRONIZER.
\r
163 CONSZ DSK,NRDY!PSF!BUSYBT!DONEFLG ;ANYTHING AMISS OR STUCK ?
\r
164 JRST DISKUP ;IF SO, JUST HANGE HERE IN A LOOP.
\r
165 DATAI DSK,TAC ;IS THE SECTOR COUNTER GOING ?
\r
166 JUMPE TAC,.-1 ;IF NOT, JUST LOOP HERE.
\r
167 ;*** THIS LOOP ABOVE WILL OCCUR DURING INITIALIZATION IF THE DISK IS OFF-LINE. ***
\r
168 HRRZI TAC,DSKBIT ;IF NOT, ENABLE DISK INTERRUPTS ON THE
\r
169 CONO PI,2200(TAC) ; APPRORIATE PRIORITY INTERRUPT CHANNEL.
\r
170 POPJ PDP, ;SUBROUTINE EXIT.....,***
\r
172 ;DISK INTERRUPTS COME HERE TO BE SERVICED --
\r
174 DSKINT: CONSO DSK,@DSKCON ;*DID THE DISK SYNCHRONIZER CAUSE THE INTERRUPT ON
\r
175 JRST .-1 ;* THIS CHANNEL? IF NOT, GO TO THE NEXT DEVICE ON
\r
176 ;* THE SAME PRIORTY INTERRUPT CHANNEL.
\r
177 ; NOTE: THE "JRST .-1" IS ALTERED BY THE SYSTEM BUILDER PROGRAM.
\r
179 CONI DSK,DSKISV ;*SOLELY TO LEAVE FOOTPRINTS.
\r
180 JSR DSKSAV ;*SAVE ACCUMULATORS, ETC.
\r
181 SETZB IOS,DSKCON ;*CLEAR THE DSK I/O STATUS ACCUMULATOR, AND
\r
182 ;* THE INTERRUPT ENABLED MARKER,
\r
183 CONSZ DSK,DATERR ;*SET APPROPRIATE ERROR BITS (IF
\r
184 TRO IOS,IODTER ;* ANY) IN ACCUMULATOR IOS FOR
\r
185 CONSZ DSK,DEVERR!SETERR ;* DEVICE INDEPENED ROUTINE TO HANDLE.
\r
189 ;CLEAR OUT THE DISK SYNCHRONIZER AND LEAVE IT DETACHED FROM ITS INTERRUPT CHANNEL.
\r
190 CONO DSK,ALLERR!RESETB
\r
191 MOVE TAC,RCXCCW ;*PICK UP THE FINAL VALUE FO THE CHANNEL CONTROL WORD.
\r
192 CAMN TAC,RCXFIN ;*DOES IT AGREE WITH THE SAVED VALUE WE EXPECTED ?
\r
193 JRST DFINT ;*YES, EXIT TO THE DEVICE INDEPENDENT INTERRUPT
\r
194 ;* HANDLING ROUTINE IN "DSKSER".........
\r
195 MOVE TAC1,DSKISV ;*
\r
196 TRNE TAC1,CHCPAR ;*CHANNEL CONTROL WORD PARITY ERROR DETECTED ?
\r
197 JRST DSKNT2 ;*YES, SET ERROR BIT, EXIT TO DSKSER TO TRY 2 TIMES,
\r
198 HRRZ TAC1,RCXFIN ;*NO, STOP AND DEAD UNLESS THE LAST DATA ADDRES
\r
199 CAIGE TAC1,(TAC) ;* REFERENCED WAS WITHIN THE RANGE OF THE REQUESTED
\r
200 JRST DSKNT1 ;* TRANSFER, IF IT WAS IN RANGE, SOME ERROR MUST
\r
201 HRRZ TAC1,@RCXIOC ;* HAVE ABORTED PART OF THE DATA TRANSFER, THUS THE
\r
202 CAILE TAC1,(TAC) ;* "DEVICE ERROR" BIT SHOULD BE TURNED BEFORE
\r
203 JRST DSKNT1 ;* EXITING TO THE DEVICE INDEPENDENT ROUTINE.
\r
204 DSKNT2: TRO IOS,IODERR ;*
\r
207 DSKNT1: SKIPE RCXCCW ;*MAYBE CHANNEL WAS TURNED OFF ?
\r
208 HALT . ;*NO--SERIOUS CHANNEL MALFUNCTION--CALL REPAIR MAN!
\r
210 MOVEI ITEM,0 ;*SEND ERROR MESSAGE TO OPERATOR CONSOLE
\r
212 ASCIZ /DISK DATA CHANNEL TURNED ON ?
\r
217 ;SUBROUTINE TO CONVERT LOGICAL BLOCK NUMBERS TO PHYSICAL DISK ADDRESSES
\r
219 ;CALLING SEQUENCE --
\r
221 ; NORMAL RETURN (ONE "IMPOSSIBLE" ERROR COULD OCCUR)
\r
222 ;ENTRY CONDITIONS--
\r
223 ; C(TAC) = RH IS THE LOGICAL BLOCK NUMBER TO BE CONVERTED; LH MAY BE NON-ZERO
\r
225 ; C(TAC) = C(DFORDR0 = THE CORRESPONDING PHYSICAL DISK ADDRESS CORRECTLY
\r
226 ; POSITIONED FOR A DATAO TO THE RC-10 DISK SYNCHRONIZER.
\r
228 EXTERNAL ERRPNT,ERRPTU
\r
230 CNVBLK: MOVEM TAC,SVLBLK ;ONLY FOR FOOTPRINTS IN CASE OF CRASH.
\r
231 TLZ TAC,-1 ;CLEAR NON-USEFUL LEFT HALF OF LOGICAL BLOCK NUMBER.
\r
234 CAMLE TAC,LBHIGH ;IS LOGICAL BLOCK NUMBER IN RANGE?
\r
235 SKIPN LBHIGH ;NO. BUT IF LBHIGH IS STILL 0 WE MUST STILL BE
\r
236 JRST CNVBK1 ; DOING THE INTITIALIZATION IN "ONCE", SO IT'S OKAY.
\r
237 ;INTERNAL MONITOR ERROR IF DSKSER OR SCHEDU COMES HERE WITH A LOGICAL
\r
238 ; DISK BLOCK NUMBER THAT IS OUT OF RANGE.....
\r
239 HALT .+1 ;HALT ON THIS IMPOSSIBLE ERROR
\r
240 POP PDP,DSKISV ;CORRECT PUSH DOWN POINTER AND LEAVE
\r
242 MOVEI IOS,IODERR ;UPON CONTINUING PREDEDN I/O COMPLETED
\r
243 ;WITH DEVICE ERROR,
\r
247 PUSH PDP,TAC1 ;THIS RTN SAVES AND RESTORES TAC1.
\r
248 IDIVI TAC,^D4000 ;DETERMINE DISK NUMBER
\r
250 MOVEM TAC,DFORDR ;SAVE DISK NUMBER AWAY.
\r
252 IDIVI TAC,^D20 ;SELECT TRACK NUMBER.
\r
254 IDIVI TAC,^D10 ;CONVERT TRACK NUMBER TO BCD.
\r
256 ADDI TAC,6 ;SHORT-CUT BECAUSE FIRST DIGIT IS 0 OR 1.
\r
260 ORM TAC,DFORDR ;PUT TRACK NUMBER AWAY ALSO.
\r
261 POP PDP,TAC ;NOW RETRIEVE SEGMENT NUMBER.
\r
262 LSH TAC,2 ;MULTIPLY BY 4 (FOR PHYSICAL
\r
263 IDIVI TAC,^D10 ; SEGMENTS PER LOGICAL BLOCK)
\r
265 OR TAC,TAC1 ;SEGMENT NUMBER MUST BE IN BCD ALSO.
\r
267 ORB TAC,DFORDR ;FINALLY, JOIN SEGMENT NUMBER TO
\r
268 POP PDP,TAC1 ; EARLIER CALCULATED PARTS OF ADDRESS,
\r
269 POPJ PDP, ;SUBROUTINE EXIT.,....***
\r
271 IFN FTCHECK+FTMONP, <
\r
272 EXTERNAL RCXDAT ;TO CAUSE THE CORRECT COPY OF "DSKDAT" TO BE
\r
273 ; RETRIEVED BY THE SYSTEM BUILDER.
\r
274 EXTERNAL DSKCON,WRCHNL,RDCHNL,DSKISV,RCXFIN
\r
275 EXTERNAL SVLBLK,DFORDR
\r
277 IFE FTCHECK+FTMONP, <
\r
278 INTERNAL DSKCON,LBHIGH,WRCHNL,RDCHNL,DSKISV,RCXFIN,SVLBLK,DFORDR
\r
279 DSKCON: 0 ;ENABLED INTERRUPT CONDITIONS STORED HERE BY "STARTDV",
\r
280 LBHIGH: 0 ;HIGHEST LEGAL LOGICAL BLOCK NUMBER.
\r
281 WRCHNL: 0 ;CHANNEL CONTROL WORD OF LAST DISK WRITE.
\r
282 Z ;CHANNEL TERMINATION WORD.
\r
283 RDCHNL: 0 ;CHANNEL CONTROL WORD OF LAST DISK READ.
\r
284 Z ;ZERO WORD TO TERMINATE CHANNEL.
\r
285 DSKISV: 0 ;RESULT OF LAST CONI ON A DISK INTERRUPT.
\r
286 RCXFIN: 0 ;EXPECTED VALUE OF CHANNEL CONTROL WORD (RCXCCW) AT
\r
287 ; THE END OF THE CURRENT DISK TRANSFER.
\r
288 SVLBLK: 0 ;LAST LOGICAL BLOCK NUMBER CONVERTED.
\r
289 DFORDR: 0 ;ITS CORRESPONDING PHYSICAL DISK ADDRESS.
\r