Zusatzspeicher unter BASIC


Zusatzspeicher unter BASIC

von kfischer » Do 28. Nov 2013, 19:38
Moinsen,

ich hab mal eine Frage zum Zusatzspeicher. Bekanntlich liegen die einzelnen Bänke der Erweiterung immer zwischen $4000 und $7FFF. Wie kann ich unter BASIC eine bestimmte Bank auswählen und dort etwas hineinschreiben? Wenn ich ganz normal etwas zwischen $4000 und $7FFF hineinpoke, dann wird ja erst einmal in den Hauptspeicher geschrieben. Kann man nicht unter BASIC den Zeiger auf eine beliebige Bank des Erweiterungsspeichers setzen?

Gruß,
Klaus

Re: Zusatzspeicher unter BASIC

von wwl » Do 28. Nov 2013, 22:33
Ich denke, das wird davon abhängen, was Du für eine Erweiterung hast!

Re: Zusatzspeicher unter BASIC

von kfischer » Do 28. Nov 2013, 23:07
Nun, es geht mir eigentlich nur ums Prinzip, aber wenn du schon fragst ... 256K XRAM mit den Blöcken 26AE, also kompatibel zur CompyShop-Erweiterung.

Re: Zusatzspeicher unter BASIC

von GoodByteXL » Fr 29. Nov 2013, 09:34
kfischer hat geschrieben:Moinsen,

ich hab mal eine Frage zum Zusatzspeicher. Bekanntlich liegen die einzelnen Bänke der Erweiterung immer zwischen $4000 und $7FFF. Wie kann ich unter BASIC eine bestimmte Bank auswählen und dort etwas hineinschreiben? Wenn ich ganz normal etwas zwischen $4000 und $7FFF hineinpoke, dann wird ja erst einmal in den Hauptspeicher geschrieben. Kann man nicht unter BASIC den Zeiger auf eine beliebige Bank des Erweiterungsspeichers setzen?

Gruß,
Klaus

Moijn!
Port B der PIA, 54017. Die Werte kann man leicht anhand der Tabelle im Profibuch, S. 231 ermitteln. Alternativ einen RAM-Tester verwenden, z.B. XRAM.

Re: Zusatzspeicher unter BASIC

von Sleepy » Fr 29. Nov 2013, 09:54
Was auch zu beachten ist wäre daß das gerade laufende Programm nicht ungewollt auf den gerade ausgeblendeten Speicherbereich zugreift.

Sleepy

Re: Zusatzspeicher unter BASIC

von kfischer » Fr 29. Nov 2013, 12:15
Moin,

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?

Gruß
Klaus

Re: Zusatzspeicher unter BASIC

von dl7ukk » Fr 29. Nov 2013, 12:30
Hi,

so einfach dürfte es unter Basic nicht getan sein eine Speicherbank zu wechseln. Du müsste auch wissen, wo(!) Basic genau seine Daten und den Programmcode des BAS Progs ablegt.

kfischer hat geschrieben:Moin,
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?


Der ATARI "merkt" doch gar nicht, dass nur ein Speicherbereich ausgetauscht wurde. 64K sind 64K

Re: Zusatzspeicher unter BASIC

von dl7ukk » Fr 29. Nov 2013, 12:38
Hi,

so einfach dürfte es unter Basic nicht getan sein eine Speicherbank zu wechseln. Du müsste auch wissen, wo(!) Basic genau seine Daten und den Programmcode des BAS Progs ablegt. Das Wechseln der Bank ist nicht das Problem.

kfischer hat geschrieben:Moin,
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?


Der ATARI "merkt" doch gar nicht, dass nur ein Speicherbereich ausgetauscht wurde. 64K sind 64K

Re: Zusatzspeicher unter BASIC

von eda70 » Fr 29. Nov 2013, 13:17
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?

Meiner Meinung nach - ich habe es noch nie gamacht - wird der eingeblendete Speicher wie ganz normaler RAM genutzt. Nur statt in den Ram zu schreiben wird in die eingeblendete Speicherbank geschrieben.

Als BSP. Bank 1 einblenden Bild eins in den Speicher laden, Bank 2 einblenden Bild zwei an genau die gleiche Speicherstelle schreiben usw.usf, dann den Bildschirmspeicher auf den Beich ändern, in dem die Bänke eingeblendet werden und per VBI wechselweise die Bänke einblenden... :)

Re: Zusatzspeicher unter BASIC

von GoodByteXL » Fr 29. Nov 2013, 14:45
kfischer hat geschrieben:Moin,

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?

Wie in jeden anderen Speicherbereich auch - man muss nur wissen, was man da macht ...
Die PD-Bibliothek hat dazu 2 Beispiele: PD #113 & #303.

kfischer hat geschrieben: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?

Eigentlich nicht, kommt aber darauf an, was man genau machen will. Die RAMDisk ist z.B. so ein Treiber. Für Direktzugriff aus ATARI-BASIC bleibt keine große Option zu PEEK/POKE, außer eine MS-Routine für COPY/MOVE zu verwenden. Andere BASIC-Dialekte bieten da mehr.

Re: Zusatzspeicher unter BASIC

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 8)

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 8)

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

Re: Zusatzspeicher unter BASIC

von kfischer » Fr 29. Nov 2013, 19:39
Moin,

danke für eure Hilfe! Ich habe mal folgendes kurz versucht, ohne DOS einzuladen:

