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