Zu beginn der ATARI-Portfolio-Ära waren Interfaces, Speicherkarten und Software schwer erschwinglich, besonders Programmier-Software. Programmierwillige waren auf Stapelverarbeitungsdateien und die Tabellenkalkulation beschränkt. Doch gibt es tatsächlich Möglichkeiten mit dem DIP-DOS und den eingebauten Anwendungen Software zu schreiben. Dies ist allerdings nicht ganz problemlos und es gibt Einschränkungen.
Das Problem:
Programme sind als Binär-Code gespeichert, Werte zwischen 0 und 255 sind nötig, die Tastatur liefert allerdings nicht alle nötigen Zeichen. Diese müssen mit Hilfe der numerischen Tastatur als ASCII-codes (durch Drücken von Fn_N ändert sich der Cursor zu einem blinkenden Unterstrich und Ziffern sind mit den rot beschrifteten Tasten einzugeben) eingegeben werden.
Damit ist das Problem aber nicht gelöst, viele der so eingegebenen Codes werden von der DOS-Befehlszeile und vom Texteditor als Sonderzeichen interpretiert, die bei der Eingabe gewisse Funktionen auslösen (z.B: 0Dh wird als Zeilenumbruch interpretiert, DOS-Befehlszeilen werden somit beendet, der Text-Editor macht daraus ein 0Dh 0Ah und macht den Code unbrauchbar).
Um dies zu umgehen muß der gewünschte Code geändert werden. Soll ein Prozessor-Register den Wert 13 (0Dh) enthalten muß man zum Beispiel erst den Wert 14 übergeben und ihn nacher um 1 reduzieren. Dies ist natürlich nicht gerade elegant, aber der einzige Weg. Um sinnvoll zu arbeiten sollte man sich als erstes ein Tool schreiben, mit dem das Eingeben von Bytes jeglichen Wertes möglich ist. Aber dazu später.
Zunächst ein paar Beispiele um zu beweisen, daß es geht und um ein Bißchen Motivation zu bringen.
In der DOS-Befehlszeile schreiben wir mit Hilfe des ECHO-Befehls ein Programm das die Meldung “Hallo!” herausgibt. Der Programm-Code ist wie folgt (dezimal):
180 009 186 009 001 205 033 205 032 072 065 076 076 079 033 036
Tippen sie ECHO, gefolgt von einer Leerstelle, schalten sie die Tastatur auf numerisch um (Fn_N). Nun halten sie die Alt-Taste gedrückt solange sie die drei-stelligen ASCII-Codes eingeben.
Alt_180 TAB Alt_186 TAB Alt_001 Alt_205 ! Alt_205 Alt_032
Schalten sie die Tastatur wieder zurück (Fn_N) und vervollständigen sie die Zeile:
HALLO!$>HALLO.COM
Die Befehlszeile sieht dann so aus:
ECHO ┤ ║ ^A═!═ HALLO!$>HALLO.COM
Nun drücken sie Enter und die Byte-Folge wird in die Datei HALLO.COM umgeleitet.
Geben sie nun HALLO als Befehl ein und
HALLO!
erscheint auf dem Bildschirm.
Dank des „>“-Zeichens wird die Datei HALLO.COM erzeugt, das heißt aber auch, daß man den ASCII-Wert 062 nicht als Code-Byte übergeben kann. Das gilt auch für folgende ASCII-Werte:
ASCII | Funktion | |
---|---|---|
000 | Wird ignoriert. | |
003 | Strg_C: Abbruch | |
008 | BS: Löschtaste. | |
013 | Enter: Eingabe beenden. | |
019 | Wird ignoriert. | |
027 | ESC: Abbruch. | |
060 | <: DOS. | |
062 | >: DOS. |
Manche dieser Bytes könnte man mit dem Text-Editor nachträglich einfügen. Dieser hat aber wiederum Probleme mit anderen Bytes, Vorsicht ist geboten. Die Meldung des Programms HALLO.COM kann allerdings problemlos mit dem Text-Editor auf bis zu einer Länge von 214 Bytes verlängert werden.
Portfolios Textverarbeitung kann man eine Menge zumuten, nicht aber Binär-code. Glaubt man. Mit ein paar Einschränkungen und Tricks kann man allerdings *.COM Programme schreiben!
Zunächst laden wir das mit dem ECHO-Befehl erstellte Programm in den Text-Editor, es klingt erst einmal seltsam eine COM-Programm in den Text-Editor zu laden, aber es geht. In dem Text-Editor sieht es so aus:
┤ ║ ^A═!═ HALLO!$
Nun können sie die Meldung „HALLO!“ durch einen beliebigen Text ersetzen und das Programm unter einem anderen Namen wieder speichern. Im Text-Editor kann man sogar „<“ und „>“ verwenden, dafür hat er aber enorme Probleme mit anderen Bytes die man mit ECHO eingegeben hat:
ASCII | Funktion | ASCII | Funktion | |
---|---|---|---|---|
000 | - | 016 | - | |
001 | Cursor springt auf POS1 | 017 | - | |
002 | Löscht rückwärts bis Zeilenanfang | 018 | Text-Editor: Ersetzen… | |
003 | - | 019 | Text-Editor: Suche… | |
004 | - | 020 | - | |
005 | Löscht bis Zeilenende | 021 | - | |
006 | - | 022 | - | |
007 | Text-Editor: Gehe zu Zeile… | 023 | Löscht bis Zeilenende | |
008 | Korrekturtaste, löscht ein Zeichen zurück | 024 | - | |
009 | TAB | 025 | - | |
010 | - | 026 | Springt zum Ende | |
011 | - | 027 | Esc | |
012 | Löscht gesamte Zeile | 028 | - | |
013 | Zeilenumbruch | 029 | - | |
014 | - | 030 | - | |
015 | - | 031 | - |
Der Text-Editor kann nur Zeilen bis zu einer Länge von 250 Zeichen verarbeiten, ein Wortumbruch würde den Binär-Code stören. Vor dem Laden ist es unbedingt erforderlich die Zeilenlänge auf 250 Zeichen (mehr geht nicht) einzustellen und den Wortumbruch auszuschalten!
Im System-Menü hat man die Möglichkeit eine Steuersequenz für Drucker vor jedem Druck zu senden. Diese Steuersequenzen können dezimal oder alphanumerisch eingegeben werden, sie werden beim Drucken binär ausgegeben. Da man den Ausdruck im Systemmenü auch in eine Datei umleiten kann, haben wir ein Werkzeug um Binärdateien zu erstellen.
Einschränkungen:
Die Steuersequenz darf höchstens 128 Bytes lang sein.
Die erzeugte Datei ist immer zwei Bytes länger als der eingegebene Code. Es werden leider zwei Null-Bytes am Ende angehängt. Das erstellte Programm sollte unbedingt einen definierten Ausstieg besitzen (z.B.: \180\076\176\000).
Als Beispiel ein einfaches „Hallo Welt!“-Programm:
Rufen Sie das System-Menü auf, und wählen sie „Ausdrucken“.
Ändern sie das Druckziel auf Datei und geben sie den gewünschten Dateinamen ein (z.B.: HALLO.COM).
Nun geben sie den gewünschten Binärcode unter „Anfangskontrollcode“ ein.
Zum Beispiel:
\180\009\186\009\001\205\033\205\032\072\097\108\108\111\032\087\101\108\116\033\036\180\076\176\000
Die ersten 9 Bytes sind Opcode, dann folgen die ASCII-Codes der Begrüßung, die letzten 4 Bytes sind der Programm-Ausstieg.
Öffnen sie eine leere Textdatei im Texteditor und drucken sie sie (verwenden sie das Menü, Alt_P ist eine DOS Funktion die den Kontrollcode nicht sendet), die Datei HALLO.COM wurde erzeugt. Verlassen sie den Texteditor und starten sie HALLO.COM
HALLO.COM ist 27 Bytes groß (null-Bytes inkl.)
Im obigen Beispiel wurden alle Bytes als dreistellige Dezimalzahlen eingegeben, um Platz zu sparen können alle „druckbaren“ Zeichen (von 32 bis 255) alfanumerisch eingegeben werden (siehe Benutzer-Handbuch).
Die Eingabe-Routine für den Anfangskontrollcode hat eine interessante Dynamik. Sie können Dezimalwerte (durch „\“ eingeleitete dreistellige Codes) und ASCII-Zeichen mischen. Die Eingabe-Routine konvertiert die Zeile sofort in das Platz-sparendste Format um. Dies hat keinen Einfluss auf die erzeugte Datei, es betrifft nur die Darstellung des Codes wärend der Bearbeitung.
Man sage nicht, der Portfolio biete keine eingebauten Programmier-Möglichkeiten!
Gibt Meldung aus.
Dieses Programm kann mit dem Text-Editor bearbeitet werden. Ab Byte 10 (077 bzw. 4D) beginnt die auszugebende Meldung, die bis zu 226 Zeichen lang sein kann und immer mit „$“ (036 bzw. 24) enden muss. Das Zeichen „$“ selbst wird dabei nicht mit ausgegeben. Ein Tabulator kann mit ASCII 009 erzeugt werden.
Dezimal:
180 009 186 009 001 205 033 205 032 077 069 083 083 065 071 069 036
Hexadezimal:
B4 09 BA 09 01 CD 21 CD 20 4D 45 53 53 41 47 45 24
Ein mit dem A72-Assembler erstelltes Listing des Quellcodes:
0100 B409 MOV AH,9 0102 BA0901 MOV DX,OFFSET MESSAGE 0105 CD21 INT 21H 0107 CD20 INT 20H 0109 4D45535341474524 MESSAGE DB "MESSAGE$"
Einfache Eingabe-Routine die Zeichen nicht übersetzt (anders als ECHO), zur Eingabe von ASCII-Werten mit der numerischen Tastatur (Alt_nnn). Durch Umleiten in eine Datei lassen sich so ASCII-Werte auch unter 32 eingeben.
Beispiel:
BLINDIN>USERIN.TXT
Die Zeichen werden bereits während der Eingabe in die Datei USERIN.TXT geschrieben. Leider kann man die eingegebenen Zeichen nicht sehen, sie werden aber als reine ASCII-Werte gespeichert.
Abgebrochen wird die Aufzeichnung mit Strg+C.
Programm-Code:
Dezimal:
180 001 205 033 235 250
Hexadezimal:
B4 01 CD 21 EB FA
In Debug sieht der Quellcode dazu so aus:
xxxx:0100 B401 MOV AH,01 xxxx:0102 CD21 INT 21 xxxx:0104 EBFA JMP 0100
Arbeitsprinzip: Die DOS-Funktion 01h („READ CHARACTER FROM STANDARD INPUT, WITH ECHO“) wird in einer Schleife ohne Abbruchbedingung aufgerufen. Funktion 01h prüft aber selbst, ob der Anwender Strg+C für einen Abbruch gedrückt hat.
Schön und gut, mit dem Printer Setup-Code haben wir also eine Möglichkeit Binärdateien zu erzeugen, die jegliche 8-Bit-Werte enthalten können (0..255). Aber mal ehrlich, die Lust am Programmieren ist schnell dahin, wenn man Byte für Byte in der nötigen Syntax (\xxx) eintippen muss. Außerdem ist die Darstellung der bereits eingegebenen Bytes nicht gerade komfortabel.
Hinzu kommt, dass die Länge des Setup-Codes auf 128 Bytes begrenzt ist, und die Eingabezeile maximal 250 Zeichen lang ist. Schlimmstenfalls kann man also nur 62 Bytes eingeben, da jedes Byte vier Zeichen lang ist (\xxx). Um mehr als nur 62 Bytes eingeben zu können, sollte man die Byte-Werte, wann immer es geht, alphanumerisch eingeben, oder man überlässt es der Eingaberoutine des Setup-Codes, indem man die Bytes schrittweise eingibt. Man gibt zum Beispiel die ersten 8 Werte ein, dann verlässt man die Eingaberoutine (durch drücken der Eingabetaste) um sie ernuet aufzurufen. Zu dem Zeitpunkt hat die Eingaberoutine die Bytes bereits auf das kürzest mögliche Format gewandelt. Nun kann man weitere Bytes am Ende einfügen. Man wiederhole dies, bis alle Bytes eingegeben wurden.
Dennoch wird man die maximale Länge von 128 Bytes nie erreichen, schon gar nicht überschreiten. Um all die Umstände und Einschränkungen zu beseitigen, sollte man sich eine Software schreiben die z.B. in Textform geschriebene Hexadezimal-Ketten in Binärdateien übersetzt. Ein solches Programm könnte durchaus kleiner als 128 Bytes sein. Nehmen wir die Mühe also einmal auf uns, um ein solches Programm zu schreiben, dann sind alle Einschränkungen behoben, und wir können von da an immer dieses Programm benutzen und können den Printer Setup-Code für immer vergessen.
Nennen wir das Programm z.B. HT2B.COM (Hex-Text to Bin). In diesem Beispiel ist es nur 67 Bytes lang, da es nur Zeichenketten übersetzt, das Lesen und Schreiben von Dateien übernimmt DOS mit Hilfe einer Stapelverarbeitungsdatei. Aber dazu später.
Um zum Beispiel das oben beschriebene „Hallo Welt!“-Programm zu erzeugen, würden wir es nicht mehr in den Printer Setup-Code eingeben, sondern in eine Text-Datei namens HALLO.HTX wie folgt:
B4 09 BA 09 01 CD 21 CD 20 48 45 4C 4C 4F 20 57 4F 52 4C 44 21 24 B4 4C B0 00 CD 21.
HT2B.COM soll dann alle Zeichen paarweise auswerten und binär ausgeben. Das Ende der Datei erkennt HT2B an dem „.“, werden die Bytes in eine Datei geschrieben, haben wir unser „Hallo-Welt!“-Programm.
HT2B selbst würde in solcher Form folgendermaßen aussehen:
B1 00 B4 07 CD 21 3C 2E 74 34 3C 1B 74 30 3C 30 72 F0 3C 46 77 EC 3C 39 77 05 2C 30 E9 06 00 3C 41 72 DF 2C 37 80 F9 00 75 0A B3 10 F6 E3 8A D0 FE C1 EB CE 00 C2 B4 02 CD 21 B1 00 EB C4 B4 4C B0 00 CD 21.
Aber nun müssen wir es erstmal erstellen, leider mühsam mit dem Printer Setup-Code, aber es lohnt sich, Augen zu und durch. Um die Zeile der Eingaberoutine des Setup-Codes möglichst kurz zu halten und alle Bytes unterbringen zu können, geben wir sie stufenweise ein, z.B.:
\177\000\180\007\205!<.t4<
\027t0<0r\240<Fw\236<9w\005,0\233
\006\000<Ar\223,7\128\249\000u\010\179
\016\246\227\138\208\254\193\235\206\000\194
\180\002\205!\177\000\235\196\180L\176\000\205!
Nun leiten wir die Druckausgabe in den Systemeinstellungen in eine Datei namens C:\HT2B.COM um, öffnen eine leere Text-Datei und drucken sie. Denken sie daran alle Druckereinstellungen auf „Null“ zu setzen (Ränder, Seitenlänge, und das Zeilenende auf nur CF. Haben wir alles richtig gemacht und auf Laufwerk C: war genügend Platz, ist unser Programm fertig.
Was machen wir nun damit? Was macht HT2B.COM? Starten wir es.
Geben sie C:HT2B in der DOS-Befehlszeile ein und drücken sie die Eingabetaste. HT2B erkennt nur Ziffern (0 bis 9) und die Zeichen A,B,C,D,E,F und den „.“, alle anderen Zeichen werden ignoriert. Da HT2B nur Großbuchstaben kennt, drücken sie die Feststelltaste. Nun geben sie Hexadezimalwerte ein, z.B.:
54657374
wie man sieht gibt HT2B, nachdem zwei gültige Zeichen eingegeben wurden, das entsrechende Byte aus. Um das Programm zu beenden drücken sie die .-Taste.
Wir wollen die Bytes aber nicht an der Konsole eingeben, und die Bildschirmausgabe bringt uns auch nichts. Nun, um das Programm klein und einfach zu halten, verwendet es nur die Standard Ein- und Ausgabe, Dateimanipulation würde viel Code brauchen. Aber kein Problem, lassen wir DOS die Arbeit machen und leiten die Ein- und Ausgabe mit Hilfe einer Stapelverarbeitungsdatei um: öffnen sie eine neue Datei in der Textverarbeitung und benennen sie sie HEX2COM.BAT:
@echo off if exist %1.com del %1.com ht2b <%1.htx >%1.com
In der zweiten Zeile wird eine evtl. bereits oder noch vohandene Zieldatei gelöscht. In der dritten Zeile findet die Umleitung statt: HT2B erhält die Eingabe von der angegebenen *.HTX-Datei und schreibt das Ergebnis in die entsprechende *.COM Datei.
Haben sie die Quelldatei HALLO.HTX wie oben beschrieben erzeugt (nie den „.“ am Ende vergessen!), können sie sie „kompilieren“ indem sie
HEX2COM HALLO
in die DOS Befehlszeile eingeben. HT2B wird dann die Datei HALLO.HTX auswerten und das Ergebnis in HALLO.COM ablegen.
Unsere neue „Entwicklungsumgebung“ besteht aus den Dateien HT2B.COM und HEX2COM.BAT. Nun können wir uns den schwierigen Umgang mit dem Printer Setup-Code für immer sparen und komfortabel jegliche Programme bis zu einer Größe von 32KB erzeugen (der Texteditor kann nur Dateien bis 64KB handhaben und man braucht mindestens 2 Zeichen pro Byte). Voraussetzung ist natürlich, man kennt sich mit Opcode-generierung für den 8086-Prozessor aus, oder man hat eine Quelle zum abtippen.
Wer das Generieren von Opcode lernen will kann sich im Internet informieren, z.B. hier