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

📄 new.asm

📁 8031单片机汇编器源代码
💻 ASM
字号:
; -----------------------------------------------------------------------; -		debugger v2.0 theo de raadt 21/1/90			-; NOTE: Hardware has to be specially built to handle this monitor.; The CODE address space and the DATA address space have to be mapped; on top of each other. ie. CHIP_READ* = 8031RD* AND 8031PSEN* and; CHIP_WRITE* = 8031WR*.; Within this (combined) address space, you can now use either MOVX; or MOVC for the same effect.; In this address space, I have placed the rom this debugger is in; at 0x0000 and ram at 0x8000. (additional IO would go in between.); (actually, I used a battery backed up static ram at 0x000.); Some of the commands in the help are actually unimplimented. It; suited my purposes. The 'g' command could be much improved, to have; a seperate register set for the called routine.; -----------------------------------------------------------------------		.org	0start:		nop			; for accidental overwrite if ram					; at 0 -- bug in my decode logic?		mov	P3, #0xff	; use alternate fns on P3		ajmp	main; -----------------------------------------------------------------------; SERINIT() nothing hurtserinit:	mov	TMOD, #0x20	; timer 1 mode 2	;	mov	TH1, #230	; 1200 baud		mov	TH1,#243	; 4800 baud		mov	TCON, #0x40	; turn timer 1 on		mov	SCON, #0x52	; serial mode 1 rx, fake tx done		mov	A, PCON		; for 4800 baud		setb	ACC.7		mov	PCON, A		ret; -----------------------------------------------------------------------; PUTC( A=char )putc:		jnb	TI, putc	; wait for tx free		clr	TI		mov	SBUF, A		; send it		ret; -----------------------------------------------------------------------; GETC() A=chargetc:		jnb	RI, getc		clr	RI		mov	A, SBUF		ret; -----------------------------------------------------------------------; GETS( DPTR=start of string ) A not hurt, DPTR at start of stringgets:		push	ACC		push	DPL		push	DPH		mov	A, R3		push	ACC		clr	A		mov	R3, Agets_nxt:	lcall	getc		cjne	A, #8, gets_notbs		ajmp	gets_bsgets_notbs:	cjne	A, #'\r', gets_good		clr	A		movx	@DPTR, A		pop	ACC		mov	R3, A		pop	DPH		pop	DPL		pop	ACC		retgets_bs:	mov	A, R3		; backspaced too far		jz	gets_nxt		dec	A		mov	R3, A		mov	A, #8		; "\b \b"		lcall	putc		mov	A, #' '		lcall	putc		mov	A, #8		lcall	putc		setb	C		; this is "dec DPTR"		mov	A, DPL		subb	A, #0		mov	DPL, A		mov	A, DPH		subb	A, #0		mov	DPH, A		ajmp	gets_nxtgets_good:	movx	@DPTR, A		lcall	putc		inc	DPTR		inc	R3		ajmp	gets_nxt; ----------------------------------------------------------------------; HEXPARSE( DPTR=string ) A not hurt, DPTR advanced, R0/R1 [H/L] returnhexparse:	push	ACChp_char:	movx	A, @DPTR	; get char		clr	C		subb	A, #'a'		jc	hp_notalpha	; < 'a' not hex alpha char		subb	A, #5+1		jnc	hp_notalpha	; > 'f' not hex aplha char		movx	A, @DPTR		clr	C		subb	A, #'a'-10		sjmp	hp_nybblehp_notalpha:	movx	A, @DPTR		clr	C		subb	A, #'0'		jc	hp_notdigit	; < '0' not hex digit		subb	A, #9+1		jnc	hp_notdigit	; > '9' not hex digit		movx	A, @DPTR		clr	C		subb	A, #'0'hp_nybble:	inc	DPTR		anl	A, #0x0f		push	ACC		;     R0       R1		mov	A, R0		;  HHHH LLLL hhhh llll		swap	A		anl	A, #0xf0		mov	R0, A		mov	A, R1		swap	A		; shift left by nybble		anl	A, #0x0f		orl	A, R0		mov	R0, A		mov	A, R1		swap	A		anl	A, #0xf0		mov	R1, A		pop	ACC		orl	A, R1		mov	R1, A		;  LLLL hhhh llll aaaa	;	debugging	;	push	ACC	;	push	DPL	;	push	DPH	;	mov	DPH, R0	;	mov	DPL, R1	;	lcall	putword	;	lcall	putnl	;	pop	DPH	;	pop	DPL	;	pop	ACC		sjmp	hp_charhp_notdigit:	pop	ACC		ret; ----------------------------------------------------------------------; EATSPACE( DPTR=string ) A not hurt, DPTR advancedeatspace:	push	ACCeatspace_loop:	movx	A, @DPTR		cjne	A, #' ', eatspace_done		inc	DPTR		sjmp	eatspace_loopeatspace_done:	pop	ACC		ret; -----------------------------------------------------------------------; PUTS( DPTR=string ) A not hurt, DPTR at end of stringputs:		push	ACCputs_ch:	movx	A, @DPTR	; get ch		jz	puts_q		; null - finished str		lcall	putc		inc	DPTR		sjmp	puts_ch		; go for nextputs_q:		pop	ACC		ret; -----------------------------------------------------------------------; PUTNL() nothing hurtputnl:		push	ACC		mov	A, #0x0d		lcall	putc		mov	A, #0x0a		lcall	putc		pop	ACC		ret; -----------------------------------------------------------------------; putword( DPTR=word) nothing hurtputword:	push	ACC		mov	A, DPH		lcall	putbyte		mov	A, DPL		lcall	putbyte		pop	ACC		ret; -----------------------------------------------------------------------; putbyte( A=byte) nothing hurtputbyte:	push	ACC		push	ACC		swap	A		lcall	putnyb		pop	ACC		lcall	putnyb		pop	ACC		ret; -----------------------------------------------------------------------; putnyb( A=nybble ) A hurtputnyb:		anl	A, #0x0f		push	ACC		clr	C		subb	A, #10		jc	pn_digit	; <= 9, then it's a digit		add	A, #'a'		; alphabetic		lcall	putc		pop	ACC		retpn_digit:	pop	ACC		; it's a digit		add	A, #'0'		lcall	putc		ret; -----------------------------------------------------------------------main:		lcall	serinit		mov	DPTR, #run_regs_psw	; initialize psw at least!		clr	A		movx	@DPTR, A		mov	DPTR, #title_msg		lcall	putsnext_line:	mov	A, #'>'		; prompt		lcall	putc		mov	DPTR, #linebuf	; get cmd		lcall	gets		lcall	putnlnext_cmd:	lcall	eatspace		movx	A, @DPTR		jz	next_line		; --------------------------------------------------		cjne	A, #'g', cmd_notgo	; g --> lcall addr..		push	DPL		push	DPH		push	ACC		push	PSW		mov	DPTR, #go_return	; come back to here..		push	DPL		push	DPH		mov	A, R1			; return on top of function		push	ACC		mov	A, R0		push	ACC		mov	DPTR, #run_regs		movx	A, @DPTR		; DPH		push	ACC		inc	DPTR		movx	A, @DPTR		; DPL		push	ACC		inc	DPTR		movx	A, @DPTR		; PSW		push	ACC		inc	DPTR		movx	A, @DPTR		; ACC		pop	PSW		pop	DPL		pop	DPH		ret				; enter itgo_return:	pop	PSW		pop	ACC		pop	DPH		pop	DPL		inc	DPTR		sjmp	next_cmd		; --------------------------------------------------cmd_notgo:	cjne	A, #'R', cmd_notregs		inc	DPTR		push	DPH		push	DPL		mov	DPTR, #regs_msg		; "DPTR ACC PSW"		lcall	puts		mov	DPTR, #run_regs		movx	A, @DPTR		acall	putbyte			;  xx		inc	DPTR		movx	A, @DPTR		acall	putbyte			;    xx		mov	A, #' '		acall	putc		inc	DPTR		movx	A, @DPTR		acall	putbyte			;       xx		inc	DPTR		mov	A, #' '		acall	putc		acall	putc		movx	A, @DPTR		acall	putbyte			;           xx		acall	putnl		pop	DPL		pop	DPH		sjmp	next_cmd		; --------------------------------------------------cmd_notregs:	cjne	A, #':', cmd_notenter	; : --> eat bytes..		inc	DPTR		mov	A, R2		push	ACC		mov	A, R3		push	ACC		mov	A, R0		mov	R2, A		mov	A, R1		mov	R3, A		; R2/R3 = mem ptrenter_next:	lcall	eatspace		movx	A, @DPTR		jz	enter_done		push	DPL		clr	A		mov	R0, A		mov	R1, A		lcall	hexparse		pop	ACC		cjne	A, DPL, enter_number		sjmp	enter_nextenter_number:	push	DPL		push	DPH		mov	DPH, R2		; put low byte only		mov	DPL, R3		mov	A, R1		movx	@DPTR, A		inc	DPTR		mov	R2, DPH		mov	R3, DPL		pop	DPH		pop	DPL		sjmp	enter_nextenter_done:	pop	ACC		mov	R3, A		pop	ACC		mov	R2, A		ajmp	next_cmd		; --------------------------------------------------cmd_notenter:	cjne	A, #'?', cmd_nothelp		push	DPL		push	DPH		mov	DPTR, #help_msg		lcall	puts		pop	DPH		pop	DPL		inc	DPTR		ajmp	next_cmd		; --------------------------------------------------cmd_nothelp:	cjne	A, #'l', cmd_notlist		push	DPL		push	DPH		push	B		clr	A		mov	B, ACC		mov	DPH, R0		mov	DPL, R1		lcall	putword		; addr: [16 bytes]		mov	A, #':'		lcall	putc		mov	A, #' '		lcall	putccl_nextbyte:	movx	A, @DPTR		lcall	putbyte		mov	A, #' '		lcall	putc		inc	DPTR		inc	B		mov	A, B		cjne	A, #16, cl_nextbyte		lcall	putnl		mov	R0, DPH		mov	R1, DPL		pop	B		pop	DPH		pop	DPL		inc	DPTR		ajmp	next_cmd		; --------------------------------------------------cmd_notlist:	cjne	A, #'r', cmd_notread		mov	A, R3		; counter		push	ACC		mov	A, R1		; base addr		push	ACC		inc	DPTR		; get arg		lcall	eatspace		push	DPL		lcall	hexparse		pop	ACC		cjne	A, DPL, nl_loop		mov	A, #1		mov	R3, A		sjmp	nl_startnl_loop:	mov	A, R1		mov	R3, A		nl_start:	pop	ACC		mov	R1, A		mov	A, R1		; put address		lcall	putbyte		mov	A, #':'		lcall	putcnl_nextloop:	mov	A, R3		; eat one loop		jz	nl_endloop		dec	A		mov	R3, A		mov	A, #' '		lcall	putc		mov	A, @R1		; put byte		lcall	putbyte		inc	R1		; inc address		sjmp	nl_nextloopnl_endloop:	lcall	putnl		pop	ACC		mov	R3, A		ajmp	next_cmd		; --------------------------------------------------cmd_notread:	cjne	A, #'w', cmd_notwrite		mov	A, R3		push	ACC		mov	A, R1		mov	R3, A		; save addr		inc	DPTRnr_nextbyte:	lcall	eatspace		movx	A, @DPTR		jz	nr_earlyeol	; [addr] w [EOL]		push	DPL		lcall	hexparse	; [addr] w [NONHEX]		pop	ACC		cjne	A, DPL, nr_good		sjmp	nr_earlyeolnr_good:	mov	A, R3		; R1 = value, R3 = addr		mov	R0, A		mov	A, R1		mov	@R0, A		ajmp	nr_nextbytenr_earlyeol:	pop	ACC		mov	R3, A		ajmp	next_cmd		; --------------------------------------------------cmd_notwrite:	cjne	A, #';', cmd_notcomment		ajmp	next_linecmd_notcomment:	push	DPL		clr	A		mov	R0, A		mov	R1, A		lcall	hexparse		; probably addr, see if ptr		pop	ACC			; moved, else error		cjne	A, DPL, cmd_more		sjmp	cmd_error		; --------------------------------------------------cmd_more:	;	debugging	;	push	DPL	;	push	DPH	;	mov	DPTR, #number_msg	;	lcall	puts	;	mov	DPH, R0	;	mov	DPL, R1	;	lcall	putword	;	lcall	putnl	;	pop	DPH	;	pop	DPL		ajmp	next_cmdcmd_error:	mov	DPTR, #error_msg		lcall	puts		ajmp	next_line; -----------------------------------------------------------------------title_msg:	.byte	"\r\n8031 mon v3.0\r\n", 0error_msg:	.byte	"syntax error\r\n", 0regs_msg:	.byte	"DPTR ACC PSW\r\n", 0help_msg:	.byte	"8031 mon v3.0\r\n"		.byte	"[addr] : [bytes]\tstore bytes\t"		.byte	"[addr] g\t\tcall address\r\n"		.byte	"[addr] l\t\tlist memory\t"		.byte	"[addr] r [count]\tlist onchip\r\n"		.byte	"[addr] w [bytes]\tstore onchip\t"		.byte	"; [comment]\t\tcomment\r\n"		.byte	"[value] D\t\tstore in DPTR\t"		.byte	"[value] A\t\tstore in ACC\r\n"		.byte	"[value] P\t\tstore in PSW\t"		.byte	"R\t\t\tprint registers\r\n", 0; -----------------------------------------------------------------------; sort of a bss segment; -----------------------------------------------------------------------		.org	0x8000run_regs:	.skip	2		; DPTR [H/L]run_regs_psw:	.skip	1		; PSW		.skip	1		; ACClinebuf:	.skip	256		.end

⌨️ 快捷键说明

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