1 /FLOPPY DISK (RX01,RX71) NON-SYSTEM HANDLER FOR OS/8 2 / 3 / 4 / 5 / 6 / 7 / 8 / 9 / 10 / 11 /COPYRIGHT (C) 1977 BY DIGITAL EQUIPMENT CORPORATION 12 / 13 / 14 / 15 / 16 / 17 / 18 / 19 / 20 / 21 / 22 /THE INFORMATION IN THIS DOCUMENT IS SUBJECT TO CHANGE WITHOUT NOTICE 23 /AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL EQUIPMENT 24 /CORPORATION. DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY 25 /FOR ANY ERRORS THAT MAY APPEAR IN THIS DOCUMENT. 26 / 27 /THE SOFTWARE DESCRIBED IN THIS DOCUMENT IS FURNISHED TO THE PURCHASER 28 /UNDER A LICENSE FOR USE ON A SINGLE COMPUTER SYSTEM AND CAN BE COPIED 29 /(WITH INCLUSION OF DIGITAL'S COPYRIGHT NOTICE) ONLY FOR USE IN SUCH 30 /SYSTEM, EXCEPT AS MAY OTHERWISE BE PROVIDED IN WRITING BY DIGITAL. 31 / 32 /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE 33 /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY 34 /DIGITAL. 35 / 36 / 37 / 38 / 39 / 40 / 41 / 42 / 43 / 44 / 45 /FLOPPY DISK (RX01,RX71) NON-SYSTEM HANDLER FOR OS/8 46 47 /DEFINITIONS OF RX8/E IOT'S 48 49 RXVER= "E&77 50 51 DEVCOD= 750 /DEVICECODE 52 53 LCD= 6001+DEVCOD /LOAD COMMAND REGISTER 54 XDR= 6002+DEVCOD /TRANSFER DATA REGISTER 55 STR= 6003+DEVCOD /SKIP ON TRANSFER REQUEST FLAG, CLEAR FLAG 56 SER= 6004+DEVCOD /SKIP ON ERROR FLAG, CLEAR FLAG 57 SDN= 6005+DEVCOD /SKIP ON DONE FLAG, CLEAR FLAG 58 INTR= 6006+DEVCOD /INTERRUPT ENABLE/DISABLE 59 INIT= 6007+DEVCOD /INITIALIZE CONTROLLER AND RECALIBRATE DRIVES 60 61 62 /NOTES ON THIS HANDLER: 63 64 /THIS HANDLER READS AND WRITES THE DISK IN "12-BIT" MODE, IN WHICH 65 /ONLY 6 BITS OF EVERY 8-BIT BYTE ARE USED. AN RX01 CARTRIDGE 66 /CONTAINS 494 OS/8 BLOCKS UNDER THIS METHOD 67 68 /TO MAXIMIZE SPEED ON THE DEVICE, THE HANDLER READS AND WRITES DATA 69 /ON A TRACK WITH A TWO-WAY INTERLEAVE - I.E. RECORDS 1-26 ON A TRACK 70 /ARE WRITTEN IN THE SEQUENCE: 71 / 1,3,5,7,9,11,13,15,17,19,21,23,25,2,4,6,8,10,12,14,16,18,20,22,24,26 72 73 /IN THIS WAY THE HANDLER CAN TRANSFER DATA AT A 5KHZ WORD RATE 74 75 /MODIFIED TO ALLOW ADDRESS CALCULATION DURING SECTOR BUFFER 76 /LOAD-UNLOAD. 77 *0 /ORIGIN FOR BUILD 78 79 000000 7776 -2 /TWO ENTRY POINTS 80 000001 2230 DEVICE RX01 /"RX01" IS THE GROUP NAME 000002 6061 81 000003 2230 DEVICE RXA0 /"RXA0" IS THE ENTRY POINT NAME 000004 0160 82 000005 4250 4250 /DCB WORD - DEVICE TYPE 25, DIRECTORY DEVICE 83 000006 0030 RXA0&177 /ENTRY POINT OFFSET 84 000007 0000 0 /THIS WORD ALWAYS SEEMS TO BE 0 85 000010 0000 0 /UNUSED FOR NONSYSTEM DEVICE 86 87 000011 2230 DEVICE RX01 /"RX01" IS THE GROUP NAME 000012 6061 88 000013 2230 DEVICE RXA1 /"RXA1" IS THE ENTRY POINT NAME 000014 0161 89 000015 4250 4250 /DCB WORD - DEVICE TYPE 25, DIRECTORY DEVICE 90 000016 0034 RXA1&177 /ENTRY POINT OFFSET 91 000017 0000 0 /THIS WORD ALWAYS SEEMS TO BE 0 92 000020 0000 0 /UNUSED FOR NONSYSTEM DEVICE 93 *200 /HANDLER CODE 94 95 000200 0000 BUF, 0 /USER BUFFER POINTER 96 000201 0000 REC, 0 /RX01 RECORD NUMBER BEFORE INTERLEAVING 97 000202 0000 BC, 0 /BLOCK COUNT OF TRANSFER 98 000203 0000 FN, 0 /FUNCTION, 0=WRITE, 2=READ 99 000204 0000 TRANS, 0 /TRANSFER COMMAND 100 101 FLPWC=. /100 COUNTER FOR SILO OK IN LDCMD ENTRY 102 000205 0000 LDCMD, 0 /WAIT FOR DONE FLAG AND LOAD CMD REG 103 000206 3204 DCA TRANS /SAVE THE NEW COMMAND REG VALUE 104 000207 1335 DONELP, TAD S7600 /SEE IF THE KEYBOARD BUFFER 105 000210 6034 KRS /CONTAINS A CONTROL/C CHARACTER 106 000211 1377 TAD (-7603 /(WITH OR WITHOUT PARITY) 107 000212 7100 CLL /KEEP LINK CLEAAR 108 000213 7650 SNA CLA 109 000214 6031 KSF /WITH THE FLAG UP. 110 000215 5220 JMP NOTCTC /IF NOT, CONTINUE 111 000216 6203 SCDIF0, CDF CIF 0 /IF SO, RETURN TO OS/8 112 000217 5735 JMP I S7600 113 114 000220 6755 NOTCTC, SDN /WAIT FOR THE DONE FLAG TO COME UP 115 000221 5207 JMP DONELP /BEFORE YOU LOAD THE COMMAND REGISTER 116 000222 1204 TAD TRANS /NOW GET THE NEW COMMAND REGISTER CONTENTS 117 000223 6751 LCD /AND LOAD IT. 118 000224 6754 SER /SKIP IF I/O ERROR 119 000225 5605 JMP I LDCMD /AND RETURN 120 000226 7330 CLA CLL CML RAR /SET AC TO 4000 121 000227 5345 JMP SRET /TAKE ERROR RETURN 122 123 124 000230 0005 RXA0, RXVER /ENTRY POINT FOR UNIT 0 125 000231 7200 CLA /BE PROTECTIVE 126 000232 5241 JMP RXCOMN /GO TO COMMON CODE 127 000233 0070 S70, 70 /** MUST BE AT 33 ON THIS PAGE** 128 129 IFNZRO S70&177-33 <.ERROR> 130 131 MQ, /DIVIDE TEMPORARY 132 000234 0005 RXA1, RXVER /ENTRY POINT FOR UNIT 1 133 000235 7200 CLA /CAREFUL, CAREFUL! 134 000236 1234 TAD RXA1 135 000237 3230 DCA RXA0 /PUT CALLING ADDR IN KNOWN PLACE 136 000240 1355 TAD DIVLP /GET "20" 137 000241 1362 RXCOMN, TAD DIVRAL /SET AC TO 20*UNIT+4 138 000242 3347 DCA UNIT /SAVE UNIT NUMBER 139 000243 6214 RDF 140 000244 1216 TAD SCDIF0 /REMEMBER CALLING FIELD FOR RETURN 141 000245 3345 DCA SRET 142 143 / OVERALL COMMENTS: 144 / 145 / LINK REMAINS 0 THROUGH THE MAIN PROCESSING LOOP 146 / EXCEPT AS MANIPULATED BY DIVSUB 147 / 148 / OVERALL LOOP CONTROL THROUGH BC IS MILDLY ODD. 149 / BC STARTS WITH MINUS COUNT OF THE # OF WORDS TO BE TRANSFERRED. 150 / BC IS INCREMENTED 77 TIMES AT THE SILO CODE, AND 1 TIME AFTER 151 / THE I/O OPERATION. 152 / A READ OPERATION STARTS AND FINISHES AT THE MIDDLE OF THE LOOP. 153 / A WRITE OEPRATION STARTS AT THE TOP, AND FINISHES AT BOTTOM. 154 / THUS, A 1 BLOCK READ INCREMENTS 1, 77, 1, 77 AND EXITS FROM MIDDLE. 155 / AND, A 1 BLOCK WRITE INCREMENTS 77, 1, 77, 1 AND EXITS FROM BOTTOM. 156 / 157 / DIVISION IS CARRIED OUT IN PARALLEL WITH I/O OPERATION BECAUSE OF 158 / TIMING CONSIDERATIONS OF THE VT78. 159 / 160 / THERE IS NO ERROR RETRY, NOT PARTICULARLY CRITICAL FOR A FLOPPY. 161 162 000246 7330 CLL CML CLA RAR /SET LINK=0, AC=4000 163 000247 1630 TAD I SYS /TO PUT READ-WRITE BIT TO LINK 164 000250 0233 S33, AND S70 /KEEP BITS FOR CDF 165 000251 1351 TAD SCDF0 /ADDING IN CDF LITERAL 166 000252 3302 DCA BUFCDF /CDF INSTRUCTION TO USER'S BUFFER 167 000253 7026 CML RTL /FUNCTION CODE, 0=WRITE, 2=READ 168 000254 3203 DCA FN 169 000255 1630 TAD I SYS /MAKE CONTROL COUNT 170 000256 7004 RAL 171 000257 0335 AND S7600 /MAKE CONTROL COUNT FOR TOTAL 172 000260 7041 CIA /NUMBER OF WORDS 173 000261 3202 DCA BC 174 000262 2230 ISZ SYS 175 000263 1630 TAD I SYS /FETCH BUFFER ADDRESS 176 000264 3200 DCA BUF 177 000265 2230 ISZ SYS 178 000266 1630 TAD I SYS /OS8 BLOCK # 179 000267 7106 CLL RTL /TIMES 4 TO BE FLOPPY SECTOR # 180 000270 3201 DCA REC 181 000271 2230 ISZ SYS /ERROR EXIT FROM I/O CALL 182 000272 4352 JMS DIVSUB /COMPUTE TRACK/SECTOR FOR FIRST I/O 183 000273 1203 TAD FN /READ OR WRITE START DIFFERENTLY 184 000274 7640 SZA CLA /SKIP ON WRITE 185 000275 5321 JMP STREAD /GO TO READ 186 / 187 / WRITE FALLS THRU....... 188 / 189 / 190 / 191 / TOP OF MAIN PROCESSING LOOP 192 / 193 000276 1203 SETSLO, TAD FN /SET SILO TO LOAD-UNLOAD DEPENDING 194 000277 4205 JMS LDCMD 195 000300 1330 TAD S7700 /SILO CONTROL COUNT 100 OCTAL 196 000301 3205 DCA FLPWC 197 000302 7402 BUFCDF, HLT /CDF TO USER'S BUFFER PLACED HERE 198 000303 1600 TRLOOP, TAD I BUF /FETCH A WORD IN CASE WRITE 199 000304 6753 STR /WAIT 200 000305 5304 JMP .-1 201 000306 6752 XDR /AC TO SILO; OR; SILO TO AC 202 000307 3600 DCA I BUF /PLACE A WORD IN CASE READ; WRITE REPLACES SAME. 203 000310 2200 ISZ BUF /MOVE TO NEXT BUFFER LOCATION (MAY SKIP) 204 000311 0077 S77, 77 /LITERAL 77, EXECUTES AS A NOP 205 000312 2205 ISZ FLPWC /DONE WITH 100 OCTAL SILO OPERATION 206 000313 5303 JMP TRLOOP /NO 207 000314 1202 TAD BC /INCREMENT BC BY 77 HERE, 1 LATER 208 000315 1311 TAD S77 /CHECKING FOR A READ EXIT 209 000316 7450 MAGIC, SNA /IF BC HAS GONE TO ZERO, NO-OP FOR LDCMD 210 000317 5344 JMP OKEX /READ EXIT. 211 000320 3202 DCA BC /REPLACING BC FOR WRITE EXIT CHECK AT LOOP END 212 / 213 / MIDDLE OF MAIN PROCESSING LOOP 214 / 215 000321 1203 STREAD, TAD FN /READ STARTS HERE 216 000322 1347 TAD UNIT /SET UP DO DO READ OR WRITE I/O 217 000323 4205 JMS LDCMD 218 000324 1234 TAD MQ /LOAD PRECOMPUTED SECTOR INFO 219 000325 6753 STR 220 000326 5325 JMP .-1 /IN CASE NOT READY 221 000327 6752 XDR 222 000330 7700 S7700, 7700 /CLEAR AC, CAN'T SKIP (XDR LEAVES AC ALONE) 223 000331 1366 TAD QUO /TRACK 224 000332 6753 STR /ILLEGAL 7700 ENTRY WILL HANG; THE FUNCTION 225 000333 5332 JMP .-1 /IS NOT SET UP (LDCMD) 226 000334 6752 XDR 227 000335 7600 S7600, 7600 228 000336 2201 ISZ REC /MOVE TO NEXT FLOPPY SECTOR 229 000337 4352 JMS DIVSUB /COMPUTE NEXT TRACK AND SECTOR DURING THIS I/O 230 000340 1316 TAD MAGIC /WAIT FOR I/O TO COMPLETE 231 000341 4205 JMS LDCMD 232 000342 2202 ISZ BC /CHECK FOR WRITE EXIT 233 000343 5276 JMP SETSLO /NO, BACK TO TOP 234 000344 2230 OKEX, ISZ SYS /BUMP TO REGULAR EXIT 235 000345 7402 SRET, HLT /CDF CIF FOR USER'S CALLING FIELD 236 000346 5630 JMP I SYS /GONE 237 / 238 000347 0000 UNIT, 0 /UNIT 239 SYS=RXA0 240 / 241 / 242 / 243 / LITERALS 244 / 245 000350 7763 SM15, -15 246 000351 6201 SCDF0, CDF 0 247 / 248 / DIVSUB 249 / 250 / MUST ENTER WITH LINK AND AC 0 251 / COMPUTES TRACK IN 'QUO', SECTOR IN 'MQ', FROM # IN 'REC' 252 / 253 / REPEATED SUBTRACTS OF 13 DECIMAL LEAVE THE HIGH N-1 BITS OF 254 / QUOTIENT IN QUO, THE LOW BIT OF QUOTIENT IN LINK, AND THE 255 / REMAINDER IN AC. THE INTERLEAVE IS ACCOMPLISHED BY SHIFTING 256 / LOW QUOTINET BIT INTO LOW REMAINDER BIT. 257 / 258 000352 0000 DIVSUB, 0 259 000353 3366 DCA QUO /INIT QUOTIENT FOR DIVIDE 260 000354 1201 TAD REC /RECORD # MASSAGED IN AC 261 000355 7420 DIVLP, SNL /LINK USAGE REVERSED FROM RICHIE'S CODE 262 000356 2366 ISZ QUO /ISZ EVERY OTHER TIME, <=DIVIDE BY 26 263 000357 1350 TAD SM15 /THE -13 DECIMAL 264 000360 7500 SMA /SKIP ON DONE 265 000361 5355 JMP DIVLP /MORE 266 000362 7004 DIVRAL, RAL /LINK USAGE REVERSED; INTERLEAVE!! 267 000363 1250 TAD S33 /ADD 233 (200 IRREL) MAKING SECTOR 268 000364 3234 DCA MQ 269 000365 5752 JMP I DIVSUB /LEAVING LINK AND AC 0 270 000366 0000 QUO, 0 /DIVIDE TEMP 271 / 272 273 000377 0175 $ BC 0202 BUF 0200 BUFCDF 0302 DEVCOD 0750 DIVLP 0355 DIVRAL 0362 DIVSUB 0352 DONELP 0207 FLPWC 0205 FN 0203 INIT 6757 unreferenced INTR 6756 unreferenced LCD 6751 LDCMD 0205 MAGIC 0316 MQ 0234 NOTCTC 0220 OKEX 0344 QUO 0366 REC 0201 RXA0 0230 RXA1 0234 RXCOMN 0241 RXVER 0005 S33 0250 S70 0233 S7600 0335 S77 0311 S7700 0330 SCDF0 0351 SCDIF0 0216 SDN 6755 SER 6754 SETSLO 0276 SM15 0350 SRET 0345 STR 6753 STREAD 0321 SYS 0230 TRANS 0204 TRLOOP 0303 UNIT 0347 XDR 6752