A large commit.
[pdp8.git] / sw / dumprest / original / dumprx01.pal
diff --git a/sw/dumprest/original/dumprx01.pal b/sw/dumprest/original/dumprx01.pal
new file mode 100644 (file)
index 0000000..213ad7f
--- /dev/null
@@ -0,0 +1,468 @@
+/ 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
+        $