2b3f23993a41c5b581af3eea8f7c595e742c7937
[retro-software/dec/tops10/v4.5.git] / src / dskint.mac
1 TITLE   DSKINT - PDP-10 RC-10 DISK INTERRUPT SERVICE V403S\r
2 SUBTTL  A. FRANTZ/TH  TS  5 FEB 69\r
3         XP      VDSKIT,403\r
4                 ;PUT VERSION NUMBER IN GLOB LISTING AND LOADER STORAGE MAP\r
5 \r
6 ENTRY   RCXINT  ;THIS SYMBOL IS SOLELY TO PERMIT SYSTEM\r
7 RCXINT:         ; BUILDER TO RETRIEVE THE CORRECT BINARY FILE.\r
8 \r
9 INTERNAL        DSKINT,DFWRT,DFRED,DSKFDG,DISKUP,FTCHECK,FTMONP,FTRCHK\r
10         \r
11 EXTERNAL        DSKCHN,DSKBIT,DSKSAV,DFINT,RCXIOC,RCXCCW\r
12 \r
13 DSK=170         ;DEVICE NUMBER ASSIGNED TO THE MODEL RC-10 DISK SYNCHRONIZER.\r
14 \r
15 \r
16 ;CONI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER --\r
17 \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
44 \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
50 \f\r
51 ;CONO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER\r
52 \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
61 \r
62 ;DATAI FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER --\r
63 \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
69 \r
70 ;DATAO FORMAT FOR THE MODEL RC-10 DISK SYNCHRONIZER --\r
71 \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
83 \f\r
84 ;SUBROUTINE "DFWRT" IS CALLED TO START UP A WRITE ON THE DISK.\r
85 \r
86 ;CALLING SEQUENCE  --\r
87 ;       PUSHJ   PDP,DFWRT\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
94 ;EXIT CONDITIONS --\r
95 ;       THE REQUESTED WRITE HAS BEEN BEGUN\r
96 ;       TAC AND TAC1 HAVE BEEN DESTORYED\r
97 \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
103 \r
104 IFN     FTRCHK,<\r
105         EXTERN SATM2\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
109                                  ;OF SAT TABLE-2\r
110         HALT    .               ;HALT - DO NOT WRITE OUT MONITOR - CONTINUE\r
111                                  ;WILL LOOP\r
112 >\r
113         MOVEI   TAC1,WRCHNL\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
123         STARTDV DSK\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
127         MOVE    TAC1,RCXIOC\r
128         HRLI    TAC,1(TAC)\r
129         MOVEM   TAC,RCXFIN\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
134 \f\r
135 ;SUBROUTINE "DFRED" IS CALLED TO START UP A READ FROM THE DISK.\r
136 \r
137 ;THE CALLING SEQUENCE, ENTRY CONDITIONS, AND EXIT CONDITIONS ARE EXACTLY\r
138 ; SIMILAR TO THOSE FOR SUBROUTINE "DFWRT" ABOVE.\r
139 \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
145 IFN     FTRCHK,<\r
146         EXTERN SATM2\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
149                                  ;OF SAT TABLE-2\r
150         HALT    .               ;HALT - DO NOT WRITE OUT MONITOR - CONTINUE\r
151                                  ;WILL LOOP\r
152 >\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
158 \f\r
159 ;A ROUTINE CALLED DURING SYSTEM INITIALIZATION TO BE SURE DISK IS READY,\r
160 ; NOTE: THIS ROUTINE DESTROYS ACCUMULATOR TAC.\r
161 \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
171 \f\r
172 ;DISK INTERRUPTS COME HERE TO BE SERVICED --\r
173 \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
178 \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
186         TRO     IOS,IODERR      ;*\r
187         CONSZ   DSK,WRPE        ;*\r
188         TRO     IOS,IOIMPM      ;*\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
205         JRST    DFINT           ;*\r
206 \r
207 DSKNT1: SKIPE   RCXCCW          ;*MAYBE CHANNEL WAS TURNED OFF ?\r
208         HALT    .               ;*NO--SERIOUS CHANNEL MALFUNCTION--CALL REPAIR MAN!\r
209         PUSH    PDP,ITEM        ;*\r
210         MOVEI   ITEM,0          ;*SEND ERROR MESSAGE TO OPERATOR CONSOLE\r
211         JSP     TAC,ERRPNT      ;*\r
212         ASCIZ   /DISK DATA CHANNEL TURNED ON ?\r
213 /\r
214         POP     PDP,ITEM        ;*\r
215         JRST    DSKNT2          ;*\r
216 \f\r
217 ;SUBROUTINE TO CONVERT LOGICAL BLOCK NUMBERS TO PHYSICAL DISK ADDRESSES\r
218 \r
219 ;CALLING SEQUENCE --\r
220 ;       PUSHJ   PDP,CNVBLK\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
224 ;EXIT CONDITIONS--\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
227 \r
228 EXTERNAL        ERRPNT,ERRPTU\r
229 \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
232 INTERNAL        FTRCHK\r
233 IFN     FTRCHK, <\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
241                                  ;INDICATOR\r
242         MOVEI IOS,IODERR        ;UPON CONTINUING PREDEDN I/O COMPLETED\r
243                                  ;WITH DEVICE ERROR,\r
244         JRST    DFINT\r
245 CNVBK1:\r
246 >\r
247         PUSH    PDP,TAC1        ;THIS RTN SAVES AND RESTORES TAC1.\r
248         IDIVI   TAC,^D4000      ;DETERMINE DISK NUMBER\r
249         ROT     TAC,-2\r
250         MOVEM   TAC,DFORDR      ;SAVE DISK NUMBER AWAY.\r
251         MOVE    TAC,TAC1\r
252         IDIVI   TAC,^D20        ;SELECT TRACK NUMBER.\r
253         PUSH    PDP,TAC1\r
254         IDIVI   TAC,^D10        ;CONVERT TRACK NUMBER TO BCD.\r
255         CAIL    TAC,^D10\r
256         ADDI    TAC,6   ;SHORT-CUT BECAUSE FIRST DIGIT IS 0 OR 1.\r
257         LSH     TAC,4\r
258         OR      TAC,TAC1\r
259         ROT     TAC,-^D11\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
264         LSH     TAC,4\r
265         OR      TAC,TAC1        ;SEGMENT NUMBER MUST BE IN BCD ALSO.\r
266         HRLZS   TAC\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
270 \f\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
276 >\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
290 \r
291 >\r
292 DSKEND: END\r
293 \0\0\0\0