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

📄 isojtag_avr910_3.4.s

📁 GCC source code for do it yoursel a avr programer and jtagice debuger.
💻 S
📖 第 1 页 / 共 2 页
字号:
w6:    
	cpi		u_data,0x79     // 'y' Clear LED (ignored)
	brne    w7
	rcall   getc		// ignore data byte
	sbi		LEDPORT,LEDBIT
	rjmp    put_ret

//**** Enter Programming Mode ****
// We require that the device code be selected before any of the other commands
w7:
//@@ Changes (V3.0)** V3.3 uses temp2 instead of r16 in V3.0 as temp reg
						//r16 is already used for device and caused a bug

	push	temp2		//Save temp2 
	ldi		ZL,lo8(pm(device_codes))	//Point Z to device code table
	ldi		ZH,hi8(pm(device_codes))
	lsl		ZL
	rol		ZH
w7_lp:
	rcall	get_codes	//Returns device code in dev_code
	mov		temp2,dev_code
	cpi		temp2,0xff	//Check for end of table
	breq	device_err	//Device code not found
	cp		temp2,device	//Found device code?
	breq	x_w7_lp		//Yes
	rjmp	w7_lp		//Next device code
x_w7_lp: 
	pop		temp2		//Restore temp2	
	rjmp	w72
device_err:
	pop		temp2		//Restore temp2
	rjmp	put_err		//Goto put_err()//
//@@

w72:	
	cpi		u_data,0x50		// 'P' Enter programming mode
	brne	w8
	rcall	spiinit			// spiinit()//
	rjmp	put_ret
//**** Write Program Memory, High Byte ****
w8:	
	cpi		u_data,0x43		// 'C' Write program memory, high byte
	brne	w9
	rcall	getc
w81:	
	ldi		s_data,0x48		// wrser(0x48)//		// SPI write (byte 1)
	rcall	wrser
	mov		s_data,addrh	// wrser(addrh)//		// SPI write (byte 2)
	rcall	wrser
	mov		s_data,addrl	// wrser(addrl)//		// SPI write (byte 3)
	rcall	wrser

	mov		s_data,u_data	// wrser(u_data)//	// SPI write (byte 4)
	rcall	wrser

	ldi		temp1,0x01		// Auto increment address!!!!
	clr		temp2
	add		addrl,temp1
	adc		addrh,temp2
	rjmp	writeFLASHdelay
//**** Write Program Memory, Low Byte ****
w9:	
	cpi		u_data,0x63     // 'c' Write program memory, low byte
	brne	w12
	rcall	getc
	ldi		s_data,0x40		//	wrser(0x40)//	// SPI write (byte 1)
	rcall	wrser
	mov		s_data,addrh	//	s_data = addrh//
w91:						// }
	rcall	wrser			// wrser(s_data)//	// SPI write (byte 2)
	mov		s_data,addrl	// wrser(addrl)//		// SPI write (byte 3)
	rcall	wrser
	mov		s_data,u_data	// wrser(u_data)//	// SPI write (byte 4)
	rcall	wrser
writeFLASHdelay:
//@@ Changes (V3.0)
	tst		pgm_mode
	brne	w92		//No delay if page mode (non zero value)	
//@@
	ldi		temp1,0x20	// delay(0x20)//		// 24585 cycles delay
	rcall	delay		//			// Page mode requires no delay!
w92:
	rjmp	put_ret		// goto reply()//

//**** Read Program Memory ****

