Assembler-Beginner: PM im VBI

Moderator: Rockford

Antworten
DocSash
Beiträge: 23
Registriert: 25.08.2022 19:21
Has thanked: 14 times
Been thanked: 3 times
Kontaktdaten:

Assembler-Beginner: PM im VBI

Beitrag von DocSash »

Noch mal eine Verständnisfrage an die Experten hier: ich würde meine PM-Grafik gerne im VBI ausführen, rein technisch klappt das auch schon. Aber ich befürchte, ich habe dort eindeutig zu viel Code drin. Führe ich meine Main-Routine direkt aus, rennt mein Player superflott durchs Playfield und ich benötige ein Delay um auf eine sinnvolle Geschwindigkeit zu kommen. Führe ich die Routine im VBI aus verlangsamt sie sich um ein x-faches. Zwar tatsächlich noch schnell genug für mein Vorhaben und ich sogar noch ein minimales Delay einbauen könnte, aber da das Projekt ja erst ganz am Anfang steht und noch weitere Player sowieso Softwaresprites hinzukommen sollen (ist der Versuch eines "gepimpten" PacMan-Klons :) ), befürchte ich, dass es zu langsam wird. Oder ist dieser Faktor der Verlangsamung normal, da der Takt jetzt ja mit dem Bildschirm gesynct ist?

Ich befürchte allerdings, dass mein Problem wahrscheinlich eher konzeptioneller Natur ist: bisher habe ich ein Playefield und einen Player inkl. Joystick-Checks, Movement und Collision Detection. Die Collision gegen das Playfield musste ich softwaretechnisch umsetzen. Sie funktioniert im Prinzip ganz ähnlich wie von Dr. Irata just gerade hier beschrieben: viewtopic.php?f=7&t=3495 (wäre der Post ein paar Tage früher gekommen, hätte mir das eine Menge Kopfschmerzen erspart, aber nur so lernt man wirklich :D ), nur dass ich halt die entsprechenden Bits checke und nicht setze (und bestimmt auch weitaus ineffektiver als bei Dr. Irata, aber vom Prinzip her dasselbe). Das sind natürlich alles eine Menge Checks und Register-Vorgänge die dort dann ablaufen. Außerdem ist es bis jetzt eigentlich so, dass die gesamte Game Routine im VBI abläuft, nebenbei passiert nichts. Und ich wüsste jetzt auch noch nicht, was dort überhaupt großartig ablaufen sollte, außer meinetwegen die Anzeige des Punktestands zu aktualisieren o.ä.

Liegt das nun einfach an dem Projekt selbst, weil für ein PacMan eben fast nur Dinge relevant sind die im VBI ablaufen sollen, oder habe ich dort zu viel Code und könnte meinetwegen die Collision Detection auslagern? Da wüsste ich nur absolut nicht wie, da diese ja zwangsläufig mit Joystick und Movement synchron sein muss.

Und welcher VBI-Mode ist hier der richtige für mich? Habe es natürlich erstmal alles in den Immediate gelegt, da ja anzeigerelevante Dinge dort rein sollen. Ist aber ja eben recht begrenzt. Wenn ich es richtig verstanden habe läuft der Deferred aber ja quasi bis zum nächsten Interrupt, also während des Screenaufbaus, was doch dann blöd für die Player wäre, oder?

Sorry für die ausführlichen Fragen, hoffe ihr habt noch Bock drauf zu antworten. :D

Elephant
Beiträge: 28
Registriert: 17.08.2021 00:56
Been thanked: 17 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von Elephant »

Der Immediate VBI wird auch bei zeitkritischen I/O-Operationen ausgeführt.
Wenn also zwischendurch keine SIO Vorgänge laufen sollen, besser den Defferend nehmen.
Der Deferred VBI kann etwa 24000 Maschinenzyklen umfassen,
ohne dass Probleme auftreten.

Benutzeravatar
pps
Beiträge: 764
Registriert: 18.06.2021 23:05
Has thanked: 189 times
Been thanked: 371 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von pps »

Wenn Du das im VBI ausführst, ist es natürlich deutlich langsamer als im normalen Code. Der VBI wird exakt ein Mal synchron zum Bildschirm ausgeführt. Bei PAL also so ca. 50 mal je Sekunde.

Verzögerung im VBI sollte man nur machen, indem man den Programmteil dann nicht ausführt, wenn er nicht laufen soll. Keine Schleife bauen, in der man nichts tut außer warten.
PP´s of STARSOFTBerlin__________github|meine Webseite|Demozoo

Benutzeravatar
Dr. Irata
Beiträge: 1265
Registriert: 24.08.2021 14:40
Has thanked: 182 times
Been thanked: 417 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von Dr. Irata »

Guten Morgen,
wenn man den Player steuert aber auch bei vielen anderen Dingen, macht es schon Sinn es über den VBI zu steuern, da die Bewegung dann so schön gleichmäßig und weich ist. Allerdings hat man da echt zeitliche Limitationen - gerade wenn das Spiel auf NTSC laufen soll.
Eine Syncronisierung kann man aber auch gut im Hauptprogramm außerhalb des VBI erreichen - einfach mit einer kleine Warteschleife:

Code: Alles auswählen

@		lda VCOUNT
   		cmp #100
        	bne @- 
        	 

Benutzeravatar
Dr. Irata
Beiträge: 1265
Registriert: 24.08.2021 14:40
Has thanked: 182 times
Been thanked: 417 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von Dr. Irata »

Die Themen VBI und DL/DLI sind komplex... hier im Forum gibt es etliche Beiträge darüber. Man kann da echt tolle Sachen machen, muss das aber gut kennen, sonst gibt es Abstürze oder das ganze System wird instabil.
Hier dann auch noch das Thema der Schattenregister (hatte ich mal in einem Post oder im Magazin) erklärt.....

DocSash
Beiträge: 23
Registriert: 25.08.2022 19:21
Has thanked: 14 times
Been thanked: 3 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von DocSash »

pps hat geschrieben:
13.10.2024 05:58
Verzögerung im VBI sollte man nur machen, indem man den Programmteil dann nicht ausführt, wenn er nicht laufen soll. Keine Schleife bauen, in der man nichts tut außer warten.
So mache ich das auch derzeit, also den zu verzögernden Code nur jeden x-ten Interrupt ausführen. Eine Warteschleife würde in dem Falle ja den gesamten VBI-Code verzögern.

Dr. Irata hat geschrieben:
13.10.2024 10:43
Eine Syncronisierung kann man aber auch gut im Hauptprogramm außerhalb des VBI erreichen - einfach mit einer kleine Warteschleife:
Müsste ich dann mal schauen, ob ich eventuell doch auf den VBI verzichte. Ich werde es wohl nun erstmal weiter mit VBI versuchen, wenn es nachher nicht mehr passt stelle ich es halt nochmal um, ist zum Glück ja nicht so aufwendig.

Dr. Irata hat geschrieben:
13.10.2024 10:43

Code: Alles auswählen

@		lda VCOUNT
   		cmp #100
        	bne @- 
        	 
Der VCOUNT enthält doch die Anzahl der aufgebauten Modelines, oder hatte ich das falsch verstanden? Also synchronisierst du hier die gesamte Ausführung mit dem Abschluss der 100. Modeline, richtig?

Und noch eine richtige Noob-Frage: in deinen Beispielen habe ich gesehen, dass du das @ mehrfach als Label verwendest, ist das eine Besonderheit des @? Und mit - oder + in den Branches gibst du an, ob zum vorherigen oder zum nächsten @ gesprungen werden soll?

Benutzeravatar
Dr. Irata
Beiträge: 1265
Registriert: 24.08.2021 14:40
Has thanked: 182 times
Been thanked: 417 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von Dr. Irata »

... das ist richtig und das solltest du natürlich auf deine DL abstimmen...

@ nutze ich sehr gerne und ist eine Besonderheit in MADS:

@+ springt zum nächsten @ nach vorne, @+1 zum übernächsten usw.
@- springt zum voherigen @, @-1 -2 usw. entsprechend.
Das kann man mit BNE / BCC usw. machen, aber auch mit JMP

Ganz gerne nutze ich auch If Then (ist aber verpönt hier)

MADS erlaubt folgende Anweisung:

#if .byte variable=#11
.... code ......
#end

Diese einfache If / Then Schleife geht ohne Zeitnachteil.

Komplexe Anweisungen sind möglich (sind aber hinsichtlich der Taktzyklen etwas nachteilig):
#if .byte variable1=#12 .or .byte variable2=variable3
........ code ..............
#end

DocSash
Beiträge: 23
Registriert: 25.08.2022 19:21
Has thanked: 14 times
Been thanked: 3 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von DocSash »

Das ist ja eine coole Sache mit dem @. Also so eine Art Auto-Labeling. Macht den Code um einiges übersichtlicher, und man muss sich nicht ständig neue Labelnamen für banale Schleifen ausdenken.

#IF #END benutze ich tatsächlich nur bei komplexeren Abfragen die .or / .and enthalten, obwohl ich mir das schon gedacht habe, dass dies auf Kosten der Perfomance geht, macht den Code aber halt auch weitaus übersichtlicher, und kommt auch nicht so häufig vor im Code. Wie könnte man denn auf effektive Weise ohne #IF mehrere Ausdrücke checken, damit es dann auch wirklich schneller ist? Und wo ist eigentlich der Unterschied zum .if / .endif etc.?

Benutzeravatar
Dr. Irata
Beiträge: 1265
Registriert: 24.08.2021 14:40
Has thanked: 182 times
Been thanked: 417 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von Dr. Irata »

tatsächlich mache ich es oft so, daß ich diese If/Then Anweisungen gerne benutze und später dann optimiere und wieder gerade bei zeitkritischen Abschnitten in nativen Code umwandle. Vielleicht hilft diese Vorlage:
A8 Verzw.png
A8 Verzw.png (192.98 KiB) 11163 mal betrachtet

Benutzeravatar
LarsImNetz
Beiträge: 216
Registriert: 24.08.2021 18:27
Has thanked: 201 times
Been thanked: 112 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von LarsImNetz »

DocSash hat geschrieben:
12.10.2024 22:58
Noch mal eine Verständnisfrage an die Experten hier: ich würde meine PM-Grafik gerne im VBI ausführen, ...
Nein, Du willst Deine PM-Grafik nicht im VBI ausführen. (!)
Das klingt jetzt hart, ist es auch. Aber nicht so gemeint. Der Atari VBI ist nicht dafür gemacht, beliebigen Code aufzunehmen.
Wie Peter schon gesagt hat, der Atari VBI ist 2 geteilt, der erste Teil (Immediate) wird IMMER ausgeführt und sollte max 1000Zyklen lang sein, sonst kommen IO-Operationen durcheinander, gerade auf echter Hardware sind das schwer zu analysierende Fehler.
Also sollte eigener Code immer in den 2. Teil des VBI.
Aber:
Nutze den VBI eher für Synchronisationen, also sauberes zurücksetzen z.B. des eigenen DLI oder für Zähler oder die eigene Musikroutine.
Alles andere, auch PM Grafik, sollte nicht im VBI gemacht werden.

Um es mal mit Pseudo Code zu beschreiben, wie man es machen sollte

Code: Alles auswählen

VBI:
  * dli auf ersten dli zurücksetzen
  * zähler incrementieren
  * musik abspielen
      
DLI:
  * ersten dli
  * zweiten dli
  * dritten dli
  ...
  
Mainloop:
* initialisierung von dlist, dli, vbi
DO
  * player bewegen 
  ...
  
  * warte bis vbi durchgeführt
LOOP
Hier würde jetzt der "player bewegen" alle 1/50s ausgeführt werden, auf NTSC alle 1/60s, was für Reaktionen extrem flott wäre.

Aber, um mich nicht zu wiederholen, ich hatte es vor ein paar Monden Peter schon mal geschrieben: viewtopic.php?f=7&t=455&p=4458#p4458 Wie man so etwas besser machen könnte.

Und ein Pacman? Hier mal meine Version. https://github.com/the-atari-team/tat.pacmen.evolution findest Du auch auf den Abbuc-Software-Wettbewerb-2022 Disketten/Images, Du siehst, ich weiß wo von ich spreche.

LG
Lars

Benutzeravatar
Kveldulfur
Beiträge: 1036
Registriert: 17.08.2021 02:32
Has thanked: 474 times
Been thanked: 437 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von Kveldulfur »

Moin!

Ich kann Lars nur zustimmen!

Jedes Programm ist anders, aber für mich gibt es zwei Phasen im Spiel/Programm:

1. Phase – Die Nichtsichtbare:
Wenn der VCOUNT des ATARI unterhalb meines Spielfelds liegt, befinde ich mich in der nichtsichtbaren Phase.
Alles, was ich dort verändere, sieht man erst, wenn die sichtbare Phase beginnt. Hier sollte man sich um alles kümmern, was anschließend auf dem Bildschirm angezeigt wird:

- Spielerposition sowie welches Bild der Animation vom Spieler angezeigt wird,
- das Gleiche für alle Gegner (ggf. nur Y),
- sämtliche Kollisionen werden geprüft,
- Steuerung usw.

2. Phase – Die Sichtbare:
Wenn der VCOUNT bei meinem Spielfeld angekommen ist, beginnt die sichtbare Phase.
Hier wird alles gemacht, was keinen Einfluss auf das Bild hat (z.B. Musik abspielen).
Oft mache ich in diese Phase nichts mehr im Hauptprogramm, da der DLI sich hier besser anbietet.

DLIs:
Per DLI ändere ich z.B. Farben direkt während der sichtbaren Phase, wodurch ich mehr Farben als „normal“ nutzen kann.
Per DLI ändere ich ggf. die X-Richtung der Player mehrfach, um so einen Player in mehrere zu teilen.
Per DLI spiele ich teilweise auch die Musik ab, um diese gleichmäßig abspielen zu können, ohne die Phase 1 zu belasten.

VBIs:
Hier kommen nur die wirklich wichtigen Funktionen hinein...

