Commit | Line | Data |
---|---|---|
81e70d48 PH |
1 | / TD8E Dectape RESTORE Program |
2 | / This program will receive a Dectape image and write it to the tape. The | |
3 | / tape disk it written, then it is reread to verify. | |
4 | / See dump for the format of the serial data. | |
5 | / To run start at 0200. | |
6 | / SR 11 should be drive, only 0 and 1 supported without reassembling | |
7 | / SR 6-8 should be maximum memory field in computer, needs 8k minimum | |
8 | / Should halt at label FINISH (140) with AC = 0 if it worked, AC not equal to | |
9 | / zero indicates checksum on read didn't match that of data received | |
10 | / Hitting cont will restart the program if at normal end | |
11 | / | |
12 | / Number of retries is set to 1 for reading and writing. | |
13 | / | |
14 | / The current block being written to will be displayed in the AC | |
15 | / while serial data is transfering. | |
16 | / | |
17 | / This program only will work with the restore C program since it needs | |
18 | / to hanshake transfers to prevent overrun on the serial data. | |
19 | / The C program must be started first. | |
20 | / | |
21 | / This transfers the standard 129 word by 1474 blocks used by OS/8 etc. | |
22 | / Other formats can be handled by changing constants below | |
23 | / This program will only correctly transfer even number of words per block, | |
24 | / for the standard 129 word format the last word is not transfered and a | |
25 | / zero word written in its place. This is fine for OS/8 since it doesn't | |
26 | / use it. This also allows the Dectapes to be used as small RK05 images | |
27 | / with emulators and the PUTR program. | |
28 | ||
29 | INAD=030 / Address of serial input, 30 for console | |
30 | KCF2=6000 INAD | |
31 | KSF2=6001 INAD | |
32 | KCC2=6002 INAD | |
33 | KRS2=6004 INAD | |
34 | KIE2=6005 INAD | |
35 | KRB2=6006 INAD | |
36 | ||
37 | OUTAD=040 / Address of serial output, 40 for console | |
38 | TFL2=6000 OUTAD | |
39 | TSF2=6001 OUTAD | |
40 | TCF2=6002 OUTAD | |
41 | TPC2=6004 OUTAD | |
42 | TSK2=6005 OUTAD | |
43 | TLS2=6006 OUTAD | |
44 | ||
45 | /2 TD8E INITIALIZER PROGRAM, V7A | |
46 | / | |
47 | /COPYRIGHT (C) 1975, 1977 | |
48 | /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS. | |
49 | / | |
50 | / | |
51 | / | |
52 | /THIS SOFTWARE IS FURNISHED UNDER A LICENSE FOR USE ONLY ON A | |
53 | /SINGLE COMPUTER SYSTEM AND MAY BE COPIED ONLY WITH THE INCLU- | |
54 | /SION OF THE ABOVE COPYRIGHT NOTICE. THIS SOFTWARE, OR ANT OTHER | |
55 | /COPIES THEREOF, MAY NOT BR PROVIDED OR OTHERWISE MADE AVAILABLE | |
56 | /TO ANY OTHER PERSON EXCEPT FOR USE ON SUCH SYSTEM AND TO ONE WHO | |
57 | /AGREES TO THESE LICENSE TERMS. TITLE TO AND OWNERSHIP OF THE | |
58 | /SOFTWARE SHALL AT ALL TIMES REMAIN IN DEC. | |
59 | / | |
60 | / | |
61 | /THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT | |
62 | /NOTICE AND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY DIGITAL | |
63 | /EQUIPMRNT COROPATION. | |
64 | / | |
65 | /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS | |
66 | /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC. | |
67 | / | |
68 | / | |
69 | / | |
70 | / | |
71 | / | |
72 | / | |
73 | \f | |
74 | /DECEMBER 21, 1973 GB/RL/EF/SR | |
75 | ||
76 | /ABSTRACT-- | |
77 | / THE ROUTINE DESCRIBED AND LISTED HERE IS A GENERAL | |
78 | /DATA HANDLER FOR THE TD8E DECTAPE SYSTEM. THE ROUTINE | |
79 | /CONTAINS SEARCH, READ, AND WRITE FUNCTIONS IN A FORMAT | |
80 | /WHICH IS COMPATIBLE WITH OS/8 DEVICE HANDLER CALLING | |
81 | /SEQUENCES. | |
82 | ||
83 | /FIXES SINCE FIELD-TEST RELEASE: | |
84 | ||
85 | /1. FIXED BUG RE CLA ON RETRY AFTER ERROR | |
86 | /2. ALLOWED FINAL BOOTSTRAP TO BE INTO A WRITE-LOCKED DEVICE | |
87 | ||
88 | /OS/8 V3D CHANGES: | |
89 | ||
90 | /3. FIXED BUG RE TD8E BUILD (V6B PATCH) | |
91 | \f | |
92 | /THIS ROUTINE CAN BE RE-EDITED AND ASSEMBLED TO PRODUCE | |
93 | /VARIATIONS ON THE BASIC TD8E SYSTEM. ASSEMBLY PARAMETERS | |
94 | /CONTROL: | |
95 | /A) WHAT DRIVES (UNITS 0-7) WILL BE USED | |
96 | /B) THE ORIGIN OF THE TWO PAGE ROUTINE | |
97 | /C) WHAT MEMORY FIELD THE ROUTINE WILL RUN IN | |
98 | /D) THE SIZE OF THE DECTAPE BLOCK TO BE READ/WRITTEN | |
99 | ||
100 | /FOLLOWING ARE THE PARAMETERS SET UP FOR THE STANDARD | |
101 | /DEC VERSION OF THIS ROUTINE: | |
102 | ||
103 | DRIVE=10 /UNITS 0 AND 1 SELECTED | |
104 | ORIGIN=600 /ENTER AT ORIGIN, ORIGIN+4 | |
105 | AFIELD=0 /INITIAL FIELD SETTING | |
106 | MFIELD=00 /AFIELD*10=MFIELD | |
107 | WDSBLK=201 /129 WORDS PER BLOCK | |
108 | ||
109 | /THE USE OF THE PARAMETERS IS AS FOLLOWS: | |
110 | ||
111 | / DRIVE: DRIVE DETERMINES WHICH UNITS WILL BE SELECTED | |
112 | / DRIVE=10 IMPLIES UNITS 0 &1 | |
113 | / DRIVE=20 IMPLIES UNITS 2&3 | |
114 | / DRIVE=30 IMPLIES UNITS 4&5 | |
115 | / DRIVE=40 IMPLIES UNITS 6&7 | |
116 | ||
117 | /ORIGIN: ALTERING ORIGIN CAUSES ASSEMBLY IN A DIFFERENT | |
118 | / MEMORY LOCATION. WHEN CHANGING ORIGIN KEEP IN MIND | |
119 | /THAT THIS IS A TWO PAGE ROUTINE. | |
120 | ||
121 | /AFIELD: AFIELD DETERMINES THE INITIAL FIELD SETTING FOR THE | |
122 | / LOADER. PERMISSIBLE VALUES FOR AFIELD ARE 0 TO 7. | |
123 | ||
124 | /MFIELD: MFIELD IS USED IN A CIF CDF MFIELD INSTRUCTION. | |
125 | / THE VALUE INSERTED FOR MFIELD SHOULD BE 10(8) TIMES | |
126 | / THE VALUE FOR AFIELD. THE PERMISSIBLE VALUES ARE 00-70. | |
127 | ||
128 | /WDSBLK: WDSBLK GOVERNS HOW MANY WORDS THE ROUTINE THINKS ARE | |
129 | / IN A DECTAPE BLOCK. THE STANDARD VALUE IS 201(8) OR | |
130 | / 128 DECIMAL. NOTE THAT THE FUNCTION WORD BIT 10 CAN | |
131 | / 129 DECIMAL ??? (DJG) | |
132 | / BE USED TO SUBTRACT ONE FROM WDSBLK. THE VALUE USED | |
133 | / FOR WDSBLK SHOULD BE THE NUMBER OF WORDS THE TAPE WAS | |
134 | / FORMATTED TO CONTAIN. | |
135 | ||
136 | /IF WE WANT A HANDLER FOR UNITS 2&3 TO RESIDE IN | |
137 | /FIELD 2 AT LOCATION 3000 AND READ/WRITE 256(10) WORDS | |
138 | /PER BLOCK, THE PARAMETERS WOULD BE: | |
139 | / DRIVE=20 | |
140 | / ORIGIN=3000 | |
141 | / AFIELD=2 | |
142 | / MFIELD=20 | |
143 | / WDSBLK=400 | |
144 | \f/THE CALL TO THE SUBROUTINE FOLLOWS BASICALLY THE | |
145 | /CALLING SEQUENCE FOR OS/8 DEVICE HANDLERS. | |
146 | /THE CALLING SEQUENCE IS: | |
147 | ||
148 | / CDF CURRENT | |
149 | / CIF MFIELD /MFIELD=FIELD ASSEMBLED IN | |
150 | / JMS ENTRY /ENTRY=ORIGIN (EVEN NUMBERED DRIVE | |
151 | /AND ORIGIN+4 FOR ODD NUMBERED DRIVE. | |
152 | / ARG1 | |
153 | / ARG1B (DJG) | |
154 | / ARG2 | |
155 | / ARG3 | |
156 | / ERROR RETURN | |
157 | / NORMAL RETURN | |
158 | ||
159 | /THE ARGUMENTS ARE: | |
160 | ||
161 | /ARG1: FUNCTION WORD BIT0: 0=READ, 1=WRITE | |
162 | / BITS 1-5: UNUSED, WAS # BLOCKS IN OPERATION (DJG) | |
163 | / BITS 6-8: FIELD OF BUFFER AREA | |
164 | / BIT 9: UNUSED | |
165 | / BIT 10: # OF WORDS/BLOCK. | |
166 | / 0= WDSBLK, 1=WDSBLK-1 | |
167 | / BIT 11: 1=START FORWARD, 0=REVERSE | |
168 | /ARG1A: # OF BLOCKS IN OPERATIONA (DJG) | |
169 | /ARG2: BUFFER ADDRESS FOR OPERATION | |
170 | /ARG3: STARTING BLOCK FOR OPERATION | |
171 | ||
172 | /ERRORS: THE HANDLER DETECTS TWO TYPES OF ERRORS: | |
173 | /A) FATAL ERRORS- PARITY ERROR, TIMING ERROR, | |
174 | / TOO GREAT A BLOCK NUMBER | |
175 | / FATAL ERRORS TAKE ERROR RETURN WITH THE | |
176 | / AC=4000. | |
177 | /B) NON-FATAL- SELECT ERROR. | |
178 | / IF NO PROPER UNIT IS SELECTED, THE ERROR | |
179 | / RETURN IS TAKEN WITH CLEAR AC. | |
180 | /FATAL ERRORS TRY THREE TIMES BEFORE TAKING ERROR RETURN. | |
181 | /THE NORMAL RETURN IS TAKEN AFTER ALL INDICATED | |
182 | /BLOCKS HAVE BEEN TRANSFERRED. THE AC IS CLEAR. | |
183 | ||
184 | /THE TD8E IOT'S ARE: | |
185 | SDSS=7001-DRIVE /SKIP ON SINGLE LINE FLAG | |
186 | SDST=7002-DRIVE /SKIP ON TIMING ERROR | |
187 | SDSQ=7003-DRIVE /SKIP ON QUAD LINE FLAG | |
188 | SDLC=7004-DRIVE /LOAD COMMAND REGISTER | |
189 | SDLD=7005-DRIVE /LOAD DATA REGISTER | |
190 | SDRC=7006-DRIVE /READ COMMAND REGISTER | |
191 | SDRD=7007-DRIVE /READ DATA REGISTER | |
192 | ||
193 | /THE IOT'S IN GENERAL ARE 677X,676X,675X,AND 674X. | |
194 | /THE OTHERS CONTROL UNITS 2-7. | |
195 | ||
196 | / THIS HANDLER USES DECTAPE BLOCKS NOT OS/8 BLOCKS ! | |
197 | ||
198 | *ORIGIN | |
199 | ||
200 | / MODIFIED SO BIT 0 ON ENTRY IS UNIT 1 | |
201 | DTA0, 0 | |
202 | DCA UNIT /SAVE UNIT POSITION | |
203 | RDF | |
204 | TAD C6203 /GET DATA FIELD AND SETUP RETURN | |
205 | DCA LEAVE | |
206 | TAD I DTA0 /GET FUNCTION WORD | |
207 | SDLD /PUT FUNCTION INTO DATA REGISTER | |
208 | CLL RTR /AC STILL HAS FUNCTION. PUT # WORDS PER | |
209 | /BLOCK INTO LINK | |
210 | SZL CLA /KNOCK ONE OFF WDSBLK? | |
211 | IAC /YES | |
212 | TAD MWORDS | |
213 | DCA WCOUNT /STORE MASTER WORD COUNT | |
214 | ISZ DTA0 /TO BLOCK COUNT (DJG) | |
215 | TAD I DTA0 / (DJG) | |
216 | CIA / (DJG) | |
217 | DCA PGCT / (DJG) | |
218 | ISZ DTA0 /TO BUFFER | |
219 | TAD I DTA0 | |
220 | DCA XBUFF /SAVE ADDRESS (DJG) | |
221 | / DCA BUFF | |
222 | ISZ DTA0 /TO BLOCK NUMBER | |
223 | TAD I DTA0 | |
224 | DCA BLOCK | |
225 | ISZ DTA0 /POINT TO ERROR EXIT | |
226 | CIF CDF MFIELD /TO ROUTINES DATA FIELD | |
227 | / SDRD /GET FUNCTION INTO AC | |
228 | / CLL RAL | |
229 | / AND CM200 /GET # PAGES TO XFER | |
230 | / DCA PGCT | |
231 | SDRD | |
232 | AND C70 /GET FIELD FOR XFER | |
233 | TAD C6201 /FORM CDF N | |
234 | DCA XFIELD /IF=0 AND DF=N AT XFER. | |
235 | TAD RETRY | |
236 | DCA TRYCNT /3 ERROR TRIES | |
237 | TAD UNIT /TEST FOR SELECT ERROR | |
238 | SDLC | |
239 | SDRC | |
240 | AND C100 | |
241 | SZA CLA | |
242 | JMP FATAL-1 | |
243 | SDRD /PUT FUNCT INTO XFUNCT IN SECOND PG. | |
244 | DCA I CXFUN | |
245 | TAD WCOUNT | |
246 | DCA I CXWCT | |
247 | SDRD /GET MOTION BIT TO LINK | |
248 | CLL RAR | |
249 | XFIELD, HLT /INTO NEXT PAGE | |
250 | JMP GO /AND START THE MOTION. | |
251 | RWCOM, SDST /ANY CHECKSUM ERRORS? | |
252 | SZA CLA /OR CHECKSUM ERRORS? | |
253 | JMP TRY3 /PLEASE NOTE THAT THE LINK IS ALWAYS | |
254 | /SET AT RWCOM. GETCHK SETS IT. | |
255 | / TAD PGCT /NO ERROR..FINISHED XFER? | |
256 | / TAD CM200 | |
257 | / SNA | |
258 | ISZ PGCT / (DJG) | |
259 | SKP / (DJG) | |
260 | JMP EXIT /ALL DONE. GET OUT | |
261 | / DCA PGCT /NEW PAGE COUNT | |
262 | ISZ BLOCK /NEXT BLOCK TO XFER | |
263 | / TAD WCOUNT /FORM NEXT BUFFER ADDRESS | |
264 | / CIA | |
265 | / TAD BUFF | |
266 | / DCA XBUFF /SAVE ADDRESS (DJG) | |
267 | / DCA BUFF / (DJG) | |
268 | CLL CML /FORCES MOTION FORWARD | |
269 | GO, CLA CML RTR /LINK BECOMES MOTION BIT | |
270 | TAD C1000 | |
271 | TAD UNIT /PUT IN 'GO' AND UNIT # | |
272 | SDLC /LOOK FOR BLOCK NO. | |
273 | CLA | |
274 | TAD XBUFF /SAVE LOC OF BLOCK START SO | |
275 | DCA OLDBUF /CAN RETRY ON ERROR | |
276 | RDF | |
277 | TAD C6201 | |
278 | DCA OLDFLD | |
279 | JMS I CRDQUD /WAIT AT LEAST 6 LINES TO LOOK | |
280 | JMS I CRDQUD | |
281 | CM200, 7600 /COULD HAVE SAVED A LOC. HERE | |
282 | SRCH, SDSS | |
283 | JMP .-1 /WAIT FOR SINGLE LINE FLAG | |
284 | SDRC | |
285 | CLL RTL /DIRECTION TO LINK. INFO BITS | |
286 | /ARE SHIFTED. | |
287 | AND C374 /ISOLATE MARK TRACK BITS | |
288 | TAD M110 /IS IT END ZONE? | |
289 | SNA /THE LINK STAYS SAME THRU THIS | |
290 | JMP ENDZ | |
291 | TAD M20 /CHECK FOR BLOCK MARK | |
292 | SZA CLA | |
293 | JMP SRCH | |
294 | SDRD /GET THE BLOCK NUMBER | |
295 | SZL /IF WE ARE IN REVERSE, LOOK FOR 3 | |
296 | /BLOCKS BEFORE TARGET BLOCK. THIS | |
297 | /ALLOWS TURNAROUND AND UP TO SPEED. | |
298 | TAD C3 /REVERSE | |
299 | CMA | |
300 | TAD BLOCK | |
301 | CMA /IS IT RIGHT BLOCK? | |
302 | SNA | |
303 | JMP FOUND /YES..HOORAY! | |
304 | M110, SZL SNA CLA /NO, BUT ARE WE HEADED FOR IT? | |
305 | /ABOVE SNA IS SUPERFLUOUS. | |
306 | JMP SRCH /YES | |
307 | ENDZ, SDRC /WE ARE IN THE END ZONE | |
308 | CLL RTL /DIRECTION TO LINK | |
309 | CLA /ARE WE IN REVERSE? | |
310 | JMP GO /YES..TURN US AROUND | |
311 | /IF WE ARE IN THE END ZONE GOING FORWARD, IT IS AN ERROR | |
312 | TRY3, CLA | |
313 | OLDFLD, NOP /RESET FIELD | |
314 | TAD OLDBUF /RESET BACK TO START OF BLOCK | |
315 | DCA XBUFF | |
316 | ISZ TRYCNT | |
317 | JMP GO /TRY 3 TIMES | |
318 | JMP FATAL /LINK OFF MEANS AC=4000 ON RETURN | |
319 | EXIT, ISZ DTA0 | |
320 | CLL CML /AC=0 ON NORMAL RETURN | |
321 | FATAL, TAD UNIT | |
322 | SDLC /STOP THE UNIT | |
323 | CLA CML RAR | |
324 | LEAVE, HLT | |
325 | JMP I DTA0 | |
326 | ||
327 | \f | |
328 | C6203, 6203 | |
329 | C6201, 6201 | |
330 | CRDQUD, RDQUAD | |
331 | /WCOUNT, 0 (MOVED PAGE 0 DJG) | |
332 | BUFF, 0 | |
333 | /MWORDS, -WDSBLK (MOVED PAGE 0 DJG) | |
334 | UNIT, 0 | |
335 | CXFUN, XFUNCT | |
336 | M20, -20 | |
337 | PGCT, 0 | |
338 | CXWCT, XWCT | |
339 | C100, 100 | |
340 | TRYCNT, -3 | |
341 | C1000, 1000 | |
342 | ||
343 | ||
344 | *ORIGIN+172 | |
345 | FOUND, SZL CLA /RIGHT BLOCK. HOW ABOUT DIRECTION? | |
346 | JMP GO /WRONG..TURN AROUND | |
347 | TAD UNIT /PUT UNIT INTO LINK | |
348 | CLL RAL /AC IS NOW 0 | |
349 | C70, 70 /********DON'T MOVE THIS!!!!****** | |
350 | C3, 3 | |
351 | / TAD BUFF /GET BUFFER ADDRESS (DJG) | |
352 | /XFIELD, HLT /INTO NEXT PAGE | |
353 | \f *ORIGIN+200 | |
354 | CIF MFIELD | |
355 | / DCA XBUFF /SAVE ADDRESS (DJG) | |
356 | RAR /NOW GET UNIT # | |
357 | DCA XUNIT | |
358 | SDRC | |
359 | SDLC | |
360 | REVGRD, SDSS | |
361 | JMP .-1 /LOOK FOR REVERSE GUARD | |
362 | SDRC | |
363 | AND K77 | |
364 | TAD CM32 /IS IT REVERSE GUARD? | |
365 | SZA CLA | |
366 | JMP REVGRD /NO.KEEP LOOKING | |
367 | TAD XWCT | |
368 | DCA WORDS /WORD COUNTER | |
369 | TAD XFUNCT /GET FUNCTION READ OR WRITE | |
370 | K7700, SMA CLA | |
371 | JMP READ /NEG. IS WRITE | |
372 | WRITE, SDRC | |
373 | AND C300 /CHECK FOR WRITE LOCK AND SELECT ERROR | |
374 | CLL CML /LOCK OUT AND SELECT ARE AC 0 ERRORS | |
375 | SZA CLA | |
376 | JMP I CFATAL /FATAL ERROR. LINK MUST BE ON | |
377 | JMS RDQUAD /NO ONE EVER USES THIS WORD! | |
378 | C7600, 7600 | |
379 | TAD C1400 | |
380 | TAD XUNIT /INITIATE WRITE MODE | |
381 | SDLC | |
382 | CLA CMA | |
383 | JMS WRQUAD /PUT 77 IN REVERSE CHECKSUM | |
384 | CLA CMA | |
385 | DCA CHKSUM | |
386 | WRLP, TAD I XBUFF /GLORY BE! THE ACTUAL WRITE! | |
387 | JMS WRQUAD | |
388 | ISZ XBUFF /BUMP CORE POINTER | |
389 | JMP STFLD1+1 /NOT AT END OF FIELD (DJG) | |
390 | RDF | |
391 | TAD (6211 | |
392 | DCA STFLD1 | |
393 | STFLD1, NOP | |
394 | ISZ WORDS /DONE THIS BLOCK? | |
395 | JMP WRLP /NOT YET..LOOP A WHILE | |
396 | TAD XFUNCT /IS THE OPERATION FOR WDSBLK PER BLOCK? | |
397 | CLL RTR /IF NO, WRITE A 0 WORD | |
398 | SZL CLA | |
399 | JMS WRQUAD /WRITE A WORD OF 0 | |
400 | JMS GETCHK /DO THE CHECK SUM | |
401 | JMS WRQUAD /WRITE FORWARD CHECKSUM | |
402 | JMS WRQUAD /ALLOW CHECKSUM TO BE WRITTEN | |
403 | JMP I CRWCOM | |
404 | K77, 77 /ABOVE MAY SKIP (NOT ANYMORE DJG) | |
405 | \fREAD, JMS RDQUAD | |
406 | JMS RDQUAD | |
407 | JMS RDQUAD /SKIP CONTROL WORDS | |
408 | AND K77 | |
409 | TAD K7700 /TACK 7700 ONTO CHECKSUM. | |
410 | DCA CHKSUM /CHECKSUM ONLY LOW 6 BITS ANYWAY | |
411 | RDLP, JMS RDQUAD | |
412 | JMS EQUFUN /COMPUT CHECKSUM AS WE GO | |
413 | DCA I XBUFF /IT GETS CONDENSED LATER | |
414 | ISZ XBUFF /AT END OF FIELD? | |
415 | JMP STFLD2+1 /NOT AT END OF FIELD (DJG) | |
416 | RDF | |
417 | TAD (6211 | |
418 | DCA STFLD2 | |
419 | STFLD2, NOP | |
420 | ISZ WORDS /DONE THIS OP? | |
421 | JMP RDLP /NO SUCH LUCK | |
422 | TAD XFUNCT /IF OP WAS FOR WDSBLK-1, READ AND | |
423 | CLL RTR /CHECKSUM THE LAST TAPE WORD | |
424 | SNL CLA | |
425 | JMP RDLP2 | |
426 | JMS RDQUAD /NOT NEEDED FOR WDSBLK/BLOCK | |
427 | JMS EQUFUN /CHECKSUM IT | |
428 | RDLP2, JMS RDQUAD /READ CHECKSUM | |
429 | AND K7700 | |
430 | JMS EQUFUN | |
431 | JMS GETCHK /GET SIX BIT CHECKSUM | |
432 | JMP I CRWCOM | |
433 | C300, 300 /PROTECTION (NOT ANYMORE DJG) | |
434 | ||
435 | WRQUAD, 0 /WRITE OUT A 12 BIT WORD | |
436 | JMS EQUFUN /ADD THIS TO CHECKSUM | |
437 | SDSQ /SKIP ON QUADLINE FLAG | |
438 | JMP .-1 | |
439 | SDLD /LOAD DATA ONTO BUS | |
440 | CLA /SDLD DOESN'T CLEAR AC | |
441 | JMP I WRQUAD | |
442 | ||
443 | RDQUAD, 0 /READ A 12 BIT WORD | |
444 | SDSQ | |
445 | JMP .-1 | |
446 | SDRD /READ DATA | |
447 | JMP I RDQUAD | |
448 | ||
449 | \fXUNIT, | |
450 | EQUFUN, 0 /COMPUTE EQUIVALENCE CHECKSUM | |
451 | CMA | |
452 | DCA EQUTMP /ACTUALLY CHECKSUMS ON DECTAPE ARE | |
453 | TAD EQUTMP /EQUIVALENCE OF ALL WORDS IN A RECORD | |
454 | AND CHKSUM /SIX BITS AT A TIME. BUT SINCE EQUIVALENCE | |
455 | CIA /IS ASSOCIATIVE, WE CAN DO IT 12 | |
456 | CLL RAL /BITS AT A TIME AND CONDENSE LATER. | |
457 | TAD EQUTMP /THIS ROUTINE USES THESE IDENTITIES: | |
458 | TAD CHKSUM /A+B=(A.XOR.B)+2*(A.AND.B) | |
459 | DCA CHKSUM /A.EQU.B=.NOT.(A.XOR.B)=A.XOR.(.NOT.B) | |
460 | TAD EQUTMP /A.EQU.B=(A+(.NOT.B))-2*(A.AND.(.NOT.B)) | |
461 | CMA | |
462 | JMP I EQUFUN | |
463 | ||
464 | GETCHK, 0 /FORM 6 BIT CHECKSUM | |
465 | CLA | |
466 | TAD CHKSUM | |
467 | CMA | |
468 | CLL RTL | |
469 | RTL | |
470 | RTL | |
471 | JMS EQUFUN | |
472 | CLA CLL CML /FORCES LINK ON AT RWCOM | |
473 | TAD CHKSUM | |
474 | AND K7700 | |
475 | JMP I GETCHK | |
476 | ||
477 | CFATAL, FATAL | |
478 | CRWCOM, RWCOM | |
479 | XFUNCT, 0 | |
480 | CM32, -32 | |
481 | C1400, 1400 | |
482 | CHKSUM, 0 | |
483 | WORDS, 0 | |
484 | XWCT, 0 | |
485 | EQUTMP, 0 | |
486 | ||
487 | *20 | |
488 | RETRY, 7776 / RETRY UP TO 1 TIME | |
489 | NUMBLK, 2702 / NUMBER OF BLOCKS | |
490 | MWORDS, -WDSBLK / WORDS PER BLOCK | |
491 | WCOUNT, 0 | |
492 | BLKFLD, 37 / BLOCKS PER FIELD, 31 MAX FOR 128 WORDS/BLOCK | |
493 | / WRAPPING PAST END OF LAST FIELD DOESN'T WORK | |
494 | FIELDS, 0 | |
495 | RDSIZE, 0 / NUMBER BLOCKS PER READ | |
496 | CBLOCK, 0 / CURRENT BLOCK TO XFER | |
497 | CLKSUM, 0 | |
498 | DRVSEL, 0 | |
499 | READST, 377 | |
500 | LOC, 0 | |
501 | LEN, 0 | |
502 | BCNT, 0 | |
503 | TEMP, 0 | |
504 | C17, 17 | |
505 | C7400, 7400 | |
506 | CHKSM, 0 | |
507 | DONEFG, 0 | |
508 | OLDBUF, 0 / USED BY DTA0 ROUTINE | |
509 | XBUFF, 0 / USED BY DTA0 ROUTINE | |
510 | C374, 374 / USED BY DTA0 ROUTINE | |
511 | BLOCK, 0 / USED BY DTA0 ROUTINE | |
512 | ||
513 | *140 | |
514 | FINISH, HLT / Normal good halt | |
515 | JMP START / And restart if requested | |
516 | ||
517 | *200 | |
518 | START, CDF 0 | |
519 | CAF | |
520 | CLA CLL OSR / Get drive | |
521 | AND (1 | |
522 | RTR | |
523 | DCA DRVSEL | |
524 | CLA CLL OSR / Get max field | |
525 | RTR | |
526 | RAR | |
527 | AND (7 | |
528 | SNA | |
529 | HLT / Must have at least 1 field for buffer | |
530 | CIA | |
531 | DCA FIELDS | |
532 | RDSZLP, TAD BLKFLD / Multiply by number of fields available | |
533 | ISZ FIELDS | |
534 | JMP RDSZLP | |
535 | DCA RDSIZE / NUMBER BLOCK PER READ | |
536 | DCA CBLOCK | |
537 | DCA CHKSM | |
538 | DCA DONEFG | |
539 | ||
540 | DUMPLP, CLA | |
541 | TAD DONEFG / If all transfered do finish stuff | |
542 | SZA | |
543 | JMP DONE | |
544 | TAD RDSIZE / Always ask for maximum number of blocks | |
545 | DCA ARGSZ / Will accept less | |
546 | TAD CBLOCK / The serial read routine uses these variables | |
547 | DCA ARGBK | |
548 | ||
549 | DCA LOC | |
550 | TAD ARGSZ | |
551 | JMS PUN / ASK FOR UP TO THIS MANY BLOCKS | |
552 | TAD ARGSZ | |
553 | CIA | |
554 | DCA BCNT / Our block counter | |
555 | CDF 10 | |
556 | INBL1, JMS INBLK / Get a block | |
557 | JMP GOTALL / If Not last block | |
558 | TAD ARGSZ / Is last block, calculate number received | |
559 | TAD BCNT | |
560 | SNA / If no blocks transfered must be done flag | |
561 | JMP DONE / Do finish processing | |
562 | DCA ARGSZ / Else write data received | |
563 | IAC | |
564 | DCA DONEFG | |
565 | JMP WRTIT | |
566 | ||
567 | GOTALL, ISZ CBLOCK / Go get next block | |
568 | ISZ BCNT | |
569 | JMP INBL1 | |
570 | WRTIT, CDF 0 / Got all, write them out | |
571 | TAD DRVSEL | |
572 | JMS DTA0 | |
573 | 4012 / ONLY EVEN # WORDS/BLOCK WORKS | |
574 | ARGSZ, 0 | |
575 | 0 | |
576 | ARGBK, 0 | |
577 | JMP ERRRET | |
578 | JMP DUMPLP / Go get more | |
579 | ||
580 | DONE, CLA / Send a character to get checksum | |
581 | CDF 0 | |
582 | JMS PUN | |
583 | JMS GETCH | |
584 | DCA TEMP | |
585 | JMS GETCH / Convert the 2 bytes to 12 bit word | |
586 | RTL / Shift low 4 bits to top 4 | |
587 | RTL | |
588 | RTL | |
589 | RTL | |
590 | AND C7400 | |
591 | TAD TEMP | |
592 | DCA TEMP | |
593 | TAD TEMP | |
594 | TAD CHKSM | |
595 | SZA / Checksum received is - sum so should be 0 | |
596 | HLT / Give up if not, serial error | |
597 | / Do reread check | |
598 | TAD ARGSZ / Get size of last block written for first | |
599 | DCA ARGSZ2 / to reread | |
600 | TAD CBLOCK / And last block number | |
601 | DCA ARGBK2 | |
602 | TAD TEMP / Store checksum received in our checksum | |
603 | DCA CHKSM / Should give 0 at end | |
604 | RDCHK, CLA | |
605 | TAD ARGSZ2 / Decrease block number by number of blocks to | |
606 | CIA / Read so we read starting at first block | |
607 | TAD ARGBK2 / Read routine can't read backward | |
608 | DCA ARGBK2 | |
609 | TAD DRVSEL | |
610 | JMS DTA0 / REREAD AND CHECK | |
611 | 12 / ONLY EVEN # WORDS/BLOCK WORKS | |
612 | ARGSZ2, 0 | |
613 | 0 | |
614 | ARGBK2, 0 | |
615 | JMP RDERR | |
616 | TAD ARGSZ2 / Checksum over number of blocks read | |
617 | CIA | |
618 | DCA BCNT | |
619 | DCA LOC | |
620 | CDF 10 | |
621 | SUMIT, JMS SUMBLK / Sum each block | |
622 | ISZ BCNT | |
623 | JMP SUMIT | |
624 | CDF 0 | |
625 | TAD RDSIZE / Read full blocks for rest of read | |
626 | DCA ARGSZ2 | |
627 | TAD ARGBK2 / If at block 0 then we are done | |
628 | SZA | |
629 | JMP RDCHK | |
630 | ||
631 | TAD CHKSM / Leave AC with checksum, should be 0 | |
632 | JMP FINISH | |
633 | ||
634 | RDERR, HLT | |
635 | ERRRET, HLT | |
636 | ||
637 | PAGE | |
638 | INBLK, 0 / Read a block of data from serial port | |
639 | CLA IAC / We read block size -1 words, MWORDS is - block size | |
640 | / TAD WCOUNT | |
641 | TAD MWORDS | |
642 | DCA LEN | |
643 | JMS GETCH / Get start of block flag | |
644 | CIA | |
645 | TAD (377 | |
646 | SNA | |
647 | JMP IN | |
648 | TAD (-1 / Is it end of data flag? | |
649 | SZA | |
650 | HLT / Not it, give up, we lost sync on serial data | |
651 | ISZ INBLK / Return end of data state | |
652 | JMP I INBLK | |
653 | IN, | |
654 | JMS GETCH / Get 3 bytes and convert to 2 words | |
655 | DCA I LOC | |
656 | JMS GETCH | |
657 | DCA TEMP | |
658 | TAD TEMP | |
659 | RTL / Shift low 4 bits to top 4 | |
660 | RTL | |
661 | RTL | |
662 | RTL | |
663 | AND C7400 | |
664 | TAD I LOC | |
665 | DCA I LOC | |
666 | TAD I LOC | |
667 | TAD CHKSM /Keep checksum of all words received | |
668 | DCA CHKSM | |
669 | ISZ LOC | |
670 | JMP STFLD3+1 /NOT AT END OF FIELD (DJG) | |
671 | RDF /At end, inc field | |
672 | TAD (6211 | |
673 | DCA STFLD3 | |
674 | STFLD3, NOP | |
675 | TAD TEMP | |
676 | RTR | |
677 | RTR | |
678 | AND C17 | |
679 | DCA TEMP | |
680 | JMS GETCH | |
681 | RTL | |
682 | RTL | |
683 | TAD TEMP | |
684 | DCA I LOC | |
685 | TAD I LOC | |
686 | TAD CHKSM | |
687 | DCA CHKSM | |
688 | ISZ LOC | |
689 | JMP STFLD4+1 /Not at end of field | |
690 | RDF /At end, inc field | |
691 | TAD (6211 | |
692 | DCA STFLD4 | |
693 | STFLD4, NOP | |
694 | ISZ LEN | |
695 | ISZ LEN | |
696 | JMP IN | |
697 | JMP I INBLK | |
698 | ||
699 | SUMBLK, 0 / Sum a block of memory | |
700 | CLA IAC | |
701 | / TAD WCOUNT | |
702 | TAD MWORDS | |
703 | DCA LEN | |
704 | SUMLP, TAD I LOC | |
705 | TAD CHKSM / Keep checksum of all words | |
706 | DCA CHKSM | |
707 | ISZ LOC | |
708 | JMP STFLD5+1 /Not at end of field | |
709 | RDF /At end, inc field | |
710 | TAD (6211 | |
711 | DCA STFLD5 | |
712 | STFLD5, NOP | |
713 | ISZ LEN | |
714 | JMP SUMLP | |
715 | JMP I SUMBLK | |
716 | ||
717 | PUN, 0 / Send a character | |
718 | / PLS / Punch for testing with emulator | |
719 | TLS2 / Send out console | |
720 | CLA CLL | |
721 | TAD CBLOCK | |
722 | / PSF | |
723 | TSF2 /Wait until character sent | |
724 | JMP .-1 | |
725 | CLA | |
726 | JMP I PUN | |
727 | ||
728 | GETCH, 0 / Get a character | |
729 | CLA CLL | |
730 | TAD CBLOCK | |
731 | / RSF | |
732 | KSF2 / Have character waiting | |
733 | JMP .-1 / No, try again | |
734 | / RRB RFC | |
735 | KRB2 / Get character | |
736 | JMP I GETCH | |
737 | $ |