This is a list of things that theoretically should be possible in some
way or another.  No commitment to actually do these, but these sound
possible to me right now.   In no particular order.  If someone else
wants to dig in, feel free.

1) Some kind of watchpoint capability.  Pretty easy once we have a
	single step capability, but we end up running the program
	really slowly one instruction at a time.  Use hardware debug
	registers for this???

2) Some kind of .wdbinit file.

3) Add 'info line' command.  Not all *that* useful, but it would tell you
	the range of PC for a given source line.

4) Add search directory list for PDB files.  We have the path in the
	DOS notation (i.e. C:\foo\bar\xxx.c), which may be a useful hint.
	Maybe not.

5) Add support for emacs mode so that you  can run under emacs and have
	the source pop up automatically.  Only useful once the list command
	is implemented.

6 Add support for Borland.  I have heard rumors that Borland is forthcoming
	with info about how their stuff works, so this might not be that
	bad.

7 Add support for Win16.  Not sure if this is really worth the trouble.  How
	much are people really going to use this in the long run???

8) Some of the newer displays are still a little bit sparse on information.
	Make these more like gdb.

9) Don't bother to disassemble an instruction when we stop at a breakpoint
	and if we have a valid source line we are displaying.

10) Add support for '/i', etc in display command.  Make sure 'display/i $eip'
	does the correct thing, and then skip automatic disassembly completely.

11)	Limit amount of information displayed with print command.

12)	Make sure operator precedence works OK.

****************
