; Contant Execution-Time Multiply Routines ; ; Assumes no overflow, ie, entry values smaller than DIV ; ie, z80 mul7 - entry A=0 to 255/7. ; ; Z80 6502 ARM ; .mul2 add a,a asl a mov r0,r0,lsl #1 ; ; .mul3 ld b,a sta tmp add r0,r0,r0,lsl #1 add a,a asl a add a,b adc tmp ; ; .mul4 add a,a asl a mov r0,r0,lsl #2 add a,a asl a ; ; .mul5 ld b,a sta tmp add r0,r0,r0,lsl #2 add a,a asl a add a,a asl a add a,b adc tmp ; ; .mul6 ld b,a sta tmp mov r0,r0,lsl #1 add a,a asl a add r0,r0,r0,lsl #1 add a,b adc tmp add a,a asl a ; ; .mul7 ld b,a sta tmp rsb r0,r0,r0,lsl #3 add a,a asl a add a,b adc tmp add a,a asl a add a,b adc tmp ; ; .mul8 add a,a asl a mov r0,r0,lsl #1 add a,a asl a add a,a asl a ; ; .mul9 ld b,a sta tmp add r0,r0,r0,lsl #3 add a,a asl a add a,a asl a add a,a asl a add a,b adc tmp ; ; .mul10 ld b,a sta tmp add r0,r0,r0,lsl #2 add a,a asl a add r0,r0,r0 add a,a asl a add a,b adc tmp add a,a adl a ; ; ARM --- 2^n, 2^n-1, 2^n+1 -> easy in one op All cpus -------- 2^n -> move left n times 2^n+1 -> add reg to reg shifted left n times 2^n-1 -> sub reg from reg shifted left n times 2^x * (2^n-1) -> 2^n-1, then shift left x times 2^x * (2^n+1) -> 2^n+1, then shift left x times 2 2^n 3 2^n+1 4 2^n 5 2^n+1 6 2^m * 2^n+1 7 2^n-1 8 2^n 9 2^n+1 10 2^m * 2^n+1 11 2^m * 2^n+1 +1 12 2^m * 2^n+1 13 2^m * 2^n+1 +1 14 2^m * 2^n-1 15 2^n-1 16 2^n 17 2^n+1 18 2^m * 2^n+1 19 2^m * 2^n+1 +1 20 2^m * 2^n+1 21 2^m * 2^n+1 +1 22 2 * [11] 23 2^m * 2^n+1 -1 24 2^m * 2^n+1 25 2^m * 2^n+1 +1 26 2 * [13] 27 2^m * 2^n-1 -1 28 2^m * 2^n-1 29 2^m * 2^n-1 +1 30 2^m * 2^n-1 31 2^n-1 32 2^n 33 2^n+1 34 2^m * 2^n+1 35 2^m * 2^n+1 +1 36 2^m * 2^n+1 37 2^m * 2^n+1 +1 38 2* [19] 39 2^m * 2^n+1 -1 40 2^m * 2^n+1 41 2^m * 2^n+1 +1 ..etc... \ z80 16bit: .mul9 ld b,h ld c,l add hl,hl add hl,hl add hl,hl add hl,bc