+ last_bit = 0;
+
+ if ((ir_scan && (end_state == TAP_SI)) ||
+ (!ir_scan && (end_state == TAP_SD)))
+ {
+ bitbang_interface->write(0, 0, last_bit);
+ bitbang_interface->write(1, 0, last_bit);
+
+ if (type != SCAN_OUT)
+ last_bit_in = bitbang_interface->read();
+
+ bitbang_interface->write(0, 0, last_bit);
+ }
+ else
+ {
+ /* Shift-[ID]R -> Exit1-[ID]R */
+ bitbang_interface->write(0, 1, last_bit);
+ bitbang_interface->write(1, 1, last_bit);
+
+ if (type != SCAN_OUT)
+ last_bit_in = bitbang_interface->read();
+
+ /* Exit1-[ID]R -> Pause-[ID]R */
+ bitbang_interface->write(0, 0, 0);
+ bitbang_interface->write(1, 0, 0);
+
+ if (cur_state == TAP_SI)
+ cur_state = TAP_PI;
+ else
+ cur_state = TAP_PD;
+
+ if (cur_state != end_state)
+ bitbang_state_move();
+ else
+ bitbang_interface->write(0, 0, 0);
+ }
+
+ if (type != SCAN_OUT)
+ {
+ if (last_bit_in)
+ buffer[(bit_cnt)/8] |= 1 << ((bit_cnt) % 8);
+ else
+ buffer[(bit_cnt)/8] &= ~(1 << ((bit_cnt) % 8));
+ }