+ }
+
+ if (nread || (*writepos != prev_data))
+ writepos++;
+ }
+
+ if (nread)
+ {
+ DPRINTF("writing %d bytes\n", writepos-writebuf);
+ for (i=0; i<writepos-writebuf; i++) {
+#if 1
+ int combine = i;
+
+ do {
+ if (combine > 0 &&
+ tr[combine-1].cmdTrans == PP_READ) {
+ break;
+ } else {
+ combine++;
+ }
+ } while (combine < writepos-writebuf);
+
+ DPRINTF("combined writes before read: %d\n", combine);
+
+ if ((combine-i)-1 > 0) {
+ ftdi_write_data(&ftdic, writebuf+i, (combine-i)-1);
+ i = combine-1;
+ }
+#endif
+
+ ftdi_write_data(&ftdic, writebuf+i, 1);
+
+ if (i > 0 && tr[i].cmdTrans == PP_WRITE && tr[i-1].cmdTrans == PP_READ)
+ ftdi_read_pins(&ftdic, readbuf+i);
+
+ if (i == (writepos-writebuf)-1 && tr[i].cmdTrans == PP_READ) {
+ ftdi_write_data(&ftdic, writebuf+i, 1);
+ ftdi_read_pins(&ftdic, readbuf+i+1);
+ }
+ }
+
+#ifdef DEBUG
+ DPRINTF("write: ");
+ hexdump(writebuf, writepos-writebuf);
+ DPRINTF("read: ");
+ hexdump(readbuf, i);
+#endif
+
+ writepos = writebuf;
+ } else {
+ return ret;
+ }
+
+ readpos = readbuf;
+
+ 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;
+ readpos++;
+
+ if (port == ppbase + PP_DATA) {
+ if (tr[i].cmdTrans == PP_WRITE) {
+ last_write = val;
+ }