Meine Hauptschleife wartet darauf, dass der VCOUNT unterhalb des Spielfelds angekommen ist, und dann lege ich mit meinen ganzen Abfragen und Änderungen los.
Wenn alles erledigt ist, warte ich wieder auf den VCOUNT. Das setzt voraus, dass man so programmiert, dass man alles innerhalb von 1/60s auch erledigen kann. Sollte es jedoch einmal nicht in 1/60s geschafft werden, ruckelt das Spiel ggf., aber es stürzt nicht ab, wie es passieren kann, wenn man alles im VBI abarbeitet.

Animationen und Bewegungen verzögere ich per RTCLOK+2. Diese Systemvariable zählt bei jedem VBI um eines hoch.
Wenn ich die Bewegung z.B. um 4 verzögern will, prüfe ich ob RTCLOCK+2 AND #%00000011 Null ergibt. Wenn ja, habe ich 4/50s bzw. 4/60s die Animation verzögert.

z.B.:
LDA RTCLOK+2
AND #%00000011
BNE @+
JSR GoAnimation
@ .....

So kann man ohne sich selbst um einen Zähler zu kümmern, einfach Verzögerungen erzeugen.

Sicherlich hat jeder eine andere Rangehensweise, aber ich habe damit gute Erfahrungen gemacht.

Grüße,
Janko
Meine Projekte findest Du hier...

DocSash
Beiträge: 23
Registriert: 25.08.2022 19:21
Has thanked: 14 times
Been thanked: 3 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von DocSash »

LarsImNetz hat geschrieben:
16.10.2024 10:08
Und ein Pacman? Hier mal meine Version. https://github.com/the-atari-team/tat.pacmen.evolution findest Du auch auf den Abbuc-Software-Wettbewerb-2022 Disketten/Images, Du siehst, ich weiß wo von ich spreche.
Na Klasse, nun muss ich mir ein anderes Projekt ausdenken. :lol:

Nein, ich bleibe natürlich trotzdem dabei. So schick wie deines wird es mit Sicherheit nicht, aber das ist auch gar nicht mein Anspruch. Mir geht es im Prinzip ganz genauso wie Peter damals, ich möchte in erster Linie erstmal Assembler kennenlernen und das natürlich am liebsten anhand eines reellen Projekts welches zumindest auch schon einige Aspekte sowohl der Assemblerprogrammierung selbst als auch des Atari im speziellen mit einbezieht.

Allerdings dämmert mir langsam auch, dass ich wohl schon von Beginn an völlig falsch konzeptioniert und strukturiert habe. Und tatsächlich ist es ja auch bei mir so, dass zurzeit im Prinzip alles im VBI liegt. DLIs hatte ich mir bisher nur angeschaut, aber noch keine implementiert, so weit bin ich noch gar nicht. Bis jetzt habe ich ein Playfield und einen Player, den ich per "Autowalk" korrekt durchs Playfield steuern kann, also mit funktionierender Collision Detection, die man aber bestimmt auch eleganter gestalten könnte. Habe nun aber gerade außerdem noch das Problem, dass mein Memory-Management auch nicht sehr weitsichtig war. Wenn ihr dazu noch ein paar generelle Tipps habt, wo man was im Speicher am besten ablegt wäre ich euch auch sehr dankbar. PM und Screen unterhalb des Ramtop, soviel weiß ich schon, aber ansonsten ist es bei mir schon fast ein bisschen random. Warum zum Beispiel VBI gerne in Page 6? Habe meinen dort auch hingelegt, der läuft aber mittlerweile schon über $1100, und habe bis jetzt ja eben erst einen Player zu handlen.

Kveldulfur hat geschrieben:
16.10.2024 11:22
1. Phase – Die Nichtsichtbare:
Wenn der VCOUNT des ATARI unterhalb meines Spielfelds liegt, befinde ich mich in der nichtsichtbaren Phase.
Alles, was ich dort verändere, sieht man erst, wenn die sichtbare Phase beginnt. Hier sollte man sich um alles kümmern, was anschließend auf dem Bildschirm angezeigt wird:

- Spielerposition sowie welches Bild der Animation vom Spieler angezeigt wird,
- das Gleiche für alle Gegner (ggf. nur Y),
- sämtliche Kollisionen werden geprüft,
- Steuerung usw.
Das wäre dann ja im Prinzip so, wie ich das gemacht habe. Ich checke den Joystick, checke Kollisionen, berechne und setze die Position, und checke und setze den Animationsframe. Oder ist der Unterschied hier, dass du zwar mit dem VBI syncst, aber nicht die Interruptzyklen sondern quasi die "normale" CPU-Zeit nutzt um den Code auszuführen?

Kveldulfur hat geschrieben:
16.10.2024 11:22
2. Phase – Die Sichtbare:
Wenn der VCOUNT bei meinem Spielfeld angekommen ist, beginnt die sichtbare Phase.
Hier wird alles gemacht, was keinen Einfluss auf das Bild hat (z.B. Musik abspielen).
Oft mache ich in diese Phase nichts mehr im Hauptprogramm, da der DLI sich hier besser anbietet.
Ja genau, bei mir passiert dort auch nicht viel. Und DLIs habe ich bis jetzt noch keine, wollte diese allerdings tatsächlich noch für Farbänderungen einbauen, weil ich links und rechts des Playfields gerne etwas in den Farben der Player darstellen möchte, die sich halt vom eigentlichen Playfield unterscheiden.

Euch allen auf jeden Fall vielen Dank für die wieder mal erhellenden Infos.

Benutzeravatar
Dr. Irata
Beiträge: 1265
Registriert: 24.08.2021 14:40
Has thanked: 182 times
Been thanked: 417 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von Dr. Irata »

Thema Speicheraufteilung:

Da gibt es wahrscheinlich nicht das eine Konzept. Ein wenig kommt es wohl darauf an, was du programmieren möchtest, wie groß das ganze Projekt werden sollte und mit welchem Atari das laufen soll...
Also bei meinem ersten Projekt habe ich es auf einem Atari XL mit 64 kB entwickelt und bin da am Ende auf große Speicherprobleme gestossen.
Das 2. Projekt (CavernsOfEris) habe ich gleich auf einem 130 XE mit 128 kB incl. RAM unter ROM entwickelt und hatte so genügend Speicher. Am Ende war das Projekt so mächtig, dass ich den kompletten Speicher ausgereizt habe.. bis auf ein paar Bytes!
Mein 3. Spiel läuft auch nur auf einem Atari 130 XE ist aber so zeitkritisch, daß es nur unter PAL läuft.

Jeder muss da seine eigenen Erfahrungen machen!

Inzwischen habe ich mir ein paar Vorlagen gebastelt, damit ich nicht immer alles von vorne machen muss und meine Speicheraufteilung ist jetzt klar gegliedert - gerade das letzte Projekt hat gezeigt, daß man unbedingt auf ein paar Dinge achten sollte!!

Die Ataris sind unterschiedlich, die Emulatoren auch - das muss man wissen.