w12:	
	cpi	u_data,0x52	// 'R' Read program memory
	brne	w10		//
	ldi	s_data,0x28	//	wrser(0x28)//	// SPI write (byte 1)
	rcall	wrser
	mov	s_data,addrh	//	s_data = addrh//
	rcall	wrser		// wrser(s_data)//	// SPI write (byte 2)
	mov	s_data,addrl	// wrser(addrl)//		// SPI write (byte 3)
	rcall	wrser
	rcall	rdser		// putc(rdser())//	// Send data (byte 4)
	mov	u_data,s_data
	rcall	putc
	ldi	s_data,0x20	//	wrser(0x20)//	// SPI write (byte 1)
	rcall	wrser
	mov	s_data,addrh	//	wrser(addrh)//	// SPI write (byte 2)
	rcall	wrser
	mov	s_data,addrl	//	wrser(addrl)//	// SPI write (byte 3)
	rcall	wrser
	rcall	rdser		//	putc(rdser())//	// Send data (byte 4)
	mov	u_data,s_data
	rcall	putc
	rjmp	readaddrinc

//**** Load Address ****

w10:	
	cpi	u_data,0x41	// 'A' Load address
	brne	w11
	rcall	getc		// addrh = getc()//
	mov	addrh,u_data
	rcall	getc		// addrl = getc()//
	mov	addrl,u_data
	rjmp	put_ret		// goto reply()//
//**** Write Data Memory ****
w11:	
	cpi		u_data,0x44	// 'D' Write data memory
	brne	w13
	rcall	getc
	ldi		s_data,0xc0
	rcall	wrser
	mov		s_data,addrh
	rcall	wrser
	mov		s_data,addrl
	rcall	wrser
	mov		s_data,u_data
	rcall	wrser
	ldi		temp1,0x20
	rcall	delay
	ldi		temp1,0x01	// Auto increment address!!!!
	clr		temp2
	add		addrl,temp1
	adc		addrh,temp2
	rjmp	put_ret

//**** Read Data Memory ****
w13:	
	cpi		u_data,0x64	// 'd' Read data memory
	brne	w14
	ldi		s_data,0xa0	//	wrser(0xA0)//	// SPI write (byte 1)
	rcall	wrser
	mov		s_data,addrh	//	s_data = addrh//
	rcall	wrser		// wrser(s_data)//	// SPI write (byte 2)
	mov		s_data,addrl	// wrser(addrl)//		// SPI write (byte 3)
	rcall	wrser
	rcall	rdser		// putc(rdser())//	// Send data (byte 4)
	mov	u_data,s_data
	rcall	putc
readaddrinc:
	ldi		temp1,0x01	// Auto increment address!!!!
	clr		temp2
	add		addrl,temp1
	adc		addrh,temp2
	rjmp	waitcmd		// goto waitcmd()//
//**** Leave Programming Mode ****
w14:	
	cpi		u_data,0x4c	// 'L' Leave programming mode
	brne	w15
	ldi		temp1,(1<<resetpin)
	out		DDRB,temp1	// PB4 (RESET) is output, the rest is input
	set_reset			// set RESET = 1
	rjmp    put_ret
//**** Chip Erase ****
w15:	
	cpi		u_data,0x65     // 'e' Chip erase
	brne	w16
	ldi		s_data,0xac
	rcall	wrser
	ldi		s_data,0x80
	rcall	wrser
	ldi		s_data,0x04
	rcall	wrser
	ldi		s_data,0x00
	rcall	wrser
	ldi		temp1,0x30
	rcall	delay
	rjmp	put_ret
//**** Write Lock Bits ****
w16:	
	cpi		u_data,0x6c	// 'l' Write lock bits
	brne	w17
	rcall	getc
	ldi		s_data,0xac
	rcall	wrser
	mov		s_data,u_data
	andi	s_data,0x06
	ori		s_data,0xe0
	rcall	wrser
	ldi		s_data,0x00
	rcall	wrser
w162:	
	ldi		s_data,0x00
	rcall	wrser
	ldi		temp1,0x30
	rcall	delay
	rjmp	put_ret
//**** Read Signature Bytes ****

w17:	
	cpi		u_data,0x73	// 's' Read signature bytes
	brne	w18
	ldi		param1,0x02
	rcall	w17call
	ldi		param1,0x01
	rcall	w17call
	ldi		param1,0x00
	rcall	w17call
	rjmp	waitcmd

