Welcome to Schneider / Amstrad CPC Forum. Please login or sign up.

28. March 2024, 20:21:22

Login with username, password and session length

Shoutbox

TFM

2024-01-15, 17:06:57
Momentan billige Farbbänder auf Ebay für PCW

Devilmarkus

2023-07-09, 10:37:40
Zweiter 👋😂🤣

TFM

2023-06-13, 14:21:49
Sommerloch!

TFM

2023-05-30, 17:00:20
Erster ;-)

Recent

Members
Stats
  • Total Posts: 11,654
  • Total Topics: 1,328
  • Online today: 103
  • Online ever: 1,724
  • (16. January 2020, 00:18:45)
Users Online
Users: 1
Guests: 97
Total: 98

97 Guests, 1 User
Rennert

Zahlen in String unwandeln...

Started by TFM, 05. March 2015, 18:22:40

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

TFM

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.
TFM of FutureSoft
http://www.futureos.de --> Das Betriebssystem FutureOS (Update: 20.12.2023)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 26.12.2021)

oobdoo

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.
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088

TFM

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?

TFM of FutureSoft
http://www.futureos.de --> Das Betriebssystem FutureOS (Update: 20.12.2023)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 26.12.2021)

oobdoo

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.
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088

TFM

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.
TFM of FutureSoft
http://www.futureos.de --> Das Betriebssystem FutureOS (Update: 20.12.2023)
http://futureos.cpc-live.com/files/LambdaSpeak_RSX_by_TFM.zip --> RSX ROM für LambdaSpeak (Update: 26.12.2021)

oobdoo

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
CPC 464/6128, 464/6128+, GX4000 | Atari 2600, 600XL, 800XL/XE, Portfolio | C64/II/G/R/SX, VC20, TC64 | LC 80, MPF-I | ZX81, AX81, ZX Spectrum 48k, ZX Spectrum+2 | Amiga 500/600/2000, A2630, A2088