@@ -282,7 +282,9 @@ _a.__DATA__:
282282 ; O = [a0 + b0 * (a1 + b1 * (a2 + ... bN-2(aN-1)))]
283283; What I will do here is to calculate the following sequence:
284284 ; ((aN-1 * bN-2) + aN-2) * bN-3 + ...
285- #line 1 "/zxbasic/src/lib/arch/zx48k/runtime/mul16.asm"
285+ #line 1 "/zxbasic/src/lib/arch/zx48k/runtime/arith/fmul16.asm"
286+ ;; Performs a faster multiply for little 16bit numbs
287+ #line 1 "/zxbasic/src/lib/arch/zx48k/runtime/arith/mul16.asm"
286288 push namespace core
287289__MUL16: ; Mutiplies HL with the last value stored into de stack
288290 ; Works for both signed and unsigned
@@ -308,6 +310,23 @@ __MUL16NOADD:
308310 ret ; Result in hl (16 lower bits)
309311 ENDP
310312 pop namespace
313+ #line 3 "/zxbasic/src/lib/arch/zx48k/runtime/arith/fmul16.asm"
314+ push namespace core
315+ __FMUL16:
316+ xor a
317+ or h
318+ jp nz , __MUL16_FAST
319+ or l
320+ ret z
321+ cp 33
322+ jp nc , __MUL16_FAST
323+ ld b , l
324+ ld l , h ; HL = 0
325+ 1 :
326+ add hl , de
327+ djnz 1b
328+ ret
329+ pop namespace
311330#line 20 "/zxbasic/src/lib/arch/zx48k/runtime/array.asm"
312331#line 24 "/zxbasic/src/lib/arch/zx48k/runtime/array.asm"
313332 push namespace core
@@ -380,7 +399,7 @@ LOOP:
380399 push de
381400 exx
382401 pop de ; DE = Max bound Number (i-th dimension)
383- call __FNMUL ; HL <= HL * DE mod 65536
402+ call __FMUL16 ; HL <= HL * DE mod 65536
384403 jp LOOP
385404ARRAY_END:
386405 ld a , (hl)
@@ -404,22 +423,6 @@ ARRAY_SIZE_LOOP:
404423 ld de , (RET_ADDR)
405424 push de
406425 ret
407- ;; Performs a faster multiply for little 16bit numbs
408- LOCAL __FNMUL , __FNMUL2
409- __FNMUL:
410- xor a
411- or h
412- jp nz , __MUL16_FAST
413- or l
414- ret z
415- cp 33
416- jp nc , __MUL16_FAST
417- ld b , l
418- ld l , h ; HL = 0
419- __FNMUL2:
420- add hl , de
421- djnz __FNMUL2
422- ret
423426 ENDP
424427 pop namespace
425428#line 27 "arch/zx48k/aloadstr1.bas"
0 commit comments