📄 jtag_avr_spy.asm
字号:
brcs chk_tck2 ; if so then point to start ldi r30,low(int0_buf) ; of buffer ldi r31,high(int0_buf)chk_tck2 : mov int0_out_lo,r30 mov int0_out_hi,r31 pop r31 pop r30 pop r25 ret;*----------------------------------------------------------------------------;* the one that must monitor the JTAG bus;* in : state;* out : state;* used :;*----------------------------------------------------------------------------jtag_spy : rcall chk_tck ldi r30,low(jmp_base) ; prepare jump table ldi r31,high(jmp_base) add r30,state adc r31,zero_reg ; only interested in carry ijmp;; don't change order. Is jump table of switch/case statements;jmp_base : rjmp _idle rjmp _select_dr rjmp _capture_dr rjmp _shift_dr rjmp _exit_dr rjmp _pause_dr rjmp _exit2_dr rjmp _update_dr rjmp _select_ir rjmp _capture_ir rjmp _shift_ir rjmp _exit_ir rjmp _pause_ir rjmp _exit2_ir rjmp _update_ir rjmp _reset;; state = IDLE;_idle : sbrs level,TMS ; check TMS level rjmp jtag2 ; if TMS = 1 then ldi state,SELECT_DR ; state = SELECT_DR rjmp jtag2;; state = SELECT_DR;_select_dr : sbrs level,TMS ; check TMS level rjmp jtag3 ; if TMS = 1 then ldi state,SELECT_IR ; state = SELECT_IR rjmp jtag5 ; elsejtag3 : ldi state,CAPTURE_DR ; state = CAPTURE_DR ldi r24,'D' ; output 'D'jtag4 : rcall outchjtag5 : rjmp jtag2;; state = CAPTURE_DR;_capture_dr : sbrs level,TMS ; check TMS level rjmp jtag6 ; if TMS = 1 ldi state,EXIT_DR ; state = EXIT_DR rjmp jtag2 ; elsejtag6 : ldi state,SHIFT_DR ; state = SHIFT_DR mov jtag_bit_nr,zero_reg mov jtag_byte_nr,zero_reg ; byte counters ldi jptr_outl,low(jtag_out) ldi jptr_outh,high(jtag_out) ldi jptr_inl,low(jtag_in) ldi jptr_inh,high(jtag_in) st x,zero_reg ; *jptr_in = *jptr_out st y,zero_reg ; = 0 mov sh_tdx_bit,one_reg ; sh_tdx_bit = 1 rjmp jtag2;; state = SHIFT_DR;; lsb first in (TDI), lsb first out (TDO);_shift_dr : sbrs level,TMS ; check TMS level rjmp jtag7 ; if TMS = 1 ldi state,EXIT_DR ; state = EXIT_DR 1jtag7 : ld r30,x sbrc level,TDI ; if TDI = 1 2/1 or r30,sh_tdx_bit ; *jptr_in += tdx_bit 1 st x,r30 ; 2; ld r30,y ; 2 sbrc level,TDO ; if TDO = 1 2/1 or r30,sh_tdx_bit ; *jptr_out += tdx_bit 1 st y,r30 ; 2; add sh_tdx_bit,sh_tdx_bit ; tdx_bit <<= 1 inc jtag_bit_nr ; 1 cpi jtag_bit_nr,8 ; byte done ? 1 brcs jtag9 ; 1/2 clr jtag_bit_nr ; then next byte 1 inc jtag_byte_nr ; 1 adiw jptr_outh:jptr_outl,1 ; *++jptr_out = 2 adiw jptr_inh:jptr_inl,1 ; *++jptr_in = 1 2 st x,zero_reg st y,zero_reg mov sh_tdx_bit,one_reg ; sh_tdx_bit = 1jtag9 : rjmp jtag2;; state = EXIT_DR;_exit_dr : sbrs level,TMS ; if TMS = 1 rjmp jtag11 ; state = UPDATE_DR ldi state,UPDATE_DR rjmp jtag2 ; elsejtag11 : ldi state,PAUSE_DR ; state = PAUSE_DR rjmp jtag2;; state = UPDATE_DR;_update_dr : ldi r26,low(jtag_in) ; output all ldi r27,high(jtag_in) ; bytes of ldi r24,'I' ; output of jtag ice rcall outch sub jtag_byte_nr,one_reg ; is same for input and output mov r30,jtag_byte_nrjtag12 : ld r24,x+ rcall out_byte ; total bytes of jtag_in sub jtag_byte_nr,one_reg ; to rs232 brpl jtag12 ldi r28,low(jtag_out) ; same for jtag_out ldi r29,high(jtag_out) ldi r24,LF rcall outch ldi r24,CR rcall outch ldi r24,SPACE rcall outch ldi r24,'O' ; input to jtag ice rcall outchjtag13 : ld r24,y+ ; of all bytes rcall out_byte sub r30,one_reg brpl jtag13 ldi r24,LF rcall outch ldi r24,CR ; and close output rcall outch sbrs level,TMS ; if TMS = 1 rjmp jtag14 ldi state,SELECT_DR ; state = SELECT_DR rjmp jtag2 ; elsejtag14 : ldi state,IDLE ; state = IDLE rjmp jtag2;; state = PAUSE_DR;_pause_dr : sbrs level,TMS ; if TMS = 1 rjmp jtag15 ; state = EXIT2_DR ldi state,EXIT2_DR ; rjmp jtag2 ; elsejtag15 : rjmp jtag2 ; donot know ??;; state = EXIT2_DR;_exit2_dr : sbrs level,TMS ; if TMS = 1 rjmp jtag16 ; state = UPDATE_DR ldi state,UPDATE_DR rjmp jtag2 ; elsejtag16 : ldi state,SHIFT_DR ; state = SHIFT_DR rjmp jtag2;; state = SELECT_IR;_select_ir : sbrs level,TMS ; if TMS = 1 rjmp jtag17 ldi state,RESET ; state = RESET eor tck_cnt,tck_cnt ; tck_cnt = 0 rjmp jtag2 ; elsejtag17 : ldi state,CAPTURE_IR ; state = CAPTURE_IR ldi r24,'I' ; output 'I' rcall outch rjmp jtag2;; state = CAPTURE_IR;_capture_ir : sbrs level,TMS rjmp jtag18 ; if TMS = 1 ldi state,EXIT_IR ; state = EXIT_IR rjmp jtag2 ; elsejtag18 : ldi state,SHIFT_IR ; state = SHIFT_IR mov jtag_bit_nr,zero_reg mov jtag_byte_nr,zero_reg ; byte counters ldi jptr_outl,low(jtag_out) ldi jptr_outh,high(jtag_out) ldi jptr_inl,low(jtag_in) ldi jptr_inh,high(jtag_in) st x,zero_reg ; *jptr_in = *jptr_out st y,zero_reg ; = 0 mov sh_tdx_bit,one_reg rjmp jtag2;; state = SHIFT_IR;_shift_ir : sbrs level,TMS ; check TMS level clockcyclus rjmp jtag19 ; if TMS = 1 ldi state,EXIT_IR ; state = EXIT_IR 1jtag19 : ld r30,x sbrc level,TDI ; if TDI = 1 2/1 or r30,sh_tdx_bit ; *jptr_in += tdx_bit 1 st x,r30 ; 2; ld r30,y ; 2 sbrc level,TDO ; if TDO = 1 2/1 or r30,sh_tdx_bit ; *jptr_out += tdx_bit 1 st y,r30 ; 2 add sh_tdx_bit,sh_tdx_bit ; tdx_bit <<= 1 inc jtag_bit_nr ; 1 cpi jtag_bit_nr,8 ; byte done ? 1 brcs jtag20 ; 1/2 clr jtag_bit_nr ; then next byte 1 inc jtag_byte_nr ; 1 adiw jptr_inh:jptr_inl,1 ; *++jptr_in = 2 adiw jptr_outh:jptr_outl,1 ; *++jptr_out = 0 2 st x,zero_reg st x,zero_reg mov sh_tdx_bit,one_reg ; sh_tdx_bit = 1jtag20 : rjmp jtag2;; state = EXIT_IR;_exit_ir : sbrs level,TMS ; if TMS = 1 rjmp jtag22 ; state = UPDATE_IR ldi state,UPDATE_IR rjmp jtag2 ; elsejtag22 : ldi state,PAUSE_IR ; state = PAUSE_IR rjmp jtag2;; state = PAUSE_IR;_pause_ir : sbrs level,TMS rjmp jtag23 ; state = EXIT2_IR ldi state,EXIT2_IR ; rjmp jtag2 ; elsejtag23 : rjmp jtag2 ; donot know ??;; state EXIT2_IR;_exit2_ir : sbrs level,TMS ; if TMS = 1 rjmp jtag24 ; state = UPDATE_IR ldi state,UPDATE_IR rjmp jtag2 ; elsejtag24 : ldi state,SHIFT_IR ; state = SHIFT_IR rjmp jtag2;; state = UPDATE_IR;_update_ir : ldi r26,low(jtag_in) ; output all ldi r27,high(jtag_in) ; bytes of ldi r24,'I' ; output of jtag ice rcall outch sub jtag_byte_nr,one_reg mov r30,jtag_byte_nrjtag25 : ld r24,x+ rcall out_byte ; total bytes of jtag_in sub jtag_byte_nr,one_reg ; to rs232 brpl jtag25 ldi r28,low(jtag_out) ; same for jtag_out ldi r29,high(jtag_out) ldi r24,LF rcall outch ldi r24,CR rcall outch ldi r24,SPACE rcall outch ldi r24,'O' ; input to jtag ice rcall outchjtag26 : ld r24,y+ ; of all bytes rcall out_byte sub r30,one_reg brpl jtag26 ldi r24,LF rcall outch ldi r24,CR ; and close output rcall outch sbrs level,TMS ; if TMS = 1 rjmp jtag27 ldi state,SELECT_DR ; state = SELECT_DR rjmp jtag2 ; elsejtag27 : ldi state,IDLE ; state = IDLE rjmp jtag2;; state = RESET;_reset : sbrs level,TMS ; if TMS = 1 rjmp jtag28 inc tck_cnt ; tck_cnt++ rjmp jtag2 ; elsejtag28 : cpi tck_cnt,2 ; if tck_cnt >= 2 brcs jtag2 ldi r24,'R' ; output 'R' rcall outch ldi r24,LF rcall outch ldi r24,CR rcall outch ldi state,IDLE ; state = IDLEjtag2 : ret;*----------------------------------------------------------------------------;* in : r30, r31 : ptr to string;* out : -;* used : r24;* destroyed : r30, r31;*----------------------------------------------------------------------------pr_str : push r0 push r24pr_str2 : lpm ; get character in program space tst r0 ; end of string ? breq pr_str1 mov r24,r0 ; no transmit it rcall outch adiw r31:r30,1 ; and next character in string rjmp pr_str2pr_str1 : pop r24 pop r0 ret;*----------------------------------------------------------------------------;*----------------------------------------------------------------------------pr_prompt : ldi r30,low(prompt) ; is only valid for ldi r31,high(prompt) lsl r30 ; Atmel assembler rol r31 rcall pr_str ret;*----------------------------------------------------------------------------;* initialise in rising edge interrupt;*----------------------------------------------------------------------------init_int0 : ldi r24,(1<<IRQ_SENSE00) + (1<<IRQ_SENSE01) out mcu_cr,r24 ldi r24,(1<<INT0) out gi_ctl,r24 ldi r24,(1<<INTF1) + (1<<INTF0) + (1<<INTF2) out gifr,r24 ret;*----------------------------------------------------------------------------;* set to receiver and transmitter interrupt. for now put this on 115200 baud;*----------------------------------------------------------------------------init_rs232 : ldi r24,(1<<RXCIE) + (1<<RX_EN) + (1<<TX_EN) out ucr,r24 ldi r24,(1<<U2X) ; double baudrate out usr,r24 ldi r24,(1<<UR_SEL) + (1<<CHAR_SIZ1) + (1<<CHAR_SIZ0) out ubrrh_ucr_c,r24 out ubrrh_ucr_c,zero_reg ; high baudrate = 0 ldi r24,BAUD_115200 out ubrrl,r24 in r24,usr in r24,udr ; flush receiver ret;*----------------------------------------------------------------------------;*----------------------------------------------------------------------------init_io : rcall init_rs232 rcall init_int0 ret;*----------------------------------------------------------------------------;*----------------------------------------------------------------------------init_var : ldi r24,low(int0_buf) ldi r25,high(int0_buf) mov int0_in_lo,r24 mov int0_in_hi,r25 mov int0_out_lo,r24 mov int0_out_hi,r25 ldi r24,low(rx_buf) ldi r25,high(rx_buf) mov rx_in_lo,r24 mov rx_in_hi,r25 mov rx_out_lo,r24 mov rx_out_hi,r25 adiw r25:r24,MAX_BUF mov rx_end_lo,r24 mov rx_end_hi,r25 ldi r24,low(tx_buf) ldi r25,high(tx_buf) mov tx_in_lo,r24 mov tx_in_hi,r25 mov tx_out_lo,r24 mov tx_out_hi,r25 adiw r25:r24,MAX_BUF mov tx_end_lo,r24 mov tx_end_hi,r25 sts rx_cnt,zero_reg sts tx_cnt,zero_reg sts int0_cnt,zero_reg mov jtag_bit_nr,zero_reg mov jtag_byte_nr,zero_reg ldi state,IDLE ret;*----------------------------------------------------------------------------;*----------------------------------------------------------------------------init_spy : rcall init_io rcall init_var ret;*----------------------------------------------------------------------------;*----------------------------------------------------------------------------main : ldi r16,low(stack-1) ; points to one place ldi r17,high(stack-1) ; before start of stack ! out spl,r16 out sph,r17 eor zero_reg,zero_reg mov r1,r0 inc r1 rcall init_spy sei rcall pr_promptmain1 : rcall jtag_spy; rcall getch; rcall outch rjmp main1;*----------------------------------------------------------------------------;*----------------------------------------------------------------------------prompt : .db "jtag spy V1 Copyright (C) 2002",LF,CR .db "Armand ten Doesschate <a.doesschate@hccnet.nl>",LF,CR,0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -