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
12 / The program (PC) receiving the data should be started before this program
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
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
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
28 / We will retry each read up to 16 times on error
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
33 INAD=030 / Address of serial input, 30 for console
41 OUTAD=040 / Address of serial output, 40 for console
49 /2 TD8E INITIALIZER PROGRAM, V7A
51 /COPYRIGHT (C) 1975, 1977
52 /DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
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.
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.
69 /DEC ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF ITS
70 /SOFTWARE ON EQUIPMENT WHICH IS NOT SUPPLIED BY DEC.
78 /DECEMBER 21, 1973 GB/RL/EF/SR
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
87 /FIXES SINCE FIELD-TEST RELEASE:
89 /1. FIXED BUG RE CLA ON RETRY AFTER ERROR
90 /2. ALLOWED FINAL BOOTSTRAP TO BE INTO A WRITE-LOCKED DEVICE
94 /3. FIXED BUG RE TD8E BUILD (V6B PATCH)
96 /THIS ROUTINE CAN BE RE-EDITED AND ASSEMBLED TO PRODUCE
97 /VARIATIONS ON THE BASIC TD8E SYSTEM. ASSEMBLY PARAMETERS
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
104 /FOLLOWING ARE THE PARAMETERS SET UP FOR THE STANDARD
105 /DEC VERSION OF THIS ROUTINE:
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
113 /THE USE OF THE PARAMETERS IS AS FOLLOWS:
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
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.
125 /AFIELD: AFIELD DETERMINES THE INITIAL FIELD SETTING FOR THE
126 / LOADER. PERMISSIBLE VALUES FOR AFIELD ARE 0 TO 7.
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.
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.
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:
148 \f/THE CALL TO THE SUBROUTINE FOLLOWS BASICALLY THE
149 /CALLING SEQUENCE FOR OS/8 DEVICE HANDLERS.
150 /THE CALLING SEQUENCE IS:
153 / CIF MFIELD /MFIELD=FIELD ASSEMBLED IN
154 / JMS ENTRY /ENTRY=ORIGIN (EVEN NUMBERED DRIVE
155 /AND ORIGIN+4 FOR ODD NUMBERED DRIVE.
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
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
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
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.
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
197 /THE IOT'S IN GENERAL ARE 677X,676X,675X,AND 674X.
198 /THE OTHERS CONTROL UNITS 2-7.
200 / THIS HANDLER USES DECTAPE BLOCKS NOT OS/8 BLOCKS !
204 / MODIFIED SO BIT 0 ON ENTRY IS UNIT 1
206 DCA UNIT /SAVE UNIT POSITION
208 TAD C6203 /GET DATA FIELD AND SETUP RETURN
210 TAD I DTA0 /GET FUNCTION WORD
211 SDLD /PUT FUNCTION INTO DATA REGISTER
212 CLL RTR /AC STILL HAS FUNCTION. PUT # WORDS PER
214 SZL CLA /KNOCK ONE OFF WDSBLK?
217 DCA WCOUNT /STORE MASTER WORD COUNT
218 ISZ DTA0 /TO BLOCK COUNT (DJG)
224 DCA XBUFF /SAVE ADDRESS (DJG)
226 ISZ DTA0 /TO BLOCK NUMBER
229 ISZ DTA0 /POINT TO ERROR EXIT
230 CIF CDF MFIELD /TO ROUTINES DATA FIELD
231 / SDRD /GET FUNCTION INTO AC
233 / AND CM200 /GET # PAGES TO XFER
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
241 CLA / Moved here because my drive 1 is slow selecting
243 DCA TRYCNT /3 ERROR TRIES
248 SDRD /PUT FUNCT INTO XFUNCT IN SECOND PG.
252 SDRD /GET MOTION BIT TO LINK
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?
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
271 / DCA XBUFF /SAVE ADDRESS (DJG)
273 CLL CML /FORCES MOTION FORWARD
274 GO, CLA CML RTR /LINK BECOMES MOTION BIT
276 TAD UNIT /PUT IN 'GO' AND UNIT #
277 SDLC /LOOK FOR BLOCK NO.
284 JMS I CRDQUD /WAIT AT LEAST 6 LINES TO LOOK
286 CM200, 7600 /COULD HAVE SAVED A LOC. HERE
288 JMP .-1 /WAIT FOR SINGLE LINE FLAG
290 CLL RTL /DIRECTION TO LINK. INFO BITS
292 AND C374 /ISOLATE MARK TRACK BITS
293 TAD M110 /IS IT END ZONE?
294 SNA /THE LINK STAYS SAME THRU THIS
296 TAD M20 /CHECK FOR BLOCK MARK
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.
306 CMA /IS IT RIGHT BLOCK?
308 JMP FOUND /YES..HOORAY!
309 M110, SZL SNA CLA /NO, BUT ARE WE HEADED FOR IT?
310 /ABOVE SNA IS SUPERFLUOUS.
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
323 JMP FATAL /LINK OFF MEANS AC=4000 ON RETURN
325 CLL CML /AC=0 ON NORMAL RETURN
336 /WCOUNT, 0 (MOVED PAGE 0 DJG)
338 /MWORDS, -WDSBLK (MOVED PAGE 0 DJG)
350 FOUND, SZL CLA /RIGHT BLOCK. HOW ABOUT DIRECTION?
351 JMP GO /WRONG..TURN AROUND
352 TAD UNIT /PUT UNIT INTO LINK
354 C70, 70 /********DON'T MOVE THIS!!!!******
356 / TAD BUFF /GET BUFFER ADDRESS (DJG)
357 /XFIELD, HLT /INTO NEXT PAGE
360 / DCA XBUFF /SAVE ADDRESS (DJG)
366 JMP .-1 /LOOK FOR REVERSE GUARD
369 TAD CM32 /IS IT REVERSE GUARD?
371 JMP REVGRD /NO.KEEP LOOKING
373 DCA WORDS /WORD COUNTER
374 TAD XFUNCT /GET FUNCTION READ OR WRITE
376 JMP READ /NEG. IS WRITE
378 AND C300 /CHECK FOR WRITE LOCK AND SELECT ERROR
379 CLL CML /LOCK OUT AND SELECT ARE AC 0 ERRORS
381 JMP I CFATAL /FATAL ERROR. LINK MUST BE ON
382 JMS RDQUAD /NO ONE EVER USES THIS WORD!
385 TAD XUNIT /INITIATE WRITE MODE
388 JMS WRQUAD /PUT 77 IN REVERSE CHECKSUM
391 WRLP, TAD I XBUFF /GLORY BE! THE ACTUAL WRITE!
393 ISZ XBUFF /BUMP CORE POINTER
394 JMP STFLD1+1 /NOT AT END OF FIELD (DJG)
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
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
409 K77, 77 /ABOVE MAY SKIP (NOT ANYMORE DJG)
412 JMS RDQUAD /SKIP CONTROL WORDS
414 TAD K7700 /TACK 7700 ONTO CHECKSUM.
415 DCA CHKSUM /CHECKSUM ONLY LOW 6 BITS ANYWAY
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)
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
431 JMS RDQUAD /NOT NEEDED FOR WDSBLK/BLOCK
432 JMS EQUFUN /CHECKSUM IT
433 RDLP2, JMS RDQUAD /READ CHECKSUM
436 JMS GETCHK /GET SIX BIT CHECKSUM
438 C300, 300 /PROTECTION (NOT ANYMORE DJG)
440 WRQUAD, 0 /WRITE OUT A 12 BIT WORD
441 JMS EQUFUN /ADD THIS TO CHECKSUM
442 SDSQ /SKIP ON QUADLINE FLAG
444 SDLD /LOAD DATA ONTO BUS
445 CLA /SDLD DOESN'T CLEAR AC
448 RDQUAD, 0 /READ A 12 BIT WORD
455 EQUFUN, 0 /COMPUTE EQUIVALENCE CHECKSUM
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))
469 GETCHK, 0 /FORM 6 BIT CHECKSUM
477 CLA CLL CML /FORCES LINK ON AT RWCOM
493 RETRY, 7774 / RETRY UP TO 4 TIME
494 NUMBLK, 2702 / NUMBER OF BLOCKS
495 MWORDS, -WDSBLK / WORDS PER BLOCK
497 BLKFLD, 37 / 31 129 word blocks per field
498 / WRAPPING PAST END OF LAST FIELD DOESN'T WORK
500 RDSIZE, 0 / NUMBER BLOCKS PER READ
501 CBLOCK, 0 / CURRENT BLOCK TO XFER
507 BCNT, 0 / BLOCKS TO SEND TO PC
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
519 FINISH, HLT / Normal good halt
525 CLA CLL OSR / Get drive
529 CLA CLL OSR / Get max field
534 HLT / Must have at least 1 field for buffer
538 RDSZLP, TAD BLKFLD / Multiply by number of fields available
541 DCA RDSIZE / NUMBER BLOCK PER READ
549 TAD NUMBLK / MORE BLOCKS LEFT THAN READSIZE?
550 SMA / NO, READ NUMBER LEFT
551 CLA / YES, ONLY READ RDSIZE
553 SNA / ANY MORE BLOCKS?
554 JMP DONE / NO, DO FINISH STUFF
560 0010 / READ STARTING IN FIELD 1
565 TAD (377 / All blocks good
567 / Send data, each block starts with FF
568 CLA CLL / then 2 12 bit words in 3 bytes
569 DCA LOC / ERRRET DUPLICATES SOME OF THIS
572 DCA BCNT / Setup loop counter with number blocks read
574 OUTBL1, JMS OUTBLK / Send a block
576 ISZ BCNT / Send all read?
579 JMP DUMPLP / Go read next batch
582 DONE, CLA / Send FE and -checksum of all words
586 TAD CHKSM / Send checksum in two bytes, low bits first
600 JMS DTA0 / REWIND TAPE
606 TAD ERRCN2 / Leave AC with # of errors
609 /SEND GOOD BLOCKS READ WITH GOOD BLOCK FLAG
610 /THEN BAD WITH BAD BLOCK FLAG.
612 / HLT / ****** If we want to stop on error
618 TAD BLOCK /Get - number good blocks read
621 JMP FSTBAD /First block is bad, no good to send
625 OUTBL2, JMS OUTBLK /Send good blocks
629 FSTBAD, TAD (375 /NOW SEND BAD BLOCK
635 JMP DUMPLP /And read from here on
638 OUTBLK, 0 /Send a block of data out serial port
642 TAD READST /Send good/bad flag
646 TAD CHKSM / Keep checksum of all words sent
648 TAD I LOC / Send 2 words as 3 bytes
652 RTR / Shift top 4 bits to low 4
659 JMP STFLD3+1 /NOT AT END OF FIELD (DJG)
660 RDF /At end, inc to next field
664 ISZ LEN /END IF BUFFER?
682 JMP STFLD4+1 /NOT AT END OF FIELD (DJG)
690 ENDBK, TAD TEMP /SEND LAST PART OF WORD
694 PUN, 0 / Send byte out serial port
695 / PLS / Punch for testing with emulator
696 TLS2 / Send out console
700 TSF2 /Wait until character sent