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

📄 myextra.asm

📁 8051 monitor programm: - use external ram to run user program - use eeprom to save user program
💻 ASM
📖 第 1 页 / 共 4 页
字号:
;user installable disassembler and single-step run for paulmon2

.equ	locat, 0x1000		;location for these commands (usually 1000)
.equ	paulmon2, 0x0000	;location where paulmon2 is at (usually 0000)

.equ    phex1, 0x2E+paulmon2
.equ    cout, 0x30+paulmon2		;send acc to uart
.equ    cin, 0x32+paulmon2              ;getchar()
.equ    phex, 0x34+paulmon2		;print acc in hex
.equ    phex16, 0x36+paulmon2		;print dptr in hex
.equ    pstr, 0x38+paulmon2		;print string @dptr
.equ    ghex, 0x3A+paulmon2		;get two-digit hex (acc)
.equ    ghex16, 0x3C+paulmon2		;get four-digit hex (dptr)
.equ	upper, 0x40+paulmon2		;convert acc to uppercase
.equ	newline, 0x48+paulmon2
.equ	pcstr, 0x45+paulmon2
.equ	pint, 0x50+paulmon2
.equ	smart_wr, 0x56+paulmon2
.equ	cin_filter, 0x62+paulmon2
.equ	asc2hex, 0x65+paulmon2

.equ    getnum, 0x19D2
.equ    pint16u, 0x53+paulmon2


.equ    list_key, 'L'		;list (disassemble)
.equ    step_key, 'S'		;single step run
.equ    vtedit_key, 'E'           ;memory editor

;for testing in ram
;.equ    list_key, 'K'           ;list (disassemble)
;.equ    step_key, 'W'           ;single step run
;.equ    vtedit_key, 'E'           ;memory editor



;location of two bytes used by single-step in internal ram which we
;hope the user's program won't write over while it's running.  These
;two bytes hold the address of the previous instruction, so we can
;show the last executed instruction with the current value of the
;registers, which is much more intuitive than displaying the next
;instruction by grabbing the program counter from the stack as was
;done in PAULMON1's single step.

.equ    lastpc, 0x7C		;don't forget to update the docs below



;DIS
;---------------------------------------------------------;
;                                                         ;
;                      list command                       ;
;                                                         ;
;---------------------------------------------------------;


.org	locat
.db	0xA5,0xE5,0xE0,0xA5	;signiture
.db	254,list_key,0,0		;id (254=user installed command)
.db	0,0,0,0			;prompt code vector
.dB	0,0,0,0			;reserved
.db	0,0,0,0			;reserved
.db	0,0,0,0			;reserved
.db	0,0,0,0			;user defined
.db	255,255,255,255		;length and checksum (255=unused)
.db	"List",0

newline_h:ljmp	newline

.org	locat+64                ;executable code begins here

;	disassembler register usage
;	r0 = temporary storage
;	r1 = temporart storage
;	r2 = first instruction byte
;	r3 = second instruction byte
;	r4 = third instruction byte
;	r5 = line count
;	r6 = program counter (lsb)
;	r7 = program counter (msb)

list:	acall	newline_h
	mov	r5, #20
	clr	psw.1		;use ordinary long format
list2:	acall	disasm
	djnz	r5, list2
	ajmp	newline_h

disasm:
;print out the memory location and fetch the next three bytes
	mov	a, r7
	mov	dph, a
	acall	phex_h
	mov	a, r6
	mov	dpl, a
	acall	phex_h
        clr     a
        movc    a, @a+dptr
	mov	r2, a
	inc	dptr
	clr	a
	movc	a, @a+dptr
	mov	r3, a
	inc	dptr
	clr	a
	movc	a, @a+dptr
	mov	r4, a
        mov     a, r2
	anl	a, #00001000b
	jnz	lookup2

;fetch constants for instructions not using R0-R7
lookup1:
	mov	a, r2
	rr	a
	anl	a, #01111000b	;grab upper 4 bits
	mov	r0, a		;keep in r0 for a moment
	mov	a, r2
	anl	a, #00000111b	;get lower 3 bits
	orl	a, r0		;combine in upper 4
        mov     dptr, #opot1	;opot=operand offset table
        movc    a, @a+dptr
	sjmp    unpack

;fetch constants for R0-R7 instructions
lookup2:
        mov     a, r2
        swap    a
        anl     a, #00001111b
        mov     dptr, #opot2
        movc    a, @a+dptr

;now we'll unpack the operand code (# bytes and addr mode)
unpack:	anl     a, #00000011b
	mov	r0, a

;increment the r7/r6 pointer
        add     a, r6
        mov     r6, a
        mov     a, r7
        addc    a, #0
        mov     r7, a

