Here is a table based version that is under 67 cycles, unless you are using a subroutine. Hope it helps! It's a bugger for bytes I know...
Code: Select all
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 16 bit unsigned divide by 40, mod 40 (Ver 3)
; By Omegamatrix
; 45-65 cycles, 581 bytes
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
StartDivide40Mod40:
ldy dividendHigh ;3 @3
lda HighQuot_Mod40Tab,Y ;4 @7
and #$07 ;2 @9
sta quotientHigh ;3 @12
eor HighQuot_Mod40Tab,Y ;4 @16
clc ;2 @18
adc dividendLow ;3 @21
bcs .moreThan255 ;2³ @23/24
cmp #120 ;2 @25
bcs .more120 ;2³ @27/28
ldx #0-1 ;2 @29
sec ;2 @31
bne .less120 ;3 @34 always branch
.moreThan255:
ldx #6 ;2 @26
adc #255-240 ;2 @28
cmp #40 ;2 @30
bcc .storeMod40 ;2³ @32/33
sbc #40 ;2 @34
bcs .storeMod40 ;3 @37 always branch
.more120:
sbc #120 ;2 @30
ldx #3-1 ;2 @32
.less120:
sbc #40 ;2 @34...36 worse case
bcc .add40 ;2³ @38/39
inx ;2 @40
sbc #40 ;2 @42
bcc .add40 ;2³ @44/45
inx ;2 @46
sbc #40 ;2 @48
bcc .add40 ;2³ @50/51
inx ;2 @..50
bcs .storeMod40 ;3 @53 always branch
.add40:
adc #40 ;2 @53
.storeMod40:
sta remainder ;3 @56
txa ;2 @58
adc LowQuotientTab,Y ;4 @62
sta quotientLow ;3 @65 worse case, 45 best case
HighQuot_Mod40Tab:
.byte $00,$10,$20,$08,$18,$00,$10,$20,$08,$18,$00,$10,$20,$08,$18,$00
.byte $10,$20,$08,$18,$00,$10,$20,$08,$18,$00,$10,$20,$08,$18,$00,$10
.byte $20,$08,$18,$00,$10,$20,$08,$18,$01,$11,$21,$09,$19,$01,$11,$21
.byte $09,$19,$01,$11,$21,$09,$19,$01,$11,$21,$09,$19,$01,$11,$21,$09
.byte $19,$01,$11,$21,$09,$19,$01,$11,$21,$09,$19,$01,$11,$21,$09,$19
.byte $02,$12,$22,$0A,$1A,$02,$12,$22,$0A,$1A,$02,$12,$22,$0A,$1A,$02
.byte $12,$22,$0A,$1A,$02,$12,$22,$0A,$1A,$02,$12,$22,$0A,$1A,$02,$12
.byte $22,$0A,$1A,$02,$12,$22,$0A,$1A,$03,$13,$23,$0B,$1B,$03,$13,$23
.byte $0B,$1B,$03,$13,$23,$0B,$1B,$03,$13,$23,$0B,$1B,$03,$13,$23,$0B
.byte $1B,$03,$13,$23,$0B,$1B,$03,$13,$23,$0B,$1B,$03,$13,$23,$0B,$1B
.byte $04,$14,$24,$0C,$1C,$04,$14,$24,$0C,$1C,$04,$14,$24,$0C,$1C,$04
.byte $14,$24,$0C,$1C,$04,$14,$24,$0C,$1C,$04,$14,$24,$0C,$1C,$04,$14
.byte $24,$0C,$1C,$04,$14,$24,$0C,$1C,$05,$15,$25,$0D,$1D,$05,$15,$25
.byte $0D,$1D,$05,$15,$25,$0D,$1D,$05,$15,$25,$0D,$1D,$05,$15,$25,$0D
.byte $1D,$05,$15,$25,$0D,$1D,$05,$15,$25,$0D,$1D,$05,$15,$25,$0D,$1D
.byte $06,$16,$26,$0E,$1E,$06,$16,$26,$0E,$1E,$06,$16,$26,$0E,$1E,$06
LowQuotientTab
.byte $00,$06,$0C,$13,$19,$20,$26,$2C,$33,$39,$40,$46,$4C,$53,$59,$60
.byte $66,$6C,$73,$79,$80,$86,$8C,$93,$99,$A0,$A6,$AC,$B3,$B9,$C0,$C6
.byte $CC,$D3,$D9,$E0,$E6,$EC,$F3,$F9
.byte $00,$06,$0C,$13,$19,$20,$26,$2C,$33,$39,$40,$46,$4C,$53,$59,$60
.byte $66,$6C,$73,$79,$80,$86,$8C,$93,$99,$A0,$A6,$AC,$B3,$B9,$C0,$C6
.byte $CC,$D3,$D9,$E0,$E6,$EC,$F3,$F9
.byte $00,$06,$0C,$13,$19,$20,$26,$2C,$33,$39,$40,$46,$4C,$53,$59,$60
.byte $66,$6C,$73,$79,$80,$86,$8C,$93,$99,$A0,$A6,$AC,$B3,$B9,$C0,$C6
.byte $CC,$D3,$D9,$E0,$E6,$EC,$F3,$F9
.byte $00,$06,$0C,$13,$19,$20,$26,$2C,$33,$39,$40,$46,$4C,$53,$59,$60
.byte $66,$6C,$73,$79,$80,$86,$8C,$93,$99,$A0,$A6,$AC,$B3,$B9,$C0,$C6
.byte $CC,$D3,$D9,$E0,$E6,$EC,$F3,$F9
.byte $00,$06,$0C,$13,$19,$20,$26,$2C,$33,$39,$40,$46,$4C,$53,$59,$60
.byte $66,$6C,$73,$79,$80,$86,$8C,$93,$99,$A0,$A6,$AC,$B3,$B9,$C0,$C6
.byte $CC,$D3,$D9,$E0,$E6,$EC,$F3,$F9
.byte $00,$06,$0C,$13,$19,$20,$26,$2C,$33,$39,$40,$46,$4C,$53,$59,$60
.byte $66,$6C,$73,$79,$80,$86,$8C,$93,$99,$A0,$A6,$AC,$B3,$B9,$C0,$C6
.byte $CC,$D3,$D9,$E0,$E6,$EC,$F3,$F9
.byte $00,$06,$0C,$13,$19,$20,$26,$2C,$33,$39,$40,$46,$4C,$53,$59,$60