]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] improve NCR53c710 SCSI driver
authorRolf Eike Beer <eike@bilbo.math.uni-mannheim.de>
Fri, 11 Oct 2002 12:48:52 +0000 (05:48 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Fri, 11 Oct 2002 12:48:52 +0000 (05:48 -0700)
drivers/scsi/sim710.c
drivers/scsi/sim710.h
drivers/scsi/sim710.scr
drivers/scsi/sim710_d.h_shipped

index 84723470e17de6daa52bd55dd01e5465cd213a41..e2d99f359f0da58563cca70e09c0d191029546f3 100644 (file)
@@ -18,6 +18,9 @@
  *----------------------------------------------------------------------------
  *
  * MCA card detection code by Trent McNair.
+ * Fixes to not explicitly nul bss data from Xavier Bestel.
+ * Some multiboard fixes from Rolf Eike Beer.
+ * Auto probing of EISA config space from Trevor Hemsley.
  *
  * Various bits of code in this driver have been copied from 53c7,8xx,c,
  * which is coyright Drew Eckhardt.  The scripts for the SCSI chip are
  * and insmod parameters similar to
  *     sim710="addr:0x9000 irq:15"
  *
+ * Multiple controllers can also be set up by command line, provided the
+ * addr: parameter is specified first for each controller.  e.g.
+ *      sim710="addr:0x9000 irq:15 addr:0x8000 irq:14"
+ *
+ * To seperate the different options, ' ', '+', and ',' can be used, except
+ * that ',' can not be used in module parameters.  ' ' can be a pain, because
+ * it needs to be quoted, which causes problems with some installers.
+ * The command line above is completely equivalent to
+ *      sim710="addr:0x9000+irq:15+addr:0x8000+irq:14"
+ *
  * The complete list of options are:
  *
  * addr:0x9000         Specifies the base I/O port (or address) of the 53C710.
  * ignore:0x0a         Makes the driver ignore SCSI IDs 0 and 2.
  * nodisc:0x70         Prevents disconnects from IDs 6, 5 and 4.
  * noneg:0x10          Prevents SDTR negotiation on ID 4.
+ * disabled:1          Completely disables the driver. When present, overrides
+ *                     all other options.
+ *
+ * The driver will auto-probe chip addresses and IRQs now, so typically no
+ * parameters are needed.  Auto-probing of addresses is disabled if any addr:
+ * parameters are specified.
  *
  * Current limitations:
  *
  * o  Async only
  * o  Severely lacking in error recovery
- * o  Auto detection of IRQs and chip addresses only on MCA architectures
+ * o  'debug:' should be per host really.
  *
  */
 
 #include <linux/proc_fs.h>
 #include <linux/init.h>
 #include <linux/mca.h>
+#include <linux/interrupt.h>
 #include <asm/dma.h>
 #include <asm/system.h>
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,17)
 #include <linux/spinlock.h>
-#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,1,93)
-#include <asm/spinlock.h>
-#endif
 #include <asm/io.h>
 #include <asm/pgtable.h>
 #include <asm/byteorder.h>
 #include <linux/blk.h>
 
-#ifdef CONFIG_TP34V_SCSI
-
-#include <asm/tp34vhw.h>
-#define MEM_MAPPED
-
-#elif defined(CONFIG_MCA)
-
+/* All targets are I/O mapped at the moment */
 #define IO_MAPPED
 
+#if defined(CONFIG_MCA)
+
 /*
  * For each known microchannel card using the 53c710 we need a list
  * of possible IRQ and IO settings, as well as their corresponding
 
 #define MCA_004F_IRQS { 5, 9, 14 }
 
-#else
-
-/* Assume an Intel platform */
-
-#define IO_MAPPED
-
 #endif
 
 #include "scsi.h"
 
 #ifdef DEBUG
 #define DEB(m,x) if (sim710_debug & m) x
-int sim710_debug = 0;
+int sim710_debug;
 #else
 #define DEB(m,x)
 #endif
@@ -178,7 +184,7 @@ int sim710_debug = 0;
 #define STATE_BUSY             3
 #define STATE_DISABLED         4
 
-#define MAXBOARDS 2    /* Increase this and the sizes of the
+#define MAXBOARDS 4    /* Increase this and the sizes of the
                           arrays below, if you need more.. */
 
 #ifdef MODULE
@@ -193,44 +199,15 @@ MODULE_PARM(sim710, "s");
 
 #endif
 
-static int sim710_errors = 0;  /* Count of error interrupts */
-static int sim710_intrs = 0;   /* Count of all interrupts */
-static int ignore_ids = 0;     /* Accept all SCSI IDs */
-static int opt_nodisc = 0;     /* Allow disconnect on all IDs */
-static int opt_noneg = 0;      /* Allow SDTR negotiation on all IDs */
-
-#ifdef CONFIG_TP34V_SCSI
-
-/* Special hardwired case for Tadpole TP34V at the moment, otherwise
- * boot parameters 'sim710=addr:0x8000,irq:15' (for example) must be given.
- */
-
-static int no_of_boards = 2;
-
-static unsigned int bases[MAXBOARDS] = {
-       TP34V_SCSI0_BASE, TP34V_SCSI1_BASE
-};
-static unsigned int irq_vectors[MAXBOARDS] = {
-       TP34V_SCSI0_VECTOR, TP34V_SCSI1_VECTOR
-};
-static unsigned int irq_index[MAXBOARDS] = {
-       TP34V_SCSI0_IRQ_INDEX, TP34V_SCSI1_IRQ_INDEX
-};
-
-#else
-
-/* All other cases use boot/module params, or auto-detect */
-
-static int no_of_boards = 0;
-
-static unsigned int bases[MAXBOARDS] = {
-       0
-};
-static unsigned int irq_vectors[MAXBOARDS] = {
-       0
-};
-
-#endif
+static int sim710_errors;              /* Count of error interrupts */
+static int sim710_intrs;               /* Count of all interrupts */
+static int ignore_ids[MAXBOARDS];      /* Accept all SCSI IDs */
+static int opt_nodisc[MAXBOARDS];      /* Allow disconnect on all IDs */
+static int opt_noneg[MAXBOARDS];       /* Allow SDTR negotiation on all IDs */
+static int hostdata_order;             /* Encoded size of hostdata for free_pages() */
+static int no_of_boards;               /* Actual number of boards/chips */
+static unsigned int bases[MAXBOARDS];  /* Base addresses of chips */
+static unsigned int irq_vectors[MAXBOARDS]; /* IRQ vectors used by chips */
 
 /* The SCSI Script!!! */
 
@@ -249,7 +226,6 @@ static unsigned int irq_vectors[MAXBOARDS] = {
 
 #define MAX_SG         128     /* Scatter/Gather elements */
 
-
 #define MAX_MSGOUT     8
 #define MAX_MSGIN      8
 #define MAX_CMND       12
@@ -263,6 +239,9 @@ struct sim710_hostdata{
     u8 negotiate;
     u8 reselected_identify;
     u8 msgin_buf[MAX_MSGIN];
+    u8 msg_reject;
+    u32 test1_src __attribute__ ((aligned (4)));
+    u32 test1_dst;
 
     struct sim710_target {
        Scsi_Cmnd *cur_cmd;
@@ -294,82 +273,127 @@ static int full_reset(struct Scsi_Host * host);
 
 
 /*
- * Function: int param_setup(char *str)
+ * Function : static void ncr_dump (struct Scsi_Host *host)
+ *
+ * Purpose :  Dump (possibly) useful info
+ *
+ * Inputs : host - pointer to this host adapter's structure
  */
 
-#ifdef MODULE
-#define ARG_SEP ' '
-#else
-#define ARG_SEP ','
-#endif
+static void
+ncr_dump (struct Scsi_Host *host)
+{
+    unsigned long flags;
+    struct sim710_hostdata *hostdata = (struct sim710_hostdata *)
+       host->hostdata[0];
 
-static int
+    save_flags(flags);
+    cli();
+    printk("scsi%d: Chip register contents:\n", host->host_no);
+    printk(" (script at virt %p, bus %lx)\n",
+           hostdata->script, virt_to_bus(hostdata->script));
+    printk(" 00  sien:  %02x  sdid:  %02x  scntl1:%02x  scntl0:%02x\n"
+          " 04  socl:  %02x  sodl:  %02x  sxfer: %02x  scid:  %02x\n"
+          " 08  sbcl:  %02x  sbdl:  %02x  sidl:  %02x  sfbr:  %02x\n"
+          " 0C  sstat2:%02x  sstat1:%02x  sstat0:%02x  dstat: %02x\n"
+          " 10  dsa:   %08x\n"
+          " 14  ctest3:%02x  ctest2:%02x  ctest1:%02x  ctest0:%02x\n"
+          " 18  ctest7:%02x  ctest6:%02x  ctest5:%02x  ctest4:%02x\n"
+          " 1C  temp:  %08x\n"
+          " 20  lcrc:  %02x  ctest8:%02x  istat: %02x  dfifo: %02x\n"
+          " 24  dbc:   %08x  dnad:  %08x  dsp:   %08x\n"
+          " 30  dsps:  %08x  scratch:%08x\n"
+          " 38  dcntl: %02x  dwt:   %02x  dien:  %02x  dmode: %02x\n"
+          " 3C  adder: %08x\n",
+         NCR_read8(SIEN_REG), NCR_read8(SDID_REG), NCR_read8(SCNTL1_REG),
+         NCR_read8(SCNTL0_REG), NCR_read8(SOCL_REG), NCR_read8(SODL_REG),
+         NCR_read8(SXFER_REG), NCR_read8(SCID_REG), NCR_read8(SBCL_REG),
+         NCR_read8(SBDL_REG), NCR_read8(SIDL_REG), NCR_read8(SFBR_REG),
+         NCR_read8(SSTAT2_REG), NCR_read8(SSTAT1_REG), NCR_read8(SSTAT0_REG),
+         NCR_read8(DSTAT_REG), NCR_read32(DSA_REG), NCR_read8(CTEST3_REG),
+         NCR_read8(CTEST2_REG), NCR_read8(CTEST1_REG), NCR_read8(CTEST0_REG),
+         NCR_read8(CTEST7_REG), NCR_read8(CTEST6_REG), NCR_read8(CTEST5_REG),
+         NCR_read8(CTEST4_REG), NCR_read8(TEMP_REG), NCR_read8(LCRC_REG),
+         NCR_read8(CTEST8_REG), NCR_read8(ISTAT_REG), NCR_read8(DFIFO_REG),
+         NCR_read32(DBC_REG), NCR_read32(DNAD_REG), NCR_read32(DSP_REG),
+         NCR_read32(DSPS_REG), NCR_read32(SCRATCH_REG), NCR_read8(DCNTL_REG),
+         NCR_read8(DWT_REG), NCR_read8(DIEN_REG), NCR_read8(DMODE_REG),
+         NCR_read32(ADDER_REG));
+
+    restore_flags(flags);
+}
+
+
+/*
+ * Function: int param_setup(char *str)
+ */
+
+__init int
 param_setup(char *str)
 {
     char *cur = str;
-    char *pc, *pv;
+    char *p, *pc, *pv;
     int val;
-    int base;
     int c;
 
     no_of_boards = 0;
-    while (cur != NULL && (pc = strchr(cur, ':')) != NULL) {
+    while (no_of_boards < MAXBOARDS && cur != NULL &&
+               (pc = strchr(cur, ':')) != NULL) {
        char *pe;
 
        val = 0;
        pv = pc;
        c = *++pv;
 
-       if (c == 'n')
-           val = 0;
-       else if (c == 'y')
-           val = 1;
-       else {
-           base = 0;
-           val = (int) simple_strtoul(pv, &pe, base);
-       }
+       val = (int) simple_strtoul(pv, &pe, 0);
+
        if (!strncmp(cur, "addr:", 5)) {
-           bases[0] = val;
-           no_of_boards = 1;
+           bases[no_of_boards++] = val;
+       }
+#ifdef DEBUG
+       else if (!strncmp(cur, "debug:", 6)) {
+           sim710_debug = val;
+       }
+#endif
+       else if (no_of_boards == 0) {
+           printk("sim710: Invalid parameters, addr: must come first\n");
+           no_of_boards = -1;
+           return 1;
        }
        else if (!strncmp(cur, "irq:", 4))
-           irq_vectors[0] = val;
+           irq_vectors[no_of_boards-1] = val;
        else if (!strncmp(cur, "ignore:", 7))
-           ignore_ids = val;
+           ignore_ids[no_of_boards-1] = val;
        else if (!strncmp(cur, "nodisc:", 7))
-           opt_nodisc = val;
+           opt_nodisc[no_of_boards-1] = val;
        else if (!strncmp(cur, "noneg:", 6))
-           opt_noneg = val;
-       else if (!strncmp(cur, "disabled:", 5)) {
+           opt_noneg[no_of_boards-1] = val;
+       else if (!strncmp(cur, "disabled:", 9)) {
            no_of_boards = -1;
            return 1;
        }
-#ifdef DEBUG
-       else if (!strncmp(cur, "debug:", 6)) {
-           sim710_debug = val;
+       else {
+           printk("sim710: unexpected boot option '%.*s'\n", (int)(pc-cur+1), cur);
+           no_of_boards = -1;
+           return 1;
        }
-#endif
-       else
-           printk("sim710: unexpected boot option '%.*s' ignored\n", (int)(pc-cur+1), cur);
 
-       if ((cur = strchr(cur, ARG_SEP)) != NULL)
-           ++cur;
+       /* Allow ',', ' ', or '+' seperators.  Used to be ',' at boot and
+        * ' ' for module load, some installers crap out on the space and
+        * insmod doesn't like the comma.
+        */
+       if ((p = strchr(cur, ',')) || (p = strchr(cur, ' ')) ||
+               (p = strchr(cur, '+')))
+           cur = p + 1;
+        else
+           break;
     }
     return 1;
 }
 
-#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,3,13)
 #ifndef MODULE
 __setup("sim710=", param_setup);
 #endif
-#else
-/* Old boot param syntax support */
-void
-sim710_setup(char *str, int *ints)
-{
-    param_setup(str);
-}
-#endif
 
 
 /*
@@ -397,22 +421,6 @@ sbcl_to_phase (int sbcl) {
 }
 
 
-/*
- * Function: static void disable (struct Scsi_Host *host)
- */
-
-static void
-disable (struct Scsi_Host *host)
-{
-    struct sim710_hostdata *hostdata = (struct sim710_hostdata *)
-       host->hostdata[0];
-
-    hostdata->state = STATE_DISABLED;
-    printk (KERN_ALERT "scsi%d : disabled.  Unload and reload\n",
-                           host->host_no);
-}
-
-
 /*
  * Function : static int ncr_halt (struct Scsi_Host *host)
  *
@@ -431,6 +439,8 @@ ncr_halt (struct Scsi_Host *host)
     struct sim710_hostdata *hostdata = (struct sim710_hostdata *)
        host->hostdata[0];
     int stage;
+    int timeout;
+    int res = 0;
 
     save_flags(flags);
     cli();
@@ -438,8 +448,10 @@ ncr_halt (struct Scsi_Host *host)
        Stage 1 : set ABORT
        Stage 2 : eat all but abort interrupts
        Stage 3 : eat all interrupts
+       We loop for 50000 times with a delay of 10us which should give us
+       about half a second.
      */
-    for (stage = 0;;) {
+    for (stage = 0, timeout = 50000; timeout; timeout--) {
        if (stage == 1) {
            DEB(DEB_HALT, printk("ncr_halt: writing ISTAT_ABRT\n"));
            NCR_write8(ISTAT_REG, ISTAT_ABRT);
@@ -460,9 +472,8 @@ ncr_halt (struct Scsi_Host *host)
                    NCR_write8(ISTAT_REG, 0);
                    ++stage;
                } else {
-                   printk(KERN_ALERT "scsi%d : could not halt NCR chip\n",
-                       host->host_no);
-                   disable (host);
+                   res = 1;
+                   break;
                }
            }
        }
@@ -472,10 +483,18 @@ ncr_halt (struct Scsi_Host *host)
            else if (stage == 3)
                break;
        }
+       udelay(10);
     }
-    hostdata->state = STATE_HALTED;
     restore_flags(flags);
-    return 0;
+
+    if (timeout == 0 || res) {
+       printk(KERN_ALERT "scsi%d: could not halt NCR chip\n", host->host_no);
+       return 1;
+    }
+    else {
+       hostdata->state = STATE_HALTED;
+       return 0;
+    }
 }
 
 /*
@@ -494,16 +513,9 @@ static void
 sim710_soft_reset (struct Scsi_Host *host)
 {
     unsigned long flags;
-#ifdef CONFIG_TP34V_SCSI
-    struct sim710_hostdata *hostdata = (struct sim710_hostdata *)
-       host->hostdata[0];
-#endif
 
     save_flags(flags);
     cli();
-#ifdef CONFIG_TP34V_SCSI
-    tpvic.loc_icr[irq_index[hostdata->chip]].icr = 0x80;
-#endif
     /*
      * Do a soft reset of the chip so that everything is
      * reinitialized to the power-on state.
@@ -528,6 +540,7 @@ sim710_soft_reset (struct Scsi_Host *host)
 
     mdelay(1000);                              /* Let devices recover */
 
+    NCR_write32(SCRATCH_REG, 0);
     NCR_write8(DCNTL_REG, DCNTL_10_COM | DCNTL_700_CF_3);
     NCR_write8(CTEST7_REG, CTEST7_10_CDIS|CTEST7_STD);
     NCR_write8(DMODE_REG, DMODE_10_BL_8 | DMODE_10_FC2);
@@ -544,11 +557,6 @@ sim710_soft_reset (struct Scsi_Host *host)
     NCR_write8(SIEN_REG_700,
            SIEN_PAR | SIEN_700_STO | SIEN_RST | SIEN_UDC | SIEN_SGE | SIEN_MA);
 
-
-#ifdef CONFIG_TP34V_SCSI
-    tpvic.loc_icr[irq_index[hostdata->chip]].icr = 0x30 | TP34V_SCSI0n1_IPL;
-#endif
-
     restore_flags(flags);
 }
 
@@ -577,6 +585,12 @@ sim710_driver_init (struct Scsi_Host *host)
        isa_virt_to_bus((void *)&(hostdata->reselected_identify)));
     patch_abs_32 (hostdata->script, 0, msgin_buf, 
        isa_virt_to_bus((void *)&(hostdata->msgin_buf[0])));
+    patch_abs_32 (hostdata->script, 0, msg_reject,
+       isa_virt_to_bus((void *)&(hostdata->msg_reject)));
+    patch_abs_32 (hostdata->script, 0, test1_src,
+       isa_virt_to_bus((void *)&(hostdata->test1_src)));
+    patch_abs_32 (hostdata->script, 0, test1_dst,
+       isa_virt_to_bus((void *)&(hostdata->test1_dst)));
     hostdata->state = STATE_INITIALISED;
     hostdata->negotiate = 0xff;
 }
@@ -587,7 +601,7 @@ sim710_driver_init (struct Scsi_Host *host)
  * spurious request from the target.  Don't really expect target initiated
  * SDTRs, because we always negotiate on the first command.  Could still
  * get them though..
- * The chip is currently paused with ACK asserted o the last byte of the
+ * The chip is currently paused with ACK asserted on the last byte of the
  * SDTR.
  * resa is the resume address if the message is in response to our outgoing
  * SDTR.  Only possible on initial identify.
@@ -739,6 +753,12 @@ handle_phase_mismatch (struct Scsi_Host * host, Scsi_Cmnd * cmd)
                host->host_no);
            resume_offset = Ent_resume_cmd;
        }
