This is an archived, read-only copy of the United-TI subforum , including posts and topic from May 2003 to April 2012. If you would like to discuss any of the topics in this forum, you can visit Cemetech's
z80 & ez80 Assembly subforum. Some of these topics may also be directly-linked to active Cemetech topics. If you are a Cemetech member with a linked United-TI account, you can link United-TI topics here with your current Cemetech topics.
Z80 & 68k Assembly =>
z80 & ez80 Assembly
Author |
Message |
|
AHBAD_ALVIN
Advanced Newbie
Joined: 18 Sep 2010 Posts: 74
|
Posted: 06 Oct 2010 05:22:21 pm Post subject: |
|
|
Hello, I have a quick question...
For my parser, I want to change decimal numbers written in ASCII code to pure hex code. I know this is possible, as Axe and the OS do this quite frequently. How exactly do I do this quickly and memory efficiently? |
|
Back to top |
|
|
calc84maniac
Elite
Joined: 22 Jan 2007 Posts: 770
|
Posted: 06 Oct 2010 08:24:00 pm Post subject: |
|
|
Here is a z80 routine I whipped up, which will read ASCII digits pointed to by DE into a binary number in HL, stopping when a non-digit character is reached.
Code:
;Start with 0
ld hl,0
digitLoop:
;Read character and make sure it is a digit
ld a,(de)
sub '0'
cp 10
jr nc,notADigit
;Increment pointer
inc de
;Multiply HL by 10
ld b,h
ld c,l
add hl,hl
add hl,hl
add hl,bc
add hl,hl
;Add the digit value in A to HL
add a,l
ld l,a
jr nc,digitLoop
inc h
jr digitLoop
notADigit:
Edit: Made it actually stop where the non-digit was found instead of the character afterward.
Last edited by Guest on 06 Oct 2010 08:25:12 pm; edited 1 time in total |
|
Back to top |
|
|
AHBAD_ALVIN
Advanced Newbie
Joined: 18 Sep 2010 Posts: 74
|
Posted: 07 Oct 2010 04:21:12 am Post subject: |
|
|
calc84maniac wrote:
Here is a z80 routine I whipped up, which will read ASCII digits pointed to by DE into a binary number in HL, stopping when a non-digit character is reached.
Code:
;Start with 0
ld hl,0
digitLoop:
;Read character and make sure it is a digit
ld a,(de)
sub '0'
cp 10
jr nc,notADigit
;Increment pointer
inc de
;Multiply HL by 10
ld b,h
ld c,l
add hl,hl
add hl,hl
add hl,bc
add hl,hl
;Add the digit value in A to HL
add a,l
ld l,a
jr nc,digitLoop
inc h
jr digitLoop
notADigit:
Edit: Made it actually stop where the non-digit was found instead of the character afterward.
Thanks for your help! |
|
Back to top |
|
|
AHBAD_ALVIN
Advanced Newbie
Joined: 18 Sep 2010 Posts: 74
|
Posted: 07 Oct 2010 12:41:44 pm Post subject: |
|
|
Oh, and I just improved it some while fooling around with Mimas during my history class. But of course, this is only a minor addition so that it only reads five digits of a number (next addition will to make it only accept numbers less than 65353).
Code:
;Start with 0
db DD
ld l,5
ld hl,0
digitLoop:
;push the a register and then compare to IXL
dec ix
push af
ld a,0
db DD
cp l
jr z,notADigit
pop af
;Read character and make sure it is a digit
ld a,(de)
sub '0'
cp 10
jr nc,notADigit
;Increment pointer
inc de
;Multiply HL by 10
ld b,h
ld c,l
add hl,hl
add hl,hl
add hl,bc
add hl,hl
;Add the digit value in A to HL
add a,l
ld l,a
jr nc,digitLoop
inc h
jr digitLoop
notADigit:
ret
|
|
Back to top |
|
|
|
Register to Join the Conversation
Have your own thoughts to add to this or any other topic? Want to ask a question, offer a suggestion, share your own programs and projects, upload a file to the file archives, get help with calculator and computer programming, or simply chat with like-minded coders and tech and calculator enthusiasts via the site-wide AJAX SAX widget? Registration for a free Cemetech account only takes a minute.
»
Go to Registration page