ASDIS für Anfänger


Diesen Artikel wollte ich eigentlich auf dem Treffen als Vortrag halten, aber irgendwie waren wir da alle zu sehr beschäftigt. Also, ähem, räusper, ich bitte um Gehör!

Kurz und knapp: ASDIS ist ein Assembler/Disassembler und wurde von Horst Kling (Franke HRG!) geschrieben/vertrieben. Da er uns leider keine internen Unterlagen zum ASDIS zur Verfügung stellen konnte, liegt wohl der Verdacht nahe, daß ASDIS von einem anderen System auf den ZX81 portiert wurde. Wenn dem auch so sei, ASDIS ist wirklich gut und deckt 99% aller erdenklichen Anwendungsfälle ab. Für ASDIS gibt es eine Anleitung, die ich jedoch nicht im Magazin bringen möchte. Wer sie braucht: gibt es bei mir gegen Rückporto!

Wozu braucht man sowas wie ASDIS? Ein Assembler ist ein Tool, Werkzeug, das Maschinenprogramme bzw. einen „Quelltext“ in lauffähigen Code übersetzt. Mit Maschinenprogramm sind die Mnemonics gemeint, dieses ominöse LD A,(HL) und sowas. Code ist das, was dann im Speicher (RAM/ROM/EPROM) abgelegt wird und direkt von der CPU gefressen werden kann. Wer sich schon an Willis „Maschinensprachekurs für Anfänger“ versucht hat, kennt die lästige POKErei in irgendwelche REM-Zeilen. Genau diese Arbeit nimmt uns ASDIS ab, und er kann freilich noch eine ganze Menge mehr.

Ein Disassembler geht genau den umgekehrten Weg und bastelt aus Zahlenfolgen im Speicher wieder einen verständlichen Quelltext.

ASDIS selbst kann recht umständlich von Kassette geladen werden. Viel eleganter ist aber ein ASDIS in einem EPROM. Wir brauchen dazu nur ein EPROM im Bereich 8-16k, ASDIS selbst belegt etwas mehr als 7kB.

Wie bringe ich dieses EPROM mit dem ZX81 zusammen? Wer den ZX96 oder den Giant hat, steckt das EPROM einfach dort auf bzw. brennt ASDIS mit hinein. Nur-Floppycontroller-Besitzer können sich eventuell mit einer Huckepacklösung auf dem FDC behelfen. Schließlich kann man auch einen Adapter stricken und das ASDIS-EPROM einfach hinten anstecken (Henning kennt das!). Ich glaube, Bauanleitungen für solche Adapter hatten wir schon. Wer Hilfe braucht, kann sich aber gerne an mich wenden!

Letztlich ist dann aber alles das gleiche: man startet ASDIS einfach durch RAND USR 8192.

Für einen ersten Versuch nehmen wir gleich mal das Beispiel aus Willis Anfängerkurs (bitte suchen, denn damit wird alles verständlicher!). Als erstes brauchen wir wieder die REM-Zeile, die geben wir vorerst noch zu Fuß ein: 1 REM 00000000. Ruhig ein paar Nullen mehr, zuviel macht hier gar nix! Damit haben wir einen Platz geschaffen, an dem der fertige Code dann abgelegt werden kann und von wo er sich auch einfach SAVEn läßt. Die erste Null ist unsere „Startadresse“, bei der ersten REM-Zeile ist diese immer 16514.

Haben wir die REM-Zeile fertig, rufen wir ASDIS mit RAND USR 8192 auf. Die unteren Zeilen des Bildschirmes sind jetzt das Hauptmenü, von dem wir uns erstmal nicht verwirren lassen. Zuerst teilen wir ASDIS mit, wo er denn bitte den fertigen Code ablegen soll. Dazu gibt es die Funktion I (ablegen). Also einmal I drücken, 16514 eingeben und N/L. Dann können wir als nächstes schon den Eingabeeditor starten und unser Programm eintippen: einfach auf 1 drücken. Das Menü klappt weg und wir gucken auf die Eingabezeile. Das inverse G signalisiert „Grundzustand“ - alles ok. Wir drücken einmal N/L, der Cursor springt nach rechts. Jetzt sind wir im Mnemonicteil der Eingabezeile und dürfen schon unser erstes LD A,85 (Leerzeichen nach LD beachten!) einhacken, fertig und N/L. ASDIS checkt die Zeile sofort auf richtige Syntax durch und -war alles korrekt- zeigt die Zeile oben an.

Genauso geht es nun weiter: N/L-Mnemonicteil, LD (49185),A-N/L. N/L-RET-N/L. Damit ist das Programm schon drin, wir verlassen den Editor mit der Taste 8 und landen wieder im Hauptmenü. Um das Programm jetzt zu assemblieren (=übersetzen), brauchen wir nur einmal kurz auf A zu drücken. ASDIS meldet sofort ein OK über dem Menü - solang war unser Programm ja nicht, das geht fix.

Das war es schon, unser Programm ist fertig und steht als lauffähiger Code in der REM-Zeile. Glaubt Ihr nicht, ging ZU schnell? Dann verlassen wir ASDIS mit der 8 und gucken auf die REM-Zeile: da steht was anderes drin als vorher! Zum Testen brauchen wir jetzt natürlich noch das Spar-Interface, sonst sieht man ja nix. Nach RAND USR 16514 leuchten die 4 LEDs, unser Programm spielt!

Ein weiteres wichtiges Element sind die Labels. Dazu kramen wir den Teil 3 von Willis Kurs hervor. Dort ist eine Schleife als „Bremse“ enthalten. Sinn und Wesen einer Schleife sind Rücksprünge. Wer schonmal Maschinenprogramme von Hand assembliert hat, kennt die Rückwärtszählerei zum Bestimmen der Sprungweite. Mit ASDIS geht das sehr einfach: man setzt einfach dort, wo der Sprung landen soll, ein Label. Im Sprungbefehl wird dann einfach das Label angegeben und ASDIS rechnet sich das dann selbst aus. Wieder schön Schritt für Schritt. Wir gehen mit 1 ins Listing. Mit den Cursortasten auf die Zeile nach LD (49185),A - denn davor wollen wir die Bremse einbauen. Jetzt geben wir zunächst die Zeile LD DE,$FFFF ein. Das $-Zeichen bedeutet „hex“, ASDIS kennt ja beide Schreibweisen. Die nächste Zeile, das DEC DE, ist das Sprungziel. Hier geben wir als allererstes(!) das Label ein, meinetwegen ZIEL (wichtig: max. 5 Zeichen), dann landen wir mit N/L im Mnemonicteil und tippen noch DEC DE ein. Schließlich die nächsten Zeilen wie gehabt, und bei JPNZ geben wir ein: JP NZ,ZIEL. Das Leerzeichen zwischen JP und NZ ist wichtig, sonst meckert ASDIS! Das war es dann auch schon. Sehen wir uns das Listing nach dem Assemblieren nochmal an, dann steht die korrekte Adresse des Rücksprunges drin. Dasselbe funktioniert auch mit Relativsprüngen, man muß nur auf die maximale Sprungweite von 127 achten.


Damit könnt Ihr nun schon einige kleine Listings abtippen. Im zweiten Teil geht es dann um die Marken, Kommentare und Tabellen. Viel Spaß!