Joined: Tue Apr 04, 2017 1:22 pm Posts: 34 Location: Ohio, USA

qalle wrote: pubby wrote: I just use 100 byte lookup tables. This division routine with remainder is quite fast and needs 100 bytes' worth of tables. (I didn't test it extensively.) Code: ; Start with 099 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: optimized the modulo routine. Edit: combined the routines. Wow, that's a great solution. The same concept should apply when dividing by any number for which a poweroftwo is a factor. Like, dividing by 12 for example: Code: ; Value from 0143 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
It requires an extra temporary variable (since we initially divide by 4), but it's still a neat concept. EDIT: Also this website has a ton of math implementations for 6502.
_________________ http://zutanogames.com/ < my dev blog

