CODINGFDC ★ Arbeiten mit Diskette (2) Maschinenprogramm für den Zugriff auf einen Sektor ★

Arbeiten mit Diskette (2) Maschinenprogramm für den Zugriff auf einen Sektor (Computer Schau)
★ 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 ★ 

Aufbauend auf den vorhergehenden Artikel will ich nun mit Ihnen gemeinsam eine Routine entwik-keln, die den direkten Zugriff auf einen bestimmten Sektor einer Diskette ermöglicht. Dieser Routine dient auch für spätere Programme als Unterroutine. Deshalb will ich Ihnen die genaue Arbeitsweise erklären. Da ein sinnvoller Zugriff nur in Maschinensprache geschehen kann, werden wir uns diesem „Basisteil” zuerst widmen.

Um ein derartiges Maschinenprogramm entwickeln zu können, bedient man sich sinnvollerweise eines Assemblerprogrammes. Im letzten Heft habe ich bereits einen Assembler/Disassembler/Editor getestet, mit dem ich auch heute noch arbeite. Zwischenzeitlich besitze ich nun zwei Versionen, da sich -wie im Testbericht bereits angedeutet - die Version 1.09 nicht auf dem 6128 oder 664 bewährte. (Das Eprom war nicht schnell genug!) Für Interessenten an diesem ROM-Programm sei erwähnt, daß - aufgrund der Unterschiede der englischen und deutschen 6128-Versionen - die Adaption nur mit einem selbstgebastelten Adapterstecker geschehen kann (Stand: 1. 11. 1985). Dies ist zwar für einen versierten Bastler nicht schwierig, für einen „elektronischen Linkshänder“ aber eine kaum überwindbare Hürde. (Hoffentlich nimmt sich demnächst jemand dieser Sache an, sonst gibt es immer wieder Probleme mit aus England stammenden Erweiterungen, wenn diese an den CPC 6128 angeschlossen werden sollen.)

Das Programm wird erstem

Ich schildere nun die Vorgehensweise mit dem schon erwähnten Assembler. Dieser muß natürlich erst aktiviert und in den Editormode gebracht werden. Als erstes teilen wir dem Assembler die Adresse mit, ab welcher das Maschinen-Programm abgelegt werden soll. Da es sich um eine sehr kurze Routine handelt, kann diese Adresse sehr weit oben, also beispielsweise auf &A600 gesetzt werden. Mit dem „MAXAM im ROM“ kann allerdings der Test der Routine an dieser Stelle nicht erfolgen, denn MAXAM ist dort selbst aktiv. Während der Austestphase kann dieses Programm beispielsweise auf &A000 gelegt werden, um es später, wenn man sich von der Fehlerfreiheit überzeugt hat, für den Bereich ab &A600 zu assemblieren. Betrachten Sie nun bitte die Zeilennummer 6 des Assemblerlistings. Dort wird durch org &A600 bestimmt, daß das Maschinen-Progrämm ab dieser Adresse abelegt werden soll. Als nächstes legen wir die Adresse für das aktive Laufwerk fest. Dies hat den Vorteil, daß wir später auch auf ein zweites Laufwerk zugreifen können. Die Speicherstelle, in der bei den CPCs die Nummer des aktiven Laufwerks abgelegt wird, ist &A702. Sinnvollerweise nennen wir diese Speicher-steile „aktdriv“. Die Einsprungadresse für die Suche nach einem Kommando ist wie im letzten Abschnitt schon erwähnt, &BCD4. Der Name hierfür wurde mit findco, der Abkürzung für „Finde Kommando“ gewählt. Als nächstes muß die Tabelle zur Aufnahme bestimmter Werte aufgebaut werden. (Ein komfortabler Assembler ermöglicht jederzeit das „Zwischenschieben“ von Befehlen, Direktiven usw. in den bestehenden Sourcecode.) Da später auch eine Beeinflussung des Maschinenprogrammes von Basic aus erfolgen soll, werden in dieser Tabelle Speicherplätze für verschiedene „Merker“ reserviert. Für unser Programm benötigen wir Platz für den Befehl (befehl = 1 Byte), die ROM-Adresse (romadr = 2 Byte), für ROM-Select (romsei = 1 Byte), für die Laufwerksnummer (driven = 1 Byte), für die Spur-Nummer (track = 1 Byte), für Format und Sector-Nummer (formse = 1 Byte) und schließlich noch für den Buffer aus dem oder in den die Daten gelesen oder geschrieben werden (buffer = 2 Bytes).

Tabellen bringen Vorteile

Durch den Aufbau von Tabellen gewinnen wir den „Freiheitgrad“, später auf einfache Weise die gewünschten Werte - von Basic aus -in das Maschinenprogramm poken zu können. Außerdem werden beim Assemblerlauf (falls gewünscht) die Adressen mit den Namen ausgegeben, was bei der Basicprogrammerstellung mehr oder weniger komplizierte Berechnungen und Überlegungen überflüssig macht.

Nun folgt das eigentliche Maschinenprogramm, das wir nun zwischen den ersten Teil und der Tabelle einschieben.

Zeile 11 (also ab der Adresse &A600) bewirkt, daß der Akkumulator mit dem Inhalt der Speicherstelle für das aktive Laufwerk geladen wird. Dadurch kann beim späteren Programmlauf der automatische Zugriff auf das jeweils ausgewählte Laufwerk erfolgen. Dieser Wert wird dann sofort (Zeile 12) in die „Merker“-Speicherstelle der Drive-(Laufwerks-)Nummer übertragen. Anschließend wird die Adresse des Befehles geholt und die Suchroutine aufgerufen. Da bei intaktem CPC und korrekt angeschlossenem Laufwerk die Suche erfolgreich sein muß, können die in den Registern „HL“ und „C“ enthaltenen Werte der Suchroutine direkt in die reservierten Speicherstellen übertragen werden (Zeile 15 bis 17). Um über einen sogenannten Restart die eigentliche Ausführung des Befehles zu bewirken, sind noch weitere Voraussetzungen zu berücksichtigen. Die Laufwerksnummer muß im E-Register stehen, das D-Register muß die Spur-Nummer enthalten, im C-Register muß die Sektornummer (inklusive der Formatkennzeichnung) stehen und zu guter Letzt muß „HL“ die Bufferadresse enthalten. Dies alles geschieht in den Zeilen 18 bis 24. Beim Restart selbst wird außerdem noch die ROM-Adresse der eigentlichen Routine „mitgenommen“.

Wird beim späteren Programmlauf die Routine abgearbeitet, dann steht im gewünschten RAM-Speicherbereich (Buffer) genau der gewünschte Sektorinhalt der Diskette.

Ein Byte mit gvoBer Wirkung

Da wir in der Tabelle den Befehlswert mit &84 festgelegt haben, handelt es sich im Moment um ein Programm zum Lesen eines Sektors. Ändert man nur den Befehlscode in korrekter Weise, dann wird nicht ein Sektor gelesen, sondern geschrieben. Dabei können alle anderen Parameter in der gleichen Art übergeben werden. Um es nochmals anders auszudrücken, bei Änderung des Befehles von &84 in &85 werden 512 Bytes ab dem festgelegten Bufferanfang in den, in den anderen Registern festgelegten Sektor geschrieben. So einfach geht das! Der Rest des Assemblerlistings dürfte keine Verständnisschwierigkeiten bereiten. Die Bufferadresse und formse (Format und Sektor) wurden zwar im Assemblertext definiert, aber wir können von Basic aus ja jeden Tabellenwert verändern. Damit haben wir nun eine Grundroutine erstellt, die uns bei allen weiteren „direkten“ Arbeiten mit der Diskettenstation wertvolle Dienste leisten kann. Da nicht jeder CPC-Besitzer über einen Assembler verfügt, habe ich selbstverständlich auch einen „Dataloader“ erstellt, der das entsprechende „Binärfile“ automatisch auf der Diskette generiert. Die Basicprogramme laden dann jeweils dieses erzeugte Binärfile (Sector.bin) nach, also nicht den Dataloader!

Ich habe es im letzten Heft zwar schon einmal erwähnt, aber doppelt „genäht“ hält besser. Vergleichen Sie doch einmal die Daten des Data-loaders mit den Daten des Assemblerlistings. Wie Sie sehen, sind beide gleich. Der Dataloader ist also nur eine „Krücke“, um Maschinenprogramme in eine druckbare und direkt eingebbare Form zu bringen. Vor dem Lauf des Dataloader sollten Sie aber unbedingt den Maschinensprachebereich durch MEMORY &A5FF vor dem „Überschreiben“ schützen. Dies können Sie beispielsweise auch im Programm selbst tun. Wenn Sie es nämlich vergessen, kann es passieren, daß dort ganz andere Werte stehen, denn Stringvariable werden ja von HIMEM abwärts im Speicher des CPC abgelegt. Auch die späteren Basicprogramme müssen diesen Bereich „schützen“.

Alles was jetzt noch zu tun ist, kann mittels eines Basicprogrammes bestimmt werden.

Im nächsten Kapitel werden wir dies für einen ersten Anwendungsfall tun.

L. Miedel, ComputerSchau

★ PUBLISHER: COMPUTER SCHAU
★ YEAR: 1986
★ LANGUAGE:
★ LiCENCE: LISTING
★ AUTHOR: Lothar MIEDEL
 

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» Arbeiten  mit  Diskette-2-Maschinenprogramm  fuer  den  Zugriff  auf  einen  Sektor    (Incl.  ASM  Source)    (Computer  Schau)    LISTINGDATE: 2023-10-29
DL: 43
TYPE: PDF
SiZE: 1420Ko
NOTE: 3 pages/PDFlib v1.6

Je participe au site:
» Pour ce titre nous ne disposons de fichier executable sur CPC (Saisie du listing) , alors si vous avez ça dans vos cartons ou vous désirez usé vos petit doigts boudinés sur votre clavier faites le nous savoir.
» Vous avez des infos personnel ?
» 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 460 millisecondes et consultée 136 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.