Assembler-Ecke #11 -------------------- von Tim-Philipp Müller Diesmal geht's um die Sache mit dem zusätzlichen RAM - kurz ZRAM. Zwar haben nicht alle ihren Compy um 64,128, 192 oder gar 256 kByte aufgerüstet, doch angesichts ständig sinkender Preise für RAMs dürfte sich die Anzahl der Leute, die ihren XL/XE aufgerüstet haben, ständig erhöhen. Außerdem soll besprochen werden, wie man auf das RAM unter dem OS-ROM zugreift. Leider befinden sich nun aber eine Menge verschiedener Erweiterungen im Umlauf, die dummerweise auch nicht alle gleich angesprochen werden. Doch dazu später mehr. Zuerst möchte ich noch ein kleines Mißverständnis aus dem Weg räumen. Viele User sprechen davon, sie hätten nun eine '128K RAMDISK' auf ihrem XL/XE. Dabei sollte ausdrücklich betont werden, daß eine RamDisk nur eine von vielen Möglichkeiten ist, wie man das ZRAM benutzen kann. Als der 130XE erschien, hatte ATARI erstmals einen 8-Bitter auf den Markt gebracht, der mehr Speicher hatte als die CPU direkt adressieren konnte. Da ihr Adressbus nämlich nur 16 Bits breit ist, kann sie auch nur 2^16 Bytes, das sind 65536 Bytes oder 64K, ansprechen. Die Lösung nannte sich 'Bankswitching'. Mit dieser Technik ließ sich der reguläre RAM-Speicher von $4000-$7FFF ausblenden und stattdessen eine von vier 16K-Banks einblenden. Daß dabei der Inhalt der ausgeblendeten Bank erhalten bleibt, ist wohl klar. Gesteuert wird das Ganze über PORTB der PIA (das ist der Chip, der im Atari die Joystickports und beim XL/XE die 'MMU' Speicherverwaltung übernimmt). ------- PORTB --- $D301,54017 --------- Hier die 'traditionelle' Bit-Belegung für den 130XE. Für den normalen XL gelten nur die Bits 0,1 und 7. Bit 0 =1: von $C000-$FFFF Betriebsystem =0: von $C000-$FFFF RAM Bit 1 =1: von $A000-$BFFF RAM ?0: von $A000-$BFFF BASIC-ROM Bits 2+3: Nummer der von $4000-$7FFF einzublendenden 16K-Bank Bit 4 =1: CPU hat Zugriff auf normales RAM von $4000/$7FFF =0: CPU hat Zugriff auf die mit den Bits 2+3 ausgewählte 16K- Bank, die von $4000-$7FFF eingeblendet wird. Bit 5 =1: ANTIC hat Zugriff auf normal- RAM von $4000-$7FFF =0: ANTIC hat Zugriff aufs ZRAM. Bit 6 : unbenutzt Bit 7 =1: $5000-$57FF RAM =0: $5000-$57FF Selbsttest-ROM In der Praxis kann man immer die Bits 0 und 1 benutzen, um zu bestimmen, ob das jeweilige ROM aus- und eingeblendet werden soll. Über die Bits 0 und 1 läßt sich das OS- ROM ausschalten, damit kann man den so genannten 'verdeckten' Speicherbereich unterm ROM nutzen. Über die Bits 2 und 3 kann man auch immer zwischen den 16K-Bänken wählen. Nun zu den Bits 4 und 5: Möchte man mit dem normalen RAM arbeiten, setzt man die beiden Bits einfach auf 1. Theoretisch kann man die Bits auch so setzen, daß der ANTIC auf ZRAM zugreift und die CPU aufs normale RAM, dazu jedoch später mehr. Ist eines der beiden Bits auf 0 gesetzt worden und kein ZRAM vorhanden, wird übrigens das normale RAM wieder eingeblendet. Tja, mit Bit 2+3 kann man nun zwischen vier mal 16K wählen, also insgesamt nur 64K ZRAM. Nun gibt es aber auch Speichererweiterungen mit mehr als 64K. Da funktioniert das dann wie folgt: Man schaltet über 2 Bits die gewünschte 64K-Bank und über die Bits 2+3 daraus dann die jeweilige 16K-Bank. So kommt man insgesamt auf 4*64K also 256K ZRAM. Nur hier fangen die Probleoe jetzt an, denn die verschiedenen Hersteller haben sich auch verschiedene Bits zur Steuerung der 64K-Bänke ausgesucht: --------------------------------------- 64K XL/XE $E0 Bit 6 --------------------------------------- 128K XE $E0,$A0 Bit 6 --------------------------------------- 192K XL Newell $E0,$C0,$80 Bits 5+6 --------------------------------------- 256K XL Compy-Shop $C0,$A0,$60,$20 Bits 5-7 --------------------------------------- 256K XL Atari-Mag.I $E0,$C0,$A0,$80 Bits 6+7 --------------------------------------- 256K XL Atari-Mag.II $C0,$80,$40,$00 Bits 5+6 --------------------------------------- 256K XL Turbo-Freezer $E0,$B0,$A0,$90 Bits 4-7 --------------------------------------- Das dürften wohl so ziemlich die meist- verbreiteten Erweiterungen sein. Grundsätzlich entscheidet man über Bit 4 ($10), ob man das normale RAM (=1) oder das ZRAM (=0) nutzen möchte. Dabei sollte man als Programmierer davon ausgehen, daß der Zugriff hierbei für CPU und ANTIC gleich ist!!! (Also kann man die Spielerei beim 130XE vergessen) Allerdings gibt es auch beim Bit 4 Ausnahmen (siehe Turbo-Freezer). -------- Ansteuerung der Banks -------- Zusätzlich zu den angegebenen Bytes setzt man die Bits 0+1 und wählt die 16K-Bank über Bit 2+3 aus. (Das Programm TESTRD.ASM liefert gleiche Werte, bei denen auch noch die Bits 0-3 gesetzt werden müssen.) Theoretisch könnte man also bis zu 512K ZRAM verwalten (Bits 5-7 für die 64K- Bänke macht 8*64K=512K), allerdings kenne ich noch keine so große Erweiterung. Und wie man sieht, kann man bei den Bits 4-7 wild drauflosraten, welche Erweiterung denn nun auf was anspricht. Also ist ein RAMDISK-TESTER von Nöten. Und genau den findet Ihr auch als Listing auf der Rückseite der Disk im BIBO-Assembler-Format (TESTRD.ASM) Da ich den Sourcecode nicht übermäßig dokumentiert habe, erkläre ich ihn gleich hier: Zuerst werden alle Interrupts gesperrt: Die NMI's (VBI&DLI) über NMIEN $D40E und die IRQ's über den Assembler-Befehl SEI, damit beim Ausblenden des OS kein Dilemma geschieht. Nun Poke ich PORTB von 0 bis $FF durch und lösche jedesmal die Adresse $4000. Damit ist gesichert, daß bei jeder vorhandenen ZRAM-Bank das Testbyte (die Adresse $4000) gelöscht ist. Nun setze ich im Normal-RAM das Testbyte ungleich null. Anschließend folgt eine Schleife, bei der PORTB von $F0 bis auf $00 in $10-er Schritten runtergepoked wird, um die 64K-Banks zu testen. Ist nämlich nun das Testbyte gleich 0, handelt es sich um eine eingeblendete Bank, also wird das Steuerbyte dieser 64K-Bank in die Tabelle eingetragen, und das Testbyte dieser Bank auf ungleich null gesetzt. War das Testbyte vorher schon ungleich null, handelt es sich entweder um das Normale RAM oder eine schon registrierte ZRAM-Bank. Danach werden die Interrupts wieder eingeschaltet. ------------ Achtung ! ---------------- Eins ist hoffentlich jedem klar: Wenn eine andere Bank in $4000-$7FFF eingeblendet wird, sollte sich nach Möglichkeit das Programm, das gerade abgearbeitet wird, nicht innerhalb dieses Bereichs befinden, sonst könnte ein Absturz die folge sein. Gleiches gilt für den 'Trick' mit den RAM unterm OS-ROM. Wer das OS-ROM abschaltet, muß immer bedenken, daß es eine Reihe von Interrupts gibt, bei denen an eine OS-ROM Adresse gesprungen wird, z.B. der OS-VBI, der Tastatur- Interrupt etc. Diese sollte man vorher also möglichst entweder ausschalten oder umlenken. Ansonsten könnte es einen Blackout geben. Außerdem sind die CIO,etc. natürlich alles OS-Routinen! ------------ Anwendungen -------------- Für das RAM unterm OS-ROM gibt es eben- falls eine Reihe von Anwendungen: Manche DOS schieben nach Verlassen des DUP das DUP unters ROM, damit beim nächsten Aufruf das Nachladen entfällt (z.B. BIBO-DOS), oder man kann (wie die QUICK-Shell) nicht gebrauchte Programmteile hin- und her- kopieren, damit für den Anwender mehr freier Speicher zur Verfügung steht. Die bekannteste Anwendung für das ZRAM dürfte die gute, alte RAMDISK sein, allerdings gibt es natürlich noch ein paar weitere Möglichkeiten. Man denke nur an 256K digitalisierten Sound oder 32 Hi-Resolution Bilder, die man bei 256K ZRAM gleichzeitig im Speicher haben könnte! Hier eröffnen sich ganz neue Möglichkeiten, z.B. in Sachen DTP. Aber auch bei Spielen wäre es doch praktisch, wenn die letzten 32 Bilder im ZRAM gehalten würden. Man könnte sich bei Grafik-Adventures viel schneller bewegen, da lästiges Nachladen beim Zurückgehen entfiele. Ganz zu schweigen davon, daß man auch Double Density Disks kopieren kann, ohne Diskjockey zu spielen. Auch könnte man einen Cache-Speicher im ZRAM einrichten oder einen Druckbuffer. So, das sollte es erstmal wieder gewesen sein. User, die noch keine Erweiterung haben, sollten sich einen Kauf vielleicht nochmal überlegen. Aber man kann sich eine Erweiterung auch ziemlich leicht selbst basteln. Einen Bauplan gab's z.B. einmal im Atari Magazin 2/'87, aber fast alle Clubs bieten hier ebenfalls entsprechende Lösungen. Tschüß PS: Wer Lust hat mit mit Programme (nur selbstgeschrieben o. PD) oder Tips und Tricks zu tauschen, oder einfach nur irgendwo nicht weiterkommt, kann und soll mir schreiben: Tim-Philipp Müller Forsthöhe 8 2104 Hamburg 92 (über Rückporto bin ich nicht traurig, allerdings geht es auch ohne.) (Vielleicht habt Ihr aber auch Kritik oder Anregungen ?)