📄 paulmon1.asm
字号:
; PAULMON 8051 Debugger by Paul Stoffregen; Please distribute freely -- may not be sold, period.; .command +h58 ;set page height to 58 in listing file... .equ start,0000h ;address for start of EPROM (0000h) .equ program,2000h ;address for program loading location .ORG start rst: lJMP poweron .org start+3 ;ext int #0 LJMP program+3 .org start+11 ;timer #0 LJMP program+11 .org start+13h ;external interrupt routine #1 jnb tcon.2,intr0 ljmp program+13h ;don't do ssrun if edge trigger'dintr0: ajmp step ;but do ssrun if level trigger'd .org start+1bh ;timer #1 ljmp program+1bh .org start+23h ;serial port ljmp program+23h .org start+2bh ;timer #2 (8052 only) ljmp program+2bh .org start+30h ;the jump table ajmp cout ajmp cin ajmp phex ajmp phex16 ajmp pstr ajmp ghex ajmp ghex16 ajmp esc ajmp upper ljmp initstep: ;this is the single step interrupt processor code... push psw ;better save these while we still can push acc clr psw.3 ;gotta be set to bank zero... clr psw.4step1: acall cin acall upperstep2: cjne a,#13,step7 ajmp statusstep7: cjne a,#32,step8 ;check space ajmp donestep8: cjne a,#'?',step10 ;check '?' acall sshelp ajmp step1step10: cjne a,#'Q',step11 ;check 'Q'=quit and run normal push dpl push dph mov dptr,#squit acall pstr pop dph pop dpl clr ie.2 ajmp donestep11: cjne a,#'H',step12 ;check 'H'=hex dump internal ram acall ssdmp ajmp step1step12: cjne a,#'R',step13 ;check 'R'=print out registers ajmp ssregstep13: cjne a,#'S',step14 ;check 'S'=skip this inst ajmp skip0step14: cjne a,#'A',step20 ;check 'A'=change acc value ajmp chacc step20: ajmp step1 pequal: ; prints '=' mov a,#'=' acall cout retstatus: ;prints two-line status during single step run mov a,r0 push acc acall space mov a,#'S' acall cout mov a,#'P' acall cout acall pequal mov r0,sp push b acall phex dec r0 acall space lcall pa acall pequal mov a,@r0 acall phex dec r0 acall space lcall prc acall pequal mov a,@r0 mov c,acc.7 clr a rlc a acall phex1 acall space lcall pdptr acall pequal mov a,dph acall phex mov a,dpl acall phex clr a acall pregsn mov r0,sp dec r0 mov a,@r0 acall phex mov a,#1 acall pregsn mov a,r1 acall phex mov a,#2 acall pregsn mov a,r2 acall phex mov a,#3 acall pregsn mov a,r3 acall phex mov a,#4 acall pregsn mov a,r4 acall phex mov a,#5 acall pregsn mov a,r5 acall phex mov a,#6 acall pregsn mov a,r6 acall phex mov a,#7 acall pregsn mov a,r7 acall phex acall newline acall space ;now begin printing the 2nd line mov a,#'P' acall cout lcall prc acall pequal clr c mov a,sp subb a,#4 mov r0,a push dpl push dph lcall inst pop dph pop dpl pop b pop acc mov r0,adone: pop acc pop psw retisshelp: push dpl push dph acall newline mov dptr,#help5txt acall pstr pop dph pop dpl retpregsn: push acc acall space mov a,#'R' acall cout pop acc acall phex1 acall pequal retssdmp: ;. push 0 push 1 push b push dpl push dph mov dptr,#ssdmps1 acall pstr pop dph pop dpl clr a acall phex mov a,#':' acall cout acall space mov a,r0 acall phex acall space mov a,r1 acall phex mov r0,#2 mov r1,#14 ajmp ssdmp2ssdmp1: mov a,r0 acall phex mov a,#':' acall cout mov r1,#16ssdmp2: acall space mov a,@r0 acall phex inc r0 djnz r1,ssdmp2 acall newline cjne r0,#80h,ssdmp1 acall newline pop b pop 1 pop 0 retssreg: push b ;. acall space mov a,#'B' acall cout acall pequal mov a,b acall phex acall space mov a,#'P' acall cout mov a,#'S' acall cout mov a,#'W' acall cout acall pequal mov a,r0 push acc mov r0,sp dec r0 dec r0 dec r0 mov a,@r0 acall phex acall space push dpl push dph mov dptr,#sfr3+1 mov r0,0xA8 acall psfr mov dptr,#sfr4+1 mov r0,0xB8 acall psfr mov dptr,#sfr5+1 mov r0,0x89 acall psfr mov dptr,#sfr6+1 mov r0,0x88 acall psfr mov dptr,#sfr7+1 mov r0,0x98 acall psfr mov dptr,#sfr8+1 mov r0,0x87 acall psfr mov a,#'T' acall cout mov a,#'0' acall cout acall pequal mov a,8Ch acall phex mov a,8Ah acall phex acall space mov a,#'T' acall cout mov a,#'1' acall cout acall pequal mov a,8Dh acall phex mov a,8Bh acall phex acall newline pop dph pop dpl pop acc mov r0,a pop b ajmp step1psfr: acall pstr acall pequal mov a,r0 acall phex acall space retskip0: ;. push b mov a,r0 push acc mov a,sp clr c subb a,#4 mov r0,a push dpl push dph mov dptr,#sskip1 acall pstr lcall inst ;print skipped instruction r0 points to pc mov a,sp clr c subb a,#6 mov r0,a mov @r0,dph ;actually change the pc! dec r0 mov @r0,dpl mov dptr,#sskip2 acall pstr inc r0 lcall inst ;print new instruction pop dph pop dpl pop acc mov r0,a pop b ajmp step1chacc: mov a,r0 push acc push b mov r0,sp dec r0 dec r0 push dpl push dph mov dptr,#chaccs1 acall pstr acall ghex jc chacc2 mov @r0,a acall newline pop dph pop dpl pop b pop acc mov r0,a ajmp step1chacc2: mov dptr,#abort acall pstr pop dph pop dpl pop b pop acc mov r0,a ajmp step1DownLoad: ;Note, this is a modified version of the ;auto baud rate detection routine from ;MDP/51. Thank You, Kei-Yong Khoo (3-31-87) push dpl push dph mov dptr,#dwlds1 acall pstr ;"begin sending file <ESC> to abort"dwld0a: aCALL cin CJNE A, #27, DWLD0 ; Test for escapedwldesc:mov dptr,#dwlds2 acall pstr ;"download aborted." pop dph pop dpl retDWLD0: CJNE a, #0x3A, DWLD0a ; wait for ':' ACALL ghex jc dwldesc MOV R0, A ; R0 = # of data bytes ACALL ghex jc dwldesc MOV DPH, A ; High byte of load address ACALL ghex jc dwldesc MOV DPL, A ; Low byte of load address ACALL ghex ; Record type jc dwldesc CJNE A, #1, DWLD1 ; End record? mov dptr,#dwlds3 acall pstr ;"download went ok..." pop dph pop dpl retDWLD1: INC R0 ; adjust for repeat loop AJMP DWLD3DWLD2: ACALL ghex ; Get data byte jc dwldesc MOVX @DPTR, A INC DPTRDWLD3: DJNZ R0, DWLD2 ACALL ghex ; Discard checksum jc dwldesc aJMP DWLD0aINIT: ;Note, this is a modified version of the ;auto baud rate detection routine from ;MDP/51. Thank You, Kei-Yong Khoo (3-31-87) orl PCON,#10000000b ; set double baud rate MOV TMOD,#00010001b MOV SCON,#01010000b ; Set Serial for mode 1 & ; Enable reception ORL TCON,#01010010b ; Start timer 1 both timer mov a,7Bh mov r1,7Ah mov r2,79h mov r3,78h xrl 1,#01010101b xrl 2,#11001100b xrl 3,#00011101b cjne a,1,auto cjne a,2,auto cjne a,3,auto sjmp autoend ;baud rate is known from last time...AUTO: CLR TR1 ; Stop timer 1 MOV TH1, #0 ; Clear timer 1 MOV TL1, #0 JB RXD, * ; Wait for start bit JB RXD,AUTO ; make sure it's not just noise JB RXD,AUTO JB RXD,AUTO JB RXD,AUTO JNB RXD, * ; skip start bit SETB TR1 JB RXD, * JNB RXD, * JB RXD, * JNB RXD, * ; Count 3 more bits CLR TR1 ; Compute baud rate MOV A, TL1 ; divide TH1-TL1 by 128 RLC A MOV A, TH1 RLC A CPL A INC A ; 2's complement mov b,a ; store the reload value four times mov 7Bh,a ;so that it might be there later xrl a,#01010101b ;we'll store the reload value mov 7Ah,a ;four times, just to be safe mov a,b xrl a,#11001100b mov 79h,a mov a,b xrl a,#00011101b mov 78h,a mov a,bautoend:MOV TH1,A mov tmod,#00100001b ;now it's 8 bit auto-reload SETB TR1 RETHELP: push dpl push dph MOV DPTR,#HELP1txt ACALL PSTR mov dptr,#cmd_tbl clr ahelp0: movc a,@a+dptr jz help_2 inc dptr acall space acall cout mov r0,#4help1: acall space djnz r0,help1 clr a movc a,@a+dptr ;(high) mov b,a inc dptr clr a movc a,@a+dptr ;(low) inc dptr inc dptr inc dptr push dpl push dph mov dpl,a mov dph,b clr a
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -