TT-Manipulation auf 24 Bit

Busfehler beim Starten des TEMPUS-Editors auf dem TT? Busfehler beim Starten von Chemplot? Busfehler beim Starten von ...? Dem kann abgeholfen werden. Durch geeignete Programmierung der IM 68030 integrierten PMMU gehören solche Probleme der Vergangenheit an.

Die meisten TT-Besitzer dürften bereits festgestellt haben, daß sich manche Programme direkt nach dem Start mit einem Busfehler (also zwei Bomben) verabschieden. Ursache für solche Fehler ist in vielen Fällen unsaubere Programmierung. War es beim ST noch möglich (aber nicht erlaubt!), die oberen 8 Bits einer Adresse für eigene Zwecke zu mißbrauchen, so schiebt der 68030-Prozessor des TT hier einen Riegel vor. Da der 68030 einen 32-Bit-Adreßbus besitzt, werden stets alle Bits einer Adresse zur Adreßberechnung eingesetzt. Beim 68000 hingegen werden die oberen 8 Bits ignoriert, da dieser Prozessor nur einen 24 Bit breiten Adreßbus besitzt.

Bereits in [1] habe ich kurz auf ein Programm hingewiesen, das sich 24BIT.PRG nennt und von Atari Amerika entwickelt wurde. 24BIT programmiert die PMMU (Paged Memory Management Unit), die ein Bestandteil des 68030-Prozessors ist, derart um, daß die oberen 8 Adreß-Bits ignoriert werden. So ist es möglich, auch Programme auf dem TT einzusetzen, die diese Bits für Tricks zweckentfremden.

Und ist Atari nicht willig...

Atari Deutschland ist jedoch nicht bereit, das Programm 24BIT der breiten Öffentlichkeit zugänglich zu machen. Diese Entscheidung wird damit begründet, daß Hilfsprogramme dieser Art in erster Linie unsauber programmierte Programme unterstützen, und daß es besser sei, so zu programmieren, daß Programme wie 24BIT nicht benötigt werden. Unrecht hat Atari damit sicher nicht, aber andererseits bin ich der Meinung, daß es so lange sinnvoll ist, auf dieses Programm zurückzugreifen, bis alle Software-Firmen ihre Produkte TT-fest gemacht haben. Die momentane Entwicklung ist hier durchaus positiv zu bewerten.

... so brauch’ ich FIX24

Wie dem auch sei, wenn 24BIT.PRG nicht jedem TT-User zur Verfügung steht, so kann man das ja ändern, indem man sich selber ein solches Programm zusammenstrickt. Oder verwenden Sie doch gleich das hier vorgestellte Programm FIX24.PRG.

Was die PMMU betrifft, habe ich einige theoretische Grundlagen bereits in [1] erläutert. Insbesondere ging es dabei um die zur Adreßübersetzung erforderlichen Deskriptor-Tabellen. Auf dieser Basis stellt es keinen übermäßig großen Aufwand dar, sich mit weiteren Möglichkeiten der PMMU zu beschäftigen.

Kommt Zeit, kommt Rat

Um das 24-Bit-Problem auf dem TT zu lösen, ist es zunächst einmal wichtig, sich vor Augen zu führen, wie die Busfehler beim Zugriff auf den 32-Bit-Adreßbus eigentlich Zustandekommen. Ich möchte dies am Beispiel des TEMPUS-Texteditors erläutern, da ich mich mit diesem Programm besonders intensiv beschäftigt habe, wie Sie später noch sehen bzw. lesen werden. Die Devise müßte also treffender heißen: Kommt TEMPUS, kommt Busfehler.

Für jede Textzeile existiert in TEMPUS ein Pointer, der auf den Beginn dieser Zeile zeigt. Da der MC68000 die oberen 8 Bits dieses Pointers nicht zur Adreßberechnung heranzieht, ist deren Inhalt im Normalfall ungenutzt. Der Editor versucht nun dadurch Speicherplatz zu sparen, daß er in diesem Byte noch eine weitere Information, und zwar die Länge der Zeile, unterbringt. So weit läßt sich eigentlich nichts gegen dieses Vorgehen sagen. Allerdings wird beim Ansprechen der zu einem Pointer gehörigen Textzeile nicht dafür gesorgt, daß das obere Byte für den Buszugriff ausgeblendet wird. Und genau hier liegt der Haken und somit die Ursache für den Busfehler. Das geschilderte Vorgehen bringt TEMPUS übrigens eine minimale Zeitersparnis und ist einer von vielen Gründen, warum TEMPUS zu den schnellsten Editoren für den ST gehört.

