+ }
+
+ if ((tr[i].cmdTrans == PP_READ) || (*writepos != prev_data) || (i == num-1))
+ writepos++;
+ }
+
+ if (nread)
+ {
+ DPRINTF("writing %zd bytes\n", writepos-writebuf);
+
+ *writepos = last_data;
+ writepos++;
+
+ jtagkey_latency(OTHER_LATENCY);
+
+ targ.num = writepos-writebuf;
+ targ.buf = readbuf;
+ pthread_create(&reader_thread, NULL, &jtagkey_reader, &targ);
+ ftdi_write_data(&ftdic, writebuf, writepos-writebuf);
+ pthread_join(reader_thread, NULL);
+
+#ifdef DEBUG
+ hexdump(writebuf, writepos-writebuf, "->");
+ hexdump(readbuf, i, "<-");
+#endif
+
+ writepos = writebuf;
+ } else {
+ return ret;
+ }
+
+ readpos = readbuf;
+ last_write = last_cyc_write;
+
+ for (i = 0; i < num; i++) {
+ DPRINTF("dwPort: 0x%lx, cmdTrans: %lu, dwbytes: %ld, fautoinc: %ld, dwoptions: %ld\n",
+ (unsigned long)tr[i].dwPort, tr[i].cmdTrans, tr[i].dwBytes,
+ tr[i].fAutoinc, tr[i].dwOptions);
+
+ port = (unsigned long)tr[i].dwPort;
+ val = tr[i].Data.Byte;
+
+ if ((tr[i].cmdTrans != PP_READ) && (val == last_write) && (i != num-1))
+ continue;
+
+ readpos++;
+
+ if (port == ppbase + PP_DATA) {
+ if (tr[i].cmdTrans == PP_WRITE) {
+ last_write = val;
+ }