I used cross assemblers in DOS to program 803x series of micro-controllers in 80's. To debug the hardware, I used a toggle switch to single step the programs and a LED probe to check the address lines to verify that the program branched to correct location, keeping a printout of the intermediate output from the compiler which showed assigned address for each instructions.
To avoid stepping through several hundred lines of instructions before reaching a particular routine say floating-point arithmetic, I would set beginning of the routine in question at a convenient address like 0x400, and wire the address line (A10) to break the program.
I have created several useful products using these humble tools.