Je nach Zeilenlänge befindet sich im oberen Byte der Adresse, die der Prozessor auf den Bus ausgibt, ein Wert zwischen 0 und 255. Im Falle einer 0 passiert weiter nichts Sensationelles. Ist die Zeile jedoch genau ein Zeichen lang, führt der Speicherzugriff nicht mehr ins ST-RAM, sondern (falls vorhanden) ins TT-RAM. Dies liegt daran, daß das ST-RAM den Adreßbereich $00xxxxxx belegt, das TT-RAM sich ab $01000000 befindet. Je nachdem, wieviel TT-RAM vorhanden ist, kann es sein, daß auch bei Zeilenlängen von 2 Bytes kein Fehler auftritt, da ja stets ein Zugriff aufs RAM (wenn auch im falschen Bereich) stattfinden kann. Bei einem Rechner mit 4 MByte TT-RAM führt ein Zugriff auf den Adreßbereich $02xxxxxx jedoch bereits zum Absturz in Form eines Busfehlers.

Außerdem bleibt festzuhalten, daß in diesem Zusammenhang auch ein Zugriff in den Adreßraum ab $01000000 nicht mehr korrekt ist. Schließlich ist hier die Adresse aufgrund der 1 im höchstwertigen Byte bereits fehlerhaft. Nur führt dieser Umstand nicht zu einem Absturz, solange der Prozessor RAM vorfindet. Lediglich alle Textzeilen der Länge 1 sind in solchen Fällen irgendwie fehlerhaft.

Bild 1: CRP und Deskriptor-Tabellen

Bild 2: CACR, TC, TT0/TT1

Die Idee

Wie man leicht erkennt, steht und fällt alles mit den 8 höchstwertigen Adreß-Bits. Könnte man den Prozessor dazu bringen, diese Bits zu ignorieren, wäre man einen Schritt weiter. Ein Zugriff auf Adressen ab $01000000 wäre dann jedoch nicht mehr möglich, da das obere Adreß-Byte ständig eine Null enthalten würde. Daraus resultiert jedoch auch der Nachteil einer solchen Notlösung: Man muß auf das schnelle TT-RAM verzichten, so daß neben dem Geschwindigkeitsverlust je nach TT-Modell nur noch 2 bzw. 4 MByte Hauptspeicher zur Verfügung stehen. Außerdem kann das in [1] vorgestellte Programm ROMSPEED nicht mehr eingesetzt werden. Aber was akzeptiert man nicht alles, um den TT möglichst ST-kompatibel zu machen...

Die Werkzeuge

Um das Programm FIX24 zu realisieren, müssen wir uns erneut mit der PMMU des 68030 auseinandersetzen. Von den zahlreichen MMU-Registern sollte bereits der CRP (CPU Root Pointer) bekannt sein. Außerdem haben wir bereits den Aufbau der Deskriptor-Tabellen kennengelernt. Um das Gedächtnis ein wenig aufzufrischen, gibt Bild 1 einen Überblick.

Für FIX24 ist es notwendig, sich mit weiteren Registern anzufreunden. Hierbei handelt es sich zunächst um das CACR (CAche Control Register). Hinzu kommen die beiden Register TT0 und TT1 (Transparent Translation-Register) sowie das TC-Register (Translation Control). Auch die uns bereits bekannte Deskriptor-Tabeile ab Adresse $700 mischt wieder mit. Wie wir ja jetzt wissen (Zitat für Insider), wird mit ihrer Hilfe der logische Adreßraum auf den physikalisch vorhandenen Speicher abgebildet.

Alle Register ziehen

Wie sind nun die benötigten Register aufgebaut? Bild 2 zeigt einen Überblick. Zunächst soll uns das CACR interessieren. Hier findet man die folgende Bit-Zuordnung:

