Home of the original IBM PC emulator for browsers.
The first version of SYMDEB I used was probably Version 4.00, released with Microsoft Macro Assembler 4.00:
Volume in drive A has no label
Directory of A:\
SYMDEB EXE 37021 10-16-85 4:00a
1 File(s) 69632 bytes free
SYMDEB was a big improvement over the DOS DEBUG utility, which was clearly not getting enough love in the mid 1980’s. For example, PC DOS 3.00 was released in conjunction with the 80286-based IBM PC AT, and yet the DEBUG utility that shipped with PC DOS 3.00 didn’t understand any 80286-specific instructions.
And I’m not just talking about “esoteric” instructions that most users wouldn’t have cared about anyway, like
LGDT or LIDT. No, even instructions introduced by the 80286’s predecessor, the 80186, such as shift,
rotate, and push immediate instructions (eg, SHL AX,4
) were not recognized by DEBUG either.
Also, DEBUG had some annoying quirks. For example, you could change the Instruction Pointer (IP) with the
R IP
command, but you couldn’t assemble at IP with A IP
. SYMDEB fixed that, allowing you to use the value of
any register as part of any address or expression.
DEBUG also had a historical idiosyncrasy where PC referred to the processor flags (Processor Conditions?)
rather than the Program Counter. SYMDEB resolved that by treating PC as alias for IP. It seems that
the ability to edit the processor flags directly was dropped in favor of the preferred interpretation of PC.
Note that you could still edit the processor flags indirectly, using the R F
command.
Output from SYMDEB Version 4.00:
Microsoft (R) Symbolic Debug Utility Version 4.00
Copyright (C) Microsoft Corp 1984, 1985. All rights reserved.
Processor is [80286]
-?
A [<address>] - assemble M <range> <address> - move
BC[<bp>] - clear breakpoint(s) N <filename> [<filename>...] - name
BD[<bp>] - disable breakpoint(s) O <value> <byte> - output to port
BE[<bp>] - enable breakpoint(s) P [=<address>] [<value>] - program step
BL[<bp>] - list breakpoint(s) Q - quit
BP [bp] <address> - set breakpoint R [<reg>] [[=] <value>] - register
C <range> <address> - compare S <range> <list> - search
D[type][<range>] - dump memory S {-|&|+} - source level debugging
E[type] <address> [<list>] - enter T [=<address>] [<value>] - trace
F <range> <list> - fill U [<range>] - unassemble
G [=<address> [<address>...]] - go V [<range>] - view source lines
H <value> <value> - hexadd W [<address> [<drive><rec><rec>]] - write
I <value> - input from port X [?] <symbol> - examine symbols(s)
K [<value>] - stack trace XO<symbol> - open map/segment
L [<addr> [<drive><rec><rec>]] - load Z <symbol> <value>
? <expr> - display expression > } <device/file> - Redirect output
! [dos command] - shell escape < { <device/file> - Redirect input
. - display current source line = ~ <device/file> - Redirect both
\ - screen flip * <string> - comment
<expr> ops: + - * / : not seg off by wo dw poi port wport mod and xor or
<type> : Byte, Word, Doubleword, Asciz, Shortreal, Longreal, Tenbytereal
Earlier versions of SYMDEB existed, too. For example, it was part of Microsoft Macro Assembler 3.01:
Volume in drive A has no label
Directory of A:\
SYMDEB EXE 36538 6-07-85 4:26p
1 File(s) 74752 bytes free
Here’s the banner from SYMDEB Version 3.01 (the help menu was identical to 4.00, which isn’t too surprising, since only about four months separated them):
Microsoft Symbolic Debug Utility
Version 3.01
(C)Copyright Microsoft Corp 1984, 1985
And before that, SYMDEB Version 3.00 was bundled with Microsoft Macro Assembler 3.00, which was about six months older:
Volume in drive A has no label
Directory of A:\
SYMDEB EXE 27136 12-07-84 1:39p
1 File(s) 138240 bytes free
Here’s the banner and help menu from SYMDEB Version 3.00:
Microsoft Symbolic Debug Utility
Version 3.00
(C)Copyright Microsoft Corp 1984
Processor is [80286]
-?
A [<address>] - assemble H <value> <value> - hexadd
BC <bp> - clear breakpoint(s) I <value> - input from port
BD <bp> - disable breakpoint(s) L [<address> [<drive><rec><rec>]] - load
BE <bp> - enable breakpoint(s) M <range> <address> - move
BL <bp> - list breakpoint(s) N <filename> [<filename>...] - name
BP [bp] <address> - set breakpoint O <value> <byte> - output to port
C <range> <address> - compare P - program step
DA[<range>] - dump asciz string Q - quit
DB[<range>] - dump bytes R [<reg>] - register
DW[<range>] - dump words S <range> <list> - search
DD[<range>] - dump doublets S{-|&|+} - source level debugging
DS[<range>] - dump short float T [=<address>] [<value>] - trace
DL[<range>] - dump long float U [<range>] - unassemble
DT[<range>] - dump tempreal float W [<address> [<drive><rec><rec>]] - write
E [<address>] [<list>] - enter X[?] <symbol> - examine symbols(s)
F <range> <list> - fill XO <symbol> - open map/segment
G [=<address> [<address>...]] - go
? - help menu
? <expr> - display expression
> {CON|COM1} - Redirect output
< {CON|COM1} - Redirect input
= {CON|COM1} - Redirect both
If there was a SYMDEB Version 1.xx or 2.xx, I’ve never seen it. It’s possible that SYMDEB Version 3.00 was the first (public) version, and since it would have started as a fork of the DOS DEBUG utility, the initial version may have simply mirrored the contemporaneous version of DOS, which in mid-1984, would have been DOS Version 3.00.
Other early versions of SYMDEB were also bundled with Windows SDKs. In the Windows 1.01 SDK:
Volume in drive A is WINDEV1
Directory of A:\BIN
SYMDEB EXE 37371 7-18-85 9:02a
1 File(s) 44032 bytes free
SYMDEB reported itself as “Version 3.Windows”:
Microsoft Windows Debugger
Version 3.Windows
(C) Copyright Microsoft Corp 1984, 1985
but despite the weird version number, the help menu was identical to SYMDEB 3.01.
In subsequent versions of the Windows SDK, the “Windows” version of SYMDEB began to diverge more noticeably. In the Windows 1.03 SDK:
Volume in drive A is WINDEV1
Directory of A:\
SYMDEB EXE 41269 8-27-86 2:14p
1 File(s) 37888 bytes free
SYMDEB reported itself as “Windows Version 2.00”:
Microsoft Symbolic Debug Utility
Windows Version 2.00
(C) Copyright Microsoft Corp 1984, 1985, 1986
and included several Windows-specific commands, such as:
DH - Displays local heap for current DS
DG - Displays global heap for Windows
DQ - Displays [*] HQ - HTASK CHANGEBITS WAKEBITS WAKEMASK
In the Windows 2.03 SDK:
Volume in drive A is UTILITY
Directory of A:\BINAPPS
SYMDEB EXE 43593 1-29-88 12:00a
1 File(s) 577024 bytes free
Although the binary had changed, SYMDEB displayed the same version and copyright as in the Windows 1.03 SDK.
In the Windows 3.00 SDK:
Volume in drive A is WIN30SDK02
Directory of A:\DBGTOOLS
SYMDEB EXE 44573 6-01-90 3:00a
1 File(s) 34816 bytes free
SYMDEB reported itself as “Windows Version 3.00”:
Microsoft Symbolic Debug Utility
Windows Version 3.00
(C) Copyright Microsoft Corp 1984-1990
and included even more Windows-specific commands:
DH - Displays local heap for current DS
DG - Displays global heap for Windows
DF - Displays global heap free list for Windows
DU - Displays global heap LRU list for Windows
DM - Displays module list for Windows
DQ - Displays [*] HQ - HTASK CHANGEBITS WAKEBITS WAKEMASK
Sadly, SYMDEB was dropped from Microsoft Macro Assembler releases after Version 4.00. One possible explanation for its omission is that, by the time Microsoft Macro Assembler 5.00 was released, 80386 support was a requirement, and SYMDEB Version 4.00 didn’t contain any 80386 support.
The Windows versions of SYMDEB did add support for the 80386, starting with “Windows Version 2.00”, so Microsoft could have simply bundled that version of SYMDEB with MASM 5.00 and up. Why didn’t they? Perhaps they felt that all the Windows-specific functionality would need to be removed first, or perhaps they viewed CodeView as a complete replacement. Whatever the reason, it seems clear they didn’t want to be bothered with SYMDEB anymore.
RIP, SYMDEB.
Jeff Parsons
Feb 25, 2018