A large commit.
[pdp8.git] / sw / dumprest / hachti_std / RESTTD.PA
CommitLineData
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
199DTA0, 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
250XFIELD, HLT /INTO NEXT PAGE
251 JMP GO /AND START THE MOTION.
252RWCOM, 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
270GO, 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
282CM200, 7600 /COULD HAVE SAVED A LOC. HERE
283SRCH, 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!
305M110, SZL SNA CLA /NO, BUT ARE WE HEADED FOR IT?
306 /ABOVE SNA IS SUPERFLUOUS.
307 JMP SRCH /YES
308ENDZ, 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
313TRY3, CLA
314OLDFLD, 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
320EXIT, ISZ DTA0
321 CLL CML /AC=0 ON NORMAL RETURN
322FATAL, TAD UNIT
323 SDLC /STOP THE UNIT
324 CLA CML RAR
325LEAVE, HLT
326 JMP I DTA0
327
328\f
329C6203, 6203
330C6201, 6201
331CRDQUD, RDQUAD
332/WCOUNT, 0 (MOVED PAGE 0 DJG)
333BUFF, 0
334/MWORDS, -WDSBLK (MOVED PAGE 0 DJG)
335UNIT, 0
336CXFUN, XFUNCT
337M20, -20
338PGCT, 0
339CXWCT, XWCT
340C100, 100
341TRYCNT, -3
342C1000, 1000
343
344
345 *ORIGIN+172
346FOUND, 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
350C70, 70 /********DON'T MOVE THIS!!!!******
351C3, 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
361REVGRD, 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
371K7700, SMA CLA
372 JMP READ /NEG. IS WRITE
373WRITE, 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!
379C7600, 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
387WRLP, 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
394STFLD1, 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
405K77, 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
412RDLP, 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
420STFLD2, 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
429RDLP2, JMS RDQUAD /READ CHECKSUM
430 AND K7700
431 JMS EQUFUN
432 JMS GETCHK /GET SIX BIT CHECKSUM
433 JMP I CRWCOM
434C300, 300 /PROTECTION (NOT ANYMORE DJG)
435
436WRQUAD, 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
444RDQUAD, 0 /READ A 12 BIT WORD
445 SDSQ
446 JMP .-1
447 SDRD /READ DATA
448 JMP I RDQUAD
449
450\fXUNIT,
451EQUFUN, 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
465GETCHK, 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
478CFATAL, FATAL
479CRWCOM, RWCOM
480XFUNCT, 0
481CM32, -32
482C1400, 1400
483CHKSUM, 0
484WORDS, 0
485XWCT, 0
486EQUTMP, 0
487
488 *20
489RETRY, 7776 / RETRY UP TO 1 TIME
490NUMBLK, 2702 / NUMBER OF BLOCKS
491MWORDS, -WDSBLK / WORDS PER BLOCK
492WCOUNT, 0
493BLKFLD, 37 / BLOCKS PER FIELD, 31 MAX FOR 129 WORDS/BLOCK
494 / WRAPPING PAST END OF LAST FIELD DOESN'T WORK
495FIELDS, 0
496RDSIZE, 0 / NUMBER BLOCKS PER READ
497CBLOCK, 0 / CURRENT BLOCK TO XFER
498CLKSUM, 0
499DRVSEL, 0
500READST, 377
501LOC, 0
502LEN, 0
503BCNT, 0
504TEMP, 0
505C17, 17
506C7400, 7400
507CHKSM, 0
508DONEFG, 0
509OLDBUF, 0 / USED BY DTA0 ROUTINE
510XBUFF, 0 / USED BY DTA0 ROUTINE
511C374, 374 / USED BY DTA0 ROUTINE
512BLOCK, 0 / USED BY DTA0 ROUTINE
513
514 *140
515FINISH,
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
528BO1, 6743
529BO2, JMP 31
530
531 *200
532START, 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
547RDSZLP, 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
555DUMPLP, 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
571INBL1, 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
582GOTALL, ISZ CBLOCK / Go get next block
583 ISZ BCNT
584 JMP INBL1
585WRTIT, CDF 0 / Got all, write them out
586 TAD DRVSEL
587 JMS DTA0
588 4010 / ONLY EVEN # WORDS/BLOCK WORKS
589ARGSZ, 0
590 0
591ARGBK, 0
592 JMP ERRRET
593 JMP DUMPLP / Go get more
594
595DONE, 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
619RDCHK, 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
627ARGSZ2, 0
628 0
629ARGBK2, 0
630 JMP RDERR
631 TAD ARGSZ2 / Checksum over number of blocks read
632 CIA
633 DCA BCNT
634 DCA LOC
635 CDF 10
636SUMIT, 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
649RDERR, HLT
650ERRRET, HLT
651
652 PAGE
653INBLK, 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
667IN,
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
688STFLD3, 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
710STFLD4, NOP
711 ISZ LEN
712 JMP IN
713 JMP I INBLK
714
715SUMBLK, 0 / Sum a block of memory
716 CLA
717 TAD MWORDS
718 DCA LEN
719SUMLP, 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
727STFLD5, NOP
728 ISZ LEN
729 JMP SUMLP
730 JMP I SUMBLK
731
732PUN, 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
743GETCH, 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 $