*****************************************************************
* * * L A R A * * * * A N L E I T U N G * * * * * * Programm: LARA * * Funktion: Disassembler und Debugger * * Autor: Jèrgen Weber * * Wiesentalstr. 1 * * 7170 Schwébisch Hall * * benùtigte * * Hardware: Schneider (Amstrad) CPC 6128 * * oder CPC 464/664 mit dk'tronics * * Speicherweiterung * * * * freigegeben als * * Public Domain Programm * * durch den Autor * * nur fèr nichtkommerziellen Einsatz * * * ***************************************************************** Letzte [nderung der Dokumentation: 1. Juli 1989 LARA ist ein Werkzeug, mit dem Sie Maschinenprogramme untersuchen und testen kùnnen. Zusétzlich lé~t es sich als kleiner Disketten monitor verwenden. Dabei stehen viele Sonderfunktionen zur Verfègung, die durch Einbuchstabenkommandos bedient werden. Dadurch lé~t sich mit etwas ]bung sehr schnell arbeiten. Wenn Sie unter CP/M schon einmal mit DDT gearbeitet haben, wird Ihnen die Bedienung von LARA keine Probleme stellen. Die Befehle sind entsprechend zu denen von DDT aufgebaut, jedoch stellt LARA viel mehr Befehle zur Verfègung. Das Besondere an LARA ist jedoch, da~ es selbst in der 2. Spei cherbank des CPC 6128 liegt. Selbstversténdlich léuft LARA auch auf einem CPC 464 oder 664 mit einer Speichererweiterung von Dk'tronics. Tatséchlich habe ich dieses Programm auf einem CPC 464 entwickelt. Dadurch da~ LARA in der 2. Speicherbank liegt, haben Sie zwei gro~e Vorteile: Sie kùnnen einmal die normale erste Speicherbank ganz mit Maschi nenprogrammen belegen, um sie zu untersuchen. Dadurch ist es mùglich, mit LARA so zu arbeiten, als ob Sie einen Debugger in einem Rom hétten. Sie kùnnen das gesamte Ram benètzen; eine Ausnahme bilden nur die 23 Bytes von &BAE9-&BAFF, die von einem kleinen Bankmanager belegt werden. Dieser Speicherbereich ist ein normalerweise unbenutzter Bereich im Betriebssystemram. Es dèrfte hier also bei den allerwenigsten untersuchten Programmen Probleme geben. Au~er diesen wenigen Bytes benùtigt LARA nichts mehr von der Rambank 0. Wenn fèr Betriebssystemzugriffe Buffer im Ram benùtigt wird, z.B. fèr Kassettenroutinen, wird dazu der Bereich ab A000 benutzt. Dessen Inhalt wird aber zuvor in den 2. 64K abgespeichert und nach Ausfèhrung der Betriebssystemroutinen restauriert. Und noch ein zweiter wichtiger Vorteil: bei der Untersuchung und dem Austesten von Maschinenprogrammen kommt es héufiger vor, da~ der Computer abstèrzt, also da~ die Einschaltmeldung auftaucht. Dabei wird die 2. Speicherbank NICHT gelùscht. Sie kùnnen nach einem Reset LARA mit OUT&7F00,&C1:CALL&C000 sofort wieder starten. Fèr alle spéteren Starts ist die Voraussetzung, da~ im obersten 16K Block der 2. 64K nichts veréndert wurde! Es ist sogar mùglich, den kompletten Inhalt der ersten Speicherbank mit Ausnahme des Bildschirms in der zweiten Bank abzuspeichern und ihn nach einem eventuellen Absturz und Neustart von Lara wiederzuholen. LARA stellt einen eingebauten Editor zur Verfègung. So kùnnen Sie mit LARA vùllig unabhéngig von Basic arbeiten. Sie kùnnen von LARA aus Programme lesen und schreiben, von Diskette Sektoren lesen und schreiben, RSX-Befehle aufrufen und vieles mehr. WICHTIG: Wenn Sie einen falschen Befehl eingegeben haben, Sie einen an deren Bedienungsfehler gemacht haben oder wenn ein Ausfèhrungs fehler Ihres Befehles auftrat (z.B. Abbruch eines Disketten kommandos mit <C>ancel), gibt LARA eine Fehlermeldung aus, bricht die Befehlsausfèhrung ab und erwartet eine neue Eingabe. Bei der Ausgabe von Zeichen an den Drucker versucht LARA solange sein Glèck, bis der Drucker die Zeichen erfolgreich empfangen hat. Da LARA vor jedem Einschalten des Druckers durch CTRL-P oder den N Befehl testet, ob er auch wirklich ON LINE ist, sollte der Drucker die Zeichen nach einer gewissen Zeit auch annehmen. Falls Sie den Drucker aber wéhrend des Druckens ausschalten kann dies aber zu einer Endlosschleife fèhren. Wenn LARA also eine léngere Pause macht, ist es nicht etwa abgestèrzt, sondern wartet auf den Drucker. Dieses kùnnen sie aber durch Drècken von ESC beenden. LARA gibt dann aus, da~ der Drucker OFF LINE ist, schaltet den Drucker ab und geht in den Editiermodus. Start von LARA: LARA besteht aus zwei Programmteilen: LARA.BAS und LARA.BIN. LARA.BAS ist der Lader fèr LARA.BIN; mit ihm wird LARA gestartet. Dabei mu~ aber der Computer im Einschaltzustand sein. Wenn Sie schon ein Programm im Speicher haben, kùnnen Sie LARA.BIN auch direkt starten. Dabei bleiben das vorherige Programm und Basicvariablen und -systemvariablen erhalten. Allerdings wird der Speicherbereich von &8000 bis &A000 èberschrieben. ***************************************************************** * * * EDITOR * * * ***************************************************************** Der Editor ist darauf angelegt, da~ Sie Ihre Befehle schnell eingeben kùnnen. Nach dem Start schaltet LARA auf Bildschirmmode 2 um, wobei der Bildschirm gelùscht wird. Dies geschieht nicht, falls vorher schon Mode 2 eingeschaltet war. Der alte Bildschirminhalt bleibt dann erhalten. Der Editor meldet sich dann mit einem Bindestrich. Dahinter zeigt der Cursor an, da~ Sie Ihre Befehle eingeben kùnnen. LARA akzeptiert grundsétzlich nur Zahleneingaben in Hexadezimal darstellung ohne Typkennzeichen (z.B. DA000,A500). Eine Eingabezeile kann bis zu 70 Zeichen lang sein. Zu Beginn jeder Eingabe wird automatisch der CAPS LOCK Zustand eingeschaltet, Sie kùnnen also gleich Gro~buchstaben eingeben. Wenn Sie aber Kleinbuchstaben eingeben wollen, die LARA natèrlich bei allen Befehlen auch akzeptiert, drècken Sie einfach die CAPS LOCK Taste. Zur Eingabe kùnnen Sie wie in Basic den COPY-Cursor benutzen. Neben den geschifteten Cursortasten und der COPY-Taste haben noch folgende Tasten(kombinationen) eine besondere Bedeutung: ENTER beendet die Eingabe und beginnt deren Interpretierung. ESC bricht die Eingabe ab, ohne da~ das bisher eingegebene interpretiert wird, und erwartet eine neue Eingabe. DEL lùscht das letzte eingegebene Zeichen. Wenn der Drucker angeschaltet ist, wird der Druck kopf ein Zeichen zurèckgefèhrt. Das néchste Zeichen wird dann èber dem vorigen gedruckt. CTRL-X lùscht die ganze bisher eingegebene Zeile. CTRL-R wiederholt die vorherige Editierzeile. Die letzte Zeile wird wieder angezeigt und der Cursor steht hinter dem letzten Zeichen. Nun kann die Zeile durch ENTER abgeschlossen oder erweitert werden. Diese Funktion arbeitet nur, wenn vor CTRL-R noch nichts anderes eingegeben wurde. CTRL-P Durch Drècken von <CTRL-P> wird der Drucker angeschaltet. Ist der Drucker ausgeschaltet oder nicht empfangsbereit, gibt LARA ein Feh lerzeichen aus und ignoriert den Befehl. Sobald der Drucker angeschaltet ist, wird alles, das auf dem Schirm ausgegeben wird, auch auf dem Drucker ausgedruckt. Ein zweites <CTRL-P> schaltet den Drucker wieder ab. Auf diese Methode kann der Drucker èbrigens immer ein- und ausgeschaltet werden, wenn der Cursor da ist und Sie zur Eingabe auffordert, so z.B. auch, wenn Sie eine Ausgabe angehalten haben und mit einem Tastendruck fortsetzen sollen. SHIFT-CTRL-COPY gibt eine Bildschirmhardcopy auf den Drucker aus im Textmodus aus, es werden also nur gèltige Asciizeichen im Bereich 32-126 ausgegeben. Der Ausdruck arbeitet in allen Schirmmodi. Abbrechen der Hardcopy ist mit ESC mùglich. Mit SHIFT-CTRL-COPY kann immer eine Hardcopy ausgegeben werden, wenn der Cursor da ist und Sie zur Eingabe auffordert, so z.B. auch, wenn Sie eine Ausgabe angehalten haben und mit einem Tastendruck fortsetzen sollen. Wenn Sie schon eine relativ lange Zeile eingegeben haben und dann bemerken, da~ Sie am Anfang einen Fehler gemacht haben, ist es unpraktisch, nochmal alles mit CTRL-X zu lùschen. Es ist dann vorteilhafter, mit ESC die Bearbeitung abzubrechen, eine neue Eingabe zu beginnen und mit dem Copycursor die verwertbaren Teile der alten Zeile zu èbernehmen. ***************************************************************** * * * ARBEITSBEFEHLE * * * ***************************************************************** KURZFORM: Die Klammern <> bedeuten, der eingeschlossene Teil ist optional. ? Gibt kurze Beschreibung der Befehle B<base> (Base) Bildschirmanfang setzen C<drive> (Cat) Catalog CR<filespec><,ladeadresse> (Read) COM-File in Speicher laden CW<filespec>,anfang,laenge (Write) COM-File abspeichern D<anfang><,ende> (Dump) Speicherbereich ausdumpen E (End) LARA beenden Fanfang,ende,byte (Fill) Speicherbereich fèllen G<start><,brk1><,brk2> (Go) Maschinencode ausfèhren Hsum1,sum2 (HexComp) Hexadezimalzahlen berechnen. H.byte Hexadezimalzahlen in Ascii-, Dezimal- und Binérformat darstellen H:dezimalzahl Dezimalzahlen im Hexadezimalformat darstellen I (Init screen) Bildschirmausgabe initialisieren. K<confbyte> (Configuraton) Ram-/Romkonfiguration setzen/zeigen L<anfang><,ende> (List) disassemblieren Manfang,ende,ziel (Move) Speicherbereich verschieben N (No Screen) leitet Bildschirmausgabe auf Drucker um O<offset> (Offset) Offset setzen/zeigen Padresse,text (Put text) Zeichenkette eingeben Q<anfang>,<ende>,byte1<,byte2><,byten> (Quest) Bytefolge im Speicher suchen QT<s>,<f>,text String im Speicher suchen R<filespec><,ladeadresse> (Read) File in Speicher laden Sadresse (Store) Speicherinhalt anzeigen/veréndern T<schrittzahl> (Trace) Einzelschrittabarbeitung mit Registeranzeige U<schrittzahl> (Untrace) Einzelschrittabarbeitung ohne Registeranzeige W<filespec>,anfang,laenge<,autostart><,typ> (Write) File abspeichern X<register> Prozessorzustand zeigen YP (YPut) 1. Speicherbank in 2. kopieren YG (YGet) 2. Speicherbank in 1. kopieren YR,buffer,track,sector (YRead) Sektor von Diskette lesen YW,buffer,track,sector (YWrite) Sektor auf Diskette schreiben Z<A><adresse> Unterprogramm ab adresse aufrufen Irsxcommand<,string1><,string2> RSX-Befehl ausfèhren **************************************************************** * * * ARBEITSBEFEHLE ausfèhrlich * * * **************************************************************** Die einzelnen Buchstaben bei den Befehlen stehen fèr Hexadezimal zahlen. Die Klammern <> bedeuten, der eingeschlossene Teil ist optional. ? Gibt kurze Beschreibung der Befehle Beispiel: ? Dieser Befehl gibt eine kurze Beschreibung der Befehle von LARA und ihrer Syntax aus. Die in eckige Klammern <> eingeschlossene Teile (meistens Adressen) sind optional, werden sie weggelassen, setzt LARA Defaultwerte ein. B<base> (Base) Bildschirmanfang setzen Beispiel: BL Mit diesem Befehl kùnnen Sie schnell den Bildschirmspeicher ver lagern. Im CPC ist ein Bildschirmspeicher von &4000-&7FFF oder von &C000-&FFFF mùglich. Normalerweise liegt er ab &C000. Mit Eingabe von BL (base low) setzen sie den Bildschirmspeicher an die erste Adresse, mit BH (base high) and die zweite. Geben Sie nur B ein, wird nur der momentane Bildschirmanfang ausgegeben. Beim Wechsel des Bildschirmspeichers bleibt der Schirminhalt erhalten. Ein anderer Bildschirmspeicher ist recht praktisch, wenn Sie z.B. ein Maschinenprogramm untersuchen mùchten, das normalerweise den Bildschirmspeicher belegt. Sie verlegen dann den Bildschirm speicher nach &4000 und laden das Programm an seine Adresse. Sie kùnnen es nun auch tracen, ohne da~ die Ausgabe der Registerin halte den Code èberschreibt. C<drive> (Cat) Catalog Beispiel: CB Dieser Befehl entspricht dem Basicbefehl CAT. Es wird ein In haltsverzeichnis der aktuellen Diskette oder Kassette ausgegeben. Bei Kassettenbetrieb mèssen sie den Catalog durch ESC abbrechen. Bei Diskettenbetrieb kùnnen sie auch CA oder CB eingeben. Dann wird der Katalog von Laufwerk A oder B ausgegeben. Beim CPC 464 ohne Diskettenlaufwerk bewirkt CA oder CB eine Fehlermeldung. CR<filespec><,ladeadresse> (Read) COM-File in Speicher laden Beispiel: CRED.COM,C000 Mit diesem Befehl kùnnen Sie ein COM-File filespec an die Adresse s laden. Falls Sie filespec nicht angeben, macht das bei Kassettenbetrieb nichts aus und es wird das néchste gefundene File geladen, bei Diskettenbetrieb erhalten Sie jedoch von Amsdos ein Bad command und zusétzlich noch von LARA eine Fehlermeldung. Falls Sie die Ladeadresse s nicht angeben, wird das File an die CP/M Standartadresse 100H geladen. Nach dem Laden gibt LARA Anfangsadresse und Lénge des Files aus. BUG: Beim Laden dèrfen keine Floppyfehlermeldungen auftauchen, da durch diese LARA èberschrieben wird. Also: nach .. disc missing etc. stèrzt LARA hùchstwahrscheinlich ab. Es lohnt sich also, auf eine korrekt eingelegte Diskette zu achten. CW<filespec>,s,l (Write) COM-File abspeichern Beispiel: WTEST.COM,100,3FFF Mit diesem Befehl kùnnen Sie ein COM-File filespec ab der Adresse s mit Lénge l abspeichern. Falls Sie filespec nicht angeben, macht das bei Kassettenbetrieb nichts aus, bei Diskettenbetrieb erhalten Sie jedoch von Amsdos ein Bad command und von LARA eine Fehlermeldung. BUG: Beim Speichern dèrfen keine Floppyfehlermeldungen auftauchen, da durch diese LARA èberschrieben wird. Also: nach .. disc missing etc. stèrzt LARA hùchstwahrscheinlich ab. Es lohnt sich also, auf eine korrekt eingelegte Diskette mit genègend Speicherplatz zu achten. D<s><,f> (Dump) Speicherbereich ausdumpen Beispiel: D,A6FF Dieser Befehl gibt den Speicherinhalt von s bis f aus. Dabei steht links die Speicheradresse in 16er-Schritten, in der Mitte der Speicherinhalt als Hexbytes und rechts der Speicherinhalt als Asciizeichen. Zur Ausgabe im Asciiteil wird zuerst bei allen Zeichen das hùchte Bit gelùscht und dann, falls sich ein Ascii codes <32 ergibt, nur ein Punkt (.) dargestellt. Ist s eine "ungerade" Adresse, beginnt die Darstellung entsprechend weiter rechts. Geben Sie keine Startadresse s an, beginnt das Dumpen an der Adresse, auf die ein interner Merker zeigt. Normalerweise ist dies die Adresse, vor der das letzte Dumpen stoppte. Wenn aber der Prozessorzustand ausgegeben wurde (durch das T,G oder X Kommando), enthélt dieser Merker den PC. So kùnnen sie gleich nachschauen, was die néchsten Traces machen werden. Geben Sie keine Endadresse an, werden 11 Zeilen ausgegeben. Sie kùnnen das Dumpen jederzeit durch Drècken der Leertaste anhalten und durch einen beliebigen zweiten Tastendruck fort setzen. Beim Warten auf den zweiten Tastendruck wird der Cursor angezeigt. Das bedeutet, Sie kùnnen jetzt auch mit CTRL-P den Drucker an- oder ausschalten. CTRL-P gilt nicht als zweiter Tastendruck, beendet also nicht die Unterbrechung. Auch kùnnen Sie jetzt mit SHIFT-CTRL-COPY eine Hardcopy ausgegeben. Abbruch der Hardcopy ist mit ESC mùglich. E LARA beenden Beispiel: E Dieser Befehl beendet den Ablauf von LARA und gibt die Steuerung an Basic zurèck. LARA belegt am Schlu~ noch die Taste SHIFT-f9 mit OUT&7F00,&C1:CALL&C000. Sie mèssen dann nur noch SHIFT-f9 drècken, um LARA wieder zu starten. Falls Sie auf die brutale Art von LARA ausgestiegen sind, sei es durch SHIFT/CTRL/ESC oder Absturz eines MC-Programms, mèssen sie die beiden Befehl von Hand eingeben. Dabei ist wichtig, da~ Sie sie in einer Zeile eingeben, da sonst nach Abarbeitung des ersten Befehls Basic mit seiner Readymeldung LARA èberschreiben wèrde, da es durch den OUT-Befehl ja in den normalen Speicher eingeblendet wurde. Ein éhnliches Problem tritt auf, wenn der Computer resetiert wird, wenn der Prozessor einen Befehl von LARA innerhalb der zweiten Speicherbank abarbeit. Beim CPC 464/664 ist dann beim Reset noch das oberste Viertel der dk'tronic-Ramerweiterung in den Adressraum eingeblendet und ihr Inhalt wird anstelle des Schirmrams gelùscht. Dabei wird dann LARA gelùscht und kann nicht wieder gestartet werden. Sie mèssen zudem noch den Computer aus- und wieder anschalten oder blind OUT&7F00,&C0 eingeben, um wieder die richige Speicherkonfiguration einzuschalten. Dies tritt jedoch nur selten auf, da der Lùwenanteil der Abar beitungszeit von LARA fèr Betriebssystemaufrufe benùtigt wird, bei denen die normale Speicherbank eingeschaltet wird. Fs,f,b (Fill) Speicherbereich fèllen Beispiel: FA000,A6FF,E5 Test: D9FFF,A700 Dieser Befehl fèllt den (Ram) Speicherbereich von Anfang s bis Ende f mit Fèllbyte b. b mu~ dabei ein Einbytewert sein. G<s><,b1><,b2> (Go) Maschinencode ausfèhren Beispiel: GA000,A020,0 Dieser Befehl fèhrt eine Maschinenroutine ab Startadresse s mit Unterbrechungspunkten(Breakpoints) b1 und b2 aus. Dabei erfolgt der Aufruf der Routine durch einen FAR CALL. Somit kùnnen Sie auch Routinen im Rom aufrufen. Die Rom/Ramkonfiguration ist dabei diejenige, die durch den letzten K-Befehl (siehe dort) gesetzt wurde. Diese Maschinenroutine wird abgebrochen, sobald der Pro zessor auf einen Unterbrechungspunkt trifft. LARA hinterlé~t bei Aufruf der Adresse auch eine Rècksprungdresse auf dem Stack, so da~ ein RETbefehl ebenfalls zu LARA zurèckfèhrt. Die Methode mit den Unterbrechungspunkten funktioniert nur bei Code im Ram. LARA gibt danach den Prozessorzustand (siehe Befehl X) aus. Ein Unterbrechungspunkt mu~ auf dem ersten Byte eines Z80-Befehls sein. LARA setzt dort dann einen RST 10H ein und veréndert das Ziel des RST so, da~ es zu LARA zurèckfèhrt. Nach Abarbeitung des Befehls G wird das ursprèngliche Ziel des RST 10H wieder herge stellt. Seien Sie aber vorsichtig, da~ Sie Ihre Unterbrechungspunkte richtig setzen. Der Programmablauf eines Maschinenprogramms ver zweigt sich normalerweise recht oft, und gemé~ den Murphy'schen Gesetzen immer dorthin, wo kein Breakpoint steht. Wenn Sie ein Programm in gro~en Schritten abarbeiten lassen und immer auf den jeweils néchsten Sprungbefehl einen Unterbrechungspunkt setzen, kùnnen Sie relativ gefahrlos ein Programm untersuchen. Wenn Sie ganz sicher gehen wollen, mèssen Sie dann aber tracen (siehe T Befehl). Ha,b (HexComp) Hexadezimalzahlen berechnen. Beispiel: HFFFF,1 H.a Hexadezimalzahlen in Ascii-, Dezimal- und Binérformat darstellen Beispiel: H.3F H:d Dezimalzahlen im Hexadezimalformat darstellen Beispiel: H.65535 Sicher geht es Ihnen wie mir, da~ Sie Summe und Differenz zweier Hexadezimalzahlen nicht im Kopf ausrechnen kùnnen. Aber dafèr gibt es den H Befehl. Er gibt Ihnen die Summe und die Differenz der beiden Hexadezimalzahlen aus, jeweils wieder in Hexadezimal darstellung. Zu dem H Befehl gibt es noch zwei Abwandlungen. Wenn Sie direkt hinter dem H einen Punkt eingeben, wird die eingegebene Hexzahl in Ascii-, Dezimal- und Binérdarstellung ausgegeben. Dabei ist zu beachten, da~ bei der Asciidarstellung immer das untere Byte der eingegebenen Zahl benutzt wird. Wenn dieses Lowbyte kleiner als 32 ist, wird vor dem Zeichen der Pfeil hoch (^) ausgegeben und danach erste das eigentliche Asciizeichen, zu dem noch 64 addiert wird. Wenn Sie z.B. H.F03 eingeben, wird als Asciizeichen ^C ausgegeben. Die Dezimalzahl wird als unsigned Integer ausgegeben, d.h. bei H.FFFF ist das Ergebnis 65535 und NICHT -1 . Die zweite Abwandlung ist, da~ sie hinter dem H einen Doppelpunkt eingeben. Dahinter kùnnen sie dann eine Dezimalzahl eingeben, die ins Hexadezimalformat umgewandelt wird. Dabei kùnnen Sie entweder eine Dezimalzahl eingeben zwischen 0 und 65535, die eine Hexade zimalzahl zwischen 0000 und FFFF ergibt, oder eine Dezimalzahl zwischen minus 32768 und minus 1, die eine Hexadezimalzahl zwischen 8000 und FFFF ergibt. Ein ]berlauf ergibt eine Fehlermeldung. I (Init screen) Bildschirmausgabe initialisieren. Wenn Sie aus irgendwelchen Grènden èberhaupt nichts mehr auf dem Bildschirm erkennen kùnnen, vielleicht weil ein gerade ausgefèhr tes Programm die Stiftfarbe auf die Hintergrundfarbe setzte, geben Sie einfach blind I und danach ENTER ein. Der Schirm wird gelùscht, auf Mode 2 gesetzt und die Farben wie nach dem Ein schalten gesetzt. Dieser Befehl empfielt sich auch, wenn Sie nur den Bildschirm lùschen wollen. K<c> (Configuraton) Ram-/Romkonfiguration setzen/zeigen Beispiel: K7 Dieser Befehl setzt ein neues Konfigurationsbyte und gibt sowohl altes als auch neues aus. Falls Sie nur K eingeben, wird nur das alte ausgeben und nicht veréndert. Das Konfigurationsbyte wirkt sich auf die Befehle D,L,Q,M und G aus. Der Schneider CPC hat bekanntlich mindestens 64K Ram und 32K Rom. Da der Z80 nur 64K adressieren kann, wird immer nur ein Teil des Gesamtspeichers in den Adressraum eingeblendet. LARA benutzt daher ein Konfigurationsbyte, um zu entscheiden, aus welchem Speicherbereich gelesen wird. Dieses Konfigurationsbyte ent spricht dabei dem, das das Betriebssystem nach einem FAR CALL verlangt. Schlie~lich tétigt LARA seine Lesezugriffe und Codeauf rufe durch FAR CALLs. Das Konfigurationsbyte wird folgenderma~en interpretiert: 00-FB das jeweilige Rom dieser Nummer im Bereich von C000 bis FFFF selektieren und einschalten. Das untere Rom bleibt ausgeschaltet. Die 7 wéhlt das Floppyrom. FC Oberes und unteres Rom sind angeschaltet. FD Oberes Rom an, unteres aus FE Oberes Rom aus, unteres an FF Im ganzen Adressraum ist das Ram (1. 64K) eingeschaltet. Bei den Codes FC-FE wird von C000 bis FFFF das Zusatzrom einge blendet, das beim letzten Aufruf von KL ROM SELECT als oberes Rom ausgewéhlt wurde. Dies ist normalerweise das Basicrom(0). Nach Start von LARA ist das Konfigurationsbyte FF. L<s><,f> (List) disassemblieren Beispiel: L,BAFF Dieser Befehl gibt einen Speicherbereich in Z80 Mnemoniks aus. Dabei steht ganz links die Speicheradresse, danach kommen der Maschinencode in Hexadezimaldarstellung und die Mnemoniks. Geben Sie keine Startadresse s an, beginnt das Disassemblieren an der Adresse, auf die ein interner Merker zeigt. Normalerweise ist dies die Adresse, vor der das letzte Disassemblieren stoppte. Wenn aber der Prozessorzustand ausgegeben wurde (durch das T,G oder X Kommando), enthélt dieser Merker den PC. So kùnnen sie gleich nachschauen, was die néchsten Traces machen werden. Geben Sie keine Endadresse f an, werden nur 11 Zeilen ausgegeben. Sie kùnnen das Disassemblieren jederzeit durch Drècken der Leer taste anhalten und durch einen beliebigen zweiten Tastendruck fortsetzen. Beim Warten auf den zweiten Tastendruck wird der Cursor angezeigt. Das bedeutet, Sie kùnnen jetzt auch mit CTRL-P den Drucker an- oder ausschalten. CTRL-P gilt nicht als zweiter Tastendruck, beendet also nicht die Unterbrechung. Auch kùnnen Sie jetzt mit SHIFT-CTRL-COPY eine Hardcopy ausgegeben. Abbruch der Hardcopy ist mit ESC mùglich. Wird ein unzuléssiger OP-Code gefunden, gibt LARA '??=' aus und und versucht es ein Byte weiter nochmal. LARA erkennt keine undokumentierte Z80 Codes. Es gibt aber deutliche Anzeichen dafèr. Ein undokumentierte Code tritt auf, wenn vor dem '??=' ein DD oder FD steht und in dem nachfolgenden Befehl EINMAL H oder L (aber nur eines von beiden) auftaucht. Wenn also z.B. folgende Zeilen DD ??= 7D LD A,L FD ??= AC XOR H ausgegeben werden, bedeutet das, da~ A mit dem Lowbyte von IX geladen wird und dann mit dem Highbyte von IY XOR verknèpft wird. Ms,f,d (Move) Speicherbereich verschieben Beispiel: MA000,A020,9FFF Dieser Befehl kopiert den Speicherinhalt von s bis f ans Ziel d. Dabei wird intelligentes Kopieren angewandt. Intelligent hei~t, da~ das ganze auch funktioniert, wenn sich Quellbereich und Zielbereich èberlappen (wie im Beispiel). Der Quellbereich ist dabei in der durch den K Befehl gewéhlten Speicherkonfiguration. Wenn das obere Rom dadurch angeschaltet ist, kùnnen Sie mit MC000,FFFF,C000 das Rom ins Ram kopieren. N (No Screen) Bildschirmausgabe auf Drucker umleiten Durch diesen Befehl werden alle Bildschirmausgaben auf den Druc ker umgelenkt, so da~ Sie ein Maschinenprogramm vùllig ungestùrt von den Bildschirmmeldungen LARAs untersuchen kùnnen. Ist der Drucker nicht ON LINE, kommt eine Fehlermeldung und der Befehl wird ignoriert. Ein zweites N schaltet den Bildschirm wieder an. O<a> (Offset) Offset setzen/zeigen Beispiel: 04000 Durch diesen Befehl kùnnen Sie einen Offset setzen. Geben Sie nur O ein, wird nur der alte Offset ausgegeben. Der Offset ist eine Distanz, die zu allen Adressenausgaben bei den Befehlen D,L,Q und S addiert wird. Dies wird nùtig, wenn Sie ein Programm nicht an seine wirkliche Adresse laden kùnnen. Beispiel: Sie haben ein Programm, das fèr den Speicherbereich ab 8000 vorgesehen ist, nach 4000 geladen. Geben Sie dann O4000 ein und Sie kùnnen dann mit L8000 das Programm so disassemblieren, wie wenn es tatséchlich ab 8000 im Speicher wére. Der Offset berechnet sich als LADEADRESSE minus WIRKLICHE ADRESSE. Benutzen Sie fèr diese Berechnung am besten den H Befehl, der Offset ist der zweite ausgegebene Wert. Da Sie mit LARA auch den Bildschirmspeicher verlegen kùnnen, empfiehlt sich der Offsetbefehl eigentlich nur, wenn ein Programm den RST-Bereich oder die Betriebssystemvektoren èberschreiben wèrde. Pa,s (Put text) Zeichenkette eingeben Beispiel: PA000,Dies ist ein Text Mit diesem Befehl wird der String s ab Adresse a im Ram abgelegt. Q<s>,<f>,b<,b2><,bn> (Quest) Bytefolge im Speicher suchen Beispiel: Q3E8,2700,21,00,C0 QT<s>,<f>,text String im Speicher suchen Beispiel: Q,,Wo ist dieser Text? Mit diesem Befehl kùnnen Sie im Speicherbereich von s bis f nach der Bytefolge b2...bn suchen. Wenn sie s oder f nicht angeben, wird dafèr standartmé~ig 0 bzw. FFFF genommen, also der ganze Speicher. Die Anzahl der Bytes ist nur durch die maximale Be fehlszeichenlénge des Editors begrenzt. LARA gibt dann alle Adressen aus, ab denen die Bytefolge gefunden wurde. Ein Fragezeichen im Textmodus oder ein 3F Byte im Hexmodus ist stellvertretend fèr ein beliebiges Zeichen (Wildcard), z.B. QT,,LA?A. Steht das Fragezeichen (bzw 3F) aber am Anfang des zu suchenden Strings (bzw. Bytefolge), wird es nicht als Wildcard verwendet. Sie kùnnen das Suchen jederzeit durch Drècken der Leertaste anhalten und durch einen beliebigen zweiten Tastendruck fort setzen. Beim Warten auf den zweiten Tastendruck wird der Cursor angezeigt. Das bedeutet, Sie kùnnen jetzt auch mit CTRL-P den Drucker an- oder ausschalten. CTRL-P gilt nicht als zweiter Tastendruck, beendet also nicht die Unterbrechung. Auch kùnnen Sie jetzt mit SHIFT-CTRL-COPY eine Hardcopy ausgegeben. Abbruch der Hardcopy ist mit ESC mùglich. Das obige Beispiel sucht von 3E8 bis 2700 nach dem Befehl LD HL,C000. Wenn Sie bei einem Spiel nach den Befehlen DEC (HL) oder DEC A mit Code 35 bzw 3D suchen, kùnnen Sie vielleicht einen Unsterblichkeitspoke finden! R<filespec><,s> (Read) File in Speicher laden Beispiel: RBEISPIEL.BAS,170 Mit diesem Befehl kùnnen Sie ein File filespec (kein Asciifile!) an die Adresse s laden. Falls Sie filespec nicht angeben, macht das bei Kassettenbetrieb nichts aus und es wird das néchste gefundene File geladen, bei Diskettenbetrieb erhalten Sie jedoch von Amsdos ein Bad command und zusétzlich noch von LARA eine Fehlermeldung. Falls Sie die Ladeadresse s nicht angeben, wird das File an die Adresse geladen, von der aus es geschrieben wurde. Bei Basicprogrammen ist dies normalerweise 0170. Nach dem Laden gibt LARA Typ, Anfangsadresse, Lénge und Auto startadresse des Programmes aus. Als Eingabepuffer verwendet LARA den Bildschirmspeicher,egal wo er gerade ist, um andere Informationen im Ram nicht zu èber schreiben (LARA ist ja schlie~lich nicht zur Bearbeitung von Bildern gedacht). Der Buffer wird jedoch sowieso nur bei Kasset tenbetrieb benùtigt; dann aber dèrfen Sie merkwèrdige Streifen auf dem Schirm nicht stùren. Sa (Store) Speicherinhalt anzeigen/veréndern Beispiel: SA000 Dieser Befehl entspricht PEEK/POKE in Basic. Links wird die Speicheradresse, rechts daneben ihr Inhalt in Ascii- und Hexadezimaldarstellung. Sie kùnnen jetzt durch Drècken von ENTER den alten Inhalt beibehalten oder ein neues Byte einge ben. Dabei kùnnen sie entweder ein Hexbyte oder einen Apostroph (') und dahinter ein Asciizeichen, dessen Wert dann im Speicher abgelegt wird (jedoch keine Kleinbuchstaben), eingeben. Die Ausgabe des Speicherinhalts erfolgt je nach Konfigurations byte aus Ram oder Rom, ein neues Byte wird aber natèrlich ins Ram geschrieben. Hier ist also Vorsicht geboten! Das ganze wird so lange wiederholt, bis Sie ESC drècken oder einen Punkt eingeben. T<s> (Trace) Einzelschrittabarbeitung mit Beispiel: T5 Registeranzeige Dieser Befehl dient dazu, ein Maschinenprogramm schrittweise abzuarbeiten. Dabei wird nach jeder Befehlsausfèhrung der Pro zessorzustand ausgeben. Das Tracen beginnt bei dem Wert, der in PC enthalten ist (Sie kùnnen ihn mit dem X-Kommando veréndern). Geben Sie keinen Parameter s an, wird nur ein Befehl ausgefèhrt, sonst s Befehle. Ist s=0, wird ewig getraced. Sie kùnnen das Tracen jederzeit durch Drècken der Leertaste anhalten und durch einen beliebigen zweiten Tastendruck fort setzen. Beim Warten auf den zweiten Tastendruck wird der Cursor angezeigt. Das bedeutet, Sie kùnnen jetzt auch mit CTRL-P den Drucker an- oder ausschalten. CTRL-P gilt nicht als zweiter Tastendruck, beendet also nicht die Unterbrechung. Auch kùnnen Sie jetzt mit SHIFT-CTRL-COPY eine Hardcopy ausgegeben. Abbruch der Hardcopy ist mit ESC mùglich. Das Tracen funktioniert NUR bei Code, der im Ram ist. Achten Sie also darauf, da~ Konfiguration FF gesetzt ist (siehe K Befehl)! Die einzelnen Befehle werden vom Prozessor in Echtzeit abgearbei tet und nicht simuliert, bei Zugriffen auf die Zweitregister kann es also zum Absturz kommen. Die RSTbefehlserweiterungen des CPC werden von LARA korrekt verarbeitet. Ein Betriebssystemauf wird wie ein einzelner Z80-Befehl behandelt und in Echtzeit abgearbeitet. Meiner Erfahrung nach ist es aber effizienter und schneller als das Tracen, ein Programm zuerst zu disassemblieren und dann abschnittweise mit Unterbrechungspunkten auf Verzweigungen (Sprungbefehlen) abarbeiten zu lassen (siehe G Befehl). U<s> (Untrace) Einzelschrittabarbeitung ohne Beispiel: U0 Registeranzeige Dieser Befehl bewirkt genau das gleiche wie der T Befehl, mit dem Unterschied, da~ LARA den Prozessorzustand nicht ausgibt und somit keine Bildschirmausgaben macht. Dadurch kùnnen Sie auch die Bildschirmausgabe eines Programms untersuchen. Sie mèssen aber beachten, da~ ein Programm in Echtzeitausfèhrung ein paar tausend Mal schneller abléuft, als wenn es durch den U Befehl ausgefèhrt wird. Es ist aber auch sehr interessant aus, wenn man sehen kann, wie ein Spiel seine Sprites pixelweise aufbaut. W<filespec>,s,l<,e><,t> (Write) File abspeichern Beispiel: WTEST.BAS,170,200,,0 Mit diesem Befehl kùnnen Sie ein File filespec (kein Asciifile!) ab der Adresse s mit Lénge l, Autostartadresse e und Filetyp t abspeichern. Falls Sie filespec nicht angeben, macht das bei Kassettenbetrieb nichts aus, bei Diskettenbetrieb erhalten Sie jedoch von Amsdos ein Bad command und von LARA eine Fehlermeldung. Die Autostartadresse e mu~ nicht angegeben werden. Falls Sie keinen Filetyp t angeben, wird das File mit Filetyp 2 (binér) abgespeichert. Bei Basicprogrammen mèssen Sie Adresse 170 und Filetyp 0 (bzw. 1 fèr Basic protected) angeben. Mit dem R und W Befehl ist es auch mùglich, ein Basicprogramm zu entschètzen. Sie laden es einfach mit R in den Speicher und speichern es mit W, wobei Sie die durch R ausgegebenen Adressen benètzen mèssen, wieder ab. Sie mèssen dabei aber den Filetyp 0 (ungeschètzt) angeben. Als Ausgabepuffer verwendet LARA den Bildschirmspeicher,egal wo er gerade ist, um andere Informationen im Ram nicht zu èber schreiben (LARA ist ja schlie~lich nicht zur Bearbeitung von Bildern gedacht). Der Buffer wird jedoch sowieso nur bei Kasset tenbetrieb benùtigt; dann aber dèrfen Sie merkwèrdige Streifen auf dem Schirm nicht stùren. Dadurch, da~ Sie beim Speichern auch noch einen Filetyp angeben kùnnen, bieten sich noch einige interessante Mùglichkeiten. So kùnnen Sie durch Anwendung eines ausgefallenen Filetyps einen gewissen Kopierschutz realisieren. Eine andere Mùglichkeit besteht darin, da~ Sie Basic und Maschinencode in EINEM File abspeichern kùnnen. Sie laden dazu (natèrlich von LARA aus) den Maschinencode ans Ende des Basicpro grammes. Dieses mèssen Sie durch den D Befehl selbst herausfin den, das Ende ist erreicht, wenn nur noch Nullbytes auftauchen. Dann speichern Sie das ganze einfach mit dem W Befehl ab: Anfang ist 0170, Lénge ist Lénge Basicprogramm plus Lénge Mc, die Auto startadresse braucht nicht angegeben werden und der Filetyp ist 0, oder 1, wenn Sie es als geschètztes Basicprogramm abspeichern wollen. Bei jedem Laden des Basicprogrammes ist der Maschinenteil sofort vorhanden, und zwar ohne Nachladen oder EinPOKEN. X<r> Prozessorzustand zeigen Beispiel: XX Dieser Befehl dient dazu, den Prozessorzustand, der bei den G, T und U Befehlen verwendet wird, anzuzeigen oder zu veréndern. Nach dem Start von LARA haben die Register die Werte, die sie auch nach Ausfèhrung von MC START PROGRAM enthalten. Einige Maschinenprogramme verlangen vor ihrem Start eine definierte Registerbelegung. Der Stackpointer zeigt auf einen Bereich, wo Platz fèr einen Stack zur Verfègung steht. Der néchste RET fèhrt dabei wieder zu LARA zurèck; sie kùnnen also eine Routine, die mit einem Return beendet wird, direkt aufrufen. Dies gilt fèr fast alle Betriebs systemroutinen.Der Befehlszéhler PC zeigt zuerst auf 000F. Dort steht ein RET, soda~ eine Eingabe des G Befehls ohne Argumente ohne schédliche Auswirkungen bleibt. Geben Sie nur X ein, wird der Inhalt der Z80 Register, die Flags, der Inhalt der Bytes, auf die der Stackpointer zeigt, und der Befehl, auf den der Befehlszéhler (PC) zeigt und der beim néchsten G,T oder U Befehl ausgefèhrt wird, gezeigt. Beim Ausgeben der Flags wird entweder dessen Name oder ein Strich ausgegeben. Der Name bedeutet, da~ das Flag gesetzt ist, der Strich, da~ das Flag 0 its. Sie kùnnen aber auch hinter dem X noch einen zweiten Buchstaben eingeben, der ein Z80 Doppelregister bezeichnet. Es besteht allerdings keine Mùglichkeit, auf den zweiten Registersatz des Z80 zuzugreifen, da dieser vom Betriebssystem reserviert ist. Folgende Buchstaben stehen fèr die entsprechenden Doppelregister: A fèr AF, ein 16 Bit Wort aus Akku und Flaggen, A ist Highbyte B fèr das Registerpaar BC D fèr das Registerpaar DE H fèr das Registerpaar HL X fèr das Registerpaar IX Y fèr das Registerpaar IX S fèr den Stackpointer SP P fèr den Befehlszéhler PC I fèr IR, ein 16 Bit Wort aus Interuptregister und Memoryrefreshregister, dabei ist I Highbyte Nach Eingabe von z.B. XH wird der alte Inhalt des HL Doppelre gisters ausgegeben. Sie kùnnen nun entweder einen neuen Inhalt eingeben oder nur durch Drècken von ENTER den alten beibehalten. Die Verénderung der Flags ist nur èber die komplette Verénderung des Flagregisters mùglich. Die Flags haben folgende Stellung innerhalb des Register: Bit 7 6 5 4 3 2 1 0 ----------------------------------------------- Flag S Z - H - P/V N C ----------------------------------------------- true M Z PO C ----------------------------------------------- false P NZ PE NC Die Abkèrzungen in der Zeile Flag haben folgende Bedeutung: S Sign (Vorzeichenflag) Z Zero (Nullflag) H Halbèbertrag (nur fèr den DAA Befehl von Bedeutung) P/V Paritéts/]berlaufflag N Additions/Subtraktionsflag, N=1 wenn letzte Operation eine Subtraktion war C Carryflag (]bertragsflag) Wenn ein Flag gesetzt ist (=1), wird der bedingter Sprungbefehl, dessen Bedingung in der 'true' Spalte steht, z.B. CALL PO, ausge fèhrt; wenn das Flag 0 ist, wird der Sprungbefehl mit der Be dingung in der 'false' Spalte ausgefèhrt, z.B. JP NC. YG (YGet) Speicher holen YP (YPut) Speicher sichern Beispiel: YP YP kopiert den kompletten Speicher mit Ausnahme der 16K Bildschirmspeicher in die zweite Speicherbank. Lassen Sie diesen Befehl ab und zu ausfèhren, denn nach einem etwaigen Absturz kùnnen Sie sich dann mit YG das in der zweiten Speicherbank hoffentlich (falls Sie den Computer inzwischen noch ausgeschaltet haben) noch vorhandene Backup wiederholen. Sie kùnnen ja Lara jederzeit wieder neu starten! Da das komplette Betriebssystemram gesichert wird, kùnnen werden dabei auch Voreinstellungen wie Farben, Blinkzeiten oder Laufwerkzustand des Floppymotors restauriert. Da der Bildschirm beibehalten wird, sort Lara dafèr, da~ auch Modus und Cursorposition beibehalten wird. Falls jedoch zum Zeitpunkt des letzten YP ein anderer Modus war, wird der Schirm gelùscht, damit das Betriebssystem mit der Schirmdarstellung nicht durcheinanderkommt. Der Grund dafèr, da~ der Schirm nicht gesichert wird, liegt èbrigens darin, da~ in der zweiten Speicherbank ja 16K fèr Lara reserviert sind, fèr den Schirm bleibt also kein Platz mehr. YP funktioniert nur, wenn der Bildschirmspeicher bei &C000 liegt. Verwenden Sie YG wenn er ab &4000 liegt, liegt er nach Ausfèhrung des Befehls wieder bei &C000. Bei der Verwendung von YP/YG erscheinen fèr kurze Zeit merkwèrdige Punktmuster auf dem Schirm. Dies ist die Kopierroutine, die vom einzigen "ruhenden Pol" aus arbeitet. YR,b,t,s (YRead) Sektor von Diskette lesen YW,b,t,s (YWrite) Sektor auf Diskette schreiben Beispiel: YR,100,0,41 Diese beiden Befehl lesen (YR) bzw. schreiben (YW) einen Sektor von/auf Diskette. b ist der Buffer, von wo aus der Sektor ge schrieben oder wohin er beim Lesen von Diskette abgelegt wird. t ist die Tracknummer und s die Sektornummer. ACHTUNG: Sie mèssen fèr s die tatséchliche (physikalische) Sektornummer angeben, die in der ID stehen. Systemdisketten haben IDs von 41 bis 49, Datendisketten von C1 bis C9 und IBMdisketten von 1 bis 8. Falls ein Lese- oder Schreibfehler auftritt, èberprèfen Sie lieber erst nocheinmal welches Format die Diskette hat. Lassen Sie dazu einen Catalog mit dem C Befehl machen. Die erste physiklische Sektornummer steht dann in Adresse A89F (A8DF fèr Laufwerk B). Geben Sie dazu ein SA89F ein. Mit obigem Beispiel kùnnen Sie den Bootsektor Ihrer CP/M System diskette lesen. Passen Sie aber auf, da~ Sie YR und YW nicht verwechseln... Ein geschlossenes Schreibschutzloch oder ein rechtzeitig gemach tes Backup haben schon viel [rger erspart. Falls ein Lese- oder Schreibfehler auftritt, bringt Amsdos die èblichen Fehlermeldungen. Sie kùnnen dann mit R einen neuen Versuchstarten, mit I den Fehler ignorieren lassen (bei manchen Lesefehler wird dann der Sektor fast komplett gelesen) oder mit C abbrechen. Z<A><a> Unterprogramm ab a aufrufen Beispiel: ZA3E8 Dieser Befehl ist sehr praktisch, wenn Sie ein MC-Programm ùfters aufrufen mèssen. Sie mèssen dazu nur Z eingeben. ZA zeigt die Zieladresse. Wenn Sie hinter ZA noch eine Adresse angeben, wird dies die neue Zieladresse. LARA gibt dann die alte und die neue Zieladresse aus. Der Standartwert ist 3E8 (an dieser Adresse liegt mein Assembler). Der Z Befehl èbernimmt keine Vorbelegung von Registern. Dazu mèssen Sie dann schon den G Befehl benètzen. Irsxcomand,s RSX Befehl aufrufen Beispiele: IREN,OLDNAME.BAS,NEWNAME.BAS IERA,B:*.BAK ITAPE.IN Sie kùnnen unter LARA RSX Befehle wie unter Basic ausfèhren lassen. Anstatt des gro~en Is in den Beispielen mèssen Sie das mit SHIFT/Klammeraffe (rechts neben P) erreichbare Pipeline Zeichen eingeben. Es sind bis zu zwei STRINGparameter mùglich. Zahlen kùnnen als Parameter nicht eingegeben werden, da LARA nicht die Variablen verwaltung des Basicinterpreters hat. Diese Einschrénkung wirkt sich aber nur beim USER Befehl aus, und der aktelle User ist der Inhalt von A701, den Sie mit dem S Befehl veréndern kùnnen. Wenn Sie dort èbrigens ein E5 hineinschreiben, kùnnen Sie gelùschte Files wieder laden... Vergessen Sie aber nicht, die Usernummer wieder auf 0 zu setzen, bevor Sie das gerettete File abspeichern. |