
 1. About

    This is a clone of the MS-DOS DEBUG command. Some minor things aren't
    implemented. OTOH it has many features not available in the original
    MS-DOS DEBUG. For details see below.


 2. Files Overview

    The files in this distribution are:

    DEBUG.COM     Default executable binary of NDebug.
    DEBUGX.COM    DPMI-aware NDebug executable.
    DEBXXVDD.DLL  A Win32 .DLL (VDD) loaded if NDebug runs in a Windows NT
                  NTVDM "DOS box". Makes NDebug's L and W command work with
                  sectors on this platform.
    DEBXXVDD.ZIP  Archive with DEBXXVDD assembler source code. Assembles
                  with MASM or probably JWASM too.
    debug.asm     Assembler source code for NDebug. Assembles with NASM.
    debugtbl.inc  Include file for debug.asm, generated by mktables.
    instr.*       Data files on the instruction set, used by mktables.
    mktables.c    C program to compile the internal instruction-set
                  tables into source file debugtbl.inc. It runs under
                  Linux or Turbo C (version 2.0, at least).
                  Open Watcom 1.5 and 1.7 WCC works as well.
    readme.txt    This file.
    debug.txt     A DEBUG tutorial originally written by Michael Webster,
                  extended to describe all additional features of NDebug.


 3. Missing/Added features

  a. The following are not implemented:

   - Loading of .HEX files.

  b. This debugger extends the MS-DOS version in the following ways:

   - The assembler and disassembler support all publicly documented
     instructions for Intel chips through the Pentium Pro (P6). The
     assembler and disassembler inform you if any instruction is
     inappropriate for the current processor.

   - FPU opcodes are supported.

   - The current processor (for the purposes of assembler and disassembler
     warnings, above) can be declared to be something else via the following
     commands:

        m0  Declare current processor to be an 8088
        m1  Declare 186
        m2  Declare 286
        m3  Declare 386
        m4  Declare 486
        m5  Declare Pentium
        m6  Declare Pentium Pro
        mc  Declare the existence of a math coprocessor
        mnc Declare the absence of a math coprocessor
        mc2 Declare that the math coprocessor is a 287 (only valid
            if the current processor is a 386)
        m?  Print currently declared processor type
        m   Same as m?

   - 'r register [value]' accepts 32-bit register names (for 80386+ CPUs).

   - You can do `r cx 1234' instead of having to put the `1234' on a
     separate line.

   - 'rn' displays FPU register status for 80386+ CPUs only. Just the raw hex
      values of the registers are displayed for lower CPUs.

   - 'rx' switches among 8086 and 80386 register display (for 80386+ CPUs).

   - When doing `debug < file', debug will not hang if it reaches an end of
     file before encountering a `q' command.

   - This debugger saves and restores the program's Control-C and critical
     error interrupts, providing for better isolation between the debugger
     and the program being debugged.

   - 'tm 0|1' sets trace command mode, 0 = process INTs (default),
     1 = single-step INTs (the MS-DOS DEBUG compatible mode).

   - 'xr' allows to reallocate an EMS handle and 'xa' allows to allocate
     an "empty" EMS handle (with zero pages) - but only if an EMM v4.0
     is present.

   - Besides 'i' and 'o' exist the variations 'iw', 'id', 'ow' and 'od'
     to read/write a WORD or DWORD value from/to a port (DWORD values
     require a 80386+ CPU).

   - 'h' can handle dword values.

   - Register names can be used anywhere where a number is expected as
     input. That is, things like "u cs:ip" do work.

   - 'dm' displays the DOS memory control block (MCB) chain and the
     current PSP.

   - If DOS has set its InDOS flag, DEBUG will avoid to use int 21h internally,
     which allows to single-step through DOS code. The 'bd' command forces
     DEBUG to avoid Int21 and to ignore the actual value of InDOS. ('bd 1' sets
     InDOS mode, 'bd 0' resets to InDOS flag check.) Note that I/O redirection
     is deactivated during DEBUG's InDOS mode, DEBUG's output always goes to
     the screen and DEBUG always gets input from the keyboard. Command line
     editors are also deactived.

   - 'd', 't', 'u' and 'p' are automatically repeated if a blank line is
     entered.

   - 'di' displays interrupt vectors.

   - 'dz', 'd$', 'd#' and 'dw#' display strings from memory.

   - when running in a Windows XP DOS box, DEBUG will try to load and use
     DEBXXVDD.DLL. This DLL will allow DEBUG to successfully execute its
     low-level disk access commands L and W in this OS - if the user has
     administrator rights. DEBXXVDD.DLL is public domain, the MASM source
     is included in DEBXXVDD.ZIP. This file can also be downloaded from
     http://www.japheth.de/Download/debxxvdd.zip. Please be aware that you
     can do severe damage to your disk data if you use those low-level
     functions without knowing what you are doing.

   - 'rn' displays FPU registers in "readable" format on 80386+ CPUs.

  c. A DPMI aware version of the debugger, DEBUGX, is available, with the
     following additional features:

   - Besides real mode applications it can debug both 16-bit and 32-bit
     DPMI clients.
     [To debug DPMI clients a DPMI host has to be installed. Tested with
      CWSDPMI, HDPMI, WinXP NTVDM, 32RTM. In DosEmu and Windows 95/98/Me
      DOS boxes it is required to single-step through the initial switch
      to protected mode, else DEBUGX will loose control of the debuggee.]

   - 'di' also displays exception handlers in protected mode.

   - 'dl' displays LDT descriptors in protected mode only.

   - 'dx' displays extended memory (read via Int15, ah=87h). Requires a
     80386 CPU. 'dx' is automatically repeated if a blank line is entered.


 4. History

    0.95e [11 January 2003]  Fixed a bug in the assember.
    0.95f [10 September 2003]  Converted to NASM; fixed some syntax
       incompatibilities.
    0.98 [27 October 2003]  Added EMS commands and copyright conditions.
    ------- changes below were done by me, japheth
    0.99 [27 Septemb 2006]
       - bugfix: IF was not displayed correctly.
       - FS and GS registers displayed if cpu is 80386+.
       - RX displays the standard 32bit registers.
       - R register [value] understands the standard 32bit registers.
    0.99a [28 Septemb 2006] 
       - bugfix: JECXZ had wrong prefix (66h, should be 67h).
       - A and D understand the 32bit opcodes LOOP(Z|NZ|E|NE)D.
    0.99b [29 Septemb 2006]
       - L and W now work with FAT32 drives.
    0.99c [29 Septemb 2006]
       - RX changed. Now it toggles 16/32 bit register dump.
       - RN displays floating point register status.
    0.99d [02 October 2006]
       - bugfix: RN displayed error-pointer registers wrong.
    0.99e [12 October 2006]
       - XR command added to reallocate EMS handle.
       - XA command allows to allocate zero pages on EMS 4.0.
       - TM [0|1] added to be able to switch T to the ms-dos debug
         compatible behaviour (that is, T jumps into 'INT xx').
    0.99f [17 October 2006]
       - debug's EMS functions may work even with a "hidden" EMM.
       - bugfix: display of mappable pages didn't account for amount of
         these pages == 0.
    0.99g [25 October 2006]
       - bugfix: U was unable to recognise [ESP] related memory operands
         (i.e. mov eax,[esp]).
    0.99h [07 November 2006]
       - bugfix: R trying to display content of effective address has
         caused a GPF in v86-mode if this address was FFFFh of FFFDh.
       - IW, ID, OW and OD implemented.
    0.99i [14 November 2006]
       - bugfix: a child PSP was created but not terminated, causing files
         not to be closed. It became obvious if stdin and/or stdout were
         redirected to files ("C:\>DEBUG >yyy")
    0.99j [16 November 2006]
       - bugfix: using T if current instruction is an INT xx (and trace
         mode == 0) stopped debuggee one instruction *after* the INT (due
         to a x86 design weakness).
       - bugfix: the 0.99i bugfix had some problems on FreeDOS.
    1.00 [25 November 2006]
       - bugfix: debuggee's psp was saved after program load only, but
          this has to be done every time the debugger regains control.
       - There is now a DPMI aware version of debug, DEBUGX, createable
         from the source.
       - bugfix in disassembler: RETF did not have a corresponding RETFD
         entry (to switch with prefix 66h)
    1.01 [26 November 2006]
       - bugfix: MC2 didn't work.
       - Register names can be used anywhere where a number is expected
         as input.
    1.02 [29 November 2006]
       - bugfix: 'I d' and 'O d' didn't work because the parser assumed
         ID and OD commands.
       - DEBUGX bugfix: T= and G= didn't work in protected-mode.
       - bugfix: loading a file at another location than cs:100h was not
         supported in versions 0.99 - 1.01.
       - Debugger can be loaded high.
    1.03 [1 February 2007]
       - DEBUG bugfix: previous version of DEBUG.COM did not reliably reset
         "auto-reset" breakpoints (used for processing INTs).
       - DEBUGX: DI now works in real-mode as well.
       - DM command added.
    1.04 [2 March 2007]
       - making single-step through the DOS kernel possible.
    1.05 [1 April 2007] 
       - program exit code displayed.
       - DM displays the PSP "name".
       - autorepeat for D, DX, T and U added.
       - DEBUGX: DX added.
    1.06 [21 May 2007] 
       - bugfix: SMSW/LMSW in assembler didn't accept a 32bit operand.
       - bugfix: OW/OD didn't accept the value parameter.
       - key '-' supported in E command to step backward.
    1.07 [3 November 2007]
       - bugfix: entering ranges with upper bound was refused.
       - DEBUGX bugfix: if help cmd waited for a keypress, it displayed
         garbage if cpu was in protected-mode and CWSDPMI was used.
       - Tracing into an INT (TM 1) now works if interrupt vector points
         to ROM code.
    1.08 [23 November 2007]
       - bugfix: segment prefix was lost for mnemonics without arguments
         (patch by Oleg O. Chukaev).
    1.09 [30 December 2007]
       - DEBUGX: several bugfixes for A and U handling 32bit code segments.
       - bugfix: U split lines if instruction size exceeded 6.
       - bugfix: M didn't work with "upper bound" ranges.
       - DEBUGX change: in 32bit code segments, U displayed ECX as first
         operand for LOOPx to indicate that ECX is used instead of CX. 
         Now a 'D' is attached to the opcode (LOOPxD, x=Z|NZ|E|NE) instead.
       - bugfix: A didn't choose the short (=signed) form of arith
         instructions (adc, add, ...) if E/AX was first operand.
    1.10 [25 January 2008]
       - DEBUGX: to intercept DPMI initial switches to protected-mode,
         int 2Fh is now hooked later. This allows to debug applications
         which install their own DPMI host during initialization.
       - DEBUGX: DL understands an optional "count" argument.
    1.11 [06 February 2008]
       - bugfix: debugger lost debuggee's HiWord(EFL) in real-mode.
       - bugfix: if debuggee set CR0 AM bit and EFL AC flag, an 
         exception 11h occured in the debugger.
       - DEBUGX bugfix: G command was unable to set/restore breakpoints if
         HiWord(EIP) wasn't clear.
       - DEBUGX bugfix: U ignored HiWord of argument's offset part.
       - DEBUGX bugfix: E ignored HiWord of argument's offset part.
       - DEBUGX bugfix: M didn't accept first argument's offset > FFFF.
       - DEBUGX bugfix: running in NTVDM and pressing Ctrl-C while debuggee
         is in protected-mode no longer drops to real-mode.
       - DEBUGX: RN now renders floating point register content properly
         (DEBUG still just displays raw hex format for size reasons).
       - DEBUGX: DI got an optional 'count' parameter.
       - DEBUGX: D default segment part is checked if it is valid in pmode
         and changed to value of client's DS if no.
    1.12 [14 February 2008]
       - bugfix: length 0 in range wasn't interpreted as 64 kB.
       - DEBUGX bugfix: E in prompt mode didn't work with 32bit offsets.
       - DEBUGX bugfix: L and W didn't work with buffer offset >= 10000h.
       - DEBUGX bugfix: Q while debuggee was in pmode caused a GPF if
         HiWord(EIP) or HiWord(ESP) wasn't zero.
       - DEBUGX: DI additionally displays DPMI exception vectors.
       - DEBUGX: when running in NTVDM, DEBXXVDD.DLL will be loaded, which
         will make L and W work with sectors on this platform.
       - DEBUGX: DM now works in protected-mode as well.
       - now all commands are described in DEBUG.TXT.
    1.13 [27 February 2008]
       - DEBUG bugfix: L and W with sectors worked for DEBUGX only in v1.12.
    Following changes developed as NDebug by C. Masloch.
    2009-03-30
       - bugfix: won't overwrite free DOS memory during installation.
       - DEBUGX bugfix: Win3.x won't prevent hooking Int2F.
       - detects 186 during installation.
       - assembler accepts segment override inside brackets (like NASM).
       - DEBUG: real mode code of DEBUGX's DI command added.
       - internal: changed all strings to ASCIZ; don't use Int21.09. Also
         improves possibility to debug DOS.
       - DX and D displaying unified (internal: some code shared), now DX also
         defaults to replace CP-dependant characters (>= 80h) with dots.
       - raw key input code to debug DOS now idles CPU (tries Int2F.1680, uses
         hlt if not available).
       - bugfix: M to set machine works again (MNC and M? were broken).
       - bugfix: IVT Int22 may have been set wrong. Troubled Int21.55.
       - added NASM-like mnemonics ud0-2, int3, int1, retn.
       - internal: added _DEBUG option to debug NDebug with itself. maked.bat
         creates DDEBUG(X).COM with _DEBUG option.
       - DDEBUG: Int00, Int01, Int03 vectors of previous copy restored when
         executing DDEBUG's code.
       - DDEBUG: added BP command. Executes a breakpoint to get back into the
         previous copy of NDebug.
       - autorepeat for P added.
       - bugfix: "D ip..." recognized as "DI p..." (error). Now DI checks for
         a 'P' letter first and passes executation back to D if found.
       - H now shows dword results (only) if necessary, previously didn't show
         dwords if both parameters fit in words.
       - bugfix: might have displayed or possibly executed Int23 and Int24 set
         to 0000:0000 instead of the values set by NDebug's parent.
       - help message "[more]" prompt generalized for usage by other commands.
       - G doesn't show the "Unexpected breakpoint" message if a specified
         breakpoint is executed that also contained a breakpoint before.
       - bugfix: G might have failed to display the "Unexpected breakpoint"
         message, or might have failed not to display it in certain situations.
       - DEBUGX bugfix: G might set eip wrong.
       - DEBUGX bugfix: T might in a very unprobable situation have substituted
         cs:ip with other values and/or write a wrong breakpoint. The later
         would possibly cause a crash or unexpected program behaviour.
       - bugfix: when trace mode was on and debuggee was in real mode and an
         int opcode was to be executed inside ROM code, T would clear CF.
         Additionally IF won't be cleared when executing the interrupt handler
         code.
       - bugfix: T didn't clear TF on stack when tracing pushf opcode wich had
         a prefix (pushfd in RM or 16-bit PM or pushfw in 32-bit PM).
       - DEBUGX bugfix: U might have disassembled from a wrong offset and/or
         less or more bytes than requested in 32-bit PM.
       - added BD command. Works as TM but modifies "debug DOS" mode. "BD 1"
         forces NDebug not to use Int21 when possible.
       - "[more]" prompt as from help message applied to other commands. Long
         output of esp. D, DX, DI, DM, U, C, ? will be split into multiple
         screens with prompts inbetween when StdIn and StdOut are not files.
         Commands P and T are not paged.
       - bugfix: non-ASCII keys accepted (discarded). Int21.08 now called twice
         if first call returned al zero. Previously generated ASCII characters.
       - bugfix: assumed Int21.7305 available on MS-DOS version 5.x, L and W
         command failed to read or write sectors.
       - DEBUGX bugfix: If G set a breakpoint in Real Mode and this breakpoint
         was executed in Protected Mode after a mode switch, it wouldn't be
         recognized. Now it will be recognized if the DPMI host returns correct
         base addresses for selectors used by NDebug and the debugged program.
       - DEBUGX bugfix: If G set a breakpoint in Real Mode with the segment
         part specified (even if same value as cs) and this breakpoint was
         executed in Protected Mode after a mode switch, the byte value of the
         breakpoint won't be restored. A random byte would be set to the
         original value of the breakpoint, or a General Protection Fault would
         occur. The "Unexpected breakpoint" message would be displayed.
       - bugfix: If the specification of a breakpoint for G contained a
         register name and this register's value had changed when executing the
         specified or another breakpoint, a random byte would be set to the
         original value of the breakpoint (could cause a General Protection
         Fault in Protected Mode), the breakpoint byte wouldn't be restored and
         the breakpoint wouldn't be recognized. (Internal: G now saves the full
         actual address of a breakpoint into its buffer instead of re-parsing
         the user's input when control returns to the debugger. The previous
         bugfix is also based on this new method.)
       - DEBUG: real mode code of DEBUGX's RN command added.
       - code of former DEBUG's limited RN command left in DEBUG and added to
         DEBUGX. It is used when no 386+ CPU is detected.
       - DEBUGX bugfix: RN executed 386 code without checking the CPU first.
       - bugfix: NDebug's Int22 set wrong by another NDebug bugfix. (Int23 and
         Int24 set wrong as described above. In initcont, I accidentally wrote
         the address of label int22 into NDebug's PSP instead of debug22.)
    2010-08-16
       - G breakpoint addresses stored as 21-bit (DEBUG) or 32-bit (DEBUGX)
         flat addresses.
       - added DZ, D$, D# and DW# commands to display ASCIZ, CP/M and counted
         strings. (D# uses a byte count, DW# uses a word count.)
       - bugfix: No longer executes 386+ opcodes on 8086..286 if machine is set
         to 386+ for assembler. Added an internal flag to indicate whether the
         current CPU actually is a 386.
       - registers stored in a simple dword array.
       - simplified access to registers so all code now uses isvariable?: (this
         function was previously called issymbol:).
       - added support for byte registers al, ah, bl, bh, cl, ch, dl, dh to new
         isvariable?: function. Now all NDebug commands can access the byte
         registers directly.
       - any two 16-bit registers can now be accessed as a 32-bit register by
         all NDebug commands. "dxax" refers to a register with dx as high word
         and ax as low word.
       - v0..vf variables added.
       - changed single-line disassembler (register dump R, or after T/P/G) so
         that it also shows accessed memory when the fs or gs register is used.
       - Expression evaluator added. Strictly works from left to right with
         no operator preceedence. Manual preceedence with round brackets.
         Variables and registers accessible.
       - H displays the negative value too if the high bit of a result is set.
       - access to option variable vo, internal flag variable vi (read-only)
         and startup option variable vs (read-only)
       - BS, BC, BR set/clear/reset option bit commands added
       - RV displays all variables as well as misc debugger info (PSP, PSP
         selector in PM, parent process and Int22 of debugger)
       - R: can access every flag by name (CF, ZF etc) and set to 0 or 1
       - Help screens ?N, ?O, ?F, ?R, ?V added. Help now requires you to enter
         only ?, or one of the requests for the specific help screens.
       - Source split up in several files. Main file's still 150+ KiB though.
       - R EF works like R F. Fixed bug not checking if an actual register
         was accessed in isvariable?: if the string started with E.
       - S fixed for 32-bit segments. S search area start + search area end
         syntax slightly changed: S 0 FFFF ... now searches the whole segment
         as would be expected based on the syntax of other commands. Added
         S range range syntax where a search string in memory is referenced
         instead of entering one on the command line. (Internal: primitive
         throw/catch error handling added.) Now dumps up to 16 bytes of memory
         that follow the search result.
       - Hook Interrupt 06h to catch invalid opcodes.
       - C and M work correctly with any combination of 16- and 32-bit segments
         as well as with a full 64 KiB 16-bit segment to compare or move.
       - Fixed being able to set machine type to 486/586/686 with 287.
       - H fixed to work with usual syntax again (previously only accepted one
         argument due to expression evaluator change).
       - Several bugs with DI fixed. DI 0 FF or DI 0 L 100 show all interrupts.
         Auto-repeat added to DI.
       - Rewrote and fixed G again. Now always displays useful error messages
         and correctly aborts if one of the breakpoints can't be written or
         restored. Made number of breakpoints configurable in the source,
         by default set to 16 (max: 128).
       - Fixed a bug that might have caused some code to write to a wrong byte
         in a 32-bit CS.
    2010-00-00
       - Hook exception 06h and exception 0Ch as DEBUGX 1.18 does.
       - Option to exclude EMS calls.
       - M command would reset 386+ register dumping (RX command) although
         the actual CPU type isn't coupled to M anymore.
       - Fixed a bug that would cause an exception 00h or overwrite too much
         and cause a GPF if F command would be used to fill 2+ GiB of memory.
       - Fixed a bug which used a too long source string for F if the area to
         be filled was longer than 64 KiB (32-bit segments).
       - If an invalid address was entered on A's command line, it would enter
         assembling mode anyway at the default address. Now it returns to the
         main prompt.
       - Adapted DEBUG/X 1.18's non-386 patch table method for smaller disk
         and memory image (with a second patch table for 386).
       - Misc code size improvements. (Lots of 386+/32-bit segment checking
         done with shorter code or checking made completely unnecessary by
         aggressive patching. I command and O command share code. Some taken
         from DEBUG/X 1.18.)
       - Entering a segment/selector value >= 10000h would truncate the value
         to 16-bit and use that instead. Now correctly shows an error.
       - Fixed some bugs in D with 32-bit segments that I probably introduced
         previously.
       - U command on non-386 CPU might have assumed a 32-bit code segment due
         to a bug I previously introduced.
       - Some 386 checks U did regarding the code segment still used M option.
       - Now a multi-section binary, which simplified some notation things and
         made others more difficult. This was mainly required for the way the
         DEBUG/X 1.18 macro-based (dis)assembler tables work.
       - After a clarification from Paul Vojta that this is allowed, NDebug is
         now released under the 2-clause (simplified) BSD license.
       - Assembler didn't work after DEBUG/X table was adapted.
       - Assembler doesn't accept "ST(1" or "ST1)" anymore, only the correct
         "ST1" and "ST(1)" notations.
       - New assembler table format, D/W suffix handling unified and suffixes
         accepted for more instructions. (f.e. IRET, IRETW, IRETD: IRET now
         implies 16- or 32-bit as per the code segment, IRETW and IRETD are
         the explicitly specified 16- and 32-bit instructions.)
       - NASM-style O32, A32, O16, O32 prefixes.
       - Assembler would sometimes compute short jumps incorrectly if in a
         32-bit code segment with offsets above 64 KiB.
       - Fixed potential (stack) memory leaks in the assembler.
       - Single LOCK, REP and segment prefixes permitted in assembler; all
         prefixes (including size prefixes) can now be followed by a colon that
         will be ignored.
       - A single LOCK or REP prefix would previously ignore preceding segment
         prefixes.
       - Optional lowercase disassembler output; optional spacing between
         operands; disassembler only outputs W or D suffix if necessary.
       - DDEBUG: BP command renamed BU (Break upwards).
       - BS, BC, BR (option set/clear/reset) and BD (toggle forced InDOS mode)
         commands no longer supported.
       - Dummy B[P] (set breakpoint), BC (clear), BD (disable), BE (enable),
         BT (toggle), BL (list) commands added. Breakpoints (0..F) can be set
         and listed but are not yet set really.
       - ?L command displays the license.
       - ?E command displays help about expressions.
       - Option variables renamed and new added: NDO (options), NDS (startup
         options), NAO (assembler options), NAS (assembler startup options),
         NDI (internal flags), NPR (process), NPP (parent), NPI (int22), NPS
         (selector of process, or zero).
       - RV display changed; V0..VF now in four lines with four entries each.
       - ENTER, LEAVE accept D/W mnemonic suffix to specify 16- or 32-bit form.
       - Added MMX instruction set.
       - Expanded limits of assembler tables (partly necessary).
       - Added BOP instruction (for NTVDM), opcode C4h,C4h, with the operand
         lists imm8,imm8 and imm16. Since tracing at least some BOPs causes an
         interrupt 01h only after the next instruction, a BOP will cause the
         single-line disassembler to display both the BOP as well as the next
         instruction. This opcode is the NTVDM's callback mechanism.
       - Incorporated small improvements from DEBUG/X 1.19, including a bug fix
         where on 16-bit CPUs sp was not set immediately after the instruction
         that sets ss.
       - Added BOXCB instruction (for DOSBox), opcode FEh,38h (FEh/7), with
         an imm16 operand. This opcode is DOSBox's callback mechanism.
       - Adjusted "[more]" prompt so it is no longer shown for cases where the
         output reachs exactly to the screen's bottom (leaving the last line
         for the next regular prompt).
       - A superfluous "[more]" prompt was displayed if you managed to fill the
         screen using the interactive E command.


 5. Copyright

    NDebug is copyrighted, but feel free to modify, distribute and use it as
    you wish. It is licensed under the 2-clause (simplified) BSD license,
    which can be found in debug.asm and most other source code files in full.

    FreeDOS DEBUG has previously been developed by:

    Paul Vojta
    vojta@math.berkeley.edu

    DEBUG/X is currently developed by "Japheth" (http://www.japheth.de/).
    As of this writing, DEBUG/X 1.18 is the most recent version.

    NDebug is currently developed by me:

    C. Masloch
    cm@bttr-software.de

    Please report anything NDebug-specific to me instead of another developer.
    You may want to visit our website and forum (http://www.bttr-software.de/)
    for any such report.

    Although you are free to distribute NDebug it is only intended as local
    development fork of FreeDOS DEBUG right now. Please don't redistribute it
    without letting me know. (This is in no way a requirement or restriction.)
