-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);
- cmddataword[1] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_STR_R0_r0,0);
- cmddataword[2] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_MOV_R0_PC,0);
- cmddataword[3] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_STR_R0_r0,0);
- cmddataword[4] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_BX_PC,0);
- cmddataword[5] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_NOP,0);
- cmddataword[6] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_NOP,0);
- jtagarm7tdmi_resettap(); // seems necessary for some reason. ugh.
+unsigned long jtagarm7tdmi_setMode_ARM(unsigned char restart){ // PROVEN BUT FUGLY! FIXME: clean up and store and replace clobbered r0
+ jtagarm7tdmi_resettap(); // seems necessary for some reason. ugh.
+ unsigned long retval = 0xffL;
+ if ((current_dbgstate & JTAG_ARM7TDMI_DBG_TBIT)){
+ debugstr("=== Switching to ARM mode ===");
+ cmddatalong[1] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_NOP,0);
+ cmddatalong[2] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_STR_R0_r0,0);
+ cmddatalong[3] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_MOV_R0_PC,0);
+ cmddatalong[4] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_STR_R0_r0,restart);
+ cmddatalong[5] = jtagarm7tdmi_instr_primitive(THUMB_INSTR_BX_PC,0);
+ } else {
+ jtagarm7tdmi_set_register(15,(last_halt_pc|0xfffffffc)-24);
+ jtagarm7tdmi_nop( restart);
+ cmddatalong[1] = jtagarm7tdmi_instr_primitive(ARM_INSTR_B_IMM,0);
+ }
+ if (restart) {
+ jtagarm7tdmi_restart();
+ } else {
+ jtagarm7tdmi_nop(0);
+ jtagarm7tdmi_nop(0);
+ jtagarm7tdmi_nop(0);
+ jtagarm7tdmi_set_register(0,cmddataword[5]);
+ }
+ jtagarm7tdmi_resettap(); // seems necessary for some reason. ugh.
+ current_dbgstate = jtagarm7tdmi_get_dbgstate();
+ return(retval);
+}
+
+
+//! set the current mode to ARM, returns PC (FIXME). Should be used by releasecpu()
+unsigned long jtagarm7tdmi_setMode_THUMB(unsigned char restart){ // PROVEN
+ jtagarm7tdmi_resettap(); // seems necessary for some reason. ugh.
+ debugstr("=== Switching to THUMB mode ===");
+ unsigned long retval = 0xffL;
+ while (!(current_dbgstate & JTAG_ARM7TDMI_DBG_TBIT)&& retval-- > 0){
+ last_halt_pc |= 1;
+ jtagarm7tdmi_set_register(0, last_halt_pc);
+ jtagarm7tdmi_instr_primitive(ARM_INSTR_NOP,restart);
+ jtagarm7tdmi_instr_primitive(ARM_INSTR_BX_R0,0);
+ if (restart) {
+ jtagarm7tdmi_restart();
+ } else {
+ jtagarm7tdmi_instr_primitive(ARM_INSTR_NOP,0);
+ jtagarm7tdmi_instr_primitive(ARM_INSTR_NOP,0);
+ jtagarm7tdmi_resettap(); // seems necessary for some reason.
+ }
+ current_dbgstate = jtagarm7tdmi_get_dbgstate();