Schlagwort-Archive: 6502

Code Optimierung

Programmiert habe ich im letzten Jahr viel in Java mit Android Studio oder Eclipse. Weniger mit ATMASS II oder dem Assembler Editor . Aber, weil ich meinem Atari 800XL die Kommunikation mit meinem Handy (Android) beibringen möchte und neben der Hard- auch die entsprechende Software brauche, habe ich wieder damit begonnen mich mit der 6502 Maschinensprache zu beschäftigen.

Für den kleinen Atari brauche ich ein einfaches Terminal das Daten seriell sendet und empfängt. Begonnen habe ich mit einer Machbarkeits Studie zum Senden. Das Programm nimmt einen String und wandelt jeden Buchstaben in eine Binärzahl. Gesendet wird das LSB zuerst, zunächst auf den Bildschirm, später an die Ausgabe.

Screen Shot 2019-03-08 at 12.09.36 PM

Test- Code zum für das serielle Senden von Daten in 6502 Assembler. Es wird ein Byte geholt und acht mal nach rechts verschoben (lsr). Wenn Bit 0 gesetzt war, wander es in das Carry- Flag des 6502. Wenn es nicht gesetzt war, bleibt das Carry- Flag unberührt. Anschließend wird entsprechend dem Ergebnis entweder 0  oder 1 gesendet. Hier, zu Testzwecken,  an den Bildschirmspeicher (Die Adresse ist in der Speicherstelle 88 und 89 -low- byte/ high- byte – abgelegt).

Der Ausschnitt aus meine Code zeigt, wie sich durch geschicktes Ausnutzen der Tatsache, dass „ADC #0“ nur dann „null“ addiert, wenn das Carry- Flag nicht gesetzt ist. Ist es gesetzt, dann wird „null+Carry“, also „eins“ addiert.
Man beachte nun die auskommentierten Code- Zeilen, insgesamt fünf, die man einsparen kann.

 


Apple Logo Source Code…..

Der Source Code für das Apple ][ Logo wurde gefunden und veröffentlicht: Ada Fruit Blog (Letzter Aufruf am 10.11.2018)


Plot Routine, ein Geschwindigkeitsvergleich

Im Basic Grafik- Modus 7 des Atari 8- Bit soll an beliebiger Stelle ein Bildpunkt ein/ ausgeschaltet werden. Vergleichbar mit dem Plot- Befehl des Atari Basic.

Die Routine die das tut, soll in 6502- Assembler laufen. Farbe und X- sowie die Y Koordinate werden an das Programm übergeben. Aus den Koordinaten muss nun die Adresse des Bytes im Bildspeicher berechnet werden, in dem sich das gesuchte Bit – der Bildpunkt/ das Pixel – befindet. Schließlich wird das Bit und damit der Bildpunkt gesetzt.

In der Grafikstufe 7 besteht eine Zeile auf 160 Bildpunkten und belegt 40 Bytes. Aus der Y- Koordinate ergibt sich die Zeilenadresse indem man die mit der Anzahl der Bytes multipliziert. Je Größer Y, desto mehr Zeit vergeht, bis die Zeilenadresse berechnet ist. Film 1 zeigt die Variante der Routine, die für jeden Bildpunkt die Zeilenadresse immer wieder neu berechnet.


Film 1

Film 2 zeigt eine Variante bei der die Zeilenadressen einmal berechnet und dann in einer Tabelle abgelegt wurden. Das Ergebnis: Es geht schneller.


Film 2

Ganz ähnlich habe ich das im Rahmen eines Spiels verwirklicht. Auch hier wurde es vermeiden, dass Selbe zu wiederholen, sondern, zeitaufwendiges wurde nur einmal gemacht und die benötigten Ergebnisse in einer Tabelle abgelegt von wie die dann nur noch abgeholt werden müssen. Näheres dazu da: Rock, Determinismus in Assembler

Viel Spass!


Sweet 16

Sweet 16 ist eine Betriebssystem Routine im ROM des Apple II, eine Erweiterung des 6502 Befehlssatzes die dem 8- Bit Prozessor zu 16- Bit Funktionalität verhilft.

Näheres dazu hier im Blog:
Artikel zu „Sweet 16“ (Digi Barn Computer Museum)

Aber, Sweet 16 ist nicht nur eine geniale Betriebssystem Routine, Sweet 16 steht stellvertretend als Model dafür, wie sich der Befehlssatz des 6502- Prozessors erweitern lässt. Nebeneffekt – gewünscht oder nicht – der Source obfuskiert sich quasi von selbst.

Grundsätzlich lässt sich Sweet 16 auf dem Apple ][ folgendermaßen nutzen:

JSR SW16

20140406-210651.jpg
Sweet 16, Diassembliert

Der vollständige Source Code findet sich in:
Wozniak, Steve (1977): The Woz Wonderbook.  A compendium of notes, diagrams, articels, instructions and code that describes the Apple ][ Computer and how to program it.

Auf das JSR folgt der Sweet 16 Befehlssatz, der dann schrittweise von der Subroutine (SW16) interpretiert wird.

Genutzt wird die Funktion des 6502 Befehls Jump to Subroutine (JSR). Der Befehl springt die angegebene Adresse an, merk sich aber die Adresse des auf den Befehl JSR folgenden Bytes, indem er diese auf den Stack rettet. Zuerst das High- Byte, dann das Low Byte.

Man denk sich nun die so auf den Stack geschriebene Rückkehradresse sollte auf den nächsten Befehl zeigen. dem ist aber – wie obe beschrieben – nicht so. Dieser „Fehler“ wird korrigiert, indem das RTS die Rückkehradresse automatisch um eins erhöht. Vergleiche in: N.N. (1976) : MCS 6500 Microcomputer Family Programing Manual. Januar 1976. Norristown: MOS Technology Inc.

Um einen Fehler handelt es sich dabei eigendlich nicht. Die oben beschriebene Tatsache entspringt vielmehr der Festlegung, dass Adressen auf dem Stack immer auf die nächste freie Stelle im Speicher zeigen sollen (ebenfalls nachzulesen in der o.g. Quelle).


Undokumentierte Opcodes…..

…zumindest hat das MOS nicht getan. Wie gut das es eine funktionierende Community gibt.

Auf der folgenden Seite findet ihr außer dem DOP – dem doppelten NOP – noch weitere neckische Spielereien für die 6502 Architektur eurer Wahl. So richtig was für lange kalte Winterabende. Viel Spass wer’s noch nicht kannte.

http://www.ataripreservation.org/websites/freddy.offenga/illopc31.txt


Bubble Sort V2

Meine erste Lösung zum Bubble Sort Algorithmus in 6502 Assembler kann man sich hier im Blog anschauen: Bubble Sort. Ein Array von max. 255 8- Bit Integern wird aufsteigend sortiert.

Die aktuelle – auf das vorgenannte Programm aufbauende – Routine schafft es ein Array mit 255 Elementen zu sortieren. Die Maximale Länge je Element beträgt 255 Buchstaben/ Ziffern.

Wie das geht? Schaut mal da: Bubble Sort

Das Array darf entweder Zahlen oder Buchstaben enthalten oder eine Kombination aus beidem.


Bubble Sort

Ich glaube das hier  funktioniert….

Bubble Sort Routine. Sortiert eine Feld von max 255 8- Bit Integern, aufsteigend.

Bubble Sort Routine.
Sortiert eine Feld von max 255 8- Bit Integern, aufsteigend.