Difference between revisions of "Z80 Routines:Other:DispA"
From WikiTI
m (category) |
|||
(15 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
− | [[Category:Z80 Routines:Other| | + | [[Category:Z80 Routines:Display|DispA]] |
− | [[Category:Z80 Routines| | + | [[Category:Z80 Routines:Other|DispA]] |
+ | [[Category:Z80 Routines|DispA]] | ||
+ | |||
+ | Simple and small routines that print the value of z80 register a. | ||
+ | |||
+ | == Decimal Unsigned Version == | ||
+ | |||
+ | <nowiki>;Number in a to decimal ASCII | ||
+ | ;adapted from 16 bit found in z80 Bits to 8 bit by Galandros | ||
+ | ;Example: display a=56 as "056" | ||
+ | ;input: a = number | ||
+ | ;Output: a=0,value of a in the screen | ||
+ | ;destroys af,bc (don't know about hl and de) | ||
+ | DispA: | ||
+ | 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 | ||
+ | push af ;safer than ld c,a | ||
+ | ld a,b ;char is in b | ||
+ | CALL PUTCHAR ;plot a char. Replace with bcall(_PutC) or similar. | ||
+ | pop af ;safer than ld a,c | ||
+ | ret | ||
+ | </nowiki> | ||
+ | |||
+ | == Hexadecimal Unsigned Version == | ||
+ | |||
+ | <nowiki>;Soon... | ||
+ | </nowiki> | ||
+ | |||
+ | == Decimal 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 54: | ||
; -------------------------------------------------------------- | ; -------------------------------------------------------------- | ||
− | + | DispA: | |
push de | push de | ||
push bc | push bc | ||
Line 43: | Line 79: | ||
ld b, 0 ; B will count character length of number | ld b, 0 ; B will count character length of number | ||
- ld a, 10 | - ld a, 10 | ||
− | + | syscall DivHLByA ; HL = HL / A, A = remainder | |
push af | push af | ||
inc b | inc b | ||
Line 64: | Line 100: | ||
pop de | pop de | ||
ret | ret | ||
− | |||
</nowiki> | </nowiki> | ||
+ | |||
+ | ===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. | ||
+ | * 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=== | ||
+ | <nowiki> ld hl, -1004 | ||
+ | ld de, OP1 | ||
+ | call DispA | ||
+ | ld hl, OP1 | ||
+ | syscall PutS</nowiki> |
Latest revision as of 05:51, 21 April 2010
Simple and small routines that print the value of z80 register a.
Contents
Decimal Unsigned Version
;Number in a to decimal ASCII ;adapted from 16 bit found in z80 Bits to 8 bit by Galandros ;Example: display a=56 as "056" ;input: a = number ;Output: a=0,value of a in the screen ;destroys af,bc (don't know about hl and de) DispA: 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 push af ;safer than ld c,a ld a,b ;char is in b CALL PUTCHAR ;plot a char. Replace with bcall(_PutC) or similar. pop af ;safer than ld a,c ret
Hexadecimal Unsigned Version
;Soon...
Decimal 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