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