WA (Write Allocate Bit): Ist dieses Bit gesetzt, wird beim Schreiben von Daten ein Cache-Eintrag erzeugt, wenn für die angesprochene Adresse ein solcher noch nicht existiert. Bei gelöschtem Bit und nicht existentem Cache-Eintrag für diese Adresse wird der Cache nicht verändert.

DBE (Data Burst Enable Bit): Dieses Bit kontrolliert, ob der Cache im burst mode des 68030 gefüllt werden soll oder nicht. Wir erinnern uns: Der burst mode wird vom TT-RAM unterstützt und sorgt dafür, daß der Prozessor-Cache besonders schnell gefüllt wird.

CD (Clear Data Cache Bit): Sobald das CD-Bit gesetzt wird, werden alle Einträge im Daten-Cache gelöscht.

CED (Clear Data Cache Entry Bit): Ein einzelner Cache-Eintrag kann durch das Setzen dieses Bits gelöscht werden. Der Index dieses Eintrags muß vorher in einem speziellen Register, dem CAAR (CAche Address Register), vermerkt werden.

FD (Freeze Data Cache Bit): Soll der aktuelle Inhalt des Daten-Cache eingefroren werden, muß das FD-Bit gesetzt werden. Sofern Daten, die sich im Cache befinden, durch Schreibzugriffe verändert werden, wird der Cache natürlich weiterhin aktualisiert.

ED (Enable Data Cache Bit): Durch Setzen dieses Bits kann der Daten-Cache aktiviert werden, Löschen des ED-Bits sorgt für das Abschalten des Daten-Caches.

IBE, CI, CEI, FI, EI: Diese Bits korrespondieren mit den bereits besprochenen Bits. Alle Funktionen beziehen sich hier lediglich auf den Befehls- und nicht auf den Daten-Cache.

Die nicht verwendeten Bits des CACR sind übrigens reserviert und dürfen nicht gesetzt werden.

Totale Kontrolle

Kommen wir zum Translation Control-Register TC. Auch hier eine Zusammenfassung der Bedeutung der belegten Bits:

E (Enable Bit): Ist dieses Bit gelöscht, findet keine Adreßübersetzung statt. Sobald das E-Bit gesetzt wird, beginnt die MMU mit ihrer Arbeit.

SRE (Supervisor Root Enable Bit): Sollen Zugriffe aus dem Supervisor-Modus anders übersetzt werden, als es für Zugriffe aus dem User-Modus der Fall ist, muß dieses Bit gesetzt werden. Der SRP (Supervisor Root Pointer) enthält für diesen Fall die Adresse einer Übersetzungstabelle. Enthält das SRE-Bit eine Null, werden User- und Supervisor-Zugriffe in der Regel gleich behandelt. Dies hängt jedoch auch vom FCL-Bit ab.

FCL (Function Code Lookup Bit): Ist dieses Bit gesetzt, findet die Adreßübersetzung in Abhängigkeit vom Zustand der Function-Code-Bits (FC2-FC0) statt. Hierdurch wird es möglich, Zugriffe auf Daten- und Programmbereiche im User- und Supervisor-Modus unterschiedlich zu übersetzen.

PS (Page Size): Diese vier Bits bestimmen die Größe einer Speicherseite gemäß folgender Zuordnung:

1000 256 Bytes
1001 512 Bytes
1010 1024 Bytes
1011 2048 Bytes
1100 4096 Bytes
1101 8192 Bytes
1110 16384 Bytes
1111 32768 Bytes (normal für TT)

Je nach Wert des PS-Feldes wird also eine gewisse Zahl der niederwertigen Adreß-Bits nicht für die Übersetzung herangezogen. Eine Seitengröße von 32 kByte fordert seitens der MMU den geringsten Verwaltungsaufwand.

IS (Initial Shift Count): Ähnlich wie das PS-Feld definiert IS Bits, die nicht zur Adreßübersetzung verwendet werden. Hier handelt es sich jedoch nicht um die niederwertigen, sondern um die höchstwertigen Adreß-Bits.

TIA, TIB, TIC, TID: Diese Felder legen fest, wieviele Bits zur Indizierung der einzelnen Ebenen der Deskriptort-Tabelle herangezogen werden.

Last but not least

