; Contant Execution-Time Multiply Routines
;
; Assumes no overflow, ie, entry values smaller than <maxval> DIV <mul>
; 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

