### Re: Compact /10 and %10 operations?

Posted:

**Mon Sep 10, 2018 11:48 am**I just use 100 byte lookup tables.

NES Development and Strangulation Records message boards

http://forums.nesdev.com/

Page **2** of **2**

Posted: **Mon Sep 10, 2018 11:48 am**

I just use 100 byte lookup tables.

Posted: **Mon Sep 10, 2018 12:01 pm**

You won't - automatic overflow detection would work only when using 0-9 or when using 246-255; the second case being less intuitive but not more optimal than the first.tokumaru wrote:You'll only get automatic wrap around detection in one direction anyway (either when adding or subtracting).

Posted: **Mon Sep 10, 2018 7:17 pm**

I see optimality in having numbers in tiles 246-255, at least for things like score points: you rarely substract points, if ever, in a game. From the look of it, you genuinely optimized your tile for scorekeeping. I find it actually clever.

Posted: **Mon Sep 17, 2018 8:09 pm**

This division routine with remainder is quite fast and needs 100 bytes' worth of tables. (I didn't test it extensively.)pubby wrote:I just use 100 byte lookup tables.

Code: Select all

```
; Start with 0-99 in A.
; Get the quotient and the remainder of A divided by 10.
; Needs 9 bytes and 14 cycles per operation and 100 bytes for the tables.
lsr ; keep LSB in carry
tax
lda unsigned_divide_by_5,x
; now A = the quotient
lda unsigned_modulo_5,x
rol ; get LSB from carry
; now A = the remainder
unsigned_divide_by_5:
.byte 0, 0, 0, 0, 0, 1, 1, 1, 1, 1
.byte 2, 2, 2, 2, 2, 3, 3, 3, 3, 3
.byte 4, 4, 4, 4, 4, 5, 5, 5, 5, 5
.byte 6, 6, 6, 6, 6, 7, 7, 7, 7, 7
.byte 8, 8, 8, 8, 8, 9, 9, 9, 9, 9
unsigned_modulo_5:
.byte 0, 1, 2, 3, 4, 0, 1, 2, 3, 4
.byte 0, 1, 2, 3, 4, 0, 1, 2, 3, 4
.byte 0, 1, 2, 3, 4, 0, 1, 2, 3, 4
.byte 0, 1, 2, 3, 4, 0, 1, 2, 3, 4
.byte 0, 1, 2, 3, 4, 0, 1, 2, 3, 4
```

Edit: combined the routines.

Posted: **Tue Sep 18, 2018 4:13 am**

Your division table is 50 bytes long. What happens when x >= 50?

Posted: **Tue Sep 18, 2018 5:43 am**

It won't ever be >= 50, because of the LSR. If the largest number is 99, X will be at most 49. By getting rid of the least significant bit (and putting it back later) the tables can be made half the size.calima wrote:Your division table is 50 bytes long. What happens when x >= 50?

Posted: **Tue Sep 18, 2018 9:49 am**

Wow, that's a great solution. The same concept should apply when dividing by any number for which a power-of-two is a factor.qalle wrote:This division routine with remainder is quite fast and needs 100 bytes' worth of tables. (I didn't test it extensively.)pubby wrote:I just use 100 byte lookup tables.

Edit: optimized the modulo routine.Code: Select all

`; Start with 0-99 in A. ; Get the quotient and the remainder of A divided by 10. ; Needs 9 bytes and 14 cycles per operation and 100 bytes for the tables. lsr ; keep LSB in carry tax lda unsigned_divide_by_5,x ; now A = the quotient lda unsigned_modulo_5,x rol ; get LSB from carry ; now A = the remainder unsigned_divide_by_5: .byte 0, 0, 0, 0, 0, 1, 1, 1, 1, 1 .byte 2, 2, 2, 2, 2, 3, 3, 3, 3, 3 .byte 4, 4, 4, 4, 4, 5, 5, 5, 5, 5 .byte 6, 6, 6, 6, 6, 7, 7, 7, 7, 7 .byte 8, 8, 8, 8, 8, 9, 9, 9, 9, 9 unsigned_modulo_5: .byte 0, 1, 2, 3, 4, 0, 1, 2, 3, 4 .byte 0, 1, 2, 3, 4, 0, 1, 2, 3, 4 .byte 0, 1, 2, 3, 4, 0, 1, 2, 3, 4 .byte 0, 1, 2, 3, 4, 0, 1, 2, 3, 4 .byte 0, 1, 2, 3, 4, 0, 1, 2, 3, 4`

Edit: combined the routines.

Like, dividing by 12 for example:

Code: Select all

```
; Value from 0-143 in A.
lsr
rol temp
lsr
tax
lda unsigned_divide_by_3, x
; now A = the quotient
lda unsigned_modulo_3, x
rol
lsr temp
rol
; now A = the remainder
unsigned_divide_by_3:
.byte 0, 0, 0, 1, 1, 1, 2, 2, 2
.byte 3, 3, 3, 4, 4, 4, 5, 5, 5
.byte 6, 6, 6, 7, 7, 7, 8, 8, 8
.byte 9, 9, 9, 10, 10, 10, 11, 11, 11
unsigned_modulo_3:
.byte 0, 1, 2, 0, 1, 2, 0, 1, 2
.byte 0, 1, 2, 0, 1, 2, 0, 1, 2
.byte 0, 1, 2, 0, 1, 2, 0, 1, 2
.byte 0, 1, 2, 0, 1, 2, 0, 1, 2
```

EDIT: Also this website has a ton of math implementations for 6502.

Posted: **Tue Sep 18, 2018 10:33 am**

Ah indeed, thanks for pointing that out.