Difference between revisions of "Z80 Routines:Other:DispA"
From WikiTI
(→Comments) |
|||
| Line 66: | Line 66: | ||
</nowiki> | </nowiki> | ||
| + | ---- | ||
===Comments=== | ===Comments=== | ||
*This routine uses the common [[Wikipedia:Numeral_systems#Change_of_radix|positive-integer radix conversion algorithm]] of repeatedly dividing a value by the desired radix (base case: the value is zero) and saving the remainders of each division. | *This routine uses the common [[Wikipedia:Numeral_systems#Change_of_radix|positive-integer radix conversion algorithm]] of repeatedly dividing a value by the desired radix (base case: the value is zero) and saving the remainders of each division. | ||
*As this algorithm gives the digits in reverse order, they are pushed onto the hardware stack so that subsequently popping them yields the correct order. | *As this algorithm gives the digits in reverse order, they are pushed onto the hardware stack so that subsequently popping them yields the correct order. | ||
*Note that the output string will not be fixed-width. | *Note that the output string will not be fixed-width. | ||
| + | |||
| + | ---- | ||
| + | ===Example Usage=== | ||
| + | <nowiki> ld hl, -1004 | ||
| + | ld de, OP1 | ||
| + | call itoa | ||
| + | ld hl, OP1 | ||
| + | syscall PutS</nowiki> | ||
Revision as of 14:38, 4 April 2005
; ITOA
; --------------------------------------------------------------
; Converts a signed integer value to a zero-terminated ASCII
; string representative of that value (using radix 10).
; --------------------------------------------------------------
; INPUTS:
; HL Value to convert (two's complement integer).
; DE Base address of string destination. (pointer).
; --------------------------------------------------------------
; OUTPUTS:
; None
; --------------------------------------------------------------
; REGISTERS/MEMORY DESTROYED
; AF HL
; --------------------------------------------------------------
itoa:
push de
push bc
; Detect sign of HL.
bit 7, h
jr z, _DoConvert
; HL is negative. Output '-' to string and negate HL.
ld a, '-'
ld (de), a
inc de
; Negate HL (using two's complement)
xor a
sub l
ld l, a
ld a, 0 ; Note that XOR A or SUB A would disturb CF
sbc a, h
ld h, a
; Convert HL to digit characters
_DoConvert:
ld b, 0 ; B will count character length of number
- ld a, 10
call DivHLByA ; HL = HL / A, A = remainder
push af
inc b
ld a, h
or l
jr nz, -
; Retrieve digits from stack
- pop af
or $30
ld (de), a
inc de
djnz -
; Terminate string with NULL
xor a
ld (de), a
pop bc
pop de
ret
Comments
- This routine uses the common positive-integer radix conversion algorithm of repeatedly dividing a value by the desired radix (base case: the value is zero) and saving the remainders of each division.
- As this algorithm gives the digits in reverse order, they are pushed onto the hardware stack so that subsequently popping them yields the correct order.
- Note that the output string will not be fixed-width.
Example Usage
ld hl, -1004
ld de, OP1
call itoa
ld hl, OP1
syscall PutS