APPLICATIONSDISQUE ★ Die Schnelle Scheibe ★

RSX DOS BEF (Schneider CPC-Welt)Applications Disque
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 

Standard des schnellen Massenspeichers für die CPCs ist die Drei-Zoll-Diskettenstation. Beim 664/6128 ist das zu gehörige Laufwerk mit der ebenfalls zugehörigen Elektronik bereits eingebaut: Der 464 kann nachgeröstet werden. In unserer Rubrik über die Maschinensprache widmen wir uns dieser Einheit. Dabei erfahren Sie vieles, was einem BASIC-Programmierer verborgen bleibt und können Dinge realisieren, von denen ein Hochsprachen-Programmierer kaum zu träumen wagt. Außer Ihrem guten Willen brauchen Sie nur einen Assembler, der Rest kommt von uns.

Bei dieser Folge über die Diskettenstation beginnen wir mit den Grundlagen. Zuerst sprechen wir wieder einzelne kleine Routinen durch, und dann kommt zum Abschluß wieder ein umfangreicheres Anwendungsprogramm.

Bei der Diskette handelt es sich um ein magnetisches Speichermedium. Bringen Sie Ihre Disketten nur dann in die Nähe von starken Magneten, wenn Sie Vorhaben, diese zu löschen. Sie brauchen aber nicht übervorsichtig zu sein, denn so empfindlich sind Disketten nicht. Täglich werden Tausende über den Postweg versandt, und nur bei ganz wenigen kommt es deshalb zu Schwierigkeiten, weil äußere magnetische Einflüsse — während des Transportes - gespeicherten Daten den Garaus gemacht haben.

Vorsicht beim Formatieren

Bei Leerdisketten brauchen Sie keine Befürchtungen zu haben, denn wo nichts ist, kann auch nichts verlorengehen, und auf neuen Disketten befinden sich keine Daten. Erst, wenn Disketten formatiert werden, dann sind auf ihnen Informationen, die eines Schutzes bedürfen.

Bevor eine Diskette sinnvoll genutzt werden kann, muß sie „formatiert“ werden. Während der Formatierung wird ein magnetisches Muster auf die Scheibe aufgebracht: Sie wird in Spuren und Sektoren eingeteilt: Meist wird von den Anwendern eines der mitgelieferten Programme benutzt, um eine Diskette in Form zu bringen; sei es nun DISCKIT1, DISCKIT3 oder wie auch immer das entsprechende Dienstprogramm zur Formatierung einer Diskette heißt. Meistens ist es ein CP/-M-Programm. Demnächst können Sie aber Ihr eigenes Programm dafür einsetzen, denn mit Maschinensprache-Unterstützung geht es auch mit BASIC. Sie können das Formatierprogramm auch in Ihr Programm einbauen, falls dieses formatieren soll. Dadurch haben Sie zwei Vorteile: Sie brauchen nicht erst CP/M zu laden und dann das Formatierprogramm aufzurufen, und Sie wissen, was vor sich geht.

Disketten-ROM

Wie beim CPC-Firmware-ROM stehen im Disketten-ROM Maschinenprogramm-Routinen. Diese sind neben dem enthaltenen LOGO-Teil für die Ablaufsteuerung der Diskettenstation zuständig. Nach den für Erweiterungs-ROMs (das AMSDOS-ROM zählt zu dieser Kategorie) erforderlichen Vereinbarungen sowie anderen ROM-Kenn-zeichnungen ist ab der Adresse &C006 eine Sprungtabelle zu finden, welche für die, durch eine Diskettenstation hinzugekommenen, neuen Befehle zuständig ist. Diese Befehle sind beispielsweise CPM, DISC, TAPE.IN und so weiter. Alles AMDOS-Befehle, die Sie auch in BASIC einsetzen können.

Danach aber, von &C033 bis &C04D, stehen neun weitere, die Disketten-Controller-Befehle, die üblicherweise nur auf Maschinen-Ebene genutzt werden können. Es sind Sprungbefehle für verschiedene „Disketten arbeiten“.

Im einzelnen sind dies:

  1. Fehlermeldungen des Controllers zulassen/verhin-dem
  2. Daten für das Laufwerk bestimmen
  3. Disketten-Format bestimmen
  4. Einen Sektor lesen
  5. Einen Sektor schreiben
  6. Eine Spur formatieren
  7. Eine Spur suchen
  8. Bestimmung des Laufwerks-Status
  9. Festlegung des Zugriffsversuchs.