Mein Programm startet zunächst bei org $1000 - ich gehe also relativ weit runter, das geht aber, wenn man kein umfangreiches DOS braucht.
Als erstes kommt hier die Displaylist - die sollte dort dann auch stabil stehen bleiben!
Danach definiere ich alle meine Variablen. Alle Variablen erhalten primär den Wert 0 !! Der Bereich geht bei mir bis $2000 - also genügend Platz für weitere Dinge wie z.B. Texte usw. - größere Textpassagen müssen allerdings in eine Bank ausgelagert werden.
Bei $2000-$3000 definiere ich die Player/Missile - die brauchen 4KB
In meiner aktuellen Vorlage werde ich Graphics 7 nutzen und das braucht 4kB Bildschirmspeicher - der liegt bei mir bei $3000-$4000
$4000-$8000 ist reserviert für die Banks
Ab $8000 fängt dann mein Hauptprogramm an - also hier startet der Maincode!
Nach hinten habe ich dann für den Hauptcode genügend Platz...
Wichtig ist dann eine primäre Löschroutine, die den Bereich $1000(+DL)-$4000 erstmal komplett auf Null setzt, sonst bekommt man blöde Effekte. Bitte nicht die DL löschen dabei ;-)
Bank 0 bekommt die wichtigsten Routinen, Bank 4 ist für Musik und Soundeffekte für mich reserviert, Bank 1,2,3 für Daten und weitere Codes....
Jeder macht das natürlich irgendwie anders, ich mache es so ;-)

LG
Peter
Bildschirmfoto 2024-10-17 um 09.34.42.png
Bildschirmfoto 2024-10-17 um 09.34.42.png (834.67 KiB) 10903 mal betrachtet

patjomki
Beiträge: 341
Registriert: 18.08.2021 23:21
Has thanked: 127 times
Been thanked: 72 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von patjomki »

DocSash hat geschrieben:
17.10.2024 01:06
Nein, ich bleibe natürlich trotzdem dabei.
Das ist die richtige Einstellung. Die Lernkurve beim ATARI ist steil, aber es lohnt sich. Durch die Customchips kriegt man wirklich 'ne ganze Menge hin, für Kisten aus den 70ern echt eine beachtliche Leistung.

Nun zu Deinen Fragen:
Beide VBIs werden während des Austastlücke des Bildschirms ausgeführt (also während der Elektronenstrahl des Bildschirms von unten rechts nach oben links wandert, PAL, 50x je Sekunde), der Immediate - wie der Name vermuten lässt - zuerst, dann der Deferred. Beide VBIs laufen aber immer innerhalb der Austastlücke.

Beim Immediate-VBI hast Du den Vorteil, dass der auch bei zeitkritischen I/O-Routinen läuft (also z.B. wenn Du während des Ladens von Diskette auch im VBI Musik abspielen möchtest), er lässt Dir aber eben nur ca. 4.500 Taktzyklen (lt. Profibuch). Der Deferred-VBI kann von zeitkritischen I/O-Routinen unterbrochen werden, kann aber bis zu 24.000 Taktzyklen umfassen (ebenfalls lt. Profibuch).

Zur Frage der Speicheraufteilung. Hier mal die Belegung des Speichers beim ATARI. Wohin Du was legst (in die jeweiligen freien Speicherbereiche) ist Dir überlassen. Achtung! Das unten geschriebene gilt nur für die 64K-Rechner der XL/XE-Reihe. Die ATARIs mit weniger Speicher haben natürlich im Bereich $2000-$bfff eventuell weniger Speicher (z.B. der 400er oder der 600XL).

Code: Alles auswählen

Memory-Map des ATARI:
$0000-$05ff     0- 1535 belegt 1,5K       Zeropage, Stack, Systemvariablen
$0600-$06ff  1536- 1791 frei   256 Bytes  Page 6 (Aber Achtung! Tapespeeder etc.)
$0700-$0fff  1792- 4095 belegt 2,25K      DOS (LiteDOS)
$1000-$1fff  4096- 8191 frei   4K         DOS (frei nur mit LiteDOS, sonst belegt durch DOS)	
$2000-$9fff  8192-40959 frei   32K        RAM ($4000-$7fff, 16K-Block für Bankswitching RAM wie im 130XE)
$a000-$bfff 40960-49151 frei   8K         Basic oder frei bei abgeschaltetem Basic
$c000-$cfff 49152-53247 (frei) 4K         OS (frei nur mit OS aus, Interrupts und Schattenregister schwierig)
$d000-$d7ff 53248-55295 belegt 2K         Hardwareregister Customchips (GTIA, ANTIC, POKEY)
$d800-$dfff 55296-57343 (frei) 2K         OS (Fließkomma, Parallelbus, nur mit OS aus, siehe oben)
e0000-$ffff 57344-65535 (frei) 8K         OS (frei nur mit OS aus, Interrupts und Schattenregister schwierig)
P.S.:Mit Austastlücke ist die Zeit gemeint, in dem der Elektronenstrahl des Fernsehers von der unteren rechten Ecke bis zur oberen linken benötigt. Es gibt zwar auch noch die Austastlücke, die der WDR Computerclub genutzt hat, bis der sichtbare PAL-Bereich anfängt, die hat aber nix mit nem VBI zu tun.

DocSash
Beiträge: 23
Registriert: 25.08.2022 19:21
Has thanked: 14 times
Been thanked: 3 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von DocSash »

So viele interessante Antworten, und doch ergeben sich daraus vor allem wieder noch viel neue mehr Fragen. Das habt ihr nun davon, wenn ihr auf meine Fragen antwortet. :lol:

Dr. Irata hat geschrieben:
17.10.2024 09:22
Die Ataris sind unterschiedlich, die Emulatoren auch - das muss man wissen.
Meine Zielplattform ist tatsächlich erstmal nur Standard 64KB XL. Zur Not müsste ich sonst geplante Features streichen.

Dr. Irata hat geschrieben:
17.10.2024 09:22
Als erstes kommt hier die Displaylist - die sollte dort dann auch stabil stehen bleiben!
Die Displaylist soweit unten, weil dort permanent drauf zugegriffen wird?

Dr. Irata hat geschrieben:
17.10.2024 09:22
Danach definiere ich alle meine Variablen.
Da habe ich glaube ich schon Blödsinn gemacht, ich habe die alle in die Zeropage gelegt, aber dafür ist die wahrscheinlich gar nicht gedacht?

Dr. Irata hat geschrieben:
17.10.2024 09:22
Bei $2000-$3000 definiere ich die Player/Missile - die brauchen 4KB
Brauchen die nicht nur 2KB in Single Line Resolution? Oder legst du in den Bereich auch die Frames mit rein? Könnte man für die Frames nicht auch die nicht genutzten 768 Bytes verwenden (wenn sie denn dafür langen sollten)?
Und ich habe sonst immer gelesen, dass man die PM direkt unter den Ramtop legen sollte, allerdings auch keine wirkliche Erklärung dazu gelesen warum das so sein soll.

Dr. Irata hat geschrieben:
17.10.2024 09:22
In meiner aktuellen Vorlage werde ich Graphics 7 nutzen und das braucht 4kB Bildschirmspeicher - der liegt bei mir bei $3000-$4000
Dazu hatte ich gelesen, dass dieser dann unterhalb der PMs liegen sollte, aber auch ohne Erklärung warum. Da habe ich mich wohl zu sklavisch an die Beispiele gehalten. Und ich glaube ich habe noch einen viel größeren und fataleren Fehler begangen: mein Screen ist in Gr. 15 (was vielleicht schon mal der erste Fehler sein könnte, weil ich das eventuell gar nicht benötige), und ich habe bei mir im Code einmal die Bitmap dafür liegen (~8k) und kopiere diese dann an meine definierte Screenadresse (also nochmal ~8k), und somit sind 15.6k schon mal futsch. Ich kann doch auch meine Bitmap einfach direkt auf die Screenadresse packen und gut ist, oder? Die Bitmaps vorhalten müsste ich ja nur, wenn ich wechselnde Screens hätte, aber die würde man dann ja eh besser von Disk nachladen.

