APPLICATIONSDIVERS ★ DATA-HEXE (CPC AMSTRAD INTERNATIONAL) ★

DATA-Hexe (CPC Amstrad International)Applications Divers
★ 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 ★ 

Wer eine kleine Maschinencode-Routine entwickelt oder irgendwo an Land gezogen hat und diese, weil sie nützlich oder pfiffig ist, in ein BASIC-Programm einbinden möchte, der hat selten Lust, den HEX-Code noch ein weiteres Mal einzutippen.

Aus dieser Verlegenheit hilft die DATA-Hexe. Sie liest jeden beliebigen Speicherbereich aus, den man ihr angibt, und schreibt die Bytes auf die Diskette oder Kassette — fix und fertig als BASIC-Programm, bestehend aus DATA-Zeilen mit vorgeschaltetem Lader.

Für die Einsteiger unter den Lesern von PC AMSTRAD International sei das Programm hier erläutert:

Um die Variablen, die in den Zeilen 90-100 eingerichtet werden, brauchen wir uns zunächst nicht zu kümmern.

Die Abfragen in Zeile 170 und 190 nehmen sowohl HEX-Zahlen (mit vornweg) als auch Dezimalzahlen an. Aber die Sache hat einen unerwarteten Haken, der hier etwas ausführlicher dargelegt werden muß:

Verhexte Zahlen

Stellen Sie sich vor, Sie hätten als Start-Adresse &7FFF eingegeben und als End-Adresse &8000. Stellen Sie sich weiter vor, diese Werte würden im weiteren Verlauf des Programms zur Festlegung einer Zählvariable für eine Schleife benötigt, beispielsweise so:

FOR i=&7FFF TO &8000

Sie mögen jetzt sagen: Das ist ein kleiner Schritt, von 32767 bis 32768 in Dezimal-Schreibweise, und nicht der Rede wert.

Pustekuchen! Diese schöne Schleife wird überhaupt nichts tun, weil der Rechner die Zahl &8000 für niedriger als &7FFF hält, und ohne entsprechende negative STEP-Anweisung wird er ums Verrecken nicht abwärts zählen! Hier der Beweis:

FOR i=&7FFF T0 &8000 STEP -1

Nun wird Ihr CPC brav die Schleife abarbeiten - und zwar volle 65536 Male!

Was ist hier los? Sie können versuchen, was Sie wollen, &8000 ist wider alle Vernunft kleiner als &7FFF. Probieren Sie zum Beispiel dies:

10 a=max(&7FFF, &8000) 20 print hex$(a)

Ergebnis: &7FFF Oder dies:

print &7FFF < &8000

Ergebnis: 0 (d.h. falsch!)

Wir kommen der Lösung des Rätsels über das Programm HEXFALLE näher, das zunächst die Dezimalzahlen in HEX-Zahlen umsetzt und dann diese wieder in Dezimalzahlen. Dabei ergibt sich für den entscheidenden Wertebereich:

32766 &7FFE 32766 32767 &7FFF 32767 32768 &8000 -32768 32769 &8001 -32767 32769 &8002 -32766

Und hier nun die Erklärung des merkwürdigen Sprunges: Sobald der Rechner sich mit HEX-Zahlen befaßt, vergißt er sozusagen, daß unsere Variablen eigentlich vom Typ Realzahl sind, und zieht sich auf die einfacher zu bearbeitenden Integerzahlen zurück. Von denen allerdings kennt er nur 65536, wobei er die erste Hälfte (von 0 bis 32767) ganz normal durchzählt, wie wir's auf der Schule gelernt haben, dann aber auf -32768 zurückspringt und anschließend bis -1 aufwärts weiterzählt. Diese kuriose Zählweise geht letztlich auf den internen Umgang der Z80-CPU mit 16-Bit-Zahlen zurück; die verrückten Negativzahlen bezeichnet man auch als Zweier-Komplement. Und jetzt wissen Sie auch, warum In-teger-Variable auf den Bereich -32768 bis +32767 beschränkt sind!

Zurück zur Datahexe!

Das eben beschriebene Dilemma lösen die Zeilen 180 und 200. Falls die Eingabe sich als negativer Wert erweist, addieren wir 65536, und schon läuft alles wie geschmiert. Wohlgemerkt: Wenn bei der Eingabe von HEX-Zahlen alle beiden Werte unterhalb oder oberhalb dieser Problemzone liegen, macht uns das keine Kopfschmerzen. Von &6000 bis &7000 oder von &8001 bis &8FFF zu zählen, das ist Routine. Aber wenn schon eine , dann möglichst auch eine ohne Hexensprünge solcher Art!

In Zeile 250-330 entdecken Sie bei genauem Hinsehen ein BASIC-Programm innerhalb des Programms, nämlich als Inhalt der PRINT-Anweisungen. Hier wird das spätere Lade-Unterprogramm erstellt. Als MEMORY wird die Speicherstelle unterhalb der anfangs eingegebenen Start-Adresse angenommen.

Die etwas verwirrende Zeile 310 erklärt sich daraus, daß geschachtelte Anführungsstriche innerhalb einer PRINT-An-weisung vom BASIC-Interpreter unausweichlich mißverstanden werden und deshalb hier nur in der Form 'CHR$(34)' dargestellt werden können. Die fertige Programmzeile wird später so aussehen:

