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