Dr. Irata hat geschrieben:
17.10.2024 09:22
Ab $8000 fängt dann mein Hauptprogramm an - also hier startet der Maincode!
Nach hinten habe ich dann für den Hauptcode genügend Platz...
Das wären in meinem Fall dann aber ja auch nur noch 8k, da mein Ramtop ja bei $A000liegt. Oder sollten 8k in der Regel für den Maincode langen, wie in meinem Falle zum Beispiel bei einem PacMan-Klon?

Dr. Irata hat geschrieben:
17.10.2024 09:22
Wichtig ist dann eine primäre Löschroutine
An welche Stelle führe ich die Löschroutine denn aus? Lösche ich dann nicht auch meine Variablen und PMs im Speicher, oder habe ich gerade generell einen Denkfehler?

Dr. Irata hat geschrieben:
17.10.2024 09:22
Bank 0 bekommt die wichtigsten Routinen, Bank 4 ist für Musik und Soundeffekte für mich reserviert, Bank 1,2,3 für Daten und weitere Codes....
Die Banks hätte ich ja nur, wenn ich eine Speichererweiterung in irgendeiner Form nutzen würde, oder (also 130XE oder andere)?

Dein Characterset kannst du nur ab $A000 definieren, weil du für einen 130XE programmierst? Bei mir ist da ja schon Ende.

patjomki hat geschrieben:
17.10.2024 18:13

Code: Alles auswählen

$0600-$06ff  1536- 1791 frei   256 Bytes  Page 6 (Aber Achtung! Tapespeeder etc.)
$0700-$0fff  1792- 4095 belegt 2,25K      DOS (LiteDOS)
$1000-$1fff  4096- 8191 frei   4K         DOS (frei nur mit LiteDOS, sonst belegt durch DOS)	
$2000-$9fff  8192-40959 frei   32K        RAM ($4000-$7fff, 16K-Block für Bankswitching RAM wie im 130XE)
Bedeutet das, dass wenn ich kein DOS benötige ich theoretisch mit meinem Code schon direkt bei $600 starten könnte? Müsste den Bereich dann aber wahrscheinlich auch vorher einmal löschen?

Benutzeravatar
Dr. Irata
Beiträge: 1265
Registriert: 24.08.2021 14:40
Has thanked: 182 times
Been thanked: 417 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von Dr. Irata »

theoretisch könntest du schon bei $600 starten, würde ich aber nicht machen. Meine erstes Projekt startete bei $800 - ein ganz schmales DOS ging da noch. Besser bei $1000
Ich lösche tatsächlich hinter der DL bis $4000 alles einmal durch, da dort fast jeder Atari Datenmüll drin hat...
Du kannst natürlich alles irgendwo hinpacken und jeder macht es wohl irgendwie anders... Hauptsache man weiß wo und macht es irgendwie strukturiert.
PM 2kB
Und ohne die Banks würde ich wohl die ursprüngliche Aufteilung so lassen (Bildschirm hinten)
Bildschirmfoto 2024-10-18 um 00.19.23.png
Bildschirmfoto 2024-10-18 um 00.19.23.png (82.13 KiB) 10772 mal betrachtet

DocSash
Beiträge: 23
Registriert: 25.08.2022 19:21
Has thanked: 14 times
Been thanked: 3 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von DocSash »

DocSash hat geschrieben:
17.10.2024 21:39
Dein Characterset kannst du nur ab $A000 definieren, weil du für einen 130XE programmierst? Bei mir ist da ja schon Ende.
Vergesst das, das habe ich nicht geschrieben. :D

Benutzeravatar
LarsImNetz
Beiträge: 216
Registriert: 24.08.2021 18:27
Has thanked: 201 times
Been thanked: 112 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von LarsImNetz »

Um jetzt mal die tolle Memory-Map vom patjomki zu bewerten:

In der Zeropage sind ab 128-255 alle Register nutzbar, wenn Basic keine Rolle spielt, sonst eher ab 203 ($CB).

Wenn das DOS nach dem Programmstart nicht mehr wichtig ist,
sind Page 4-5 auch verwendbar. Muss man ausprobieren.
Auch kann das DOS einfach durch die Player-Missile Grafik belegt werden. (PMBASE=$1000), aber das sind dann eher Profitipps, die man später verwenden sollte.
Auch den unteren Teil des Stacks (~128 Bytes) kann man für sich nutzen.

Aber als erster Tipp:
- Starte Dein Programm ab Speicher $2000, lade es über ein übliches DOS.
- Lege die Grafik nach ganz oben im Speicher.
- Nutze Zeichensatz-Grafik wie Graphics 12, die belegt erstmal nur knapp 1kb RAM statt Graphics 15, das gleich 8kb frisst.
- 2k für die Player-Missile Grafik.
- Dann noch ein paar kb für die Zeichensätze, möchtest Du ein paar bewegte Objekte, nutze mehrere Zeichensätze und lass diese rotieren. Das kostet keine Zeit, bei kleinen Animationen bewirkt es aber Wunder.
- die ersten 768 Bytes der Player-Missile Grafik kannst Du auch für einen Zeichensatz nutzen, dann hast Du da halt nur 96 Zeichen, statt 128. Reicht häufig auch.

So quetscht man in 8kb RAM dann 5 volle Zeichensätze, denn Grafikschirm und die Player-Missile Grafik.
Dann bleiben Dir erstmal ca. 32kb für das Programm. Das klingt erstmal viel, ist es aber nicht.

Und das mit dem RAM unter dem OS ist weniger schwierig, als es ist.

Benutzeravatar
CharlieChaplin
Beiträge: 971
Registriert: 18.06.2021 22:59
Has thanked: 290 times
Been thanked: 331 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von CharlieChaplin »

Die Speicherbelegung wurde hier ja schon gepostet. Aber "ab wo" sollte ein ML-Programm laden ? Je nachdem, welches DOS, GameDOS, Bootloader etc. man benutzt kann das ganz unterschiedlich sein...

- Bootdisks/Boottapes ohne DOS: laden ist theoretisch ab $0400 möglich, meist werden aber auch hier höhere Adressen genommen; Boottapes mag heutzutage keiner mehr nutzen, selbst Bootdisks sind z.T. verpönt (laden zu langsam, etc.)

-DOS: [memlo allgemein $2000]

DOS 2.x, z.B. DOS 2.0, DOS 2.5, Bibo-DOS, Turbo-DOS, XDOS, etc., allgemein ab $2000, sofern das DOS keinen Speeder benutzt (mit Floppyspeeder z.T. auch höher, bis $2400, je nach Speeder, sowie Einstellung der vorh. LW und der Buffer)

LiteDOS ab $1000, ist teilweise, aber eben nicht vollständig DOS 2.x kompatibel

