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

📄 newloader.asm

📁 web51的开发库
💻 ASM
字号:
;; FCON	.equ	AUXR,  0x8E	.equ	AUXR2, 0xA2	.equ	FCON,  0xD1	.equ	EECON, 0xD2	.equ	EETIM, 0xD3	.equ	XAF,    0x02	.equ	WrUSR1, 0x50	;;Write User Flash	.equ	WrUSR2, 0xA0	.equ	WrXAF1, 0x52	;;Write Extra Flash	.equ	WrXAF2, 0xA2	.equ	FPS,    0x08	;;Flash Map Program Space	.equ	CR, 0x0D	.equ	LF, 0x0A	;; XAF	.equ	BSB, 0x00	; FF Boot Status Byte	.equ	SBV, 0x01	; FC Software Boot Vector	.equ	HSB, 0x04	; 18/1B Hardware Security Byte	.equ	SSB, 0x05	; FF Software Security Byte;	.equ	BOT, 0x06	;    Boot Reference ???	.equ	MID, 0x30	; 58 Manufacturer ID				;    (58 - Atmel-WM)	.equ	ID1, 0x31	; D7 Device ID # 1				;    (D7 - C51 X2 Electrically Erasable)	.equ	ID2, 0x60	; FC Device ID # 2				;    (FC - memories size)	.equ	ID3, 0x61	; FF Device ID # 3				;    (FF - revision 0)	.datacount:		.ds.b	1oscclk:		.ds.b	1pointer:	.ds.b	1	;; write pointer to data bufferhex_checksum:	.ds.b	1	;; hex record checksumdbuffer:	.ds.b	22	;; data input buffer	.equ	LOADER,   0xFC00	.equ	APIENTRY, 0xFFF0	.text	.org	LOADER;; ISP start;;   FC00	ljmp	ISP;; ISP status byte check;;   FC03	mov	R1, #7	mov	DPTR, #1	;; Read boot status byte	;; input	;;  R1   = 0x07	;;  DPTR = 0x0001	;; output	;;  Acc = value of byte read	acall	API	jz	jmp0		; if boot_status = 0 goto 0x0000	mov	R1, #7	mov	DPTR, #2	;; Read boot vector	;; input	;;  R1   = 0x07	;;  DPTR = 0x0002	;; output	;;  Acc = value of byte read	acall	API	mov	DPH, A		; else goto (boot_vector << 8)	mov	DPL, #0	clr	A	jmp	@A+DPTRjmp0:	ljmp	0ISP:	mov	R0, #0x7FramClr:	mov	@R0, #0	djnz	R0, ramClr	mov	AUXR,  #0b00001101;			  ..0..... RD/, WR/ 6 clock length;			  ....11.. 1024 bytes XRAM;			  ......0.Internal data memory access;			  .......1 ALE only if MOVX or MOVC	acall	autobaud	; wait for 'U'	setb	TI	mov	a, #'U'	; "echo" initial character	acall	CO	setb	RENnextLineLoop:	clr	RI	mov	hex_checksum, #0	mov	pointer, #dbufferWaitColon:	acall	UCICO	cjne	A, #':', WaitColon ; wait for start of hex record	acall	read2char	;; buffer	;;  0123456789......	;; :NNAAAARRDD..DDCC	mov	A, dbuffer	; No of data bytes	add	A, #4		; + 2 bytes address + 1 byte record type	mov	R3, A		; + 1 byte checksumr2chlp:	acall	read2char	djnz	R3,r2chlp	mov	A, hex_checksum	jz	checksumOK				; checksumBAD	mov	a, #'X'	; checksum error	acall	CO	acall	CRLFnextLine:	acall	CRLF	ajmp	nextLineLoopchecksumOK:	acall	hexAPI	ajmp	nextLinehexAPI:	;; dbuffer	;;  01234....	;; :NAARD..DC	mov	A, dbuffer+3	;; switch (record_type)	cjne	A, #0, Hn0	ajmp	hexAPI0Hn0:	cjne	A, #1, Hn1	ajmp	hexAPI1Hn1:	cjne	A, #2, Hn2	ajmp	hexAPI2Hn2:	cjne	A, #3, Hn3	ajmp	hexAPI3Hn3:	cjne	A, #4, Hn4	ajmp	hexAPI4Hn4:	cjne	A, #5, Hn5	ajmp	hexAPI5Hn5:	cjne	A, #0x10, Hn10	ajmp	hexAPI10Hn10:	cjne	A, #0x20, Hn20	ajmp	hexAPI20Hn20:	ret;*********** Fn 0  - Write data to Flash ******************;*********** Fn 10 - Write data to XRAM  ******************;*********** Fn 20 - Write data to EEPROM *****************hexAPI0:hexAPI10:hexAPI20:	;; dbuffer	;;  01234	;; :NAARDD..DDC	acall	swSecurityBits	jnb	Acc.0, lockLB0	; LB0 programmed ?	mov	DPH, dbuffer+1	mov	DPL, dbuffer+2	mov	count, #1nextByteToFlash:	mov	A, count	setb	C	subb	A, dbuffer	jnc	noNextByte	mov	A, #dbuffer+3	add	A, count	mov	R0, A	mov	a, dbuffer+3	cjne	a, #0, otherWrite	mov	A, @R0	acall	movAccToFlashnxtWr:	inc	DPTR	inc	count	sjmp	nextByteToFlashotherWrite:	cjne	a, #0x10, writeEEprom	mov	A, @R0	movx	@dptr,a	sjmp	nxtWrwriteEEprom:	mov	A, EECON	jb	Acc.0, writeEEprom	mov	a,oscclk	clr	C	rlc	a			; * 2	clr	C	rlc	a			; * 4	add	a,oscclk		; * 5	mov	EETIM, a	mov	EECON, #0x02		; Enable EEPROM Space bit	mov	A, @R0	movx	@dptr,a	sjmp	nxtWrnoNextByte:	mov	a, dbuffer+3	cjne	a, #0, otherFlush	acall	flushFlash	ajmp	printDot		; RETURNotherFlush:	cjne	a, #0x10, flushEEprom	ajmp	printDot		; RETURNflushEEprom:	mov	R2, IE		; save IE	clr	EA		; disable all interrupts	mov	EECON, #0x50	; Write Sequence	mov	EECON, #0xA0	mov	IE, R2		; restore IE	ajmp	printDot		; RETURNlockLB0:mov	a, #'P'	ajmp	CO			; RETURN;*********** Fn 1 ******************;*********** Fn 3 ******************hexAPI3:	;; dbuffer	;;  01234	;; :NAARDD..DDC	mov	A, dbuffer+4	cjne	A, #7, noSubf7	;; full chip erase (include boot vector / status byte	;;  and software security bit erase)	acall	EraseFlash	sjmp	EraseBootnoSubf7:	cjne	A, #4, noSubf4	;; Reset Boot Vector and Status Byte	acall	swSecurityBits	jnb	Acc.0, lockB	; LB0 programmed ?EraseBoot:	acall	API4		; Erase boot vector 				;  status byte (set to high(LOADER))	mov	DPTR, #BSB	; Erase boot status byte	mov	A, #0xFF	; boot status byte = 0xFF	acall	API6	sjmp	subfContnoSubf4:	cjne	A, #6, noSubf6	;; Program Status Byte or Boot Vector	acall	swSecurityBits	jnb	Acc.0, lockB	; LB0 programmed ?noSubf6:	cjne	A, #5, noSubf5	;; Program Software Security Bits	acall	swSecurityBits	jnb	Acc.4, lockB	; LB1 programmed ?noSubf5:	acall	api_call	; get parameters from hex record and call APIsubfCont:hexAPI1:			; hex eof record	ajmp	printDot	; RETURNlockB:	mov	a, #'P'	ajmp	CO		; RETURN;*********** Fn 2 ******************hexAPI2:			; specify oscilator frequncy	mov	oscclk, dbuffer+4	ajmp	printDot	; RETURN;*********** Fn 4 - DUMP data / Blank Check ******************hexAPI4:; display device data or blank check 	;; dbuffer	;;  0123456789	;; :NAA4SSEEFC	acall	swSecurityBits	jb	Acc.4, LB1OK	; LB1 programmed ?	mov	a, #'L'	ajmp	CO		; Error RETURN	LB1OK:	;; dbuffer	;;  0123456789	;; :NxxRSSEEFC	mov	DPH, dbuffer+4		; starting address	mov	DPL, dbuffer+5	mov	A, dbuffer+8	; subfunction				; blank check = 1, display data = 0	xrl	a,#1	jnz	display_datablankTestLoop:	acall	API3	;; Read device data	;; input  DPTR = address of byte read	;; output Acc = value of byte read	xrl	A, #0xFF	jnz	blankFAIL	mov	A, dbuffer+6	; ending address	cjne	A, DPH, noEnd	mov	A, dbuffer+7	cjne	A, DPL, noEnd	ajmp	printDot	; RETURN -  O.K. print '.'noEnd:	inc	DPTR	sjmp	blankTestLoopblankFAIL:	mov	a, DPH		; else print failed address	acall	printhex	mov	a, DPL	ajmp	printhex	; RETURNdisplay_data:	acall	CRLF	mov	count, #0	mov	a, DPH	acall	printhex	mov	a, DPL	acall	printhex	mov	a, #'='	acall	COdisplayNextByte:	mov	A, dbuffer+8	; subfunction				; blank check = 1, display data = 0	jnb	Acc.1, displayFlash	jb	Acc.0, displayEeprom	movx	a,@dptr		; display XRAM = 2	ajmp	displayAlldisplayEeprom:			; display EEPROM = 3	mov	EECON, #2	; set Enable EEPROM Space bit	movx	a,@dptr	mov	EECON, #0	; clear Enable EEPROM Space bit	ajmp	displayAlldisplayFlash:	acall	API3	;; Read device data	;; input  DPTR = address of byte read	;; output Acc = value of byte readdisplayAll:	acall	printhex	;; dbuffer	;;  0123456789	;; :NxxRSSEEFC	mov	A, dbuffer+6	; ending address	cjne	A, DPH, noDumpEnd	mov	A, dbuffer+7	cjne	A, DPL, noDumpEnd	ret			; RETURNnoDumpEnd:	inc	DPTR	inc	count	mov	A, count	jnb	Acc.4, displayNextByte	; 16 bytes / line	sjmp	display_data;*********** Fn 5 ******************hexAPI5:	;; dbuffer	;;  01234	;; :NAARFSC	mov	A, dbuffer+4	cjne	A, #7, noFunc7	mov	A, dbuffer+5	jz	noFunc7		; Function 0700	acall	swSecurityBits	jnb	Acc.4, lockL	; LB1 programmed ?noFunc7:	acall	api_call	; get parameters from hex record and call API	acall	printhex	ajmp	printDot	; RETURNlockL:	mov	a, #'L'	ajmp	CO		; RETURN;**************************************************************EraseFlash:	mov	DPTR, #0	; start of flashnextFlashPage:	mov	R0, #0x80	; page sizenextFlashByte:	mov	A, #0xFF	acall	movAccToFlash	mov	A, #HIGH(LOADER-1)	cjne	A, DPH, noLastFlashAddr	mov	A, #LOW(LOADER-1)	cjne	A, DPL, noLastFlashAddrlastFlashAddr:	acall	flushFlash	mov	DPTR, #SSB	mov	A, #0xFF	ajmp	API6noLastFlashAddr:	inc	DPTR	djnz	R0, nextFlashByte	acall	flushFlash	sjmp	nextFlashPagemovAccToFlash:	orl	FCON, #FPS	; Enable FLASH	movx	@DPTR, A	; Write Flash	ret;**************************************************************	;; *******************	;; *****  API 0  *****	;; *******************		;; input	;;  R1  = 0x00	;;  DPH = 0x00	;; output	;;  Acc = value of byte read	;; input	;;  DPL = 0x00	;; Read copy of the manufacturer ID	;; input	;;  DPL = 0x01	;; Read copy of the device ID #1	;; input	;;  DPL = 0x02	;; Read copy of the device ID #2	;; input	;;  DPL = 0x03	;; Read copy of the device ID #3API0:	mov	A, DPL	jz	API0_0	dec	A	jz	API0_1	dec	A	jz	API0_2	sjmp	API0_3API0_0:	mov	DPTR, #MID	; Manufacturer ID	sjmp	rdXAFAPI0_1:	mov	DPTR, #ID1	; Device ID # 1	sjmp	rdXAFAPI0_2:	mov	DPTR, #ID2	; Device ID # 2	sjmp	rdXAFAPI0_3:	mov	DPTR, #ID3	; Device ID # 3	sjmp	rdXAF	;; *******************	;; *****  API 2  *****	;; *******************	;; Program data byte			;; input	;;  R1   = 0x02	;;  DPTR = address of byte to program	;;  Acc  = byte to program	;; output	;;  Acc  = 0x00 if pass, !0x00 if failAPI2:	acall	movAccToFlash	clr	AflushFlash:	mov	R2, IE		; save IE	clr	EA		; disable all interrupts	mov	FCON, #WrUSR1	mov	FCON, #WrUSR2	mov	IE, R2		; restore IEdisableFlashWr:	mov	FCON, #0	; Disable FLASH	ret	;; *******************	;; *****  API 3  *****	;; *******************	;; Read device data		;; input	;;  R1   = 0x03	;;  DPTR = address of byte read	;; output	;;  Acc = value of byte readAPI3:	anl	FCON, #0	mov	A, #0	movc	A, @A+DPTR	ret	;; *******************	;; *****  API 4  *****	;; *******************	;; Erase boot vector status byte		;; input	;;  R1   = 0x04	;;  DPH  = 0x00	;;  DPL  = don't care	;; output	;;  noneAPI4:	mov	DPTR, #SBV	mov	A, #HIGH(LOADER)	;; *******************	;; *****  API 6  *****	;; *******************		;; input	;;  R1   = 0x06	;;  DPH  = 0x00	;; Program boot status byte	;;  DPL  = 0x00	;;  Acc  = status byte	;; output	;;  Acc  = status byte	;; Program boot vector	;;  DPL  = 0x01	;;  Acc  = boot vector	;; output	;;  Acc  = boot vectorAPI6:	mov	DPH, #0	acall	movAccToFlash	mov	R4, IE		; save IE	clr	EA		; disable all interrupts	mov	FCON, #WrXAF1	mov	FCON, #WrXAF2	mov	IE, R4		; restore IS	sjmp	disableFlashWr	;; *******************	;; *****  API 5  *****	;; *******************	;; Program software security bit	;; input	;;  R1   = 0x05	;;  DPH  = 0x00	;;  DPL  = 0x00 - security bit # 1 (inhibit writing to FLASH)	;;         0x01 - security bit # 2 (inhibit FLASH verify)	;;         0x10 - allow ISP writing to FLASH	;;         0x11 - allow ISP FLASH verify	;; output	;;  noneAPI5:	mov	A, DPL	mov	DPTR, #SSB	xrl	A, #1	cjne	A, #1, API6	xrl	A, #0x11	sjmp	API6swSecurityBits:	mov	DPL, #0	;; *******************	;; *****  API 7  *****	;; *******************		;; input	;;  R1  = 0x07	;;  DPH = 0x00	;; Read software security bits	;; input	;;  DPL = 0x00	;; output	;;  Acc = value of byte read	;; Read boot status byte	;; input	;;  DPL = 0x01	;; output	;;  Acc = value of byte read	;; Read boot vector	;; input	;;  DPL = 0x02	;; output	;;  Acc = value of byte read	;; Read copy of the hardware security bits	;; input	;;  DPL = 0x03	;; output	;;  Acc = value of byte readAPI7:	mov	A, DPL	jz	API7SSB	dec	A	jz	API7BSB	dec	A	jz	API7SBV	mov	DPTR, #HSBrdXAF:	mov	FCON, #XAF	clr	A	movc	A, @A+DPTR	sjmp	disableFlashWrAPI7SSB:	mov	DPTR, #SSB	sjmp	rdXAFAPI7BSB:	mov	DPTR, #BSB	sjmp	rdXAFAPI7SBV:	mov	DPTR, #SBV	sjmp	rdXAF	;; *******************	;; *****  API 8  *****	;; *******************	;; Read bootloader version		;; input	;;  R1  = 0x08	;; output	;;  Acc = value of byte readAPI8:	mov	A, #0x24       	ret	;; *******************	;; *****  API 9  *****	;; *******************	;; Program data page			;; input	;;  R1    = 0x09	;;  DPTR0 = address of the first byte to program in the FLASH memory	;;  DPTR1 = address in XRAM of the first data to program	;;          (second data pointer)	;;  Acc   = number of bytes to program (max. single 128 byte page !)	;; output	;;  Acc   = 0x00 if pass, !0x00 if failAPI9:	anl	AUXR2, #(0xFF ^ 1); DPTR0	mov	R6, A	mov	R4, DPLWrByte9:inc	AUXR2		; DPTR1	movx	A, @DPTR	inc	DPTR	dec	AUXR2		; DPTR0	acall	movAccToFlash	clr	A	anl	FCON, #(0xFF ^ FPS) ; disable FLASH	inc	DPTR	djnz	R6, WrByte9	mov	DPL, R4	sjmp	flushFlash;**************************************************************autobaud:	;; wait for 'U' character 0x55	;; 10 10101010 1	mov	T2CON, #0;-_start_-;; 10 1	jb	RXD, .	;-v	jnb	RXD, .	;_^	setb	TR2	mov	R0, #3;-_start_--_1_--_2_--_3_--;; 10 1010101BD3:	jb	RXD, .	;-v	jnb	RXD, .	;_^	djnz	R0, BD3;-_start_--_1_--_2_--_3_--_4_--;; 10 10101010 1	jb	RXD, .	;-v	jnb	RXD, .	;_^	clr	TR2	dec	TL2	mov	A, TL2	cjne	A, #0xFF, NoDecTH2	dec	TH2	mov	A, TH2		;????NoDecTH2:	mov	R0, #3	;;TH2TL2 / 8ShT3:	clr	C	xch	A, TH2	rrc	A	xch	A, TH2	xch	A, TL2	rrc	A	xch	A, TL2	djnz	R0, ShT3	;;(TH2TL2 / 8) * 12	mov	A, TL2	mov	B, #12	mul	AB	mov	R6, B	mov	R0, #5	;;((TH2TL2 / 8) * 12) / 32ShT5:	xch	A, R6	clr	C	rrc	A	xch	A, R6	rrc	A	djnz	R0, ShT5	cpl	A	mov	RCAP2L, A	mov	A, R6	cpl	A	mov	RCAP2H, A	mov	SCON, #0x43	mov	T2CON, #0x30	setb	TR2	retCRLF:	mov	a, #CR	acall	CO	mov	a, #LF;	ajmp	COCO:	jnb	TI, .	clr	TI	mov	SBUF, a	retprintDot:	mov	a, #'.'	; O.K.	ajmp	COread2char:	;; buffer	;;  0123456789......	;; :NNAAAARRDD..DDCC	acall	GNibble	swap	a	mov	R0,a		; save high nibble	acall	GNibble	orl	a,R0		; merge high & low nibble	mov	R0,a	mov	A, pointer	xch	A, R0	mov	@R0, A		; save it to buffer	add	A, hex_checksum	mov	hex_checksum, A	inc	pointer	retprinthex:	push	acc	swap	a	acall	PNibl	pop	accPNibl:	anl	a,#0x0F	add	a,#0x90	da	a	addc	a,#0x40	da	a	ajmp	COCI:	jnb	RI, .	clr	RI	mov	A, SBUF	retUCICO:	acall	CI	acall	UCase	ajmp	COGNibble:acall	UCICO	mov	C,Acc.6	jnc	decimal		;0..9	add	a,#9		;0x41..0x46 -> 0x4A..4Fdecimal:anl	a,#0x0F	retUCase:	anl	a,#0x7F		;strip parity	mov	b,a	add	a,#(0x100 - 'a')	jnc	UCase0		;0x00..0x60	add	a,#(0x100 - ('z' + 1 - 'a'))	jc	UCase0		;0x7B..0x7F	mov	a,b	anl	a,#0x5F	retUCase0:	mov	a,b	ret;**************************************************************    .ascii	"(c)BCL 2002 - benedikt@lphard.cz"    .org	APIENTRY - 46api_call:	.using	0	;; dbuffer	;;  01234567	;; :NAARFSDC	mov	AR1, dbuffer+4	;API subfunction	mov	A, dbuffer+5	anl	A, #0x0F	; #15	mov	DPL, A		;API selection code	mov	A, dbuffer+6	;API data input (as need);	ajmp	APIAPIX:	cjne	R1, #8,Ln8    	ajmp	API8Ln8:	cjne	R1, #0,Ln0	ajmp	API0Ln0:	cjne	R1, #2,Ln2	ajmp	API2Ln2:	cjne	R1, #3,Ln3	ajmp	API3Ln3:	cjne	R1, #4,Ln4	ajmp	API4Ln4:	cjne	R1, #5,Ln5	ajmp	API5Ln5:	cjne	R1, #6,Ln6	ajmp	API6	;; Entry Point for API    .org	APIENTRY	;; FFF0API:	ajmp	APIXLn6:	cjne	R1, #7,Ln7	ajmp	API7Ln7:	cjne	R1, #9,Ln9	ajmp	API9Ln9:	ret	;; end

⌨️ 快捷键说明

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