1 /FLOPPY DISK (RX01,RX71) NON-SYSTEM HANDLER FOR OS/8
11 /COPYRIGHT (C) 1977 BY DIGITAL EQUIPMENT CORPORATION
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.
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.
32 /DIGITAL EQUIPMENT CORPORATION ASSUMES NO RESPONSIBILITY FOR THE USE
33 /OR RELIABILITY OF ITS SOFTWARE ON EQUIPMENT THAT IS NOT SUPPLIED BY
45 \f/FLOPPY DISK (RX01,RX71) NON-SYSTEM HANDLER FOR OS/8
47 /DEFINITIONS OF RX8/E IOT'S
51 DEVCOD= 750 /DEVICECODE
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
62 /NOTES ON THIS HANDLER:
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
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
73 /IN THIS WAY THE HANDLER CAN TRANSFER DATA AT A 5KHZ WORD RATE
75 /MODIFIED TO ALLOW ADDRESS CALCULATION DURING SECTOR BUFFER
77 \f *0 /ORIGIN FOR BUILD
80 DEVICE RX01 /"RX01" IS THE GROUP NAME
81 DEVICE RXA0 /"RXA0" IS THE ENTRY POINT NAME
82 4250 /DCB WORD - DEVICE TYPE 25, DIRECTORY DEVICE
83 RXA0&177 /ENTRY POINT OFFSET
84 0 /THIS WORD ALWAYS SEEMS TO BE 0
85 0 /UNUSED FOR NONSYSTEM DEVICE
87 DEVICE RX01 /"RX01" IS THE GROUP NAME
88 DEVICE RXA1 /"RXA1" IS THE ENTRY POINT NAME
89 4250 /DCB WORD - DEVICE TYPE 25, DIRECTORY DEVICE
90 RXA1&177 /ENTRY POINT OFFSET
91 0 /THIS WORD ALWAYS SEEMS TO BE 0
92 0 /UNUSED FOR NONSYSTEM DEVICE
95 BUF, 0 /USER BUFFER POINTER
96 REC, 0 /RX01 RECORD NUMBER BEFORE INTERLEAVING
97 BC, 0 /BLOCK COUNT OF TRANSFER
98 FN, 0 /FUNCTION, 0=WRITE, 2=READ
99 TRANS, 0 /TRANSFER COMMAND
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 DONELP, TAD S7600 /SEE IF THE KEYBOARD BUFFER
105 KRS /CONTAINS A CONTROL/C CHARACTER
106 TAD (-7603 /(WITH OR WITHOUT PARITY)
107 CLL /KEEP LINK CLEAAR
109 KSF /WITH THE FLAG UP.
110 JMP NOTCTC /IF NOT, CONTINUE
111 SCDIF0, CDF CIF 0 /IF SO, RETURN TO OS/8
114 NOTCTC, SDN /WAIT FOR THE DONE FLAG TO COME UP
115 JMP DONELP /BEFORE YOU LOAD THE COMMAND REGISTER
116 TAD TRANS /NOW GET THE NEW COMMAND REGISTER CONTENTS
118 SER /SKIP IF I/O ERROR
119 JMP I LDCMD /AND RETURN
120 CLA CLL CML RAR /SET AC TO 4000
121 JMP SRET /TAKE ERROR RETURN
124 RXA0, RXVER /ENTRY POINT FOR UNIT 0
126 JMP RXCOMN /GO TO COMMON CODE
127 S70, 70 /** MUST BE AT 33 ON THIS PAGE**
129 IFNZRO S70&177-33 <.ERROR>
131 MQ, /DIVIDE TEMPORARY
132 RXA1, RXVER /ENTRY POINT FOR UNIT 1
133 CLA /CAREFUL, CAREFUL!
135 DCA RXA0 /PUT CALLING ADDR IN KNOWN PLACE
137 RXCOMN, TAD DIVRAL /SET AC TO 20*UNIT+4
138 DCA UNIT /SAVE UNIT NUMBER
140 TAD SCDIF0 /REMEMBER CALLING FIELD FOR RETURN
145 / LINK REMAINS 0 THROUGH THE MAIN PROCESSING LOOP
146 / EXCEPT AS MANIPULATED BY DIVSUB
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
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.
157 / DIVISION IS CARRIED OUT IN PARALLEL WITH I/O OPERATION BECAUSE OF
158 / TIMING CONSIDERATIONS OF THE VT78.
160 / THERE IS NO ERROR RETRY, NOT PARTICULARLY CRITICAL FOR A FLOPPY.
162 CLL CML CLA RAR /SET LINK=0, AC=4000
163 TAD I SYS /TO PUT READ-WRITE BIT TO LINK
164 S33, AND S70 /KEEP BITS FOR CDF
165 TAD SCDF0 /ADDING IN CDF LITERAL
166 DCA BUFCDF /CDF INSTRUCTION TO USER'S BUFFER
167 CML RTL /FUNCTION CODE, 0=WRITE, 2=READ
169 TAD I SYS /MAKE CONTROL COUNT
171 AND S7600 /MAKE CONTROL COUNT FOR TOTAL
175 TAD I SYS /FETCH BUFFER ADDRESS
178 TAD I SYS /OS8 BLOCK #
179 CLL RTL /TIMES 4 TO BE FLOPPY SECTOR #
181 ISZ SYS /ERROR EXIT FROM I/O CALL
182 JMS DIVSUB /COMPUTE TRACK/SECTOR FOR FIRST I/O
183 TAD FN /READ OR WRITE START DIFFERENTLY
184 SZA CLA /SKIP ON WRITE
185 JMP STREAD /GO TO READ
187 / WRITE FALLS THRU.......
191 / TOP OF MAIN PROCESSING LOOP
193 SETSLO, TAD FN /SET SILO TO LOAD-UNLOAD DEPENDING
195 TAD S7700 /SILO CONTROL COUNT 100 OCTAL
197 BUFCDF, HLT /CDF TO USER'S BUFFER PLACED HERE
198 TRLOOP, TAD I BUF /FETCH A WORD IN CASE WRITE
201 XDR /AC TO SILO; OR; SILO TO AC
202 DCA I BUF /PLACE A WORD IN CASE READ; WRITE REPLACES SAME.
203 ISZ BUF /MOVE TO NEXT BUFFER LOCATION (MAY SKIP)
204 S77, 77 /LITERAL 77, EXECUTES AS A NOP
205 ISZ FLPWC /DONE WITH 100 OCTAL SILO OPERATION
207 TAD BC /INCREMENT BC BY 77 HERE, 1 LATER
208 TAD S77 /CHECKING FOR A READ EXIT
209 MAGIC, SNA /IF BC HAS GONE TO ZERO, NO-OP FOR LDCMD
211 DCA BC /REPLACING BC FOR WRITE EXIT CHECK AT LOOP END
213 / MIDDLE OF MAIN PROCESSING LOOP
215 STREAD, TAD FN /READ STARTS HERE
216 TAD UNIT /SET UP DO DO READ OR WRITE I/O
218 TAD MQ /LOAD PRECOMPUTED SECTOR INFO
220 JMP .-1 /IN CASE NOT READY
222 S7700, 7700 /CLEAR AC, CAN'T SKIP (XDR LEAVES AC ALONE)
224 STR /ILLEGAL 7700 ENTRY WILL HANG; THE FUNCTION
225 JMP .-1 /IS NOT SET UP (LDCMD)
228 ISZ REC /MOVE TO NEXT FLOPPY SECTOR
229 JMS DIVSUB /COMPUTE NEXT TRACK AND SECTOR DURING THIS I/O
230 TAD MAGIC /WAIT FOR I/O TO COMPLETE
232 ISZ BC /CHECK FOR WRITE EXIT
233 JMP SETSLO /NO, BACK TO TOP
234 OKEX, ISZ SYS /BUMP TO REGULAR EXIT
235 SRET, HLT /CDF CIF FOR USER'S CALLING FIELD
250 / MUST ENTER WITH LINK AND AC 0
251 / COMPUTES TRACK IN 'QUO', SECTOR IN 'MQ', FROM # IN 'REC'
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.
259 DCA QUO /INIT QUOTIENT FOR DIVIDE
260 TAD REC /RECORD # MASSAGED IN AC
261 DIVLP, SNL /LINK USAGE REVERSED FROM RICHIE'S CODE
262 ISZ QUO /ISZ EVERY OTHER TIME, <=DIVIDE BY 26
263 TAD SM15 /THE -13 DECIMAL
266 DIVRAL, RAL /LINK USAGE REVERSED; INTERLEAVE!!
267 TAD S33 /ADD 233 (200 IRREL) MAKING SECTOR
269 JMP I DIVSUB /LEAVING LINK AND AC 0