DOS2XL ab $0786, kennt aber zum Glück fast keiner - es nutzt komplett das RAM unter dem OS und läuft nur mit 90k und 130k;

- GameDOS: [memlo allgemein $0A00]

MyPicoDOS von HiasSoft, irgendwo bei $09xx für die barebone Version ohne Speeder (Versionen mit Floppyspeeder halt höheres memlo), unterstützt 90k - 16MB (Hard)Disks, kein Nachladen möglich (da kein Device D: vorhanden)

NanoDOS Convert von S.Baucke, irgendwo bei $09xx, Originalversion unterstützt nur 90k und 130k (es gibt auch Hacks und Clones, die 180k und/oder 360k supporten); kein Floppyspeeder vorhanden (bei den Hacks und Clones schon, daher meist höheres memlo)

-Bootloader / 3-Sektor-DOS

XBIOS stammt von XXL, eigentlich memlo fast beliebig festlegbar, macht aber immer wieder Probleme mit div. Geräten und Erweiterungen, würde ich daher nicht verwenden;

XBOOTDOS $0980, stammt auch von XXL, würde ich nicht verwenden; 3-Sektor-DOS, kann nachladen (Device D1: vorhanden) und vorhandene Dateien überschreiben (z.B. Highscores); speichern von neuen Dateien nicht möglich;

µDOS $0937 (oder $0938 ?), von Stefan Dorndorf, Anleitung in D+E verfügbar; 3-Sektor-DOS, kann nachladen (Device D1: vorhanden) und vorhandene Dateien überschreiben (z.B. Highscores); speichern von neuen Dateien nicht möglich;

Auto Bootloader von Keith Ledbetter, memlo ??? (mein memlo-Testprogramm sagt $0700, das kann aber nicht stimmen, da Programme die $0700 oder $0800 als Startadresse nutzen damit nicht laufen); unterstützt 90k/130k/180k Disks, man kann eine ML-Datei auf der Diskette auswählen, die gebootet werden soll (muss nicht zwingend die erste Datei sein); kann nicht nachladen, kein Device D1: vorhanden;

PicoBoot von HiasSoft (auf der MyPicoDOs Disk drauf), memlo ??? (mein memlo-Testprogramm sagt $0700, das scheint aber nicht zu stimmen); unterstützt 90k - 16MB (Hard)Disks, lädt aber nur die 1. Datei auf der Disk (ab Sektor 4, dies muss eine ML-Datei sein); kann nicht nachladen, kein Device D1: vorhanden;

So, genug verwirrt, denke ich. Ich würde empfehlen $0700-09xx nicht zu nutzen, da man nicht viele Loader findet, die so ein ML-Programm auf dem A8 laden können.

Benutzeravatar
pps
Beiträge: 764
Registriert: 18.06.2021 23:05
Has thanked: 189 times
Been thanked: 371 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von pps »

Wenn man den Bereich unter $2000 belegt, sollte man auch die Speicherzelle (dez.) 580 auf 1 setzen. (genauer gesagt: wenn man den Bereich des DOS überschreibt) Dann wird sich der Rechner bei einem Reset nicht aufhängen.

Das hat mir unser lieber JAC! neulich wieder ins Gedächtnis zurück geholt. 😉
PP´s of STARSOFTBerlin__________github|meine Webseite|Demozoo

Benutzeravatar
Dr. Irata
Beiträge: 1265
Registriert: 24.08.2021 14:40
Has thanked: 182 times
Been thanked: 417 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von Dr. Irata »

... guter Hinweis mit der Speicherstelle 580 ...

Ist das nicht wunderbar: So viele unterschiedliche Ideen und Ansätze und alles geht! Das macht den kleinen Atari aus... man hat trotz der Einschränkungen so viele Optionen. Und wie erstaunlich komplex der ist !!

Benutzeravatar
CharlieChaplin
Beiträge: 971
Registriert: 18.06.2021 22:59
Has thanked: 290 times
Been thanked: 331 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von CharlieChaplin »

Es ist außerdem wünschenswert, dass man bei ML-Programmen das eingebaute Basic abschaltet und den Nutzer nicht dazu zwingt beim einschalten die Option-Taste drücken zu müssen. Wenn man das macht, sollte man zudem noch Page 0 und Page 1 löschen, sowie das RAM unter Basic löschen, bevor man es benutzt.

(Ist man zu faul das Basic per Code abzuschalten und testet stattdessen nur ob es abgeschaltet ist, dann BITTE nicht dahingehend testen, ob die Option-Taste gedrückt wurde. Manche Drittanbieter-OS haben nämlich ein invertiertes Basic, welches man mit Option einschaltet, während man es mit dem Atari OS per Option abschaltet.)

FlorianD
Beiträge: 379
Registriert: 19.08.2021 00:18
Has thanked: 74 times
Been thanked: 150 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von FlorianD »

CharlieChaplin hat geschrieben:
19.10.2024 11:44
Wenn man das macht, sollte man zudem noch Page 0 und Page 1 löschen, sowie das RAM unter Basic löschen, bevor man es benutzt.

Warum sollte man die Page 0 löschen, da stehen jede Menge aktuelle OS Infos drin?
Warum sollte man Page 1 löschen, das ist der Stack?

DocSash
Beiträge: 23
Registriert: 25.08.2022 19:21
Has thanked: 14 times
Been thanked: 3 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von DocSash »

Vielleicht ein bisschen spät, aber weil sich die meisten hier ja mit dem Vornamen anreden: ich bin Sascha.

Vielen, lieben Dank für eure zahlreichen und wertvollen Tipps. So eine hilfsbereite Community findet man wirklich äußerst selten. Naja, Atarianer halt. :D

Ich habe mein Programm nun bezüglich Memory und VBI ein wenig umgestellt und aufgeräumt. Ich beginne weiterhin dann erstmal bei $2000, wenn es dann nach hinten raus knapp werden sollte, würde ich vielleicht nochmal weiter runtergehen, unter Einbeziehung euerer Hinweise selbstverständlich. Nun liegt es zumindest erstmal sauber hintereinander weg im Speicher, bis auf PM, Screen und Character die ich ganz oben liegen habe, bzw. zurzeit quasi noch unter dem Basic, was ja Blödsinn war, werde die Sachen also noch weiter nach oben schieben.

Auf VBI verzichte ich nun erstmal komplett, synce den Code lediglich mit dem VCOUNT. Da ich oberhalb meines Gr. 15 Playfields noch zwei Gr. 1 Zeilen habe, müsste mein Trigger dann ja VCOUNT=#108 sein, oder? Zumindest scheint die Geschwindigkeit nach der Umstellung weiterhin die gleiche zu sein wie im VBI, daher dürfte es ja zumindest nicht ganz so falsch sein.

Dass ich mit Charactersets und Gr. 12 wahrscheinlich besser gefahren wäre, hatte ich mir schon gedacht, würde aber nun erstmal tatsächlich dabei bleiben, in der Hoffnung, dass mein Speicher nicht platzt. Werde mich damit aber garantiert beim nächsten Projekt befassen. Bin auch schon echt gespannt, was das dann noch alles für Möglichkeiten bietet.

