File: DMPTD8.PA of Disk: Disks/Build-2007/Copy-of-Build-11-03-07
(Source file text)
/TD8E Dectape DUMP Program
/
/ This program will send a Dectape image out the console port.
/ The format of the data sent is 0xff (0377) or 0xfd if read error
/ followed by 128 word of data for each block.
/ After the last block a 0xfe (0376) is sent
/ with a two byte checksum, low 8 bits first then upper 4.
/ The words in a block are sent as three bytes for each 2 words.
/ Like this: (WvdM)
/ +--------------------+
/ ! byte1 ! byte2h !
/ +--------------------+
/ ! byte2l ! byte 3 !
/ +--------------------+
/
/ 1 = low 8 bits first word (was like this WvdM)
/ 2 = upper 4 bits first and lower 4 bits second
/ 3 = upper 8 bits second word
/
/ The program (PC) receiving the data should be started before this program
/
/ To run start at 0200.
/ SR 11 should be drive, only 0 and 1 supported without reassembling
/ SR 6-8 should be maximum memory field in computer, needs 8k minimum
/ The receiving program should be running first.
/ At normal exit hitting cont will restart the program
/
/ Should halt at label finish (140) with number of recoverable errors in AC
/ The current block being read will be displayed in the AC
/ while running.
/
/ If a unrecoverable error occurs the program will halt with the error in
/ the AC. Hit continue to dump more or comment out hlt, search for *****.
/ The PC program will print out the bad location if an error occurs
/
/ We will retry each read up to 16 times on error
/
/ This transfers the standard 129 word by 1474 blocks used by OS/8 etc.
/ Other formats can be handled by changing constants below
INAD=030 / Address of serial input, 30 for console
KCF2=6000 INAD
KSF2=6001 INAD
KCC2=6002 INAD
KRS2=6004 INAD
KIE2=6005 INAD
KRB2=6006 INAD
OUTAD=040 / Address of serial output, 40 for console
TFL2=6000 OUTAD
TSF2=6001 OUTAD
TCF2=6002 OUTAD
TPC2=6004 OUTAD
TSK2=6005 OUTAD
TLS2=6006 OUTAD
/2 TD8E INITIALIZER PROGRAM, V7A
/
/COPYRIGHT (C) 1975, 1977
/DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.
/
/
/ABSTRACT--
/ THE ROUTINE DESCRIBED AND LISTED HERE IS A GENERAL
/DATA HANDLER FOR THE TD8E DECTAPE SYSTEM. THE ROUTINE
/CONTAINS SEARCH, READ, AND WRITE FUNCTIONS IN A FORMAT
/WHICH IS COMPATIBLE WITH OS/8 DEVICE HANDLER CALLING
/SEQUENCES.
/THIS ROUTINE CAN BE RE-EDITED AND ASSEMBLED TO PRODUCE
/VARIATIONS ON THE BASIC TD8E SYSTEM. ASSEMBLY PARAMETERS
/CONTROL:
/A) WHAT DRIVES (UNITS 0-7) WILL BE USED
/B) THE ORIGIN OF THE TWO PAGE ROUTINE
/C) WHAT MEMORY FIELD THE ROUTINE WILL RUN IN
/D) THE SIZE OF THE DECTAPE BLOCK TO BE READ/WRITTEN
/FOLLOWING ARE THE PARAMETERS SET UP FOR THE STANDARD
/DEC VERSION OF THIS ROUTINE:
DRIVE=10 /UNITS 0 AND 1 SELECTED
ORIGIN=600 /ENTER AT ORIGIN, ORIGIN+4
AFIELD=0 /INITIAL FIELD SETTING
MFIELD=00 /AFIELD*10=MFIELD
WDSBLK=201 /129 WORDS PER BLOCK
/THE USE OF THE PARAMETERS IS AS FOLLOWS:
/ DRIVE: DRIVE DETERMINES WHICH UNITS WILL BE SELECTED
/ DRIVE=10 IMPLIES UNITS 0 &1
/ DRIVE=20 IMPLIES UNITS 2&3
/ DRIVE=30 IMPLIES UNITS 4&5
/ DRIVE=40 IMPLIES UNITS 6&7
/ORIGIN: ALTERING ORIGIN CAUSES ASSEMBLY IN A DIFFERENT
/ MEMORY LOCATION. WHEN CHANGING ORIGIN KEEP IN MIND
/THAT THIS IS A TWO PAGE ROUTINE.
/AFIELD: AFIELD DETERMINES THE INITIAL FIELD SETTING FOR THE
/ LOADER. PERMISSIBLE VALUES FOR AFIELD ARE 0 TO 7.
/MFIELD: MFIELD IS USED IN A CIF CDF MFIELD INSTRUCTION.
/ THE VALUE INSERTED FOR MFIELD SHOULD BE 10(8) TIMES
/ THE VALUE FOR AFIELD. THE PERMISSIBLE VALUES ARE 00-70.
/WDSBLK: WDSBLK GOVERNS HOW MANY WORDS THE ROUTINE THINKS ARE
/ IN A DECTAPE BLOCK. THE STANDARD VALUE IS 201(8) OR
/ 129 DECIMAL. NOTE THAT THE FUNCTION WORD BIT 10 CAN
/ BE USED TO SUBTRACT ONE FROM WDSBLK. THE VALUE USED
/ FOR WDSBLK SHOULD BE THE NUMBER OF WORDS THE TAPE WAS
/ FORMATTED TO CONTAIN.
/IF WE WANT A HANDLER FOR UNITS 2&3 TO RESIDE IN
/FIELD 2 AT LOCATION 3000 AND READ/WRITE 256(10) WORDS
/PER BLOCK, THE PARAMETERS WOULD BE:
/ DRIVE=20
/ ORIGIN=3000
/ AFIELD=2
/ MFIELD=20
/ WDSBLK=400
/
/THE CALL TO THE SUBROUTINE FOLLOWS BASICALLY THE
/CALLING SEQUENCE FOR OS/8 DEVICE HANDLERS.
/THE CALLING SEQUENCE IS:
/ CDF CURRENT
/ CIF MFIELD /MFIELD=FIELD ASSEMBLED IN
/ JMS ENTRY /AC ON ENTRY=4000 IS UNIT 1
/ ARG1A
/ ARG1B (DJG)
/ ARG2
/ ARG3
/ ERROR RETURN
/ NORMAL RETURN
/THE ARGUMENTS ARE:
/ARG1A: FUNCTION WORD BIT0: 0=READ, 1=WRITE
/ BITS 1-5: UNUSED, WAS # BLOCKS IN OPERATION (DJG)
/ BITS 6-8: FIELD OF BUFFER AREA
/ BIT 9: UNUSED
/ BIT 10: # OF WORDS/BLOCK.
/ 0= WDSBLK, 1=WDSBLK-1
/ BIT 11: 1=START FORWARD, 0=REVERSE
/ARG1B: # OF BLOCKS IN OPERATION (DJG)
/ARG2: BUFFER ADDRESS FOR OPERATION
/ARG3: STARTING BLOCK FOR OPERATION
/ERRORS: THE HANDLER DETECTS TWO TYPES OF ERRORS:
/A) FATAL ERRORS- PARITY ERROR, TIMING ERROR,
/ TOO GREAT A BLOCK NUMBER
/ FATAL ERRORS TAKE ERROR RETURN WITH THE
/ AC=4000.
/B) NON-FATAL- SELECT ERROR.
/ IF NO PROPER UNIT IS SELECTED, THE ERROR
/ RETURN IS TAKEN WITH CLEAR AC.
/FATAL ERRORS TRY THREE TIMES BEFORE TAKING ERROR RETURN.
/THE NORMAL RETURN IS TAKEN AFTER ALL INDICATED
/BLOCKS HAVE BEEN TRANSFERRED. THE AC IS CLEAR.
/THE TD8E IOT'S ARE:
SDSS=7001-DRIVE /SKIP ON SINGLE LINE FLAG
SDST=7002-DRIVE /SKIP ON TIMING ERROR
SDSQ=7003-DRIVE /SKIP ON QUAD LINE FLAG
SDLC=7004-DRIVE /LOAD COMMAND REGISTER
SDLD=7005-DRIVE /LOAD DATA REGISTER
SDRC=7006-DRIVE /READ COMMAND REGISTER
SDRD=7007-DRIVE /READ DATA REGISTER
/THE IOT'S IN GENERAL ARE 677X,676X,675X,AND 674X.
/THE OTHERS CONTROL UNITS 2-7.
/ THIS HANDLER USES DECTAPE BLOCKS NOT OS/8 BLOCKS !
*ORIGIN
/ MODIFIED SO BIT 0 ON ENTRY IS UNIT 1
DTA0, 0
DCA UNIT /SAVE UNIT POSITION
RDF
TAD C6203 /GET DATA FIELD AND SETUP RETURN
DCA LEAVE
TAD I DTA0 /GET FUNCTION WORD
SDLD /PUT FUNCTION INTO DATA REGISTER
CLL RTR /AC STILL HAS FUNCTION. PUT # WORDS PER
/BLOCK INTO LINK
SZL CLA /KNOCK ONE OFF WDSBLK?
IAC /YES
TAD MWORDS
DCA WCT /STORE MASTER WORD COUNT
ISZ DTA0 /TO BLOCK COUNT (DJG)
TAD I DTA0 / (DJG)
CIA / (DJG)
DCA PGCT / (DJG)
ISZ DTA0 /TO BUFFER
TAD I DTA0
DCA BUFF /SAVE ADDRESS (DJG)
ISZ DTA0 /TO BLOCK NUMBER
TAD I DTA0
DCA BLOCK /INITIAL BLOCK
ISZ DTA0 /POINT TO ERROR EXIT
CIF CDF MFIELD /TO ROUTINES DATA FIELD
SDRD
AND C70 /GET FIELD FOR XFER
TAD C6201 /FORM CDF N
DCA XFIELD /IF=0 AND DF=N AT XFER.
TAD UNIT /TEST FOR SELECT ERROR
SDLC
CLA /WAIT FOR SLOW SELECT
TAD RETRY
DCA TRYCNT /3 ERROR TRIES
SDRC
AND C100
SZA CLA
JMP FATAL-1
SDRD /PUT FUNCT INTO PG 0
DCA FUNCT
SDRD /GET INITIAL MOTION BIT TO LINK
CLL RAR
XFIELD, HLT /SET DATA FIELD FOR NEXT PAGE
JMP GO /AND START THE MOTION.
RWCOM, SDST /ANY CHECKSUM ERRORS?
SZA /OR CHECKSUM ERRORS?
JMP TRY3 /PLEASE NOTE THAT THE LINK IS ALWAYS
/SET AT RWCOM. GETCHK SETS IT.
DCA CHKFTL /CLEAR LAST CHECKSUM ERROR
ISZ PGCT /ALL REQUESTED PAGES DONE?
SKP / (DJG)
JMP EXIT /ALL DONE. GET OUT
ISZ BLOCK /NEXT BLOCK TO XFER
CLL CML /FORCES MOTION FORWARD
GO, CLA CML RTR /LINK BECOMES MOTION BIT
TAD C1000
TAD UNIT /PUT IN 'GO' AND UNIT #
SDLC /LOOK FOR BLOCK NO.
CLA
TAD BUFF
DCA OLDBUF /SAVE BUFFER ADDR FOR ERROR RETRY
RDF
TAD C6201
DCA OLDFLD
JMS RDQUAD /WAIT AT LEAST 6 LINES TO LOOK
JMS RDQUAD
SRCH, SDSS
JMP .-1 /WAIT FOR SINGLE LINE FLAG
SDRC
CLL RTL /DIRECTION TO LINK. INFO BITS ARE SHIFTED.
AND C374 /ISOLATE MARK TRACK BITS
TAD M110 /IS IT END ZONE?
SNA /THE LINK STAYS SAME THRU THIS
JMP ENDZ
TAD M20 /CHECK FOR BLOCK MARK
SZA CLA
JMP SRCH
SDRD /GET THE BLOCK NUMBER
SZL /IF WE ARE IN REVERSE, LOOK FOR 10
/BLOCKS BEFORE TARGET BLOCK. THIS
/ALLOWS TURNAROUND AND UP TO SPEED.
TAD C10 /REVERSE
CMA
TAD BLOCK
CMA /IS IT RIGHT BLOCK?
SNA
JMP FOUND /YES..HOORAY!
M110, SZL SNA CLA /NO, BUT ARE WE HEADED FOR IT?
JMP SRCH /YES
ENDZ, SDRC /WE ARE IN THE END ZONE
CLL RTL /DIRECTION TO LINK
CLA /ARE WE IN REVERSE?
JMP GO /YES..TURN US AROUND
FOUND, SZL CLA /RIGHT BLOCK. HOW ABOUT DIRECTION?
JMP GO /WRONG..TURN AROUND
JMP I CXGO /OK GO READ/WRITE
TRY3, BSW
DCA CHKFTL /KEEP LAST CHECKSUM ERROR
OLDFLD, NOP
TAD OLDBUF
DCA BUFF
ISZ TRYCNT
JMP GO /TRY 3 TIMES
JMP FATAL /LINK OFF MEANS AC=4000 ON RETURN
EXIT, ISZ DTA0
CLL CML /AC=0 ON NORMAL RETURN
FATAL, TAD UNIT
SDLC /STOP THE UNIT
CLA CML RAR
TAD CHKFTL
LEAVE, HLT /GETS CIF CDF RETURN
JMP I DTA0
RDQUAD, 0 /READ A 12 BIT WORD
SDSQ
JMP .-1
SDRD /READ DATA
JMP I RDQUAD
/CRDQUD, RDQUAD
CXGO, GOON /HERE WE REALLY GO
PGCT, 0 /TOTAL PAGES TO TRANSFER
TRYCNT, -3 /COUNTER FOR TRIES
*ORIGIN+200
GOON, CIF MFIELD
SDRC
SDLC
REVGRD, SDSS
JMP .-1 /LOOK FOR REVERSE GUARD
SDRC
AND K77
TAD M32 /IS IT REVERSE GUARD?
SZA CLA
JMP REVGRD /NO.KEEP LOOKING
TAD WCT
DCA WORDS /WORD COUNTER
TAD FUNCT /GET FUNCTION READ OR WRITE
K7700, SMA CLA
JMP READ /NEG. IS WRITE
WRITE, SDRC
AND C300 /CHECK FOR WRITE LOCK AND SELECT ERROR
CLL CML /LOCK OUT AND SELECT ARE AC 0 ERRORS
SZA CLA
JMP I CFATAL /FATAL ERROR. LINK MUST BE ON
JMS I XQUAD /NO ONE EVER USES THIS WORD!
C7600, 7600
TAD C1400
TAD UNIT /INITIATE WRITE MODE
SDLC
CLA CMA
JMS WRQUAD /PUT 77 IN REVERSE CHECKSUM
CLA CMA
DCA CHKSUM
WRLP, TAD I BUFF /GLORY BE! THE ACTUAL WRITE!
JMS WRQUAD
ISZ BUFF /BUMP CORE POINTER
TAD BUFF
TAD C200
SZA CLA /ARE WE AT OS/8 BOUNDARY?
JMP STFLD1+1 /NOT AT END OF FIELD (DJG)
DCA BUFF /OK, TO NEXT FIELD
RDF
TAD C6211
DCA STFLD1
STFLD1, NOP
ISZ WORDS /DONE THIS BLOCK?
JMP WRLP /NOT YET..LOOP A WHILE
TAD FUNCT /IS THE OPERATION FOR WDSBLK PER BLOCK?
CLL RTR /IF NO, WRITE A 0 WORD
SZL CLA
JMS WRQUAD /WRITE A WORD OF 0
JMS GETCHK /DO THE CHECK SUM
JMS WRQUAD /WRITE FORWARD CHECKSUM
JMS WRQUAD /ALLOW CHECKSUM TO BE WRITTEN
JMP I CRWCOM
K77, 77 /ABOVE MAY SKIP (NOT ANYMORE DJG)
READ, JMS I XQUAD
JMS I XQUAD
JMS I XQUAD /SKIP CONTROL WORDS
AND K77
TAD K7700 /TACK 7700 ONTO CHECKSUM.
DCA CHKSUM /CHECKSUM ONLY LOW 6 BITS ANYWAY
RDLP, JMS I XQUAD
JMS EQUFUN /COMPUT CHECKSUM AS WE GO
DCA I BUFF /IT GETS CONDENSED LATER
TAD I BUFF /CHECK FOR MEMORY ERRORS
TAD EQUTMP
IAC
SZA CLA
JMP MEMERR
ISZ BUFF /AT END OF FIELD?
TAD BUFF
TAD C200
SZA CLA /ARE WE AT OS/8 BOUNDARY?
JMP STFLD2+1 /NOT AT END OF FIELD (DJG)
DCA BUFF /OK, TO NEXT FIELD
RDF
TAD C6211
DCA STFLD2
STFLD2, NOP
ISZ WORDS /DONE THIS OP?
JMP RDLP /NO SUCH LUCK
TAD FUNCT /IF OP WAS FOR WDSBLK-1, READ AND
CLL RTR /CHECKSUM THE LAST TAPE WORD
SNL CLA
JMP RDLP2
JMS I XQUAD /NOT NEEDED FOR WDSBLK/BLOCK
JMS EQUFUN /CHECKSUM IT
RDLP2, JMS I XQUAD /READ CHECKSUM
AND K7700
JMS EQUFUN
JMS GETCHK /GET SIX BIT CHECKSUM
JMP I CRWCOM
WRQUAD, 0 /WRITE OUT A 12 BIT WORD
JMS EQUFUN /ADD THIS TO CHECKSUM
SDSQ /SKIP ON QUADLINE FLAG
JMP .-1
SDLD /LOAD DATA ONTO BUS
CLA /SDLD DOESN'T CLEAR AC
JMP I WRQUAD
EQUFUN, 0 /COMPUTE EQUIVALENCE CHECKSUM
CMA
DCA EQUTMP /ACTUALLY CHECKSUMS ON DECTAPE ARE
TAD EQUTMP /EQUIVALENCE OF ALL WORDS IN A RECORD
AND CHKSUM /SIX BITS AT A TIME. BUT SINCE EQUIVALENCE
CIA /IS ASSOCIATIVE, WE CAN DO IT 12
CLL RAL /BITS AT A TIME AND CONDENSE LATER.
TAD EQUTMP /THIS ROUTINE USES THESE IDENTITIES:
TAD CHKSUM /A+B=(A.XOR.B)+2*(A.AND.B)
DCA CHKSUM /A.EQU.B=.NOT.(A.XOR.B)=A.XOR.(.NOT.B)
TAD EQUTMP /A.EQU.B=(A+(.NOT.B))-2*(A.AND.(.NOT.B))
CMA
JMP I EQUFUN
GETCHK, 0 /FORM 6 BIT CHECKSUM
CLA
TAD CHKSUM
CMA
CLL RTL
RTL
RTL
JMS EQUFUN
CLA CLL CML /FORCES LINK ON AT RWCOM
TAD CHKSUM
AND K7700
JMP I GETCHK
XQUAD, RDQUAD
CFATAL, FATAL
CRWCOM, RWCOM /BLOCK DONE, BACK TO FIRST PAGE
WORDS, 0
*100
RETRY, 7775 /RETRY UP TO 3 TIMES
NUMBLK, 2702 /TOTAL NUMBER OF BLOCKS ON DECTAPE
MWORDS, -WDSBLK /WORDS PER BLOCK FOR SETUP
BLKFLD, 36 /30 129 WORD BLOCKS PRESERVES OS78
/WRAPPING PAST END OF LAST FIELD DOESN'T WORK
DRVSEL, 0 /SELECTED DRIVE
FIELDS, 0 /MINUS NUMBER OF FIELDS TO USE
ERRCN2, 0 /COUNTING ERRORS
RDSIZE, 0 /NUMBER BLOCKS PER READ
CBLOCK, 0 /CURRENT DECTAPE BLOCK TO XFER
CHKSM, 0
READST, 0
LOC, 0
LEN, 0
BCNT, 0 /BLOCKS TO SEND TO PC
REASON, 0
TEMP, 0
C10, 10
C17, 17
C70, 70
C100, 100
C200, 200
C300, 300
C360, 360
C1000, 1000
C1400, 1400
C6201, 6201
C6203, 6203
C6211, 6211
M20, -20
M32, -32
OLDBUF, 0 /USED BY DTA0 ROUTINE - RETRY BUFFER
BUFF, 0 /USED BY DTA0 ROUTINE
C374, 374 /USED BY DTA0 ROUTINE
BLOCK, 0 /USED BY DTA0 ROUTINE
WCT, 0 /USED BY DTA0 ROUTINE - MASTER WORDCOUNT
FUNCT, 0 /USED BY DTA0 ROUTINE - FUNCTION
EQUTMP, 0 /USED BY DTA0 ROUTINE
CHKSUM, 0 /USED BY DTA0 ROUTINE
UNIT, 0 /USED BY DTA0 ROUTINE
CHKFTL, 0 /USED BY DTA0 ROUTINE
*176
MEMERR, RDF /SIGNAL MEMORY ERROR!!!
FINISH, HLT /NORMAL GOOD HALT OR SELERR
START, CDF 0
CAF
CLA CLL OSR /GET DRIVE
AND (1
RTR
DCA DRVSEL
CLA CLL OSR /GET MAX FIELD TO USE
RTR
RAR
AND (7
SNA
HLT /MUST HAVE AT LEAST 1 FIELD FOR BUFFER
CIA
DCA FIELDS
DCA ERRCN2
RDSZLP, TAD BLKFLD /MULTIPLY BY NUMER OF FIELDS AVAILABLE
ISZ FIELDS
JMP RDSZLP
DCA RDSIZE /TOTAL NUMBER OF BLOCKS IN ONE GO = BATCH
DCA CBLOCK /START WITH BLOCK 0
DCA CHKSM
DUMPLP, CLA
TAD RDSIZE
TAD CBLOCK /(TOTAL - BATCH) - CURRENT
CIA
TAD NUMBLK /MORE BLOCKS LEFT THAN BATCH?
SMA /NO, NUMBER OF BLOCKS LEFT
CLA /YES, ONLY BATCH SIZE
TAD RDSIZE
SNA /ANY MORE BLOCKS?
JMP DONE /NO, DO FINISH STUFF
DCA ARGSZ /TO NUMBER OF BLOCKS REQUEST
TAD CBLOCK /TO CURRENT BLOCK TO START WITH
DCA ARGBK
TAD DRVSEL
JMS I (DTA0
0010 /READ STARTING IN FIELD 1
ARGSZ, 0
0
ARGBK, 0
JMP ERRRET /SOME DUST ON THE TAPE?
TAD (377 /ALL BLOCKS GOOD
DCA READST
/Send data, each block starts with FF
CLA CLL / then 2 12 bit words in 3 bytes
DCA LOC / ERRRET DUPLICATES SOME OF THIS
TAD ARGSZ
CIA
DCA BCNT /SET UP COUNTER OF NUMBER OF BLOCKS XFERRED
CDF 10 /START IN FIELD 1
OUTBL1, JMS I (OUTBLK /SEND A BLOCK
ISZ CBLOCK /NEXT BLOCK
ISZ BCNT /BATCH XFERRED?
JMP OUTBL1 /NO
CDF 0
JMP DUMPLP /GO READ NEXT BATCH
DONE, CLA / Send FE and -checksum of all words
TAD (376
JMS I (PUN
TAD CHKSM / Send checksum in two bytes, low bits first
CIA
JMS I (PUN
TAD CHKSM
CIA
RTR
RTR
RTR
RTR
AND C17
JMS I (PUN
TAD DRVSEL
JMS I (DTA0 / REWIND TAPE
0010
1
0
0
NOP
TAD ERRCN2 / Leave AC with # of errors
JMP FINISH
ERRRET, SZA
JMP NOSEL
CLA CMA
JMP FINISH /SELECT ERROR WITH AC = 7777
NOSEL, DCA REASON /ERROR CODE
CDF 10 /SEND GOOD BLOCKS READ WITH GOOD BLOCK FLAG
DCA LOC
TAD CBLOCK
CIA
TAD BLOCK /Get - number good blocks read
CIA /Last was bad
SNA
JMP FSTBAD /First block is bad, no good to send
DCA BCNT
TAD (377
DCA READST
OUTBL2, JMS I (OUTBLK /Send good blocks
ISZ CBLOCK
ISZ BCNT
JMP OUTBL2
FSTBAD, TAD REASON
RAL
SZA CLA /WAS IT CHECKSUM ERROR?
CLA CMA /SEND 374 FOR CHECKSUM ERROR
TAD (375 /NOW SEND BAD BLOCK (TIMING ERROR)
DCA READST
JMS I (OUTBLK
ISZ CBLOCK
ISZ ERRCN2
CDF 0
JMP DUMPLP /And read from here on
PAGE
OUTBLK, 0 /Send a block of data out serial port
CLA
TAD WCT
DCA LEN /COUNT FOR ONE BLOCK
TAD READST /Send good/bad flag
JMS PUN
OUT, CLA CLL
TAD I LOC
TAD CHKSM / Keep checksum of all words sent
DCA CHKSM
TAD I LOC / Send 2 words as 3 bytes
CLL RTR / WvdM: Left 8 Bits first
RTR / WvdM:
JMS PUN
CLA CLL
TAD I LOC
AND C17
CLL RTL / WvdM: Low 4 Bits to high byte 2
RTL / WvdM
DCA TEMP
ISZ LOC
TAD LOC
TAD C200
SZA CLA /ARE WE AT OS/8 BOUNDARY?
JMP STFLD3+1 /NOT AT END OF FIELD (DJG)
DCA LOC /OK, TO NEXT FIELD
RDF /
TAD (6211 /BUILD CDF
DCA STFLD3
STFLD3, NOP
ISZ LEN /END IF BUFFER?
SKP /NO
JMP ENDBK /YES
TAD I LOC
TAD CHKSM
DCA CHKSM
TAD I LOC
CLL RTL
RTL
RAL / New: High 4 bits to low byte 2
AND C17 / (WvdM) was AND C360
TAD TEMP
JMS PUN
CLA CLL
TAD I LOC
JMS PUN
ISZ LOC
TAD LOC
TAD C200
SZA CLA /ARE WE AT OS/8 BOUNDARY?
JMP STFLD4+1 /NOT AT END OF FIELD (DJG)
DCA LOC /OK, TO NEXT FIELD
RDF
TAD (6211 /BUILD CDF
DCA STFLD4
STFLD4, NOP
ISZ LEN
JMP OUT
JMP I OUTBLK
ENDBK, TAD TEMP /SEND LAST PART OF WORD
JMS PUN
JMP I OUTBLK
PUN, 0 / Send byte out serial port
PLS / Punch for testing with emulator
/ TLS2 / Send out console
CLA CLL
TAD CBLOCK
PSF
/ TSF2 /Wait until character sent
JMP .-1
CLA
JMP I PUN
$