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

📄 90stest.asm

📁 AT90s 串口下载线,稍加改动,能支持stk500自动升级程序
💻 ASM
📖 第 1 页 / 共 4 页
字号:

;====== 'V' - Return Software Version ======================================

w1:	
	cpi	u_data,'V'		; 'V' Return software version
	brne	w2
	table	SW_Ver
	rcall	put_string		; put software version
	rjmp	waitcmd


;====== 'v' - Return Hardware Version ======================================

w2:	
	cpi	u_data,'v'		; 'v' Return hardware version
	brne	w3
	table	HW_Ver
	rcall	put_string		; put hardware version
	rjmp	waitcmd

;====== 't' - Show Supported Devices =======================================

w3:	
	cpi	u_data,'t'		; 't' Show supported devices
	brne	w4
	table	Dev_S
	rcall	put_table		; put supported devices codes
	table	Dev_M
	rcall	put_table		; put supported devices codes
	ldi	u_data,0x00		; putc(0x00) - end of device list
	rcall	putc
	rjmp	waitcmd

;====== 'p' - Return Programmer Type =======================================

w4:	
	cpi	u_data,'p'		; 'p' Return programmer type
	brne	w5
	ldi	u_data,'S'		; putc('S') - serial programmer
	rcall	putc
	rjmp	waitcmd

;====== 'a' - Return autoincrement address support =========================

w5:	
	cpi	u_data,'a'		; 'a' Return address auto increment
	brne	w51
	ldi	u_data,'Y'		; putc('Y') - supports autoinc
	rcall	putc
	rjmp	waitcmd

;====== 'M' - Return enhanced Mode support (Note 14) ========================

w51:	
;	cpi	u_data,'M'		; 'M' Return enhanced mode Support
;	brne	w52
;	ldi u_data,'Y'			; putc('Y') - supports enhanced Mode
;	rcall putc
;	rjmp	waitcmd

;====== 'i' - Return Chip ID (Note 14) ======================================

w52:
	cpi	u_data,'i'		; 'i' Return Chip ID
	brne	w53
	table	ChipID
	rcall	put_string		; put Chip ID string 
	ldi u_data,0x0a			; putc(LF)
	rcall 	putc
	rjmp	put_ret

;====== 'b' - Return Block write Mode support (Note 17) ========================

w53:	
	cpi	u_data,'b'		; 'b' Return enhanced mode Support
	brne	w6
	ldi u_data,'Y'			; putc('Y') - supports enhanced Mode
	rcall putc
	ldi	u_data,high(BUFSIZE); putc((BUFSIZE>>8) & 0xff);
	rcall putc
	ldi	u_data,low(BUFSIZE)	; putc(BUFSIZE&0xff);
	rcall putc
	rjmp	waitcmd

;====== 'x' - Set LED ======================================================

w6:	
	cpi	u_data,'x'		; 'x' Set LED (LED off or green)
	brne	w61
	rcall	getc			; get parameter
	set_LED
	rjmp	put_ret

;====== 'y' - Clear LED ====================================================

w61:	
	cpi	u_data,'y'		; 'y' Clear LED (LED on or red)
	brne	w7
	rcall	getc			; get parameter
	clr_LED
	rjmp	put_ret


;===========================================================================

; We require that the device code be selected before any of the other commands

w7:
	table	Dev_S			; load pointer
	rcall	bel_table
	brcc	w71				; device belongs to table
	table	Dev_M	
	rcall	bel_table
	brcc	w71				; device belongs to table
	rjmp	put_err			; not match, goto put_err();

;====== 'P' - Enter Programming Mode =======================================

w71:	
	cpi	u_data,'P'		; 'P' Enter programming mode
	breq	w70
	rjmp	w8
w70:	
	clr_LED					; LED on
	catch_ports				; catch ports
	clr_SCK					; clear SCK
	pas_RESET				; set RESET passive
	ldi	temp1,50			; delay 50mS;
	rcall	delay
	act_RESET				; set RESET active
	ldi	temp1,50			; delay 50mS;
	rcall	delay	
	ldi	s_data,0xac	
	rcall	wrser			; wrser(0xac) SPI write (byte 1)
	ldi	s_data,0x53	
	rcall	wrser			; wrser(0x53) SPI write (byte 2)
							; SPI Synchronization (fix!)
	cpi	device,0x20			; if ( (device >= 0x20) && (device <= 0x7F) )
	brlo	s2
	tst	device
	brmi	s2	
	ldi	temp3,32			; count = 32;
