1
2INCLUDE "config_private.inc"
3
4SECTION code_clib
5SECTION code_math
6
7PUBLIC l_fast_muls_8_8x8
8
9EXTERN l_fast_mulu_16_8x8
10
11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
12IF __CLIB_OPT_IMATH_FAST & $80
13
14   EXTERN error_mulu_overflow_mc
15
16ENDIF
17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
18
19l_fast_muls_8_8x8:
20
21   ; signed multiply of two 8-bit numbers
22   ;
23   ; error reported on overflow
24   ;
25   ; enter : l = 8-bit signed number
26   ;         e = 8-bit signed number
27   ;
28   ; exit  : d = 0
29   ;
30   ;         success
31   ;
32   ;            hl = sign extended 8-bit product
33   ;            carry reset
34   ;
35   ;         signed overflow (LIA-1 enabled only)
36   ;
37   ;            hl = sign extended CHAR_MIN or CHAR_MAX
38   ;            carry set, errno = ERANGE
39   ;
40   ; uses  : af, b, de, hl
41
42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
43IF __CLIB_OPT_IMATH_FAST & $80
44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
45
46   ; determine sign of result
47
48   ld a,l
49   xor e
50   push af
51
52   ; make multiplicands positive
53
54   bit 7,l
55   jr z, ok_0
56
57   xor a
58   sub l
59   ld l,a
60
61ok_0:
62
63   bit 7,e
64   jr z, ok_1
65
66   xor a
67   sub e
68   ld e,a
69
70ok_1:
71
72   ; mutliply and check for overflow
73
74   call l_fast_mulu_16_8x8
75
76   inc h
77   dec h
78   jr nz, unsigned_overflow
79
80   bit 7,l
81   jr nz, signed_overflow
82
83   ; correct sign of result
84
85   pop af
86   ret p
87
88   ld a,l
89   neg
90   ld l,a
91   dec h
92
93   ret
94
95unsigned_overflow:
96signed_overflow:
97
98   call error_mulu_overflow_mc
99
100   ; hl = $ffff
101   ; stack = sign of result
102
103   pop af
104   scf
105
106   ld l,$80
107   ret m                       ; return CHAR_MIN
108
109   inc h
110   dec l                       ; return CHAR_MAX
111
112   ret
113
114;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
115ELSE
116;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
117
118   call l_fast_mulu_16_8x8
119
120   ld a,l
121
122   rla
123   sbc a,a
124
125   ld h,a                      ; sign extend L into H
126
127   or a
128   ret
129
130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
131ENDIF
132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
133