2016-07-29 23 views
-2

Ich muss herausfinden, wie man eine Routine für die LR35902 (die Z80-wie CPU des Spiels), dass nimmt den Inhalt von HL (nicht wohin er zeigt, die tatsächliche Zahl, die darin gespeichert ist) und konvertiert sie in 1 bis 5 (tatsächliche Werte würden von 0 bis 65.535 reichen, da HL 16 Bit ist) Nicht-ASCII * -Zeichen verwenden das Dezimalsystem. Ich habe Routinen zum Drucken und kann leicht einen Weg finden, führende Nullen zu schneiden.Umwandlung einer vorzeichenlosen 16-Bit-Ganzzahl von HL in Text mit meiner eigenen Nicht-ASCII-Charmap als Dezimal, mit LR35902 Assembly

Alles, was ich brauche, ist zumindest ein Pseudo-Code für diese Funktion und höchstens eine tatsächliche RGBDS LR35902 ASM-Routine.

* Anstelle von ASCII verwende ich meine eigene 1-Byte-pro-Zeichen-Charmap, in der das Zeichen 0 das hexadezimale Byte $ 17 ist und sich auf 9 erhöht, also $ 20.

+0

können Sie ein paar einfache Beispiele bereitstellen, um zu demonstrieren, wonach Sie suchen, ein paar von diesem Bitmuster zu diesem Ausgabemuster. –

+0

Die gleiche Art, wie Sie es in ASCII konvertieren würden, die ihre Ziffern im Bereich $ 30 bis $ 39 hat. –

+0

@dwelch:% 0000000110111010 (442) = $ 1B, (4) $ 1B, (4) $ 19 (2) – wolfboyft

Antwort

3

Wie verdecke ich Sekunden auf Basis 60 (Stunden Minuten Sekunden)? 1234 Sekunden für examaple

divide 1234 3600 (60^2) Stunden zu erhalten, die Null-Rest 1234

divide Rest 1234 60 (60^1) Minuten zu erhalten, die 20 Minuten sind Rest 34

divide Rest 34 von 1 (60^0) Sekunden zu erhalten, die 34 10

So 1234 Sekunden Base Base umgewandelt ist auf 60 (HH: MM: SS) 00:20:34

Materie Doesnt Was die Basen sind, ist die gleiche Umwandlung, es sei denn, eine Base ist ein Powe r der anderen Basis (binär zu hex, hex zu binär, binär zu oktal, oktal zu binär), dann können Sie Abkürzungen verwenden.

Sie gehen von Base 2 zu Base 10 und dann können Sie ASCII oder eine andere Darstellung für die Basis 10 Ziffern verwenden.

Diese Frage wurde hunderte Male hier gestellt. Die nächste Frage, wie teile ich durch 10, wenn Ihr Prozessor keine Teilung hat. Auch oft gefragt und beantwortet.

Die Umwandlung von Ziffern in Ihre Anzeige Darstellung ist auf Sie würden wir brauchen, um die ganze Tabelle zu sehen, da Sie nur 10 Ziffern haben, um mit Ihnen zu tun, wenn nichts anderes tun, nur eine Nachschlagetabelle.

+2

+1! :) ... und etwas hinzuzufügen. Wenn dies beispielsweise Score oder ein anderer Wert ist, der oft angezeigt wird (aber in Berechnungen oft nicht verwendet wird), können Sie entweder BCD (spezielle Kodierung, zwei Ziffern pro Byte, nativ von Z80 unterstützt (Anweisungen wie 'DAA') verwenden)) oder digit-per-byte (0..9 Zahlen, eventuell direkt im speziellen Encoding) -Format anstelle von binary number =>, um die Umwandlung in einen String schneller zu machen (Vermeidung eines echten Software-Div durch 10^n). – Ped7g

-1

Bonus-Vorroutinen, um die Zahl HL-Punkte in oder die Zahl in A zu konvertieren.

Dies funktioniert, es ist nur eine Frage des Beschneidens führender Nullen.

ConvertNumberHLPoint:: 
    ld a, [hl] 
ConvertNumberA:: 
    ld h, 0 
    ld l, a 
ConvertNumberHL:: 
    ; Get the number in hl as text in de 
    ld bc, -10000 
    call .one 
    ld bc, -1000 
    call .one 
    ld bc, -100 
    call .one 
    ld bc, -10 
    call .one 
    ld c, -1 
.one 
    ld a, "0"-1 
.two 
    inc a 
    add hl, bc 
    jr c, .two 
    push bc; 
    push af; 
    ld a, b; 
    cpl; 
    ld b, a; 
    ld a, c; 
    cpl; 
    ld c, a; 
    inc bc; 
    call c, .carry; 
    pop af; 
    add hl, bc; 
    pop bc; 
    ld [de], a 
    inc de 
    ret 

.carry; 
    dec bc; 
    ret; 

Wenn es so ein Opcode als sbc hl ist, bc auf der LR35902, wie es auf der Z80 ist, wäre es möglich, die Linien zu ersetzen, die mit leerem comments-- ; Ende - mit ihm. Stattdessen sichern wir bc und af, invertieren bc und inkrementieren es (Zweierkomplement,), inkrementieren sie dann, um die carry-Funktion in der SBC-Anweisung zu verwenden, wenn carry gesetzt ist, dann un-backup af, add hl zu der zwei ergänzt bc und schließlich un-backup bc.

+0

warum halten Sie nicht einfach "alten hl" herum, wie ld ix, hl vor add hl, bc, dann ld hl, ix, um es wiederherzustellen (sorry, wenn die CPU ix nicht wie Z80, dann Sie haben keine regs mehr, denke ich ... habe Z80 asm seit 10+ Jahren nicht mehr gemacht;)) – Ped7g

+0

BTW, das benutzt plötzlich ASCII? 'ld a," 0 "-1 ... Ich würde" ld a, 0x17-1 "gemäß deiner Fragebeschreibung erwarten. :) (muss mir nicht antworten, nur eine Kuriosität) – Ped7g

+0

Aber ich denke der 'ConvertNumberA ::' Prolog hat tatsächlich einen echten Fehler. Wahrscheinlich willst du "a" in hl laden, also 'ld h, 0 ld l, a'. 'de' verweist auf den String Buffer und sollte nicht verändert werden? – Ped7g