Difference between revisions of "Z80 Routines:Other:DispA"

From WikiTI
Jump to: navigation, search
(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