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
12 / Number of retries is set to 1 for reading and writing.
14 / The current block being written to will be displayed in the AC
15 / while serial data is transfering.
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.
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.
29 INAD=030 / Address of serial input, 30 for console
37 OUTAD=040 / Address of serial output, 40 for console
45 /2 TD8E INITIALIZER PROGRAM, V7A
47 /COPYRIGHT (C) 1975, 1977
48 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
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.
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.
65 /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
66 /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
74 /DECEMBER 21, 1973 GB/RL/EF/SR
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
83 /FIXES SINCE FIELD-TEST RELEASE:
85 /1. FIXED BUG RE CLA ON RETRY AFTER ERROR
86 /2. ALLOWED FINAL BOOTSTRAP TO BE INTO A WRITE-LOCKED DEVICE
90 /3. FIXED BUG RE TD8E BUILD (V6B PATCH)
92 /THIS ROUTINE CAN BE RE-EDITED AND ASSEMBLED TO PRODUCE
93 /VARIATIONS ON THE BASIC TD8E SYSTEM. ASSEMBLY PARAMETERS
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
100 /FOLLOWING ARE THE PARAMETERS SET UP FOR THE STANDARD
101 /DEC VERSION OF THIS ROUTINE:
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
109 /THE USE OF THE PARAMETERS IS AS FOLLOWS:
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
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.
121 /AFIELD: AFIELD DETERMINES THE INITIAL FIELD SETTING FOR THE
122 / LOADER. PERMISSIBLE VALUES FOR AFIELD ARE 0 TO 7.
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.
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.
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:
144 \f/THE CALL TO THE SUBROUTINE FOLLOWS BASICALLY THE
145 /CALLING SEQUENCE FOR OS/8 DEVICE HANDLERS.
146 /THE CALLING SEQUENCE IS:
149 / CIF MFIELD /MFIELD=FIELD ASSEMBLED IN
150 / JMS ENTRY /ENTRY=ORIGIN (EVEN NUMBERED DRIVE
151 /AND ORIGIN+4 FOR ODD NUMBERED DRIVE.
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
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
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
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.
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
193 /THE IOT'S IN GENERAL ARE 677X,676X,675X,AND 674X.
194 /THE OTHERS CONTROL UNITS 2-7.
196 / THIS HANDLER USES DECTAPE BLOCKS NOT OS/8 BLOCKS !
200 / MODIFIED SO BIT 0 ON ENTRY IS UNIT 1
202 DCA UNIT /SAVE UNIT POSITION
204 TAD C6203 /GET DATA FIELD AND SETUP RETURN
206 TAD I DTA0 /GET FUNCTION WORD
207 SDLD /PUT FUNCTION INTO DATA REGISTER
208 CLL RTR /AC STILL HAS FUNCTION. PUT # WORDS PER
210 SZL CLA /KNOCK ONE OFF WDSBLK?
213 DCA WCOUNT /STORE MASTER WORD COUNT
214 ISZ DTA0 /TO BLOCK COUNT (DJG)
220 DCA XBUFF /SAVE ADDRESS (DJG)
222 ISZ DTA0 /TO BLOCK NUMBER
225 ISZ DTA0 /POINT TO ERROR EXIT
226 CIF CDF MFIELD /TO ROUTINES DATA FIELD
227 / SDRD /GET FUNCTION INTO AC
229 / AND CM200 /GET # PAGES TO XFER
232 AND C70 /GET FIELD FOR XFER
233 TAD C6201 /FORM CDF N
234 DCA XFIELD /IF=0 AND DF=N AT XFER.
236 DCA TRYCNT /3 ERROR TRIES
237 TAD UNIT /TEST FOR SELECT ERROR
243 SDRD /PUT FUNCT INTO XFUNCT IN SECOND PG.
247 SDRD /GET MOTION BIT TO LINK
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?
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
266 / DCA XBUFF /SAVE ADDRESS (DJG)
268 CLL CML /FORCES MOTION FORWARD
269 GO, CLA CML RTR /LINK BECOMES MOTION BIT
271 TAD UNIT /PUT IN 'GO' AND UNIT #
272 SDLC /LOOK FOR BLOCK NO.
274 TAD XBUFF /SAVE LOC OF BLOCK START SO
275 DCA OLDBUF /CAN RETRY ON ERROR
279 JMS I CRDQUD /WAIT AT LEAST 6 LINES TO LOOK
281 CM200, 7600 /COULD HAVE SAVED A LOC. HERE
283 JMP .-1 /WAIT FOR SINGLE LINE FLAG
285 CLL RTL /DIRECTION TO LINK. INFO BITS
287 AND C374 /ISOLATE MARK TRACK BITS
288 TAD M110 /IS IT END ZONE?
289 SNA /THE LINK STAYS SAME THRU THIS
291 TAD M20 /CHECK FOR BLOCK MARK
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.
301 CMA /IS IT RIGHT BLOCK?
303 JMP FOUND /YES..HOORAY!
304 M110, SZL SNA CLA /NO, BUT ARE WE HEADED FOR IT?
305 /ABOVE SNA IS SUPERFLUOUS.
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
313 OLDFLD, NOP /RESET FIELD
314 TAD OLDBUF /RESET BACK TO START OF BLOCK
318 JMP FATAL /LINK OFF MEANS AC=4000 ON RETURN
320 CLL CML /AC=0 ON NORMAL RETURN
331 /WCOUNT, 0 (MOVED PAGE 0 DJG)
333 /MWORDS, -WDSBLK (MOVED PAGE 0 DJG)
345 FOUND, SZL CLA /RIGHT BLOCK. HOW ABOUT DIRECTION?
346 JMP GO /WRONG..TURN AROUND
347 TAD UNIT /PUT UNIT INTO LINK
349 C70, 70 /********DON'T MOVE THIS!!!!******
351 / TAD BUFF /GET BUFFER ADDRESS (DJG)
352 /XFIELD, HLT /INTO NEXT PAGE
355 / DCA XBUFF /SAVE ADDRESS (DJG)
361 JMP .-1 /LOOK FOR REVERSE GUARD
364 TAD CM32 /IS IT REVERSE GUARD?
366 JMP REVGRD /NO.KEEP LOOKING
368 DCA WORDS /WORD COUNTER
369 TAD XFUNCT /GET FUNCTION READ OR WRITE
371 JMP READ /NEG. IS WRITE
373 AND C300 /CHECK FOR WRITE LOCK AND SELECT ERROR
374 CLL CML /LOCK OUT AND SELECT ARE AC 0 ERRORS
376 JMP I CFATAL /FATAL ERROR. LINK MUST BE ON
377 JMS RDQUAD /NO ONE EVER USES THIS WORD!
380 TAD XUNIT /INITIATE WRITE MODE
383 JMS WRQUAD /PUT 77 IN REVERSE CHECKSUM
386 WRLP, TAD I XBUFF /GLORY BE! THE ACTUAL WRITE!
388 ISZ XBUFF /BUMP CORE POINTER
389 JMP STFLD1+1 /NOT AT END OF FIELD (DJG)
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
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
404 K77, 77 /ABOVE MAY SKIP (NOT ANYMORE DJG)
407 JMS RDQUAD /SKIP CONTROL WORDS
409 TAD K7700 /TACK 7700 ONTO CHECKSUM.
410 DCA CHKSUM /CHECKSUM ONLY LOW 6 BITS ANYWAY
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)
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
426 JMS RDQUAD /NOT NEEDED FOR WDSBLK/BLOCK
427 JMS EQUFUN /CHECKSUM IT
428 RDLP2, JMS RDQUAD /READ CHECKSUM
431 JMS GETCHK /GET SIX BIT CHECKSUM
433 C300, 300 /PROTECTION (NOT ANYMORE DJG)
435 WRQUAD, 0 /WRITE OUT A 12 BIT WORD
436 JMS EQUFUN /ADD THIS TO CHECKSUM
437 SDSQ /SKIP ON QUADLINE FLAG
439 SDLD /LOAD DATA ONTO BUS
440 CLA /SDLD DOESN'T CLEAR AC
443 RDQUAD, 0 /READ A 12 BIT WORD
450 EQUFUN, 0 /COMPUTE EQUIVALENCE CHECKSUM
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))
464 GETCHK, 0 /FORM 6 BIT CHECKSUM
472 CLA CLL CML /FORCES LINK ON AT RWCOM
488 RETRY, 7776 / RETRY UP TO 1 TIME
489 NUMBLK, 2702 / NUMBER OF BLOCKS
490 MWORDS, -WDSBLK / WORDS PER BLOCK
492 BLKFLD, 37 / BLOCKS PER FIELD, 31 MAX FOR 128 WORDS/BLOCK
493 / WRAPPING PAST END OF LAST FIELD DOESN'T WORK
495 RDSIZE, 0 / NUMBER BLOCKS PER READ
496 CBLOCK, 0 / CURRENT BLOCK TO XFER
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
514 FINISH, HLT / Normal good halt
515 JMP START / And restart if requested
520 CLA CLL OSR / Get drive
524 CLA CLL OSR / Get max field
529 HLT / Must have at least 1 field for buffer
532 RDSZLP, TAD BLKFLD / Multiply by number of fields available
535 DCA RDSIZE / NUMBER BLOCK PER READ
541 TAD DONEFG / If all transfered do finish stuff
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
551 JMS PUN / ASK FOR UP TO THIS MANY BLOCKS
554 DCA BCNT / Our block counter
556 INBL1, JMS INBLK / Get a block
557 JMP GOTALL / If Not last block
558 TAD ARGSZ / Is last block, calculate number received
560 SNA / If no blocks transfered must be done flag
561 JMP DONE / Do finish processing
562 DCA ARGSZ / Else write data received
567 GOTALL, ISZ CBLOCK / Go get next block
570 WRTIT, CDF 0 / Got all, write them out
573 4012 / ONLY EVEN # WORDS/BLOCK WORKS
578 JMP DUMPLP / Go get more
580 DONE, CLA / Send a character to get checksum
585 JMS GETCH / Convert the 2 bytes to 12 bit word
586 RTL / Shift low 4 bits to top 4
595 SZA / Checksum received is - sum so should be 0
596 HLT / Give up if not, serial error
598 TAD ARGSZ / Get size of last block written for first
599 DCA ARGSZ2 / to reread
600 TAD CBLOCK / And last block number
602 TAD TEMP / Store checksum received in our checksum
603 DCA CHKSM / Should give 0 at end
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
610 JMS DTA0 / REREAD AND CHECK
611 12 / ONLY EVEN # WORDS/BLOCK WORKS
616 TAD ARGSZ2 / Checksum over number of blocks read
621 SUMIT, JMS SUMBLK / Sum each block
625 TAD RDSIZE / Read full blocks for rest of read
627 TAD ARGBK2 / If at block 0 then we are done
631 TAD CHKSM / Leave AC with checksum, should be 0
638 INBLK, 0 / Read a block of data from serial port
639 CLA IAC / We read block size -1 words, MWORDS is - block size
643 JMS GETCH / Get start of block flag
648 TAD (-1 / Is it end of data flag?
650 HLT / Not it, give up, we lost sync on serial data
651 ISZ INBLK / Return end of data state
654 JMS GETCH / Get 3 bytes and convert to 2 words
659 RTL / Shift low 4 bits to top 4
667 TAD CHKSM /Keep checksum of all words received
670 JMP STFLD3+1 /NOT AT END OF FIELD (DJG)
671 RDF /At end, inc field
689 JMP STFLD4+1 /Not at end of field
690 RDF /At end, inc field
699 SUMBLK, 0 / Sum a block of memory
705 TAD CHKSM / Keep checksum of all words
708 JMP STFLD5+1 /Not at end of field
709 RDF /At end, inc field
717 PUN, 0 / Send a character
718 / PLS / Punch for testing with emulator
719 TLS2 / Send out console
723 TSF2 /Wait until character sent
728 GETCH, 0 / Get a character
732 KSF2 / Have character waiting
733 JMP .-1 / No, try again