software: Added more and more
[pdp8.git] / sw / os8 / v3d / sources / system / dectapes / dectape3 / CS.PA
CommitLineData
7af5ad59
PH
1/4 OS/8 CASSETTE HANDLER
2/
3/
4/
5/
6/
7/
8/
9/
10/
11/COPYRIGHT (C) 1974,1975 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
46/ DEC-S8-UCASA-A-LA
47
48/ COPYRIGHT 1972
49
50/ DIGITAL EQUIPMENT CORPORATION
51
52/ MAYNARD MASSACHUSETTS 01754
53
54/ MOUTH/DORP
55
56 IFNDEF CODE <CODE=0>
57
58 KCLR=CODE^10+6700 /CLEAR ALL
59 KSDR=CODE^10+6701 /SKIP ON DATA FLAG
60 KSEN=CODE^10+6702 /SKIP ON ERROR
61 KSBF=CODE^10+6703 /SKIP ON READY FLAG
62 KLSA=CODE^10+6704 /LOAD STATUS A
63 KSAF=CODE^10+6705 /SKIP ON ANY FLAG OR ERROR
64 KGOA=CODE^10+6706 /ASSERT CONTENTS OF STATUS A AND XFER
65 KRSB=CODE^10+6707 /READ STATUS B
66
67 BSW=7002 /BYTE SWAP [8/E,F ONLY]
68
69/REWIND=10
70/BACKFIL=30
71/WRGAP=40
72/BACKBLOCK=50
73/SKPFIL=70
74
75/SPECIAL CODES
76
77/ 0 WRITE EOF
78/ 1 REWIND
79/ 2 BACKBLOCK
80/ 3 SKIPFILE/BACKFILE
81
82/ 4-7 UNUSED (TAKES LOW ORDER 2 BITS ONLY CURRENTLY)
83
84 VERSION="C&77
85\f *0
86
87 -2 /THERE ARE TWO HANDLERS
88
89 2401
90 7001+CODE
91 0323
92 0160+CODE+CODE /CSA0
93 270 /DEVICE CONTROL BLOCK (TYPE 27)
94 4000+7 /ENTRY POINT FOR CSA0
95 ZBLOCK 2
96
97 2401
98 7001+CODE
99 0323
100 0161+CODE+CODE /CSA1
101 270
102 4000+1 /ENTRY POINT FOR CSA1
103 ZBLOCK 2
104\f *200
105
106K3700, 3700 /MUST BE FIRST LOCATION ON PAGE
107UNIT,
108CSA1, VERSION /ENTRY POINT FOR CSA1
109 CLA /PROTECT CODE AGAINST IGNORANT USERS
110 TAD CSA1 /PICK UP ARGUMENTS
111 DCA CSA0 /VIA CSA0
112 STL IAC RAL /TAD (3 [8/I,L,E,F]
113 JMP .+3 /JOIN PROCESSING WITH UNIT 1
114CSA0, VERSION /ENTRY POINT FOR CSA0
115 STL CLA RTL /TAD (2
116 BSW / [8/E,F]
117 DCA UNIT /SAVE UNIT (0 IS 200, 1 IS 300)
118CS, JMS T /INITIALIZATION; REPLACED BY RDF
119 TAD KCIF /FORM RETURN FIELD INSTRUCTION
120 DCA RETCIF /STORE IN RETURN CODE
121 TAD I CSA0 /GET FUNCTION CONTROL WORD
122 DCA FUN /SAVE IT
123 TAD FUN /GET IT BACK AGAIN
124 AND K70 /ISOLATE FIELD OF BUFFER
125 TAD KCDF /FORM CDF TO FIELD OF BUFFER
126 DCA BUFCDF /STORE IN APPROPRIATE SPOT
127 ISZ CSA0 /POINT TO ARGUMENT 2
128 TAD I CSA0 /GET BUFFER ADDRESS
129 DCA BUFFER /SAVE IT
130 ISZ CSA0 /POINT TO ARGUMENT 3
131 TAD I CSA0 /GET BLOCK NUMBER
132 ISZ CSA0 /POINT TO ERROR RETURN
133KCIF, CIF CDF 0 /SEEK TEMPORARY SAFETY IN CURRENT DATA FIELD
134 SZA CLA
135 JMP NOT1ST /NOT BLOCK 0
136 STL CLA RAR /TAD (4000
137 AND FUN /ISOLATE READ/WRITE BIT
138 TAD UNIT /INSERT UNIT
139 JMS I QCAS /CALL CASSETTE ROUTINE
140 REWIND-. /TO PERFORM A REWIND/INITIALIZATION
141NOT1ST, TAD FUN
142K200, AND K3700 /ISOLATE NUMBER OF BLOCKS TO XFER
143 SNA
144 JMP SPCASE /0 BLOCKS MEANS SPECIAL THING (EOF)
145RECLP, DCA BLKNT /SET COUNT OF NUMBER OF BLOCKS
146 STL CLA RAR /TAD (4000
147 AND FUN /ISOLATE READ/WRITE BIT
148 TAD UNIT /INSERT UNIT
149 JMS I QCAS /CALL CASSETTE ROUTINE
150 RW-. /TO INITIATE READ OR WRITE
151RETRY, SZA /NON-ZERO AC MEANS ERROR
152 JMP RETCIF /TOUGH LUCK BOOBIE - ERROR
153 TAD K7700 /GET READY TO XFER 100 DOUBLE WORDS
154 DCA DBWDCT /SET DOUBLE WORD COUNTER
155 TAD BUFFER /GET START OF BUFFER SEGMENT
156 DCA BPTR /SET 'BPTR'
157BUFCDF, HLT /CHANGE TO DATA FIELD OF USER'S BUFFER
158 TAD FUN
159K7700, SMA CLA /WHICH DIRECTION IS TRANSFER?
160 JMP READ /WANT TO READ
161\fWRITE, TAD I BPTR /WANT TO WRITE, SO GET WORD FROM BUFFER
162 JMS I QGPCH /WRITE
163 TAD I BPTR /GET FIRST WORD AGAIN
164 AND P7400 /ISOLATE FIRST HALF OF BYTE 3
165 DCA T /SAVE FOR FUTURE REFERENCE
166 ISZ BPTR /POINT TO NEXT LOCATION IN BUFFER
167 TAD I BPTR /GET SECOND WORD OF BUFFER PAIR
168 JMS I QGPCH /WRITE BYTE #2
169 TAD I BPTR /RETRIEVE WORD 2
170 AND P7400 /ISOLATE 2ND HALF OF BYTE #3
171 CLL RTR /CREATE MYSTIC HIDDEN BYTE 3
172 RTR
173 TAD T /GOOD THING I STILL HAVE THIS
174 CLL RTR
175 RTR
176 JMS I QGPCH /WRITE BYTE #3
177 JMP COM
178\fREAD, JMS I QGPCH /READ BYTE #1 OF TRIPLE
179 DCA I BPTR /STORE IN WORD 1 OF BUFFER PAIR
180 JMS I QGPCH /READ BYTE #2 OF TRIPLE
181 DCA T /SAVE IT FOR POSTERITY
182 JMS I QGPCH /READ BYTE #3 OF TRIPLE
183 RTL
184 RTL /MYSTIC ROTATES
185 DCA T2
186 TAD T2
187 AND P7400 /AND MYSTIC CONSTANTS
188 TAD I BPTR /FIX UP BUFFER WORD 1 OF PAIR
189 DCA I BPTR
190 TAD T2
191 RTL
192 RTL /MORE ROTATION
193 AND P7400 /AND MORE
194 TAD T
195 ISZ BPTR /POINT TO SECOND WORD OF BUFFER PAIR
196 DCA I BPTR /STORE SECOND WORD
197COM, ISZ BPTR /POINT TO BEGIN OF NEXT BUFFER PAIR
198P7400, 7400 /PROTECTION AGAINST CORE WRAP AROUND
199 ISZ DBWDCT /BUMP DOUBLE WORD COUNT
200 JMP BUFCDF /REITERATE
201 JMS I QCAS /CALL CASSETTE ROUTINE
202 CRC-. /TO CHECK CRC
203 TAD BUFFER /GET BUFFER SEGMENT ADDRESS
204 TAD K200 /ADD 200 TO GET TO NEXT SEGMENT
205 DCA BUFFER /REPLACE
206 TAD BLKNT /GET BLOCK COUNT
207 TAD K7700 /SUBTRAT 100
208 SZA /ARE WE DONE?
209 JMP RECLP /NO, REITERATE
210 ISZ CSA0 /POINT TO NORMAL GOOD RETURN
211RETCIF, HLT /RETURN TO USER'S DATA AND INSTRUCTION FIELDS
212 JMP I CSA0 /RETURN
213\f/ INTIALIZATION ROUTINE - ONCE ONLY CODE
214/ OVERLAID BY TEMPORARIES
215
216T, 0 /ENTRY POINT TO INITIALIZATION
217T2, TAD KRDF /REPLACE CALL BY RDF
218FUN, DCA CS /SO THAT WE'LL NEVER SEE YOU HERE AGAIN
219BUFFER, TAD T /CORRECT ADDRESS OF GPCH
220DBWDCT, TAD KQX1 /BY ADDING IN CS+1
221QGPCH, DCA . /STORE IT HERE
222BLKNT, STL CLA RTL /CORRECT ADDRESS OF CAS IS 2 MORE
223 TAD QGPCH
224QCAS, DCA . /THAN GPCH. STORE IT HERE.
225BPTR, JMP CS /RETURN TO MAIN PROGRAM
226KRDF, RDF
227KQX1, GPCH-CS-1
228
229SPCASE, TAD FUN
230 AND L4003 /ISOLATE R/W BIT + SPECIAL CODE
231 TAD UNIT
232 JMS I QCAS
233 SPCODE-.
234 JMP RETCIF-1 /LEAVE GRACEFULLY
235K70, 70
236KCDF, CDF 0
237L4003, 4003
238 PAGE
239\fGPCH, 0 /READ OR WRITE A BYTE
240 JMP AROUND /GO TO REAL LOCATION OF THIS SUBROUTINE
241CAS, 0 /MUST BE AT GPCH+2; DO CASSETTE STUFF
242 DCA TEMP /SAVE ARGUMENT IN AC
243 CDF 0
244 TAD I CAS /GET UNRELOCATED RELATIVE LOCAL ENTRY POINT
245 TAD CAS /RELOCATE IT
246 ISZ CAS /POINT TO NORMAL RETURN LOCATION
247 DCA GPCH /SAVE ENTRY POINT IN TEMPORARY
248 JMP I GPCH /GO TO CORRECT ENTRY POINT
249
250RW, TAD CAS
251 DCA RTRY /SAVE RETRY ADDRESS
252 TAD TEMP /GET ARGUMENT PASSED VIA AC
253 DCA FNUNIT /SAVE
254 CLL STA RTL /TAD (7775
255 DCA ERKNT /SET ERROR COUNT TO -3
256ERETRY, TAD FNUNIT
257 SPA
258 TAD (20 /READ CODE IS 0; WRITE IS 20
259 KLSA /LOAD STATUS A
260 TAD FNUNIT /***KLSA CLEARS BIT 0
261 SMA CLA /READS HAVE TO BE INITIATED
262 JMS CWAIT /READ
263 JMP I RTRY /RETURN
264
265AROUND, DCA TEMP
266 TAD FNUNIT
267 SMA CLA
268 JMP RDCHAR /READ
269 TAD TEMP /WRITE
270 JMS CWAIT
271 JMP I GPCH /RETURN
272
273RDCHAR, JMS CWAIT
274 TAD TEMP /GET CHAR JUST READ
275 JMP I GPCH /RETURN WITH IT IN AC
276\fCRC, TAD FNUNIT
277 TAD (60
278 KLSA /INITIATE READ/WRITE CRC
279 TAD FNUNIT /***KLSA CLEARS BIT 0
280 SMA CLA
281 JMS CWAIT /HAVE TO READ TWICE
282 JMS CWAIT /WRITE CRC WRITES BOTH
283 KCLR /WHY NOT?
284 JMP I CAS /RETURN
285
286REWIND, TAD (10
287 JMS UTIL
288 TAD TEMP
289 SMA CLA
290 JMP I CAS /MERELY REWIND IF READING
291 JMP EOF
292SKIPF, TAD (20
293BACKBL, TAD (10
294EOF, TAD (10
295BACKF, TAD (30
296 JMS UTIL
297 JMP I CAS /RETURN
298
299UTIL, 0
300 TAD TEMP
301 KLSA
302TRYAGN, KGOA
303 JMS CTCTST
304 KSBF /WAIT FOR READY
305 JMP .-2
306 KRSB
307 AND (10
308 SZA CLA
309 JMP TRYAGN /KEEP TRYING IF ERROR CAUSED BY DRIVE EMPTY
310 JMP I UTIL
311
312TEMP, 0
313ERKNT, 0
314FNUNIT, 0
315RTRY, 0
316
317SPCODE, TAD TEMP
318 AND (3
319 TAD (JMP TABLE
320 DCA J
321 TAD TEMP
322 AND (4300
323 DCA TEMP
324J, HLT
325TABLE, JMP EOF /0 WRITE EOF
326 JMP REWIND /1 REWIND AND WRITE EOF IF BIT 0=1
327 JMP BACKBL /2 BACK BLOCK
328 TAD TEMP /3 SKIP/BACK FILE DEPENDING ON BIT 0
329 SMA CLA
330 JMP SKIPF /FORWARD FILE
331 JMP BACKF /BACK FILE
332\fCWAIT, 0
333 KGOA /ASSERT CONTENTS OF STATUS A
334 DCA TEMP /SAVE ANYTHING READ
335 JMS CTCTST
336 KSAF
337 JMP .-2 /WAIT FOR SOMETHING TO HAPPEN
338 KSEN /WAS IT AN ERROR?
339 JMP I CWAIT /NO, SO RETURN
340ERR, DCA TEMP /YES ... ERROR
341 KRSB
342 AND (30
343 SNA
344 JMP .+3
345 AND (20
346 JMP I RTRY /END OF FILE IS SOFT ERROR
347 ISZ ERKNT /SHALL WE TRY AGAIN?
348 JMP .+3 /YES
349 STL CLA RAR /TAD (4000
350 JMP I RTRY /RETURN WITH NON-ZERO AC
351 TAD FNUNIT /RETRY
352 TAD (50 /BUT FIRST DO BACKSPACE BLOCK GAP
353 JMS UTIL
354 JMP ERETRY
355
356CTCTST, 0 /TEST FOR CONTROL/C
357L7600, 7600
358 TAD L7600
359 KRS
360 TAD (-7603
361 SNA CLA
362 KSF
363 JMP I CTCTST
364 CIF CDF 0
365 JMP I L7600 /RETURN TO OS/8
366 $
367\f