home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / TP_TRC.ZIP / DEMOTRC.PAS next >
Encoding:
Pascal/Delphi Source File  |  1989-05-12  |  5.8 KB  |  158 lines

  1. {════════════════════════════ DEMOTRC.PAS ════════════════════════════}
  2. { This program demonstrates the use of a Trace Procedure which traps  }
  3. { each statement that changes one of three monitored variables.  The  }
  4. { user can resume, release to debugger, or halt based on user input.  }
  5. {═════════════════════════════════════════════════════════════════════}
  6. Program DemoTrc;
  7.  
  8. Uses TRACE;
  9.  
  10. {══════════════════════════════ HexOut ═══════════════════════════════}
  11. { Display a Word or Byte value as 4 hexidecimal digits.               }
  12. {══════════════════════════════ HexOut ═══════════════════════════════}
  13. TYPE     Str4 = STRING[4];
  14. CONST    HexDigit: Array[0..15] OF CHAR = '0123456789ABCDEF';
  15. FUNCTION HexOut(Num:INTEGER):Str4; VAR m:INTEGER;
  16. BEGIN
  17.   HexOut:='0000';
  18.   For m:=3 downto 0 do HexOut[4-m]:=HexDigit[($F AND (Num SHR (4*m)))];
  19. END; {FUNCTION HexOut}
  20.  
  21. {═══════════════════════════ DumpUserRegs ════════════════════════════}
  22. { Display all registers from the interrupted program in a format      }
  23. { similar to DEBUG.  (Valid only when called from the Trace routine). }
  24. {═══════════════════════════ DumpUserRegs ════════════════════════════}
  25. PROCEDURE DumpUserRegs;
  26. VAR  Fg: WORD;  FgStr: STRING[9];
  27. VAR  Ch: Char;  n: Byte;
  28. BEGIN
  29.  
  30.   WRITELN(#10); {skip 2 lines}
  31.  
  32.   WRITE('  AX=',HexOut(User^.Ax));  WRITE('  BX=',HexOut(User^.Bx));
  33.   WRITE('  CX=',HexOut(User^.Cx));  WRITE('  DX=',HexOut(User^.Dx));
  34.   WRITE(' ':3);    { Adjust Sp for 12 words pushed onto User Stack }
  35.   WRITE('  SP=',HexOut(UserSp +24 ));    WRITE('  BP=',HexOut(User^.Bp));
  36.   WRITE('   ');
  37.   WRITE('  SI=',HexOut(User^.Si));  WRITE('  DI=',HexOut(User^.Di));
  38.   WRITELN;
  39.   WRITE('  DS=',HexOut(User^.Ds));  WRITE('  ES=',HexOut(User^.Es));
  40.   WRITE('  SS=',HexOut(UserSs));
  41.   WRITE(' ':12);
  42.   WRITE('  CS=',HexOut(User^.Cs));  WRITE('  IP=',HexOut(User^.Ip));
  43.   WRITE('   ');
  44.   WRITE('  FG=',HexOut(User^.Flags));
  45.   Fg := User^.Flags; FgStr := '         ';
  46.   IF Fg AND $0001 > 0 THEN FgStr[9] := 'c';
  47.   IF Fg AND $0004 > 0 THEN FgStr[8] := 'e';
  48.   IF Fg AND $0010 > 0 THEN FgStr[7] := 'a';
  49.   IF Fg AND $0040 > 0 THEN FgStr[6] := 'z';
  50.   IF Fg AND $0080 > 0 THEN FgStr[5] := 's';
  51.   IF Fg AND $0200 > 0 THEN FgStr[4] := 'i';
  52.   IF Fg AND $0400 > 0 THEN FgStr[3] := 'd';
  53.   IF Fg AND $0800 > 0 THEN FgStr[2] := 'o';
  54.   WRITELN(FgStr);
  55.   WRITELN;
  56.  
  57. END; {PROCEDURE DumpUserRegs}
  58.  
  59.  
  60. VAR
  61.   ByteVar: BYTE;
  62.   WordVar: WORD;
  63.   StrgVar: STRING;
  64.  
  65. {════════════════════════════ GlobalTrace ════════════════════════════}
  66. { This is the Pascal Trace Procedure.  If one of the monitored        }
  67. { variables has changed from its saved value, save new values and     }
  68. { display menu of options.  Illustrates all three valid exits from    }
  69. { a trace procedure (TReturn, TRelease, or Halt).                     }
  70. {════════════════════════════ GlobalTrace ════════════════════════════}
  71. PROCEDURE GlobalTrace;
  72. LABEL Menu;
  73. CONST
  74.   Init:  BOOLEAN = TRUE;
  75.   SaveB: BYTE = 0;
  76.   SaveW: WORD = 0;
  77.   SaveS: STRING = '';
  78.  
  79. BEGIN
  80.  IF (ByteVar <> SaveB)  OR (WordVar <> SaveW)  OR (StrgVar <> SaveS)
  81.  THEN BEGIN
  82.  
  83.   SaveB:=ByteVar;    SaveW:=WordVar;    SaveS:=StrgVar;
  84.   IF Init THEN BEGIN  Init:=FALSE;  TReturn;  END;
  85.  
  86.   WRITELN(#10#10); {skip 3 lines}
  87.   WRITE(HexOut(User^.Cs),':',HexOut(User^.Ip),'  BP=',HexOut(User^.Bp));
  88.   WRITE('  ByteVar=',ByteVar,'  WordVar=',WordVar);
  89.   WRITELN('  StrgVar=',Copy(StrgVar,1,20));
  90.   WRITELN;
  91.  
  92.  Menu:
  93.   WRITE(#13'  Select:  <C>ontinue trace  <D>ebugger  <R>egisters  <Q>uit  :');
  94.   CASE ReadKey OF
  95.     'C','c': BEGIN WRITELN;  TReturn;  END;
  96.     'D','d': TRelease;
  97.     'R','r': BEGIN DumpUserRegs; Goto Menu; END;
  98.     'Q','q': Halt;
  99.       else   BEGIN WRITE(#7); Goto Menu; END;
  100.   END; {CASE ReadKey}
  101.  END;
  102.  TReturn; {- If no monitored variable changed, exit via TReturn -}
  103. END; {PROCEDURE GlobalTrace}
  104.  
  105.  
  106. {════════════════════════════ ClearWordVar ═══════════════════════════}
  107. { This procedure modifies one of the monitored global variables.      }
  108. {════════════════════════════ ClearWordVar ═══════════════════════════}
  109. PROCEDURE ClearWordVar;
  110. BEGIN
  111.  WRITELN(#10#10);
  112.  WRITELN('The following trap occurred within the procedure ClearWordVar.');
  113.  WRITELN('(Note the reduced value in the BP register).');
  114.  WordVar := 0;
  115. END; {PROCEDURE ClearWordVar}
  116.  
  117.  
  118. {════════════════════════════════ Nop ════════════════════════════════}
  119. { Inline directive used to insert dummy statements between the        }
  120. { statements which will be trapped by the trace routine.              }
  121. {════════════════════════════════ Nop ════════════════════════════════}
  122. PROCEDURE Nop; Inline($90);  {- Assembly "No Operation" -}
  123.  
  124.  
  125. {════════════════════════════════ MAIN ═══════════════════════════════}
  126. BEGIN {- MAIN -}
  127.   ByteVar:=0;
  128.   WordVar:=9999;
  129.   StrgVar:='Hello =====================================================';
  130.   TraceOn(@GlobalTrace);
  131.   WRITELN(#10#10#10#10#10);
  132.   WRITELN('                         TRACE Version 1.0'#10);
  133.   WRITELN('              Copyright (c) 1989  Richard W. Prescott'#10#10);
  134.   WRITELN('Trace is now active.  Each time ByteVar, WordVar, or StrgVar is');
  135.   WRITELN('modified the Trace procedure will display this menu of choices.');
  136.   WRITELN('Select:  "C" to continue the trace');
  137.   WRITELN('         "D" to stop the trace and release to IDE/external debugger');
  138.   WRITELN('         "R" to display all registers and return to the menu');
  139.   WRITELN('         "Q" to halt the program'#10);
  140.   WRITELN('Run this demonstration from the Version 5.0 IDE, or compile to disk');
  141.   WRITELN('and run from DOS or any debugger.');
  142.   Nop;
  143.   Nop;
  144.   Inc(ByteVar);
  145.   Nop;  {- Note that release to debugger pops up at the FOLLOWING line -}
  146.   Nop;
  147.   WordVar:=34567;
  148.   Nop;  {- Note that release to debugger pops up at the FOLLOWING line -}
  149.   Nop;
  150.   ClearWordVar;
  151.   Nop;
  152.   Nop;
  153.   StrgVar:='Bye';
  154.   Nop;
  155.   Nop;
  156.   TraceOff;
  157. END.
  158.