s1:	rcall	rdser			; SPI read  (byte 3)
	cpi	s_data,0x53			; if (rdser == 0x53)
	breq	s3				; break
	ldi	s_data,0x00					
	rcall	wrser			; wrser(0x00) SPI write (byte 4)
	pulse_SCK				; pulse SCK
	ldi	s_data,0xac		
	rcall	wrser			; wrser(0xac) SPI write (byte 1)
	ldi	s_data,0x53		
	rcall	wrser			; wrser(0x53) SPI write (byte 2)
	dec	temp3				; count-1
	brne	s1				; loop
	rjmp	s3				; else
s2:	ldi	s_data,0x00	
	rcall	wrser			; wrser(0x00) SPI write (byte 3)
s3:	tst	device
	brmi	s4				; S89 device
	ldi	s_data,0x00	
	rcall	wrser			; wrser(0x00) SPI write (byte 4)
s4:	ldi	temp1,4				; delay 4mS;
	rcall	delay
	rjmp	put_ret

;====== 'c' - Write Program Memory, Low Byte ===============================

w8:	
	cpi	u_data,'c'		; 'c' Write program memory, low byte
	brne	w9
	rcall	getc			; get data byte
w8b: 	ldi	s_data,0x40
	mov	pol_cmd,s_data		; save command for polling	
	tst	device
	brmi	w81			; S89 device
	rcall	wrser			; wrser(0x40)   SPI write (byte 1)
	mov	s_data,addrh
	rjmp	w82
w81:
	mov	s_data,addrh		; s_data = (addrh << 3) | 0x02;
	rcall	shift_s_data3
	ori	s_data,0x02
w82:
	rcall	wrser			; wrser(addrh)  SPI write (byte 2)
	mov	s_data,addrl	
	rcall	wrser			; wrser(addrl)  SPI write (byte 3)
	mov	s_data,u_data	
	rcall	wrser			; wrser(u_data) SPI write (byte 4)
	mov	p_data,u_data		; save data for polling
	mov	pol_al,addrl		; save address for polling
	mov	pol_ah,addrh
	tst	device
	brpl	w83 
	adiw	addrl,1			; Auto increment address for S89 device
w83:
	rjmp	wait_S			; write FLASH delay

;====== 'C' - Write Program Memory, High Byte ==============================

w9:	
	cpi	u_data,'C'		; 'C' Write program memory, high byte
	brne	w92
	rcall	getc			; get data byte
w9a:	tst	device
	brmi	w91			; S89 device
	ldi	s_data,0x48	
	mov	pol_cmd,s_data		; save command for polling	
	rcall	wrser			; wrser(0x48)   SPI write (byte 1)
	mov	s_data,addrh	
	rcall	wrser			; wrser(addrh)  SPI write (byte 2)
	mov	s_data,addrl	
	rcall	wrser			; wrser(addrl)  SPI write (byte 3)
	mov	s_data,u_data		; wrser(u_data) SPI write (byte 4)
	rcall	wrser
	mov	p_data,u_data		; save data for polling
	mov	pol_al,addrl		; save address for polling
	mov	pol_ah,addrh
	adiw	addrl,1			; Auto increment address
	rjmp	wait_S			; write FLASH delay
w91:
	rjmp	put_err			; S89 device have byte wide program memory!	

;====== 'B' Block Write Memory (see Note 17) ======================

w92:	
	cpi	u_data,'B'		; 'B' Block Write Program Memory
	breq w92a
	rjmp w10
w92a:
	rcall	getc			; get count High Byte
	tst u_data
	breq w92b
	ldi u_data,1
	rjmp put_err	
w92b:
	rcall	getc			; get count Low Byte
	cpi u_data,BUFSIZE+1		; check maximum count 
	brlo w92c
	ldi u_data,2
	rjmp put_err
w92c:
	mov Bcnt1, u_data		; ignore BUFSIZE high Byte (must be 0 here)
	mov Bcnt2, u_data
	rcall	getc			; get Memory type to write
	mov Memtype,u_data		; Flag for Memtype
	clr XH
	ldi XL, RAMSTART		; set X pointer to SRAM begin