Die Befehlsworte für diese Sprungtabelle finden Sie von &C0B6 bis &C0BF. Es sind dies die Befehle &81 bis&89. Wie der CPC bei einem Programmlauf — anhand der Befehlsworte — die einzelnen Sprungadressen ausfindig macht, ist dabei für uns gar nicht so interessant, denn wir lassen den CPC gleich selbst suchen. Diese Suchfunktion kann übrigens nicht nur für Disketten-Befehle eingesetzt werden, sondern auch für andere ROM- oder EPROM-Erweiterungen. Nur wenige Änderungen an unserem Programm, und schon können Sie RSXen finden usw.

Wer sucht, der findet!

Zur Befehlssuche in einem Vorder- oder Hintergrund-ROM (und auch zum Auffinden von RSCen im RAM) dient die Betriebssystem-Routine KL FIND COMMAND (&BCD4), Wie bei allen Firmware-Routinen gibt es dabei ganz genau festgelegte Ein-und Aussprung-Bedingungen.

KL FIND COMMAND

Einsprungbedingungen:
HL enthält die Adresse, an welcher der Kommando-Name steht, nach dem gesucht wird.

Aussprungbedingungen:
Wenn eine RSX oder ein Hintergrund-ROM gefunden wurde:
CARRY-Flag „an“
C enthält die ROM-Auswahl-adresse
HL enthält die Adresse der Routine.
Wenn das Kommando nicht gefunden wurde:
Carry-Flag „aus“
C und HL verändert.
Immer:
A,B,DE verändert alle anderen Register unverändert.

Gleich ein Hinweis an die Besitzer des Schneider Firmware-Handbuches: Bei der Routine KL FIND COMMAND ist ein Fehler enthalten, und diesen haben wir bei den obigen Bedingungen nicht übernommen. Im Firmware-Handbuch steht, daß HL den Kommando-Namen enthalten müsse. Aber in Wirklichkeit sollte es bei der Einsprungbedingung lauten: HL muß mit der Adresse geladen werden, an welcher das Befehlswort steht.

So, nun wissen wir alles Erforderliche und können uns daran machen, ein erstes kleines Maschinenprogramm zu schreiben. Dieses Programm soll dazu dienen, die neun, von BASIC aus nicht nutzbaren, Kommandos und deren Ausfuhrungsadressen ausfindig zu machen.

Eine ganz einfache Routine, die nur feststllt, ob der Befehl gefunden wurde, wird nach etwa folgendem Schema programmiert:

HL = Befehlswort-Adresse:

Durchsuche alle ROMs nach dem Befehlswert, der ab der Tabelle „befehl“ steht. War die Suche nicht erfolgreich, dann Signalisierung: „Nicht gefunden“!
War die Suche erfolgreich, dann Signalisierung: „Gefunden“.
Setzen wir dies gleich in Assembler-Mnemonic um:

start
LD, HL,befehl
CALL &BCD4
JP NC,noerfolg
LD A,“G“
Call &BB5A
RET
nerfolg LD A,“N“
Call &BB5A
RET
befehl defb &81
end

Vom Ablauf her ist diese Routine eigentlich schon korrekt.

Aber ein Assembler (also das Programm zur Umsetzung der obenstehenden mnemoni-schen Codes in Maschinencode) wird sich bei Assemblier-versuchen verzweifelt dagegen wehren, Obenstehendes umzusetzen. Das ist auch gut so, denn noch wurde nicht festgelegt, an welcher Stelle im Speicher das Programm stehen soll.

Je nach Assembler wird Ihnen (hoffentlich) mitgeteilt, doch bitte eine Adreßangabe zu machen, oder es wird ein fataler Fehler gemeldet und der Assembler bricht ab, etc. Wie geschrieben, das hängt vom Assembler ab. Bei MAX-AM, den wir benutzen, kommt die Fehlermeldung:


FATAL ERROR
Code limit exceeded“

und dann bricht er ab. Haben wir dagegen von BASIC aus bereits RAM-Speicher reserviert
(z.B.: MEMORY &9FFF), dann legt MAXAM den Start auf 1 Space &A000, den &9FFF + 1 = &A000!

Damit das Programm wirklich korrekt ist und der Assembler auch etwas damit anangen kann, teilen wir ihm gleich zu Beginn mit, für welche Adresse er den Code „ORGanisieren“ soll. Ich glaube, durch dieses Kunstwort können Sie sich diese Assembleranweisung leicht merken, oder? Wir schreiben also ORG &A000 am Anfang des Programmes.

