Difference between revisions of "Z80 Routines:Other:DispA"
From WikiTI
m (Now using top level headings...sorry...bugged me) |
|||
| Line 1: | Line 1: | ||
| − | [[Category:Z80 Routines:Other| | + | [[Category:Z80 Routines:Other|DispA]] |
| − | [[Category:Z80 Routines| | + | [[Category:Z80 Routines|DispA]] |
| + | |||
| + | == Unsigned Version == | ||
| + | |||
| + | <nowiki>;NOT TESTED. I WILL TEST LATER. SORRY THE CAPS; I HATE THEM; TOO. | ||
| + | ;Example: display a=56 as "056". | ||
| + | DispA: | ||
| + | ld de,OP1 ; safe ram to store the ASCII string. Use other one in case you do floating point operations with b_calls | ||
| + | push de ;we will need it because the output is after the string | ||
| + | call AtoDec | ||
| + | ex de,hl | ||
| + | ld (hl),$00 | ||
| + | pop hl | ||
| + | b_call(_PutS) | ||
| + | ret | ||
| + | |||
| + | ;Number in a to decimal ASCII | ||
| + | ;adapted from 16 bit found in z80 Bits to 8 bit by Galandros | ||
| + | ;input: a = number, (de) = decimal ASCII | ||
| + | ;destroys af,bc | ||
| + | AtoDec: | ||
| + | ld c,-100 | ||
| + | call Na1 | ||
| + | ld c,-10 | ||
| + | call Na1 | ||
| + | ld c,-1 | ||
| + | Na1: ld b,'0'-1 | ||
| + | Na2: inc b | ||
| + | add a,c | ||
| + | jr c,Na2 | ||
| + | sub c ;works as add 100/10/1 | ||
| + | ld c,a ;save a | ||
| + | ld a,b ;ld (de),b is not a instruction | ||
| + | ld (de),a | ||
| + | ld a,c ;restore a | ||
| + | inc de | ||
| + | ret</nowiki> | ||
| + | |||
| + | == Signed Version == | ||
<nowiki> | <nowiki> | ||
| − | ; | + | ; DispA |
; -------------------------------------------------------------- | ; -------------------------------------------------------------- | ||
; Converts a signed integer value to a zero-terminated ASCII | ; Converts a signed integer value to a zero-terminated ASCII | ||
| Line 18: | Line 56: | ||
; -------------------------------------------------------------- | ; -------------------------------------------------------------- | ||
| − | + | DispA: | |
push de | push de | ||
push bc | push bc | ||
| Line 66: | Line 104: | ||
</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== | + | ===Example Usage=== |
<nowiki> ld hl, -1004 | <nowiki> ld hl, -1004 | ||
ld de, OP1 | ld de, OP1 | ||
| − | call | + | call DispA |
ld hl, OP1 | ld hl, OP1 | ||
syscall PutS</nowiki> | syscall PutS</nowiki> | ||
Revision as of 14:00, 26 October 2009
Unsigned Version
;NOT TESTED. I WILL TEST LATER. SORRY THE CAPS; I HATE THEM; TOO. ;Example: display a=56 as "056". DispA: ld de,OP1 ; safe ram to store the ASCII string. Use other one in case you do floating point operations with b_calls push de ;we will need it because the output is after the string call AtoDec ex de,hl ld (hl),$00 pop hl b_call(_PutS) ret ;Number in a to decimal ASCII ;adapted from 16 bit found in z80 Bits to 8 bit by Galandros ;input: a = number, (de) = decimal ASCII ;destroys af,bc AtoDec: ld c,-100 call Na1 ld c,-10 call Na1 ld c,-1 Na1: ld b,'0'-1 Na2: inc b add a,c jr c,Na2 sub c ;works as add 100/10/1 ld c,a ;save a ld a,b ;ld (de),b is not a instruction ld (de),a ld a,c ;restore a inc de ret
Signed Version
; DispA
; --------------------------------------------------------------
; 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
; --------------------------------------------------------------
DispA:
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
syscall 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 DispA
ld hl, OP1
syscall PutS