6502-Programmierrätsel


6502-Programmierrätsel

von Dietrich » Sa 3. Jul 2010, 16:02
Hi,

ich bin gerade mal wieder am 6502-Programmieren und dabei über einen lustigen Effekt gestolpert:

Im Akkumulator befindet sich ein Wert von 0 bis 15 (dezimal). Wie sieht die kürzeste (!) Routine aus, die diesen Wert in das entsprechende hexadzimale ASCII-Zeichen (0-9 bzw. A-F) umwandelt?
(D.h. 0-9 soll in $30-$39 und 10-15 soll in $41-$46 gewandelt werden.)

Rätselhafte Grüße
Dietrich

Re: 6502-Programmierrätsel

von HiassofT » Sa 3. Jul 2010, 18:13
Hi!

Ich bin da normalerweise faul und mache einfach
Code: Alles auswählen
    tax
    lda hextab,x
...
hextab .byte "0123456789ABCDEF"

Braucht natürlich 16 Bytes für die Tabelle und 4 Bytes pro Umwandlung (bzw 3 wenn die Tabelle in der ZP liegt).

Kürzer ist aber zB Folgendes:
Code: Alles auswählen
tohex
    ora #$30
    cmp #$3a
    bcc end
    adc #$06
end rts

Sind insgesamt 9 Bytes (inkl. rts) und braucht 3 Bytes pro Umwandlung (jsr tohex).

so long,

Hias

Re: 6502-Programmierrätsel

von Dietrich » Sa 3. Jul 2010, 19:47
9 Bytes - nicht schlecht, aber es geht noch kürzer. Wie?

Erneut rätselhafte Grüße
Dietrich

Re: 6502-Programmierrätsel

von Bernd » Sa 3. Jul 2010, 21:41
Sorry,
bei dem Wetter macht mein Hirn nur NOP,NOP,NOP.......
Das erste Beispiel von Hias benutze ich in meinen Programm, die zweite Lösung ist schon sehr gut optimiert.
Wie soll man den da noch ein Byte einsparen? Auf die Lösung bin ich schon gespannt.

Bernd

Re: 6502-Programmierrätsel

von Koche » Sa 3. Jul 2010, 22:35
7 Bytes ohne RTS, 8 dann mit ......

Code: Alles auswählen
sed           
clc           
adc #$90       
adc #$40       
cld           


oder noch sparsamer

Code: Alles auswählen
sed
cmp #$0a
adc #$30
cld


-> 6 Bytes ohne RTS, 7 mit .......

Re: 6502-Programmierrätsel

von HiassofT » So 4. Jul 2010, 14:27
Hi!

Koche hat geschrieben:
Code: Alles auswählen
sed
cmp #$0a
adc #$30
cld


-> 6 Bytes ohne RTS, 7 mit .......

Ah, ja, da war ja was mit dem undokumentierten Verhalten im Dezimal Modus :-) Hab gerade wieder den Link dazu gefunden: http://www.6502.org/tutorials/decimal_mode.html#6

BTW: Vor kurzem hat ijor eine detaillierte technische Beschreibung zum Verhalten der Flags im Dezimal Modus auf AtariAge gepostet: http://www.atariage.com/forums/topic/163876-flags-on-decimal-mode-on-the-nmos-6502/

Ich persönlich habe den Dezimal Modus nie verwendet. OK, ein einziges Mal habe ich ein "CLD" verwendet, nämlich in der Freezer Software, damit sie auch direkt nach einem PowerUp/Reset korrekt läuft (nach einem Reset ist der Zustand des D Flags undefiniert, die originale Freezer Software hatte kein "CLD" am Anfang drin und lief dann nicht korrekt).

so long,

Hias

Re: 6502-Programmierrätsel

von Dietrich » So 4. Jul 2010, 18:35
Richtig, es ist schon erstaunlich was man mit dem Decimal Mode so alles anstellen kann.

Ich selbst benutzt den Dezimalmodus nur, um eine binäre 16 Bit-Zahl als ASCII dezimal auszugeben. Das geht so:
Code: Alles auswählen
; Binär (wert) in BCD (erg) wandeln
lda #0
sta erg
sta erg+1
sta erg+2
sed
ldx #16
?1 asl wert
rol wert+1
lda erg
adc erg
sta erg
lda erg+1
adc erg+1
sta erg+1
lda erg+2
adc erg+2
sta erg+2
dex
bne ?1
cld
rts

Nun kann man die BCD-Zahl mit einer einfachen Hex-Ausgabe-Routine anzeigen.
Was benutzt Ihr den für Routinen, um einen binären Wert als Dezimalzahl anzuzeigen?

Gruß Dietrich