Beginnings of info flash support. It isn't very good.
[goodfet] / firmware / apps / jtag / jtagarm7tdmi.c
index 776029b..242e9db 100644 (file)
@@ -1,5 +1,5 @@
 /*! \file jtagarm7tdmi.c
-  \brief ARM7TDMI JTAG (AT91R40008)
+  \brief ARM7TDMI JTAG (AT91R40008, AT91SAM7xxx)
 */
 
 #include "platform.h"
@@ -127,8 +127,10 @@ void jtag_reset_to_runtest_idle() {
 }
 
 void jtag_arm_tcktock() {
+  delay(100);  // FIXME: Should never wait this long...
   CLRTCK; 
   PLEDOUT^=PLEDPIN; 
+  delay(100);  // FIXME: Should never wait this long...
   SETTCK; 
   PLEDOUT^=PLEDPIN;
 }
@@ -137,23 +139,6 @@ void jtag_arm_tcktock() {
 // ! Start JTAG, setup pins, reset TAP and return IDCODE
 unsigned long jtagarm7tdmi_start() {
   jtagsetup();
-  //Known-good starting position.
-  //Might be unnecessary.
-  SETTST;
-  SETRST;
-  
-  delay(0x2);
-  
-  CLRRST;
-  delay(2);
-  CLRTST;
-
-  msdelay(10);
-  SETRST;
-  /*
-  P5DIR &=~RST;
-  */
-  delay(0x2);
   jtagarm7tdmi_resettap();
   return jtagarm7tdmi_idcode();
 }
@@ -175,9 +160,10 @@ unsigned long jtagarmtransn(unsigned long word, unsigned char bitcount, unsigned
   unsigned long high = 1;
   unsigned long mask;
 
-  for (bit=(bitcount-1)/8; bit>0; bit--)
-    high <<= 8;
-  high <<= ((bitcount-1)%8);
+  //for (bit=(bitcount-1)/8; bit>0; bit--)
+  //  high <<= 8;
+  //high <<= ((bitcount-1)%8);
+  high <<= (bitcount-1);
 
   mask = high-1;
 
@@ -260,20 +246,18 @@ unsigned long jtagarm7tdmi_idcode(){               // PROVEN
 
 //!  Connect Bypass Register to TDO/TDI
 unsigned char jtagarm7tdmi_bypass(){               // PROVEN
-  //jtagarm7tdmi_resettap();
+  jtagarm7tdmi_resettap();
   SHIFT_IR;
   return jtagarmtransn(ARM7TDMI_IR_BYPASS, 4, LSB, END, NORETIDLE);
 }
 //!  INTEST verb - do internal test
 unsigned char jtagarm7tdmi_intest() { 
-  //jtagarm7tdmi_resettap();
   SHIFT_IR;
   return jtagarmtransn(ARM7TDMI_IR_INTEST, 4, LSB, END, NORETIDLE); 
 }
 
 //!  EXTEST verb
 unsigned char jtagarm7tdmi_extest() { 
-  //jtagarm7tdmi_resettap();
   SHIFT_IR;
   return jtagarmtransn(ARM7TDMI_IR_EXTEST, 4, LSB, END, NORETIDLE);
 }
@@ -286,7 +270,7 @@ unsigned char jtagarm7tdmi_extest() {
 
 //!  RESTART verb
 unsigned char jtagarm7tdmi_restart() { 
-  //jtagarm7tdmi_resettap();
+  jtagarm7tdmi_resettap();
   SHIFT_IR;
   return jtagarmtransn(ARM7TDMI_IR_RESTART, 4, LSB, END, RETIDLE); 
 }
@@ -324,13 +308,15 @@ commands occur. Therefore, it is recommended to pass directly from the “Update
 state” to the “Select DR” state each time the “Update” state is reached.
 */
   unsigned long retval;
-  if (current_chain != chain) {     // breaks shit when going from idcode back to scan chain
+  if (current_chain != chain) {
+    //debugstr("===change chains===");
     SHIFT_IR;
     jtagarmtransn(ARM7TDMI_IR_SCAN_N, 4, LSB, END, NORETIDLE);
     SHIFT_DR;
     retval = jtagarmtransn(chain, 4, LSB, END, NORETIDLE);
     current_chain = chain;
   }    else
+    //debugstr("===NOT change chains===");
     retval = current_chain;
   // put in test mode...
   SHIFT_IR;
@@ -348,9 +334,8 @@ unsigned long jtagarm7tdmi_scan_intest(int chain) {               // PROVEN
 
 
 //! push an instruction into the pipeline
-unsigned long jtagarm7tdmi_instr_primitive(unsigned long instr, char breakpt){
+unsigned long jtagarm7tdmi_instr_primitive(unsigned long instr, char breakpt){  // PROVEN
   unsigned long retval;
-  //jtagarm7tdmi_resettap();                  // FIXME: DEBUG: seems necessary for some reason.  ugh.
   jtagarm7tdmi_scan_intest(1);
 
   SHIFT_DR;
@@ -369,13 +354,12 @@ unsigned long jtagarm7tdmi_instr_primitive(unsigned long instr, char breakpt){
   
   // Now shift in the 32 bits
   retval = jtagarmtransn(instr, 32, MSB, END, RETIDLE);    // Must return to RUN-TEST/IDLE state for instruction to enter pipeline, and causes debug clock.
-  //jtag_arm_tcktock();
   return(retval);
   
 }
 
-
-unsigned long jtagarm7tdmi_nop(char breakpt){
+//! push NOP into the instruction pipeline
+unsigned long jtagarm7tdmi_nop(char breakpt){  // PROVEN
   return jtagarm7tdmi_instr_primitive(ARM_INSTR_NOP, breakpt);
 }
 
@@ -390,8 +374,10 @@ NOP
 NOP
 
 */
+
 //! set the current mode to ARM, returns PC (FIXME).  Should be used by haltcpu(), which should also store PC and the THUMB state, for use by releasecpu();
 unsigned long jtagarm7tdmi_setMode_ARM(){               // PROVEN
+  debugstr("=== Thumb Mode... Switching to ARM mode ===");
   unsigned long retval = 0xff;
   while ((jtagarm7tdmi_get_dbgstate() & JTAG_ARM7TDMI_DBG_TBIT)&& retval-- > 0){
     cmddataword[6] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_NOP,0);
@@ -413,6 +399,9 @@ unsigned long jtagarm7tdmi_setMode_ARM(){               // PROVEN
 //! shifter for writing to chain2 (EmbeddedICE). 
 unsigned long eice_write(unsigned char reg, unsigned long data){
   unsigned long retval, temp;
+  debugstr("eice_write");
+  debughex(reg);
+  debughex32(data);
   jtagarm7tdmi_scan_intest(2);
   // Now shift in the 32 bits
   SHIFT_DR;
@@ -430,7 +419,9 @@ unsigned long eice_write(unsigned char reg, unsigned long data){
 
 //! shifter for reading from chain2 (EmbeddedICE).
 unsigned long eice_read(unsigned char reg){               // PROVEN
-  unsigned long temp;
+  unsigned long temp, retval;
+  debugstr("eice_read");
+  debughex(reg);
   jtagarm7tdmi_scan_intest(2);
 
   // send in the register address - 5 bits LSB
@@ -442,7 +433,9 @@ unsigned long eice_read(unsigned char reg){               // PROVEN
   
   SHIFT_DR;
   // Now shift out the 32 bits
-  return(jtagarmtransn(0, 32, LSB, END, RETIDLE));   // atmel arm jtag docs pp.10-11: LSB first
+  retval = jtagarmtransn(0, 32, LSB, END, RETIDLE);   // atmel arm jtag docs pp.10-11: LSB first
+  debughex32(retval);
+  return(retval);   // atmel arm jtag docs pp.10-11: LSB first
   
 }
 
@@ -507,194 +500,158 @@ void jtagarm7tdmi_disable_watchpoint1(){
 
 
 /******************** Complex Commands **************************/
-//! Push an instruction into the CPU pipeline
-//  NOTE!  Must provide EXECNOPARM for parameter if no parm is required.
-unsigned long test_exec(unsigned long instr, unsigned long parameter, unsigned char systemspeed) {
-  unsigned long retval;
-
-  cmddatalong[1] = jtagarm7tdmi_nop( 0);
-  cmddatalong[2] = jtagarm7tdmi_nop(systemspeed);
-  cmddatalong[3] = jtagarm7tdmi_instr_primitive(instr, 0);      // write 32-bit instruction code into DR
-  cmddatalong[4] = jtagarm7tdmi_nop( 0);
-  cmddatalong[5] = jtagarm7tdmi_nop( 0);
-  cmddatalong[6] = jtagarm7tdmi_instr_primitive(parameter, 0);  // inject long
-  cmddatalong[7] = jtagarm7tdmi_nop( 0);
-  cmddatalong[8] = jtagarm7tdmi_nop( 0);
-  cmddatalong[9] = jtagarm7tdmi_nop( 0);
-  retval = cmddatalong[9];
-
-  return(retval);
-}
-
 
 //! Push an instruction into the CPU pipeline
 //  NOTE!  Must provide EXECNOPARM for parameter if no parm is required.
 unsigned long jtagarm7tdmi_exec(unsigned long instr, unsigned long parameter, unsigned char systemspeed) {
   unsigned long retval;
 
-  cmddatalong[1] = jtagarm7tdmi_nop( 0);
-  cmddatalong[2] = jtagarm7tdmi_nop(systemspeed);
-  cmddatalong[3] = jtagarm7tdmi_instr_primitive(instr, 0);      // write 32-bit instruction code into DR
-  cmddatalong[4] = jtagarm7tdmi_nop( 0);
-  cmddatalong[5] = jtagarm7tdmi_nop( 0);
-  cmddatalong[6] = jtagarm7tdmi_instr_primitive(parameter, 0);  // inject long
-  cmddatalong[7] = jtagarm7tdmi_nop( 0);
+  debughex32(jtagarm7tdmi_nop( 0));
+  debughex32(jtagarm7tdmi_nop(systemspeed));
+  debughex32(jtagarm7tdmi_instr_primitive(instr, 0));      // write 32-bit instruction code into DR
+  debughex32(jtagarm7tdmi_nop( 0));
+  debughex32(jtagarm7tdmi_nop( 0));
+  debughex32(jtagarm7tdmi_instr_primitive(parameter, 0));  // inject long
   retval = jtagarm7tdmi_nop( 0);
-  cmddatalong[9] = jtagarm7tdmi_nop( 0);
-  cmddatalong[8] = retval;
+  debughex32(retval);
+  debughex32(jtagarm7tdmi_nop( 0));
+  debughex32(jtagarm7tdmi_nop( 0));
 
   return(retval);
 }
 
 //! Retrieve a 32-bit Register value
-unsigned long jtagarm7tdmi_get_register(unsigned char reg) {
-  unsigned long retval = 0, instr;
+unsigned long jtagarm7tdmi_get_register(unsigned long reg) {
+  unsigned long retval = 0, instr, reg2;
+  reg2 = (reg&0xf);
   // push nop into pipeline - clean out the pipeline...
-  cmddatalong[2] = jtagarm7tdmi_nop( 0);
-
-  instr = ARM_READ_REG | (reg<<12);                     // push STR Rx, [R14] into pipeline
-  cmddatalong[1] = jtagarm7tdmi_instr_primitive(instr, 0);
-  cmddatalong[2] = jtagarm7tdmi_nop( 0);                // push nop into pipeline - fetched
-  cmddatalong[3] = jtagarm7tdmi_nop( 0);                // push nop into pipeline - decoded
-  cmddatalong[4] = jtagarm7tdmi_nop( 0);                // push nop into pipeline - executed 
+  instr = (unsigned long)(reg<<12) | (unsigned long)ARM_READ_REG;   // STR Rx, [R14] 
+  instr |= (unsigned long)((unsigned long)reg2<<8)<<8;
+  //instr = (unsigned long)(((unsigned long)reg<<12) | ARM_READ_REG); 
+  //debugstr("Reading:");
+  debughex32(instr);
+
+  jtagarm7tdmi_nop( 0);
+  jtagarm7tdmi_nop( 0);
+  jtagarm7tdmi_nop( 0);
+  jtagarm7tdmi_instr_primitive(instr, 0);
+  jtagarm7tdmi_nop( 0);                // push nop into pipeline - fetched
+  jtagarm7tdmi_nop( 0);                // push nop into pipeline - decoded
+  jtagarm7tdmi_nop( 0);                // push nop into pipeline - executed 
   retval = jtagarm7tdmi_nop( 0);                        // recover 32-bit word
-  cmddatalong[5] = retval;
-  cmddatalong[6] = jtagarm7tdmi_nop( 0);
-  cmddatalong[7] = jtagarm7tdmi_nop( 0);
-  cmddatalong[8] = jtagarm7tdmi_nop( 0);
+  debughex32(retval);
+  jtagarm7tdmi_nop( 0);
+  jtagarm7tdmi_nop( 0);
+  jtagarm7tdmi_nop( 0);
   return retval;
 }
 
-//! Retrieve a 32-bit Register value
-unsigned long test_get_register(unsigned char reg) {
-  unsigned long retval = 0, instr;
-  // push nop into pipeline - clean out the pipeline...
-  cmddatalong[2] = jtagarm7tdmi_nop( 0);
-
-  instr = ARM_READ_REG | (reg<<12);                     // push STR Rx, [R14] into pipeline
-  cmddatalong[1] = jtagarm7tdmi_instr_primitive(instr, 0);      // fetch
-  cmddatalong[2] = jtagarm7tdmi_nop( 0);                        // decode
-  cmddatalong[3] = jtagarm7tdmi_nop( 0);                        // execute
-  cmddatalong[4] = jtagarm7tdmi_nop( 0);                        // ??? what happens here ???
-  retval = jtagarm7tdmi_nop( 0);                                // recover 32-bit word
-  cmddatalong[5] = retval;
-  cmddatalong[6] = jtagarm7tdmi_nop( 0);
-  cmddatalong[7] = jtagarm7tdmi_nop( 0);
-  cmddatalong[8] = jtagarm7tdmi_nop( 0);
-  return retval;
-}
-
-//! Set a 32-bit Register value
-unsigned long jtagarm7tdmi_set_register(unsigned char reg, unsigned long val) {
-  unsigned long retval = 0, instr;
-  cmddatalong[1] = jtagarm7tdmi_nop( 0); // push nop into pipeline - clean out the pipeline...
-
-  instr = ARM_WRITE_REG | (reg<<12);     // push LDR Rx, [R14] into pipeline
-  cmddatalong[2] = jtagarm7tdmi_instr_primitive(instr, 0); // push nop into pipeline - fetch
-  cmddatalong[3] = jtagarm7tdmi_nop( 0); // push nop into pipeline - decode
-  cmddatalong[4] = jtagarm7tdmi_instr_primitive(val-16, 0); // push 32-bit word on data bus
-  //cmddatalong[4] = jtagarm7tdmi_nop( 0); // push nop into pipeline - execute
-  
-  cmddatalong[5] = jtagarm7tdmi_instr_primitive(val, 0); // push 32-bit word on data bus
-  cmddatalong[6] = jtagarm7tdmi_instr_primitive(val+16, 0); // push 32-bit word on data bus
-  //cmddatalong[6] = jtagarm7tdmi_nop( 0); // push nop into pipeline - executed 
-
-  if (reg == ARM_REG_PC){
-    cmddatalong[7] = jtagarm7tdmi_nop( 0);
-    cmddatalong[8] = jtagarm7tdmi_nop( 0);
-  }
-  cmddatalong[9] = jtagarm7tdmi_nop( 0);
-
-  retval = cmddatalong[5];
-  return(retval);
-}
-
 //! Set a 32-bit Register value
-unsigned long test_set_register(unsigned char reg, unsigned long val) {
-  unsigned long retval = 0, instr;
-  cmddatalong[1] = jtagarm7tdmi_nop( 0); // push nop into pipeline - clean out the pipeline...
-
-  instr = ARM_WRITE_REG | (reg<<12);     // push LDR Rx, [R14] into pipeline
-  cmddatalong[2] = jtagarm7tdmi_instr_primitive(instr, 0);
+void jtagarm7tdmi_set_register(unsigned long reg, unsigned long val) {
+  unsigned long instr, reg2;
+  reg2 = (reg&0xf);
+  instr = (unsigned long)(((unsigned long)reg<<12) | ARM_WRITE_REG); //  LDR Rx, [R14]
+  instr |= (unsigned long)((unsigned long)reg2<<8)<<8;
+  //instr |= (unsigned long)((((unsigned long)reg)&0x7)<<8)<<8;
+  //debugstr("Writing:");
+  debughex32(instr);
+  //debughex32(val);
+  jtagarm7tdmi_nop( 0);            // push nop into pipeline - clean out the pipeline...
+  jtagarm7tdmi_nop( 0);            // push nop into pipeline - clean out the pipeline...
+  jtagarm7tdmi_instr_primitive(instr, 0); // push instr into pipeline - fetch
+  jtagarm7tdmi_nop( 0);            // push nop into pipeline - decode
+  //jtagarm7tdmi_nop( 0);            // push nop into pipeline - execute
   
-  cmddatalong[3] = jtagarm7tdmi_instr_primitive(val+32, 0); // push 32-bit word on data bus - execute state
-  cmddatalong[4] = jtagarm7tdmi_instr_primitive(val+16, 0); // push 32-bit word on data bus - execute state
-  cmddatalong[5] = jtagarm7tdmi_instr_primitive(val, 0); // push 32-bit word on data bus - execute state
-  cmddatalong[6] = jtagarm7tdmi_instr_primitive(val-16, 0); // push 32-bit word on data bus - execute state
+  jtagarm7tdmi_instr_primitive(val, 0); // push 32-bit word on data bus
+  jtagarm7tdmi_instr_primitive(val, 0); // push 32-bit word on data bus
+  jtagarm7tdmi_instr_primitive(val, 0); // push 32-bit word on data bus
+  jtagarm7tdmi_nop( 0);            // push nop into pipeline - executed 
+  jtagarm7tdmi_nop( 0);            // push nop into pipeline - executed 
 
   if (reg == ARM_REG_PC){
-    cmddatalong[7] = jtagarm7tdmi_nop( 0);
-    cmddatalong[8] = jtagarm7tdmi_nop( 0);
+    jtagarm7tdmi_nop( 0);
+    jtagarm7tdmi_nop( 0);
   }
-  cmddatalong[9] = jtagarm7tdmi_instr_primitive(val-32, 0); // push 32-bit word on data bus - execute state
-
-  retval = cmddatalong[5];
-  return(retval);
+  jtagarm7tdmi_nop( 0);
 }
 
 
 
-
-//! Get all registers.  Return an array
-unsigned long* jtagarm7tdmi_get_registers() {
-  cmddatalong[1] = jtagarm7tdmi_instr_primitive(ARM_INSTR_SKANKREGS,0);
-  cmddatalong[2] = jtagarm7tdmi_nop( 0);
-  cmddatalong[3] = jtagarm7tdmi_nop( 0);
-  cmddatalong[4] = jtagarm7tdmi_nop( 0);
-  cmddatalong[5] = jtagarm7tdmi_nop( 0);
-  cmddatalong[6] = jtagarm7tdmi_nop( 0);
-  cmddatalong[7] = jtagarm7tdmi_nop( 0);
-  cmddatalong[8] = jtagarm7tdmi_nop( 0);
-  cmddatalong[9] = jtagarm7tdmi_nop( 0);
+//! Get all registers, placing them into cmddatalong[0-15]
+void jtagarm7tdmi_get_registers() {
+  debugstr("First 8 registers:");
+  debugstr("   Instr and the first few pops from the instruction chain:");
+  debughex32(ARM_INSTR_SKANKREGS1);
+  debughex32(jtagarm7tdmi_nop( 0));
+  debughex32(jtagarm7tdmi_instr_primitive(ARM_INSTR_SKANKREGS1,0));
+  debughex32(jtagarm7tdmi_nop( 0));
+  debughex32(jtagarm7tdmi_nop( 0));
+  cmddatalong[ 0] = jtagarm7tdmi_nop( 0);
+  cmddatalong[ 1] = jtagarm7tdmi_nop( 0);
+  cmddatalong[ 2] = jtagarm7tdmi_nop( 0);
+  cmddatalong[ 3] = jtagarm7tdmi_nop( 0);
+  cmddatalong[ 4] = jtagarm7tdmi_nop( 0);
+  cmddatalong[ 5] = jtagarm7tdmi_nop( 0);
+  cmddatalong[ 6] = jtagarm7tdmi_nop( 0);
+  cmddatalong[ 7] = jtagarm7tdmi_nop( 0);
+
+  debugstr("Last 8 registers:");
+  debugstr("   Instr and the first few pops from the instruction chain:");
+  debughex32(ARM_INSTR_SKANKREGS2);
+  debughex32(jtagarm7tdmi_nop( 0));
+  //jtagarm7tdmi_nop( 0);
+  debughex32(jtagarm7tdmi_instr_primitive(ARM_INSTR_SKANKREGS2,0));
+  debughex32(jtagarm7tdmi_nop( 0));
+  debughex32(jtagarm7tdmi_nop( 0));
+  //jtagarm7tdmi_nop( 0);
+  //jtagarm7tdmi_nop( 0);
+  cmddatalong[ 8] = jtagarm7tdmi_nop( 0);
+  cmddatalong[ 9] = jtagarm7tdmi_nop( 0);
   cmddatalong[10] = jtagarm7tdmi_nop( 0);
   cmddatalong[11] = jtagarm7tdmi_nop( 0);
   cmddatalong[12] = jtagarm7tdmi_nop( 0);
   cmddatalong[13] = jtagarm7tdmi_nop( 0);
   cmddatalong[14] = jtagarm7tdmi_nop( 0);
   cmddatalong[15] = jtagarm7tdmi_nop( 0);
-  cmddatalong[16] = jtagarm7tdmi_nop( 0);
-  cmddatalong[17] = jtagarm7tdmi_nop( 0);
-  cmddatalong[18] = jtagarm7tdmi_nop( 0);
-  cmddatalong[19] = jtagarm7tdmi_nop( 0);
-  cmddatalong[20] = jtagarm7tdmi_nop( 0);
-  return registers;
+  jtagarm7tdmi_nop( 0);
 }
 
-//! Get all registers.  Return an array
-unsigned long* jtagarm7tdmi_set_registers() {
-  cmddatalong[1] = jtagarm7tdmi_instr_primitive(ARM_INSTR_SKANKREGS,0);
-  cmddatalong[2] = jtagarm7tdmi_nop( 0);
-  cmddatalong[3] = jtagarm7tdmi_nop( 0);
-  cmddatalong[4] = jtagarm7tdmi_instr_primitive(0x40,0);
-  cmddatalong[5] = jtagarm7tdmi_instr_primitive(0x41,0);
-  cmddatalong[6] = jtagarm7tdmi_instr_primitive(0x42,0);
-  cmddatalong[7] = jtagarm7tdmi_instr_primitive(0x43,0);
-  cmddatalong[8] = jtagarm7tdmi_instr_primitive(0x44,0);
-  cmddatalong[9] = jtagarm7tdmi_instr_primitive(0x45,0);
-  cmddatalong[10] = jtagarm7tdmi_instr_primitive(0x46,0);
-  cmddatalong[11] = jtagarm7tdmi_instr_primitive(0x47,0);
-  cmddatalong[12] = jtagarm7tdmi_instr_primitive(0x48,0);
-  cmddatalong[13] = jtagarm7tdmi_instr_primitive(0x49,0);
-  cmddatalong[14] = jtagarm7tdmi_instr_primitive(0x4a,0);
-  cmddatalong[15] = jtagarm7tdmi_instr_primitive(0x4b,0);
-  cmddatalong[16] = jtagarm7tdmi_instr_primitive(0x4c,0);
-  cmddatalong[17] = jtagarm7tdmi_instr_primitive(0x4d,0);
-  cmddatalong[18] = jtagarm7tdmi_instr_primitive(0x4e,0);
-  cmddatalong[19] = jtagarm7tdmi_instr_primitive(0x4f,0);
-  return registers;
+//! Set all registers from cmddatalong[0-15]
+void jtagarm7tdmi_set_registers() {   //FIXME: BORKEN... TOTALLY TRYING TO BUY A VOWEL
+  debughex32(ARM_INSTR_CLOBBEREGS);
+  jtagarm7tdmi_nop( 0);
+  debughex32(jtagarm7tdmi_instr_primitive(ARM_INSTR_CLOBBEREGS,0));
+  jtagarm7tdmi_nop( 0);
+  jtagarm7tdmi_nop( 0);
+  debughex32(jtagarm7tdmi_instr_primitive(0x40,0));
+  debughex32(jtagarm7tdmi_instr_primitive(0x41,0));
+  debughex32(jtagarm7tdmi_instr_primitive(0x42,0));
+  debughex32(jtagarm7tdmi_instr_primitive(0x43,0));
+  debughex32(jtagarm7tdmi_instr_primitive(0x44,0));
+  debughex32(jtagarm7tdmi_instr_primitive(0x45,0));
+  debughex32(jtagarm7tdmi_instr_primitive(0x46,0));
+  debughex32(jtagarm7tdmi_instr_primitive(0x47,0));
+  debughex32(jtagarm7tdmi_instr_primitive(0x48,0));
+  debughex32(jtagarm7tdmi_instr_primitive(0x49,0));
+  debughex32(jtagarm7tdmi_instr_primitive(0x4a,0));
+  debughex32(jtagarm7tdmi_instr_primitive(0x4b,0));
+  debughex32(jtagarm7tdmi_instr_primitive(0x4c,0));
+  debughex32(jtagarm7tdmi_instr_primitive(0x4d,0));
+  debughex32(jtagarm7tdmi_instr_primitive(0x4e,0));
+  debughex32(jtagarm7tdmi_instr_primitive(0x4f,0));
 }
 
 //! Retrieve the CPSR Register value
 unsigned long jtagarm7tdmi_get_regCPSR() {
   unsigned long retval = 0;
 
-  cmddatalong[1] = jtagarm7tdmi_nop( 0); // push nop into pipeline - clean out the pipeline...
-  cmddatalong[2] = jtagarm7tdmi_instr_primitive(ARM_INSTR_MRS_R0_CPSR, 0); // push MRS_R0, CPSR into pipeline
-  cmddatalong[3] = jtagarm7tdmi_nop( 0); // push nop into pipeline - fetched
-  cmddatalong[4] = jtagarm7tdmi_nop( 0); // push nop into pipeline - decoded
-  cmddatalong[5] = jtagarm7tdmi_nop( 0); // push nop into pipeline - executed 
+  debughex32(jtagarm7tdmi_nop( 0)); // push nop into pipeline - clean out the pipeline...
+  debughex32(jtagarm7tdmi_instr_primitive(ARM_INSTR_MRS_R0_CPSR, 0)); // push MRS_R0, CPSR into pipeline
+  debughex32(jtagarm7tdmi_nop( 0)); // push nop into pipeline - fetched
+  debughex32(jtagarm7tdmi_nop( 0)); // push nop into pipeline - decoded
+  debughex32(jtagarm7tdmi_nop( 0)); // push nop into pipeline - executed 
   retval = jtagarm7tdmi_nop( 0);        // recover 32-bit word
-  cmddatalong[6] = retval;
+  debughex32(retval);
   return retval;
 }
 
@@ -702,14 +659,14 @@ unsigned long jtagarm7tdmi_get_regCPSR() {
 unsigned long jtagarm7tdmi_set_regCPSR(unsigned long val) {
   unsigned long retval = 0;
 
-  cmddatalong[1] = jtagarm7tdmi_nop( 0);        // push nop into pipeline - clean out the pipeline...
-  cmddatalong[1] = jtagarm7tdmi_instr_primitive(ARM_INSTR_MSR_cpsr_cxsf_R0, 0); // push MSR cpsr_cxsf, R0 into pipeline
-  cmddatalong[2] = jtagarm7tdmi_nop( 0);        // push nop into pipeline - fetched
-  cmddatalong[3] = jtagarm7tdmi_nop( 0);        // push nop into pipeline - decoded
+  debughex32(jtagarm7tdmi_nop( 0));        // push nop into pipeline - clean out the pipeline...
+  debughex32(jtagarm7tdmi_instr_primitive(ARM_INSTR_MSR_cpsr_cxsf_R0, 0)); // push MSR cpsr_cxsf, R0 into pipeline
+  debughex32(jtagarm7tdmi_nop( 0));        // push nop into pipeline - fetched
+  debughex32(jtagarm7tdmi_nop( 0));        // push nop into pipeline - decoded
   
   retval = jtagarm7tdmi_instr_primitive(val, 0);// push 32-bit word on data bus
-  cmddatalong[5] = jtagarm7tdmi_nop( 0);        // push nop into pipeline - executed 
-  cmddatalong[4] = retval;
+  debughex32(jtagarm7tdmi_nop( 0));        // push nop into pipeline - executed 
+  debughex32(retval);
   return(retval);
 }
 
@@ -770,27 +727,40 @@ unsigned long jtagarm7tdmi_getpc(){
 }
 
 //! Set Program Counter
-unsigned long jtagarm7tdmi_setpc(unsigned long adr){
-  return jtagarm7tdmi_set_register(ARM_REG_PC, adr);
+void jtagarm7tdmi_setpc(unsigned long adr){
+  jtagarm7tdmi_set_register(ARM_REG_PC, adr);
 }
 
 //! Halt CPU - returns 0xffff if the operation fails to complete within 
 unsigned long jtagarm7tdmi_haltcpu(){                   //  PROVEN
   int waitcount = 0xfff;
 
+/********  OLD WAY  ********/
   // store watchpoint info?  - not right now
   eice_write(EICE_WP1ADDR, 0);              // write 0 in watchpoint 1 address
   eice_write(EICE_WP1ADDRMASK, 0xffffffff); // write 0xffffffff in watchpoint 1 address mask
   eice_write(EICE_WP1DATA, 0);              // write 0 in watchpoint 1 data
   eice_write(EICE_WP1DATAMASK, 0xffffffff); // write 0xffffffff in watchpoint 1 data mask
-  eice_write(EICE_WP1CTRL, 0x100);          //!!!!! WTF!  THIS IS SUPPOSED TO BE 9 bits wide?!?  // write 0x00000100 in watchpoint 1 control value register (enables watchpoint)
-  eice_write(EICE_WP1CTRLMASK, 0xfffffff7); //!!!!! WTF!  THIS IS SUPPOSED TO BE 8 bits wide?!?  // write 0xfffffff7 in watchpoint 1 control mask - only detect the fetch instruction
+  eice_write(EICE_WP1CTRL, 0x100);          // write 0x00000100 in watchpoint 1 control value register (enables watchpoint)
+  eice_write(EICE_WP1CTRLMASK, 0xfffffff7); // write 0xfffffff7 in watchpoint 1 control mask - only detect the fetch instruction
+/***************************/
+
+/********  NEW WAY  *********/
+//  eice_write(EICE_DBGCTRL, JTAG_ARM7TDMI_DBG_DBGRQ);  // r/o register?
+/****************************/
 
   // poll until debug status says the cpu is in debug mode
   while (!(jtagarm7tdmi_get_dbgstate() & 0x1)   && waitcount-- > 0){
     delay(1);
   }
+
+/********  OLD WAY  ********/
   eice_write(EICE_WP1CTRL, 0x0);            // write 0 in watchpoint 0 control value - disables watchpoint 0
+/***************************/
+
+/********  NEW WAY  ********/
+//  eice_write(EICE_DBGCTRL, 0);        // r/o register?
+/***************************/
 
   // store the debug state
   last_halt_debug_state = jtagarm7tdmi_get_dbgstate();
@@ -842,7 +812,7 @@ unsigned long jtagarm7tdmi_releasecpu(){
 void jtagarm7tdmihandle(unsigned char app, unsigned char verb, unsigned long len){
   register char blocks;
   
-  unsigned int i,val,mlop;
+  unsigned int i,val;
   unsigned long at;
   
   jtagarm7tdmi_resettap();
@@ -850,17 +820,17 @@ void jtagarm7tdmihandle(unsigned char app, unsigned char verb, unsigned long len
   switch(verb){
   case START:
     //Enter JTAG mode.
-    cmddatalong[0] = jtagarm7tdmi_start();
-    cmddatalong[2] = jtagarm7tdmi_haltcpu();
+    debughex32(jtagarm7tdmi_start());
+    debughex32(jtagarm7tdmi_haltcpu());
     //jtagarm7tdmi_resettap();
-    cmddatalong[1] = jtagarm7tdmi_get_dbgstate();
+    debughex32(jtagarm7tdmi_get_dbgstate());
     
     // DEBUG: FIXME: NOT PART OF OPERATIONAL CODE
     //for (mlop=2;mlop<4;mlop++){
     //  jtagarm7tdmi_set_register(mlop, 0x43424140);
     //} 
     /////////////////////////////////////////////
-    txdata(app,verb,0xc);
+    txdata(app,verb,0x4);
     break;
   case JTAGARM7TDMI_READMEM:
   case PEEK:
@@ -914,8 +884,8 @@ void jtagarm7tdmihandle(unsigned char app, unsigned char verb, unsigned long len
   //case JTAGARM7TDMI_WRITEFLASH:
   //case JTAGARM7TDMI_ERASEFLASH:
   case JTAGARM7TDMI_SET_PC:
-    cmddatalong[0] = jtagarm7tdmi_setpc(cmddatalong[0]);
-    txdata(app,verb,4);
+    jtagarm7tdmi_setpc(cmddatalong[0]);
+    txdata(app,verb,0);
     break;
   case JTAGARM7TDMI_GET_DEBUG_CTRL:
     cmddatalong[0] = jtagarm7tdmi_get_dbgctrl();
@@ -938,26 +908,27 @@ void jtagarm7tdmihandle(unsigned char app, unsigned char verb, unsigned long len
   //case JTAGARM7TDMI_SET_WATCHPOINT:
   case JTAGARM7TDMI_GET_REGISTER:
        jtagarm7tdmi_resettap();
-    cmddatalong[0] = jtagarm7tdmi_get_register(cmddata[0]);
-    //cmddatalong[0] = test_get_register(cmddata[0]);
-    txdata(app,verb,96);
+    val = cmddata[0];
+    cmddatalong[0] = jtagarm7tdmi_get_register(val);
+    //debughex32(cmddatalong[0]);
+    txdata(app,verb,4);
     break;
   case JTAGARM7TDMI_SET_REGISTER:           // FIXME: NOT AT ALL CORRECT, THIS IS TESTING CODE ONLY
        jtagarm7tdmi_resettap();
-    cmddatalong[0] = cmddatalong[1];
+    debughex32(cmddatalong[1]);
     jtagarm7tdmi_set_register(cmddata[0], cmddatalong[1]);
-    //test_set_register(cmddata[0], cmddatalong[1]);
-    txdata(app,verb,96);
+    cmddatalong[0] = cmddatalong[1];
+    txdata(app,verb,4);
     break;
   case JTAGARM7TDMI_GET_REGISTERS:
        jtagarm7tdmi_resettap();
     jtagarm7tdmi_get_registers();
-    txdata(app,verb,200);
+    txdata(app,verb,64);
     break;
   case JTAGARM7TDMI_SET_REGISTERS:
        jtagarm7tdmi_resettap();
     jtagarm7tdmi_set_registers();
-    txdata(app,verb,200);
+    txdata(app,verb,64);
     break;
   case JTAGARM7TDMI_DEBUG_INSTR:
        jtagarm7tdmi_resettap();
@@ -1334,4 +1305,4 @@ IRQ mode shadow registers
 Undefined instruction mode shadow registers
   sp_und: 00000000   lr_und: 00000000 spsr_und: 300000df
 >
-
+*/