Schlagwort-Archive: 6502

Der 6502…

…“Reverse Engineering the MOS 6502″ wird versprochen. Klingt interessant und wird hiermit ganz offiziell in meine Feiertags- Playlist aufgenommen. Oder kurz. Schau ich mir an, wenn ich Zeit habe:

 


Der VBI…

…ist nützlich wenn man etwas auf dem Bildschirm verändern möchte, ohne das es der User bemerkt.

VBI heist „Vertikal Blank Interrupt“. Auf dem Atari wird der so initialisiert:

Das Y- Register erhält das Low und das X- Register das High Byte der Routine, welche man während des VBI ausführen möchte.
Der Akku erhält einen Wert, welcher bestimmt, um welchen VBI es sich handeln soll.

Für VBI- Routinen die während zeitkritischer Operationen des OS unterbrochen werden dürfen, wählt man eine 7 (deferred VBI).

Mit: JSR SETVBV ($E45C) initialisiert man die Routine, welche an der durch das Y- und X- Register adressierten Stelle im Speicher steht. Letztere muss immer mit einem JMP XITVBV ($E462)  enden.

Das war’s

Das Wesen des VBI ist es, dass er wegen der Eingangs erwähnten Eigenschaft ideal für zeitritische  Operationen auf dem Bildschirm ist.

Alles was während eines VBI auf dem Bildschirm geändert wird, bleibt dem Betrachter solange verborgen, bis das Bild erneut aufgebaut wird, da jene Änderungen passieren, während der Elektronenstrahl von der rechten unteren Ecke des Schirms zur linken Obereren Ecke des Schirms zurückkehrt, dabei selbstverständlich unsichtbar ist, um sogleich mit dem Zeichnen des nächstens Bildes – und damit der eben gemachten Änderung – fortzufahren. Elegant!


Simple Life…

…leider nicht, oder doch?

einfache Regel: Betrachtet wird eine Matrix aus 3 x 3 Zellen, wobei die mittlere Zelle in Abhängigkeit von der Anzahl der benachbarten Zellen entweder stirbt, überlebt oder, falls diese noch gar nicht existiert, geboren wird.

Die Regeln finden sich überall im Netz – z.B. Hier: http://www.math.com/students/wonders/life/life.html

Mein Programm produziert bis jetzt leider nur ein paar der bekannten statischen Zellverbände aus einem Zufallsmuster:

Drei aus vielen: Ein Zufallsmuster produziert drei statische Zellverbänden….

Na ja, immerhin. Faszinierend ist es allemal. Ich bleib dran 🙂


Es lebt!

..Life, das berühmte nach den Regeln von Conway. Fällt bei mir in die Kategorie „1000 Programme“ die ich noch schreiben will bevor ich den sagenhaften Löffel abgebe…..

Faszinierend. Einige einfache Regeln und eine Artenvielfalt entsteht auf dem Bildschirm. Wer sich selber ein Bild machen möchte dem sei „Golly“ für den Mac oder Windows empfohlen: http://golly.sourceforge.net/

Für den guten alten Atari 800 gab es das auch schon. Schaut mal hier im Blog nach: https://retrozock.com/2010/12/19/video-easel/

Überraschend an dem letztgenannten ist, dass es im Grafik Modus 7 rasend schnell abläuft. Meinen ersten, noch sehr langsamen Versuch, kann man sich hier ansehen:

Erster Test: Ungefär in der Mitte des Schirms, befindet sich ein sogenanntes „Boat“. Gesetzestreu verändert es sich nicht. Die wechselten Farben folgen aus dem Umstand, dass jede Zelle die überlebt durch einen Farbwechsel gekennzeichnet wird.

Gibt es eine besser Möglichkeit, die Geschwindigkeit seiner Grafikroutinen zu optimieren? Wir werden sehen. Meine eigene Plot- Routine  – schaut mal da:

https://retrozock.com/2012/10/17/plot-it-like-atari/

dürfte bislang noch die größte Bremse sein!


Plot it like Atari

Wollte ich schon immer. Punkte setzten in 6502 Maschinensprache. Fernes Ziel: Meine eigene Version des „Game Of Life“ 

