A large commit.
[pdp8.git] / sw / dumprest / original / resttd8e.pal.orig
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 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
201DTA0, 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
249XFIELD, HLT /INTO NEXT PAGE
250 JMP GO /AND START THE MOTION.
251RWCOM, 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
269GO, 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
281CM200, 7600 /COULD HAVE SAVED A LOC. HERE
282SRCH, 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!
304M110, SZL SNA CLA /NO, BUT ARE WE HEADED FOR IT?
305 /ABOVE SNA IS SUPERFLUOUS.
306 JMP SRCH /YES
307ENDZ, 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
312TRY3, CLA
313OLDFLD, 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
319EXIT, ISZ DTA0
320 CLL CML /AC=0 ON NORMAL RETURN
321FATAL, TAD UNIT
322 SDLC /STOP THE UNIT
323 CLA CML RAR
324LEAVE, HLT
325 JMP I DTA0
326
327\f
328C6203, 6203
329C6201, 6201
330CRDQUD, RDQUAD
331/WCOUNT, 0 (MOVED PAGE 0 DJG)
332BUFF, 0
333/MWORDS, -WDSBLK (MOVED PAGE 0 DJG)
334UNIT, 0
335CXFUN, XFUNCT
336M20, -20
337PGCT, 0
338CXWCT, XWCT
339C100, 100
340TRYCNT, -3
341C1000, 1000
342
343
344 *ORIGIN+172
345FOUND, 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
349C70, 70 /********DON'T MOVE THIS!!!!******
350C3, 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
360REVGRD, 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
370K7700, SMA CLA
371 JMP READ /NEG. IS WRITE
372WRITE, 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!
378C7600, 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
386WRLP, 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
393STFLD1, 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
404K77, 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
411RDLP, 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
419STFLD2, 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
428RDLP2, JMS RDQUAD /READ CHECKSUM
429 AND K7700
430 JMS EQUFUN
431 JMS GETCHK /GET SIX BIT CHECKSUM
432 JMP I CRWCOM
433C300, 300 /PROTECTION (NOT ANYMORE DJG)
434
435WRQUAD, 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
443RDQUAD, 0 /READ A 12 BIT WORD
444 SDSQ
445 JMP .-1
446 SDRD /READ DATA
447 JMP I RDQUAD
448
449\fXUNIT,
450EQUFUN, 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
464GETCHK, 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
477CFATAL, FATAL
478CRWCOM, RWCOM
479XFUNCT, 0
480CM32, -32
481C1400, 1400
482CHKSUM, 0
483WORDS, 0
484XWCT, 0
485EQUTMP, 0
486
487 *20
488RETRY, 7776 / RETRY UP TO 1 TIME
489NUMBLK, 2702 / NUMBER OF BLOCKS
490MWORDS, -WDSBLK / WORDS PER BLOCK
491WCOUNT, 0
492BLKFLD, 37 / BLOCKS PER FIELD, 31 MAX FOR 128 WORDS/BLOCK
493 / WRAPPING PAST END OF LAST FIELD DOESN'T WORK
494FIELDS, 0
495RDSIZE, 0 / NUMBER BLOCKS PER READ
496CBLOCK, 0 / CURRENT BLOCK TO XFER
497CLKSUM, 0
498DRVSEL, 0
499READST, 377
500LOC, 0
501LEN, 0
502BCNT, 0
503TEMP, 0
504C17, 17
505C7400, 7400
506CHKSM, 0
507DONEFG, 0
508OLDBUF, 0 / USED BY DTA0 ROUTINE
509XBUFF, 0 / USED BY DTA0 ROUTINE
510C374, 374 / USED BY DTA0 ROUTINE
511BLOCK, 0 / USED BY DTA0 ROUTINE
512
513 *140
514FINISH, HLT / Normal good halt
515 JMP START / And restart if requested
516
517 *200
518START, 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
532RDSZLP, 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
540DUMPLP, 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
556INBL1, 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
567GOTALL, ISZ CBLOCK / Go get next block
568 ISZ BCNT
569 JMP INBL1
570WRTIT, CDF 0 / Got all, write them out
571 TAD DRVSEL
572 JMS DTA0
573 4012 / ONLY EVEN # WORDS/BLOCK WORKS
574ARGSZ, 0
575 0
576ARGBK, 0
577 JMP ERRRET
578 JMP DUMPLP / Go get more
579
580DONE, 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
604RDCHK, 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
612ARGSZ2, 0
613 0
614ARGBK2, 0
615 JMP RDERR
616 TAD ARGSZ2 / Checksum over number of blocks read
617 CIA
618 DCA BCNT
619 DCA LOC
620 CDF 10
621SUMIT, 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
634RDERR, HLT
635ERRRET, HLT
636
637 PAGE
638INBLK, 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
653IN,
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
674STFLD3, 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
693STFLD4, NOP
694 ISZ LEN
695 ISZ LEN
696 JMP IN
697 JMP I INBLK
698
699SUMBLK, 0 / Sum a block of memory
700 CLA IAC
701/ TAD WCOUNT
702 TAD MWORDS
703 DCA LEN
704SUMLP, 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
712STFLD5, NOP
713 ISZ LEN
714 JMP SUMLP
715 JMP I SUMBLK
716
717PUN, 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
728GETCH, 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 $