?? new.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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -