von tfhh » Fr 29. Nov 2013, 15:17
Moin Klaus,
kfischer hat geschrieben:das ist mir schon klar! Über die Port B Adresse $D301 = 54017 des PIAs kann ich eine Bank auswählen, aber wie kann ich in die ausgewählte Bank was reinpoken bzw. mit PUT# oder PRINT# was reinschreiben, z. B. eine Database oder eine Grafik?
Für das letztere braucht man wohl einen Gerätetreiber bspw. M: für Memory, oder? Kann mir vielleicht jemand einen solchen Treiber zur Verfügung stellen?
Nein, Du brauchst nichts - außer POKE und PEEK
Alle (nagut... die allermeisten) Speichererweiterungen betreiben ein seitenweises Bankswitching zwischen $4000-$7FFF (dez. 16384 - 32767). Das heißt, Du wählst durch entsprechenden POKE eine Speicherseite aus, und ab dann werden IMMER die jeweiligen Daten der Seite angezeigt, wenn Du etwas zwischen $4000-$7FFF liest oder schreibst. Bei Atari XE kompatiblen Speichererweiterungen (und sogenannten "Compy-Shop" kompatiblen Erweiterungen) kann man zusätzlich noch bestimmen, ob das Umschalten der Speicherseiten nur die CPU oder den ANTIC oder beides gilt. Es ist so möglich, einen Grafik-Screen z.B. in einer Speicherseite 1 zu halten, während in Speicherseite 2 der Code liegt. Oder was auch immer.
Die Herausforderung ist, daß Atari- wie auch Turbo-BASIC keinerlei Handling hierfür besitzt. Somit ist das "in Betrieb" umschalten einer Speicherseite natürlich gefährlich, denn wenn Dein BASIC-Programm in diesem Bereich liegt, ist im besten Falle ein ERROR, im schlimmsten Falle ein Aufhängen des laufenden BASIC-Programmes der Fall.
Basic-Programme (also die Tokens und Variablen-Speicher) sind generell nicht abhängig von einer bestimmten Adresse und können überall im Speicher liegen. Die Startadresse eines Basic-Programmes variiert (im Gegensatz z.B. zum C64 oder Schneider CPC464) beim XL/XE stark, je nachdem, ob überhaupt und wenn ja, was für ein DOS geladen wurde. Die meisten DOS-Versionen bedingen, daß Dein BASIC-Programm in etwa ab Adresse $1F00...$2100 beginnt. Wenn Du also gefahrlos ab $4000 bankswitchen willst, darf Dein BASIC-Programm zu Laufzeiten (d.h. inkl. Dimensionierung aller Variablen) nicht viel mehr als 6-7 KByte groß sein, um auf der sicheren Seite zu sein. Unter Turbo-BASIC ist der Bereich noch viel kleiner, da Turbo-BASIC einen höheren LOMEM hat, dafür aber "nach hinten" mehr Platz, da die 8 KByte für das Atari BASIC-ROM wegfallen.
Im Profibuch findest Du in der Zeropage ab Adresse 128 die von Atari-/Turbo-Basic bereitgestellten Pointer. Adresse 144, 145 (MEMTOP) z.B. sagt Dir, welche Adresse die letzte ist, die vom Basic inkl. Variablenspeicher in Verwendung ist. Man sollte also in seinem Basic-Programm möglichst alle Variablen definieren bzw. befüllen und dann MEMTOP abfragen. Solange MEMTOP < 16384 ist, ist alles safe. Vielleicht 100-200 Bytes Buffer zur Sicherheit mit hinzu
Unter Turbo-Basic XL ist MEMTOP nach Booten von DOS 2.5 bereits bei 14138, also kein ernsthaftes RAM mehr zwischen LOMEM und $4000 frei. Wenn ich früher (meistens sowieso nur mit Turbo-Basic) Experimente mit erweiterten Speicher gemacht habe, habe ich es daher so gelöst:
1. Vorladeprogramm (meistens als AUTORUN.BAS abgelegt):
10 DPOKE 743,32768
20 RUN "D:TEIL_2.BAS"
2. Das eigentliche Hauptprogramm wird dann stets oberhalb von $8000 geladen. Bei Graphics 0 bleiben knapp 15 KByte für Programm und Variablen zur Verfügung. Wenn große Grafik-Screens benötigt wurden, habe ich diese eben im Zusatz-RAM abgebildert. Und 15 KB reines Basic langt für vieles schon mal aus. Assembler-Routinen für I/O, PMG usw. habe ich dann halt VOR $4000 abgelegt und mit BLOAD direkt geladen. Ebenso Zeichensätze und Co., halt alles, was zwischen dem ehemaligem LOMEM und $4000 so reinpasst.
Gruß, Jürgen