Assembler: Inhalt einer Speicherzelle auf Bildschirm ausgeben

Moderator: Rockford

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

Assembler: Inhalt einer Speicherzelle auf Bildschirm ausgeben

Beitrag von DocSash »

Moin,

der Anfänger mit den Noob-Fragen mal wieder: wie gebe ich am effektivsten den Inhalt einer (oder mehrerer Speicherzellen bei höheren Werten) auf dem Screen aus?

Konkret: in meinem PacMan-Klon soll PacMan ja natürlich auch mit Punkten belohnt werden. Ich speichere also die Anzahl der gefressenen Punkte (meinetwegen multipliziert mit x) in einer Speicherzelle und möchte nun die Punkte einfach dezimal an eine bestimmte Stelle auf den Screen printen. Mit einem Byte natürlich erstmal nur max. 255 Punkte, daher eher 2 Byte. Als ich das "mal eben" umsetzen wollte, fiel mir natürlich auf, dass das ja nun gar nicht so einfach ist. Ich habe 3 (oder max. 4) Bytes in einer Gr. 1 Zeile dafür vorgesehen. Am liebsten sogar in dem Format 0815, also mit vorangestellten Nullen. Ich hätte jetzt wahrscheinlich eine endlos umständliche Routine geschrieben, mit zig Branches die den Wert in die einzelnen Dezimalstellen zerhackt, aber für so eine "Standard"-Aufgabe gibt es doch garantiert elegantere Lösungen, oder?

Hatte mir da vorher keine Gedanken drüber gemacht, aber in Assembler muss man wirklich immer darauf gefasst sein, dass es keine selbstverständlichen Sachen gibt.

Benutzeravatar
JAC!
Beiträge: 177
Registriert: 18.06.2021 23:13
Has thanked: 134 times
Been thanked: 177 times
Kontaktdaten:

Re: Assembler: Inhalt einer Speicherzelle auf Bildschirm ausgeben

Beitrag von JAC! »

Der 6502 hat einen BCD - Binary Coded Decimal Mode. Dabei werden je 4 bit einen Byte als Zahl von 0..9 interpretiert (statt 0..F). Also $00 bis $99 statt $ff. Das erlaubt eine sehr einfache stelleweise Umwandlung in Dezimalzahlen:

Code: Alles auswählen

; Variable
.byte punkte

; Dezimal hochzählen
clc
sed ;Dezimalmodus an
lda punkte
adc #1
sta punkte
cld ;Dezimalmodus aus

;Dezimal ausgeben
lda punkte
and #$0f ;Untere 4 bit, 0...9
clc
adc #'0'
sta screen_einer

lda punkte
lsr
lsr
lsr
lsr ; Obere 4 bit, 0...9
clc
adc #'0'
sta screen_zehner
Für mehr als $99, braucht man eben mehr Bytes und addiert im BCD Modus mit Übertrag (Carry).
Visit https://www.wudsn.com the home of WUDSN IDE.


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

Re: Assembler: Inhalt einer Speicherzelle auf Bildschirm ausgeben

Beitrag von DocSash »

BCD heißt das Zauberwort. Hatte ich auch schon mal gelesen, aber eher überlesen, weil zu dem Zeitpunkt nicht relevant. Genial, Danke.

hatten wir schon ;-)
Ups, sorry. Aber dann ist es jetzt nochmal unter einem allgemeineren Topic zu finden. :D

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast