2 /FLOPPY DISK (RX01,RX71) NON-SYSTEM HANDLER FOR OS/8
12 /COPYRIGHT (C) 1977 BY DIGITAL EQUIPMENT CORPORATION
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.
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.
33 /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
34 /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
46 \f/FLOPPY DISK (RX01,RX71) NON-SYSTEM HANDLER FOR OS/8
48 /DEFINITIONS OF RX8/E IOT'S
52 DEVCOD= 750 /DEVICECODE
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
63 /NOTES ON THIS HANDLER:
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
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
74 /IN THIS WAY THE HANDLER CAN TRANSFER DATA AT A 5KHZ WORD RATE
76 /MODIFIED TO ALLOW ADDRESS CALCULATION DURING SECTOR BUFFER
78 \f *0 /ORIGIN FOR BUILD
81 DEVICE RX01 /"RX01" IS THE GROUP NAME
82 DEVICE RXA2 /"RXA2" IS THE ENTRY POINT NAME
83 4250 /DCB WORD - DEVICE TYPE 25, DIRECTORY DEVICE
84 RXA2&177 /ENTRY POINT OFFSET
85 0 /THIS WORD ALWAYS SEEMS TO BE 0
86 0 /UNUSED FOR NONSYSTEM DEVICE
88 DEVICE RX01 /"RX01" IS THE GROUP NAME
89 DEVICE RXA3 /"RXA3" IS THE ENTRY POINT NAME
90 4250 /DCB WORD - DEVICE TYPE 25, DIRECTORY DEVICE
91 RXA3&177 /ENTRY POINT OFFSET
92 0 /THIS WORD ALWAYS SEEMS TO BE 0
93 0 /UNUSED FOR NONSYSTEM DEVICE
96 BUF, 0 /USER BUFFER POINTER
97 REC, 0 /RX01 RECORD NUMBER BEFORE INTERLEAVING
98 BC, 0 /BLOCK COUNT OF TRANSFER
99 FN, 0 /FUNCTION, 0=WRITE, 2=READ
101 FLPWC=. /100 COUNTER FOR SILO OK IN LDCMD ENTRY
102 LDCMD, 0 /WAIT FOR DONE FLAG AND LOAD CMD REG
103 DCA TRANS /SAVE THE NEW COMMAND REG VALUE
104 SDN /WAIT FOR THE DONE FLAG TO COME UP
105 JMP .-1 /BEFORE YOU LOAD THE COMMAND REGISTER
106 DONELP, TAD S7600 /SEE IF THE KEYBOARD BUFFER
107 KRS /CONTAINS A CONTROL/C CHARACTER
108 TAD (-7603 /(WITH OR WITHOUT PARITY)
109 CLL /KEEP LINK CLEAAR
111 KSF /WITH THE FLAG UP.
112 JMP NOTCTC /IF NOT, CONTINUE
113 JMS SELECT /YES, SELECT "A" DRIVES
114 SCDIF0, CDF CIF 0 / RETURN TO OS/8
117 NOTCTC, TAD TRANS /NOW GET THE NEW COMMAND REGISTER CONTENTS
119 SER /SKIP IF I/O ERROR
120 JMP I LDCMD /AND RETURN
121 JMS SELECT /SELECT "A" DRIVES
122 CLA CLL CML RAR /SET AC TO 4000
123 JMP SRET /TAKE ERROR RETURN
126 RXA2, RXVER /ENTRY POINT FOR UNIT 2
128 S70, 70 /** MUST BE AT 33 ON THIS PAGE**
129 JMP RXCOMN /GO TO COMMON CODE
131 IFNZRO S70&177-33 <.ERROR>
133 MQ, /DIVIDE TEMPORARY
134 RXA3, RXVER /ENTRY POINT FOR UNIT 3
135 CLA /CAREFUL, CAREFUL!
137 DCA RXA2 /PUT CALLING ADDR IN KNOWN PLACE
139 RXCOMN, TAD DIVRAL /SET AC TO 20*UNIT+4
140 DCA UNIT /SAVE UNIT NUMBER
142 TAD SCDIF0 /REMEMBER CALLING FIELD FOR RETURN
145 JMS SELECT /SELECT "B" DRIVES
149 / LINK REMAINS 0 THROUGH THE MAIN PROCESSING LOOP
150 / EXCEPT AS MANIPULATED BY DIVSUB
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
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.
161 / DIVISION IS CARRIED OUT IN PARALLEL WITH I/O OPERATION BECAUSE OF
162 / TIMING CONSIDERATIONS OF THE VT78.
164 / THERE IS NO ERROR RETRY, NOT PARTICULARLY CRITICAL FOR A FLOPPY.
166 CLL CML CLA RAR /SET LINK=0, AC=4000
167 TAD I SYS /TO PUT READ-WRITE BIT TO LINK
168 S33, AND S70 /KEEP BITS FOR CDF
169 TAD SCDF0 /ADDING IN CDF LITERAL
170 DCA BUFCDF /CDF INSTRUCTION TO USER'S BUFFER
171 CML RTL /FUNCTION CODE, 0=WRITE, 2=READ
173 TAD I SYS /MAKE CONTROL COUNT
175 AND S7600 /MAKE CONTROL COUNT FOR TOTAL
179 TAD I SYS /FETCH BUFFER ADDRESS
182 TAD I SYS /OS8 BLOCK #
183 CLL RTL /TIMES 4 TO BE FLOPPY SECTOR #
185 ISZ SYS /ERROR EXIT FROM I/O CALL
186 JMS DIVSUB /COMPUTE TRACK/SECTOR FOR FIRST I/O
187 TAD FN /READ OR WRITE START DIFFERENTLY
188 SZA CLA /SKIP ON WRITE
189 JMP STREAD /GO TO READ
191 / WRITE FALLS THRU.......
195 / TOP OF MAIN PROCESSING LOOP
197 SETSLO, TAD FN /SET SILO TO LOAD-UNLOAD DEPENDING
199 TAD S7700 /SILO CONTROL COUNT 100 OCTAL
201 BUFCDF, HLT /CDF TO USER'S BUFFER PLACED HERE
202 TRLOOP, TAD I BUF /FETCH A WORD IN CASE WRITE
205 XDR /AC TO SILO; OR; SILO TO AC
206 DCA I BUF /PLACE A WORD IN CASE READ; WRITE REPLACES SAME.
207 ISZ BUF /MOVE TO NEXT BUFFER LOCATION (MAY SKIP)
208 S77, 77 /LITERAL 77, EXECUTES AS A NOP
209 ISZ FLPWC /DONE WITH 100 OCTAL SILO OPERATION
211 TAD BC /INCREMENT BC BY 77 HERE, 1 LATER
212 TAD S77 /CHECKING FOR A READ EXIT
213 MAGIC, SNA /IF BC HAS GONE TO ZERO, NO-OP FOR LDCMD
215 DCA BC /REPLACING BC FOR WRITE EXIT CHECK AT LOOP END
217 / MIDDLE OF MAIN PROCESSING LOOP
219 STREAD, TAD FN /READ STARTS HERE
220 TAD UNIT /SET UP DO DO READ OR WRITE I/O
222 TAD MQ /LOAD PRECOMPUTED SECTOR INFO
224 JMP .-1 /IN CASE NOT READY
226 S7700, 7700 /CLEAR AC, CAN'T SKIP (XDR LEAVES AC ALONE)
232 ISZ REC /MOVE TO NEXT FLOPPY SECTOR
233 JMS DIVSUB /COMPUTE NEXT TRACK AND SECTOR DURING THIS I/O
234 TAD MAGIC /WAIT FOR I/O TO COMPLETE
236 ISZ BC /CHECK FOR WRITE EXIT
237 JMP SETSLO /NO, BACK TO TOP
238 OKEX, ISZ SYS /BUMP TO REGULAR EXIT
239 JMS SELECT /SELECT "A" DRIVES
240 SRET, HLT /CDF CIF FOR USER'S CALLING FIELD
255 / MUST ENTER WITH LINK AND AC 0
256 / COMPUTES TRACK IN 'QUO', SECTOR IN 'MQ', FROM # IN 'REC'
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.
264 DCA QUO /INIT QUOTIENT FOR DIVIDE
265 TAD REC /RECORD # MASSAGED IN AC
266 DIVLP, SNL /LINK USAGE REVERSED FROM RICHIE'S CODE
267 ISZ QUO /ISZ EVERY OTHER TIME, <=DIVIDE BY 26
268 TAD SM15 /THE -13 DECIMAL
271 DIVRAL, RAL /LINK USAGE REVERSED; INTERLEAVE!!
272 TAD S33 /ADD 233 (200 IRREL) MAKING SECTOR
274 JMP I DIVSUB /LEAVING LINK AND AC 0
277 SELECT=.-1 /ENTRY POINT FOR DRIVES SELECT
278 6750 /SELECT APPROPRIATE DRIVES
283 TRANS=DIVSUB /TRANSFER COMMAND