(Note: I am referring to software that would run on an end-users' system, not special debugging computers)
Debuggers are programs that poke around at other programs' memory. In modern computers they rely on the ability for multiple programs to run at once, abundance of memory and, most importantly, dynamic allocation: an ordinary program only having access to memory it's reserved, which other programs can't simultaneously use for different purposes.
However, retro-computers didn't have these features: except using interrupts (passing control back and forth), programs couldn't run simultaneously. Programs had access to all the memory: there was no way to tell what memory was and wasn't used, therefore knowing where to load the debugger. And even if there was a way to know that, many programs used most or all of the memory in a computer, leaving no place for the debugger to run.
And yet debugging software did exist, such as the DDT series, the ODT series, OLIVER, SIMON, CA/EZTEST and much of the XPEDITER series. My question is: how did they work?
- How did they load themselves into memory without conflict?
- How did they implement single-stepping?
- How did they ensure that they weren't overwritten?