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