ASDIS is able to single step also through ROM routines.
But it's a German program and documentation is also in German:
http://www.zx81.de/soft/asdis_bs.htm
Regards
Siggi
ASDIS wrote:
E. EINZL. Der Einzelschrittbetrieb führt sämtliche Z80-Befehle fast ohne Absturzgefahr aus. Dazu unterscheidet das Programm intern zwei Befehlsarten:
1. Befehle die den Program Counter (PC) ändern, werden in einer Spezialroutine simuliert (JP, JR, CALL, RET, usw.).
2. Alle anderen Anweisungen werden ausgeführt, nachdem ein Simulations-Stackpointer sowie alle Registerinhalte neu geladen wurden. Nach der Ausführung werden die Registerinhalte wieder im Speicher abgelegt. Der Simulationsstack ist anfangs auf $FF80 (bzw. $7F80 bei 6K RAM) gerichtet, wo genügend Platz nach oben und unten ist, er kann aber auch an jede andere Stelle im freien RAM gerichtet werden.
In dieser Funktion sind immer sämtliche Registerinhalte und Flags sichtbar. Bei den Flags bedeutet „1“ Flag gesetzt und „0“ Flag gelöscht. Es wurden nur der Interrupt Vector (IV) und der Refresh Counter (RC) weggelassen, weil sie beim Sinclair kaum benutzt werden können, ohne daß die Hardware durcheinander gebracht wird.
Unterhalb des PC-Registers wird der 2. Registersatz des Z80 aufgelistet, auf den bekanntlich nur durch die Befehle EXX und EX AF,AF zugegriffen werden kann.
Bevor der Einzelschrittbetrieb beginnt, kann man die Inhalte aller Register festlegen. Um ein bestimmtes Register auszuwählen, bewegt man den Cursor mit den Tasten 6 und 7 auf und ab. Nach 5 oder Shift 8 (beliebig) kann das Register, neben dem der Cursor steht, verändert werden. Auch hier können (wie immer) Symbole statt Zahlen eingegeben werden. (Wenn man z.B ein soeben assembliertes und abgelegtes Programm ab Label soundso testen will.)
Der Inhalt des PC entscheidet darüber, an welcher Stelle der Einzelschrittbetrieb aufgenommen wird. Sobald man die Registermanipulation (durch „8“ ) verläßt, wird der Befehl disassembliert, auf den der PC gerichtet ist, aber zur Sicherheit noch nicht ausgeführt.
5: mit dieser Unterfunktion werden alle Befehle mit Ausnahme an CALL und RST Anweisungen im Einzelschrittbetrieb ausgeführt. CALLs und RSTs werden echt ausgeführt. Diese Funktion hat ihren Sinn im Testen rechenintensiver Programme, wo es aus Zeitgründen sinnlos wäre, sie im Einzelschrittbetrieb zu testen.
Unterprogramme, die man schon getestet hat und die mit CALL (oder RST) aufgerufen werden, kann man also auf einmal ausführen lassen, um schneller zur kritischen Stelle zu kommen, die man eigentlich testen möchte. Man sollte natürlich vor der Benutzung dieser Taste sicher sein, daß entsprechende Unterprogramme auch einwandfrei arbeiten.
6: Diese Taste bewirkt den eigentlichen Einzelschrittbetrieb. Sooft man diese Taste drückt, führt man eine Einzelschritt-Simulation aus. Der Bildschirm wird gelöscht, der ausgeführte und der nächste auszuführende Befehl werden disassembliert und die neuen Registerinhalte angezeigt.
7: Mit dieser Taste gibt man eine NOP-Anweisung, also die Anweisung den nächsten Befehl zu überspringen statt auszuführen. Das hat immer dann einen Sinn, wenn man einen normalen Programmablauf verlaßen möchte, wie er durch Sprünge, CALLs oder RETs erzwungen würde, oder wenn eine Anweisung nicht ausgeführt werden soll, weil sie z.B. wichtige Speicher (wie Stack oder System-Variablen) überschreiben würde. Andere Beispiele für nicht ausführbare Befehle sind HALT, IM 0 und IM. 2.
8: Rückkehr ins Hauptprogramm.
9: Ausgabe an den Drucker.