Nochmal kurz wegen des Basics: nachdem ich Depp ja nicht drauf geachtet hatte, dass das im Emulator noch immer aktiviert war, und dadurch ja von einem Top von $A000 ausgegangen bin, stellte sich mir auch die Frage, ob man das nicht auch programmatisch lösen könnte, was ja anscheinend tatsächlich geht. Wenn ihr dazu vielleicht noch eben einen Tipp hättet, wie man das macht?

Ansonsten erstmal vielen Dank bis hierhin, mit den ganzen Infos sollte ich nun erstmal weiterkommen und laufe nicht komplett in die falsche Richtung.

Benutzeravatar
CharlieChaplin
Beiträge: 971
Registriert: 18.06.2021 22:59
Has thanked: 290 times
Been thanked: 331 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von CharlieChaplin »

FlorianD hat geschrieben:
19.10.2024 13:43
CharlieChaplin hat geschrieben:
19.10.2024 11:44
Wenn man das macht, sollte man zudem noch Page 0 und Page 1 löschen, sowie das RAM unter Basic löschen, bevor man es benutzt.

Warum sollte man die Page 0 löschen, da stehen jede Menge aktuelle OS Infos drin?
Warum sollte man Page 1 löschen, das ist der Stack?
Tja,

als nicht-Programmierer weiß ich das selber nicht genau. Bei einigen Programmen ist es aber leider notwendig. Im ASC (Abbuc Software Contest) hatten wir schon öfter Programme, die zwar das Basic selber abschalteten, so dass man keine Option-Taste mehr festhalten musste. Aber: Wenn man dies ohne Option machte, so erschien im Programm irgendwo Datenmüll, drückte man weiterhin Option war der Datenmüll weg. Da war ich etwas ratlos und habe Fandal gefragt, ich glaube insgesamt dreimal...

Einmal sagte er mir bei diesem Programm muss erst Page 0 gelöscht werden, machte mir eine kurze Routine die ich vor das Programm hängte und sodann war der Datenmüll weg. Ein anderes Mal erhielt ich die Info, dass erst Page 1 gelöscht werden muss, er machte mir eine kurze Routine, die ich vor das Programm hängte und der Datenmüll war weg. Beim dritten Mal erhielt ich die Info, dass das RAM unter dem Basic erst gelöscht werden muss, er machte mir eine kurze Routine, die ich vor das Programm hängte und der Datenmüll war weg. (Deja vu)

Bei den Programmen handelte es sich um Rain of Terror , Dye oder Dye Heritage Edition und noch ein weiteres Programm, das mir gerade nicht einfällt. In den Folgejahren trat dieses "Datenmüllproblem" bei ASC-Programmen immer wieder mal auf, doch sobald ich die Routine von Fandal davorhängte war das Problem bzw. der Datenmüll weg. Seither hänge ich die Routine vor so ziemlich alle ML-Programme, selbst wenn diese irgendwo etwas eingebaut haben, um das Basic abzuschalten, sicher ist sicher. (Ab und zu meckern mich dann sogar Atarianer an, warum ich das mache, da es ihrer Meinung nach unnötig sei).

Es kann also wie gesagt sein, dass man dies nicht bei jedem ML-Programm benötigt bzw. dass man es nur in best. Fällen benötigt, ich weiß es nicht. Ich habe mir das nunmehr einfach zur Gewohnheit gemacht, die Routine vor so ziemlich jedes ML-Programm zu hängen. Das Atari XL OS macht beim Drücken von Option scheinbar etwas mehr, als nur Atari Basic auszuschalten, daher reicht eine kleine Routine die nur Basic abschaltet nicht aus, um den gleichen Effekt wie mit der Option-Taste zu erhalten.

CLEARZP.XEX: (Routine von Fandal)
$0400-447: Basic abschalten, Page 0 löschen, RAM unter dem Basic löschen
$0244-0244: Reset = Kaltstart (Poke 580,1)
$0400-041E: gibt einen schwarzen (aber eingeschalteten) Bildschirm (Poke 710,0)
sobald die Segmente initialisiert wurden, steht Page 4 wieder vollständig zur Verfügung
Dateianhänge
CLEARZP.XEX
(130 Bytes) 166-mal heruntergeladen

Benutzeravatar
pps
Beiträge: 764
Registriert: 18.06.2021 23:05
Has thanked: 189 times
Been thanked: 371 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von pps »

Also so ohne Grund davorhängen ist imho auch wirklich sinnlos. Allerdings ist es schon möglich, dass bei einigen Programmen sowas helfen kann.
PP´s of STARSOFTBerlin__________github|meine Webseite|Demozoo

Benutzeravatar
Kveldulfur
Beiträge: 1036
Registriert: 17.08.2021 02:32
Has thanked: 474 times
Been thanked: 437 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von Kveldulfur »

Hallo!

Wenn man z.B. WUDSN zum Programmieren nutzt, sollte man im Altirra einstellen, dass er den RAM mit Zufallmuster füllen soll, so ähnlich wäre es dann auch beim ATARI nach dem Einschalten.

Das Problem ist, wenn man einen Bereich als Bildschirmspeicher und/oder einen Variabel-Bereich definiert, ohne diesen zu "initialisieren", kann es im Emulator alles gut aussehen, im ATARI geht dann plötzlich nichts mehr oder Datenmüll ist auf dem Bildschirm.
Hier wäre die sinnvollste Option den Programmierer zu informieren, dass er sein Programm noch einmal anpassen muss.

Grüße
Janko

PS: Habe bei Schränker 3 das Problem gehabt, dass es im Emulator und auf dem 600XL funktioniere, jedoch auf dem 1200XL anfangs nicht lief.
Man sollte daher sein Programm möglichst auf mehreren unterschiedlichen Systemen testen.
Meine Projekte findest Du hier...

Benutzeravatar
Kveldulfur
Beiträge: 1036
Registriert: 17.08.2021 02:32
Has thanked: 474 times
Been thanked: 437 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von Kveldulfur »

FlorianD hat geschrieben:
19.10.2024 13:43
Warum sollte man die Page 0 löschen, da stehen jede Menge aktuelle OS Infos drin?
Hallo!

Das ist nur eine Vermutung, aber wenn das ATARI BASIC vom OS gestartet wird (oder initialisiert) werden einige Page 0 Speicherzellen geändert... bzw. sie sind anschließend <>0. Wenn jemand die Page 0 für sein Programm nutzt und nicht sauber die Speicherzellen vorher auf 0 setzt, könnte es zu einem Quereffekt kommen.

Grüße
Janko
Meine Projekte findest Du hier...

Benutzeravatar
CharlieChaplin
Beiträge: 971
Registriert: 18.06.2021 22:59
Has thanked: 290 times
Been thanked: 331 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von CharlieChaplin »

Oh, ich finde zumindest Basic bei ML-Programmen automatisch abschalten nicht sinnlos.
Bin kein Fan von Option-Taste gedrückt halten...

Benutzeravatar
pps
Beiträge: 764
Registriert: 18.06.2021 23:05
Has thanked: 189 times
Been thanked: 371 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von pps »

