Prev: $217D Up: Map Next: $2241
$217E: Generate the character codes of the digits of a number
Used by the routines at $2241, $2500 and $2620.
Input
($A3,$A4) The number
$217E LDA #$20 Prepare 5 space characters at $8A-$8E.
$2180 STA $8A
$2182 STA $8B
$2184 STA $8C
$2186 STA $8D
$2188 STA $8E
$218A LDA $A4 Pick up the MSB of the number.
$218C CMP #$28 Is it less than 40 (meaning the number is less than 10240)?
$218E BCC $21B6 Branch if so.
$2190 LDA $8A Increment the character code of the first digit at $8A from space to '1', '1' to '2' etc.
$2192 CLC
$2193 ADC #$01
$2195 ORA #$10
$2197 STA $8A
$2199 LDA #$30 Set the character code of the second, third and fourth digits at $8B, $8C and $8D to '0'.
$219B STA $8B
$219D STA $8C
$219F STA $8D
$21A1 LDA $A3 Subtract $2774 (10100) from the number at $A3. (This is a bug.)
$21A3 SEC
$21A4 SBC #$74
$21A6 STA $A3
$21A8 BCS $21AC
$21AA DEC $A4
$21AC LDA $A4
$21AE SEC
$21AF SBC #$27
$21B1 STA $A4
$21B3 JMP $218C Jump back to consider the 10000's digit again.
$21B6 CMP #$27 Is the MSB of the number 39 (meaning the number is at least 9984)?
$21B8 BNE $21C0 Branch if not.
$21BA LDA $A3 Pick up the LSB of the number.
$21BC CMP #$74 Is it 116 or more (meaning the number is 10100 or more)? (This is a bug.)
$21BE BCS $2190 Branch back to deal with the 10000s digit if so.
The 10000s digit has been computed. Now for the 1000s digit.
$21C0 LDA $A4 Pick up the MSB of what remains of the number.
$21C2 CMP #$04 Is it less than 4 (meaning the number is less than 1024)?
$21C4 BCC $21EA Branch if so.
$21C6 LDA $8B Increment the character code of the second digit at $8B from space or '0' to '1', '1' to '2' etc.
$21C8 CLC
$21C9 ADC #$01
$21CB ORA #$10
$21CD STA $8B
$21CF LDA #$30 Set the character code of the third and fourth digits at $8C and $8D to '0'.
$21D1 STA $8C
$21D3 STA $8D
$21D5 LDA $A3 Subtract $03E8 (1000) from the number at $A3.
$21D7 SEC
$21D8 SBC #$E8
$21DA STA $A3
$21DC BCS $21E0
$21DE DEC $A4
$21E0 LDA $A4
$21E2 SEC
$21E3 SBC #$03
$21E5 STA $A4
$21E7 JMP $21C2 Jump back to consider the 1000s digit again.
$21EA CMP #$03 Is the MSB of the number 3 (meaning the number is at least 768)?
$21EC BNE $21F4 Branch if not.
$21EE LDA $A3 Pick up the LSB of the number.
$21F0 CMP #$E8 Is it 232 or more (meaning the number is 1000 or more)?
$21F2 BCS $21C6 Branch back to deal with the 1000s digit if so.
The 1000s digit has been computed. Now for the 100s digit.
$21F4 LDA $A4 Pick up the MSB of what remains of the number.
$21F6 BEQ $2213 Branch if it's zero (meaning the number is less than 256).
$21F8 LDA $8C Increment the character code of the third digit at $8C from space or '0' to '1', '1' to '2' etc.
$21FA CLC
$21FB ADC #$01
$21FD ORA #$10
$21FF STA $8C
$2201 LDA $A3 Subtract $64 (100) from the number at $A3.
$2203 SEC
$2204 SBC #$64
$2206 STA $A3
$2208 BCS $220C
$220A DEC $A4
$220C LDA #$30 Set the character code of the fourth digit at $8D to '0'.
$220E STA $8D
$2210 JMP $21F4 Jump back to consider the 100s digit again.
$2213 LDA $A3 Pick up the LSB of the number.
$2215 CMP #$64 Is it 100 or more?
$2217 BCS $21F8 Branch back to deal with the 100s digit if so.
$2219 JMP $2222 Otherwise jump forward to compute the 10s digit.
This entry point is used by the routines at $1DB7 (to generate the character codes of the first two digits of a lines amount) and $2241 (to generate the character codes of the digits in a number used in a question asked by MR WACKER).
$221C LDA #$20 Set the character codes of the last two digits at $8D and $8E to 32 (space).
$221E STA $8D
$2220 STA $8E
The 100s digit has been computed. Now for the 10s digit.
$2222 LDA $A3 Pick up the LSB of what remains of the number.
$2224 CMP #$0A Is it less than 10?
$2226 BCC $223B Branch if so.
$2228 LDA $8D Increment the character code of the fourth digit at $8D from space or '0' to '1', '1' to '2' etc.
$222A CLC
$222B ADC #$01
$222D ORA #$10
$222F STA $8D
$2231 LDA $A3 Subtract 10 from the number at $A3.
$2233 SEC
$2234 SBC #$0A
$2236 STA $A3
$2238 JMP $2222 Jump back to consider the 10s digit again.
The 10s digit has been computed. Now for the 1s digit.
$223B CLC Add 48 to the remaining value to get the character code of the final digit, and store it at $8E.
$223C ADC #$30
$223E STA $8E
$2240 RTS
Prev: $217D Up: Map Next: $2241