--- /dev/null
+/ RX01 DUMP
+/ This program will send a RX01 image out the console port.
+/ The format of the data sent is 0xff (0377) if no errors, or 0xfd
+/ if error followed by 1 byte track, 1 byte sector, then 128 or 256 word
+/ of data for each sector. After the last sector a 0xfe (0376) is sent
+/ with a one byte -checksum of all bytes sent.
+/ The data is read in 8 bit mode so all data on the disk is dumped.
+/
+/ The program (PC) receiving the data should be started before this program
+/
+/ To run start at 0200.
+/ SR 10-11 should be drive #
+/ Should halt at HLT at label GDHLT with number of recoverable errors
+/ At normal exit hitting cont will restart the program
+/
+/ If unrecoverable errors occur the program will halt, hit continue to
+/ send bad sector and continue.
+/ The PC program will print out the bad location
+/
+/ Program uses field 0 & 1. 1 is transmit buffer
+/
+/ It will handle single and double density disks. Will not handle quad
+/ correctly (don't have drive or information on disk organization)
+
+ LCD=6751 / Load the command reg with AC
+ XDR=6752 / Load or read the transfer register
+ STR=6753 / Skip on transfer request flag
+ SER=6754 / Skip on error flag
+ SDN=6755 / Skip on done flag
+ INTR=6756 / AC = 0 interrupt off, 1 = on
+ INIT=6757 / Initialize RX8/RX01
+
+ 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
+
+ *10
+BUFGET, 0
+BUFPUT, 0
+ *20
+ERRCNT, 7760 / Stop when err count = 0, init at startup
+DRIVE, 0 / Drive # * 20
+DRVMSK, 60 / Mask for drive bits
+INTLV, 2 / Interleave factor for read, 13 (15 octal) wont work
+ERRCN2, 0 / Total # of errors
+RDCMD,106 / 8 bit read
+EMPCMD, 102 / 8 bit empty buffer
+RDERR, 116 / 8 bit read error
+M32, -32
+M115, -115
+K0037, 37
+TRACK, 0
+SECT, 0
+SCNT, 0
+LTRACK, 0
+LSECT, 0
+CURBUF, BUFA / Address to read data into
+LSTBUF, BUFA / Address to send data from
+BUFORG, BUFA / First buffer address
+BUFSZ, 400 / Big enough to hold double density
+LOC, 0
+LOC2, 0
+TEMP, 0
+MASK1, 17
+MASK2, 360
+FF, 377
+FE, 376
+FD, 375
+CHKSUM, 0
+IDLEFG, 0
+ DECIMAL
+M128, -128
+BLKSZ, -128
+ OCTAL
+ISRAC, 0
+ISRFLG, 0
+LEN, 0
+READST, 377
+PUNF, PUN
+SENDF, SEND
+READF, READ
+FINCTRK,INCTRK
+RISR, ISR
+
+L10, 10
+L32, 32
+L400, 400
+L412, 412
+L422, 422 /20 SAYS UNIT 1, 402 FOR CONVENIENCE
+L7700, 7700
+L1734, 1734
+L4110,
+LM3670, -3670
+ZOO, 0
+DENSW, 0
+SIZE, 0
+FN, 0
+LTYPE, TYPE
+RX02, 0
+LLCD, 0 /REPLACED BY ROUTINE TO LOAD CMD REGISTER
+LLCD1, LCD1
+LLCD2, LCD2
+
+
+
+ *1
+ JMP I RISR / Interrupt handler
+
+ *2000
+BUFA, 1234
+ 4321
+
+ *200
+START, CAF
+ CLA CLL OSR / Init variables changed during run
+ RTL
+ RTL
+ AND DRVMSK
+ DCA DRIVE
+ DCA TRACK
+ DCA BUFGET
+ DCA BUFPUT
+ IAC
+ DCA SECT
+ IAC
+ DCA IDLEFG
+ DCA CHKSUM
+ TAD MASK1
+ CMA
+ DCA ERRCNT
+ DCA ERRCN2
+ TAD M32
+ DCA SCNT
+ ION / Turn on serial interrupt handler
+ CLA CLL IAC / Set bit 11 to enable interrupts
+ KIE2
+/ RPE / Testing, use PTP with emulator
+ JMS RECAL
+ JMS I LTYPE
+
+DUMP, JMS I READF / Start read operation
+DMPLP, JMS CHKRD / Wait until done and check for errors
+ CLA
+ TAD TRACK
+ DCA LTRACK
+ TAD SECT
+ DCA LSECT
+ JMS I FINCTRK / Set read loc to next sector
+ SZA
+ JMP LAST / Last, send checksum
+ CLA
+ TAD CURBUF
+ DCA LSTBUF / Save buffer data read into for dumping
+ TAD CURBUF / And setup to read into next buffer
+ TAD BUFSZ / Toggle between the two buffers
+ AND BUFSZ
+ TAD BUFORG
+ DCA CURBUF
+ JMS I READF / Start the read
+ JMS I SENDF / Send the last buffer
+ JMP DMPLP / And check read started etc
+
+RECAL, 0
+ INIT
+ SDN / Done?
+ JMP .-1
+ JMP I RECAL
+ /JMP DUMP
+BADSTA, HLT
+
+LAST, CLA / Send FE and -checksum of all words
+ TAD CURBUF
+ DCA LSTBUF
+ JMS I SENDF
+ CLA CLL
+ TAD FE
+ JMS I PUNF
+ CLA CLL
+ TAD CHKSUM
+ CIA
+ JMS I PUNF
+WAITEM, CLA
+ TAD BUFGET
+ CIA
+ TAD BUFPUT
+ SZA / No character waiting to send
+ JMP WAITEM
+ TAD ERRCN2 / Leave AC with # of errors
+GDHLT, HLT / Normal halt
+ JMP START
+
+CHKRD, 0
+ CLA CLL
+ TAD FF / Set good read flag
+ DCA READST
+ SDN / Done?
+ JMP .-1
+ CLA
+ SER / Any errors
+ SKP
+ JMP ERROR
+ CLA CLL
+ TAD CURBUF
+ DCA LOC2
+ TAD EMPCMD
+ JMS I LLCD
+ELOOP, STR
+ SKP
+ JMP EMPTY
+ SDN
+ JMP ELOOP
+ SER
+ JMP GOOD
+ JMP ERROR
+GOOD, TAD MASK1 / Reset error counter on good read
+ CMA
+ DCA ERRCNT
+ JMP I CHKRD
+EMPTY, XDR
+ DCA I LOC2
+ ISZ LOC2
+ JMP ELOOP
+
+ JMP I CHKRD / Not executed????
+
+ERROR, ISZ ERRCN2 / Inc total # of errors
+ ISZ ERRCNT / To many errors?
+ JMP RETRY
+ XDR / Yes, leave error in AC and halt
+/ HLT / ********* Put in halt to stop on errors
+ CLA
+ TAD RDERR
+ JMS I LLCD
+ SDN
+ JMP .-1
+ XDR
+/ HLT / ****** and display error code
+ JMS RECAL
+ CLA CLL
+ TAD FD / Set bad read flag
+ DCA READST
+ TAD MASK1
+ CMA
+ DCA ERRCNT
+ JMP I CHKRD
+RETRY,
+ JMS RECAL / No, recal drive and try again
+ JMP DUMP /
+
+ PAGE
+TYPE, 0
+ TAD L412 /MAKE A DOUBLE DENSITY READ STATUS CODE
+ TAD DRIVE
+ LCD
+ SDN
+ JMP .-1
+ XDR /GET STATUS WORD
+ DCA RX02
+ TAD RX02
+ AND L32 /KEEP DENSITY ERROR; DOUBLE; QUAD
+ TAD L10 /SINGLE=10;SING/DOUB=40;DOUB=20;QUAD=22
+ AND L422 /SINGLE=0;SING/DOUB=0;DOUB=20;QUAD=22
+ DCA ZOO /PLACE TYPE CODE, THREE LOC.'S AFTER ENTRY POINT
+ SER
+NORMAL, TAD ZOO /FETCH BACK TYPE CODE
+ SZA CLA /SKIP IF A SINGLE DENSITY
+ TAD L7700 /DOUBLE
+ TAD L7700 /SINGLE=7700, DOUBLE=7600
+ DCA DENSW /PLACE FOR LOOP CONTROL
+ TAD ZOO
+ CLL RTR /PUT QUAD BIT TO LINK
+ SNA CLA /SKIP IF DOUBLE OR QUAD
+ TAD L1734 /SINGLE
+ TAD L4110 /D&Q=4110, S=6044
+ SNL /SKIP ON QUAD, IT'S OK RIGHT NOW
+ CLL CML RAR /SINGLE AND DOUBLE DIVIDE BY 2
+ DCA SIZE /S=7022, D=6044, Q=4110
+ TAD DENSW /7700 IF SINGLE, 7600 IF DOUBLE
+ CLL CMA RTL /375 IF SINGLE, 775 IF DOUBLE
+ AND L400
+ TAD DRIVE /VOILA, 400*DOUBLE + 20*DRIVE
+ DCA FN /PLACE INTO FUNCTION CONTROL WORD
+ TAD SIZE
+ JMS I PUNF /SEND DENSITY
+ CLA
+ TAD ZOO /FETCH BACK TYPE CODE
+ SZA CLA /SKIP IF A SINGLE DENSITY
+ IAC /INTERLEAVE 3 FOR DOUBLE
+ IAC /INTERLEAVE 2 FOR SINGLE
+ IAC /INTERLEAVE 2 FOR SINGLE
+ DCA INTLV
+ TAD ZOO /FETCH BACK TYPE CODE
+ SZA CLA /SKIP IF A SINGLE DENSITY
+ TAD M128 /256 BYTES SECTOR DOUBLE
+ TAD M128 /128 BYTES SINGLE
+ DCA BLKSZ
+ TAD RX02
+ AND L10
+ SNA CLA
+ JMP RX01
+ TAD LLCD2
+ DCA LLCD
+ JMP I TYPE /RETURN
+RX01, TAD LLCD1
+ DCA LLCD
+ JMP I TYPE /RETURN
+
+LCD1, 0
+ TAD FN
+ LCD
+ JMP I LCD1
+
+LCD2, 0
+ TAD FN
+ DCA CMD
+ TAD CMD
+ LCD
+ CLA
+ TAD CMD
+ CLL RTL
+ RTL
+ RAL
+ STR
+ JMP .-1
+ XDR
+ CLA
+ JMP I LCD2
+CMD, 0
+
+ PAGE
+INCTRK, 0 / Increment track and exbit value for next sector
+ CLA CLL / AC non zero on return if done
+ ISZ SCNT
+ SKP
+ JMP INC2 / Sector rolled over, head, track
+ TAD SECT
+ TAD INTLV
+ DCA SECT
+ TAD SECT
+ TAD M32
+ SPA SNA
+ JMP RETINC
+ DCA SECT
+ CMA
+ TAD SECT
+ SNA
+ ISZ SECT
+RETINC, CLA
+ JMP I INCTRK
+INC2, CLA IAC
+ DCA SECT
+ TAD M32
+ DCA SCNT
+ ISZ TRACK
+ TAD TRACK
+ TAD M115
+ SZA
+ JMP RETINC
+ CLA IAC
+ JMP I INCTRK
+
+READ, 0
+ CLA CLL / Standard read from manual
+ TAD RDCMD
+ JMS I LLCD
+ STR
+ JMP .-1
+ TAD SECT
+ XDR
+ STR
+ JMP .-1
+ CLA
+ TAD TRACK
+ XDR
+ JMP I READ
+
+SEND, 0 / Move sector to transmit buffer
+ CLA CLL
+ TAD LSTBUF
+ DCA LOC
+ TAD BLKSZ
+ DCA LEN
+ CLA CLL
+ TAD READST
+ JMS PUN
+ TAD LTRACK
+ JMS PUN
+ TAD LSECT
+ JMS PUN
+OUT, CLA CLL
+ TAD I LOC
+ JMS PUN
+ ISZ LOC
+ ISZ LEN
+ JMP OUT
+ JMP I SEND
+
+PUN, 0 / Send a byte out serial port
+ DCA TEMP
+PUNLP, TAD BUFPUT / Room for another character?
+ IAC
+ CIA
+ TAD BUFGET
+ SNA
+ JMP PUNLP / No, try again
+ CLA
+ TAD TEMP
+ CDF 10
+ DCA I BUFPUT
+ TAD TEMP
+ AND FF
+ TAD CHKSUM
+ DCA CHKSUM
+ IOF
+ TAD IDLEFG
+ SNA
+ JMP PUNOK
+ CLA
+ DCA IDLEFG
+ TAD I BUFGET
+ TLS2 / Send character
+/ PLS / PTP
+PUNOK, ION
+ CLA
+ CDF 0
+ JMP I PUN
+
+ PAGE
+ISR, DCA ISRAC / Save AC
+ GTF
+ DCA ISRFLG / And flags
+ CDF 10 / Buffer in field 1
+ TSF2 / Ready to send
+/ PSF / PTP
+ JMP IRET / No, not our interrupt
+ TAD BUFGET
+ CIA
+ TAD BUFPUT
+ SNA / No character waiting to send
+ JMP IEMPTY
+ CLA
+ TAD I BUFGET
+ TLS2 / Send character
+/ PLS / PTP
+IRET, CLA
+ TAD ISRFLG
+ RTF
+ CLA
+ TAD ISRAC
+ JMP I 0
+IEMPTY, CLA IAC
+ DCA IDLEFG
+ TCF2 / Clear interrupt
+/ PCF / PTP
+ JMP IRET
+ $