Unter FutureOS kann man Zahlen ganz einfach in einen String umwandeln...
Im ROM A befindet sich die OS Funktion N_2_2C. Sie wandelt ein Byte in zwei ASCII Zeichen um.
Beim Aufruf enthält A das Byte und DE zeigt auf die Zieladresse im Speicher für die zwei Zeichen.
Die beiden generierten Zeichen stellen den Wert aus Register A im Hexadezimal-System dar, nicht dezimal. Damit kann man z.B. einen Speicherbereich "dumpen".
In ROM C befindet sich die OS Funktion HAUT, sie erlaubt es ein Byte (übergeben im Register A) direkt auf dem Bildschirm darzustellen. Die beiden Zeichen werden ab der Cursorposition (siehe OS Variable C_POS) mit PEN 1 dargestellt. Und zwar mit MODE 1 Zeichen. Es muss also MODE 1 aktiv sein.
Natürlich auch wieder im Hexadezimal-System.
FutureOS habe ich nicht. Und wenn ich Deinen Text richtig versteh, dann klappt es bei Deiner Routine auch nur mit 8-Bit. Ich bräuchte aber min. 16-Bit nach String.
Hi!
16 Bit ist nix anderes als zwei mal 8 Bit. Da der CPC mit einem 8 Bit Zeichensatz arbeitet macht das ja auch Sinn. Du kannst zuerst das High-Byte bearbeiten, dann das Low-Byte.
FutureOS gibt's kostenlos auf www.futureos.de
Und Support gibt's hier :-)
Was genau brauchst Du denn?
Aktuell hab ich sowas im gebrauch.
Quote
Input: HL = number to convert, DE = location of ASCII string
Output: ASCII string at (DE)
Num2Dec ld bc,-10000
call Num1
ld bc,-1000
call Num1
ld bc,-100
call Num1
ld c,-10
call Num1
ld c,b
Num1 ld a,'0'-1
Num2 inc a
add hl,bc
jr c,Num2
sbc hl,bc
ld (de),a
inc de
ret
Das schreibt aber immer führende Nullen davor. Ich wollte sowas ohne Null haben.
Ich könnte den String auch von den Nullen befreien, aber ich wollte gerne eine Lösung finden, die mir diesen Umweg erspart.
Unter 68000er hatte ich sowas mal hinbekommen, den Source aber vor 20 Jahren verbummelt.
Du könntest die Nullen in Leerzeichen verwandeln, aber Du hättest immer 5 Stellen, denn 16 Bit ergeben in dezimal nunmal 5 Stellen maximal.
Quote from: oobdoo on 05. March 2015, 21:27:24
Aktuell hab ich sowas im gebrauch.
Quote
Input: HL = number to convert, DE = location of ASCII string
Output: ASCII string at (DE)
Num2Dec ld bc,-10000
call Num1
ld bc,-1000
call Num1
ld bc,-100
call Num1
ld c,-10
call Num1
ld c,b
Num1 ld a,'0'-1
Num2 inc a
add hl,bc
jr c,Num2
sbc hl,bc
CP A,'0'
JR NZ,OVER
LD A,' '
.OVER
ld (de),a
inc de
ret
Das schreibt aber immer führende Nullen davor. Ich wollte sowas ohne Null haben.
Ich könnte den String auch von den Nullen befreien, aber ich wollte gerne eine Lösung finden, die mir diesen Umweg erspart.
Unter 68000er hatte ich sowas mal hinbekommen, den Source aber vor 20 Jahren verbummelt.
Hab das jetzt so gelöst, das ich die Nullen davor lösche.
Quoteorg &4000
ld hl,65535
ld de,str
call int2str
ld hl,str
.PrintText ; hl,textbuf
ld a,(hl)
or a
ret z
call &bb5a
inc hl
jr PrintText
;;----------------------------------------------------
;; Converts a 6-digit BCD number to a hex ASCII string
;;
;; input: DE = pointer to start of ASCII string
;; C:HL number to be converted
;; output: DE = pointer past end of ASCII string
;; destroys: A,F,D,E
;;-----------------------------------------------------
.int2str
call Num2Dec
ld b,5
ld hl,str
.w2
ld a,(hl)
cp "0"
jr nz,w1
inc hl
djnz w2
.w1
ld de,str
ld c,b
ld b,0
ldir
ld a,0
ld (de),a
ret
Num2Dec ld bc,-10000
call Num1
ld bc,-1000
call Num1
ld bc,-100
call Num1
ld c,-10
call Num1
ld c,b
Num1 ld a,'0'-1
Num2 inc a
add hl,bc
jr c,Num2
sbc hl,bc
ld (de),a
inc de
ret
.str
defb 32,32,32,32,32,0