7 POKE i, VAL(“&"+byte$)

In Zeile 90 war die Zeilennummer 10 für die erste DATA-Zeile vorgeschlagen worden; wer eine andere vorzieht, mag's ändern. (Die RESTORE-Anweisung in Zeile 280 wird automatisch nachgestellt.) Geändert werden kann selbstredend auch Zeile 100 mit der Variablen 'daz.lg', die die Zahl der DATA-Angaben pro Zeile festlegt. Die Kombination von 'daz.lg = 8' mit 10 als erster DATA-Zeilennummer hat zwei Vorteile: Erstens bleibt man mit acht DATA-Angaben im Hexadezimal-System, ohne gleich auf unübersichtliche 16 Angaben pro Zeile zu kommen; zweitens kann man die Gesamtzahl der DATA-Angaben mit Hilfe der Zeilennumerierung zur Not im Kopf nachrechnen.

In den folgenden geschachtelten Schleifen werden die Speicherbytes ausgelesen und in den Massenspeicher (Kassette, Diskette) geschrieben, in HEX-Werten ohne “&“-Vorsatz, und zwar in Kleinbuchstaben. (Dem Rechner ist es ohnehin gleich; demjenigen aber, der das Listing vielleicht irgendwann mal abtippen muß, erleichtert es die Arbeit.)

Die äußere Schleife hat 'x' als Zählvariable. Die Abbruch-Bedingung in Zeile 380 ist bereits erfüllt, wenn 'x=adr.z' ist, da wir ansonsten durch die Addition von x und y in Zeile 420 die Endadresse schon überschreiten würden.

Die innere Schleife stellt zwei Abbruch-Bedingungen zur Wahl: Entweder Überschreitung der vollen DATA-Zeilen-länge (Zeile 410), oder aber vorzeitiger Abbruch nach Bearbeitung der End-Adresse (Zeile 450), wobei im letzteren Fall die Anweisung 'y=daz.lg' den Ausstieg aus der inneren Schleife ohne das umstrittene GOTO bewirkt.

Die DATA-Zeile wird aufgebaut in Zeile 390 und 440 sowie 460-470. (Dort Einsetzen der Kommas und Leerstellen -letzteres zur größeren Übersichtlichkeit der DATA-Zeilen.) In Zeile 500 wird die fertige Zeile zur Speicherung übergeben. Nach der Erhöhung der Zeilennummer und der Zählvariablen x kann gegebenenfalls der neue Durchlauf durch die Schleife starten.

Sobald die DATA-Hexe ihre Arbeit getan hat, kann das Programm, das jetzt als ASCII-Datei gespeichert ist, dank der beigegebenen Zeilennummern ohne weiteres als BASIC-Programm mit LOAD bzw. RUN aktiviert werden. Sie können Ihr neugeschaffenes Programm besichtigen, es ausprobieren, es in andere BASIC-Programme einbinden -oder was immer Sie wollen.

Zum Schluß noch zwei wohlfeile Ratschläge.

Erstens: Vermeiden Sie Start-Adressen unter &4000. Je näher Sie an &0000 herankommen, desto wahrscheinlicher ist es, daß Sie beim Starten des neu erstellten Programms die Meldung MEMORY FULL bekommen, weil der Platz unter HIMEM für das BASIC-Programm zu eng geworden ist. Zweitens: Wenn Sie eine End-Adresse größer als &FFFF eingeben, gibt's garantiert Computer-Schnodder. Aber die meisten Maschinencode-Routinen sind vernünftigerweise sowieso irgendwo im Bereich zwischen &9000 und &AFFF zu finden.

Viel Spaß also beim Hexen!

DATAHEXE: Alphabetische Variablen-Liste

a$ Hilfs-Variable
adr.a! Adresse für Anfang des Auslesens
adr.z! Adresse für Ende des Auslesens
byte! Inhalt einer Speicher-Adresse
daz$ DATA-Zeile im Aufbau
daz.lg! DATA-Zeile: Zahl der Angaben
daz.nr! DATA-Zeile: Numerierung
file$ Datei-Name beim Abspeichern
x! und y! Zählvariable bei Schleifen

Martin Lipka/cd, CPCAI

★ PUBLISHER: CPC Amstrad International
★ YEARE: 1988 , 1989
★ CONFIG: 64K + AMSDOS
★ LANGUAGE:
★ LiCENCE: LISTING
★ COLLECTION: CPC AMSTRAD INTERNATIONAL 1989
★ AUTHOR: Martin Lipka
 

★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» DATA-Hexe    (CPC  Amstrad  International)    GERMANDATE: 2020-07-03
DL: 178
TYPE: ZIP
SiZE: 4Ko
NOTE: 40 Cyls
.HFE: Χ

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

Lien(s):
» Applications » Binary Trainer (Computing with the Amstrad)
» Applications » The Gamer's Trainer v2 (Amstrad Action)
» Applications » Schreibtrainer (CPC Amstrad International)
» Applications » Multilearn Vokabeltrainer v2 (Schneider CPC-Welt)
» Applications » Vokabeltrainer
» Applications » Multi-Trainer (Schneider Magazin)
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/c
Page créée en 384 millisecondes et consultée 769 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.