w17call:
	ldi		s_data,0x30
	rcall	wrser
	ldi		s_data,0x00
	rcall	wrser
	mov		s_data,param1
	rcall	wrser
	rcall	rdser
	mov		u_data,s_data
	rcall	putc
	ret
//**** Write Program Memory Page ****
w18:	
	cpi		u_data,0x6D		// 'm' Write Program Memory Page
	brne	w19
	ldi		s_data,0x4c		//	wrser(0x4c)//	// SPI write (byte 1)
	rcall	wrser
	mov		s_data,addrh	//	wrser(addrh)//	// SPI write (byte 2)
	rcall	wrser
	mov		s_data,addrl	//	wrser(addrl)//	// SPI write (byte 3)
	rcall	wrser
	ldi		s_data,0x00		//	wrser(0x00)//	// SPI write (byte 4)
	rcall	wrser
	ldi		temp1,0xff		// 	delay(0xFF)//	// 0x20 = 24585 cycles delay
	rcall	delay
	rjmp	put_ret
//**** Universal Command ****
w19:	
	cpi		u_data,0x3A		// ':' Universal Command
	brne	w191
	rcall	getc
	mov		cmd1,u_data
	rcall	getc
	mov		cmd2,u_data
	rcall	getc
	mov		cmd3,u_data
	clr		u_data
	rcall	NewUniversal
	ldi		temp1,0xff		// 	delay(0xFF)//	// 0x20 = 24585 cycles delay
	rcall	delay
	rjmp	put_ret
//**** New Universal Command ****
w191:	
	cpi		u_data,'.'		// '.' New Universal Command
	brne	w99
	rcall	getc
	mov		cmd1,u_data
	rcall	getc
	mov		cmd2,u_data
	rcall	getc
	mov		cmd3,u_data
	rcall	getc
	rcall	NewUniversal
	ldi		temp1,0xff		// 	delay(0xFF)//	// 0x20 = 24585 cycles delay
	rcall	delay
	rjmp	put_ret
NewUniversal:
	mov		s_data,cmd1
	rcall	wrser
	mov		s_data,cmd2
	rcall	wrser
	mov		s_data,cmd3
	rcall	wrser
	mov		s_data,u_data
	rcall	wrser
	mov		u_data,rd_s_data
	rcall	putc
	ret
w99:
//**** Command Error ****

put_err:
	ldi		u_data,0x3f		// putc('?')//	\\ send '?'
	rcall	putc
	rjmp	waitcmd
//**** Reply Command ****
put_ret:
	ldi		u_data,0x0d	// putc(0x0D)//	\\ send CR
	rcall	putc
	rjmp	waitcmd
delay1us:			//    count               R16
	nop                                                       
	cpi     temp1,0x03
	breq    finished
	nop
	nop
loop:   
	dec     temp1 
	cpi     temp1,0x03
	brne    loop               
finished:
	ret     

//@@ Changes (V3.0)

//msg_out Output string of ASCII bytes starting at Z 
//until end of message ($00)
msg_out:
    lpm					//read char into r0
    mov		u_data,r0	//Copy to r20
    cpi		u_data,0x00	//End of message?
    breq	END_MSG		//Yes
	rcall	putc		//output character
	adiw	ZL,1
	rjmp	msg_out
END_MSG:
	ret

//get_codes return code in dev_code and program mode in pgm_mode
get_codes:
	lpm					//Read device code from table
	mov		dev_code,r0	//Copy to dev_code
	adiw	ZL,1		//Increment pointer
	lpm					//Read program mode from table
	mov		pgm_mode,r0	//Copy to pgm_mode
	adiw	ZL,1		//Increment pointer
	ret

//Programmer ID
ID:
	.asciz	"AVR ISP"
	
	
//Device codes and program mode table (0(zero)=byte mode, <>0=page mode)
//i.e. 'P' can be used for page mode for easier reading.