Code: Alles auswählen
100 PORTB=54017:REM PIA PORT B
110 BANK1=253:REM BITMUSTER 11111101
120 BANK2=249:REM BITMUSTER 11111001
130 BANK3=245:REM BITMUSTER 11110101
140 BANK4=241:REM BITMUSTER 11110001
150 REM BITMUSTER 11111101=253 LIEGT
160 REM DIREKT NACH RECHNERSTART AN
170 AA=16384:REM $4000 ANFANG
180 AE=16388:REM $4004 ENDE
190 DIM A$(1)

200 POKE PORTB,BANK2
210 FOR I=AA TO AE
220 READ A$:POKE I,ASC(A$)
230 NEXT I

300 POKE PORTB,BANK3
310 FOR I=AA TO AE
320 READ A$:POKE I,ASC(A$)
330 NEXT I

400 POKE PORTB,BANK2
410 FOR I=AA TO AE
420 PRINT CHR$(PEEK(I));
430 NEXT I
440 PRINT

500 POKE PORTB,BANK3
510 FOR I=AA TO AE
520 PRINT CHR$(PEEK(I));
530 NEXT I
540 PRINT

600 DATA A,B,B,U,C
610 DATA K,L,A,U,S


Lasse ich das Programm laufen, wird untereinander 2x KLAUS ausgegeben. Sollte aber so nicht sein! In Port B des PIA-Registers kann ich für PB2 und PB3 sonstwas einstellen, letztendlich aber schreibe ich, wie es scheint nicht in die XRAM, sondern in den Hauptspeicher.

Ich werde morgen mal in die PD-Bibliothek wühlen. Danke für den Hinweis!

Viele Grüße
Klaus

Re: Zusatzspeicher unter BASIC

von tfhh » Fr 29. Nov 2013, 20:15
Moin Klaus,

kfischer hat geschrieben:[code]
100 PORTB=54017:REM PIA PORT B
110 BANK1=253:REM BITMUSTER 11111101
120 BANK2=249:REM BITMUSTER 11111001
130 BANK3=245:REM BITMUSTER 11110101
140 BANK4=241:REM BITMUSTER 11110001

Kleiner Denkfehler: Du mußt auch Bit 4 löschen (CPU Zugriff), ansonsten passiert nichts. Das heißt bei allen Werten da oben dezimal 16 abziehen, dann sollte das Beispiel so funktionieren.

Gruß, Jürgen

Re: Zusatzspeicher unter BASIC

von CharlieChaplin » Fr 29. Nov 2013, 21:12
möp,

Überschrift des Topics gelesen und schon halb eine Antwort ausgedacht, dann auf das Topic geklickt und festgestellt sie passt nicht wirklich. Ich dachte bei Zusatzspeicher einfach an "mehr Speicher" für Atari Basic - und das geht ja nicht nur mit XRAM, sondern bei 64k Rechnern auch mit RAM unter dem OS.

Bei atarionline.pl gab es vor einiger Zeit ein gepatchtes Atari Basic, das auch das RAM unter dem OS für ein Programm zur Verfügung stellte (d.h. Atari Basic nutzt weiterhin kein RAM unter dem OS, der freie Programmspeicher wurde jedoch um ca.12-14k größer, also statt 32kbytes dann ca. 44-46kbytes nutzbar).

Falls das auch für dich interessant ist, einfach melden.
-Andreas Koch.

Re: Zusatzspeicher unter BASIC

von kfischer » Sa 30. Nov 2013, 08:24
Moin Jürgen,

ja das war der Knackpunkt! Natürlich *kopfklatsch* muss die CPU auf die XRAM zugreifen können, sonst wird das nichts :oops:

Vollständigkeitshalber schreibe ich mir die Portbits hier nochmal auf:

PB0 0 = RAM unter OS an, 1 = RAM unter OS aus
PB1 0 = BASIC an, 1 = BASIC aus

PB2&3 Auswahl eine von vier 16K Speicherbänken eines Blocks

PB4 0 = CPU Zugriff auf XRAM an, 1 = Zugriff auf Hauptspeicher
PB5 0 = ANTIC Zugriff auf XRAM an, 1 = Zugriff auf Hauptspeicher

PB6&7 Auswahl eine von vier 64K Speicherblöcken

Etwas verwirrend ist, dass das was aktiviert werden soll logisch 0 ist. Aber egal, Problem gelöst und vielen Dank an alle für die vielen Hinweise :notworthy:

Happy weekend :coffee
Klaus

Re: Zusatzspeicher unter BASIC

von GoodByteXL » Mo 2. Dez 2013, 13:50
kfischer hat geschrieben:Etwas verwirrend ist, dass das was aktiviert werden soll logisch 0 ist. Aber egal, Problem gelöst und vielen Dank an alle für die vielen Hinweise

Dazu einen Nachbrenner. Damit kann man den Zusatzspeicher auch für ein BASIC-Programm selbst nutzen.

Re: Zusatzspeicher unter BASIC

von kfischer » Mo 2. Dez 2013, 19:52
GoodByteXL hat geschrieben:Dazu einen Nachbrenner


Aah ... sehr interessant, wusste ich noch gar nicht, dass BASIC XE das kann! Den Tipp von Jürgen, das LOMEM für TBXL-Programme auf $8000 zusetzen finde ich auch klasse!

Schön, dass ich meine XRAM nicht nur fürs Spielen und Demos gucken gebrauchen kann ;)

Gruß
Klaus

Re: Zusatzspeicher unter BASIC

von GoodByteXL » Do 5. Dez 2013, 20:38
kfischer hat geschrieben:Den Tipp von Jürgen, das LOMEM für TBXL-Programme auf $8000 zusetzen finde ich auch klasse!

Das geht z.B. auch in ACTION! mit der Direktive SET.