home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / program / compiler / as32 / new.asm < prev    next >
Assembly Source File  |  1991-01-27  |  11KB  |  535 lines

  1. ; -----------------------------------------------------------------------
  2. ; -        debugger v2.0 theo de raadt 21/1/90            -
  3. ; NOTE: Hardware has to be specially built to handle this monitor.
  4. ; The CODE address space and the DATA address space have to be mapped
  5. ; on top of each other. ie. CHIP_READ* = 8031RD* AND 8031PSEN* and
  6. ; CHIP_WRITE* = 8031WR*.
  7. ; Within this (combined) address space, you can now use either MOVX
  8. ; or MOVC for the same effect.
  9. ; In this address space, I have placed the rom this debugger is in
  10. ; at 0x0000 and ram at 0x8000. (additional IO would go in between.)
  11. ; (actually, I used a battery backed up static ram at 0x000.)
  12. ; Some of the commands in the help are actually unimplimented. It
  13. ; suited my purposes. The 'g' command could be much improved, to have
  14. ; a seperate register set for the called routine.
  15. ; -----------------------------------------------------------------------
  16.  
  17.         .org    0
  18. start:        nop            ; for accidental overwrite if ram
  19.                     ; at 0 -- bug in my decode logic?
  20.         mov    P3, #0xff    ; use alternate fns on P3
  21.         ajmp    main
  22.  
  23. ; -----------------------------------------------------------------------
  24. ; SERINIT() nothing hurt
  25. serinit:    mov    TMOD, #0x20    ; timer 1 mode 2
  26.     ;    mov    TH1, #230    ; 1200 baud
  27.         mov    TH1,#243    ; 4800 baud
  28.         mov    TCON, #0x40    ; turn timer 1 on
  29.         mov    SCON, #0x52    ; serial mode 1 rx, fake tx done
  30.  
  31.         mov    A, PCON        ; for 4800 baud
  32.         setb    ACC.7
  33.         mov    PCON, A
  34.         ret
  35.  
  36. ; -----------------------------------------------------------------------
  37. ; PUTC( A=char )
  38. putc:        jnb    TI, putc    ; wait for tx free
  39.         clr    TI
  40.         mov    SBUF, A        ; send it
  41.         ret
  42.  
  43. ; -----------------------------------------------------------------------
  44. ; GETC() A=char
  45. getc:        jnb    RI, getc
  46.         clr    RI
  47.         mov    A, SBUF
  48.         ret
  49.  
  50. ; -----------------------------------------------------------------------
  51. ; GETS( DPTR=start of string ) A not hurt, DPTR at start of string
  52. gets:        push    ACC
  53.         push    DPL
  54.         push    DPH
  55.         mov    A, R3
  56.         push    ACC
  57.  
  58.         clr    A
  59.         mov    R3, A
  60. gets_nxt:    lcall    getc
  61.         cjne    A, #8, gets_notbs
  62.         ajmp    gets_bs
  63. gets_notbs:    cjne    A, #'\r', gets_good
  64.         clr    A
  65.         movx    @DPTR, A
  66.  
  67.         pop    ACC
  68.         mov    R3, A
  69.         pop    DPH
  70.         pop    DPL
  71.         pop    ACC
  72.         ret
  73.  
  74. gets_bs:    mov    A, R3        ; backspaced too far
  75.         jz    gets_nxt
  76.         dec    A
  77.         mov    R3, A
  78.  
  79.         mov    A, #8        ; "\b \b"
  80.         lcall    putc
  81.         mov    A, #' '
  82.         lcall    putc
  83.         mov    A, #8
  84.         lcall    putc
  85.  
  86.         setb    C        ; this is "dec DPTR"
  87.         mov    A, DPL
  88.         subb    A, #0
  89.         mov    DPL, A
  90.         mov    A, DPH
  91.         subb    A, #0
  92.         mov    DPH, A
  93.         ajmp    gets_nxt
  94.  
  95. gets_good:    movx    @DPTR, A
  96.         lcall    putc
  97.         inc    DPTR
  98.         inc    R3
  99.         ajmp    gets_nxt
  100.  
  101. ; ----------------------------------------------------------------------
  102. ; HEXPARSE( DPTR=string ) A not hurt, DPTR advanced, R0/R1 [H/L] return
  103. hexparse:    push    ACC
  104.  
  105. hp_char:    movx    A, @DPTR    ; get char
  106.  
  107.         clr    C
  108.         subb    A, #'a'
  109.         jc    hp_notalpha    ; < 'a' not hex alpha char
  110.         subb    A, #5+1
  111.         jnc    hp_notalpha    ; > 'f' not hex aplha char
  112.         movx    A, @DPTR
  113.         clr    C
  114.         subb    A, #'a'-10
  115.         sjmp    hp_nybble
  116.  
  117. hp_notalpha:    movx    A, @DPTR
  118.         clr    C
  119.         subb    A, #'0'
  120.         jc    hp_notdigit    ; < '0' not hex digit
  121.         subb    A, #9+1
  122.         jnc    hp_notdigit    ; > '9' not hex digit
  123.         movx    A, @DPTR
  124.         clr    C
  125.         subb    A, #'0'
  126.  
  127. hp_nybble:    inc    DPTR
  128.  
  129.         anl    A, #0x0f
  130.         push    ACC        ;     R0       R1
  131.         mov    A, R0        ;  HHHH LLLL hhhh llll
  132.         swap    A
  133.         anl    A, #0xf0
  134.         mov    R0, A
  135.         mov    A, R1
  136.         swap    A        ; shift left by nybble
  137.         anl    A, #0x0f
  138.         orl    A, R0
  139.         mov    R0, A
  140.         mov    A, R1
  141.         swap    A
  142.         anl    A, #0xf0
  143.         mov    R1, A
  144.         pop    ACC
  145.         orl    A, R1
  146.         mov    R1, A        ;  LLLL hhhh llll aaaa
  147.  
  148.     ;    debugging
  149.     ;    push    ACC
  150.     ;    push    DPL
  151.     ;    push    DPH
  152.     ;    mov    DPH, R0
  153.     ;    mov    DPL, R1
  154.     ;    lcall    putword
  155.     ;    lcall    putnl
  156.     ;    pop    DPH
  157.     ;    pop    DPL
  158.     ;    pop    ACC
  159.  
  160.         sjmp    hp_char
  161.  
  162. hp_notdigit:    pop    ACC
  163.         ret
  164.  
  165. ; ----------------------------------------------------------------------
  166. ; EATSPACE( DPTR=string ) A not hurt, DPTR advanced
  167. eatspace:    push    ACC
  168. eatspace_loop:    movx    A, @DPTR
  169.         cjne    A, #' ', eatspace_done
  170.         inc    DPTR
  171.         sjmp    eatspace_loop
  172. eatspace_done:    pop    ACC
  173.         ret
  174.  
  175. ; -----------------------------------------------------------------------
  176. ; PUTS( DPTR=string ) A not hurt, DPTR at end of string
  177. puts:        push    ACC
  178. puts_ch:    movx    A, @DPTR    ; get ch
  179.         jz    puts_q        ; null - finished str
  180.         lcall    putc
  181.         inc    DPTR
  182.         sjmp    puts_ch        ; go for next
  183. puts_q:        pop    ACC
  184.         ret
  185.  
  186. ; -----------------------------------------------------------------------
  187. ; PUTNL() nothing hurt
  188. putnl:        push    ACC
  189.         mov    A, #0x0d
  190.         lcall    putc
  191.         mov    A, #0x0a
  192.         lcall    putc
  193.         pop    ACC
  194.         ret
  195.  
  196. ; -----------------------------------------------------------------------
  197. ; putword( DPTR=word) nothing hurt
  198. putword:    push    ACC
  199.         mov    A, DPH
  200.         lcall    putbyte
  201.         mov    A, DPL
  202.         lcall    putbyte
  203.         pop    ACC
  204.         ret
  205.  
  206. ; -----------------------------------------------------------------------
  207. ; putbyte( A=byte) nothing hurt
  208. putbyte:    push    ACC
  209.         push    ACC
  210.         swap    A
  211.         lcall    putnyb
  212.         pop    ACC
  213.         lcall    putnyb
  214.         pop    ACC
  215.         ret
  216.  
  217. ; -----------------------------------------------------------------------
  218. ; putnyb( A=nybble ) A hurt
  219. putnyb:        anl    A, #0x0f
  220.         push    ACC
  221.         clr    C
  222.         subb    A, #10
  223.         jc    pn_digit    ; <= 9, then it's a digit
  224.         add    A, #'a'        ; alphabetic
  225.         lcall    putc
  226.         pop    ACC
  227.         ret
  228.  
  229. pn_digit:    pop    ACC        ; it's a digit
  230.         add    A, #'0'
  231.         lcall    putc
  232.         ret
  233.  
  234. ; -----------------------------------------------------------------------
  235. main:        lcall    serinit
  236.         mov    DPTR, #run_regs_psw    ; initialize psw at least!
  237.         clr    A
  238.         movx    @DPTR, A
  239.         mov    DPTR, #title_msg
  240.         lcall    puts
  241.  
  242. next_line:    mov    A, #'>'        ; prompt
  243.         lcall    putc
  244.  
  245.         mov    DPTR, #linebuf    ; get cmd
  246.         lcall    gets
  247.         lcall    putnl
  248.  
  249. next_cmd:    lcall    eatspace
  250.         movx    A, @DPTR
  251.         jz    next_line
  252.  
  253.         ; --------------------------------------------------
  254.         cjne    A, #'g', cmd_notgo    ; g --> lcall addr..
  255.         push    DPL
  256.         push    DPH
  257.         push    ACC
  258.         push    PSW
  259.  
  260.         mov    DPTR, #go_return    ; come back to here..
  261.         push    DPL
  262.         push    DPH
  263.  
  264.         mov    A, R1            ; return on top of function
  265.         push    ACC
  266.         mov    A, R0
  267.         push    ACC
  268.         mov    DPTR, #run_regs
  269.         movx    A, @DPTR        ; DPH
  270.         push    ACC
  271.         inc    DPTR
  272.         movx    A, @DPTR        ; DPL
  273.         push    ACC
  274.         inc    DPTR
  275.         movx    A, @DPTR        ; PSW
  276.         push    ACC
  277.         inc    DPTR
  278.         movx    A, @DPTR        ; ACC
  279.         pop    PSW
  280.         pop    DPL
  281.         pop    DPH
  282.         ret                ; enter it
  283.  
  284. go_return:    pop    PSW
  285.         pop    ACC
  286.         pop    DPH
  287.         pop    DPL
  288.         inc    DPTR
  289.         sjmp    next_cmd
  290.  
  291.         ; --------------------------------------------------
  292. cmd_notgo:    cjne    A, #'R', cmd_notregs
  293.         inc    DPTR
  294.         push    DPH
  295.         push    DPL
  296.         mov    DPTR, #regs_msg        ; "DPTR ACC PSW"
  297.         lcall    puts
  298.         mov    DPTR, #run_regs
  299.         movx    A, @DPTR
  300.         acall    putbyte            ;  xx
  301.         inc    DPTR
  302.         movx    A, @DPTR
  303.         acall    putbyte            ;    xx
  304.         mov    A, #' '
  305.         acall    putc
  306.         inc    DPTR
  307.         movx    A, @DPTR
  308.         acall    putbyte            ;       xx
  309.         inc    DPTR
  310.         mov    A, #' '
  311.         acall    putc
  312.         acall    putc
  313.         movx    A, @DPTR
  314.         acall    putbyte            ;           xx
  315.         acall    putnl
  316.         pop    DPL
  317.         pop    DPH
  318.         sjmp    next_cmd
  319.  
  320.         ; --------------------------------------------------
  321. cmd_notregs:    cjne    A, #':', cmd_notenter    ; : --> eat bytes..
  322.         inc    DPTR
  323.         mov    A, R2
  324.         push    ACC
  325.         mov    A, R3
  326.         push    ACC
  327.         mov    A, R0
  328.         mov    R2, A
  329.         mov    A, R1
  330.         mov    R3, A        ; R2/R3 = mem ptr
  331.  
  332. enter_next:    lcall    eatspace
  333.         movx    A, @DPTR
  334.         jz    enter_done
  335.  
  336.         push    DPL
  337.         clr    A
  338.         mov    R0, A
  339.         mov    R1, A
  340.         lcall    hexparse
  341.         pop    ACC
  342.         cjne    A, DPL, enter_number
  343.         sjmp    enter_next
  344.  
  345. enter_number:    push    DPL
  346.         push    DPH
  347.         mov    DPH, R2        ; put low byte only
  348.         mov    DPL, R3
  349.         mov    A, R1
  350.         movx    @DPTR, A
  351.         inc    DPTR
  352.         mov    R2, DPH
  353.         mov    R3, DPL
  354.         pop    DPH
  355.         pop    DPL
  356.         sjmp    enter_next
  357.  
  358. enter_done:    pop    ACC
  359.         mov    R3, A
  360.         pop    ACC
  361.         mov    R2, A
  362.         ajmp    next_cmd
  363.  
  364.         ; --------------------------------------------------
  365. cmd_notenter:    cjne    A, #'?', cmd_nothelp
  366.         push    DPL
  367.         push    DPH
  368.         mov    DPTR, #help_msg
  369.         lcall    puts
  370.         pop    DPH
  371.         pop    DPL
  372.         inc    DPTR
  373.         ajmp    next_cmd
  374.  
  375.         ; --------------------------------------------------
  376. cmd_nothelp:    cjne    A, #'l', cmd_notlist
  377.         push    DPL
  378.         push    DPH
  379.         push    B
  380.         clr    A
  381.         mov    B, ACC
  382.         mov    DPH, R0
  383.         mov    DPL, R1
  384.         lcall    putword        ; addr: [16 bytes]
  385.         mov    A, #':'
  386.         lcall    putc
  387.         mov    A, #' '
  388.         lcall    putc
  389. cl_nextbyte:    movx    A, @DPTR
  390.         lcall    putbyte
  391.         mov    A, #' '
  392.         lcall    putc
  393.         inc    DPTR
  394.         inc    B
  395.         mov    A, B
  396.         cjne    A, #16, cl_nextbyte
  397.         lcall    putnl
  398.         mov    R0, DPH
  399.         mov    R1, DPL
  400.         pop    B
  401.         pop    DPH
  402.         pop    DPL
  403.         inc    DPTR
  404.         ajmp    next_cmd
  405.  
  406.         ; --------------------------------------------------
  407. cmd_notlist:    cjne    A, #'r', cmd_notread
  408.         mov    A, R3        ; counter
  409.         push    ACC
  410.         mov    A, R1        ; base addr
  411.         push    ACC
  412.  
  413.         inc    DPTR        ; get arg
  414.         lcall    eatspace
  415.         push    DPL
  416.         lcall    hexparse
  417.         pop    ACC
  418.         cjne    A, DPL, nl_loop
  419.         mov    A, #1
  420.         mov    R3, A
  421.         sjmp    nl_start
  422. nl_loop:    mov    A, R1
  423.         mov    R3, A
  424.         
  425. nl_start:    pop    ACC
  426.         mov    R1, A
  427.         mov    A, R1        ; put address
  428.         lcall    putbyte
  429.         mov    A, #':'
  430.         lcall    putc
  431.  
  432. nl_nextloop:    mov    A, R3        ; eat one loop
  433.         jz    nl_endloop
  434.         dec    A
  435.         mov    R3, A
  436.  
  437.         mov    A, #' '
  438.         lcall    putc
  439.         mov    A, @R1        ; put byte
  440.         lcall    putbyte
  441.         inc    R1        ; inc address
  442.  
  443.         sjmp    nl_nextloop
  444.  
  445. nl_endloop:    lcall    putnl
  446.         pop    ACC
  447.         mov    R3, A
  448.         ajmp    next_cmd
  449.  
  450.         ; --------------------------------------------------
  451. cmd_notread:    cjne    A, #'w', cmd_notwrite
  452.         mov    A, R3
  453.         push    ACC
  454.         mov    A, R1
  455.         mov    R3, A        ; save addr
  456.         inc    DPTR
  457.  
  458. nr_nextbyte:    lcall    eatspace
  459.         movx    A, @DPTR
  460.         jz    nr_earlyeol    ; [addr] w [EOL]
  461.         push    DPL
  462.         lcall    hexparse    ; [addr] w [NONHEX]
  463.         pop    ACC
  464.         cjne    A, DPL, nr_good
  465.         sjmp    nr_earlyeol
  466.  
  467. nr_good:    mov    A, R3        ; R1 = value, R3 = addr
  468.         mov    R0, A
  469.         mov    A, R1
  470.         mov    @R0, A
  471.         ajmp    nr_nextbyte
  472.  
  473. nr_earlyeol:    pop    ACC
  474.         mov    R3, A
  475.         ajmp    next_cmd
  476.  
  477.         ; --------------------------------------------------
  478. cmd_notwrite:    cjne    A, #';', cmd_notcomment
  479.         ajmp    next_line
  480.  
  481. cmd_notcomment:    push    DPL
  482.         clr    A
  483.         mov    R0, A
  484.         mov    R1, A
  485.         lcall    hexparse        ; probably addr, see if ptr
  486.         pop    ACC            ; moved, else error
  487.         cjne    A, DPL, cmd_more
  488.         sjmp    cmd_error
  489.  
  490.         ; --------------------------------------------------
  491. cmd_more:
  492.     ;    debugging
  493.     ;    push    DPL
  494.     ;    push    DPH
  495.     ;    mov    DPTR, #number_msg
  496.     ;    lcall    puts
  497.     ;    mov    DPH, R0
  498.     ;    mov    DPL, R1
  499.     ;    lcall    putword
  500.     ;    lcall    putnl
  501.     ;    pop    DPH
  502.     ;    pop    DPL
  503.         ajmp    next_cmd
  504.  
  505. cmd_error:    mov    DPTR, #error_msg
  506.         lcall    puts
  507.         ajmp    next_line
  508.  
  509. ; -----------------------------------------------------------------------
  510. title_msg:    .byte    "\r\n8031 mon v3.0\r\n", 0
  511. error_msg:    .byte    "syntax error\r\n", 0
  512. regs_msg:    .byte    "DPTR ACC PSW\r\n", 0
  513. help_msg:    .byte    "8031 mon v3.0\r\n"
  514.         .byte    "[addr] : [bytes]\tstore bytes\t"
  515.         .byte    "[addr] g\t\tcall address\r\n"
  516.         .byte    "[addr] l\t\tlist memory\t"
  517.         .byte    "[addr] r [count]\tlist onchip\r\n"
  518.         .byte    "[addr] w [bytes]\tstore onchip\t"
  519.         .byte    "; [comment]\t\tcomment\r\n"
  520.         .byte    "[value] D\t\tstore in DPTR\t"
  521.         .byte    "[value] A\t\tstore in ACC\r\n"
  522.         .byte    "[value] P\t\tstore in PSW\t"
  523.         .byte    "R\t\t\tprint registers\r\n", 0
  524.  
  525. ; -----------------------------------------------------------------------
  526. ; sort of a bss segment
  527. ; -----------------------------------------------------------------------
  528.         .org    0x8000
  529. run_regs:    .skip    2        ; DPTR [H/L]
  530. run_regs_psw:    .skip    1        ; PSW
  531.         .skip    1        ; ACC
  532. linebuf:    .skip    256
  533.  
  534.         .end
  535.