w93:
	rcall	getc			; get data until Bcnt1 is reached	
	st X+, u_data			; store data to SRAM
	dec Bcnt1
	brne w93
	clr XH
	ldi XL, RAMSTART		; set X pointer to SRAM begin
	ldi temp3,1
	mov B_Mode,temp3		; B_Mode != 0
	mov u_data,Memtype		; restore Memtype 
	cpi	u_data,'F'		; 'F' Flash Memory ist to write
	breq	w94a
	cpi	u_data,'E'		; 'E' eeprom Memory ist to write
	breq	w94				; Entry Point for Data Memory Block write
	ldi u_data,3
	rjmp put_err

w94:						; write Data (EEPROM) Memory
	ld u_data,X+
	rcall eeprom_write
	dec Bcnt2
	brne w94
	rjmp put_ret

;Entry Point for Flash Block write
w94a:
	table	Dev_M	
	rcall	bel_table
	brcc w95				; device belongs to table
	rjmp	w96				; not match, goto "non Paged" Mode
w95:						; Entry Point for AVRProg Block Flash write
	ldi	s_data,0x40			; write low byte
	rcall spi123
	ld	s_data, X+
	rcall	wrser			; wrser(s_data) SPI write (byte 4)
	ldi	s_data,0x48			; write high byte
	mov	pol_cmd,s_data		; save command for polling	
	rcall spi123
	ld	s_data, X+
	mov	p_data,s_data		; save data for polling
	mov	pol_al,addrl		; save address for polling
	mov	pol_ah,addrh
	rcall	wrser			; wrser(u_data) SPI write (byte 4)
	adiw	addrl,1			; Auto increment address
	dec Bcnt2
	breq w95b
	dec Bcnt2
	breq w95b
	tst B_Mode
	breq w95				; Loop for "Block Mode Commands" see Note 16
	dec Bcnt3				; count Bytes for Pagesize
	brne w95
w95b:
	tst B_Mode
	brne w95c
	rjmp put_ret
w95c:
	dec Bcnt3				; Bcnt3 will be set correct after write
	ldi	s_data,0x4c			; write Memory Page
	rcall	wrser			; wrser(0x4c)  SPI write (byte 1)
	mov	s_data,pol_ah		; last written Adress is in Page to be programmed!
	rcall	wrser			; wrser(addrh) SPI write (byte 2)
	mov	s_data,pol_al		; last written Adress is in Page to be programmed!
	rcall	wrser			; wrser(addrl) SPI write (byte 3)
	ldi	s_data,0x00
	rcall	wrser			; wrser(0x00)  SPI write (byte 4)
	mov Bcnt3,Pagewords		; reload Counter für Pagesize
	rjmp wait_M


;#@KL4 test for 89S8252 Device
w96:						; Non Page Mode Flash write
	tst	device
	brmi	w96b			; S89 device
	ld	p_data, X+			; load byte to Poll data
	cpi	p_data,0xFF			; if (p_data == 0xFF) 
	breq	w961			; skip burning
	ldi	s_data,0x40			; write low byte
	mov	pol_cmd,s_data		; save command for polling	
	rcall spi123
	mov	s_data,p_data		; reload data from Poll data
	rcall	wrser			; wrser(s_data) SPI write (byte 4)
	mov	pol_al,addrl		; save address for polling
	mov	pol_ah,addrh
	rcall Bws_pol
w961:
	dec Bcnt2
	ld	p_data, X+			; load byte to Poll data
	cpi	p_data,0xFF			; if (p_data == 0xFF) 
	breq	w962
	ldi	s_data,0x48			; write high byte
	mov	pol_cmd,s_data		; save command for polling	
	rcall spi123
	mov	s_data,p_data		; reload data from Poll data
	rcall	wrser			; wrser(u_data) SPI write (byte 4)
w96a:	mov	pol_al,addrl	; save address for polling
	mov	pol_ah,addrh
	rcall Bws_pol
w962:
	adiw	addrl,1			; Auto increment address
	dec Bcnt2
	brne w96
	rjmp put_ret			; reply

w96b:					; Code for 89S8252
;	ldi	s_data,0x40
;	mov	pol_cmd,s_data		; save command for polling	
	mov	s_data,addrh		; s_data = (addrh << 3) | 0x02;
	rcall	shift_s_data3
	ori	s_data,0x02
	rcall	wrser			; wrser(addrh)  SPI write (byte 1)
	mov	s_data,addrl	
	rcall	wrser			; wrser(addrl)  SPI write (byte 2)
	ld	s_data, X+	
	mov	p_data,s_data		; save data for polling
	rcall	wrser			; wrser(u_data) SPI write (byte 3)
	rjmp	w96a

;====== 'R' - Read Program Memory ==========================================

w10:	
	cpi	u_data,'R'		; 'R' Read program memory
	brne	w10B
	tst	device
	brmi	rpm1			; S89 device
	ldi	s_data,0x28			; read high Byte (order is different from Block Read!)
	rcall	wrser			; wrser(0x28)  SPI write (byte 1)
	mov	s_data,addrh
	rjmp	rpm2
rpm1:
	mov	s_data,addrh		; s_data = (addrh << 3) | 0x01;
	rcall	shift_s_data3
	ori	s_data,0x01
rpm2:
	rcall	wrser			; wrser(addrh) SPI write (byte 2)
	mov	s_data,addrl	
	rcall	wrser			; wrser(addrl) SPI write (byte 3)
	rcall	rdser			;              SPI read  (byte 4)
	mov	u_data,s_data
	rcall	putc			; send data
	tst	device
	brmi	rpm3			; S89 device
	ldi	s_data,0x20			; read Low Byte
	rcall	wrser			; wrser(0x20)  SPI write (byte 1)
	mov	s_data,addrh	
	rcall	wrser			; wrser(addrh) SPI write (byte 2)
	mov	s_data,addrl	
	rcall	wrser			; wrser(addrl) SPI write (byte 3)
	rcall	rdser			;              SPI read  (byte 4)
	mov	u_data,s_data
	rcall	putc			; send data
rpm3:
	adiw	addrl,1			; Auto increment address
	rjmp	waitcmd			; goto waitcmd();


;====== 'g' - Block Read Memory (See Note 17) ======================

w10B:	
	cpi	u_data,'g'		; 'g' Block Read Program Memory
	brne	w11
	rcall	getc			; XH = getc();
	mov	XH,u_data
	rcall	getc			; XL = getc();
	mov	XL,u_data
	rcall	getc			; getc(Memorytype);
	cpi u_data,'F'
	breq w10B2
	cpi u_data,'E'
	breq w10B1
	rjmp put_err
w10B1:
	rcall read_send_datamem
	sbiw XL, 1
   	brne w10B1
	rjmp waitcmd			; goto waitcmd();

w10B2:
 	rcall read_send_progmem
	tst device
	brmi w10B3
	sbiw XL, 2
	brne w10B2
	rjmp waitcmd
w10B3:
	sbiw XL, 1
   	brne w10B2
	rjmp waitcmd			; goto waitcmd();

;====== 'A' - Load Address =================================================

w11:	
	cpi	u_data,'A'		; 'A' Load address
	brne	w12
	rcall	getc			; addrh = getc();
	mov	addrh,u_data
	rcall	getc			; addrl = getc();
	mov	addrl,u_data
	rjmp	put_ret			; goto reply();

;====== 'D' - Write Data Memory ============================================

w12:	
	cpi	u_data,'D'		; 'D' Write data memory
	brne	w13
	rcall	getc			; get data
	rcall eeprom_write
	rjmp	put_ret



;====== 'd' - Read Data Memory =============================================

w13:	
	cpi	u_data,'d'		; 'd' Read data memory
	brne	w14
	rcall   read_send_datamem
	rjmp	waitcmd			; goto waitcmd();


;====== 'L' - Leave Programming Mode =======================================

w14:	
	cpi	u_data,'L'		; 'L' Leave programming mode
	brne	w142
w141:
	pas_RESET				; set RESET passive
	release_ports			; release ports
	set_LED					; LED off
	rjmp    put_ret

;====== 'E' - Exit , release all Ports, inhibit AVR910 =====================

w142:	
	cpi	u_data,'E'		; 'E' xit
	brne	w15
	rjmp w141				; exit command for AVR Prog

⌨️ 快捷键说明

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