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