1		org 0x100
2mul333:     ; 8x8->8  multiplicands in B and C, result in A
3            ; undefined on return: B,C,F
4			; time <= 365 ticks
5		XOR A
6back1:	SRL B
7        JR  Z,ready1
8		JR	NC,over1
9		ADD A,C
10over1: 	SLA C
11		JR	back1
12ready1: RET NC
13		ADD A,C
14        RET
15;
16		org 0x140
17mul334:     ; 8x8->16  multiplicands in B and C, result in HL
18            ; undefined on return: A,B,C,F
19			; time <= 455 ticks
20		LD	A,B
21		LD  B,0
22		LD  L,B
23		LD  H,B
24back2:	SRL A
25		JR	NC,over2
26		ADD HL,BC
27over2:	RET Z     ; ready , result in HL
28    	SLA C
29		RL  B
30		JP	back2
31;
32		org 0x180
33mul444:  	; 16x16->16  multiplicands in BC and DE, result in HL
34            ; undefined on return: A,B,C,D,E,F
35			; time <= 1182 ticks
36		LD  A,D
37		CP  B
38		JR  NC,ok3
39		LD  D,B
40		LD  B,A
41		LD  A,E
42		LD  E,C
43		LD  C,A
44ok3:	LD  H,0
45		LD  L,0
46back3:	SRL D
47		RR  E
48		JR	NC,over3
49		ADD HL,BC
50over3:	LD  A,E
51		OR  D
52		RET Z     ; ready , result in HL
53    	SLA C
54		RL  B
55		JP	back3
56;
57		org 0x1c0
58mul445:		; 16x16->32  multiplicands in BC and DE result in HL'(high),HL(low)
59            ; undefined on return: A,B,C,D,E,F,B',C'
60			; time <= 1932 ticks
61		LD  A,D
62		CP  B
63		JR  NC,ok4
64		LD  D,B
65		LD  B,A
66		LD  A,E
67		LD  E,C
68		LD  C,A
69ok4:	XOR A
70		LD  H,A
71		LD  L,A
72		EXX
73		LD  H,A
74		LD  L,A
75		LD  B,A
76		LD  C,A
77back4:	        ; '-registers
78		EXX
79		SRL D
80		RR  E
81		JR	NC,over4
82		ADD HL,BC
83		EXX
84		ADC HL,BC
85		EXX
86over4:  LD  A,E
87		OR  D
88		RET Z     ; ready , result in HL'(high), HL(low)
89    	SLA C
90		RL  B
91		EXX       ; next '-registers
92		RL  C
93		RL  B
94		JP	back4
95;
96		org 0x200
97mul555:   	; 32x32->32  multiplicands in DE,BC and DE',BC' result in HL',IX(low)
98            ; undefined on return: A,B,C,D,E,F,B',C',D',E'
99			; time <= 3966 ticks
100			; ENTRY back5:  multiplicands in DE,BC and DE',BC'
101			;               sum up in  HL', IX
102            ; on return result in HL'(high), IX(low)
103		XOR A
104		EXX
105   		LD  H,A
106		LD  L,A
107        EXX
108		LD  IX,0
109back5:	SRL D
110		RR  E
111		RR  B
112		RR  C
113		EXX
114		JR	NC,over5
115		ADD IX,BC
116		ADC HL,DE
117over5:  SLA C
118		RL  B
119		RL  E
120		RL  D
121		EXX
122		LD  A,D
123		OR  E
124		JR  NZ,back5
125		OR  B
126		OR  C
127		RET Z     ; ready , result in HL'(high), IX(low)
128backb:	SRL B
129		RR  C
130		EXX
131		JR	NC,dont5
132		ADD IX,BC
133		ADC HL,DE
134dont5:  SLA C
135		RL  B
136		RL  E
137		RL  D
138		EXX
139		LD  A,B
140		OR  C
141		RET Z     ; ready , result in HL'(high), IX(low)
142		JP	backb
143;
144		org 0x280
145mul556:		; 32x32->64  multiplicands in DE,BC and DE',BC'
146            ; result in IY(highest), HL(high), HL'(low), IX(lowest)
147            ; undefined on return: A,B,C,D,E,F,H,L,B',C',D',E',H',L',F'
148			; time <= 5673 ticks
149			; ENTRY mul32: multiplicands in DE,BC and DE',BC',
150			;              IX(lowest) must(!) be cleared on entry
151			;              sum up in  IY(highest), HL(high), HL'(low)
152            ; on return result in IY(highest), HL(high), HL'(low), IX(lowest)
153   		LD  IY,0
154		LD  IX,0
155		XOR A
156		LD  H,A
157		LD  L,A
158        EXX
159		LD  H,A
160		LD  L,A
161		EXX
162mul32: 	LD  A,C
163		OR  B
164		OR  E
165		OR  D
166		RET Z
167		EXX
168		ADD IX,BC
169		XOR A
170		LD  B,A
171		LD  C,A
172back6:  EXX
173        SRL D       ; registers
174        RR  E
175        RR  B
176        RR  C
177		EXX
178        RR  B
179        RR  C
180		EX  AF,AF'
181        ADD IX,IX
182		RL  E
183		RL  D
184		JR	NC,over6 ; '-registers
185		ADD HL,BC
186		EXX
187		ADC HL,BC
188		JR NC,dont6
189		INC IY
190dont6: 	ADD IY,DE
191        EXX
192		SCF
193over6:	EX  AF,AF'   ; '-registers
194		JR  NC,back6
195		LD  A,D      ; '-registers
196		EXX
197		EX  AF,AF'   ; D is 0
198		RR  D        ; E is 0
199		ADD IX,DE    ; IX becomes 0 or 8000H
200		EX  AF,AF'
201        LD  D,A
202		EXX
203		LD  A,E      ; '-registers
204		LD  E,0
205		LD  D,128
206		EXX
207		LD  E,A
208next6:	LD  A,E
209        OR  D        ; registers
210        RET Z
211        SRL B
212        RR  C
213		EXX
214        RR  B
215        RR  C
216        RR  D
217        RR  E
218		EXX
219		SLA E
220		RL  D
221		JR	NC,next6
222		EXX
223		ADD IX,DE
224      	ADC HL,BC
225		EXX
226		ADC HL,BC
227		JR  NC,next6
228        INC IY
229        JP next6
230;
231		org 0x300
232mul666:		; 64x64 multiplicands in DE(highest), BC(high), HL'(low), IX(lowest)
233            ; and in IY(highest), HL(high), DE'(low), BC'(lowest)
234            ; result in IY(highest), HL(high), HL'(low), IX(lowest)
235            ; undefined on return: A,B,C,D,E,F,H,L,B',C',D',E',H',L',F'
236			; needs 6*2+2=14 bytes on stack
237			; time <= 13861 ticks
238		EXX
239   		PUSH  BC
240   		PUSH  DE
241   		PUSH  IX
242   		PUSH  HL
243		EXX
244		PUSH  HL
245   		PUSH  IY
246		CALL  mul555   ; low factor times high factor
247		POP   DE       ; high word
248		POP   BC       ; low word
249		EXX
250		POP   DE       ; high word
251		POP   BC       ; low word
252		PUSH  BC
253		PUSH  DE       ; SP+4 effectivley
254		EXX
255        CALL  back5    ; stack untouched (if no interrupt!)
256		PUSH  IX
257		EXX
258		PUSH  HL
259		POP   IY
260		EXX
261		POP   HL
262		EXX
263		LD    H,0
264		LD    L,0
265		LD    IX,0     ; sum ready for multiplication of two lowest double words
266		POP   DE
267		POP   BC
268        EXX
269		POP   DE
270		POP   BC
271        CALL  mul32
272		RET
273		END
274