CharlieChaplin hat geschrieben:
19.10.2024 18:12
Oh, ich finde zumindest Basic bei ML-Programmen automatisch abschalten nicht sinnlos.
Bin kein Fan von Option-Taste gedrückt halten...
Das war nicht meine Aussage. ;)

Ich meinte wirklich, dass es nicht zielbringend ist, das einfach OHNE Grund davor zu hängen.

Wie Kveldulfur schrieb, sollte am besten der Programmierer selbst das einbauen. Wenn er das nicht getan hat, eine Info bekommen. Ich habe früher definitiv auch aus Unwissenheit vieles falsch gebaut. Nach und nach wird das besser.

Solch ein generelles Davorhängen sollte daher eigentlich unnötig sein mittlerweile bei Sachen von mir, da ich mich selbst um den Kram kümmere.

Wenn es mal nicht so ist, wäre ich über eine Info glücklicher, als unwissend meine Fehler weiter zu begehen.

Klar ist auch, dass man nicht Jeden erreichen kann und solche Tools dann nützlich sein können.
PP´s of STARSOFTBerlin__________github|meine Webseite|Demozoo

Elephant
Beiträge: 28
Registriert: 17.08.2021 00:56
Been thanked: 17 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von Elephant »

>Warum zum Beispiel VBI gerne in Page 6?

Page 6 wir vom OS, DOS und Basic nicht angefasst.

Ist also nur nötig für Kleinigkeiten, die im Hintergrund laufen sollen.

patjomki
Beiträge: 341
Registriert: 18.08.2021 23:21
Has thanked: 127 times
Been thanked: 72 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von patjomki »

DocSash hat geschrieben:
19.10.2024 16:20
Nochmal kurz wegen des Basics: nachdem ich Depp ja nicht drauf geachtet hatte, dass das im Emulator noch immer aktiviert war, und dadurch ja von einem Top von $A000 ausgegangen bin, stellte sich mir auch die Frage, ob man das nicht auch programmatisch lösen könnte, was ja anscheinend tatsächlich geht. Wenn ihr dazu vielleicht noch eben einen Tipp hättet, wie man das macht?
Also ich mache das immer so:

Code: Alles auswählen

	org $2000

; Diese Routine wird als erstes geladen und schaltet das BASIC ($a000-$bfff) aus,
; d.h. der Anwender muss nicht mehr zwingend OPTION gedrückt halten
initialize lda $d301 	; PortB
	ora #$2		; BASIC ausschalten
	sta $d301
        rts

        ini initialize

patjomki
Beiträge: 341
Registriert: 18.08.2021 23:21
Has thanked: 127 times
Been thanked: 72 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von patjomki »

CharlieChaplin hat geschrieben:
19.10.2024 18:12
Oh, ich finde zumindest Basic bei ML-Programmen automatisch abschalten nicht sinnlos.
Bin kein Fan von Option-Taste gedrückt halten...
Finde die Idee auch gut (s. mein obiges Quellcodebeispiel).
In meiner für mich erzeugten Version von superfly xl lite habe ich das bereits eingebaut, aber leider noch nicht veröffentlicht. Die Zeit...
Die veröffentlichte Version kann das nicht, weil ich damals noch nicht wusste, wie das geht. Weitere Verbesserungen: Kein Bildschirmmüll mehr beim Laden und ab-/anschaltbarer Sound.

Benutzeravatar
CharlieChaplin
Beiträge: 971
Registriert: 18.06.2021 22:59
Has thanked: 290 times
Been thanked: 331 times
Kontaktdaten:

Re: Assembler-Beginner: PM im VBI

Beitrag von CharlieChaplin »

Habe für "Basic abschalten ohne Option-Taste" mal ein extra Topic gestartet.

Manche Programmierer benutzen für ihr Programm auch $BC00-BFFF, das ist glaube ich der Bildschirmspeicher und zeigt beim Laden sodann Datenmüll an. Im Superpacker 1.0 von Bewesoft ist das auch die voreingestellte (aber änderbare!) Adresse für den Depacker, so dass man beim Entpacken ebenfalls Datenmüll sieht.

Beim Superpacker von Bewe kann man einfach eine andere unbenutzte Adresse für den Depacker einstellen und die Datei dann neu abspeichern (das geht sogar, wenn das Programm bereits gepackt wurde!) und schon sieht man keinen Datenmüll mehr. Das habe ich z.B. bei zahlreichen gepackten Demos und Intros von Heaven nachträglich gemacht, weil Datenmüll beim Entpacken einfach sch.... aussieht.

Wenn das Programm selber aber $BC00-BFFF benutzt und dadurch Datenmüll anzeigt (weil der Programmierer es nicht anderweitig unterbunden hat), dann greife ich als nicht-Programmierer gerne auf Tools zurück, die das verhindern:

POKE559.COM: $022F-022F: schaltet den Bildschirm aus; macht natürlich nur Sinn, wenn das Programm oder der Packer (z.B. Code3 Cruncher, Superpacker von TeBe) beim Programmstart den Bildschirm wieder einschaltet;

SCROFF.COM: $0400-0408: schaltet auch den Bildschirm aus, denn komischerweise funkt. die $022F Routine nicht immer (keine Ahnung warum), also habe ich mir von Fandal noch eine Routine coden lassen, die das zuverlässig und immer macht; macht natürlich nur Sinn, wenn das Programm oder der Packer den Bildschirm beim Programmstart wieder einschaltet;

TITLE6.COM: $0600-0668: Schaltet den Bildschirm bis auf ca. zwei Zeilen Gr. 2 (bzw. Gr. 18) Text aus; man kann in den zwei Zeilen prima einen Titeltext unterbringen; das Programm zeigt den Titel dann bis zum Programmstart (Run-Adresse) an, d.h. aber auch, dass das Programm selber NICHT die Page 6 belegen darf, da es sonst damit kollidiert; [Seltsamerweise zeigen Programme, die diese Routine benutzen mit dem Abbuc-Menü ca. 10 Zeichen Datenmüll an, keine Ahnung warum; vielleicht nutzt das Abbuc Menü ja ein paar Bytes von Page 6 ?]

Die Routine eignet sich auch gut für Module, die in COM/XEX Dateien umgewandelt wurden und $8000-BFFF oder $A000-BFFF belegen, denn man kann damit ebenfalls einen Titel anstelle von Datenmüll anzeigen lassen; wäre schön, wenn es diese oder eine ähnliche Routine auch für andere Speicherbereiche gäbe (z.B. Page 4, Page 5, etc.). Auch für G2F Titelbilder ist sie z.T. geeignet, da manche dieser Bilder nach einem Tastendruck zwar weiterladen, aber noch PM-Reste als Datenmüll auf dem Bildschirm zurücklassen; bei einigen hilft jedoch nur Bildschirm ganz ausschalten (die $022F-Routine oder die $0400-0408 Routine)...

Bin halt selber kein Programmierer und kann nur nutzen, was ich an Tools oder Routinen so zur Verfügung habe (von daher verlasse ich jetzt besser dieses Topic).
Dateianhänge
POKE559.XEX
(7 Bytes) 155-mal heruntergeladen
SCROFF.XEX
(21 Bytes) 150-mal heruntergeladen
TIT6LE.XEX
(117 Bytes) 149-mal heruntergeladen

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast