⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jtag_avr_spy.asm

📁 AVR JTAG Software Debug Tools
💻 ASM
📖 第 1 页 / 共 2 页
字号:
		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 + -