+       else if (sbcl == SBCL_PHASE_STATIN) {
+           /* Some devices do this on parity error, at least */
+           printk("scsi%d: Unexpected switch to STATUSIN on initial message out\n",
+               host->host_no);
+           resume_offset = Ent_end_data_trans;
+       }
        else {
            printk("scsi%d: Unexpected phase change to %s on initial msgout\n",
                host->host_no, sbcl_to_phase(sbcl));
@@ -801,6 +821,14 @@ handle_phase_mismatch (struct Scsi_Host * host, Scsi_Cmnd * cmd)
            resume_offset = Ent_resume_pmm;
        }
     }
+    else if (sbcl == SBCL_PHASE_STATIN) {
+       /* Change to Status In at some random point; probably wants to report a
+        * parity error or similar.
+        */
+       printk("scsi%d: Unexpected phase change to STATUSIN at index 0x%x\n",
+               host->host_no, index);
+       resume_offset = Ent_end_data_trans;
+    }
     else {
        printk("scsi%d: Unexpected phase change to %s at index 0x%x\n",
                host->host_no, sbcl_to_phase(sbcl), index);
@@ -868,12 +896,6 @@ handle_script_int(struct Scsi_Host * host, Scsi_Cmnd * cmd)
        printk("scsi%d: int_data_bad_phase, phase %s (%x)\n",
                host->host_no, sbcl_to_phase(sbcl), sbcl);
        break;
-    case A_int_bad_extmsg1a:
-    case A_int_bad_extmsg1b:
-    case A_int_bad_extmsg2a:
-    case A_int_bad_extmsg2b:
-    case A_int_bad_extmsg3a:
-    case A_int_bad_extmsg3b:
     case A_int_bad_msg1:
     case A_int_bad_msg2:
     case A_int_bad_msg3:
@@ -918,21 +940,22 @@ do_sim710_intr_handle(int irq, void *dev_id, struct pt_regs *regs)
 static void
 sim710_intr_handle(int irq, void *dev_id, struct pt_regs *regs)
 {
-    unsigned int flags;
     struct Scsi_Host * host = (struct Scsi_Host *)dev_id;
     struct sim710_hostdata *hostdata = (struct sim710_hostdata *)host->hostdata[0];
     Scsi_Cmnd * cmd;
     unsigned char istat, dstat;
     unsigned char sstat0;
-    u32 dsps, resume_offset = 0;
+    u32 scratch, dsps, resume_offset = 0;
 
-    save_flags(flags);
-    cli();
-    sim710_intrs++;
-    while ((istat = NCR_read8(ISTAT_REG)) & (ISTAT_SIP|ISTAT_DIP)) {
+    istat = NCR_read8(ISTAT_REG);
+    if (!(istat & (ISTAT_SIP|ISTAT_DIP)))
+       return;
+    else {
+       sim710_intrs++;
        dsps = NCR_read32(DSPS_REG);
        hostdata->state = STATE_HALTED;
        sstat0 = dstat = 0;
+       scratch = NCR_read32(SCRATCH_REG);
        if (istat & ISTAT_SIP) {
            sstat0 = NCR_read8(SSTAT0_REG);
        }
@@ -945,7 +968,13 @@ sim710_intr_handle(int irq, void *dev_id, struct pt_regs *regs)
                "dstat %02x, dsp [%04x], scratch %02x\n",
            host->host_no, sim710_intrs, istat, sstat0, dstat,
            (u32 *)(isa_bus_to_virt(NCR_read32(DSP_REG))) - hostdata->script,
-           NCR_read32(SCRATCH_REG)));
+           scratch));
+       if (scratch & 0x100) {
+           u8 *p = hostdata->msgin_buf;
+           
+           DEB(DEB_INTS, printk("  msgin_buf: %02x %02x %02x %02x\n",
+                       p[0], p[1], p[2], p[3]));
+       }
        if ((dstat & DSTAT_SIR) && dsps == A_int_reselected) {
            /* Reselected.  Identify the target from LCRC_REG, and
             * update current command.  If we were trying to select
@@ -1002,12 +1031,7 @@ sim710_intr_handle(int irq, void *dev_id, struct pt_regs *regs)
            hostdata->target[cmd->target].cur_cmd = NULL;
            resume_offset = Ent_reselect;
        }
-       else if (dstat & DSTAT_SIR)
-           resume_offset = handle_script_int(host, cmd);
-       else if (sstat0 & SSTAT0_MA) {
-           resume_offset = handle_phase_mismatch(host, cmd);
-       }
-       else if (sstat0 & (SSTAT0_MA|SSTAT0_SGE|SSTAT0_UDC|SSTAT0_RST|SSTAT0_PAR)) {
+       else if (sstat0 & (SSTAT0_SGE|SSTAT0_UDC|SSTAT0_RST|SSTAT0_PAR)) {
            printk("scsi%d: Serious error, sstat0 = %02x\n", host->host_no,
                            sstat0);
            sim710_errors++;
@@ -1019,6 +1043,10 @@ sim710_intr_handle(int irq, void *dev_id, struct pt_regs *regs)
            sim710_errors++;
            /* resume_offset is zero, which will cause a host reset */
        }
+       else if (dstat & DSTAT_SIR)
+           resume_offset = handle_script_int(host, cmd);
+       else if (sstat0 & SSTAT0_MA)
+           resume_offset = handle_phase_mismatch(host, cmd);
        else if (dstat & DSTAT_IID) {
            /* This can be due to a quick reselect while doing a WAIT
             * DISCONNECT.
@@ -1044,18 +1072,21 @@ sim710_intr_handle(int irq, void *dev_id, struct pt_regs *regs)
 #ifdef DEBUG_LIMIT_INTS
        if (sim710_intrs < DEBUG_LIMIT_INTS)
 #endif
-       NCR_write32(DSP_REG, isa_virt_to_bus(hostdata->script+resume_offset/4));
+       {
+           NCR_write32(SCRATCH_REG, 0);
+           NCR_write32(DSP_REG,
+                   isa_virt_to_bus(hostdata->script+resume_offset/4));
+       }
        if (resume_offset == Ent_reselect)
            run_process_issue_queue(hostdata);
     }
     else {
        printk("scsi%d: Failed to handle interrupt.  Failing commands "
                "and resetting SCSI bus and chip\n", host->host_no);
-       mdelay(4000);           /* Give chance to read screen!! */
+       mdelay(1000);           /* Give chance to read screen!! */
        full_reset(host);
     }
 
-    restore_flags(flags);
 }
 
 
@@ -1101,9 +1132,9 @@ run_command (struct sim710_hostdata *hostdata, Scsi_Cmnd *cmd)
     memcpy(targdata->dsa_cdb, cmd->cmnd, MAX_CMND);
 
     targdata->dsa_msgout[0] =
-               IDENTIFY((opt_nodisc & (1<<cmd->target)) ? 0 : 1 ,0);
+               IDENTIFY((opt_nodisc[hostdata->chip] & (1<<cmd->target)) ? 0 : 1 ,0);
     if (hostdata->negotiate & (1 << cmd->target)) {
-       if (opt_noneg & (1 << cmd->target)) {
+       if (opt_noneg[hostdata->chip] & (1 << cmd->target)) {
            hostdata->negotiate ^= (1 << cmd->target);
            targdata->dsa[DSA_MSGOUT] = 1;
        }
@@ -1143,16 +1174,10 @@ run_command (struct sim710_hostdata *hostdata, Scsi_Cmnd *cmd)
        u32 cnt = cmd->use_sg ? sgl->length : cmd->request_bufflen;
 
        if (datain) {
-#ifdef CONFIG_TP34V_SCSI
-           cache_clear(virt_to_phys(vbuf, cnt);
-#endif
            *dip++      = cnt;
            *dip++      = bbuf;
        }
        if (dataout) {
-#ifdef CONFIG_TP34V_SCSI
-           cache_push(virt_to_phys(vbuf, cnt);
-#endif
            *dop++      = cnt;
            *dop++      = bbuf;
        }
@@ -1288,7 +1313,7 @@ sim710_queuecommand(Scsi_Cmnd * cmd, void (*done)(Scsi_Cmnd *))
     save_flags(flags);
     cli();
 
-    if (ignore_ids & (1 << cmd->target)) {
+    if (ignore_ids[hostdata->chip] & (1 << cmd->target)) {
        printk("scsi%d: ignoring target %d\n", host->host_no, cmd->target);
        cmd->result = (DID_BAD_TARGET << 16);
        done(cmd);
@@ -1320,18 +1345,25 @@ sim710_queuecommand(Scsi_Cmnd * cmd, void (*done)(Scsi_Cmnd *))
 }
 
 
-int
+__init int
 sim710_detect(Scsi_Host_Template * tpnt)
 {
-    unsigned char irq_vector;
     unsigned char scsi_id;
     unsigned int base_addr;
     struct Scsi_Host * host = NULL;
     struct sim710_hostdata *hostdata;
+    unsigned long timeout;
+    unsigned long irq_mask;
+    int requested_irq;
+    int probed_irq;
+    u32 dsps;
     int chips = 0;
+    int limit;
     int indx;
     int revision;
-    int order, size;
+    int size;
+    volatile u8 tmp;
+    struct Scsi_Host *our_hosts[MAXBOARDS+1];
 
 #ifdef MODULE
     if (sim710)
@@ -1433,83 +1465,191 @@ sim710_detect(Scsi_Host_Template * tpnt)
     }
 #endif
 
+#ifdef CONFIG_EISA
+    /* Auto probe, if no boards specified in boot parameters */
+    if (no_of_boards == 0) {
+       int io_addr;
+       /* reverse probe, so my on-board controller at 0x9000 is always scsi0 */
+       for (io_addr = 0x9000; no_of_boards < MAXBOARDS && io_addr >= 0x1000; io_addr -= 0x1000) {
+           if (request_region(io_addr, 0x40, "sim710") != NULL) {
+               int id0 = inw(io_addr + 0xc80);
+               int id1 = inw(io_addr + 0xc82);
+               /* The on-board controller on my Proliant 2000 is 0x1044,
+                * my EISA card is 0x1144.
+                */
+               if (id0 == 0x110e && (id1 == 0x1044 || id1 == 0x1144)) {
+                   bases[no_of_boards] = io_addr;
+#if 0
+                   /* This should detect the IRQ, but I havn't proved it for
+                    * myself.  Leave the old probe code active for now, as
+                    * no-one has reported problems with it.
+                    */
+                   switch (inb(io_addr + 0xc88)) {
+                       case (0x00):
+                           irq_vectors[no_of_boards] = 11;
+                           break;
+                       case (0x01):
+                           irq_vectors[no_of_boards] = 14;
+                           break;
+                       case (0x02):
+                           irq_vectors[no_of_boards] = 15;
+                           break;
+                       case (0x03):
+                           irq_vectors[no_of_boards] = 10;
+                           break;
+                       case (0x04):
+                           irq_vectors[no_of_boards] = 9;
+                           break;
+                       default:
+                           printk("sim710.c: irq nasty\n");
+                   }
+#endif
+                   no_of_boards++;
+               }
+               release_region(io_addr, 64);
+           }
+       }
+    }
+#endif
+      
     if (!no_of_boards) {
-       printk("sim710: No NCR53C710 adapter found.\n");
-       return 0;
+       printk("sim710: No NCR53C710 adapter found.\n");
+       return 0;
     }
 
     size = sizeof(struct sim710_hostdata);
-    order = 0;
-    while (size > (PAGE_SIZE << order))
-       order++;
-    size = PAGE_SIZE << order;
+    hostdata_order = 0;
+    while (size > (PAGE_SIZE << hostdata_order))
+       hostdata_order++;
+    size = PAGE_SIZE << hostdata_order;
 
     DEB(DEB_ANY, printk("sim710: hostdata %d bytes, size %d, order %d\n",
-       sizeof(struct sim710_hostdata), size, order));
+       sizeof(struct sim710_hostdata), size, hostdata_order));
 
     tpnt->proc_name = "sim710";
 
-    for(indx = 0; indx < no_of_boards; indx++) {
-        unsigned long page = __get_free_pages(GFP_ATOMIC, order);
+    memset(our_hosts, 0, sizeof(our_hosts));
+    for (indx = 0; indx < no_of_boards; indx++) {
+        unsigned long page = __get_free_pages(GFP_ATOMIC, hostdata_order);
         if(page == 0UL)
         {
-               printk(KERN_WARNING "sim710: out of memory registering board %d.\n", indx);
-               break;
+               printk(KERN_WARNING "sim710: out of memory registering board %d.\n", indx);
+               break;
         }
        host = scsi_register(tpnt, 4);
-       if(host == NULL)
-               break;
+       if(host == NULL) {
+           free_pages(host->hostdata[0], hostdata_order);
+           break;
+       }
+       our_hosts[chips] = host;
        host->hostdata[0] = page;
        hostdata = (struct sim710_hostdata *)host->hostdata[0];
        memset(hostdata, 0, size);
-#ifdef CONFIG_TP34V_SCSI
-       cache_push(virt_to_phys(hostdata), size);
-       cache_clear(virt_to_phys(hostdata), size);
-       kernel_set_cachemode((void *)hostdata,size,IOMAP_NOCACHE_SER);
-#endif
        scsi_id = 7;
        base_addr = bases[indx];
-       irq_vector = irq_vectors[indx];
-       printk("sim710: Configuring Sim710 (SCSI-ID %d) at %x, IRQ %d\n",
-                       scsi_id, base_addr, irq_vector);
+       requested_irq = irq_vectors[indx];
+       printk("scsi%d: Configuring Sim710 (SCSI-ID %d) at %x, IRQ %d\n",
+                       host->host_no, scsi_id, base_addr, requested_irq);
        DEB(DEB_ANY, printk("sim710: hostdata = %p (%d bytes), dsa0 = %p\n",
                        hostdata, sizeof(struct sim710_hostdata),
                         hostdata->target[0].dsa));
        hostdata->chip = indx;
-       host->irq = irq_vector;
+       host->irq = requested_irq;
        host->this_id = scsi_id;
        host->unique_id = base_addr;
        host->base = base_addr;
+       hostdata->msg_reject = MESSAGE_REJECT;
 
-       ncr_halt(host);
-
+       if (ncr_halt(host)) {
+           free_pages(host->hostdata[0], hostdata_order);
+           scsi_unregister (host);
+           printk("scsi%d: Failed to initialise 53c710 at address %x\n",
+                       host->host_no, base_addr);
+           continue;
+       }
+       DEB(DEB_ANY,ncr_dump(host));
        revision = (NCR_read8(CTEST8_REG) & 0xF0) >> 4;
        printk("scsi%d: Revision 0x%x\n",host->host_no,revision);
-
        sim710_soft_reset(host);
 
        sim710_driver_init(host);
 
-#ifdef CONFIG_TP34V_SCSI
-       if (request_irq(irq_vector,do_sim710_intr_handle, 0, "sim710", host))
-#else
-       if (request_irq(irq_vector,do_sim710_intr_handle, SA_INTERRUPT, "sim710", host))
-#endif
+       request_region((u32)host->base, 64, "sim710");
+       /* Now run test1 */
+       hostdata->test1_src = 0x53c710aa;
+       hostdata->test1_dst = 0x76543210;
+       NCR_write32(DSPS_REG, 0x89abcdef);
+       irq_mask = probe_irq_on();
+       NCR_write32(DSP_REG, virt_to_bus(hostdata->script+Ent_test1/4));
+       timeout = 5;
+       while (hostdata->test1_dst != hostdata->test1_src && timeout--)
+           mdelay(100);
+       tmp = NCR_read8(ISTAT_REG);
+       tmp = NCR_read8(SSTAT0_REG);
+       udelay(10);
+       tmp = NCR_read8(DSTAT_REG);
+       probed_irq = probe_irq_off(irq_mask);
+       if (requested_irq == 0) {
+           if (probed_irq > 0) {
+               printk("scsi%d: Chip is using IRQ %d\n", host->host_no,
+                       probed_irq);
+               requested_irq = host->irq = probed_irq;
+           }
+           else {
+               printk("scsi%d: Failed to probe for IRQ (returned %d)\n",
+                       host->host_no, probed_irq);
+               ncr_halt(host);
+               free_pages(host->hostdata[0], hostdata_order);
+               scsi_unregister (host);
+               release_region((u32)host->base, 64);
+               continue;
+           }
+       }
+       else if (probed_irq > 0 && probed_irq != requested_irq)
+           printk("scsi%d: WARNING requested IRQ %d, but probed as %d\n",
+                       host->host_no, requested_irq, probed_irq);
+       else if (probed_irq <= 0)
+           printk("scsi%d: WARNING IRQ probe failed, (returned %d)\n",
+                       host->host_no, probed_irq);
+       
+       dsps = NCR_read32(DSPS_REG);
+       if (hostdata->test1_dst != 0x53c710aa || dsps != A_int_test1) {
+           if (hostdata->test1_dst != 0x53c710aa)
+               printk("scsi%d: test 1 FAILED: data: exp 0x53c710aa, got 0x%08x\n",
+                       host->host_no, hostdata->test1_dst);
+           if (dsps != A_int_test1)
+               printk("scsi%d: test 1 FAILED: dsps: exp 0x%08x, got 0x%08x\n",
+                       host->host_no, A_int_test1, dsps);
+           ncr_dump(host);
+           ncr_halt(host);
+           free_pages(host->hostdata[0], hostdata_order);
+           scsi_unregister (host);
+           release_region((u32)host->base, 64);
+           continue;
+       }
+       printk("scsi%d: test 1 completed ok.\n", host->host_no);
+
+       NCR_write32(DSP_REG, virt_to_bus(hostdata->script+Ent_reselect/4));
+       hostdata->state = STATE_IDLE;
+       chips++;
+    }
+    /* OK, now run down our_hosts[] calling request_irq(... SA_SHIRQ ...).
+     * Couldn't call request_irq earlier, as probing would have failed.
+     */
+    for (indx = 0, limit = chips; indx < limit; indx++) {
+       host = our_hosts[indx];
+       if (request_irq(host->irq, do_sim710_intr_handle,
+                       SA_INTERRUPT | SA_SHIRQ, "sim710", host))
        {
            printk("scsi%d : IRQ%d not free, detaching\n",
-                       host->host_no, host->irq);
-
+                       host->host_no, host->irq);
+           ncr_halt(host);
+           free_pages(host->hostdata[0], hostdata_order);
            scsi_unregister (host);
+           chips--;
        }
-       else {
-#ifdef IO_MAPPED
-           request_region((u32)host->base, 64, "sim710");
-#endif
-           chips++;
-       }
-       NCR_write32(DSP_REG, isa_virt_to_bus(hostdata->script+Ent_reselect/4));
-       hostdata->state = STATE_IDLE;
     }
+
     return chips;
 }
 
@@ -1558,11 +1698,34 @@ full_reset(struct Scsi_Host * host)
     int target;
     Scsi_Cmnd *cmd;
 
-    ncr_halt(host);
-    printk("scsi%d: dsp = %08x (script[0x%04x]), scratch = %08x\n",
-       host->host_no, NCR_read32(DSP_REG),
-       ((u32)isa_bus_to_virt(NCR_read32(DSP_REG)) - (u32)hostdata->script)/4,
-       NCR_read32(SCRATCH_REG));
+    u32 istat, dstat = 0, sstat0 = 0, sstat1 = 0, dsp, dsps, scratch;
+    unsigned long flags;
+
+    save_flags(flags);
+    cli();
+
+    istat = NCR_read8(ISTAT_REG);
+    if (istat & ISTAT_SIP) {
+       sstat0 = NCR_read8(SSTAT0_REG);
+       sstat1 = NCR_read8(SSTAT1_REG);
+       udelay(10);
+    }
+    if (istat & ISTAT_DIP)
+       dstat = NCR_read8(DSTAT_REG);
+
+    if (ncr_halt(host)) {
+       restore_flags(flags);
+       return FAILED;
+    }
+    restore_flags(flags);
+    dsp = NCR_read32(DSP_REG);
+    dsps = NCR_read32(DSPS_REG);
+    scratch = NCR_read32(SCRATCH_REG);
+    printk("scsi%d: istat = %02x, sstat0 = %02x, sstat1 = %02x, dstat = %02x\n",
+               host->host_no, istat, sstat0, sstat1, dstat);
+    printk("scsi%d: dsp = %08x (script[0x%04x]), dsps = %08x, scratch = %08x\n",
+               host->host_no, dsp,
+               ((u32)bus_to_virt(dsp) - (u32)hostdata->script)/4, dsps, scratch);
 
     for (target = 0; target < 7; target++) {
        if ((cmd = hostdata->target[target].cur_cmd)) {
@@ -1604,10 +1767,10 @@ sim710_host_reset(Scsi_Cmnd * SCpnt)
 int
 sim710_release(struct Scsi_Host *host)
 {
+    ncr_halt(host);
+    free_pages(host->hostdata[0], hostdata_order);
     free_irq(host->irq, host);
-#ifdef IO_MAPPED
     release_region((u32)host->base, 64);
-#endif
     return 1;
 }
 
index 7cd2ff5558d7470ecab77871d5036cd1360afbd2..0e6c48461df500b43a03a6ae828eb192c9e3bf58 100644 (file)
@@ -23,8 +23,8 @@ int sim710_release(struct Scsi_Host *);
 
 #include <scsi/scsicam.h>
 
-#define SIM710_SCSI { proc_name:               "sim710",       \
-                     name:                     "Simple 53c710",        \
+#define SIM710_SCSI { proc_name:               "sim710",               \
+                     name:                     "53c710",               \
                      detect:                   sim710_detect,          \
                      release:                  sim710_release,         \
                      queuecommand:             sim710_queuecommand,    \
@@ -413,7 +413,7 @@ int sim710_release(struct Scsi_Host *);
 #define CTEST3_800_FM          0x02    /* Fetch mode pin */
 /* bit 0 is reserved on 800 series chips */
 
-#define CTEST4_REG_400         (0x18^bE)       /* Chip test 4 rw */
+#define CTEST4_REG_700         (0x18^bE)       /* Chip test 4 rw */
 #define CTEST4_REG_800         (0x21^bE)       /* Chip test 4 rw */
 /* 0x80 is reserved on 700 series chips */
 #define CTEST4_800_BDIS                0x80    /* Burst mode disable */
@@ -791,6 +791,20 @@ int sim710_release(struct Scsi_Host *);
 
 #define ISTAT_REG      ISTAT_REG_700
 #define SCRATCH_REG    SCRATCHB_REG_10
+#define ADDER_REG      ADDER_REG_10
+#define SIEN_REG       SIEN_REG_700
+#define SDID_REG       SDID_REG_700
+#define CTEST0_REG     CTEST0_REG_700
+#define CTEST1_REG     CTEST1_REG_700
+#define CTEST2_REG     CTEST2_REG_700
+#define CTEST3_REG     CTEST3_REG_700
+#define CTEST4_REG     CTEST4_REG_700
+#define CTEST5_REG     CTEST5_REG_700
+#define CTEST6_REG     CTEST6_REG_700
+#define SODL_REG       SODL_REG_700
+#define SBDL_REG       SBDL_REG_700
+#define SIDL_REG       SIDL_REG_700
+#define LCRC_REG       LCRC_REG_10
 
 #ifdef MEM_MAPPED
 #define NCR_read8(address)                                     \
index 60893a662366aefa17c6efb2b64f142c4df817f8..dfd7e4555467f1a84c395f02494efb7951688996 100644 (file)
@@ -15,15 +15,12 @@ ABSOLUTE dsa_size     = 2088
 
 ABSOLUTE reselected_identify = 0
 ABSOLUTE msgin_buf = 0
+ABSOLUTE msg_reject = 0
+ABSOLUTE test1_src = 0
+ABSOLUTE test1_dst = 0
 
 /* Interrupt values passed back to driver */
 
-ABSOLUTE int_bad_extmsg1a      = 0xab930000
-ABSOLUTE int_bad_extmsg1b      = 0xab930001
-ABSOLUTE int_bad_extmsg2a      = 0xab930002
-ABSOLUTE int_bad_extmsg2b      = 0xab930003
-ABSOLUTE int_bad_extmsg3a      = 0xab930004
-ABSOLUTE int_bad_extmsg3b      = 0xab930005
 ABSOLUTE int_bad_msg1          = 0xab930006
 ABSOLUTE int_bad_msg2          = 0xab930007
 ABSOLUTE int_bad_msg3          = 0xab930008
@@ -47,9 +44,9 @@ ABSOLUTE int_disc1            = 0xab930019
 ABSOLUTE int_disc2             = 0xab93001a
 ABSOLUTE int_disc3             = 0xab93001b
 ABSOLUTE int_not_rej           = 0xab93001c
+ABSOLUTE int_test1             = 0xab93001d
 
-
-/* Bit field settings used to record status in SCRATCH */
+/* Bit field settings used to record status in SCRATCH0 */
 
 ABSOLUTE had_select    = 0x01
 ABSOLUTE had_msgout    = 0x02
@@ -60,6 +57,9 @@ ABSOLUTE had_status   = 0x20
 ABSOLUTE had_msgin     = 0x40
 ABSOLUTE had_extmsg    = 0x80
 
+/* Bit field settings used to record status in SCRATCH1 */
+
+ABSOLUTE did_reject    = 0x01
 
 /* These scripts are heavily based on the examples in the NCR 53C710
  * Programmer's Guide (Preliminary).
@@ -68,7 +68,6 @@ ABSOLUTE had_extmsg   = 0x80
 ENTRY do_select
 do_select:
        CLEAR TARGET
-       MOVE SCRATCH0 & 0 TO SCRATCH0
        ; Enable selection timer
        MOVE CTEST7 & 0xef TO CTEST7
        SELECT ATN FROM dsa_select, reselect
@@ -401,17 +400,23 @@ ext_msg1:
        MOVE SCRATCH0 | had_extmsg TO SCRATCH0
        CLEAR ACK
        MOVE 1, msgin_buf + 1, WHEN MSG_IN
-       JUMP ext_msg1a, IF 0x03
-       INT int_bad_extmsg1a
-ext_msg1a:
+       JUMP reject_msg1, IF NOT 0x03   ; Only handle SDTR
        CLEAR ACK
        MOVE 1, msgin_buf + 2, WHEN MSG_IN
-       JUMP ext_msg1b, IF 0x01         ; Must be SDTR
-       INT int_bad_extmsg1b
-ext_msg1b:
+       JUMP reject_msg1, IF NOT 0x01   ; Only handle SDTR
        CLEAR ACK
        MOVE 2, msgin_buf + 3, WHEN MSG_IN
        INT int_msg_sdtr1
+reject_msg1:
+       MOVE SCRATCH1 | did_reject TO SCRATCH1
+       SET ATN
+       CLEAR ACK
+       JUMP reject_msg1a, WHEN NOT MSG_IN
+       MOVE 1, msgin_buf + 7, WHEN MSG_IN
+       JUMP reject_msg1
+reject_msg1a:
+       MOVE 1, msg_reject, WHEN MSG_OUT
+       JUMP redo_msgin1
 disc1:
        CLEAR ACK
 ENTRY wait_disc1
@@ -446,17 +451,23 @@ ext_msg2:
        MOVE SCRATCH0 | had_extmsg TO SCRATCH0
        CLEAR ACK
        MOVE 1, msgin_buf + 1, WHEN MSG_IN
-       JUMP ext_msg2a, IF 0x03
-       INT int_bad_extmsg2a
-ext_msg2a:
+       JUMP reject_msg2, IF NOT 0x03   ; Only handle SDTR
        CLEAR ACK
        MOVE 1, msgin_buf + 2, WHEN MSG_IN
-       JUMP ext_msg2b, IF 0x01         ; Must be SDTR
-       INT int_bad_extmsg2b
-ext_msg2b:
+       JUMP reject_msg2, IF NOT 0x01   ; Only handle SDTR
        CLEAR ACK
        MOVE 2, msgin_buf + 3, WHEN MSG_IN
        INT int_msg_sdtr2
+reject_msg2:
+       MOVE SCRATCH1 | did_reject TO SCRATCH1
+       SET ATN
+       CLEAR ACK
+       JUMP reject_msg2a, WHEN NOT MSG_IN
+       MOVE 1, msgin_buf + 7, WHEN MSG_IN
+       JUMP reject_msg2
+reject_msg2a:
+       MOVE 1, msg_reject, WHEN MSG_OUT
+       JUMP redo_msgin2
 disc2:
        CLEAR ACK
 ENTRY wait_disc2
@@ -491,17 +502,23 @@ ext_msg3:
        MOVE SCRATCH0 | had_extmsg TO SCRATCH0
        CLEAR ACK
        MOVE 1, msgin_buf + 1, WHEN MSG_IN
-       JUMP ext_msg3a, IF 0x03
-       INT int_bad_extmsg3a
-ext_msg3a:
+       JUMP reject_msg3, IF NOT 0x03   ; Only handle SDTR
        CLEAR ACK
        MOVE 1, msgin_buf + 2, WHEN MSG_IN
-       JUMP ext_msg3b, IF 0x01         ; Must be SDTR
-       INT int_bad_extmsg3b
-ext_msg3b:
+       JUMP reject_msg3, IF NOT 0x01   ; Only handle  SDTR
        CLEAR ACK
        MOVE 2, msgin_buf + 3, WHEN MSG_IN
        INT int_msg_sdtr3
+reject_msg3:
+       MOVE SCRATCH1 | did_reject TO SCRATCH1
+       SET ATN
+       CLEAR ACK
+       JUMP reject_msg3a, WHEN NOT MSG_IN
+       MOVE 1, msgin_buf + 7, WHEN MSG_IN
+       JUMP reject_msg3
+reject_msg3a:
+       MOVE 1, msg_reject, WHEN MSG_OUT
+       JUMP redo_msgin3
 disc3:
        CLEAR ACK
 ENTRY wait_disc3
@@ -552,3 +569,8 @@ patch_new_dsa:
 selected:
        INT int_selected
 
+ENTRY test1
+test1:
+       MOVE MEMORY 4, test1_src, test1_dst
+       INT int_test1
+
index 2a2a0d91bfe3f7f255ccfc364bbe669c73003e3a..ad13581208b7f46951c828d4d646270f7422bb11 100644 (file)
@@ -18,15 +18,12 @@ ABSOLUTE dsa_size     = 2088
 
 ABSOLUTE reselected_identify = 0
 ABSOLUTE msgin_buf = 0
+ABSOLUTE msg_reject = 0
+ABSOLUTE test1_src = 0
+ABSOLUTE test1_dst = 0
 
 
 
-ABSOLUTE int_bad_extmsg1a      = 0xab930000
-ABSOLUTE int_bad_extmsg1b      = 0xab930001
-ABSOLUTE int_bad_extmsg2a      = 0xab930002
-ABSOLUTE int_bad_extmsg2b      = 0xab930003
-ABSOLUTE int_bad_extmsg3a      = 0xab930004
-ABSOLUTE int_bad_extmsg3b      = 0xab930005
 ABSOLUTE int_bad_msg1          = 0xab930006
 ABSOLUTE int_bad_msg2          = 0xab930007
 ABSOLUTE int_bad_msg3          = 0xab930008
@@ -50,7 +47,7 @@ ABSOLUTE int_disc1            = 0xab930019
 ABSOLUTE int_disc2             = 0xab93001a
 ABSOLUTE int_disc3             = 0xab93001b
 ABSOLUTE int_not_rej           = 0xab93001c
-
+ABSOLUTE int_test1             = 0xab93001d
 
 
 
@@ -65,6 +62,9 @@ ABSOLUTE had_extmsg   = 0x80
 
 
 
+ABSOLUTE did_reject    = 0x01
+
+
 
 
 
@@ -73,1642 +73,1710 @@ do_select:
        CLEAR TARGET
 
 at 0x00000000 : */     0x60000200,0x00000000,
-/*
-       MOVE SCRATCH0 & 0 TO SCRATCH0
-
-at 0x00000002 : */     0x7c340000,0x00000000,
 /*
        ; Enable selection timer
        MOVE CTEST7 & 0xef TO CTEST7
 
-at 0x00000004 : */     0x7c1bef00,0x00000000,
+at 0x00000002 : */     0x7c1bef00,0x00000000,
 /*
        SELECT ATN FROM dsa_select, reselect
 
-at 0x00000006 : */     0x43000000,0x00000c48,
+at 0x00000004 : */     0x43000000,0x00000cd0,
 /*
        JUMP get_status, WHEN STATUS
 
-at 0x00000008 : */     0x830b0000,0x000000a0,
+at 0x00000006 : */     0x830b0000,0x00000098,
 /*
        ; Disable selection timer
        MOVE CTEST7 | 0x10 TO CTEST7
 
-at 0x0000000a : */     0x7a1b1000,0x00000000,
+at 0x00000008 : */     0x7a1b1000,0x00000000,
 /*
        MOVE SCRATCH0 | had_select TO SCRATCH0
 
-at 0x0000000c : */     0x7a340100,0x00000000,
+at 0x0000000a : */     0x7a340100,0x00000000,
 /*
        INT int_sel_no_ident, IF NOT MSG_OUT
 
-at 0x0000000e : */     0x9e020000,0xab930013,
+at 0x0000000c : */     0x9e020000,0xab930013,
 /*
        MOVE SCRATCH0 | had_msgout TO SCRATCH0
 
-at 0x00000010 : */     0x7a340200,0x00000000,
+at 0x0000000e : */     0x7a340200,0x00000000,
 /*
        MOVE FROM dsa_msgout, when MSG_OUT
 
-at 0x00000012 : */     0x1e000000,0x00000008,
+at 0x00000010 : */     0x1e000000,0x00000008,
 /*
 ENTRY done_ident
 done_ident:
        JUMP get_status, IF STATUS
 
-at 0x00000014 : */     0x830a0000,0x000000a0,
+at 0x00000012 : */     0x830a0000,0x00000098,
 /*
 redo_msgin1:
        JUMP get_msgin1, WHEN MSG_IN
 
-at 0x00000016 : */     0x870b0000,0x00000920,
+at 0x00000014 : */     0x870b0000,0x00000918,
 /*
        INT int_sel_not_cmd, IF NOT CMD
 
-at 0x00000018 : */     0x9a020000,0xab930014,
+at 0x00000016 : */     0x9a020000,0xab930014,
 /*
 ENTRY resume_cmd
 resume_cmd:
        MOVE SCRATCH0 | had_cmdout TO SCRATCH0
 
-at 0x0000001a : */     0x7a340400,0x00000000,
+at 0x00000018 : */     0x7a340400,0x00000000,
 /*
        MOVE FROM dsa_cmnd, WHEN CMD
 
-at 0x0000001c : */     0x1a000000,0x00000010,
+at 0x0000001a : */     0x1a000000,0x00000010,
 /*
 ENTRY resume_pmm
 resume_pmm:
 redo_msgin2:
        JUMP get_msgin2, WHEN MSG_IN
 
-at 0x0000001e : */     0x870b0000,0x00000a20,
+at 0x0000001c : */     0x870b0000,0x00000a48,
 /*
        JUMP get_status, IF STATUS
 
-at 0x00000020 : */     0x830a0000,0x000000a0,
+at 0x0000001e : */     0x830a0000,0x00000098,
 /*
        JUMP input_data, IF DATA_IN
 
-at 0x00000022 : */     0x810a0000,0x000000e0,
+at 0x00000020 : */     0x810a0000,0x000000d8,
 /*
        JUMP output_data, IF DATA_OUT
 
-at 0x00000024 : */     0x800a0000,0x000004f8,
+at 0x00000022 : */     0x800a0000,0x000004f0,
 /*
        INT int_cmd_bad_phase
 
-at 0x00000026 : */     0x98080000,0xab930009,
+at 0x00000024 : */     0x98080000,0xab930009,
 /*
 
 get_status:
        ; Disable selection timer
        MOVE CTEST7 | 0x10 TO CTEST7
 
-at 0x00000028 : */     0x7a1b1000,0x00000000,
+at 0x00000026 : */     0x7a1b1000,0x00000000,
 /*
        MOVE FROM dsa_status, WHEN STATUS
 
-at 0x0000002a : */     0x1b000000,0x00000018,
+at 0x00000028 : */     0x1b000000,0x00000018,
 /*
        INT int_status_not_msgin, WHEN NOT MSG_IN
 
-at 0x0000002c : */     0x9f030000,0xab930015,
+at 0x0000002a : */     0x9f030000,0xab930015,
 /*
        MOVE FROM dsa_msgin, WHEN MSG_IN
 
-at 0x0000002e : */     0x1f000000,0x00000020,
+at 0x0000002c : */     0x1f000000,0x00000020,
 /*
        INT int_not_cmd_complete, IF NOT 0x00
 
-at 0x00000030 : */     0x98040000,0xab930012,
+at 0x0000002e : */     0x98040000,0xab930012,
 /*
        CLEAR ACK
 
-at 0x00000032 : */     0x60000040,0x00000000,
+at 0x00000030 : */     0x60000040,0x00000000,
 /*
 ENTRY wait_disc_complete
 wait_disc_complete:
        WAIT DISCONNECT
 
-at 0x00000034 : */     0x48000000,0x00000000,
+at 0x00000032 : */     0x48000000,0x00000000,
 /*
        INT int_cmd_complete
 
-at 0x00000036 : */     0x98080000,0xab93000a,
+at 0x00000034 : */     0x98080000,0xab93000a,
 /*
 
 input_data:
        MOVE SCRATCH0 | had_datain TO SCRATCH0
 
-at 0x00000038 : */     0x7a340800,0x00000000,
+at 0x00000036 : */     0x7a340800,0x00000000,
 /*
 ENTRY patch_input_data
 patch_input_data:
        JUMP 0
 
-at 0x0000003a : */     0x80080000,0x00000000,
+at 0x00000038 : */     0x80080000,0x00000000,
 /*
        MOVE FROM dsa_datain+0x0000, WHEN DATA_IN
 
-at 0x0000003c : */     0x19000000,0x00000028,
+at 0x0000003a : */     0x19000000,0x00000028,
 /*
        MOVE FROM dsa_datain+0x0008, WHEN DATA_IN
 
-at 0x0000003e : */     0x19000000,0x00000030,
+at 0x0000003c : */     0x19000000,0x00000030,
 /*
        MOVE FROM dsa_datain+0x0010, WHEN DATA_IN
 
-at 0x00000040 : */     0x19000000,0x00000038,
+at 0x0000003e : */     0x19000000,0x00000038,
 /*
        MOVE FROM dsa_datain+0x0018, WHEN DATA_IN
 
-at 0x00000042 : */     0x19000000,0x00000040,
+at 0x00000040 : */     0x19000000,0x00000040,
 /*
        MOVE FROM dsa_datain+0x0020, WHEN DATA_IN
 
-at 0x00000044 : */     0x19000000,0x00000048,
+at 0x00000042 : */     0x19000000,0x00000048,
 /*
        MOVE FROM dsa_datain+0x0028, WHEN DATA_IN
 
-at 0x00000046 : */     0x19000000,0x00000050,
+at 0x00000044 : */     0x19000000,0x00000050,
 /*
        MOVE FROM dsa_datain+0x0030, WHEN DATA_IN
 
-at 0x00000048 : */     0x19000000,0x00000058,
+at 0x00000046 : */     0x19000000,0x00000058,
 /*
        MOVE FROM dsa_datain+0x0038, WHEN DATA_IN
 
-at 0x0000004a : */     0x19000000,0x00000060,
+at 0x00000048 : */     0x19000000,0x00000060,
 /*
        MOVE FROM dsa_datain+0x0040, WHEN DATA_IN
 
-at 0x0000004c : */     0x19000000,0x00000068,
+at 0x0000004a : */     0x19000000,0x00000068,
 /*
        MOVE FROM dsa_datain+0x0048, WHEN DATA_IN
 
-at 0x0000004e : */     0x19000000,0x00000070,
+at 0x0000004c : */     0x19000000,0x00000070,
 /*
        MOVE FROM dsa_datain+0x0050, WHEN DATA_IN
 
-at 0x00000050 : */     0x19000000,0x00000078,
+at 0x0000004e : */     0x19000000,0x00000078,
 /*
        MOVE FROM dsa_datain+0x0058, WHEN DATA_IN
 
-at 0x00000052 : */     0x19000000,0x00000080,
+at 0x00000050 : */     0x19000000,0x00000080,
 /*
        MOVE FROM dsa_datain+0x0060, WHEN DATA_IN
 
-at 0x00000054 : */     0x19000000,0x00000088,
+at 0x00000052 : */     0x19000000,0x00000088,
 /*
        MOVE FROM dsa_datain+0x0068, WHEN DATA_IN
 
-at 0x00000056 : */     0x19000000,0x00000090,
+at 0x00000054 : */     0x19000000,0x00000090,
 /*
        MOVE FROM dsa_datain+0x0070, WHEN DATA_IN
 
-at 0x00000058 : */     0x19000000,0x00000098,
+at 0x00000056 : */     0x19000000,0x00000098,
 /*
        MOVE FROM dsa_datain+0x0078, WHEN DATA_IN
 
-at 0x0000005a : */     0x19000000,0x000000a0,
+at 0x00000058 : */     0x19000000,0x000000a0,
 /*
        MOVE FROM dsa_datain+0x0080, WHEN DATA_IN
 
-at 0x0000005c : */     0x19000000,0x000000a8,
+at 0x0000005a : */     0x19000000,0x000000a8,
 /*
        MOVE FROM dsa_datain+0x0088, WHEN DATA_IN
 
-at 0x0000005e : */     0x19000000,0x000000b0,
+at 0x0000005c : */     0x19000000,0x000000b0,
 /*
        MOVE FROM dsa_datain+0x0090, WHEN DATA_IN
 
-at 0x00000060 : */     0x19000000,0x000000b8,
+at 0x0000005e : */     0x19000000,0x000000b8,
 /*
        MOVE FROM dsa_datain+0x0098, WHEN DATA_IN
 
-at 0x00000062 : */     0x19000000,0x000000c0,
+at 0x00000060 : */     0x19000000,0x000000c0,
 /*
        MOVE FROM dsa_datain+0x00a0, WHEN DATA_IN
 
-at 0x00000064 : */     0x19000000,0x000000c8,
+at 0x00000062 : */     0x19000000,0x000000c8,
 /*
        MOVE FROM dsa_datain+0x00a8, WHEN DATA_IN
 
-at 0x00000066 : */     0x19000000,0x000000d0,
+at 0x00000064 : */     0x19000000,0x000000d0,
 /*
        MOVE FROM dsa_datain+0x00b0, WHEN DATA_IN
 
-at 0x00000068 : */     0x19000000,0x000000d8,
+at 0x00000066 : */     0x19000000,0x000000d8,
 /*
        MOVE FROM dsa_datain+0x00b8, WHEN DATA_IN
 
-at 0x0000006a : */     0x19000000,0x000000e0,
+at 0x00000068 : */     0x19000000,0x000000e0,
 /*
        MOVE FROM dsa_datain+0x00c0, WHEN DATA_IN
 
-at 0x0000006c : */     0x19000000,0x000000e8,
+at 0x0000006a : */     0x19000000,0x000000e8,
 /*
        MOVE FROM dsa_datain+0x00c8, WHEN DATA_IN
 
-at 0x0000006e : */     0x19000000,0x000000f0,
+at 0x0000006c : */     0x19000000,0x000000f0,
 /*
        MOVE FROM dsa_datain+0x00d0, WHEN DATA_IN
 
-at 0x00000070 : */     0x19000000,0x000000f8,
+at 0x0000006e : */     0x19000000,0x000000f8,
 /*
        MOVE FROM dsa_datain+0x00d8, WHEN DATA_IN
 
-at 0x00000072 : */     0x19000000,0x00000100,
+at 0x00000070 : */     0x19000000,0x00000100,
 /*
        MOVE FROM dsa_datain+0x00e0, WHEN DATA_IN
 
-at 0x00000074 : */     0x19000000,0x00000108,
+at 0x00000072 : */     0x19000000,0x00000108,
 /*
        MOVE FROM dsa_datain+0x00e8, WHEN DATA_IN
 
-at 0x00000076 : */     0x19000000,0x00000110,
+at 0x00000074 : */     0x19000000,0x00000110,
 /*
        MOVE FROM dsa_datain+0x00f0, WHEN DATA_IN
 
-at 0x00000078 : */     0x19000000,0x00000118,
+at 0x00000076 : */     0x19000000,0x00000118,
 /*
        MOVE FROM dsa_datain+0x00f8, WHEN DATA_IN
 
-at 0x0000007a : */     0x19000000,0x00000120,
+at 0x00000078 : */     0x19000000,0x00000120,
 /*
        MOVE FROM dsa_datain+0x0100, WHEN DATA_IN
 
-at 0x0000007c : */     0x19000000,0x00000128,
+at 0x0000007a : */     0x19000000,0x00000128,
 /*
        MOVE FROM dsa_datain+0x0108, WHEN DATA_IN
 
-at 0x0000007e : */     0x19000000,0x00000130,
+at 0x0000007c : */     0x19000000,0x00000130,
 /*
        MOVE FROM dsa_datain+0x0110, WHEN DATA_IN
 
-at 0x00000080 : */     0x19000000,0x00000138,
+at 0x0000007e : */     0x19000000,0x00000138,
 /*
        MOVE FROM dsa_datain+0x0118, WHEN DATA_IN
 
-at 0x00000082 : */     0x19000000,0x00000140,
+at 0x00000080 : */     0x19000000,0x00000140,
 /*
        MOVE FROM dsa_datain+0x0120, WHEN DATA_IN
 
-at 0x00000084 : */     0x19000000,0x00000148,
+at 0x00000082 : */     0x19000000,0x00000148,
 /*
        MOVE FROM dsa_datain+0x0128, WHEN DATA_IN
 
-at 0x00000086 : */     0x19000000,0x00000150,
+at 0x00000084 : */     0x19000000,0x00000150,
 /*
        MOVE FROM dsa_datain+0x0130, WHEN DATA_IN
 
-at 0x00000088 : */     0x19000000,0x00000158,
+at 0x00000086 : */     0x19000000,0x00000158,
 /*
        MOVE FROM dsa_datain+0x0138, WHEN DATA_IN
 
-at 0x0000008a : */     0x19000000,0x00000160,
+at 0x00000088 : */     0x19000000,0x00000160,
 /*
        MOVE FROM dsa_datain+0x0140, WHEN DATA_IN
 
-at 0x0000008c : */     0x19000000,0x00000168,
+at 0x0000008a : */     0x19000000,0x00000168,
 /*
        MOVE FROM dsa_datain+0x0148, WHEN DATA_IN
 
-at 0x0000008e : */     0x19000000,0x00000170,
+at 0x0000008c : */     0x19000000,0x00000170,
 /*
        MOVE FROM dsa_datain+0x0150, WHEN DATA_IN
 
-at 0x00000090 : */     0x19000000,0x00000178,
+at 0x0000008e : */     0x19000000,0x00000178,
 /*
        MOVE FROM dsa_datain+0x0158, WHEN DATA_IN
 
-at 0x00000092 : */     0x19000000,0x00000180,
+at 0x00000090 : */     0x19000000,0x00000180,
 /*
        MOVE FROM dsa_datain+0x0160, WHEN DATA_IN
 
-at 0x00000094 : */     0x19000000,0x00000188,
+at 0x00000092 : */     0x19000000,0x00000188,
 /*
        MOVE FROM dsa_datain+0x0168, WHEN DATA_IN
 
-at 0x00000096 : */     0x19000000,0x00000190,
+at 0x00000094 : */     0x19000000,0x00000190,
 /*
        MOVE FROM dsa_datain+0x0170, WHEN DATA_IN
 
-at 0x00000098 : */     0x19000000,0x00000198,
+at 0x00000096 : */     0x19000000,0x00000198,
 /*
        MOVE FROM dsa_datain+0x0178, WHEN DATA_IN
 
-at 0x0000009a : */     0x19000000,0x000001a0,
+at 0x00000098 : */     0x19000000,0x000001a0,
 /*
        MOVE FROM dsa_datain+0x0180, WHEN DATA_IN
 
-at 0x0000009c : */     0x19000000,0x000001a8,
+at 0x0000009a : */     0x19000000,0x000001a8,
 /*
        MOVE FROM dsa_datain+0x0188, WHEN DATA_IN
 
-at 0x0000009e : */     0x19000000,0x000001b0,
+at 0x0000009c : */     0x19000000,0x000001b0,
 /*
        MOVE FROM dsa_datain+0x0190, WHEN DATA_IN
 
-at 0x000000a0 : */     0x19000000,0x000001b8,
+at 0x0000009e : */     0x19000000,0x000001b8,
 /*
        MOVE FROM dsa_datain+0x0198, WHEN DATA_IN
 
-at 0x000000a2 : */     0x19000000,0x000001c0,
+at 0x000000a0 : */     0x19000000,0x000001c0,
 /*
        MOVE FROM dsa_datain+0x01a0, WHEN DATA_IN
 
-at 0x000000a4 : */     0x19000000,0x000001c8,
+at 0x000000a2 : */     0x19000000,0x000001c8,
 /*
        MOVE FROM dsa_datain+0x01a8, WHEN DATA_IN
 
-at 0x000000a6 : */     0x19000000,0x000001d0,
+at 0x000000a4 : */     0x19000000,0x000001d0,
 /*
        MOVE FROM dsa_datain+0x01b0, WHEN DATA_IN
 
-at 0x000000a8 : */     0x19000000,0x000001d8,
+at 0x000000a6 : */     0x19000000,0x000001d8,
 /*
        MOVE FROM dsa_datain+0x01b8, WHEN DATA_IN
 
-at 0x000000aa : */     0x19000000,0x000001e0,
+at 0x000000a8 : */     0x19000000,0x000001e0,
 /*
        MOVE FROM dsa_datain+0x01c0, WHEN DATA_IN
 
-at 0x000000ac : */     0x19000000,0x000001e8,
+at 0x000000aa : */     0x19000000,0x000001e8,
 /*
        MOVE FROM dsa_datain+0x01c8, WHEN DATA_IN
 
-at 0x000000ae : */     0x19000000,0x000001f0,
+at 0x000000ac : */     0x19000000,0x000001f0,
 /*
        MOVE FROM dsa_datain+0x01d0, WHEN DATA_IN
 
-at 0x000000b0 : */     0x19000000,0x000001f8,
+at 0x000000ae : */     0x19000000,0x000001f8,
 /*
        MOVE FROM dsa_datain+0x01d8, WHEN DATA_IN
 
-at 0x000000b2 : */     0x19000000,0x00000200,
+at 0x000000b0 : */     0x19000000,0x00000200,
 /*
        MOVE FROM dsa_datain+0x01e0, WHEN DATA_IN
 
-at 0x000000b4 : */     0x19000000,0x00000208,
+at 0x000000b2 : */     0x19000000,0x00000208,
 /*
        MOVE FROM dsa_datain+0x01e8, WHEN DATA_IN
 
-at 0x000000b6 : */     0x19000000,0x00000210,
+at 0x000000b4 : */     0x19000000,0x00000210,
 /*
        MOVE FROM dsa_datain+0x01f0, WHEN DATA_IN
 
-at 0x000000b8 : */     0x19000000,0x00000218,
+at 0x000000b6 : */     0x19000000,0x00000218,
 /*
        MOVE FROM dsa_datain+0x01f8, WHEN DATA_IN
 
-at 0x000000ba : */     0x19000000,0x00000220,
+at 0x000000b8 : */     0x19000000,0x00000220,
 /*
        MOVE FROM dsa_datain+0x0200, WHEN DATA_IN
 
-at 0x000000bc : */     0x19000000,0x00000228,
+at 0x000000ba : */     0x19000000,0x00000228,
 /*
        MOVE FROM dsa_datain+0x0208, WHEN DATA_IN
 
-at 0x000000be : */     0x19000000,0x00000230,
+at 0x000000bc : */     0x19000000,0x00000230,
 /*
        MOVE FROM dsa_datain+0x0210, WHEN DATA_IN
 
-at 0x000000c0 : */     0x19000000,0x00000238,
+at 0x000000be : */     0x19000000,0x00000238,
 /*
        MOVE FROM dsa_datain+0x0218, WHEN DATA_IN
 
-at 0x000000c2 : */     0x19000000,0x00000240,
+at 0x000000c0 : */     0x19000000,0x00000240,
 /*
        MOVE FROM dsa_datain+0x0220, WHEN DATA_IN
 
-at 0x000000c4 : */     0x19000000,0x00000248,
+at 0x000000c2 : */     0x19000000,0x00000248,
 /*
        MOVE FROM dsa_datain+0x0228, WHEN DATA_IN
 
-at 0x000000c6 : */     0x19000000,0x00000250,
+at 0x000000c4 : */     0x19000000,0x00000250,
 /*
        MOVE FROM dsa_datain+0x0230, WHEN DATA_IN
 
-at 0x000000c8 : */     0x19000000,0x00000258,
+at 0x000000c6 : */     0x19000000,0x00000258,
 /*
        MOVE FROM dsa_datain+0x0238, WHEN DATA_IN
 
-at 0x000000ca : */     0x19000000,0x00000260,
+at 0x000000c8 : */     0x19000000,0x00000260,
 /*
        MOVE FROM dsa_datain+0x0240, WHEN DATA_IN
 
-at 0x000000cc : */     0x19000000,0x00000268,
+at 0x000000ca : */     0x19000000,0x00000268,
 /*
        MOVE FROM dsa_datain+0x0248, WHEN DATA_IN
 
-at 0x000000ce : */     0x19000000,0x00000270,
+at 0x000000cc : */     0x19000000,0x00000270,
 /*
        MOVE FROM dsa_datain+0x0250, WHEN DATA_IN
 
-at 0x000000d0 : */     0x19000000,0x00000278,
+at 0x000000ce : */     0x19000000,0x00000278,
 /*
        MOVE FROM dsa_datain+0x0258, WHEN DATA_IN
 
-at 0x000000d2 : */     0x19000000,0x00000280,
+at 0x000000d0 : */     0x19000000,0x00000280,
 /*
        MOVE FROM dsa_datain+0x0260, WHEN DATA_IN
 
-at 0x000000d4 : */     0x19000000,0x00000288,
+at 0x000000d2 : */     0x19000000,0x00000288,
 /*
        MOVE FROM dsa_datain+0x0268, WHEN DATA_IN
 
-at 0x000000d6 : */     0x19000000,0x00000290,
+at 0x000000d4 : */     0x19000000,0x00000290,
 /*
        MOVE FROM dsa_datain+0x0270, WHEN DATA_IN
 
-at 0x000000d8 : */     0x19000000,0x00000298,
+at 0x000000d6 : */     0x19000000,0x00000298,
 /*
        MOVE FROM dsa_datain+0x0278, WHEN DATA_IN
 
-at 0x000000da : */     0x19000000,0x000002a0,
+at 0x000000d8 : */     0x19000000,0x000002a0,
 /*
        MOVE FROM dsa_datain+0x0280, WHEN DATA_IN
 
-at 0x000000dc : */     0x19000000,0x000002a8,
+at 0x000000da : */     0x19000000,0x000002a8,
 /*
        MOVE FROM dsa_datain+0x0288, WHEN DATA_IN
 
-at 0x000000de : */     0x19000000,0x000002b0,
+at 0x000000dc : */     0x19000000,0x000002b0,
 /*
        MOVE FROM dsa_datain+0x0290, WHEN DATA_IN
 
-at 0x000000e0 : */     0x19000000,0x000002b8,
+at 0x000000de : */     0x19000000,0x000002b8,
 /*
        MOVE FROM dsa_datain+0x0298, WHEN DATA_IN
 
-at 0x000000e2 : */     0x19000000,0x000002c0,
+at 0x000000e0 : */     0x19000000,0x000002c0,
 /*
        MOVE FROM dsa_datain+0x02a0, WHEN DATA_IN
 
-at 0x000000e4 : */     0x19000000,0x000002c8,
+at 0x000000e2 : */     0x19000000,0x000002c8,
 /*
        MOVE FROM dsa_datain+0x02a8, WHEN DATA_IN
 
-at 0x000000e6 : */     0x19000000,0x000002d0,
+at 0x000000e4 : */     0x19000000,0x000002d0,
 /*
        MOVE FROM dsa_datain+0x02b0, WHEN DATA_IN
 
-at 0x000000e8 : */     0x19000000,0x000002d8,
+at 0x000000e6 : */     0x19000000,0x000002d8,
 /*
        MOVE FROM dsa_datain+0x02b8, WHEN DATA_IN
 
-at 0x000000ea : */     0x19000000,0x000002e0,
+at 0x000000e8 : */     0x19000000,0x000002e0,
 /*
        MOVE FROM dsa_datain+0x02c0, WHEN DATA_IN
 
-at 0x000000ec : */     0x19000000,0x000002e8,
+at 0x000000ea : */     0x19000000,0x000002e8,
 /*
        MOVE FROM dsa_datain+0x02c8, WHEN DATA_IN
 
-at 0x000000ee : */     0x19000000,0x000002f0,
+at 0x000000ec : */     0x19000000,0x000002f0,
 /*
        MOVE FROM dsa_datain+0x02d0, WHEN DATA_IN
 
-at 0x000000f0 : */     0x19000000,0x000002f8,
+at 0x000000ee : */     0x19000000,0x000002f8,
 /*
        MOVE FROM dsa_datain+0x02d8, WHEN DATA_IN
 
-at 0x000000f2 : */     0x19000000,0x00000300,
+at 0x000000f0 : */     0x19000000,0x00000300,
 /*
        MOVE FROM dsa_datain+0x02e0, WHEN DATA_IN
 
-at 0x000000f4 : */     0x19000000,0x00000308,
+at 0x000000f2 : */     0x19000000,0x00000308,
 /*
        MOVE FROM dsa_datain+0x02e8, WHEN DATA_IN
 
-at 0x000000f6 : */     0x19000000,0x00000310,
+at 0x000000f4 : */     0x19000000,0x00000310,
 /*
        MOVE FROM dsa_datain+0x02f0, WHEN DATA_IN
 
-at 0x000000f8 : */     0x19000000,0x00000318,
+at 0x000000f6 : */     0x19000000,0x00000318,
 /*
        MOVE FROM dsa_datain+0x02f8, WHEN DATA_IN
 
-at 0x000000fa : */     0x19000000,0x00000320,
+at 0x000000f8 : */     0x19000000,0x00000320,
 /*
        MOVE FROM dsa_datain+0x0300, WHEN DATA_IN
 
-at 0x000000fc : */     0x19000000,0x00000328,
+at 0x000000fa : */     0x19000000,0x00000328,
 /*
        MOVE FROM dsa_datain+0x0308, WHEN DATA_IN
 
-at 0x000000fe : */     0x19000000,0x00000330,
+at 0x000000fc : */     0x19000000,0x00000330,
 /*
        MOVE FROM dsa_datain+0x0310, WHEN DATA_IN
 
-at 0x00000100 : */     0x19000000,0x00000338,
+at 0x000000fe : */     0x19000000,0x00000338,
 /*
        MOVE FROM dsa_datain+0x0318, WHEN DATA_IN
 
-at 0x00000102 : */     0x19000000,0x00000340,
+at 0x00000100 : */     0x19000000,0x00000340,
 /*
        MOVE FROM dsa_datain+0x0320, WHEN DATA_IN
 
-at 0x00000104 : */     0x19000000,0x00000348,
+at 0x00000102 : */     0x19000000,0x00000348,
 /*
        MOVE FROM dsa_datain+0x0328, WHEN DATA_IN
 
-at 0x00000106 : */     0x19000000,0x00000350,
+at 0x00000104 : */     0x19000000,0x00000350,
 /*
        MOVE FROM dsa_datain+0x0330, WHEN DATA_IN
 
-at 0x00000108 : */     0x19000000,0x00000358,
+at 0x00000106 : */     0x19000000,0x00000358,
 /*
        MOVE FROM dsa_datain+0x0338, WHEN DATA_IN
 
-at 0x0000010a : */     0x19000000,0x00000360,
+at 0x00000108 : */     0x19000000,0x00000360,
 /*
        MOVE FROM dsa_datain+0x0340, WHEN DATA_IN
 
-at 0x0000010c : */     0x19000000,0x00000368,
+at 0x0000010a : */     0x19000000,0x00000368,
 /*
        MOVE FROM dsa_datain+0x0348, WHEN DATA_IN
 
-at 0x0000010e : */     0x19000000,0x00000370,
+at 0x0000010c : */     0x19000000,0x00000370,
 /*
        MOVE FROM dsa_datain+0x0350, WHEN DATA_IN
 
-at 0x00000110 : */     0x19000000,0x00000378,
+at 0x0000010e : */     0x19000000,0x00000378,
 /*
        MOVE FROM dsa_datain+0x0358, WHEN DATA_IN
 
-at 0x00000112 : */     0x19000000,0x00000380,
+at 0x00000110 : */     0x19000000,0x00000380,
 /*
        MOVE FROM dsa_datain+0x0360, WHEN DATA_IN
 
-at 0x00000114 : */     0x19000000,0x00000388,
+at 0x00000112 : */     0x19000000,0x00000388,
 /*
        MOVE FROM dsa_datain+0x0368, WHEN DATA_IN
 
-at 0x00000116 : */     0x19000000,0x00000390,
+at 0x00000114 : */     0x19000000,0x00000390,
 /*
        MOVE FROM dsa_datain+0x0370, WHEN DATA_IN
 
-at 0x00000118 : */     0x19000000,0x00000398,
+at 0x00000116 : */     0x19000000,0x00000398,
 /*
        MOVE FROM dsa_datain+0x0378, WHEN DATA_IN
 
-at 0x0000011a : */     0x19000000,0x000003a0,
+at 0x00000118 : */     0x19000000,0x000003a0,
 /*
        MOVE FROM dsa_datain+0x0380, WHEN DATA_IN
 
-at 0x0000011c : */     0x19000000,0x000003a8,
+at 0x0000011a : */     0x19000000,0x000003a8,
 /*
        MOVE FROM dsa_datain+0x0388, WHEN DATA_IN
 
-at 0x0000011e : */     0x19000000,0x000003b0,
+at 0x0000011c : */     0x19000000,0x000003b0,
 /*
        MOVE FROM dsa_datain+0x0390, WHEN DATA_IN
 
-at 0x00000120 : */     0x19000000,0x000003b8,
+at 0x0000011e : */     0x19000000,0x000003b8,
 /*
        MOVE FROM dsa_datain+0x0398, WHEN DATA_IN
 
-at 0x00000122 : */     0x19000000,0x000003c0,
+at 0x00000120 : */     0x19000000,0x000003c0,
 /*
        MOVE FROM dsa_datain+0x03a0, WHEN DATA_IN
 
-at 0x00000124 : */     0x19000000,0x000003c8,
+at 0x00000122 : */     0x19000000,0x000003c8,
 /*
        MOVE FROM dsa_datain+0x03a8, WHEN DATA_IN
 
-at 0x00000126 : */     0x19000000,0x000003d0,
+at 0x00000124 : */     0x19000000,0x000003d0,
 /*
        MOVE FROM dsa_datain+0x03b0, WHEN DATA_IN
 
-at 0x00000128 : */     0x19000000,0x000003d8,
+at 0x00000126 : */     0x19000000,0x000003d8,
 /*
        MOVE FROM dsa_datain+0x03b8, WHEN DATA_IN
 
-at 0x0000012a : */     0x19000000,0x000003e0,
+at 0x00000128 : */     0x19000000,0x000003e0,
 /*
        MOVE FROM dsa_datain+0x03c0, WHEN DATA_IN
 
-at 0x0000012c : */     0x19000000,0x000003e8,
+at 0x0000012a : */     0x19000000,0x000003e8,
 /*
        MOVE FROM dsa_datain+0x03c8, WHEN DATA_IN
 
-at 0x0000012e : */     0x19000000,0x000003f0,
+at 0x0000012c : */     0x19000000,0x000003f0,
 /*
        MOVE FROM dsa_datain+0x03d0, WHEN DATA_IN
 
-at 0x00000130 : */     0x19000000,0x000003f8,
+at 0x0000012e : */     0x19000000,0x000003f8,
 /*
        MOVE FROM dsa_datain+0x03d8, WHEN DATA_IN
 
-at 0x00000132 : */     0x19000000,0x00000400,
+at 0x00000130 : */     0x19000000,0x00000400,
 /*
        MOVE FROM dsa_datain+0x03e0, WHEN DATA_IN
 
-at 0x00000134 : */     0x19000000,0x00000408,
+at 0x00000132 : */     0x19000000,0x00000408,
 /*
        MOVE FROM dsa_datain+0x03e8, WHEN DATA_IN
 
-at 0x00000136 : */     0x19000000,0x00000410,
+at 0x00000134 : */     0x19000000,0x00000410,
 /*
        MOVE FROM dsa_datain+0x03f0, WHEN DATA_IN
 
-at 0x00000138 : */     0x19000000,0x00000418,
+at 0x00000136 : */     0x19000000,0x00000418,
 /*
        MOVE FROM dsa_datain+0x03f8, WHEN DATA_IN
 
-at 0x0000013a : */     0x19000000,0x00000420,
+at 0x00000138 : */     0x19000000,0x00000420,
 /*
        JUMP end_data_trans
 
-at 0x0000013c : */     0x80080000,0x00000908,
+at 0x0000013a : */     0x80080000,0x00000900,
 /*
 
 output_data:
        MOVE SCRATCH0 | had_dataout TO SCRATCH0
 
-at 0x0000013e : */     0x7a341000,0x00000000,
+at 0x0000013c : */     0x7a341000,0x00000000,
 /*
 ENTRY patch_output_data
 patch_output_data:
        JUMP 0
 
-at 0x00000140 : */     0x80080000,0x00000000,
+at 0x0000013e : */     0x80080000,0x00000000,
 /*
        MOVE FROM dsa_dataout+0x0000, WHEN DATA_OUT
 
-at 0x00000142 : */     0x18000000,0x00000428,
+at 0x00000140 : */     0x18000000,0x00000428,
 /*
        MOVE FROM dsa_dataout+0x0008, WHEN DATA_OUT
 
-at 0x00000144 : */     0x18000000,0x00000430,
+at 0x00000142 : */     0x18000000,0x00000430,
 /*
        MOVE FROM dsa_dataout+0x0010, WHEN DATA_OUT
 
-at 0x00000146 : */     0x18000000,0x00000438,
+at 0x00000144 : */     0x18000000,0x00000438,
 /*
        MOVE FROM dsa_dataout+0x0018, WHEN DATA_OUT
 
-at 0x00000148 : */     0x18000000,0x00000440,
+at 0x00000146 : */     0x18000000,0x00000440,
 /*
        MOVE FROM dsa_dataout+0x0020, WHEN DATA_OUT
 
-at 0x0000014a : */     0x18000000,0x00000448,
+at 0x00000148 : */     0x18000000,0x00000448,
 /*
        MOVE FROM dsa_dataout+0x0028, WHEN DATA_OUT
 
-at 0x0000014c : */     0x18000000,0x00000450,
+at 0x0000014a : */     0x18000000,0x00000450,
 /*
        MOVE FROM dsa_dataout+0x0030, WHEN DATA_OUT
 
-at 0x0000014e : */     0x18000000,0x00000458,
+at 0x0000014c : */     0x18000000,0x00000458,
 /*
        MOVE FROM dsa_dataout+0x0038, WHEN DATA_OUT
 
-at 0x00000150 : */     0x18000000,0x00000460,
+at 0x0000014e : */     0x18000000,0x00000460,
 /*
        MOVE FROM dsa_dataout+0x0040, WHEN DATA_OUT
 
-at 0x00000152 : */     0x18000000,0x00000468,
+at 0x00000150 : */     0x18000000,0x00000468,
 /*
        MOVE FROM dsa_dataout+0x0048, WHEN DATA_OUT
 
-at 0x00000154 : */     0x18000000,0x00000470,
+at 0x00000152 : */     0x18000000,0x00000470,
 /*
        MOVE FROM dsa_dataout+0x0050, WHEN DATA_OUT
 
-at 0x00000156 : */     0x18000000,0x00000478,
+at 0x00000154 : */     0x18000000,0x00000478,
 /*
        MOVE FROM dsa_dataout+0x0058, WHEN DATA_OUT
 
-at 0x00000158 : */     0x18000000,0x00000480,
+at 0x00000156 : */     0x18000000,0x00000480,
 /*
        MOVE FROM dsa_dataout+0x0060, WHEN DATA_OUT
 
-at 0x0000015a : */     0x18000000,0x00000488,
+at 0x00000158 : */     0x18000000,0x00000488,
 /*
        MOVE FROM dsa_dataout+0x0068, WHEN DATA_OUT
 
-at 0x0000015c : */     0x18000000,0x00000490,
+at 0x0000015a : */     0x18000000,0x00000490,
 /*
        MOVE FROM dsa_dataout+0x0070, WHEN DATA_OUT
 
-at 0x0000015e : */     0x18000000,0x00000498,
+at 0x0000015c : */     0x18000000,0x00000498,
 /*
        MOVE FROM dsa_dataout+0x0078, WHEN DATA_OUT
 
-at 0x00000160 : */     0x18000000,0x000004a0,
+at 0x0000015e : */     0x18000000,0x000004a0,
 /*
        MOVE FROM dsa_dataout+0x0080, WHEN DATA_OUT
 
-at 0x00000162 : */     0x18000000,0x000004a8,
+at 0x00000160 : */     0x18000000,0x000004a8,
 /*
        MOVE FROM dsa_dataout+0x0088, WHEN DATA_OUT
 
-at 0x00000164 : */     0x18000000,0x000004b0,
+at 0x00000162 : */     0x18000000,0x000004b0,
 /*
        MOVE FROM dsa_dataout+0x0090, WHEN DATA_OUT
 
-at 0x00000166 : */     0x18000000,0x000004b8,
+at 0x00000164 : */     0x18000000,0x000004b8,
 /*
        MOVE FROM dsa_dataout+0x0098, WHEN DATA_OUT
 
-at 0x00000168 : */     0x18000000,0x000004c0,
+at 0x00000166 : */     0x18000000,0x000004c0,
 /*
        MOVE FROM dsa_dataout+0x00a0, WHEN DATA_OUT
 
-at 0x0000016a : */     0x18000000,0x000004c8,
+at 0x00000168 : */     0x18000000,0x000004c8,
 /*
        MOVE FROM dsa_dataout+0x00a8, WHEN DATA_OUT
 
-at 0x0000016c : */     0x18000000,0x000004d0,
+at 0x0000016a : */     0x18000000,0x000004d0,
 /*
        MOVE FROM dsa_dataout+0x00b0, WHEN DATA_OUT
 
-at 0x0000016e : */     0x18000000,0x000004d8,
+at 0x0000016c : */     0x18000000,0x000004d8,
 /*
        MOVE FROM dsa_dataout+0x00b8, WHEN DATA_OUT
 
-at 0x00000170 : */     0x18000000,0x000004e0,
+at 0x0000016e : */     0x18000000,0x000004e0,
 /*
        MOVE FROM dsa_dataout+0x00c0, WHEN DATA_OUT
 
-at 0x00000172 : */     0x18000000,0x000004e8,
+at 0x00000170 : */     0x18000000,0x000004e8,
 /*
        MOVE FROM dsa_dataout+0x00c8, WHEN DATA_OUT
 
-at 0x00000174 : */     0x18000000,0x000004f0,
+at 0x00000172 : */     0x18000000,0x000004f0,
 /*
        MOVE FROM dsa_dataout+0x00d0, WHEN DATA_OUT
 
-at 0x00000176 : */     0x18000000,0x000004f8,
+at 0x00000174 : */     0x18000000,0x000004f8,
 /*
        MOVE FROM dsa_dataout+0x00d8, WHEN DATA_OUT
 
-at 0x00000178 : */     0x18000000,0x00000500,
+at 0x00000176 : */     0x18000000,0x00000500,
 /*
        MOVE FROM dsa_dataout+0x00e0, WHEN DATA_OUT
 
-at 0x0000017a : */     0x18000000,0x00000508,
+at 0x00000178 : */     0x18000000,0x00000508,
 /*
        MOVE FROM dsa_dataout+0x00e8, WHEN DATA_OUT
 
-at 0x0000017c : */     0x18000000,0x00000510,
+at 0x0000017a : */     0x18000000,0x00000510,
 /*
        MOVE FROM dsa_dataout+0x00f0, WHEN DATA_OUT
 
-at 0x0000017e : */     0x18000000,0x00000518,
+at 0x0000017c : */     0x18000000,0x00000518,
 /*
        MOVE FROM dsa_dataout+0x00f8, WHEN DATA_OUT
 
-at 0x00000180 : */     0x18000000,0x00000520,
+at 0x0000017e : */     0x18000000,0x00000520,
 /*
        MOVE FROM dsa_dataout+0x0100, WHEN DATA_OUT
 
-at 0x00000182 : */     0x18000000,0x00000528,
+at 0x00000180 : */     0x18000000,0x00000528,
 /*
        MOVE FROM dsa_dataout+0x0108, WHEN DATA_OUT
 
-at 0x00000184 : */     0x18000000,0x00000530,
+at 0x00000182 : */     0x18000000,0x00000530,
 /*
        MOVE FROM dsa_dataout+0x0110, WHEN DATA_OUT
 
-at 0x00000186 : */     0x18000000,0x00000538,
+at 0x00000184 : */     0x18000000,0x00000538,
 /*
        MOVE FROM dsa_dataout+0x0118, WHEN DATA_OUT
 
-at 0x00000188 : */     0x18000000,0x00000540,
+at 0x00000186 : */     0x18000000,0x00000540,
 /*
        MOVE FROM dsa_dataout+0x0120, WHEN DATA_OUT
 
-at 0x0000018a : */     0x18000000,0x00000548,
+at 0x00000188 : */     0x18000000,0x00000548,
 /*
        MOVE FROM dsa_dataout+0x0128, WHEN DATA_OUT
 
-at 0x0000018c : */     0x18000000,0x00000550,
+at 0x0000018a : */     0x18000000,0x00000550,
 /*
        MOVE FROM dsa_dataout+0x0130, WHEN DATA_OUT
 
-at 0x0000018e : */     0x18000000,0x00000558,
+at 0x0000018c : */     0x18000000,0x00000558,
 /*
        MOVE FROM dsa_dataout+0x0138, WHEN DATA_OUT
 
-at 0x00000190 : */     0x18000000,0x00000560,
+at 0x0000018e : */     0x18000000,0x00000560,
 /*
        MOVE FROM dsa_dataout+0x0140, WHEN DATA_OUT
 
-at 0x00000192 : */     0x18000000,0x00000568,
+at 0x00000190 : */     0x18000000,0x00000568,
 /*
        MOVE FROM dsa_dataout+0x0148, WHEN DATA_OUT
 
-at 0x00000194 : */     0x18000000,0x00000570,
+at 0x00000192 : */     0x18000000,0x00000570,
 /*
        MOVE FROM dsa_dataout+0x0150, WHEN DATA_OUT
 
-at 0x00000196 : */     0x18000000,0x00000578,
+at 0x00000194 : */     0x18000000,0x00000578,
 /*
        MOVE FROM dsa_dataout+0x0158, WHEN DATA_OUT
 
-at 0x00000198 : */     0x18000000,0x00000580,
+at 0x00000196 : */     0x18000000,0x00000580,
 /*
        MOVE FROM dsa_dataout+0x0160, WHEN DATA_OUT
 
-at 0x0000019a : */     0x18000000,0x00000588,
+at 0x00000198 : */     0x18000000,0x00000588,
 /*
        MOVE FROM dsa_dataout+0x0168, WHEN DATA_OUT
 
-at 0x0000019c : */     0x18000000,0x00000590,
+at 0x0000019a : */     0x18000000,0x00000590,
 /*
        MOVE FROM dsa_dataout+0x0170, WHEN DATA_OUT
 
-at 0x0000019e : */     0x18000000,0x00000598,
+at 0x0000019c : */     0x18000000,0x00000598,
 /*
        MOVE FROM dsa_dataout+0x0178, WHEN DATA_OUT
 
-at 0x000001a0 : */     0x18000000,0x000005a0,
+at 0x0000019e : */     0x18000000,0x000005a0,
 /*
        MOVE FROM dsa_dataout+0x0180, WHEN DATA_OUT
 
-at 0x000001a2 : */     0x18000000,0x000005a8,
+at 0x000001a0 : */     0x18000000,0x000005a8,
 /*
        MOVE FROM dsa_dataout+0x0188, WHEN DATA_OUT
 
-at 0x000001a4 : */     0x18000000,0x000005b0,
+at 0x000001a2 : */     0x18000000,0x000005b0,
 /*
        MOVE FROM dsa_dataout+0x0190, WHEN DATA_OUT
 
-at 0x000001a6 : */     0x18000000,0x000005b8,
+at 0x000001a4 : */     0x18000000,0x000005b8,
 /*
        MOVE FROM dsa_dataout+0x0198, WHEN DATA_OUT
 
-at 0x000001a8 : */     0x18000000,0x000005c0,
+at 0x000001a6 : */     0x18000000,0x000005c0,
 /*
        MOVE FROM dsa_dataout+0x01a0, WHEN DATA_OUT
 
-at 0x000001aa : */     0x18000000,0x000005c8,
+at 0x000001a8 : */     0x18000000,0x000005c8,
 /*
        MOVE FROM dsa_dataout+0x01a8, WHEN DATA_OUT
 
-at 0x000001ac : */     0x18000000,0x000005d0,
+at 0x000001aa : */     0x18000000,0x000005d0,
 /*
        MOVE FROM dsa_dataout+0x01b0, WHEN DATA_OUT
 
-at 0x000001ae : */     0x18000000,0x000005d8,
+at 0x000001ac : */     0x18000000,0x000005d8,
 /*
        MOVE FROM dsa_dataout+0x01b8, WHEN DATA_OUT
 
-at 0x000001b0 : */     0x18000000,0x000005e0,
+at 0x000001ae : */     0x18000000,0x000005e0,
 /*
        MOVE FROM dsa_dataout+0x01c0, WHEN DATA_OUT
 
-at 0x000001b2 : */     0x18000000,0x000005e8,
+at 0x000001b0 : */     0x18000000,0x000005e8,
 /*
        MOVE FROM dsa_dataout+0x01c8, WHEN DATA_OUT
 
-at 0x000001b4 : */     0x18000000,0x000005f0,
+at 0x000001b2 : */     0x18000000,0x000005f0,
 /*
        MOVE FROM dsa_dataout+0x01d0, WHEN DATA_OUT
 
-at 0x000001b6 : */     0x18000000,0x000005f8,
+at 0x000001b4 : */     0x18000000,0x000005f8,
 /*
        MOVE FROM dsa_dataout+0x01d8, WHEN DATA_OUT
 
-at 0x000001b8 : */     0x18000000,0x00000600,
+at 0x000001b6 : */     0x18000000,0x00000600,
 /*
        MOVE FROM dsa_dataout+0x01e0, WHEN DATA_OUT
 
-at 0x000001ba : */     0x18000000,0x00000608,
+at 0x000001b8 : */     0x18000000,0x00000608,
 /*
        MOVE FROM dsa_dataout+0x01e8, WHEN DATA_OUT
 
-at 0x000001bc : */     0x18000000,0x00000610,
+at 0x000001ba : */     0x18000000,0x00000610,
 /*
        MOVE FROM dsa_dataout+0x01f0, WHEN DATA_OUT
 
-at 0x000001be : */     0x18000000,0x00000618,
+at 0x000001bc : */     0x18000000,0x00000618,
 /*
        MOVE FROM dsa_dataout+0x01f8, WHEN DATA_OUT
 
-at 0x000001c0 : */     0x18000000,0x00000620,
+at 0x000001be : */     0x18000000,0x00000620,
 /*
        MOVE FROM dsa_dataout+0x0200, WHEN DATA_OUT
 
-at 0x000001c2 : */     0x18000000,0x00000628,
+at 0x000001c0 : */     0x18000000,0x00000628,
 /*
        MOVE FROM dsa_dataout+0x0208, WHEN DATA_OUT
 
-at 0x000001c4 : */     0x18000000,0x00000630,
+at 0x000001c2 : */     0x18000000,0x00000630,
 /*
        MOVE FROM dsa_dataout+0x0210, WHEN DATA_OUT
 
-at 0x000001c6 : */     0x18000000,0x00000638,
+at 0x000001c4 : */     0x18000000,0x00000638,
 /*
        MOVE FROM dsa_dataout+0x0218, WHEN DATA_OUT
 
-at 0x000001c8 : */     0x18000000,0x00000640,
+at 0x000001c6 : */     0x18000000,0x00000640,
 /*
        MOVE FROM dsa_dataout+0x0220, WHEN DATA_OUT
 
-at 0x000001ca : */     0x18000000,0x00000648,
+at 0x000001c8 : */     0x18000000,0x00000648,
 /*
        MOVE FROM dsa_dataout+0x0228, WHEN DATA_OUT
 
-at 0x000001cc : */     0x18000000,0x00000650,
+at 0x000001ca : */     0x18000000,0x00000650,
 /*
        MOVE FROM dsa_dataout+0x0230, WHEN DATA_OUT
 
-at 0x000001ce : */     0x18000000,0x00000658,
+at 0x000001cc : */     0x18000000,0x00000658,
 /*
        MOVE FROM dsa_dataout+0x0238, WHEN DATA_OUT
 
-at 0x000001d0 : */     0x18000000,0x00000660,
+at 0x000001ce : */     0x18000000,0x00000660,
 /*
        MOVE FROM dsa_dataout+0x0240, WHEN DATA_OUT
 
-at 0x000001d2 : */     0x18000000,0x00000668,
+at 0x000001d0 : */     0x18000000,0x00000668,
 /*
        MOVE FROM dsa_dataout+0x0248, WHEN DATA_OUT
 
-at 0x000001d4 : */     0x18000000,0x00000670,
+at 0x000001d2 : */     0x18000000,0x00000670,
 /*
        MOVE FROM dsa_dataout+0x0250, WHEN DATA_OUT
 
-at 0x000001d6 : */     0x18000000,0x00000678,
+at 0x000001d4 : */     0x18000000,0x00000678,
 /*
        MOVE FROM dsa_dataout+0x0258, WHEN DATA_OUT
 
-at 0x000001d8 : */     0x18000000,0x00000680,
+at 0x000001d6 : */     0x18000000,0x00000680,
 /*
        MOVE FROM dsa_dataout+0x0260, WHEN DATA_OUT
 
-at 0x000001da : */     0x18000000,0x00000688,
+at 0x000001d8 : */     0x18000000,0x00000688,
 /*
        MOVE FROM dsa_dataout+0x0268, WHEN DATA_OUT
 
-at 0x000001dc : */     0x18000000,0x00000690,
+at 0x000001da : */     0x18000000,0x00000690,
 /*
        MOVE FROM dsa_dataout+0x0270, WHEN DATA_OUT
 
-at 0x000001de : */     0x18000000,0x00000698,
+at 0x000001dc : */     0x18000000,0x00000698,
 /*
        MOVE FROM dsa_dataout+0x0278, WHEN DATA_OUT
 
-at 0x000001e0 : */     0x18000000,0x000006a0,
+at 0x000001de : */     0x18000000,0x000006a0,
 /*
        MOVE FROM dsa_dataout+0x0280, WHEN DATA_OUT
 
-at 0x000001e2 : */     0x18000000,0x000006a8,
+at 0x000001e0 : */     0x18000000,0x000006a8,
 /*
        MOVE FROM dsa_dataout+0x0288, WHEN DATA_OUT
 
-at 0x000001e4 : */     0x18000000,0x000006b0,
+at 0x000001e2 : */     0x18000000,0x000006b0,
 /*
        MOVE FROM dsa_dataout+0x0290, WHEN DATA_OUT
 
-at 0x000001e6 : */     0x18000000,0x000006b8,
+at 0x000001e4 : */     0x18000000,0x000006b8,
 /*
        MOVE FROM dsa_dataout+0x0298, WHEN DATA_OUT
 
-at 0x000001e8 : */     0x18000000,0x000006c0,
+at 0x000001e6 : */     0x18000000,0x000006c0,
 /*
        MOVE FROM dsa_dataout+0x02a0, WHEN DATA_OUT
 
-at 0x000001ea : */     0x18000000,0x000006c8,
+at 0x000001e8 : */     0x18000000,0x000006c8,
 /*
        MOVE FROM dsa_dataout+0x02a8, WHEN DATA_OUT
 
-at 0x000001ec : */     0x18000000,0x000006d0,
+at 0x000001ea : */     0x18000000,0x000006d0,
 /*
        MOVE FROM dsa_dataout+0x02b0, WHEN DATA_OUT
 
-at 0x000001ee : */     0x18000000,0x000006d8,
+at 0x000001ec : */     0x18000000,0x000006d8,
 /*
        MOVE FROM dsa_dataout+0x02b8, WHEN DATA_OUT
 
-at 0x000001f0 : */     0x18000000,0x000006e0,
+at 0x000001ee : */     0x18000000,0x000006e0,
 /*
        MOVE FROM dsa_dataout+0x02c0, WHEN DATA_OUT
 
-at 0x000001f2 : */     0x18000000,0x000006e8,
+at 0x000001f0 : */     0x18000000,0x000006e8,
 /*
        MOVE FROM dsa_dataout+0x02c8, WHEN DATA_OUT
 
-at 0x000001f4 : */     0x18000000,0x000006f0,
+at 0x000001f2 : */     0x18000000,0x000006f0,
 /*
        MOVE FROM dsa_dataout+0x02d0, WHEN DATA_OUT
 
-at 0x000001f6 : */     0x18000000,0x000006f8,
+at 0x000001f4 : */     0x18000000,0x000006f8,
 /*
        MOVE FROM dsa_dataout+0x02d8, WHEN DATA_OUT
 
-at 0x000001f8 : */     0x18000000,0x00000700,
+at 0x000001f6 : */     0x18000000,0x00000700,
 /*
        MOVE FROM dsa_dataout+0x02e0, WHEN DATA_OUT
 
-at 0x000001fa : */     0x18000000,0x00000708,
+at 0x000001f8 : */     0x18000000,0x00000708,
 /*
        MOVE FROM dsa_dataout+0x02e8, WHEN DATA_OUT
 
-at 0x000001fc : */     0x18000000,0x00000710,
+at 0x000001fa : */     0x18000000,0x00000710,
 /*
        MOVE FROM dsa_dataout+0x02f0, WHEN DATA_OUT
 
-at 0x000001fe : */     0x18000000,0x00000718,
+at 0x000001fc : */     0x18000000,0x00000718,
 /*
        MOVE FROM dsa_dataout+0x02f8, WHEN DATA_OUT
 
-at 0x00000200 : */     0x18000000,0x00000720,
+at 0x000001fe : */     0x18000000,0x00000720,
 /*
        MOVE FROM dsa_dataout+0x0300, WHEN DATA_OUT
 
-at 0x00000202 : */     0x18000000,0x00000728,
+at 0x00000200 : */     0x18000000,0x00000728,
 /*
        MOVE FROM dsa_dataout+0x0308, WHEN DATA_OUT
 
-at 0x00000204 : */     0x18000000,0x00000730,
+at 0x00000202 : */     0x18000000,0x00000730,
 /*
        MOVE FROM dsa_dataout+0x0310, WHEN DATA_OUT
 
-at 0x00000206 : */     0x18000000,0x00000738,
+at 0x00000204 : */     0x18000000,0x00000738,
 /*
        MOVE FROM dsa_dataout+0x0318, WHEN DATA_OUT
 
-at 0x00000208 : */     0x18000000,0x00000740,
+at 0x00000206 : */     0x18000000,0x00000740,
 /*
        MOVE FROM dsa_dataout+0x0320, WHEN DATA_OUT
 
-at 0x0000020a : */     0x18000000,0x00000748,
+at 0x00000208 : */     0x18000000,0x00000748,
 /*
        MOVE FROM dsa_dataout+0x0328, WHEN DATA_OUT
 
-at 0x0000020c : */     0x18000000,0x00000750,
+at 0x0000020a : */     0x18000000,0x00000750,
 /*
        MOVE FROM dsa_dataout+0x0330, WHEN DATA_OUT
 
-at 0x0000020e : */     0x18000000,0x00000758,
+at 0x0000020c : */     0x18000000,0x00000758,
 /*
        MOVE FROM dsa_dataout+0x0338, WHEN DATA_OUT
 
-at 0x00000210 : */     0x18000000,0x00000760,
+at 0x0000020e : */     0x18000000,0x00000760,
 /*
        MOVE FROM dsa_dataout+0x0340, WHEN DATA_OUT
 
-at 0x00000212 : */     0x18000000,0x00000768,
+at 0x00000210 : */     0x18000000,0x00000768,
 /*
        MOVE FROM dsa_dataout+0x0348, WHEN DATA_OUT
 
-at 0x00000214 : */     0x18000000,0x00000770,
+at 0x00000212 : */     0x18000000,0x00000770,
 /*
        MOVE FROM dsa_dataout+0x0350, WHEN DATA_OUT
 
-at 0x00000216 : */     0x18000000,0x00000778,
+at 0x00000214 : */     0x18000000,0x00000778,
 /*
        MOVE FROM dsa_dataout+0x0358, WHEN DATA_OUT
 
-at 0x00000218 : */     0x18000000,0x00000780,
+at 0x00000216 : */     0x18000000,0x00000780,
 /*
        MOVE FROM dsa_dataout+0x0360, WHEN DATA_OUT
 
-at 0x0000021a : */     0x18000000,0x00000788,
+at 0x00000218 : */     0x18000000,0x00000788,
 /*
        MOVE FROM dsa_dataout+0x0368, WHEN DATA_OUT
 
-at 0x0000021c : */     0x18000000,0x00000790,
+at 0x0000021a : */     0x18000000,0x00000790,
 /*
        MOVE FROM dsa_dataout+0x0370, WHEN DATA_OUT
 
-at 0x0000021e : */     0x18000000,0x00000798,
+at 0x0000021c : */     0x18000000,0x00000798,
 /*
        MOVE FROM dsa_dataout+0x0378, WHEN DATA_OUT
 
-at 0x00000220 : */     0x18000000,0x000007a0,
+at 0x0000021e : */     0x18000000,0x000007a0,
 /*
        MOVE FROM dsa_dataout+0x0380, WHEN DATA_OUT
 
-at 0x00000222 : */     0x18000000,0x000007a8,
+at 0x00000220 : */     0x18000000,0x000007a8,
 /*
        MOVE FROM dsa_dataout+0x0388, WHEN DATA_OUT
 
-at 0x00000224 : */     0x18000000,0x000007b0,
+at 0x00000222 : */     0x18000000,0x000007b0,
 /*
        MOVE FROM dsa_dataout+0x0390, WHEN DATA_OUT
 
-at 0x00000226 : */     0x18000000,0x000007b8,
+at 0x00000224 : */     0x18000000,0x000007b8,
 /*
        MOVE FROM dsa_dataout+0x0398, WHEN DATA_OUT
 
-at 0x00000228 : */     0x18000000,0x000007c0,
+at 0x00000226 : */     0x18000000,0x000007c0,
 /*
        MOVE FROM dsa_dataout+0x03a0, WHEN DATA_OUT
 
-at 0x0000022a : */     0x18000000,0x000007c8,
+at 0x00000228 : */     0x18000000,0x000007c8,
 /*
        MOVE FROM dsa_dataout+0x03a8, WHEN DATA_OUT
 
-at 0x0000022c : */     0x18000000,0x000007d0,
+at 0x0000022a : */     0x18000000,0x000007d0,
 /*
        MOVE FROM dsa_dataout+0x03b0, WHEN DATA_OUT
 
-at 0x0000022e : */     0x18000000,0x000007d8,
+at 0x0000022c : */     0x18000000,0x000007d8,
 /*
        MOVE FROM dsa_dataout+0x03b8, WHEN DATA_OUT
 
-at 0x00000230 : */     0x18000000,0x000007e0,
+at 0x0000022e : */     0x18000000,0x000007e0,
 /*
        MOVE FROM dsa_dataout+0x03c0, WHEN DATA_OUT
 
-at 0x00000232 : */     0x18000000,0x000007e8,
+at 0x00000230 : */     0x18000000,0x000007e8,
 /*
        MOVE FROM dsa_dataout+0x03c8, WHEN DATA_OUT
 
-at 0x00000234 : */     0x18000000,0x000007f0,
+at 0x00000232 : */     0x18000000,0x000007f0,
 /*
        MOVE FROM dsa_dataout+0x03d0, WHEN DATA_OUT
 
-at 0x00000236 : */     0x18000000,0x000007f8,
+at 0x00000234 : */     0x18000000,0x000007f8,
 /*
        MOVE FROM dsa_dataout+0x03d8, WHEN DATA_OUT
 
-at 0x00000238 : */     0x18000000,0x00000800,
+at 0x00000236 : */     0x18000000,0x00000800,
 /*
        MOVE FROM dsa_dataout+0x03e0, WHEN DATA_OUT
 
-at 0x0000023a : */     0x18000000,0x00000808,
+at 0x00000238 : */     0x18000000,0x00000808,
 /*
        MOVE FROM dsa_dataout+0x03e8, WHEN DATA_OUT
 
-at 0x0000023c : */     0x18000000,0x00000810,
+at 0x0000023a : */     0x18000000,0x00000810,
 /*
        MOVE FROM dsa_dataout+0x03f0, WHEN DATA_OUT
 
-at 0x0000023e : */     0x18000000,0x00000818,
+at 0x0000023c : */     0x18000000,0x00000818,
 /*
        MOVE FROM dsa_dataout+0x03f8, WHEN DATA_OUT
 
-at 0x00000240 : */     0x18000000,0x00000820,
+at 0x0000023e : */     0x18000000,0x00000820,
 /*
 ENTRY end_data_trans
 end_data_trans:
 redo_msgin3:
        JUMP get_status, WHEN STATUS
 
-at 0x00000242 : */     0x830b0000,0x000000a0,
+at 0x00000240 : */     0x830b0000,0x00000098,
 /*
        JUMP get_msgin3, WHEN MSG_IN
 
-at 0x00000244 : */     0x870b0000,0x00000b20,
+at 0x00000242 : */     0x870b0000,0x00000b78,
 /*
        INT int_data_bad_phase
 
-at 0x00000246 : */     0x98080000,0xab93000b,
+at 0x00000244 : */     0x98080000,0xab93000b,
 /*
 
 get_msgin1:
        MOVE SCRATCH0 | had_msgin TO SCRATCH0
 
-at 0x00000248 : */     0x7a344000,0x00000000,
+at 0x00000246 : */     0x7a344000,0x00000000,
 /*
        MOVE 1, msgin_buf, WHEN MSG_IN
 
-at 0x0000024a : */     0x0f000001,0x00000000,
+at 0x00000248 : */     0x0f000001,0x00000000,
 /*
        JUMP ext_msg1, IF 0x01          ; Extended Message
 
-at 0x0000024c : */     0x800c0001,0x00000968,
+at 0x0000024a : */     0x800c0001,0x00000960,
 /*
        JUMP ignore_msg1, IF 0x02       ; Save Data Pointers
 
-at 0x0000024e : */     0x800c0002,0x00000958,
+at 0x0000024c : */     0x800c0002,0x00000950,
 /*
        JUMP ignore_msg1, IF 0x03       ; Save Restore Pointers
 
-at 0x00000250 : */     0x800c0003,0x00000958,
+at 0x0000024e : */     0x800c0003,0x00000950,
 /*
        JUMP disc1, IF 0x04             ; Disconnect
 
-at 0x00000252 : */     0x800c0004,0x000009c8,
+at 0x00000250 : */     0x800c0004,0x000009f0,
 /*
        INT int_bad_msg1
 
-at 0x00000254 : */     0x98080000,0xab930006,
+at 0x00000252 : */     0x98080000,0xab930006,
 /*
 ignore_msg1:
        CLEAR ACK
 
-at 0x00000256 : */     0x60000040,0x00000000,
+at 0x00000254 : */     0x60000040,0x00000000,
 /*
        JUMP redo_msgin1
 
-at 0x00000258 : */     0x80080000,0x00000058,
+at 0x00000256 : */     0x80080000,0x00000050,
 /*
 ext_msg1:
        MOVE SCRATCH0 | had_extmsg TO SCRATCH0
 
-at 0x0000025a : */     0x7a348000,0x00000000,
+at 0x00000258 : */     0x7a348000,0x00000000,
 /*
        CLEAR ACK
 
-at 0x0000025c : */     0x60000040,0x00000000,
+at 0x0000025a : */     0x60000040,0x00000000,
 /*
        MOVE 1, msgin_buf + 1, WHEN MSG_IN
 
-at 0x0000025e : */     0x0f000001,0x00000001,
+at 0x0000025c : */     0x0f000001,0x00000001,
 /*
-       JUMP ext_msg1a, IF 0x03
+       JUMP reject_msg1, IF NOT 0x03   ; Only handle SDTR
 
-at 0x00000260 : */     0x800c0003,0x00000990,
+at 0x0000025e : */     0x80040003,0x000009b0,
 /*
-       INT int_bad_extmsg1a
+       CLEAR ACK
 
-at 0x00000262 : */     0x98080000,0xab930000,
+at 0x00000260 : */     0x60000040,0x00000000,
+/*
+       MOVE 1, msgin_buf + 2, WHEN MSG_IN
+
+at 0x00000262 : */     0x0f000001,0x00000002,
+/*
+       JUMP reject_msg1, IF NOT 0x01   ; Only handle SDTR
+
+at 0x00000264 : */     0x80040001,0x000009b0,
 /*
-ext_msg1a:
        CLEAR ACK
 
-at 0x00000264 : */     0x60000040,0x00000000,
+at 0x00000266 : */     0x60000040,0x00000000,
 /*
-       MOVE 1, msgin_buf + 2, WHEN MSG_IN
+       MOVE 2, msgin_buf + 3, WHEN MSG_IN
 
-at 0x00000266 : */     0x0f000001,0x00000002,
+at 0x00000268 : */     0x0f000002,0x00000003,
 /*
-       JUMP ext_msg1b, IF 0x01         ; Must be SDTR
+       INT int_msg_sdtr1
+
+at 0x0000026a : */     0x98080000,0xab93000c,
+/*
+reject_msg1:
+       MOVE SCRATCH1 | did_reject TO SCRATCH1
 
-at 0x00000268 : */     0x800c0001,0x000009b0,
+at 0x0000026c : */     0x7a350100,0x00000000,
 /*
-       INT int_bad_extmsg1b
+       SET ATN
 
-at 0x0000026a : */     0x98080000,0xab930001,
+at 0x0000026e : */     0x58000008,0x00000000,
 /*
-ext_msg1b:
        CLEAR ACK
 
-at 0x0000026c : */     0x60000040,0x00000000,
+at 0x00000270 : */     0x60000040,0x00000000,
 /*
-       MOVE 2, msgin_buf + 3, WHEN MSG_IN
+       JUMP reject_msg1a, WHEN NOT MSG_IN
 
-at 0x0000026e : */     0x0f000002,0x00000003,
+at 0x00000272 : */     0x87030000,0x000009e0,
 /*
-       INT int_msg_sdtr1
+       MOVE 1, msgin_buf + 7, WHEN MSG_IN
 
-at 0x00000270 : */     0x98080000,0xab93000c,
+at 0x00000274 : */     0x0f000001,0x00000007,
+/*
+       JUMP reject_msg1
+
+at 0x00000276 : */     0x80080000,0x000009b0,
+/*
+reject_msg1a:
+       MOVE 1, msg_reject, WHEN MSG_OUT
+
+at 0x00000278 : */     0x0e000001,0x00000000,
+/*
+       JUMP redo_msgin1
+
+at 0x0000027a : */     0x80080000,0x00000050,
 /*
 disc1:
        CLEAR ACK
 
-at 0x00000272 : */     0x60000040,0x00000000,
+at 0x0000027c : */     0x60000040,0x00000000,
 /*
 ENTRY wait_disc1
 wait_disc1:
        WAIT DISCONNECT
 
-at 0x00000274 : */     0x48000000,0x00000000,
+at 0x0000027e : */     0x48000000,0x00000000,
 /*
        INT int_disc1
 
-at 0x00000276 : */     0x98080000,0xab930019,
+at 0x00000280 : */     0x98080000,0xab930019,
 /*
 ENTRY resume_msgin1a
 resume_msgin1a:
        CLEAR ACK
 
-at 0x00000278 : */     0x60000040,0x00000000,
+at 0x00000282 : */     0x60000040,0x00000000,
 /*
        JUMP redo_msgin1
 
-at 0x0000027a : */     0x80080000,0x00000058,
+at 0x00000284 : */     0x80080000,0x00000050,
 /*
 ENTRY resume_msgin1b
 resume_msgin1b:
        SET ATN
 
-at 0x0000027c : */     0x58000008,0x00000000,
+at 0x00000286 : */     0x58000008,0x00000000,
 /*
        CLEAR ACK
 
-at 0x0000027e : */     0x60000040,0x00000000,
+at 0x00000288 : */     0x60000040,0x00000000,
 /*
        INT int_no_msgout1, WHEN NOT MSG_OUT
 
-at 0x00000280 : */     0x9e030000,0xab93000f,
+at 0x0000028a : */     0x9e030000,0xab93000f,
 /*
        MOVE SCRATCH0 | had_msgout TO SCRATCH0
 
-at 0x00000282 : */     0x7a340200,0x00000000,
+at 0x0000028c : */     0x7a340200,0x00000000,
 /*
        MOVE FROM dsa_msgout, when MSG_OUT
 
-at 0x00000284 : */     0x1e000000,0x00000008,
+at 0x0000028e : */     0x1e000000,0x00000008,
 /*
        JUMP redo_msgin1
 
-at 0x00000286 : */     0x80080000,0x00000058,
+at 0x00000290 : */     0x80080000,0x00000050,
 /*
 
 get_msgin2:
        MOVE SCRATCH0 | had_msgin TO SCRATCH0
 
-at 0x00000288 : */     0x7a344000,0x00000000,
+at 0x00000292 : */     0x7a344000,0x00000000,
 /*
        MOVE 1, msgin_buf, WHEN MSG_IN
 
-at 0x0000028a : */     0x0f000001,0x00000000,
+at 0x00000294 : */     0x0f000001,0x00000000,
 /*
        JUMP ext_msg2, IF 0x01          ; Extended Message
 
-at 0x0000028c : */     0x800c0001,0x00000a68,
+at 0x00000296 : */     0x800c0001,0x00000a90,
 /*
        JUMP ignore_msg2, IF 0x02       ; Save Data Pointers
 
-at 0x0000028e : */     0x800c0002,0x00000a58,
+at 0x00000298 : */     0x800c0002,0x00000a80,
 /*
        JUMP ignore_msg2, IF 0x03       ; Save Restore Pointers
 
-at 0x00000290 : */     0x800c0003,0x00000a58,
+at 0x0000029a : */     0x800c0003,0x00000a80,
 /*
        JUMP disc2, IF 0x04             ; Disconnect
 
-at 0x00000292 : */     0x800c0004,0x00000ac8,
+at 0x0000029c : */     0x800c0004,0x00000b20,
 /*
        INT int_bad_msg2
 
-at 0x00000294 : */     0x98080000,0xab930007,
+at 0x0000029e : */     0x98080000,0xab930007,
 /*
 ignore_msg2:
        CLEAR ACK
 
-at 0x00000296 : */     0x60000040,0x00000000,
+at 0x000002a0 : */     0x60000040,0x00000000,
 /*
        JUMP redo_msgin2
 
-at 0x00000298 : */     0x80080000,0x00000078,
+at 0x000002a2 : */     0x80080000,0x00000070,
 /*
 ext_msg2:
        MOVE SCRATCH0 | had_extmsg TO SCRATCH0
 
-at 0x0000029a : */     0x7a348000,0x00000000,
+at 0x000002a4 : */     0x7a348000,0x00000000,
 /*
        CLEAR ACK
 
-at 0x0000029c : */     0x60000040,0x00000000,
+at 0x000002a6 : */     0x60000040,0x00000000,
 /*
        MOVE 1, msgin_buf + 1, WHEN MSG_IN
 
-at 0x0000029e : */     0x0f000001,0x00000001,
+at 0x000002a8 : */     0x0f000001,0x00000001,
+/*
+       JUMP reject_msg2, IF NOT 0x03   ; Only handle SDTR
+
+at 0x000002aa : */     0x80040003,0x00000ae0,
+/*
+       CLEAR ACK
+
+at 0x000002ac : */     0x60000040,0x00000000,
 /*
-       JUMP ext_msg2a, IF 0x03
+       MOVE 1, msgin_buf + 2, WHEN MSG_IN
 
-at 0x000002a0 : */     0x800c0003,0x00000a90,
+at 0x000002ae : */     0x0f000001,0x00000002,
 /*
-       INT int_bad_extmsg2a
+       JUMP reject_msg2, IF NOT 0x01   ; Only handle SDTR
 
-at 0x000002a2 : */     0x98080000,0xab930002,
+at 0x000002b0 : */     0x80040001,0x00000ae0,
 /*
-ext_msg2a:
        CLEAR ACK
 
-at 0x000002a4 : */     0x60000040,0x00000000,
+at 0x000002b2 : */     0x60000040,0x00000000,
 /*
-       MOVE 1, msgin_buf + 2, WHEN MSG_IN
+       MOVE 2, msgin_buf + 3, WHEN MSG_IN
+
+at 0x000002b4 : */     0x0f000002,0x00000003,
+/*
+       INT int_msg_sdtr2
 
-at 0x000002a6 : */     0x0f000001,0x00000002,
+at 0x000002b6 : */     0x98080000,0xab93000d,
 /*
-       JUMP ext_msg2b, IF 0x01         ; Must be SDTR
+reject_msg2:
+       MOVE SCRATCH1 | did_reject TO SCRATCH1
 
-at 0x000002a8 : */     0x800c0001,0x00000ab0,
+at 0x000002b8 : */     0x7a350100,0x00000000,
 /*
-       INT int_bad_extmsg2b
+       SET ATN
 
-at 0x000002aa : */     0x98080000,0xab930003,
+at 0x000002ba : */     0x58000008,0x00000000,
 /*
-ext_msg2b:
        CLEAR ACK
 
-at 0x000002ac : */     0x60000040,0x00000000,
+at 0x000002bc : */     0x60000040,0x00000000,
 /*
-       MOVE 2, msgin_buf + 3, WHEN MSG_IN
+       JUMP reject_msg2a, WHEN NOT MSG_IN
 
-at 0x000002ae : */     0x0f000002,0x00000003,
+at 0x000002be : */     0x87030000,0x00000b10,
 /*
-       INT int_msg_sdtr2
+       MOVE 1, msgin_buf + 7, WHEN MSG_IN
+
+at 0x000002c0 : */     0x0f000001,0x00000007,
+/*
+       JUMP reject_msg2
+
+at 0x000002c2 : */     0x80080000,0x00000ae0,
+/*
+reject_msg2a:
+       MOVE 1, msg_reject, WHEN MSG_OUT
+
+at 0x000002c4 : */     0x0e000001,0x00000000,
+/*
+       JUMP redo_msgin2
 
-at 0x000002b0 : */     0x98080000,0xab93000d,
+at 0x000002c6 : */     0x80080000,0x00000070,
 /*
 disc2:
        CLEAR ACK
 
-at 0x000002b2 : */     0x60000040,0x00000000,
+at 0x000002c8 : */     0x60000040,0x00000000,
 /*
 ENTRY wait_disc2
 wait_disc2:
        WAIT DISCONNECT
 
-at 0x000002b4 : */     0x48000000,0x00000000,
+at 0x000002ca : */     0x48000000,0x00000000,
 /*
        INT int_disc2
 
-at 0x000002b6 : */     0x98080000,0xab93001a,
+at 0x000002cc : */     0x98080000,0xab93001a,
 /*
 ENTRY resume_msgin2a
 resume_msgin2a:
        CLEAR ACK
 
-at 0x000002b8 : */     0x60000040,0x00000000,
+at 0x000002ce : */     0x60000040,0x00000000,
 /*
        JUMP redo_msgin2
 
-at 0x000002ba : */     0x80080000,0x00000078,
+at 0x000002d0 : */     0x80080000,0x00000070,
 /*
 ENTRY resume_msgin2b
 resume_msgin2b:
        SET ATN
 
-at 0x000002bc : */     0x58000008,0x00000000,
+at 0x000002d2 : */     0x58000008,0x00000000,
 /*
        CLEAR ACK
 
-at 0x000002be : */     0x60000040,0x00000000,
+at 0x000002d4 : */     0x60000040,0x00000000,
 /*
        INT int_no_msgout2, WHEN NOT MSG_OUT
 
-at 0x000002c0 : */     0x9e030000,0xab930010,
+at 0x000002d6 : */     0x9e030000,0xab930010,
 /*
        MOVE SCRATCH0 | had_msgout TO SCRATCH0
 
-at 0x000002c2 : */     0x7a340200,0x00000000,
+at 0x000002d8 : */     0x7a340200,0x00000000,
 /*
        MOVE FROM dsa_msgout, when MSG_OUT
 
-at 0x000002c4 : */     0x1e000000,0x00000008,
+at 0x000002da : */     0x1e000000,0x00000008,
 /*
        JUMP redo_msgin2
 
-at 0x000002c6 : */     0x80080000,0x00000078,
+at 0x000002dc : */     0x80080000,0x00000070,
 /*
 
 get_msgin3:
        MOVE SCRATCH0 | had_msgin TO SCRATCH0
 
-at 0x000002c8 : */     0x7a344000,0x00000000,
+at 0x000002de : */     0x7a344000,0x00000000,
 /*
        MOVE 1, msgin_buf, WHEN MSG_IN
 
-at 0x000002ca : */     0x0f000001,0x00000000,
+at 0x000002e0 : */     0x0f000001,0x00000000,
 /*
        JUMP ext_msg3, IF 0x01          ; Extended Message
 
-at 0x000002cc : */     0x800c0001,0x00000b68,
+at 0x000002e2 : */     0x800c0001,0x00000bc0,
 /*
        JUMP ignore_msg3, IF 0x02       ; Save Data Pointers
 
-at 0x000002ce : */     0x800c0002,0x00000b58,
+at 0x000002e4 : */     0x800c0002,0x00000bb0,
 /*
        JUMP ignore_msg3, IF 0x03       ; Save Restore Pointers
 
-at 0x000002d0 : */     0x800c0003,0x00000b58,
+at 0x000002e6 : */     0x800c0003,0x00000bb0,
 /*
        JUMP disc3, IF 0x04             ; Disconnect
 
-at 0x000002d2 : */     0x800c0004,0x00000bc8,
+at 0x000002e8 : */     0x800c0004,0x00000c50,
 /*
        INT int_bad_msg3
 
-at 0x000002d4 : */     0x98080000,0xab930008,
+at 0x000002ea : */     0x98080000,0xab930008,
 /*
 ignore_msg3:
        CLEAR ACK
 
-at 0x000002d6 : */     0x60000040,0x00000000,
+at 0x000002ec : */     0x60000040,0x00000000,
 /*
        JUMP redo_msgin3
 
-at 0x000002d8 : */     0x80080000,0x00000908,
+at 0x000002ee : */     0x80080000,0x00000900,
 /*
 ext_msg3:
        MOVE SCRATCH0 | had_extmsg TO SCRATCH0
 
-at 0x000002da : */     0x7a348000,0x00000000,
+at 0x000002f0 : */     0x7a348000,0x00000000,
 /*
        CLEAR ACK
 
-at 0x000002dc : */     0x60000040,0x00000000,
+at 0x000002f2 : */     0x60000040,0x00000000,
 /*
        MOVE 1, msgin_buf + 1, WHEN MSG_IN
 
-at 0x000002de : */     0x0f000001,0x00000001,
+at 0x000002f4 : */     0x0f000001,0x00000001,
 /*
-       JUMP ext_msg3a, IF 0x03
+       JUMP reject_msg3, IF NOT 0x03   ; Only handle SDTR
 
-at 0x000002e0 : */     0x800c0003,0x00000b90,
+at 0x000002f6 : */     0x80040003,0x00000c10,
 /*
-       INT int_bad_extmsg3a
+       CLEAR ACK
 
-at 0x000002e2 : */     0x98080000,0xab930004,
+at 0x000002f8 : */     0x60000040,0x00000000,
+/*
+       MOVE 1, msgin_buf + 2, WHEN MSG_IN
+
+at 0x000002fa : */     0x0f000001,0x00000002,
+/*
+       JUMP reject_msg3, IF NOT 0x01   ; Only handle  SDTR
+
+at 0x000002fc : */     0x80040001,0x00000c10,
 /*
-ext_msg3a:
        CLEAR ACK
 
-at 0x000002e4 : */     0x60000040,0x00000000,
+at 0x000002fe : */     0x60000040,0x00000000,
 /*
-       MOVE 1, msgin_buf + 2, WHEN MSG_IN
+       MOVE 2, msgin_buf + 3, WHEN MSG_IN
+
+at 0x00000300 : */     0x0f000002,0x00000003,
+/*
+       INT int_msg_sdtr3
 
-at 0x000002e6 : */     0x0f000001,0x00000002,
+at 0x00000302 : */     0x98080000,0xab93000e,
 /*
-       JUMP ext_msg3b, IF 0x01         ; Must be SDTR
+reject_msg3:
+       MOVE SCRATCH1 | did_reject TO SCRATCH1
 
-at 0x000002e8 : */     0x800c0001,0x00000bb0,
+at 0x00000304 : */     0x7a350100,0x00000000,
 /*
-       INT int_bad_extmsg3b
+       SET ATN
 
-at 0x000002ea : */     0x98080000,0xab930005,
+at 0x00000306 : */     0x58000008,0x00000000,
 /*
-ext_msg3b:
        CLEAR ACK
 
-at 0x000002ec : */     0x60000040,0x00000000,
+at 0x00000308 : */     0x60000040,0x00000000,
 /*
-       MOVE 2, msgin_buf + 3, WHEN MSG_IN
+       JUMP reject_msg3a, WHEN NOT MSG_IN
 
-at 0x000002ee : */     0x0f000002,0x00000003,
+at 0x0000030a : */     0x87030000,0x00000c40,
 /*
-       INT int_msg_sdtr3
+       MOVE 1, msgin_buf + 7, WHEN MSG_IN
+
+at 0x0000030c : */     0x0f000001,0x00000007,
+/*
+       JUMP reject_msg3
+
+at 0x0000030e : */     0x80080000,0x00000c10,
+/*
+reject_msg3a:
+       MOVE 1, msg_reject, WHEN MSG_OUT
 
-at 0x000002f0 : */     0x98080000,0xab93000e,
+at 0x00000310 : */     0x0e000001,0x00000000,
+/*
+       JUMP redo_msgin3
+
+at 0x00000312 : */     0x80080000,0x00000900,
 /*
 disc3:
        CLEAR ACK
 
-at 0x000002f2 : */     0x60000040,0x00000000,
+at 0x00000314 : */     0x60000040,0x00000000,
 /*
 ENTRY wait_disc3
 wait_disc3:
        WAIT DISCONNECT
 
-at 0x000002f4 : */     0x48000000,0x00000000,
+at 0x00000316 : */     0x48000000,0x00000000,
 /*
        INT int_disc3
 
-at 0x000002f6 : */     0x98080000,0xab93001b,
+at 0x00000318 : */     0x98080000,0xab93001b,
 /*
 ENTRY resume_msgin3a
 resume_msgin3a:
        CLEAR ACK
 
-at 0x000002f8 : */     0x60000040,0x00000000,
+at 0x0000031a : */     0x60000040,0x00000000,
 /*
        JUMP redo_msgin3
 
-at 0x000002fa : */     0x80080000,0x00000908,
+at 0x0000031c : */     0x80080000,0x00000900,
 /*
 ENTRY resume_msgin3b
 resume_msgin3b:
        SET ATN
 
-at 0x000002fc : */     0x58000008,0x00000000,
+at 0x0000031e : */     0x58000008,0x00000000,
 /*
        CLEAR ACK
 
-at 0x000002fe : */     0x60000040,0x00000000,
+at 0x00000320 : */     0x60000040,0x00000000,
 /*
        INT int_no_msgout3, WHEN NOT MSG_OUT
 
-at 0x00000300 : */     0x9e030000,0xab930011,
+at 0x00000322 : */     0x9e030000,0xab930011,
 /*
        MOVE SCRATCH0 | had_msgout TO SCRATCH0
 
-at 0x00000302 : */     0x7a340200,0x00000000,
+at 0x00000324 : */     0x7a340200,0x00000000,
 /*
        MOVE FROM dsa_msgout, when MSG_OUT
 
-at 0x00000304 : */     0x1e000000,0x00000008,
+at 0x00000326 : */     0x1e000000,0x00000008,
 /*
        JUMP redo_msgin3
 
-at 0x00000306 : */     0x80080000,0x00000908,
+at 0x00000328 : */     0x80080000,0x00000900,
 /*
 
 ENTRY resume_rej_ident
 resume_rej_ident:
        CLEAR ATN
 
-at 0x00000308 : */     0x60000008,0x00000000,
+at 0x0000032a : */     0x60000008,0x00000000,
 /*
        MOVE 1, msgin_buf, WHEN MSG_IN
 
-at 0x0000030a : */     0x0f000001,0x00000000,
+at 0x0000032c : */     0x0f000001,0x00000000,
 /*
        INT int_not_rej, IF NOT 0x07            ; Reject
 
-at 0x0000030c : */     0x98040007,0xab93001c,
+at 0x0000032e : */     0x98040007,0xab93001c,
 /*
        CLEAR ACK
 
-at 0x0000030e : */     0x60000040,0x00000000,
+at 0x00000330 : */     0x60000040,0x00000000,
 /*
        JUMP done_ident
 
-at 0x00000310 : */     0x80080000,0x00000050,
+at 0x00000332 : */     0x80080000,0x00000048,
 /*
 
 ENTRY reselect
@@ -1716,73 +1784,92 @@ reselect:
        ; Disable selection timer
        MOVE CTEST7 | 0x10 TO CTEST7
 
-at 0x00000312 : */     0x7a1b1000,0x00000000,
+at 0x00000334 : */     0x7a1b1000,0x00000000,
 /*
        WAIT RESELECT resel_err
 
-at 0x00000314 : */     0x50000000,0x00000c70,
+at 0x00000336 : */     0x50000000,0x00000cf8,
 /*
        INT int_resel_not_msgin, WHEN NOT MSG_IN
 
-at 0x00000316 : */     0x9f030000,0xab930016,
+at 0x00000338 : */     0x9f030000,0xab930016,
 /*
        MOVE 1, reselected_identify, WHEN MSG_IN
 
-at 0x00000318 : */     0x0f000001,0x00000000,
+at 0x0000033a : */     0x0f000001,0x00000000,
 /*
        INT int_reselected
 
-at 0x0000031a : */     0x98080000,0xab930017,
+at 0x0000033c : */     0x98080000,0xab930017,
 /*
 resel_err:
        MOVE CTEST2 & 0x40 TO SFBR
 
-at 0x0000031c : */     0x74164000,0x00000000,
+at 0x0000033e : */     0x74164000,0x00000000,
 /*
        JUMP selected, IF 0x00
 
-at 0x0000031e : */     0x800c0000,0x00000cb0,
+at 0x00000340 : */     0x800c0000,0x00000d38,
 /*
        MOVE SFBR & 0 TO SFBR
 
-at 0x00000320 : */     0x7c080000,0x00000000,
+at 0x00000342 : */     0x7c080000,0x00000000,
 /*
 ENTRY patch_new_dsa
 patch_new_dsa:
        MOVE SFBR | 0x11 TO DSA0
 
-at 0x00000322 : */     0x6a101100,0x00000000,
+at 0x00000344 : */     0x6a101100,0x00000000,
 /*
        MOVE SFBR | 0x22 TO DSA1
 
-at 0x00000324 : */     0x6a112200,0x00000000,
+at 0x00000346 : */     0x6a112200,0x00000000,
 /*
        MOVE SFBR | 0x33 TO DSA2
 
-at 0x00000326 : */     0x6a123300,0x00000000,
+at 0x00000348 : */     0x6a123300,0x00000000,
 /*
        MOVE SFBR | 0x44 TO DSA3
 
-at 0x00000328 : */     0x6a134400,0x00000000,
+at 0x0000034a : */     0x6a134400,0x00000000,
 /*
        JUMP do_select
 
-at 0x0000032a : */     0x80080000,0x00000000,
+at 0x0000034c : */     0x80080000,0x00000000,
 /*
 
 selected:
        INT int_selected
 
-at 0x0000032c : */     0x98080000,0xab930018,
+at 0x0000034e : */     0x98080000,0xab930018,
+/*
+
+ENTRY test1
+test1:
+       MOVE MEMORY 4, test1_src, test1_dst
+
+at 0x00000350 : */     0xc0000004,0x00000000,0x00000000,
+/*
+       INT int_test1
+
+at 0x00000353 : */     0x98080000,0xab93001d,
+};
+
+#define A_did_reject   0x00000001
+static u32 A_did_reject_used[] __attribute((unused)) = {
+       0x0000026c,
+       0x000002b8,
+       0x00000304,
 };
 
 #define A_dsa_cmnd     0x00000010
 static u32 A_dsa_cmnd_used[] __attribute((unused)) = {
-       0x0000001d,
+       0x0000001b,
 };
 
 #define A_dsa_datain   0x00000028
 static u32 A_dsa_datain_used[] __attribute((unused)) = {
+       0x0000003b,
        0x0000003d,
        0x0000003f,
        0x00000041,
@@ -1910,11 +1997,11 @@ static u32 A_dsa_datain_used[] __attribute((unused)) = {
        0x00000135,
        0x00000137,
        0x00000139,
-       0x0000013b,
 };
 
 #define A_dsa_dataout  0x00000428
 static u32 A_dsa_dataout_used[] __attribute((unused)) = {
+       0x00000141,
        0x00000143,
        0x00000145,
        0x00000147,
@@ -2042,25 +2129,24 @@ static u32 A_dsa_dataout_used[] __attribute((unused)) = {
        0x0000023b,
        0x0000023d,
        0x0000023f,
-       0x00000241,
 };
 
 #define A_dsa_msgin    0x00000020
 static u32 A_dsa_msgin_used[] __attribute((unused)) = {
-       0x0000002f,
+       0x0000002d,
 };
 
 #define A_dsa_msgout   0x00000008
 static u32 A_dsa_msgout_used[] __attribute((unused)) = {
-       0x00000013,
-       0x00000285,
-       0x000002c5,
-       0x00000305,
+       0x00000011,
+       0x0000028f,
+       0x000002db,
+       0x00000327,
 };
 
 #define A_dsa_select   0x00000000
 static u32 A_dsa_select_used[] __attribute((unused)) = {
-       0x00000006,
+       0x00000004,
 };
 
 #define A_dsa_size     0x00000828
@@ -2069,285 +2155,290 @@ static u32 A_dsa_size_used[] __attribute((unused)) = {
 
 #define A_dsa_status   0x00000018
 static u32 A_dsa_status_used[] __attribute((unused)) = {
-       0x0000002b,
+       0x00000029,
 };
 
 #define A_had_cmdout   0x00000004
 static u32 A_had_cmdout_used[] __attribute((unused)) = {
-       0x0000001a,
+       0x00000018,
 };
 
 #define A_had_datain   0x00000008
 static u32 A_had_datain_used[] __attribute((unused)) = {
-       0x00000038,
+       0x00000036,
 };
 
 #define A_had_dataout  0x00000010
 static u32 A_had_dataout_used[] __attribute((unused)) = {
-       0x0000013e,
+       0x0000013c,
 };
 
 #define A_had_extmsg   0x00000080
 static u32 A_had_extmsg_used[] __attribute((unused)) = {
-       0x0000025a,
-       0x0000029a,
-       0x000002da,
+       0x00000258,
+       0x000002a4,
+       0x000002f0,
 };
 
 #define A_had_msgin    0x00000040
 static u32 A_had_msgin_used[] __attribute((unused)) = {
-       0x00000248,
-       0x00000288,
-       0x000002c8,
+       0x00000246,
+       0x00000292,
+       0x000002de,
 };
 
 #define A_had_msgout   0x00000002
 static u32 A_had_msgout_used[] __attribute((unused)) = {
-       0x00000010,
-       0x00000282,
-       0x000002c2,
-       0x00000302,
+       0x0000000e,
+       0x0000028c,
+       0x000002d8,
+       0x00000324,
 };
 
 #define A_had_select   0x00000001
 static u32 A_had_select_used[] __attribute((unused)) = {
-       0x0000000c,
+       0x0000000a,
 };
 
 #define A_had_status   0x00000020
 static u32 A_had_status_used[] __attribute((unused)) = {
 };
 
-#define A_int_bad_extmsg1a     0xab930000
-static u32 A_int_bad_extmsg1a_used[] __attribute((unused)) = {
-       0x00000263,
-};
-
-#define A_int_bad_extmsg1b     0xab930001
-static u32 A_int_bad_extmsg1b_used[] __attribute((unused)) = {
-       0x0000026b,
-};
-
-#define A_int_bad_extmsg2a     0xab930002
-static u32 A_int_bad_extmsg2a_used[] __attribute((unused)) = {
-       0x000002a3,
-};
-
-#define A_int_bad_extmsg2b     0xab930003
-static u32 A_int_bad_extmsg2b_used[] __attribute((unused)) = {
-       0x000002ab,
-};
-
-#define A_int_bad_extmsg3a     0xab930004
-static u32 A_int_bad_extmsg3a_used[] __attribute((unused)) = {
-       0x000002e3,
-};
-
-#define A_int_bad_extmsg3b     0xab930005
-static u32 A_int_bad_extmsg3b_used[] __attribute((unused)) = {
-       0x000002eb,
-};
-
 #define A_int_bad_msg1 0xab930006
 static u32 A_int_bad_msg1_used[] __attribute((unused)) = {
-       0x00000255,
+       0x00000253,
 };
 
 #define A_int_bad_msg2 0xab930007
 static u32 A_int_bad_msg2_used[] __attribute((unused)) = {
-       0x00000295,
+       0x0000029f,
 };
 
 #define A_int_bad_msg3 0xab930008
 static u32 A_int_bad_msg3_used[] __attribute((unused)) = {
-       0x000002d5,
+       0x000002eb,
 };
 
 #define A_int_cmd_bad_phase    0xab930009
 static u32 A_int_cmd_bad_phase_used[] __attribute((unused)) = {
-       0x00000027,
+       0x00000025,
 };
 
 #define A_int_cmd_complete     0xab93000a
 static u32 A_int_cmd_complete_used[] __attribute((unused)) = {
-       0x00000037,
+       0x00000035,
 };
 
 #define A_int_data_bad_phase   0xab93000b
 static u32 A_int_data_bad_phase_used[] __attribute((unused)) = {
-       0x00000247,
+       0x00000245,
 };
 
 #define A_int_disc1    0xab930019
 static u32 A_int_disc1_used[] __attribute((unused)) = {
-       0x00000277,
+       0x00000281,
 };
 
 #define A_int_disc2    0xab93001a
 static u32 A_int_disc2_used[] __attribute((unused)) = {
-       0x000002b7,
+       0x000002cd,
 };
 
 #define A_int_disc3    0xab93001b
 static u32 A_int_disc3_used[] __attribute((unused)) = {
-       0x000002f7,
+       0x00000319,
 };
 
 #define A_int_msg_sdtr1        0xab93000c
 static u32 A_int_msg_sdtr1_used[] __attribute((unused)) = {
-       0x00000271,
+       0x0000026b,
 };
 
 #define A_int_msg_sdtr2        0xab93000d
 static u32 A_int_msg_sdtr2_used[] __attribute((unused)) = {
-       0x000002b1,
+       0x000002b7,
 };
 
 #define A_int_msg_sdtr3        0xab93000e
 static u32 A_int_msg_sdtr3_used[] __attribute((unused)) = {
-       0x000002f1,
+       0x00000303,
 };
 
 #define A_int_no_msgout1       0xab93000f
 static u32 A_int_no_msgout1_used[] __attribute((unused)) = {
-       0x00000281,
+       0x0000028b,
 };
 
 #define A_int_no_msgout2       0xab930010
 static u32 A_int_no_msgout2_used[] __attribute((unused)) = {
-       0x000002c1,
+       0x000002d7,
 };
 
 #define A_int_no_msgout3       0xab930011
 static u32 A_int_no_msgout3_used[] __attribute((unused)) = {
-       0x00000301,
+       0x00000323,
 };
 
 #define A_int_not_cmd_complete 0xab930012
 static u32 A_int_not_cmd_complete_used[] __attribute((unused)) = {
-       0x00000031,
+       0x0000002f,
 };
 
 #define A_int_not_rej  0xab93001c
 static u32 A_int_not_rej_used[] __attribute((unused)) = {
-       0x0000030d,
+       0x0000032f,
 };
 
 #define A_int_resel_not_msgin  0xab930016
 static u32 A_int_resel_not_msgin_used[] __attribute((unused)) = {
-       0x00000317,
+       0x00000339,
 };
 
 #define A_int_reselected       0xab930017
 static u32 A_int_reselected_used[] __attribute((unused)) = {
-       0x0000031b,
+       0x0000033d,
 };
 
 #define A_int_sel_no_ident     0xab930013
 static u32 A_int_sel_no_ident_used[] __attribute((unused)) = {
-       0x0000000f,
+       0x0000000d,
 };
 
 #define A_int_sel_not_cmd      0xab930014
 static u32 A_int_sel_not_cmd_used[] __attribute((unused)) = {
-       0x00000019,
+       0x00000017,
 };
 
 #define A_int_selected 0xab930018
 static u32 A_int_selected_used[] __attribute((unused)) = {
-       0x0000032d,
+       0x0000034f,
 };
 
 #define A_int_status_not_msgin 0xab930015
 static u32 A_int_status_not_msgin_used[] __attribute((unused)) = {
-       0x0000002d,
+       0x0000002b,
+};
+
+#define A_int_test1    0xab93001d
+static u32 A_int_test1_used[] __attribute((unused)) = {
+       0x00000354,
+};
+
+#define A_msg_reject   0x00000000
+static u32 A_msg_reject_used[] __attribute((unused)) = {
+       0x00000279,
+       0x000002c5,
+       0x00000311,
 };
 
 #define A_msgin_buf    0x00000000
 static u32 A_msgin_buf_used[] __attribute((unused)) = {
-       0x0000024b,
-       0x0000025f,
-       0x00000267,
-       0x0000026f,
-       0x0000028b,
-       0x0000029f,
-       0x000002a7,
+       0x00000249,
+       0x0000025d,
+       0x00000263,
+       0x00000269,
+       0x00000275,
+       0x00000295,
+       0x000002a9,
        0x000002af,
-       0x000002cb,
-       0x000002df,
-       0x000002e7,
-       0x000002ef,
-       0x0000030b,
+       0x000002b5,
+       0x000002c1,
+       0x000002e1,
+       0x000002f5,
+       0x000002fb,
+       0x00000301,
+       0x0000030d,
+       0x0000032d,
 };
 
 #define A_reselected_identify  0x00000000
 static u32 A_reselected_identify_used[] __attribute((unused)) = {
-       0x00000319,
+       0x0000033b,
+};
+
+#define A_test1_dst    0x00000000
+static u32 A_test1_dst_used[] __attribute((unused)) = {
+       0x00000352,
+};
+
+#define A_test1_src    0x00000000
+static u32 A_test1_src_used[] __attribute((unused)) = {
+       0x00000351,
 };
 
 #define Ent_do_select  0x00000000
-#define Ent_done_ident 0x00000050
-#define Ent_end_data_trans     0x00000908
-#define Ent_patch_input_data   0x000000e8
-#define Ent_patch_new_dsa      0x00000c88
-#define Ent_patch_output_data  0x00000500
-#define Ent_reselect   0x00000c48
-#define Ent_resume_cmd 0x00000068
-#define Ent_resume_msgin1a     0x000009e0
-#define Ent_resume_msgin1b     0x000009f0
-#define Ent_resume_msgin2a     0x00000ae0
-#define Ent_resume_msgin2b     0x00000af0
-#define Ent_resume_msgin3a     0x00000be0
-#define Ent_resume_msgin3b     0x00000bf0
-#define Ent_resume_pmm 0x00000078
-#define Ent_resume_rej_ident   0x00000c20
-#define Ent_wait_disc1 0x000009d0
-#define Ent_wait_disc2 0x00000ad0
-#define Ent_wait_disc3 0x00000bd0
-#define Ent_wait_disc_complete 0x000000d0
+#define Ent_done_ident 0x00000048
+#define Ent_end_data_trans     0x00000900
+#define Ent_patch_input_data   0x000000e0
+#define Ent_patch_new_dsa      0x00000d10
+#define Ent_patch_output_data  0x000004f8
+#define Ent_reselect   0x00000cd0
+#define Ent_resume_cmd 0x00000060
+#define Ent_resume_msgin1a     0x00000a08
+#define Ent_resume_msgin1b     0x00000a18
+#define Ent_resume_msgin2a     0x00000b38
+#define Ent_resume_msgin2b     0x00000b48
+#define Ent_resume_msgin3a     0x00000c68
+#define Ent_resume_msgin3b     0x00000c78
+#define Ent_resume_pmm 0x00000070
+#define Ent_resume_rej_ident   0x00000ca8
+#define Ent_test1      0x00000d40
+#define Ent_wait_disc1 0x000009f8
+#define Ent_wait_disc2 0x00000b28
+#define Ent_wait_disc3 0x00000c58
+#define Ent_wait_disc_complete 0x000000c8
 static u32 LABELPATCHES[] __attribute((unused)) = {
+       0x00000005,
        0x00000007,
-       0x00000009,
+       0x00000013,
        0x00000015,
-       0x00000017,
+       0x0000001d,
        0x0000001f,
        0x00000021,
        0x00000023,
-       0x00000025,
-       0x0000013d,
+       0x0000013b,
+       0x00000241,
        0x00000243,
-       0x00000245,
+       0x0000024b,
        0x0000024d,
        0x0000024f,
        0x00000251,
-       0x00000253,
-       0x00000259,
-       0x00000261,
-       0x00000269,
+       0x00000257,
+       0x0000025f,
+       0x00000265,
+       0x00000273,
+       0x00000277,
        0x0000027b,
-       0x00000287,
-       0x0000028d,
-       0x0000028f,
+       0x00000285,
        0x00000291,
-       0x00000293,
+       0x00000297,
        0x00000299,
-       0x000002a1,
-       0x000002a9,
-       0x000002bb,
+       0x0000029b,
+       0x0000029d,
+       0x000002a3,
+       0x000002ab,
+       0x000002b1,
+       0x000002bf,
+       0x000002c3,
        0x000002c7,
-       0x000002cd,
-       0x000002cf,
        0x000002d1,
-       0x000002d3,
-       0x000002d9,
-       0x000002e1,
+       0x000002dd,
+       0x000002e3,
+       0x000002e5,
+       0x000002e7,
        0x000002e9,
-       0x000002fb,
-       0x00000307,
-       0x00000311,
-       0x00000315,
-       0x0000031f,
-       0x0000032b,
+       0x000002ef,
+       0x000002f7,
+       0x000002fd,
+       0x0000030b,
+       0x0000030f,
+       0x00000313,
+       0x0000031d,
+       0x00000329,
+       0x00000333,
+       0x00000337,
+       0x00000341,
+       0x0000034d,
 };
 
 static struct {
@@ -2356,6 +2447,6 @@ static struct {
 } EXTERNAL_PATCHES[] __attribute((unused)) = {
 };
 
-static u32 INSTRUCTIONS __attribute((unused))  = 407;
-static u32 PATCHES __attribute((unused))       = 42;
+static u32 INSTRUCTIONS __attribute((unused))  = 426;
+static u32 PATCHES __attribute((unused))       = 51;
 static u32 EXTERNAL_PATCHES_LEN __attribute((unused))  = 0;