Den Source dazu halte ich noch zurück, bis ich zufrieden damit bin. Optimierungsbedarf ist von Nöten. Das Video zeigt, es läuft, aber, viel zu langsam 🙂

Soviel sei veraten: Die Bremse ist die Berechnungsmethode für die gesuchte Zeile aus der Y- Koordinate. Die arbeitet noch mit einer Schleife und das frisst Takte! Der Lösungsansatz? Schaut mal da: https://retrozock.com/2012/07/13/locate-wird-schneller/


Irgendwas plus „0“ ist immer noch irgendwas……

ja, die Zahlentheoretiker mögen da vielleicht noch diskutieren, aber, der 6502- Coder weiss es besser.

Ich liebe lange Zugfahrten. Auf den Weg in meine alte Heimat aus Studienzeiten, Augsburg, habe mir mal das „MOS Microcomputer Programming Manual“ – voller Titel „MCS 6500 Microcomputer Family Programming Manual“, Ausgabe vom Januar 1976 – vorgenommen und (für mich) erstaunliches erfahren. Schaut mal da:

CLC

LDA LOW

ADC #20

STA LOW

LDA HIGH

ADC #0

STA HIGH

 

Einfach, effektiv, neckisch und elegant zugleich: Das „ADC #0“.

Immer bedenken: „ADC“ addiert das gewünschte inklusive des Carry- Flag zum Inhalt des Akkumulators. Damit dürfte das Snipplet oben verstanden sein, oder?

Frage: wer benutzt dafür noch ein BCS?

Übrigens: Beispiele für die Anwendung dieser Technik finden sich, wenn man sich mal den Code alter Software anschaut. Hier z.B. ein Auszug aus dem Source des Atari Macro Assemblers:

Auszug, Source des „Atari Macro Assemblers“

Unterstellt man die Konvergenz der Masse der Lösungen  zum Optimum eines Codes zu einem bestimmten Algorithmus, dann ergeben sich bestimmte Muster, welche hilfreich beim Auffinden bestimmter Programmteile sein können. Digitale Arcäologie pur! Als Beispiel dazu mag der Zugriff auf die Diskette des Atari 8- Bit dienen. Man suche nach den Verwendeten Speicheradressen (also „DSKUNIT“ oder dergleichen“) und könnte sich dann am besagten „ADC #0“ entlanghangeln um so die weitere Logig des Programmes zu entschlüsseln.

Die Eingangs genannte Dokumentation zum 6502 von MOS gibt es hier:

http://6502.org/documents/books/

Mehr Lesestoff hier im Blog:

https://retrozock.com/2012/04/08/6502-fundgrube/

 


Die Null, im Vergleich

Meditiere vor meinem 6502 Source zu „Rock“ – meiner ganz persöhnlichen „Boulder Dash“ Engine –

Interessant wieviel Code- Müll sich aus „unüberlegter“ Programmierung ergibt. Soviel zum Thema schmutziger Code. Schaut mal da:

Sprung mittels BNE ausführen, wenn der Inhalt der Speicherzelle X nicht Null ist:

  • Schlechtes Beispiel

    LDA X
    CMP #0
    BNE LABEL

  • Besser

    LDA X
    BNE LABEL

„CMP #0“ braucht kein Mensch, wenn „BNE“ sowieso immer dann ausgeführt wird, wenn das Zero Flag nicht gesetzt ist. Wird der Akkumulator mit Null geladen, dann wird das Zero- Flag gesetzt. Wird der Akkumulator mit einem Wert ungleich 0 geladen, dann wird das Zero- Flag nicht gesetzt und es wird zu „LABEL“ verzweigt.

Das Beispiel oben, lässt sich 1:1 auf  die Prüfung „ist gleich 0“ übertragen. Ganz nach dem Motto:

  • LDA X
    CMP #0
    BEQ LABEL

Das „CMP #0“ braucht hier auch niemand…… Armes „CMP #0“.

Denn: Wird der Akkumulator mit 0 geladen, dann wird das Zero- Flag gesetzt und BEQ wird ausgeführt, wenn genau das der Fall ist.

So, nun aber weiter, muss meinen Source aufräumen 🙂