home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l440 / 2.ddi / CHAP7 / TRACE.ASM < prev    next >
Encoding:
Assembly Source File  |  1990-08-24  |  6.7 KB  |  430 lines

  1.     page    78,132
  2.     title    Trace and Register commands
  3.  
  4.     include    DOS.INC
  5.  
  6. BPMAX        =    10        ;Maximum number of breakpoints
  7.  
  8. StepVect    equ    word ptr ds:[1*4]
  9. BreakPtVect    equ    word ptr ds:[3*4]
  10.  
  11.     .model    small
  12.     .code
  13.     .data
  14.  
  15. DGroup    group    _TEXT,_DATA
  16.  
  17.     .data
  18.  
  19.     public    TCount
  20.  
  21.     extrn    AxSave:word,BxSave:word,SpSave:word
  22.     extrn    CsSave:word,IpSave:word,FlSave:word,TestPSP:word
  23.  
  24. BRKCNT    dw    ?            ;Number of breakpoints
  25. TCOUNT    dw    ?            ;Number of steps to trace
  26. BPTAB    db    5*BpMax dup(?)        ;Breakpoint table
  27.  
  28.     .code
  29.     assume    cs:DGroup,ds:DGroup,es:DGroup,ss:DGroup
  30.  
  31.     public    Go,Reg,Trace,ReEnter
  32.  
  33.     extrn    CrLf:near, Blank:near, ScanP:near, GetEol:near, OutCh:near
  34.     extrn    InBuf:near, ScanB:near, GetHex:near, GetHex1:near, Out16:near
  35.     extrn    PrintAbort:near, HexIn:near, Address:near, Command:near
  36.     extrn    ErrMes:byte, DisLine:near
  37.  
  38. ;Flags are ordered to correspond with the bits of the flag
  39. ;register, most significant bit first, zero if bit is not
  40. ;a flag. First 16 entries are for bit set, second 16 for
  41. ;bit reset.
  42.  
  43. FLAGTAB    label    byte
  44.     DW    0
  45.     DW    0
  46.     DW    0
  47.     DW    0
  48.     DB    "OV"
  49.     DB    "DN"
  50.     DB    "EI"
  51.     DW    0
  52.     DB    "NG"
  53.     DB    "ZR"
  54.     DW    0
  55.     DB    "AC"
  56.     DW    0
  57.     DB    "PE"
  58.     DW    0
  59.     DB    "CY"
  60.     DW    0
  61.     DW    0
  62.     DW    0
  63.     DW    0
  64.     DB    "NV"
  65.     DB    "UP"
  66.     DB    "DI"
  67.     DW    0
  68.     DB    "PL"
  69.     DB    "NZ"
  70.     DW    0
  71.     DB    "NA"
  72.     DW    0
  73.     DB    "PO"
  74.     DW    0
  75.     DB    "NC"
  76.  
  77. REGTAB        DB    "AXBXCXDXSPBPSIDIDSESSSCSIPPC"
  78. REGTABLEN    =    ($-RegTab)/2    ;Number of registers
  79.  
  80. ;************************************************************
  81. ; "R" command
  82. ;Perform register dump if no parameters or set register if a
  83. ;register designation is a parameter.
  84.  
  85. DISPREG:
  86.     MOV    SI,offset DGroup:REGTAB
  87.     MOV    BX,offset DGroup:AXSave
  88.     MOV    CX,8
  89.     CALL    DISPREGLINE
  90.     CALL    CRLF
  91.     MOV    CX,5
  92.     CALL    DISPREGLINE
  93.     CALL    BLANK
  94.     CALL    DISPFLAGS
  95.     call    CrLf
  96.     mov    si,[IpSave]
  97.     mov    ds,[CsSave]
  98.     call    DisLine            ;Disassemble current line
  99.     push    cs
  100.     pop    ds
  101.     ret
  102.  
  103. REG:
  104.     CALL    SCANP
  105.     JZ    DISPREG
  106.     LODSW
  107.     CMP    AH,13
  108.     JZ    FLAG
  109.     XCHG    DX,AX        ;Get flag letters in DX
  110.     CALL    GETEOL
  111.     CMP    DH," "
  112.     JZ    FLAG
  113.     MOV    DI,offset DGroup:REGTAB
  114.     XCHG    AX,DX
  115.     PUSH    CS
  116.     POP    ES
  117.     MOV    CX,REGTABLEN
  118. REPNZ    SCASW
  119.     JNZ    BADREG
  120.     OR    CX,CX
  121.     JNZ    NOTPC
  122.     DEC    DI
  123.     DEC    DI
  124.     MOV    AX,CS:[DI-2]
  125. NOTPC:
  126.     PUSH    DS
  127.     POP    ES
  128.     CALL    OutCh
  129.     MOV    AL,AH
  130.     CALL    OutCh
  131.     CALL    BLANK
  132.     sub    di,offset DGroup:RegTab
  133.     LEA    BX,[DI+AxSave-2]
  134.     MOV    DX,[BX]
  135.     CALL    OUT16
  136.     CALL    CRLF
  137.     MOV    AL,":"
  138.     CALL    OutCh
  139.     CALL    INBUF
  140.     CALL    SCANB
  141.     JZ    RET4
  142.     MOV    CX,4
  143.     CALL    GETHEX1
  144.     CALL    GETEOL
  145.     MOV    [BX],DX
  146. Ret4:    RET
  147.  
  148. BADREG:
  149.     MOV    AX,"RB"        ;BR ERROR
  150.     JMP    ERR
  151.  
  152. FLAG:
  153.     CMP    AL,"F"
  154.     JNZ    BADREG
  155.     CALL    DISPFLAGS
  156.     MOV    AL,"-"
  157.     CALL    OutCh
  158.     CALL    INBUF
  159.     CALL    SCANB
  160.     XOR    BX,BX
  161.     MOV    DX,[FlSave]
  162. GETFLG:
  163.     LODSW
  164.     CMP    AL,13
  165.     JZ    SAVCHG
  166.     CMP    AH,13
  167.     JZ    FLGERR
  168.     MOV    DI,offset DGroup:FLAGTAB
  169.     MOV    CX,32
  170.     PUSH    CS
  171.     POP    ES
  172. REPNE    SCASW
  173.     JNZ    FLGERR
  174.     MOV    CH,CL
  175.     AND    CL,0FH
  176.     MOV    AX,1
  177.     ROL    AX,CL
  178.     TEST    AX,BX
  179.     JNZ    REPFLG
  180.     OR    BX,AX
  181.     OR    DX,AX
  182.     TEST    CH,16
  183.     JNZ    NEXFLG
  184.     XOR    DX,AX
  185. NEXFLG:
  186.     PUSH    DS
  187.     POP    ES
  188.     CALL    SCANP
  189.     jmp    GETFLG
  190.  
  191. DISPREGLINE:
  192.     lods    word ptr cs:[si]
  193.     CALL    OutCh
  194.     MOV    AL,AH
  195.     CALL    OutCh
  196.     MOV    AL,"="
  197.     CALL    OutCh
  198.     MOV    DX,[BX]
  199.     INC    BX
  200.     INC    BX
  201.     CALL    OUT16
  202.     CALL    BLANK
  203.     CALL    BLANK
  204.     LOOP    DISPREGLINE
  205.     RET
  206.  
  207. REPFLG:
  208.     MOV    AX,"FD"        ;DF ERROR
  209. FERR:
  210.     CALL    SAVCHG
  211. ERR:
  212.     CALL    OutCh
  213.     MOV    AL,AH
  214.     CALL    OutCh
  215.     MOV    SI,offset DGroup:ERRMES
  216.     JMP    PrintAbort
  217.  
  218. SAVCHG:
  219.     MOV    [FlSave],DX
  220.     RET
  221.  
  222. FLGERR:
  223.     MOV    AX,"FB"        ;BF ERROR
  224.     jmp    FERR
  225.  
  226. DISPFLAGS:
  227.     MOV    SI,offset DGroup:FLAGTAB
  228.     MOV    CX,16
  229.     MOV    DX,[FlSave]
  230. DFLAGS:
  231.     lods    word ptr cs:[si]
  232.     SHL    DX,1
  233.     JC    FLAGSET
  234.     MOV    AX,CS:[SI+30]
  235. FLAGSET:
  236.     OR    AX,AX
  237.     JZ    NEXTFLG
  238.     CALL    OutCh
  239.     MOV    AL,AH
  240.     CALL    OutCh
  241.     CALL    BLANK
  242. NEXTFLG:
  243.     LOOP    DFLAGS
  244.     RET
  245.  
  246.  
  247. ;************************************************************
  248. ; "T" command
  249. ;Trace 1 instruction or the number of instruction specified
  250. ;by the parameter using 8086 trace mode. Registers are all
  251. ;set according to values in save area
  252.  
  253. TRACE:
  254.     CALL    SETADD
  255.     CALL    SCANP
  256.     CALL    HEXIN
  257.     MOV    DX,1
  258.     JC    STOCNT
  259.     MOV    CX,4
  260.     CALL    GETHEX
  261. STOCNT:
  262.     MOV    [TCOUNT],DX
  263.     CALL    GETEOL
  264. STEP:
  265.     MOV    [BRKCNT],0
  266.     OR    byte ptr [FlSave+1],1
  267. EXIT:
  268.     mov    bx,[TestPSP]        ;If no child, our own PSP
  269.     DOS    SetPSP            ;Switch over to child PSP
  270.     xor    ax,ax
  271.     mov    ds,ax
  272.  
  273. assume    ds:nothing,ss:nothing,es:nothing
  274.  
  275.     MOV    BreakPtVect,offset DGroup:BREAKFIX    ;Breakpoint interrupt
  276.     MOV    BreakPtVect+2,CS
  277.     MOV    StepVect,offset DGroup:REENTER    ;Single step interrupt
  278.     MOV    StepVect+2,CS
  279.     cli
  280.     MOV    SP,offset DGroup:AxSave
  281.     POP    AX
  282.     POP    BX
  283.     POP    CX
  284.     POP    DX
  285.     POP    BP
  286.     POP    BP
  287.     POP    SI
  288.     POP    DI
  289.     POP    DS
  290.     POP    ES
  291.     POP    SS
  292.     MOV    SP,[SPSave]
  293.     PUSH    [FlSave]
  294.     PUSH    [CSSave]
  295.     PUSH    [IPSave]
  296.     IRET
  297.  
  298. STEP1:    JMP    STEP
  299.  
  300. ;Re-entry point from breakpoint. Need to decrement instruction
  301. ;pointer so it points to location where breakpoint actually
  302. ;occured.
  303.  
  304. BREAKFIX:
  305.     PUSH    BP
  306.     MOV    BP,SP
  307.     DEC    word ptr [BP+2]
  308.     POP    BP
  309.  
  310. ;Re-entry point from trace mode or interrupt during
  311. ;execution. All registers are saved so they can be
  312. ;displayed or modified.
  313.  
  314. REENTER:
  315.     PUSH    AX
  316.     PUSH    BX
  317.     MOV    AX,SS
  318.     MOV    BX,SP        ;Save stack pointer in AX,BX
  319.     push    cs
  320.     pop    ss
  321.     mov    sp,offset DGroup:CsSave
  322.     PUSH    AX        ;Save SS
  323.     PUSH    ES
  324.     PUSH    DS
  325.     PUSH    DI
  326.     PUSH    SI
  327.     PUSH    BP
  328.     PUSH    BX        ;Save SP
  329.     PUSH    DX
  330.     PUSH    CX
  331.     PUSH    SS
  332.     POP    DS
  333.  
  334. assume    ds:DGroup
  335.  
  336.     MOV    SS,AX        ;Restore user stack pointer
  337.     MOV    SP,BX
  338.     POP    [BXSave]
  339.     POP    [AXSave]
  340.     POP    [IPSave]
  341.     POP    [CSSave]
  342.     POP    AX
  343.     AND    AH,0FEH
  344.     MOV    [FlSave],AX
  345.     MOV    [SPSave],SP
  346.     PUSH    DS
  347.     POP    ES
  348.     PUSH    DS
  349.     POP    SS
  350.     MOV    SP,offset DGroup:AxSave
  351.     sti
  352.     cld
  353.     mov    bx,cs            ;Change back to our PSP
  354.     DOS    SetPSP
  355.     MOV    SI,offset DGroup:BPTAB
  356.     MOV    CX,[BRKCNT]
  357.     JCXZ    SHOREG
  358. CLEARBP:
  359.     LODSW
  360.     XCHG    DI,AX
  361.     LODSW
  362.     MOV    ES,AX        ;ES:DI point to a breakpoint location
  363.     MOVSB            ;Restore original value
  364.     LOOP    CLEARBP
  365.     PUSH    DS
  366.     POP    ES
  367. SHOREG:
  368.     CALL    DISPREG
  369.     DEC    [TCOUNT]
  370.     JNZ    STEP1
  371.     JMP    COMMAND
  372.  
  373.  
  374. ;************************************************************
  375. ; "G" command
  376. ;Jump to program, setting up registers according to the
  377. ;save area. Up to 10 breakpoint addresses may be specified.
  378.  
  379. GO:
  380.     CALL    SETADD
  381.     MOV    DI,offset DGroup:BPTAB
  382.     XOR    BX,BX
  383. GO1:
  384.     CALL    SCANP
  385.     JZ    DoExec
  386.     MOV    BP,[CSSave]
  387.     CALL    ADDRESS
  388.     XCHG    AX,DX
  389.     STOSW            ;Save offset of breakpoint
  390.     XCHG    AX,DX
  391.     STOSW
  392.     INC    DI        ;Save room for present value
  393.     INC    BX
  394.     CMP    BX,BPMAX+1
  395.     JNZ    GO1
  396.     MOV    AX,"PB"        ;BP ERROR
  397.     JMP    ERR
  398.  
  399. DoExec:
  400.     MOV    [BRKCNT],BX
  401.     CALL    GETEOL
  402.     MOV    CX,BX
  403.     JCXZ    NOBP
  404.     MOV    DI,offset DGroup:BPTAB
  405. SETBP:
  406.     LDS    SI,[DI]
  407.     ADD    DI,4
  408.     MOVSB            ;Copy present value
  409.     MOV    byte ptr [SI-1],0CCH    ;Set breakpoint
  410.     PUSH    ES
  411.     POP    DS
  412.     LOOP    SETBP
  413. NOBP:
  414.     MOV    [TCOUNT],1
  415.     JMP    EXIT
  416.  
  417. SETADD:
  418. ;Set GO address if specified
  419.     CALL    SCANP
  420.     CMP    AL,"="
  421.     JNZ    RET5
  422.     INC    SI
  423.     MOV    BP,[CSSave]    ;Default to CS
  424.     CALL    ADDRESS
  425.     MOV    [CSSave],AX
  426.     MOV    [IPSave],DX
  427. Ret5:    RET
  428.  
  429. end
  430.