Abschließend widmen wir uns noch den Transparent-Translation Registern TT0 und TT1. (Diese beiden Register existieren nur beim 68030, nicht jedoch bei der externen PMMU 68851.) Mit ihrer Hilfe ist es möglich, Speicherfenster zu definieren, die nicht von der Adreßübersetzung betroffen sind. Die Adreßbasis definiert dabei den Beginn einer solchen Adresse, der auf einer 16 MByte-Grenze liegen muß. Über die Adreßmaske kann die Größe dieses Bereichs eingestellt werden, und zwar in Schritten von 16 MByte. Die restlichen Bits von TT0 bzw. TT1 sind wie folgt belegt:

E (Enable Bit): Mit diesem Bit werden TT0/TT1 aktiviert.

CI (Cache Inhibit Bit): Soll der Cache innerhalb der transparenten Speicherfenster nicht verwendet werden, muß dieses Bit gesetzt werden.

R/W (Read/Write Bit): In Verbindung mit dem RWM-Bit kann die MMU so eingestellt werden, daß nur Lese- oder Schreibzyklen übersetzt werden. Eine 1 in diesem Bit besagt, daß nur Lesezyklen von der Übersetzung betroffen sind. Ist das R/W-Bit gelöscht, werden nur Schreibzyklen übersetzt.

RWM (Tja, über die Bedeutung des M in diesem Kürzel rätsele ich immer noch ...): Natürlich muß es möglich sein, nicht wahlweise entweder Leseoder Schreibzyklen übersetzen zu lassen, sondern alle Zugriffe auf den Speicher. Dies ist der Fall, wenn das RWM-Bit gesetzt ist.

FCB (Function Code Base): Diese Bits geben an, welchen Inhalt die Function Code-Bits haben müssen, damit eine Adreßübersetzung im transparenten Speicherbereich erfolgt.

FCM (Function Code Mask): Falls gewisse Function Code-Bits für die Übersetzung nicht relevant sein sollen, können diese anhand der FCM-Maske ausmaskiert werden.

So, damit hätten wir die für uns interessanten Register abgehandelt. Aber keine Sorge: Es gibt noch weitere, wobei die restlichen nicht von Bedeutung sind. Was die angesprochenen Register betrifft, so ist es in diesem Rahmen nicht möglich, deren Bedeutung erschöpfend zu behandeln. Für ausführliche Erklärungen sollte man auf [2], [3] oder [4] zurückgreifen.

Nun zur Funktionsweise von FIX24. Bevor der Speicher vom Programm durcheinandergewürfelt wird, muß zunächst der Cache gelöscht und des-aktiviert werden. (Sobald der Desktop aufgebaut wird, wird der Cache wieder eingeschaltet, falls dies in der Desktop-Info vermerkt ist.) Anschließend wird die Adreßübersetzung zunächst gestoppt. Hierzu genügt es, das Enable-Bit im TC-Register zu löschen. Da der 68030 es nicht unterstützt, MMU-Register per CLR-Befehl zu löschen (die externe PMMU 68851 bietet diese Möglichkeit), wird der benötigte Wert aus dem Speicher geholt. Da alle Adreßbereiche in die ersten 16 MByte abgebildet werden sollen, müssen noch beide Transparent Translation-Register gelöscht werden. Auch hier werden die benötigen Daten aus dem Speicher geholt.

Nachdem die Adreßübersetzung nicht mehr aktiv ist, können die neuen Übersetzungstabellen aufgebaut werden. Deren Struktur ist recht einfach, da alle logischen Adressen auf den gleichen physikalischen Bereich abgebildet werden.

Um nun die Adreßübersetzung mit den neuen Tabellen zu starten, wird das Translation Control-Register entsprechend geladen. PS und IS behalten die im Normalbetrieb des TT gültigen Werte bei, das Enable-Bit muß auf 1 gesetzt sein, damit eine Adreßübersetzung stattfindet.

Sind alle Aktionen abgeschlossen, wird FIX24 über einen Aufruf der Funktion PTERMRES verlassen, bei dem als Zahl der resident zu haltenden Bytes eine Null übergeben wird. Dieses seltsame Vorgehen hat jedoch seine Gründe. Zwar hat das eigentliche Programm seine Arbeit getan und wird nicht mehr benötigt, aber der mittels MXALLOC angeforderte Speicher (also das gesamte TT-RAM) darf nicht wieder freigegeben werden. Dies wäre jedoch bei einem Programmende über PTERM0 oder TERM der Fall.

Da nicht jeder Leser im Besitz eines Assemblers für den 68030 sein dürfte, ist neben dem Assembler-Quelltext von FIX24 auch ein kleines Programm in GFA-BASIC abgedruckt, das die entsprechende Programmdatei direkt erzeugt. Apropos Assembler: Beim Arbeiten mit dem MAS von Borland (im Lieferumfang zu TURBO C 2.0 Professional enthalten) mußte ich feststellen, daß der MAS fehlerhafte Opcodes für Befehle erzeugt, die die beiden Transparent Translation-Register ansprechen. Besitzer des MAS sollten aus diesem Grund gar nicht erst versuchen, FIX24.S mit diesem Assembler zu assemblieren, sondern gleich auf das BASIC-Programm zurückgreifen.

Was FIX24 betrifft, überprüft das Programm vor den MMU-Aktionen natürlich, ob es überhaupt auf einem TT gestartet wurde. Ist das TT-RAM nicht leer, wird keine Aktion vorgenommen, da dies zum Absturz führen könnte. Schließlich würde ein residentes Programm, welches sich im TT-RAM befindet, auf Nimmerwiedersehen verschwinden. FIX24 muß deshalb aus dem AUTO-Ordner heraus gestartet werden, da nämlich spätestens der TT-Desktop Gebrauch vom TT-RAM macht.

Übrigens: Der Programm-Header von FIX24 darf auf keinen Fall so manipuliert werden, daß das Programm ins TT-RAM geladen wird. Andernfalls stellt FIX24 natürlich fest, daß dieser RAM-Bereich nicht leer ist und kann sich somit nicht installieren.

Problemfall TEMPUS

Nachdem Programme, die die oberen 8 Adreß-Bits mißbrauchen, nun auf dem TT einsatzfähig sind, werden einige Leser vielleicht versuchen, den TEMPUS Texteditor in der Version 2.10 wieder hervorzukramen. Schließlich sollte es möglich sein, TEMPUS mit Hilfe von FIX24 auf dem TT ohne Absturz zum Laufen zu bringen. In der Tat geschieht nichts Ungewöhnliches, wenn man TEMPUS nach der Installation von FIX24 startet. Beim Arbeiten treten zunächst keine Probleme auf. Verläßt man TEMPUS jedoch, gibt es einen dieser besonders netten TT-Abstürze, bei denen der Bildschirm im Nirwana verschwindet und gar nichts mehr geht.

Woran das nun wieder liegt? Nun, TEMPUS besitzt einen integrierten Bildschirmschoner, der sich eines Verfahrens bedient, das man seinem Monitor zuliebe nicht verwenden sollte: Zum Abschalten des Bildschirms wird auf externe Bildsynchronisation geschaltet. Beim ST sorgt dies dafür, daß das Bild verschwindet. Beim TT dagegen kann bei Manipulationen des entsprechenden Bits der Adresse SFF820A ein Absturz die Folge sein. Selbst wenn der Bildschirmschoner von TEMPUS abgeschaltet ist, greift das Programm beim Verlassen auf das bewußte Bit zu. Das Ergebnis ist uns ja nun bekannt.

Ein kleiner, wenn auch nicht ganz sauberer Patch schafft hier Abhilfe. Zugriffe auf die Adresse $FF820A kommen innerhalb von TEMPUS nicht übermäßig häufig vor. Mit geringem Aufwand ist es möglich, dem Editor einfach eine andere, ungenutzte Adresse unterzujubeln. Alles, was man dazu braucht, ist ein Diskmonitor, mit dem man alle Byte-Folgen $FF820A innerhalb der TEMPUS-Programmdatei aufsucht und durch $001000 ersetzt. ($1000 stellt eine ungefährliche Dummy-Adresse dar, aber gerade das macht diesen Patch unsauber.) Nach dieser kosmetischen Operation kann TEMPUS auf dem TT in der mittleren und hohen ST-Auflösung benutzt werden. Ist doch eigentlich ganz einfach, oder?

Übrigens soll es demnächst eine TEMPUS-Version geben, für die solche Kunstgriffe nicht mehr nötig sind. Über diese Version wird sich sicherlich auch die Firma Atari freuen, zeigt es doch, daß trotz 24BIT.PRG und FIX24.PRG Programme konsequent TT-tauglich gemacht werden.

Literatur:

[1] „Speed without the price - TT-Tuning“, ST-Computer 3191

[2] „MC68030 32-Bit Microprocessor User's Manual“, Motorola Inc.

[3] „MC68851 Paged Memory Management Unit User's Manual“, Motorola Inc.

[4] Steve Williams, „68030 Assembly Language Reference“, Addison-Wesley Publishing Company Inc.

**************************************
*                                    *
* FIX24.PRG                          *
*                                    *
* beschränkt Adressierung auf 24 Bit *
*                                    *
* by Uwe Seimet  (c) MAXON Computer  *
*                                    *
**************************************


GEMDOS   = 1
CCONWS   = 9
SUPER    = 32
PTERMRES = 49
MXALLOC  = 68
TERM     = 76


_p_cookies = $5a0                   ;Pointer auf
                                    ;cookie-jar


magic    = $1357bd13 

         text

         clr.l -(sp)
         move #SUPER,-(sp) 
         trap #GEMDOS 
         addq.l #6,sp 
         move.l d0,d7
         moveq #-1,d6               ;Fehlerflag
                                    ;setzen
         lea sterr(pc),a6
         move.l _p_cookies,d0
         beq quit                   ;kein
                                    ;cookie jar-

         move.l d0,a0 
cloop:   movem.l (a0)+,d0-d1
         tst.l d0
         beq quit                   ;Ende des
                                    ;cookie jar-
         cmp.l #"_MCH",d0           ;Computertyp?
         bne cloop                  ;nein-
         swap d1
         subq.l #2,d1               ;TT?
         bne quit                   ;nein-
         cmp.l #magic,$5a8          ;TT-RAM
                                    ;vorhanden? 
         bne.b noram                ;nein-
         move.l $5a4,d0             ;Ende des
                                    ;TT-RAM
         cmp.l #$1000000,d0
         ble.b noram                ;kein
                                    ;TT-RAM-
         lea ramerr(pc),a6
         sub.l #$1000000,d0         ;ergibt Größe
                                    ;des TT-RAM 
         move #1,-(sp)              ;TT-RAM
         move.l d0,-(sp)            ;belegen
         move #MXALLOC,-(sp) 
         trap #GEMDOS 
         addq.l #8,sp 
         tst.l d0
         beq.b quit                 ;TT-RAM ist
                                    ;nicht leer-
noram:   movec.l cacr,d0            ;Cache
         or #$0808,d0               ;löschen
         and #$fefe,d0              ;und
         movec.l d0,cacr            ;abschalten
         pmove dummy,tc             ;Übersetzung
                                    ;anhalten
         pmove dummy,tt0 
         pmove dummy,tt1 
         lea $0700,a0 
         moveq #15,d0 
fill1:   move.l #$00000742,(a0)+    ;Ebene 0
         dbra d0,fill1 
         moveq #15,d0 
fill2:   move.l #$000007c2,(a0)+    ;Ebene 1
         dbra d0,fill2 
         moveq #1,d1 
         moveq #14,d0 
fill3:   move.l d1,(a0)+            ;Ebene 2
         add.l #$00100000,d1
         dbra d0,fill3
         move.l #$00f00041,(a0)     ;für ROM-
                                    ;Übersetzung
         pmove trans,tc             ;Übersetzung
                                    ;neu starten
         lea message(pc),a6
         clr d6                     ;Fehlerflag
                                    ;zurücksetzen
quit:    move.l d7,-(sp)
         move #SUPER,-(sp) 
         trap #GEMDOS 
         addq.l #6,sp 
         pea (a6)
         move #CCONWS,-(sp) 
         trap #GEMDOS 
         addq.l #6,sp 
         move d6,-(sp) 
         bmi.b error 
         clr.l -(sp) 
         move #PTERMRES,-(sp) 
         trap #GEMDOS

error:
         move #TERM,-(sp) 
         trap #GEMDOS

trans:   dc.l $80f04445             ;für TC-Register

sterr:   dc.b $0d,$0a,"FIX24 läuft nur "
         dc.b "auf dem TT!",$0d,$0a,$00 
message: dc.b $0d,$0a,"FIX24 V1.0 " 
         dc.b "installiert",$0d,$0a 
         dc.b "(c) 1991 by MAXON",$0d,$0a,$00 
ramerr:  dc.b $0d,$0a,"Das TT-RAM ist "
         dc.b "nicht leer!",$0d,$0a,$00


         bss

dummy:   ds.l 1                     ; für TC-Register

Listing 1: FIX24.S

OPEN "O",#1,"FIX24.PRG"
FOR i=1 TO &H18E 
    READ byte
    PRINT #1,CHR$(byte);
NEXT i 
CLOSE #1
DATA &60,&1A,&00,&00,&01,&6A,&00,&00,&00,&00,&00,&00,&20,&04,&00,&00
DATA &00,&00,&00,&00,&00,&00,&00,&00,&00,&01,&00,&00,&42,&A7,&3F,&3C 
DATA &00,&20,&4E,&41,&5C,&8F,&2E,&00,&7C,&FF,&4D,&FA,&00,&EA,&20,&38 
DATA &05,&A0,&67,&00,&00,&B8,&20,&40,&4C,&D8,&00,&03,&4A,&80,&67,&00 
DATA &00,&AC,&B0,&BC,&5F,&4D,&43,&48,&66,&EE,&48,&41,&55,&81,&66,&00
DATA &00,&9C,&0C,&B8,&13,&57,&BD,&13,&05,&A8,&66,&28,&20,&38,&05,&A4 
DATA &B0,&BC,&01,&00,&00,&00,&6F,&1C,&4D,&FA,&00,&FD,&90,&BC,&01,&00 
DATA &00,&00,&3F,&3C,&00,&01,&2F,&00,&3F,&3C,&00,&44,&4E,&41,&50,&8F 
DATA &4A,&80,&67,&68,&4E,&7A,&00,&02,&80,&7C,&08,&08,&C0,&7C,&FE,&FE 
DATA &4E,&7B,&00,&02,&F0,&39,&40,&00,&00,&00,&01,&6A,&F0,&39,&08,&00 
DATA &00,&00,&01,&6A,&F0,&39,&0C,&00,&00,&00,&01,&6A,&41,&F8,&07,&00 
DATA &70,&0F,&20,&FC,&00,&00,&07,&42,&51,&C8,&FF,&F8,&70,&0F,&20,&FC 
DATA &00,&00,&07,&C2,&51,&C8,&FF,&F8,&72,&01,&70,&0E,&20,&C1,&D2,&BC 
DATA &00,&10,&00,&00,&51,&C8,&FF,&F6,&20,&BC,&00,&F0,&00,&41,&F0,&39 
DATA &40,&00,&00,&00,&00,&F6,&4D,&FA,&00,&4E,&42,&46,&2F,&07,&3F,&3C 
DATA &00,&20,&4E,&41,&5C,&8F,&48,&56,&3F,&3C,&00,&09,&4E,&41,&5C,&8F 
DATA &3F,&06,&6B,&08,&42,&A7,&3F,&3C,&00,&31,&4E,&41,&3F,&3C,&00,&4C 
DATA &4E,&41,&80,&F0,&44,&45,&0D,&0A,&46,&49,&58,&32,&34,&20,&6C,&84 
DATA &75,&66,&74,&20,&6E,&75,&72,&20,&61,&75,&66,&20,&64,&65,&6D,&20 
DATA &54,&54,&21,&0D,&0A,&00,&0D,&0A,&46,&49,&58,&32,&34,&20,&56,&31 
DATA &2E,&30,&20,&69,&6E,&73,&74,&61,&6C,&6C,&69,&65,&72,&74,&0D,&0A 
DATA &BD,&20,&31,&39,&39,&31,&20,&62,&79,&20,&55,&77,&65,&20,&53,&65 
DATA &69,&6D,&65,&74,&0D,&0A,&00,&0D,&0A,&44,&61,&73,&20,&54,&54,&2D 
DATA &52,&41,&4D,&20,&69,&73,&74,&20,&6E,&69,&63,&68,&74,&20,&6C,&65 
DATA &65,&72,&21,&0D,&0A,&00,&00,&00,&00,&7C,&08,&08,&3A,&00

Listing 2: FIX24.LST


Uwe Seimet
Links

Copyright-Bestimmungen: siehe Über diese Seite