;now print the bytes and spaces (r0 has # of bytes to print)
pbytes:	mov     a, #':'
        acall   cout_h
        acall   space_h
	jb	psw.1, pmnu		;skip bytes if running single-step
        mov     a, r2
        acall   phex_h
        acall   space_h
        cjne    r0, #1, pbytes2
        mov     r1, #11
        sjmp    pbytes4
pbytes2:mov     a, r3
        acall   phex_h
        acall   space_h
        cjne    r0, #2, pbytes3
        mov     r1, #8
        sjmp    pbytes4
pbytes3:mov     a, r4
        acall   phex_h
        mov     r1, #6
pbytes4:acall   space_h
        djnz    r1, pbytes4


;prints the mnunonic name and spaces
pmnu:   mov     a, r2
        anl     a, #00001000b
        jnz     pmnu_lookup2
pmnu_lookup1:
        mov     dptr, #mnot1    ;mnot=mnunonic offset table
        mov     a, r2
        rr      a
        anl     a, #01111000b   ;grab upper 4 bits
        mov     r0, a           ;keep in r0 for a moment
        mov     a, r2
        anl     a, #00000111b   ;get lower 3 bits
        orl     a, r0           ;combine in upper 4
        movc    a, @a+dptr
        mov     r1, a
	sjmp	pmnu0
pmnu_lookup2:
        mov     dptr, #mnot2    ;16 byte table for r0-r7 instructions
        mov     a, r2
        swap    a
        anl     a, #00001111b
        movc    a, @a+dptr
        mov     r1, a
pmnu0:	mov	dptr, #mnu_tbl
	mov     r0, #8
	clr	c
pmnu1:	mov	a, #' '
	jc	pmnu2
	mov	a, r1
	movc	a, @a+dptr
	inc	r1
	mov	c, acc.7
	anl	a, #0x7F
pmnu2:	acall	cout_h
	djnz	r0, pmnu1



;print the operands

        mov     a, #dasm2 & 255  ;(low)
        push    acc
        mov     a, #dasm2 >> 8   ;(high)
        push    acc

am_lookup0:
        mov     a, r2
        anl     a, #00001000b
        jnz     am_lookup2

;fetch constants for instructions not using R0-R7
am_lookup1:
        mov     a, r2
        rr      a
        anl     a, #01111000b   ;grab upper 4 bits
        mov     r0, a           ;keep in r0 for a moment
        mov     a, r2
        anl     a, #00000111b   ;get lower 3 bits
        orl     a, r0           ;combine in upper 4
        mov     dptr, #opot1    ;opot=operand offset table
        movc    a, @a+dptr
        sjmp    am_unpack

;fetch constants for R0-R7 instructions
am_lookup2:
        mov     a, r2
        swap    a
        anl     a, #00001111b
        mov     dptr, #opot2
        movc    a, @a+dptr

am_unpack:
        anl     a, #11111100b
        rr      a
        rr      a
        dec     a

	mov     dptr, #oprt      ;oprt=operand routine table
	rl	a
	add	a, dpl
	mov	dpl, a
	clr	a
	addc	a, dph
	mov	dph, a
	clr	a
        jmp     @a+dptr
dasm2:  
	ajmp	newline_h


oprt:   ajmp   opcd1           ;addr11
	ajmp   opcd2           ;A,Rn
	ajmp   opcd3           ;A,direct
	ajmp   opcd4           ;A,@Ri
	ajmp   opcd5           ;A,#data
	ajmp   opcd6           ;direct,A
	ajmp   opcd7           ;direct,#data
	ajmp   opcd8           ;C,bit
	ajmp   opcd9           ;C,/bit
	ajmp   opcd10          ;A,direct,rel
	ajmp   opcd11          ;A,#data,rel
	ajmp   opcd12          ;Rn,#data,rel
	ajmp   opcd13          ;@Ri,#data,rel
	ajmp   pa              ;A
	ajmp   prc             ;C
	ajmp   pbit            ;bit
	ajmp   pdirect         ;direct
	ajmp   p_reg_i         ;@Ri
	ajmp   opcd19          ;AB
	ajmp   opcd20          ;Rn,rel
	ajmp   opcd21          ;direct,rel
	ajmp   p_reg_n         ;Rn
	ajmp   pdptr           ;DPTR
	ajmp   opcd24          ;bit,rel
	ajmp   prel            ;rel
	ajmp   opcd26          ;@A+DPTR
	ajmp   opcd27          ;addr16
	ajmp   opcd28          ;Rn,A
	ajmp   opcd29          ;Rn,direct
	ajmp   opcd30          ;Rn,#data
	ajmp   opcd31          ;direct,Rn
	ajmp   opcd32          ;direct,direct
	ajmp   opcd33          ;direct,@Ri
	ajmp   opcd34          ;@Ri,A
	ajmp   opcd35          ;@Ri,direct
	ajmp   opcd36          ;@Ri,#data
	ajmp   opcd37          ;bit,C
	ajmp   opcd38          ;DPTR,#data16
	ajmp   opcd39          ;A,@A+DPTR
	ajmp   opcd40          ;A,@A+PC
	ajmp   opcd41          ;A,@DPTR
	ajmp   opcd42          ;@DPTR,A
	ret                    ; <nothing>



opcd4:                      ;A,@Ri              done
        acall   pac
p_reg_i:mov     a,#'@'
        acall   cout_h
        mov     a,#'R'
        acall   cout_h
        mov     a, r2
        anl     a,#00000001b
        ajmp    phex1_h

opcd3:                      ;A,direct           done
        acall   pac
pdirect:
        mov     a, r3
        jb      acc.7,pdir1
pdir0:  mov     a, r3
        ajmp    phex_h
pdir1:  mov     dptr,#sfrmnu
pdir2:  clr     a
        movc    a,@a+dptr
        inc     dptr
        jz      pdir0
        mov     r0,a
        clr     c
        subb    a, r3
        jnz     pdir3
pstr_h:
	ljmp	pstr

pdir3:  clr     a
        movc    a,@a+dptr
        inc     dptr
        jnb     acc.7,pdir3
        sjmp    pdir2

               
opcd9:                      ;C,/bit             done
        acall   prc
        acall   pcomma
        mov     a, #'/'
        acall   cout_h
pbit: 
        mov     a, r3
        anl     a,#01111000b
        rl      a
        swap    a
        mov     r0,a
        mov     a, r3
        anl     a,#10000000b
        jz      pbit1
        mov     dptr,#bitptr        ;it's a Special Function Reg.
        mov     a,r0
        movc    a,@a+dptr
        mov     dptr,#bitmnu
        addc    a,dpl
        mov     dpl,a
        jnc     pbit0
        inc     dph
pbit0:  acall   pstr_h
        sjmp    pbit2
pbit1:  mov     a,r0            ;it's between 20h and 2Fh
        add     a,#20h
        acall   phex_h
pbit2:  mov     a,#'.'
        acall   cout_h
        mov     a, r3
        anl     a,#00000111b
        ajmp    phex1_h


opcd10:                     ;A,direct,rel       done
        acall   pac
        acall   pdirect
opcd10a:acall   pcomma
        mov     a, r4
        mov     r3, a
prel:
        mov     a, r3
        add     a, r6
	mov	dpl, a
	mov	a, r3
	jb	acc.7, prel2
	clr	a
	sjmp	prel3
prel2:	clr	a
	cpl	a
prel3:	addc	a, r7
	mov	dph, a
	ljmp	phex16


pat:            ;prints the '@' symbol
        mov     a,#'@'
        ajmp    cout_h

pac:            ;print "A,"
        acall   pa
pcomma:         ;prints a comma
        mov     a,#','
        acall   cout_h
pspace: mov	a, #' '
	ajmp	cout_h

plb:            ;prints the '#' symbol
        mov     a,#'#'
        ajmp    cout_h


opcd6:                      ;direct,A           done
        acall   pdirect
        acall   pcomma
pa:             ;prints 'A'
        mov     a,#'A'
        ajmp    cout_h

opcd37:                     ;bit,C              done
        acall   pbit
        acall   pcomma
prc:             ;prints 'C'
        mov     a,#'C'
        ajmp    cout_h

opcd26:                     ;@A+DPTR            done
        acall   pat
        acall   pa
        mov     a,#'+'
        acall   cout_h
pdptr:          ;prints DPTR
	mov	a, #'D'
	acall	cout_h
	mov	a, #'P'
	acall	cout_h
	mov	a, #'T'
	acall	cout_h
	mov	a, #'R'
cout_h:
	ljmp	cout

opcd1:  mov     a, r7       ;addr11             done
        anl     a, #11111000b
        mov     r0, a
        mov     a, r2
        swap    a
        rr      a
        anl     a, #00000111b
        orl     a, r0
        acall   phex_h
        mov     a, r3
        ajmp    phex_h

opcd2:                      ;A,Rn               done
        acall   pac
p_reg_n:mov     a,#'R'
        acall   cout_h
        mov     a, r2
        anl     a,#00000111b
phex1_h:
	ljmp	phex1



opcd5:                      ;A,#data            done
        acall   pa
pdata:  acall   pcomma
        acall   plb
        mov     a, r3
phex_h:
	ljmp	phex

opcd7:                      ;direct,#data       done
        acall   pdirect
        mov     a, r4
        mov     r3, a
        ajmp    pdata
opcd8:                      ;C,bit              done
        acall   prc
        acall   pcomma
        ajmp    pbit

opcd11:                     ;A,#data,rel        done
        acall   pa

⌨️ 快捷键说明

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