device_codes:

//AT90S1200 rev. A	//From 0x00-0x0f unused yet
	.byte	0x10,0
//AT90S1200 rev. B	
	.byte	0x11,0
//AT90S1200 rev. C
	.byte	0x12,0
//AT90S1200
	.byte	0x13,0		//From 0x14-0x1f unused yet
//AT90S2313
	.byte	0x20,0		//From 0x21-0x27 unused yet
//AT90S4414
	.byte	0x28,0		//From 0x29-0x2f unused yet
//AT90S4433
	.byte	0x30,0		//From 0x31-0x33 unused yet
//AT90S2333
	.byte	0x34,0		//From 0x35-0x37 unused yet
//AT90S8515
	.byte	0x38,0		//0x39 unused yet
//ATmega8515
	.byte	0x3A,0x01
//ATmega8515 BOOT
	.byte	0x3B,0x01	//From 0x3c-0x40 unused yet
//ATmega103
	.byte	0x41,0x01
//ATmega603
	.byte	0x42,0x01
//ATmega128
	.byte	0x43,0x01
//ATmega128 BOOT
	.byte	0x44,0x01
//ATmega64
	.byte	0x45,0x01	//* v1.40
//ATmega64 BOOT
	.byte	0x46,0x01	//* v1.40  0x47 unused yet

//AT90S2323
	.byte	0x48,0		//From 0x49-0x4b unused yet		
//AT90S2343
	.byte	0x4C,0		//From 0x4d-0x4f unused yet
					//0x50,0x51 used. From 0x52-0x54 unused yet
//
//ATtiny12
	.byte	0x55,0
//ATtiny15
	.byte	0x56,0		//0x57 unused yet
//ATtiny19
	.byte	0x58,0		//From 0x59-0x5b unused yet	
//ATtiny28
	.byte	0x5C,0		//0x5d unused yet
//ATtiny26
	.byte	0x5E,0x01	//0x5f unused yet
//
//ATmega161
	.byte	0x60,0x01
//ATmega161 BOOT
	.byte	0x61,0x01	//0x62-0x63 unused yet
//ATmega163
	.byte	0x64,0x01
//ATmega83
	.byte	0x65,0x01
//ATmega163 BOOT
	.byte	0x66,0x01
//ATmega83 BOOT
	.byte	0x67,0x01
//AT90S8535
	.byte	0x68,0
//ATmega8535
	.byte	0x69,0x01	//* v1.40 From 0x6a-0x6b unused yet	
//***ATmega8535 BOOT??
//	.byte	0x6a,0x01
//
//AT90S4434
	.byte	0x6C,0		//From 0x6d-0x6f unused yet	
//AT90C8534
	.byte	0x70,0
//AT90C8544
	.byte	0x71,0
//ATmega32
	.byte	0x72,'P'
//ATmega32 BOOT
	.byte	0x73,0x01
//ATmega16
	.byte	0x74,0x01
//ATmega16 BOOT
	.byte	0x75,0x01
//ATmega8
	.byte	0x76,0x01
//ATmega8 BOOT
	.byte	0x77,0x01
//ATmega169
	.byte	0x78,0x01	//* v1.40
//ATmega169 BOOT
	.byte	0x79,0x01	//* v1.40 From 0x7a-0x7f unused yet

//test
//	.byte	0x08,0x01
//	.byte	0x09,0x01
//	.byte	0x0a,0x01
//	.byte	0x0b,0x01

//These devices are not supported by this hardware
//ATtiny10
//	.byte	0x51,0
//ATtiny11
//	.byte	0x50,0
//AT89C1051
//	.byte	0x80,0
//AT89C2051
//	.byte	0x81,0		//From 0x82-0x85 unused yet
//AT89S8252
//	.byte	0x86,0
//AT89S53
//	.byte	0x87,0		//From 0x88-0x9f unused yet

end_of_device_codes:
	.word	0xffff

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -