| Routines

27572: Compute the decimal digits of a number

Used by the routines at 29613 and 29716. Computes the ASCII codes for the digits of the number held in DE, and stores them in the buffer at 58112.
Input
DE | Number
27572 | LD HL,58123 |
27575 | LD B,L | B=11
27576 | DEC L | Clear the buffer at 58112, which will be used to store the ASCII codes of the digits
27577 | LD (HL),0
27579 | DJNZ 27576
27581 | LD A,48 | 48 is the code for '0'
Before inserting any ASCII codes into the buffer, we need to figure out whether the first digit is the 10000s, 1000s, 100s, 10s or units digit.
27583 | LD BC,55536 | BC=-10000
27586 | EX DE,HL | DE=58112
27587 | ADD HL,BC | Subtract 10000
27588 | JR C,27620 | Jump if it 'went'
27590 | SBC HL,BC | Otherwise add the 10000 back
27592 | LD BC,64536 | BC=-1000
27595 | ADD HL,BC | Subtract 1000
27596 | JR C,27633 | Jump if it 'went'
27598 | SBC HL,BC | Otherwise add the 1000 back
27600 | LD BC,65436 | BC=-100
27603 | ADD HL,BC | Subtract 100
27604 | JR C,27646 | Jump if it 'went'
27606 | SBC HL,BC | Otherwise add the 100 back
27608 | LD C,246 | BC=-10
27610 | ADD HL,BC | Subtract 10
27611 | JR C,27658 | Jump if it 'went'
27613 | SBC HL,BC | Otherwise add the 10 back
27615 | LD A,L | A=units left
27616 | AND A | Are there any?
27617 | RET Z | Return if not (nothing to do)
27618 | JR 27666 | Jump forward to place the units digit into the buffer
Compute and insert the 10000s digit.
27620 | INC A | Get the ASCII code for the 10000s digit in A
27621 | ADD HL,BC
27622 | JR C,27620
27624 | SBC HL,BC |
27626 | LD BC,64536 | BC=-1000
27629 | LD (DE),A | Place the 10000s digit into the buffer
27630 | LD A,47 |
27632 | INC E | Move DE along to the next slot in the buffer
Compute and insert the 1000s digit.
27633 | INC A | Get the ASCII code for the 1000s digit in A
27634 | ADD HL,BC
27635 | JR C,27633
27637 | SBC HL,BC |
27639 | LD BC,65436 | BC=-100
27642 | LD (DE),A | Place the 1000s digit into the buffer
27643 | LD A,47 |
27645 | INC E | Move DE along to the next slot in the buffer
Compute and insert the 100s digit.
27646 | INC A | Get the ASCII code for the 100s digit in A
27647 | ADD HL,BC
27648 | JR C,27646
27650 | SBC HL,BC |
27652 | LD (DE),A | Place the 100s digit into the buffer
27653 | LD C,246 | BC=-10
27655 | LD A,47 |
27657 | INC E | Move DE along to the next slot in the buffer
Compute and insert the 10s digit.
27658 | INC A | Get the ASCII code for the 10s digit in A
27659 | ADD HL,BC
27660 | JR C,27658
27662 | SBC HL,BC |
27664 | LD (DE),A | Place the 10s digit into the buffer
27665 | INC E | Move DE along to the next slot in the buffer
Compute and insert the units digit.
27666 | LD A,L | A=number of units left
27667 | ADD A,48 | A=ASCII code for the units digit
27669 | LD (DE),A | Place this into the buffer
27670 | RET |