Hallo Besucher, der Thread wurde 2,8k mal aufgerufen und enthält 7 Antworten

letzter Beitrag von hannenz am

Hex nach Dezimal

  • Tach !


    Ich möchte unter anderem den Wert $12 in Dezimal ändern. Ich habe folgende Routine geschrieben. Warum kommt da 17 raus und nicht 18 ?!?
    Den Wert $12 kopiere ich in $FB und los gehts, oder auch nicht :(


    Ich kapiers nicht !!


    Hilffeeeeeeee.....


    1980 LDA #00
    1982 STA FC
    1984 STA FB
    1986 AND#0F
    1988 LSR
    1989 LSR
    198A LSR
    198B LSR
    198C CLC
    198D TAX
    198E LDA FC
    1990 ADC#16
    1992 STA FC
    1994 DEX
    1995 BNE 198E
    1997 LDA FB
    1999 AND #0F
    199B CLC
    199C TAX
    199D LDA FC
    199F ADC#01
    19A1 STA FC
    19A3 DEX
    19A4 BNE 199D
    19A6 RTS


    Der richtige Dezimalwert sollte dann in $FF stehen. Ich brauche den max. Wert von 35, daher gibt es keine Verzweigungen bei Überläufen...


    Wer kann helfen ?


    mfG Hucky

  • Hmmm... irgendwie hängt mir die Fragestellung quer im Hirn. Versteh ich das richtig, Du willst aus $12 eine $18 machen?


    Mein erster Gedanke war:


    1000 LDA #$12
    1002 STA $FB
    1004 JMP $inthefire
    .
    .
    .
    1980 LDA #$00
    1982 LDX $FB
    1984 CLC
    1985 SED
    1986 DEX
    1987 BMI $198D
    1989 ADC #$01
    198B BNE $1986
    198D STA $FF
    198F CLD
    1990 RTS


    Möglich, daß ich auch danebenhau, hab den Code nicht getestet. Aber so etwas Ähnliches hat schonmal funktioniert bei mir...

  • Um aus $12 einen Text zu machen, den Du zur Floppy schicken kannst, probier's mal hiermit:


    1000 LDA #$12
    1002 STA $FB
    1004 JMP $inthefire
    .
    .
    .
    1980 LDA #$00
    1982 LDX $FB
    1984 CLC
    1985 SED
    1986 DEX
    1987 BMI $198D
    1989 ADC #$01
    198B BNE $1986
    198D STA $FF
    198F CLD
    1990 AND #$0F
    1992 ADC #$30
    1994 STA $FC
    1996 LDA $FF
    1998 LSR
    1999 LSR
    199A LSR
    199B LSR
    199C ADC #$30
    199E STA $FB
    19A0 RTS


    Der Hex-Wert steht anfangs in $FB, die Wandlerroutine ist wieder ab $1980. Der Ausgabetext steht in $FB und $FC (als ASCII), das Zwischenergebnis als BCD-Zahl in $FF.


    Für den Wert $12 (in $FB) steht also dann in $FB/$FC "18".

  • ... und noch ein Versuch. Der leitet sich von einem Beitrag in comp.sys.cbm ab, der Erfinder des Prinzips fällt mir jetzt aber nicht ein - müßte man suchen...



    * Subroutine Input akku in Hex, Output akku=fc in Dec
    sta $fb
    lda #$0
    sta fc
    ldx #$8
    sed
    * Loop
    asl $fb
    lda $fc
    adc $fc
    sta $fc
    dex
    bne Loop
    cld
    rts


    Das Prinzip funktioniert so, daß der Wert parallel bitweise verdoppelt und übertragen wird, einmal in Hex mit asl und dann mit adc mit sich selbst bei gesetztem Dezimal-Flag in Dec. Das funktioniert analog auch mit mehr als einem Byte.


    Die Routine habe ich jetzt schnell getestet: aus $12 wird 18 :) Ich hoffe nur, ich habe beim Abtippen nichts verhaut, ist ja doch schon ziemlich spät... :gaehn


    Franz

  • ld a,<zahl>
    call umrechnen
    .
    .

    umrechnen
    ld b,$FF ; = Zähler für Zehnerstellen
    scf
    ccf
    lp inc b
    sbc $0A
    jr nc,lp
    add $0A
    add "0"
    ld (einer),a
    ld a,b
    add "0"
    ld (zehner),a
    Ret


    Ist halt für Z80...aber sollte sich trotzdem umsetzen lassen. Hoffentlich klappt das auch 100% - habs mir eben zusammengesponnen :D


    Gruß,


    Brueggi



    P.S.: Oder hab ich schonwieder was falsch verstanden????

  • Danke Euch allen...


    Habe meine Routine umgebastelt. Ließ mir keine Ruhe.
    Jetzt funktioniert es. Erstmal muß es AND#F0 in der Zeile 1986, nicht AND#0F. War schon spät...
    Und dann habe ich Dussel noch den Dezimalmodus vergessen...
    Habe mich immer gewundert, das bei 16+16 2C rauskam und nicht 32. Oh,oh...


    Hier mein Code: (Ist vielleicht etwas umständlich, aber so verstehe ich es jedenfalls und das ist für mich wichtig....)


    1980 LDA #00
    1982 STA FC
    1984 LDA FB
    1986 AND#F0
    1988 LSR
    1989 LSR
    198A LSR
    198B LSR
    198C CLC
    198D TAX
    198E BEQ 199C
    1990 SED
    1991 LDA FC
    1993 ADC#16
    1995 STA FC
    1997 CLD
    1998 DEX
    1999 JMP 198E
    ------------------------------
    199C LDA FB
    199E AND#0F
    19A0 CLC
    19A1 TAX
    19A2 BEQ 19B0
    19A4 SED
    19A5 LDA FC
    19A7 ADC#01
    19A9 STA FC
    19AB CLD
    19AC DEX
    19AD JMP 19A2
    -------------------------------
    19B0 RTS



    mfG Hucky

  • Gut das das jetzt klappt.


    Ist sowieso völlig wurscht, ob es nun kurz ist oder lang - hauptsache a) es funzt und b) DU weisst, was dahinter steckt.


    Glaubst Du meine Programme sind kurz :D ? Nein. Ich gehe immer danach, wie ich es gerade im Kopf habe - auch wenn sich im Nachhinein eine kürzere Lösung ergibt.


    Gruß,


    Brueggi.

  • Yeah! Es lebe der Spagetti-Code!
    Irgendein bekannter Programmierer soll auch mal gesagt haben: "Ein Code ist dann gut, wenn ihn ausser dem Programmierer selbst kein Mensch mehr nachvollziehen kann" :) Ob man das so stehen lassen kann sei dahingestellt, aber das nur so nebenbei. Ich code auch aus dem Kopf raus, wie's grad kommt und passt. Hinterher schau ich dann, wo man noch ein paar Bytes sparen kann aber die eigentlichen Algorhitmen lass ich dann auch so wie sie eben sind