Je nach Assembler oder den Assembleranweisungen wird das Maschinenprogramm gleich in die Speicherstellen geschrieben.

Nehmen wir an, es steht nun im CPC-Speicher (egal, ob es durch den Assembler direkt geschrieben, als Binärfile geladen oder durch ein Lade programm gePOKEd wurde!). Durch CALL&A000 (von BASIC aus) wird auf dem Bildschirm der Buchstabe „G“ ausgegeben, dieser wiederum bedeutet: gefunden. Schreiben Sie dagegen beim Befehlswort anstelle von &81 den Wert &90, dann wird auf dem Bildschirm „N“ für „Nicht gefunden“ erscheinen, denn das ist kein Befehl, der die Diskettenstation zu irgendwelchen Aktionen verlassen könnte.

So umständlich muß es ja nicht sein!

Obwohl alles so funktioniert, wie wir es haben wollten, es ist nicht komfortabel: Für jeden Befehl muß neu assembliert werden! Besser wäre es doch, wenn wir beim Aufruf das Befehlswort gleich mit übergeben könnten! Auch das stellt kein Problem dar, denn bei einem Maschinenprogrammaufruf (dem CALL-Befehl) können Parameter mitgegeben werden. Wollen wir also beispielsweise den Befehlswert beim Aufruf übergeben, dann kann dieser an den Aufruf der Maschinenroutine angehängt werden. Durch das Programm wird dieser dann in die Speicherstellen des Labels „befehl“ gebracht, und dann erst wird die eigentliche Routine aufgerufen.

Aber eine Anwendung, die uns nur mitteilt, ob ein Befehl gefunden wurde, wenn es um die Thematik der neun Diskettenbefehle geht, ist auch nicht sehr sinnvoll. Also machen wir gleich weiter, denn wenn wir Adresse und ROM-Nummer bekommen, dann können wir sinnvoll Weiterarbeiten. Sie haben sicher nichts dagegen, wenn wir deshalb die Maschinenroutine erweitern.

Die Erweiterung soll letztendlich so aussehen, daß jeder Befehl, der aufgefunden wird, auch ausgeführt werden kann. Damit dies aber machbar ist, müssen wir für alle diese Befehle eine kleine Übersicht in bezug auf die benötigten Parameter erstellen.

Das erste kleine Maschinenprogramm soll Ihnen aufzeigen, wie diese Befehle gefunden werden können und sowohl die ROM-Nummer als auch die ROM-Adresse ausgeben.

Betrachten Sie für die weiteren Ausführungen bitte das Assembler-Listing.

Programmbeschreibung: DOSBEF.EDI

Nach der Festlegung der ersten Speicherstelle des Programmes (org &A000), erfolgt die Zuweisung von drei Firmware-Routinen. Die erste erhält den Namen (Label) „ausg“. Dieser ist gleichzeitig der Hinweis auf die Aufgabe. Die Routine ist für die Zeichenausgabe zuständig; der Original-Name im Firmware-Handbuch lautet TXT OUTPUT. Bei Aufruf der Routine wird das im Akku (A-Register) stehende Zeichen auf dem Bildschirm ausgegeben.

Die nächste Zuweisung betrifft die Firmware-Routine KL FIND COMMAND. Ihr Aufruf bewirkt, daß der CPC die Befehle sucht, die ab der Adresse stehen, auf die HL zeigt. Beim letzten Zeichen des Befehlsnamens muß das hächste Bit gesetzt sein. Bei
den Befehlswörtern &81 bis &89 ist dies der Fall.

Dem Label rsxbind wird die Adresse &BCD1 zugewiesen, diese Routine dient zur Einbindung von RSX-Befeh-len.

Bei &A000 beginnt der Teil zur RSX-Einbindung. Der RSX-Befehl lautet: IRFIND. Diese Bezeichnung haben wir gewählt, weil es ein Hinweis auf ROM- und RSX-FINDen ist.

Das eigentliche Programm beginnt bei Adresse &A019. Dort wird durch den Befehl cp a,1 geprüft, ob genau ein Parameter mitgegeben wurde. Nur für den Fall, daß dies zugrifft, wird die Zero-Flagge (Zero-Flag) gesetzt.

Wurden mehr oder weniger Parameter beim Aufruf übergeben, dann signalisiert das Zero-Flag (kurz auch Z-Flag genannt) dadurch, daß es nicht gesetzt wurde, daß die Parameter-Anzahl nicht stimmt.

Der Befehl, den wir eben behandeln, könnte frei übersetzt werden mit: Springe, wenn das Z-Flag nicht gesetzt ist, zur Routine „fl“.

Falls die Zahl der beim Aufruf mitgegebenen Werte stimmt, dann geht es bei &A01E weiter. Zuerst wird das HL-Register (Doppelregister H und L) mit dem Wert &0000 geladen (ld hl,&0000) und dieser dann in die beiden Speicherstellen &A13F und &A140 übertragen. „Id“ ist die mnemonische Abkürzung für „LoaD“. Die Folge „Id (beftab),hl“ übersetzt heißt: Lade in die Speicherstellen ab dem Label „beftab“ die Inhalte der beiden Register H und L.

Wir nutzen eine Besonderheit

Bei einem CALL-Befehl von BASIC aus stehen im A-Register die Anzahl der Parameter und im DE-Register der letzte übergebene Wert. Normalerweise würde man die Liste der Parameter IX-indi-ziert zuweisen. Da bei einem mitgegebenen Wert dieser aber im DE-Register steht, genügt es, den einfachen Austausch-Befehl zu geben.

Die mnemonischen Abkürzungen sind für englischkundige Leser leicht zu merken, da sie von englischen Bezeichnungen abstammen. EX ist in diesem Falle die Abkürzung von EXchange! Der Befehl: EX DE,HL bewirkt, daß die Inhalte der beiden Doppelregister ausgetauscht werden.

Nur Werte zwischen &81 und &89 sind erlaubt

Im HL-Register steht nun der mitgegebene Wert! Es könnte aber sein, daß bei der Übergabe ein falscher Wert angehängt wurde, nämlich ein Wert kleiner &81 oder größer &89. Dieser könnte normalerweise zwar nicht gefunden werden, da er weder im BA-SIC- noch im Disketten-ROM steht, aber es wäre nun ja denkbar, daß jemand ein Erweiterungs-ROM angeschlossen hat und dort der - fälschlicherweise - übergebene Wert enthalten ist! Um solchen Problemen auszuweichen, lassen wir in der Unterroutine von &A025 bis &A02D zu kleine und zu große Werte „ausfiltem“ und zu entsprechenden Fehler-Routinen springen.

Ein Wert kleiner 255 (=&FF) steht immer im L-Register. Da es keinen Vergleichsbefehl gibt, der direkt mit dem L-Register eingesetzt werden kann, laden wir den Inhalt von L in das A-Register (ld a,l). Der Vergleich durch dp a,&81 setzt dann, wenn der Wert niedriger ist, die M-Flagge.

Den nachfolgenden Sprungbefehl kennen Sie schon in ähnlicher Weise. Der nächste Vergleichsbefehl wird mit &90 durchgeführt. Ist das Carry-Flag (kurz C-Flag)
nicht gesetzt, dann ist der Wert zu groß, und auch dann wird eine Fehler-Routine angesprungen.

Macht das Maschinenprogramm bei &A030 weiter, dann muß der Wert im HL-Register (eigentlich im L-Register) ein erlaubter Befehlswert sein! Deshalb wird dieser nun in die Speicherstellen bei „beftab“ gebracht und anschließend das HL-Register mit der Adresse geladen, an welcher der Befehl steht. Da wir diesen nun ja im Speicher stehen haben, kann HL mit dieser Adresse geladen werden. HL dient also als Zeiger.

Die Suche nach dem Befehl wird durch den Aufruf der Routine findco (KL FIND COMMAND) gestartet. Der Call-Befehl ist wie der BASIC-Befehl GOSUB zu sehen, denn er arbeitet genauso; er führt ein Unterprogramm aus und kehrt durch einen dortigen RET-Befehl wieder zurück. Nach dieser Rückkehr signalisiert das C-Flag, ob der Befehl gefunden wurde. Dies kann aber nur dann der Fall sein, wenn der CPC mit dem AMSDOS-ROM, also dem Disketten-ROM, versehen ist.

Ein „nackter“ CPC464 findet diesen Befehl nicht. Haben Sie einen Controller, der die ROM-Vereinbarungen nicht einhält oder dessen Betriebssystem diese Befehle nicht hat, dann ist das C-Flag gesetzt und es wird wieder zu einer Fehler-Routine gesprungen, denn der Befehl ist nicht verfügbar.

Gesucht und gefunden

Bei gesetztem Carry also war die Suche erfolgreich und es geht bei &A03C weiter. Die Aussprungbedingung (also die Rückkehrbedingung nach dem Firmware-Aufruf) lautet, daß im HL-Register die Adresse für den gefundenen Befehl steht und im C-Register (nicht verwechseln mit C-Flag!) die ROM-Nummer.

Nun wollen wir diese Werte auf den Bildschirm ausgeben. Dazu merken wir sie uns in den dafür vorgesehenen Speicherstellen „rsel“ (ROM-Selekt, also die ROM-Auswahlnummer), und in „radr“ die ROM-Adresse. Sowohl zur Ausgabe als auch bei der späteren Erweiterung des Programmes stehen uns diese Werte nun für die weitere Verarbeitung zur Verfügung.

Wir benutzen HL nun wieder als Zeiger. Wir stellen diesen auf „meldO“. Dort steht im Programm der Text: „Be „BEfehl gefunden!“ Der Zeiger deutet also auf das Zeichen „B“ dieser Mitteilung. Danach wird die Unterroutine „txtaus“ angesprungen, und dort wird der Akku mit dem Zeichen geladen, auf den HL zeigt. Dann wird verglichen, ob der Wert Null ist. Da aber keine Null enthalten ist, sondern der Code für das Zeichen „B“, ist der Befehl „ret z“ unwirksam, und durch „call ausg“ erscheint es auf dem Bildschirm.

INC HL erhöht (INCremeni) den Wert des HL-Re-gisters um eins. HL zeigt also auf „e“ und es geht bei txtaus weiter und zwar so lange, bis HL auf eine Null deutet. Dann ist diese Ausgabe beendet und „ret z“ bei &A085 bewirkt einen Rücksprung nach &A049 und dort wird weitergemacht.

Versuchen Sie nun doch bitte, selbst herauszufinden, was nun noch alles abläuft. Da wir Ihnen ein lauffähiges Programm ab drucken, brauchen Sie nicht unbedingt einen Assembler und können feststellen, was passiert, aber versuchen Sie bitte vorher, den Rest des Assembler-Listings zu verstehen, Die Kommentare reichen bestimmt aus, wenn Sie bis hierher alles verstanden haben.

Wer natürlich einen leistungsfähigen Assembler hat, ist fein raus, denn der kann sich durch Einfügen von Breakpoints (Unterbrechungen) im Programm alle Zustände und Register-Inhalte an jedem beliebigen Abarbeitungspunkt genauer ansehen.

Bedienung des Programmes

Assemblerbesitzer können das Assemblerlisting eingeben. Die anderen lassen das Programm DOSBEF.HEX laufen. Nach dem Assemblieren oder nach dem Programmlauf von DOSBEF.HEX steht das Maschinenprogramm im Speicher und wird beim Ladeprogramm auch gleich korrekt abgespeichert.

Aber noch kann mit dem Maschinenprogramm nicht gearbeitet werden, denn zuerst muß die Einbindung erfolgen. Dies geschieht durch CALL &A000 von BASIC aus. Aber Achtung: RSC-Befehle nie zweimal einbinden, denn sonst erfolgt beim Aufruf eines RSX-Befehls im Regelfall ein Systemabsturz!

Der Aufruf selbst wird durch |RFIND,x durchgeführt. Dabei ist für x ein Wert zwischen &81 und &89 einzusetzen.

Dieses Programm wird beim nächsten Mal erweitert und außerdem bringen wir noch eine Version, die Ihnen alle RSX-Befehle sucht.

LM, SW


Das Assemblerlisting DOSBEF.EDI Das Programm sucht die neun zusätzlichen Diskettenbefehle und gibt die ROM-Nummer und -Adresse aus.

Das Ladeprogramm speichert nach korrektem Programmlauf das Binärfile ab, aber bindet den RSX-Befehl nicht gleich ein.

★ PUBLISHER: Schneider CPC-Welt
★ YEARE: 1987 , 1988
★ CONFIG: 64K + AMSDOS
★ LiCENCE: LISTING
★ COLLECTION: Schneider CPC-welt 1988
★ LANGUAGE:
★ AUTHOR: Lothar Miedel

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» RSX-DOS  BEF    (Schneider  CPC-Welt)    LISTING    GERMANDATE: 2021-06-21
DL: 27 fois
TYPE: PDF
SIZE: 1313Ko
NOTE: 4 pages/PDFlib v1.6

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Applications » X-Ddos v1 ROM
» Applications » Strings als Basic-Kommandos
Je participe au site:
» Vous avez des infos personnel, des fichiers que nous ne possédons pas concernent ce programme ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop
Page créée en 893 millisecondes et consultée 152 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.