868b2b66 (kx 2024-12-20 16:11:07 +0300 1)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3) __MPU_INTEGER.C
868b2b66 (kx 2024-12-20 16:11:07 +0300 4)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5) This file contains source code of functions for
868b2b66 (kx 2024-12-20 16:11:07 +0300 6) INTEGER arithmetic operations.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8) PART OF : MPU - library .
868b2b66 (kx 2024-12-20 16:11:07 +0300 9)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10) USAGE : Internal only .
868b2b66 (kx 2024-12-20 16:11:07 +0300 11)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12) NOTE : NONE .
868b2b66 (kx 2024-12-20 16:11:07 +0300 13)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14) Copyright (C) 2000 - 2024 by Andrew V.Kosteltsev.
868b2b66 (kx 2024-12-20 16:11:07 +0300 15) All Rights Reserved.
868b2b66 (kx 2024-12-20 16:11:07 +0300 16) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 17)
868b2b66 (kx 2024-12-20 16:11:07 +0300 18) #ifdef HAVE_CONFIG_H
868b2b66 (kx 2024-12-20 16:11:07 +0300 19) #include <config.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 20) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 21)
868b2b66 (kx 2024-12-20 16:11:07 +0300 22) #include <errno.h> /* errno(3) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 23) #include <string.h> /* strcpy(3) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 24) #include <strings.h> /* bzero(3) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 25)
868b2b66 (kx 2024-12-20 16:11:07 +0300 26) #include <libmpu.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 27) #include <mpu-context.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 28)
868b2b66 (kx 2024-12-20 16:11:07 +0300 29) #include <mpu-emutype.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 30) #include <mpu-integer.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 31)
868b2b66 (kx 2024-12-20 16:11:07 +0300 32) #include <mpu-char.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 33) #include <mpu-symbols.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 34)
868b2b66 (kx 2024-12-20 16:11:07 +0300 35) #include <mpu-math-errno.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 36) #include <mpu-mtherr.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300 37)
868b2b66 (kx 2024-12-20 16:11:07 +0300 38) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 39)
868b2b66 (kx 2024-12-20 16:11:07 +0300 40) Internal exploded integer-type data structure of a number
868b2b66 (kx 2024-12-20 16:11:07 +0300 41) (a EMUSHORT is BITS_PER_EMUSHORT bits):
868b2b66 (kx 2024-12-20 16:11:07 +0300 42)
868b2b66 (kx 2024-12-20 16:11:07 +0300 43) EMUSHORT ii[NP];
868b2b66 (kx 2024-12-20 16:11:07 +0300 44)
868b2b66 (kx 2024-12-20 16:11:07 +0300 45) IF MPU_BYTE_ORDER_BIG_ENDIAN == 1 (m68k, PowerPC)
868b2b66 (kx 2024-12-20 16:11:07 +0300 46)
868b2b66 (kx 2024-12-20 16:11:07 +0300 47) ii[0] - high EMUSHORT partion,
868b2b66 (kx 2024-12-20 16:11:07 +0300 48) ii[NP-1] - low EMUSHORT partion.
868b2b66 (kx 2024-12-20 16:11:07 +0300 49)
868b2b66 (kx 2024-12-20 16:11:07 +0300 50) - that is ---------------------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 51) pointer -> [high EMUSHORT partion] :0 part
868b2b66 (kx 2024-12-20 16:11:07 +0300 52) [ . . . ] :1 part
868b2b66 (kx 2024-12-20 16:11:07 +0300 53) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 54) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 55) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 56) [low EMUSHORT partion] :NP-1 part
868b2b66 (kx 2024-12-20 16:11:07 +0300 57) -------------------------------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 58)
868b2b66 (kx 2024-12-20 16:11:07 +0300 59) ELSE IF MPU_BYTE_ORDER_BIG_ENDIAN == 0 (i386, Alpha)
868b2b66 (kx 2024-12-20 16:11:07 +0300 60)
868b2b66 (kx 2024-12-20 16:11:07 +0300 61) ii[0] - low EMUSHORT partion.
868b2b66 (kx 2024-12-20 16:11:07 +0300 62) ii[NP-1] - high EMUSHORT partion,
868b2b66 (kx 2024-12-20 16:11:07 +0300 63)
868b2b66 (kx 2024-12-20 16:11:07 +0300 64) - that is ---------------------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 65) part 0: [low EMUSHORT partion] <- pointer
868b2b66 (kx 2024-12-20 16:11:07 +0300 66) part 1: [ . . . ]
868b2b66 (kx 2024-12-20 16:11:07 +0300 67) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 68) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 69) .
868b2b66 (kx 2024-12-20 16:11:07 +0300 70) part NP-1: [high EMUSHORT partion]
868b2b66 (kx 2024-12-20 16:11:07 +0300 71) -------------------------------------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 72)
868b2b66 (kx 2024-12-20 16:11:07 +0300 73) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 74)
868b2b66 (kx 2024-12-20 16:11:07 +0300 75)
868b2b66 (kx 2024-12-20 16:11:07 +0300 76) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 77) Операции сложения и вычитания с учетом и без учета флага
868b2b66 (kx 2024-12-20 16:11:07 +0300 78) переноса.
868b2b66 (kx 2024-12-20 16:11:07 +0300 79) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 80)
868b2b66 (kx 2024-12-20 16:11:07 +0300 81) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 82) 8-bit operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 83) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 84) /* сложение знаковое и беззнаковое: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 85) void iadd_8( __mpu_uint8_t *c, __mpu_uint8_t *a, __mpu_uint8_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 86) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 87) __mpu_uint16_t rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 88) signed int carry, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 89)
868b2b66 (kx 2024-12-20 16:11:07 +0300 90) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 91)
868b2b66 (kx 2024-12-20 16:11:07 +0300 92) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 93)
868b2b66 (kx 2024-12-20 16:11:07 +0300 94) /* set auxiliary carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 95) rc = ((__mpu_uint16_t) (*a) & 0x0f) +
868b2b66 (kx 2024-12-20 16:11:07 +0300 96) ((__mpu_uint16_t) (*b) & 0x0f) + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 97) if( rc & 0x10 ) __STA; /* set aux carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 98)
868b2b66 (kx 2024-12-20 16:11:07 +0300 99) /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 100) rc = (__mpu_uint16_t) (*a) +
868b2b66 (kx 2024-12-20 16:11:07 +0300 101) (__mpu_uint16_t) (*b) + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 102) if( rc & 0x100 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 103) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 104)
868b2b66 (kx 2024-12-20 16:11:07 +0300 105) if( __MPARITY(rc) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 106)
868b2b66 (kx 2024-12-20 16:11:07 +0300 107) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 108) op1 = (__mpu_uint16_t) (*a);
868b2b66 (kx 2024-12-20 16:11:07 +0300 109) op2 = (__mpu_uint16_t) (*b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 110) if( op1 & 0x80 ) op1 |= 0x100;
868b2b66 (kx 2024-12-20 16:11:07 +0300 111) if( op2 & 0x80 ) op2 |= 0x100;
868b2b66 (kx 2024-12-20 16:11:07 +0300 112)
868b2b66 (kx 2024-12-20 16:11:07 +0300 113) rc = op1 + op2 + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 114) if( rc & 0x100 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 115) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 116) if( rc & 0x80 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 117)
868b2b66 (kx 2024-12-20 16:11:07 +0300 118) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 119) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 120) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 121)
868b2b66 (kx 2024-12-20 16:11:07 +0300 122) *c = (__mpu_uint8_t) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 123) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 124) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 125)
868b2b66 (kx 2024-12-20 16:11:07 +0300 126) /* сложение знаковое и беззнаковое с переносом: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 127) void iadc_8( __mpu_uint8_t *c, __mpu_uint8_t *a, __mpu_uint8_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 128) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 129) __mpu_uint16_t rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 130) signed int carry, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 131)
868b2b66 (kx 2024-12-20 16:11:07 +0300 132) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 133)
868b2b66 (kx 2024-12-20 16:11:07 +0300 134) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 135)
868b2b66 (kx 2024-12-20 16:11:07 +0300 136) /* set auxiliary carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 137) rc = ((__mpu_uint16_t) (*a) & 0x0f) +
868b2b66 (kx 2024-12-20 16:11:07 +0300 138) ((__mpu_uint16_t) (*b) & 0x0f) + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 139) if( rc & 0x10 ) __STA; /* set aux carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 140)
868b2b66 (kx 2024-12-20 16:11:07 +0300 141) /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 142) rc = (__mpu_uint16_t) (*a) +
868b2b66 (kx 2024-12-20 16:11:07 +0300 143) (__mpu_uint16_t) (*b) + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 144) if( rc & 0x100 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 145) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 146)
868b2b66 (kx 2024-12-20 16:11:07 +0300 147) if( __MPARITY(rc) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 148)
868b2b66 (kx 2024-12-20 16:11:07 +0300 149) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 150) op1 = (__mpu_uint16_t) (*a);
868b2b66 (kx 2024-12-20 16:11:07 +0300 151) op2 = (__mpu_uint16_t) (*b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 152) if( op1 & 0x80 ) op1 |= 0x100;
868b2b66 (kx 2024-12-20 16:11:07 +0300 153) if( op2 & 0x80 ) op2 |= 0x100;
868b2b66 (kx 2024-12-20 16:11:07 +0300 154)
868b2b66 (kx 2024-12-20 16:11:07 +0300 155) rc = op1 + op2 + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 156) if( rc & 0x100 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 157) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 158) if( rc & 0x80 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 159)
868b2b66 (kx 2024-12-20 16:11:07 +0300 160) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 161) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 162) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 163)
868b2b66 (kx 2024-12-20 16:11:07 +0300 164) *c = (__mpu_uint8_t) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 165) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 166) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 167)
868b2b66 (kx 2024-12-20 16:11:07 +0300 168) /* вычитание знаковое и беззнаковое: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 169) void isub_8( __mpu_uint8_t *c, __mpu_uint8_t *a, __mpu_uint8_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 170) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 171) __mpu_uint16_t rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 172) signed int carry, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 173)
868b2b66 (kx 2024-12-20 16:11:07 +0300 174) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 175)
868b2b66 (kx 2024-12-20 16:11:07 +0300 176) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 177)
868b2b66 (kx 2024-12-20 16:11:07 +0300 178) /* set auxiliary carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 179) rc = ((__mpu_uint16_t) (*a) & 0x0f) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 180) ((__mpu_uint16_t) (*b) & 0x0f) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 181) if( rc & 0x10 ) __STA; /* set aux carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 182)
868b2b66 (kx 2024-12-20 16:11:07 +0300 183) /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 184) rc = (__mpu_uint16_t) (*a) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 185) (__mpu_uint16_t) (*b) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 186) if( rc & 0x100 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 187) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 188)
868b2b66 (kx 2024-12-20 16:11:07 +0300 189) if( __MPARITY(rc) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 190)
868b2b66 (kx 2024-12-20 16:11:07 +0300 191) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 192) op1 = (__mpu_uint16_t) (*a);
868b2b66 (kx 2024-12-20 16:11:07 +0300 193) op2 = (__mpu_uint16_t) (*b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 194) if( op1 & 0x80 ) op1 |= 0x100;
868b2b66 (kx 2024-12-20 16:11:07 +0300 195) if( op2 & 0x80 ) op2 |= 0x100;
868b2b66 (kx 2024-12-20 16:11:07 +0300 196)
868b2b66 (kx 2024-12-20 16:11:07 +0300 197) rc = op1 - op2 - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 198) if( rc & 0x100 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 199) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 200) if( rc & 0x80 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 201)
868b2b66 (kx 2024-12-20 16:11:07 +0300 202) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 203) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 204) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 205)
868b2b66 (kx 2024-12-20 16:11:07 +0300 206) *c = (__mpu_uint8_t) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 207) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 208) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 209)
868b2b66 (kx 2024-12-20 16:11:07 +0300 210) /* вычитание знаковое и беззнаковое с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 211) void isbb_8( __mpu_uint8_t *c, __mpu_uint8_t *a, __mpu_uint8_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 212) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 213) __mpu_uint16_t rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 214) signed int carry, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 215)
868b2b66 (kx 2024-12-20 16:11:07 +0300 216) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 217)
868b2b66 (kx 2024-12-20 16:11:07 +0300 218) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 219)
868b2b66 (kx 2024-12-20 16:11:07 +0300 220) /* set auxiliary carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 221) rc = ((__mpu_uint16_t) (*a) & 0x0f) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 222) ((__mpu_uint16_t) (*b) & 0x0f) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 223) if( rc & 0x10 ) __STA; /* set aux carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 224)
868b2b66 (kx 2024-12-20 16:11:07 +0300 225) /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 226) rc = (__mpu_uint16_t) (*a) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 227) (__mpu_uint16_t) (*b) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 228) if( rc & 0x100 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 229) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 230)
868b2b66 (kx 2024-12-20 16:11:07 +0300 231) if( __MPARITY(rc) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 232)
868b2b66 (kx 2024-12-20 16:11:07 +0300 233) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 234) op1 = (__mpu_uint16_t) (*a);
868b2b66 (kx 2024-12-20 16:11:07 +0300 235) op2 = (__mpu_uint16_t) (*b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 236) if( op1 & 0x80 ) op1 |= 0x100;
868b2b66 (kx 2024-12-20 16:11:07 +0300 237) if( op2 & 0x80 ) op2 |= 0x100;
868b2b66 (kx 2024-12-20 16:11:07 +0300 238)
868b2b66 (kx 2024-12-20 16:11:07 +0300 239) rc = op1 - op2 - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 240) if( rc & 0x100 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 241) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 242) if( rc & 0x80 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 243)
868b2b66 (kx 2024-12-20 16:11:07 +0300 244) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 245) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 246) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 247)
868b2b66 (kx 2024-12-20 16:11:07 +0300 248) *c = (__mpu_uint8_t) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 249) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 250) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 251)
868b2b66 (kx 2024-12-20 16:11:07 +0300 252) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 253) 16-bit operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 254) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 255) /* сложение знаковое и беззнаковое: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 256) void iadd_16( __mpu_uint16_t *c, __mpu_uint16_t *a, __mpu_uint16_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 257) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 258) __mpu_uint32_t rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 259) signed int carry, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 260)
868b2b66 (kx 2024-12-20 16:11:07 +0300 261) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 262)
868b2b66 (kx 2024-12-20 16:11:07 +0300 263) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 264)
868b2b66 (kx 2024-12-20 16:11:07 +0300 265) /* set auxiliary carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 266) rc = ((__mpu_uint32_t) (*a) & 0x0f) +
868b2b66 (kx 2024-12-20 16:11:07 +0300 267) ((__mpu_uint32_t) (*b) & 0x0f) + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 268) if( rc & 0x10 ) __STA; /* set aux carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 269)
868b2b66 (kx 2024-12-20 16:11:07 +0300 270) /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 271) rc = (__mpu_uint32_t) (*a) +
868b2b66 (kx 2024-12-20 16:11:07 +0300 272) (__mpu_uint32_t) (*b) + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 273) if( rc & 0x10000 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 274) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 275)
868b2b66 (kx 2024-12-20 16:11:07 +0300 276) if( __MPARITY(rc) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 277)
868b2b66 (kx 2024-12-20 16:11:07 +0300 278) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 279) op1 = (__mpu_uint32_t) (*a);
868b2b66 (kx 2024-12-20 16:11:07 +0300 280) op2 = (__mpu_uint32_t) (*b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 281) if( op1 & 0x8000 ) op1 |= 0x10000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 282) if( op2 & 0x8000 ) op2 |= 0x10000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 283)
868b2b66 (kx 2024-12-20 16:11:07 +0300 284) rc = op1 + op2 + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 285) if( rc & 0x10000 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 286) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 287) if( rc & 0x8000 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 288)
868b2b66 (kx 2024-12-20 16:11:07 +0300 289) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 290) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 291) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 292)
868b2b66 (kx 2024-12-20 16:11:07 +0300 293) *c = (__mpu_uint16_t) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 294) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 295) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 296)
868b2b66 (kx 2024-12-20 16:11:07 +0300 297) /* сложение знаковое и беззнаковое с переносом: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 298) void iadc_16( __mpu_uint16_t *c, __mpu_uint16_t *a, __mpu_uint16_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 299) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 300) __mpu_uint32_t rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 301) signed int carry, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 302)
868b2b66 (kx 2024-12-20 16:11:07 +0300 303) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 304)
868b2b66 (kx 2024-12-20 16:11:07 +0300 305) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 306)
868b2b66 (kx 2024-12-20 16:11:07 +0300 307) /* set auxiliary carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 308) rc = ((__mpu_uint32_t) (*a) & 0x0f) +
868b2b66 (kx 2024-12-20 16:11:07 +0300 309) ((__mpu_uint32_t) (*b) & 0x0f) + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 310) if( rc & 0x10 ) __STA; /* set aux carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 311)
868b2b66 (kx 2024-12-20 16:11:07 +0300 312) /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 313) rc = (__mpu_uint32_t) (*a) +
868b2b66 (kx 2024-12-20 16:11:07 +0300 314) (__mpu_uint32_t) (*b) + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 315) if( rc & 0x10000 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 316) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 317)
868b2b66 (kx 2024-12-20 16:11:07 +0300 318) if( __MPARITY(rc) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 319)
868b2b66 (kx 2024-12-20 16:11:07 +0300 320) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 321) op1 = (__mpu_uint32_t) (*a);
868b2b66 (kx 2024-12-20 16:11:07 +0300 322) op2 = (__mpu_uint32_t) (*b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 323) if( op1 & 0x8000 ) op1 |= 0x10000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 324) if( op2 & 0x8000 ) op2 |= 0x10000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 325)
868b2b66 (kx 2024-12-20 16:11:07 +0300 326) rc = op1 + op2 + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 327) if( rc & 0x10000 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 328) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 329) if( rc & 0x8000 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 330)
868b2b66 (kx 2024-12-20 16:11:07 +0300 331) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 332) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 333) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 334)
868b2b66 (kx 2024-12-20 16:11:07 +0300 335) *c = (__mpu_uint16_t) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 336) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 337) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 338)
868b2b66 (kx 2024-12-20 16:11:07 +0300 339) /* вычитание знаковое и беззнаковое: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 340) void isub_16( __mpu_uint16_t *c, __mpu_uint16_t *a, __mpu_uint16_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 341) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 342) __mpu_uint32_t rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 343) signed int carry, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 344)
868b2b66 (kx 2024-12-20 16:11:07 +0300 345) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 346)
868b2b66 (kx 2024-12-20 16:11:07 +0300 347) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 348)
868b2b66 (kx 2024-12-20 16:11:07 +0300 349) /* set auxiliary carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 350) rc = ((__mpu_uint32_t) (*a) & 0x0f) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 351) ((__mpu_uint32_t) (*b) & 0x0f) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 352) if( rc & 0x10 ) __STA; /* set aux carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 353)
868b2b66 (kx 2024-12-20 16:11:07 +0300 354) /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 355) rc = (__mpu_uint32_t) (*a) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 356) (__mpu_uint32_t) (*b) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 357) if( rc & 0x10000 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 358) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 359)
868b2b66 (kx 2024-12-20 16:11:07 +0300 360) if( __MPARITY(rc) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 361)
868b2b66 (kx 2024-12-20 16:11:07 +0300 362) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 363) op1 = (__mpu_uint32_t) (*a);
868b2b66 (kx 2024-12-20 16:11:07 +0300 364) op2 = (__mpu_uint32_t) (*b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 365) if( op1 & 0x8000 ) op1 |= 0x10000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 366) if( op2 & 0x8000 ) op2 |= 0x10000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 367)
868b2b66 (kx 2024-12-20 16:11:07 +0300 368) rc = op1 - op2 - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 369) if( rc & 0x10000 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 370) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 371) if( rc & 0x8000 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 372)
868b2b66 (kx 2024-12-20 16:11:07 +0300 373) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 374) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 375) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 376)
868b2b66 (kx 2024-12-20 16:11:07 +0300 377) *c = (__mpu_uint16_t) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 378) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 379) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 380)
868b2b66 (kx 2024-12-20 16:11:07 +0300 381) /* вычитание знаковое и беззнаковое с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 382) void isbb_16( __mpu_uint16_t *c, __mpu_uint16_t *a, __mpu_uint16_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 383) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 384) __mpu_uint32_t rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 385) signed int carry, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 386)
868b2b66 (kx 2024-12-20 16:11:07 +0300 387) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 388)
868b2b66 (kx 2024-12-20 16:11:07 +0300 389) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 390)
868b2b66 (kx 2024-12-20 16:11:07 +0300 391) /* set auxiliary carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 392) rc = ((__mpu_uint32_t) (*a) & 0x0f) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 393) ((__mpu_uint32_t) (*b) & 0x0f) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 394) if( rc & 0x10 ) __STA; /* set aux carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 395)
868b2b66 (kx 2024-12-20 16:11:07 +0300 396) /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 397) rc = (__mpu_uint32_t) (*a) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 398) (__mpu_uint32_t) (*b) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 399) if( rc & 0x10000 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 400) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 401)
868b2b66 (kx 2024-12-20 16:11:07 +0300 402) if( __MPARITY(rc) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 403)
868b2b66 (kx 2024-12-20 16:11:07 +0300 404) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 405) op1 = (__mpu_uint32_t) (*a);
868b2b66 (kx 2024-12-20 16:11:07 +0300 406) op2 = (__mpu_uint32_t) (*b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 407) if( op1 & 0x8000 ) op1 |= 0x10000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 408) if( op2 & 0x8000 ) op2 |= 0x10000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 409)
868b2b66 (kx 2024-12-20 16:11:07 +0300 410) rc = op1 - op2 - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 411) if( rc & 0x10000 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 412) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 413) if( rc & 0x8000 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 414)
868b2b66 (kx 2024-12-20 16:11:07 +0300 415) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 416) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 417) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 418)
868b2b66 (kx 2024-12-20 16:11:07 +0300 419) *c = (__mpu_uint16_t) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 420) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 421) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 422)
868b2b66 (kx 2024-12-20 16:11:07 +0300 423) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 424) 32-bit operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 425) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 426) /* сложение знаковое и беззнаковое: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 427) void iadd_32( __mpu_uint32_t *c, __mpu_uint32_t *a, __mpu_uint32_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 428) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 429) __mpu_uint64_t rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 430) signed int carry, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 431)
868b2b66 (kx 2024-12-20 16:11:07 +0300 432) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 433)
868b2b66 (kx 2024-12-20 16:11:07 +0300 434) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 435)
868b2b66 (kx 2024-12-20 16:11:07 +0300 436) /* set auxiliary carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 437) rc = ((__mpu_uint64_t) (*a) & 0x0f) +
868b2b66 (kx 2024-12-20 16:11:07 +0300 438) ((__mpu_uint64_t) (*b) & 0x0f) + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 439) if( rc & 0x10 ) __STA; /* set aux carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 440)
868b2b66 (kx 2024-12-20 16:11:07 +0300 441) /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 442) rc = (__mpu_uint64_t) (*a) +
868b2b66 (kx 2024-12-20 16:11:07 +0300 443) (__mpu_uint64_t) (*b) + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 444) if( rc & 0x100000000 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 445) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 446)
868b2b66 (kx 2024-12-20 16:11:07 +0300 447) if( __MPARITY(rc) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 448)
868b2b66 (kx 2024-12-20 16:11:07 +0300 449) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 450) op1 = (__mpu_uint64_t) (*a);
868b2b66 (kx 2024-12-20 16:11:07 +0300 451) op2 = (__mpu_uint64_t) (*b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 452) if( op1 & 0x80000000 ) op1 |= 0x100000000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 453) if( op2 & 0x80000000 ) op2 |= 0x100000000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 454)
868b2b66 (kx 2024-12-20 16:11:07 +0300 455) rc = op1 + op2 + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 456) if( rc & 0x100000000 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 457) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 458) if( rc & 0x80000000 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 459)
868b2b66 (kx 2024-12-20 16:11:07 +0300 460) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 461) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 462) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 463)
868b2b66 (kx 2024-12-20 16:11:07 +0300 464) *c = (__mpu_uint32_t) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 465) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 466) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 467)
868b2b66 (kx 2024-12-20 16:11:07 +0300 468) /* сложение знаковое и беззнаковое с переносом: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 469) void iadc_32( __mpu_uint32_t *c, __mpu_uint32_t *a, __mpu_uint32_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 470) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 471) __mpu_uint64_t rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 472) signed int carry, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 473)
868b2b66 (kx 2024-12-20 16:11:07 +0300 474) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 475)
868b2b66 (kx 2024-12-20 16:11:07 +0300 476) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 477)
868b2b66 (kx 2024-12-20 16:11:07 +0300 478) /* set auxiliary carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 479) rc = ((__mpu_uint64_t) (*a) & 0x0f) +
868b2b66 (kx 2024-12-20 16:11:07 +0300 480) ((__mpu_uint64_t) (*b) & 0x0f) + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 481) if( rc & 0x10 ) __STA; /* set aux carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 482)
868b2b66 (kx 2024-12-20 16:11:07 +0300 483) /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 484) rc = (__mpu_uint64_t) (*a) +
868b2b66 (kx 2024-12-20 16:11:07 +0300 485) (__mpu_uint64_t) (*b) + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 486) if( rc & 0x100000000 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 487) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 488)
868b2b66 (kx 2024-12-20 16:11:07 +0300 489) if( __MPARITY(rc) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 490)
868b2b66 (kx 2024-12-20 16:11:07 +0300 491) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 492) op1 = (__mpu_uint64_t) (*a);
868b2b66 (kx 2024-12-20 16:11:07 +0300 493) op2 = (__mpu_uint64_t) (*b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 494) if( op1 & 0x80000000 ) op1 |= 0x100000000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 495) if( op2 & 0x80000000 ) op2 |= 0x100000000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 496)
868b2b66 (kx 2024-12-20 16:11:07 +0300 497) rc = op1 + op2 + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 498) if( rc & 0x100000000 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 499) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 500) if( rc & 0x80000000 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 501)
868b2b66 (kx 2024-12-20 16:11:07 +0300 502) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 503) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 504) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 505)
868b2b66 (kx 2024-12-20 16:11:07 +0300 506) *c = (__mpu_uint32_t) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 507) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 508) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 509)
868b2b66 (kx 2024-12-20 16:11:07 +0300 510) /* вычитание знаковое и беззнаковое: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 511) void isub_32( __mpu_uint32_t *c, __mpu_uint32_t *a, __mpu_uint32_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 512) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 513) __mpu_uint64_t rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 514) signed int carry, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 515)
868b2b66 (kx 2024-12-20 16:11:07 +0300 516) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 517)
868b2b66 (kx 2024-12-20 16:11:07 +0300 518) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 519)
868b2b66 (kx 2024-12-20 16:11:07 +0300 520) /* set auxiliary carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 521) rc = ((__mpu_uint64_t) (*a) & 0x0f) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 522) ((__mpu_uint64_t) (*b) & 0x0f) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 523) if( rc & 0x10 ) __STA; /* set aux carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 524)
868b2b66 (kx 2024-12-20 16:11:07 +0300 525) /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 526) rc = (__mpu_uint64_t) (*a) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 527) (__mpu_uint64_t) (*b) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 528) if( rc & 0x100000000 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 529) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 530)
868b2b66 (kx 2024-12-20 16:11:07 +0300 531) if( __MPARITY(rc) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 532)
868b2b66 (kx 2024-12-20 16:11:07 +0300 533) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 534) op1 = (__mpu_uint64_t) (*a);
868b2b66 (kx 2024-12-20 16:11:07 +0300 535) op2 = (__mpu_uint64_t) (*b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 536) if( op1 & 0x80000000 ) op1 |= 0x100000000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 537) if( op2 & 0x80000000 ) op2 |= 0x100000000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 538)
868b2b66 (kx 2024-12-20 16:11:07 +0300 539) rc = op1 - op2 - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 540) if( rc & 0x100000000 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 541) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 542) if( rc & 0x80000000 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 543)
868b2b66 (kx 2024-12-20 16:11:07 +0300 544) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 545) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 546) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 547)
868b2b66 (kx 2024-12-20 16:11:07 +0300 548) *c = (__mpu_uint32_t) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 549) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 550) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 551)
868b2b66 (kx 2024-12-20 16:11:07 +0300 552) /* вычитание знаковое и беззнаковое с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 553) void isbb_32( __mpu_uint32_t *c, __mpu_uint32_t *a, __mpu_uint32_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 554) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 555) __mpu_uint64_t rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 556) signed int carry, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 557)
868b2b66 (kx 2024-12-20 16:11:07 +0300 558) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 559)
868b2b66 (kx 2024-12-20 16:11:07 +0300 560) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 561)
868b2b66 (kx 2024-12-20 16:11:07 +0300 562) /* set auxiliary carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 563) rc = ((__mpu_uint64_t) (*a) & 0x0f) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 564) ((__mpu_uint64_t) (*b) & 0x0f) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 565) if( rc & 0x10 ) __STA; /* set aux carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 566)
868b2b66 (kx 2024-12-20 16:11:07 +0300 567) /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 568) rc = (__mpu_uint64_t) (*a) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 569) (__mpu_uint64_t) (*b) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 570) if( rc & 0x100000000 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 571) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 572)
868b2b66 (kx 2024-12-20 16:11:07 +0300 573) if( __MPARITY(rc) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 574)
868b2b66 (kx 2024-12-20 16:11:07 +0300 575) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 576) op1 = (__mpu_uint64_t) (*a);
868b2b66 (kx 2024-12-20 16:11:07 +0300 577) op2 = (__mpu_uint64_t) (*b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 578) if( op1 & 0x80000000 ) op1 |= 0x100000000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 579) if( op2 & 0x80000000 ) op2 |= 0x100000000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 580)
868b2b66 (kx 2024-12-20 16:11:07 +0300 581) rc = op1 - op2 - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 582) if( rc & 0x100000000 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 583) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 584) if( rc & 0x80000000 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 585)
868b2b66 (kx 2024-12-20 16:11:07 +0300 586) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 587) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 588) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 589)
868b2b66 (kx 2024-12-20 16:11:07 +0300 590) *c = (__mpu_uint32_t) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 591) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 592) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 593)
868b2b66 (kx 2024-12-20 16:11:07 +0300 594) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 595) EMUSHORT (32-bit) operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 596) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 597) /* сложение знаковое и беззнаковое целых всех размеров */
868b2b66 (kx 2024-12-20 16:11:07 +0300 598) void iadd_np( EMUSHORT *c, EMUSHORT *a, EMUSHORT *b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 599) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 600) EMULONG rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 601) EMUSHORT *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 602) signed int carry, sign = 0, zero = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 603) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 604)
868b2b66 (kx 2024-12-20 16:11:07 +0300 605) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 606) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 607) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 608) __integer_invalid_size( (__mpu_char8_t *)"iadd_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 609) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 610) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 611)
868b2b66 (kx 2024-12-20 16:11:07 +0300 612) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 613)
868b2b66 (kx 2024-12-20 16:11:07 +0300 614) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 615)
868b2b66 (kx 2024-12-20 16:11:07 +0300 616) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 617) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 618) y = b + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 619) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 620) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 621) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 622) y = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 623) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 624) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 625)
868b2b66 (kx 2024-12-20 16:11:07 +0300 626) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 627) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 628) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 629) while( i < np - 1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 630) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 631) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 632) rc = (EMULONG) (*x) +
868b2b66 (kx 2024-12-20 16:11:07 +0300 633) (EMULONG) (*y) + __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 634) if( rc & MASK_CARRY ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 635) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 636) c[i] = (EMUSHORT) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 637) if( c[i] ) zero |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 638)
868b2b66 (kx 2024-12-20 16:11:07 +0300 639) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 640) --x; --y; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 641) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 642) ++x; ++y; ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 643) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 644) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 645)
868b2b66 (kx 2024-12-20 16:11:07 +0300 646) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 647)
868b2b66 (kx 2024-12-20 16:11:07 +0300 648) /* set Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 649) rc = (EMULONG) (*x) +
868b2b66 (kx 2024-12-20 16:11:07 +0300 650) (EMULONG) (*y) + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 651) if( rc & MASK_CARRY ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 652) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 653)
868b2b66 (kx 2024-12-20 16:11:07 +0300 654) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 655) op1 = (EMULONG) (*x);
868b2b66 (kx 2024-12-20 16:11:07 +0300 656) op2 = (EMULONG) (*y);
868b2b66 (kx 2024-12-20 16:11:07 +0300 657) if( op1 & MASK_SIGN ) op1 |= MASK_CARRY;
868b2b66 (kx 2024-12-20 16:11:07 +0300 658) if( op2 & MASK_SIGN ) op2 |= MASK_CARRY;
868b2b66 (kx 2024-12-20 16:11:07 +0300 659)
868b2b66 (kx 2024-12-20 16:11:07 +0300 660) rc = op1 + op2 + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 661) if( rc & MASK_CARRY ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 662) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 663) if( rc & MASK_SIGN ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 664)
868b2b66 (kx 2024-12-20 16:11:07 +0300 665) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 666) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 667) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 668)
868b2b66 (kx 2024-12-20 16:11:07 +0300 669) c[i] = (EMUSHORT) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 670) if( c[i] ) zero |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 671) zero ^= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 672)
868b2b66 (kx 2024-12-20 16:11:07 +0300 673) if( zero ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 674) else __CLZ; /* clear zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 675) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 676)
868b2b66 (kx 2024-12-20 16:11:07 +0300 677) /* сложение знаковое и беззнаковое целых всех размеров с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 678) void iadc_np( EMUSHORT *c, EMUSHORT *a, EMUSHORT *b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 679) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 680) EMULONG rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 681) EMUSHORT *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 682) signed int carry, sign = 0, zero = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 683) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 684)
868b2b66 (kx 2024-12-20 16:11:07 +0300 685) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 686) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 687) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 688) __integer_invalid_size( (__mpu_char8_t *)"iadc_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 689) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 690) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 691)
868b2b66 (kx 2024-12-20 16:11:07 +0300 692) __CLEAR_IFLAGS_WITHOUT_CARRY;
868b2b66 (kx 2024-12-20 16:11:07 +0300 693)
868b2b66 (kx 2024-12-20 16:11:07 +0300 694) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 695)
868b2b66 (kx 2024-12-20 16:11:07 +0300 696) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 697) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 698) y = b + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 699) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 700) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 701) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 702) y = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 703) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 704) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 705)
868b2b66 (kx 2024-12-20 16:11:07 +0300 706) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 707) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 708) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 709) while( i < np - 1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 710) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 711) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 712) rc = (EMULONG) (*x) +
868b2b66 (kx 2024-12-20 16:11:07 +0300 713) (EMULONG) (*y) + __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 714) if( rc & MASK_CARRY ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 715) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 716) c[i] = (EMUSHORT) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 717) if( c[i] ) zero |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 718)
868b2b66 (kx 2024-12-20 16:11:07 +0300 719) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 720) --x; --y; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 721) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 722) ++x; ++y; ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 723) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 724) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 725)
868b2b66 (kx 2024-12-20 16:11:07 +0300 726) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 727)
868b2b66 (kx 2024-12-20 16:11:07 +0300 728) /* set Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 729) rc = (EMULONG) (*x) +
868b2b66 (kx 2024-12-20 16:11:07 +0300 730) (EMULONG) (*y) + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 731) if( rc & MASK_CARRY ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 732) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 733)
868b2b66 (kx 2024-12-20 16:11:07 +0300 734) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 735) op1 = (EMULONG) (*x);
868b2b66 (kx 2024-12-20 16:11:07 +0300 736) op2 = (EMULONG) (*y);
868b2b66 (kx 2024-12-20 16:11:07 +0300 737) if( op1 & MASK_SIGN ) op1 |= MASK_CARRY;
868b2b66 (kx 2024-12-20 16:11:07 +0300 738) if( op2 & MASK_SIGN ) op2 |= MASK_CARRY;
868b2b66 (kx 2024-12-20 16:11:07 +0300 739)
868b2b66 (kx 2024-12-20 16:11:07 +0300 740) rc = op1 + op2 + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 741) if( rc & MASK_CARRY ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 742) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 743) if( rc & MASK_SIGN ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 744)
868b2b66 (kx 2024-12-20 16:11:07 +0300 745) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 746) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 747) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 748)
868b2b66 (kx 2024-12-20 16:11:07 +0300 749) c[i] = (EMUSHORT) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 750) if( c[i] ) zero |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 751) zero ^= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 752)
868b2b66 (kx 2024-12-20 16:11:07 +0300 753) if( zero ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 754) else __CLZ; /* clear zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 755) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 756)
868b2b66 (kx 2024-12-20 16:11:07 +0300 757) /* вычитание знаковое и беззнаковое целых всех размеров */
868b2b66 (kx 2024-12-20 16:11:07 +0300 758) void isub_np( EMUSHORT *c, EMUSHORT *a, EMUSHORT *b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 759) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 760) EMULONG rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 761) EMUSHORT *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 762) signed int carry, sign = 0, zero = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 763) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 764)
868b2b66 (kx 2024-12-20 16:11:07 +0300 765) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 766) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 767) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 768) __integer_invalid_size( (__mpu_char8_t *)"isub_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 769) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 770) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 771)
868b2b66 (kx 2024-12-20 16:11:07 +0300 772) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 773)
868b2b66 (kx 2024-12-20 16:11:07 +0300 774) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 775)
868b2b66 (kx 2024-12-20 16:11:07 +0300 776) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 777) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 778) y = b + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 779) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 780) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 781) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 782) y = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 783) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 784) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 785)
868b2b66 (kx 2024-12-20 16:11:07 +0300 786) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 787) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 788) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 789) while( i < np - 1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 790) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 791) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 792) rc = (EMULONG) (*x) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 793) (EMULONG) (*y) - __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 794) if( rc & MASK_CARRY ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 795) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 796) c[i] = (EMUSHORT) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 797) if( c[i] ) zero |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 798)
868b2b66 (kx 2024-12-20 16:11:07 +0300 799) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 800) --x; --y; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 801) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 802) ++x; ++y; ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 803) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 804) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 805)
868b2b66 (kx 2024-12-20 16:11:07 +0300 806) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 807)
868b2b66 (kx 2024-12-20 16:11:07 +0300 808) /* set Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 809) rc = (EMULONG) (*x) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 810) (EMULONG) (*y) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 811) if( rc & MASK_CARRY ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 812) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 813)
868b2b66 (kx 2024-12-20 16:11:07 +0300 814) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 815) op1 = (EMULONG) (*x);
868b2b66 (kx 2024-12-20 16:11:07 +0300 816) op2 = (EMULONG) (*y);
868b2b66 (kx 2024-12-20 16:11:07 +0300 817) if( op1 & MASK_SIGN ) op1 |= MASK_CARRY;
868b2b66 (kx 2024-12-20 16:11:07 +0300 818) if( op2 & MASK_SIGN ) op2 |= MASK_CARRY;
868b2b66 (kx 2024-12-20 16:11:07 +0300 819)
868b2b66 (kx 2024-12-20 16:11:07 +0300 820) rc = op1 + op2 + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 821) if( rc & MASK_CARRY ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 822) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 823) if( rc & MASK_SIGN ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 824)
868b2b66 (kx 2024-12-20 16:11:07 +0300 825) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 826) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 827) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 828)
868b2b66 (kx 2024-12-20 16:11:07 +0300 829) c[i] = (EMUSHORT) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 830) if( c[i] ) zero |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 831) zero ^= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 832)
868b2b66 (kx 2024-12-20 16:11:07 +0300 833) if( zero ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 834) else __CLZ; /* clear zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 835) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 836)
868b2b66 (kx 2024-12-20 16:11:07 +0300 837) /* вычитание знаковое и беззнаковое целых всех размеров с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 838) void isbb_np( EMUSHORT *c, EMUSHORT *a, EMUSHORT *b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 839) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 840) EMULONG rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 841) EMUSHORT *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 842) signed int carry, sign = 0, zero = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 843) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 844)
868b2b66 (kx 2024-12-20 16:11:07 +0300 845) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 846) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 847) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 848) __integer_invalid_size( (__mpu_char8_t *)"isbb_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 849) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 850) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 851)
868b2b66 (kx 2024-12-20 16:11:07 +0300 852) __CLEAR_IFLAGS_WITHOUT_CARRY;
868b2b66 (kx 2024-12-20 16:11:07 +0300 853)
868b2b66 (kx 2024-12-20 16:11:07 +0300 854) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 855)
868b2b66 (kx 2024-12-20 16:11:07 +0300 856) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 857) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 858) y = b + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 859) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 860) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 861) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 862) y = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 863) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 864) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 865)
868b2b66 (kx 2024-12-20 16:11:07 +0300 866) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 867) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 868) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 869) while( i < np - 1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 870) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 871) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 872) rc = (EMULONG) (*x) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 873) (EMULONG) (*y) - __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 874) if( rc & MASK_CARRY ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 875) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 876) c[i] = (EMUSHORT) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 877) if( c[i] ) zero |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 878)
868b2b66 (kx 2024-12-20 16:11:07 +0300 879) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 880) --x; --y; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 881) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 882) ++x; ++y; ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 883) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 884) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 885)
868b2b66 (kx 2024-12-20 16:11:07 +0300 886) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 887)
868b2b66 (kx 2024-12-20 16:11:07 +0300 888) /* set Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 889) rc = (EMULONG) (*x) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 890) (EMULONG) (*y) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 891) if( rc & MASK_CARRY ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 892) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 893)
868b2b66 (kx 2024-12-20 16:11:07 +0300 894) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 895) op1 = (EMULONG) (*x);
868b2b66 (kx 2024-12-20 16:11:07 +0300 896) op2 = (EMULONG) (*y);
868b2b66 (kx 2024-12-20 16:11:07 +0300 897) if( op1 & MASK_SIGN ) op1 |= MASK_CARRY;
868b2b66 (kx 2024-12-20 16:11:07 +0300 898) if( op2 & MASK_SIGN ) op2 |= MASK_CARRY;
868b2b66 (kx 2024-12-20 16:11:07 +0300 899)
868b2b66 (kx 2024-12-20 16:11:07 +0300 900) rc = op1 + op2 + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 901) if( rc & MASK_CARRY ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 902) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 903) if( rc & MASK_SIGN ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 904)
868b2b66 (kx 2024-12-20 16:11:07 +0300 905) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 906) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 907) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 908)
868b2b66 (kx 2024-12-20 16:11:07 +0300 909) c[i] = (EMUSHORT) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 910) if( c[i] ) zero |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 911) zero ^= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 912)
868b2b66 (kx 2024-12-20 16:11:07 +0300 913) if( zero ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 914) else __CLZ; /* clear zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 915) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 916)
868b2b66 (kx 2024-12-20 16:11:07 +0300 917)
868b2b66 (kx 2024-12-20 16:11:07 +0300 918) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 919) Операции сдвигов на 1 бит.
868b2b66 (kx 2024-12-20 16:11:07 +0300 920) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 921)
868b2b66 (kx 2024-12-20 16:11:07 +0300 922) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 923) 8-bit operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 924) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 925) /* Логический беззнаковый сдвиг одного байта влево на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 926) void ishl_8( __mpu_uint8_t *c, __mpu_uint8_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 927) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 928) __mpu_uint8_t *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 929) signed int carry = 0, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 930)
868b2b66 (kx 2024-12-20 16:11:07 +0300 931) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 932)
868b2b66 (kx 2024-12-20 16:11:07 +0300 933) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 934) if( *x & 0x80 ) { carry = 1; __STC; } /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 935)
868b2b66 (kx 2024-12-20 16:11:07 +0300 936) *c = (*x) << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 937) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 938)
868b2b66 (kx 2024-12-20 16:11:07 +0300 939) if( *c & 0x80 ) { sign = 1; __STS; } /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 940)
868b2b66 (kx 2024-12-20 16:11:07 +0300 941) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 942)
868b2b66 (kx 2024-12-20 16:11:07 +0300 943) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 944) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 945)
868b2b66 (kx 2024-12-20 16:11:07 +0300 946) /* Логический беззнаковый сдвиг одного байта вправо на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 947) void ishr_8( __mpu_uint8_t *c, __mpu_uint8_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 948) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 949) __mpu_uint8_t *x, save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 950)
868b2b66 (kx 2024-12-20 16:11:07 +0300 951) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 952)
868b2b66 (kx 2024-12-20 16:11:07 +0300 953) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 954) save_sign = *x & 0x80; /* save sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 955) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 956)
868b2b66 (kx 2024-12-20 16:11:07 +0300 957) if( *x & 1 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 958)
868b2b66 (kx 2024-12-20 16:11:07 +0300 959) *c = (*x) >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 960) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 961) if( *c & 0x80 ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 962)
868b2b66 (kx 2024-12-20 16:11:07 +0300 963) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 964) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 965)
868b2b66 (kx 2024-12-20 16:11:07 +0300 966) /* Арифметический сдвиг одного байта влево на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 967) void isal_8( __mpu_uint8_t *c, __mpu_uint8_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 968) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 969) __mpu_uint8_t *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 970) signed int carry = 0, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 971)
868b2b66 (kx 2024-12-20 16:11:07 +0300 972) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 973)
868b2b66 (kx 2024-12-20 16:11:07 +0300 974) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 975) if( *x & 0x80 ) { carry = 1; __STC; } /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 976)
868b2b66 (kx 2024-12-20 16:11:07 +0300 977) *c = (*x) << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 978) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 979)
868b2b66 (kx 2024-12-20 16:11:07 +0300 980) if( *c & 0x80 ) { sign = 1; __STS; } /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 981)
868b2b66 (kx 2024-12-20 16:11:07 +0300 982) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 983)
868b2b66 (kx 2024-12-20 16:11:07 +0300 984) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 985) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 986)
868b2b66 (kx 2024-12-20 16:11:07 +0300 987) /* Арифметический сдвиг одного байта вправо на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 988) void isar_8( __mpu_uint8_t *c, __mpu_uint8_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 989) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 990) __mpu_uint8_t *x, save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 991)
868b2b66 (kx 2024-12-20 16:11:07 +0300 992) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 993)
868b2b66 (kx 2024-12-20 16:11:07 +0300 994) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 995) save_sign = *x & 0x80; /* save sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 996) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 997)
868b2b66 (kx 2024-12-20 16:11:07 +0300 998) if( *x & 1 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 999)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1000) *c = (*x) >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1001) *c |= save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1002)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1003) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1004) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1005) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1006)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1007) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1008) 16-bit operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1009) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1010) /* Логический беззнаковый сдвиг двух байтов влево на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1011) void ishl_16( __mpu_uint16_t *c, __mpu_uint16_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1012) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1013) __mpu_uint16_t *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1014) signed int carry = 0, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1015)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1016) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1017)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1018) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1019) if( *x & 0x8000 ) { carry = 1; __STC; } /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1020)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1021) *c = (*x) << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1022) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1023)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1024) if( *c & 0x8000 ) { sign = 1; __STS; } /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1025)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1026) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1027)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1028) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1029) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1030)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1031) /* Логический беззнаковый сдвиг двух байтов вправо на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1032) void ishr_16( __mpu_uint16_t *c, __mpu_uint16_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1033) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1034) __mpu_uint16_t *x, save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1035)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1036) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1037)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1038) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1039) save_sign = *x & 0x8000; /* save sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1040) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1041)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1042) if( *x & 1 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1043)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1044) *c = (*x) >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1045) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1046) if( *c & 0x8000 ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1047)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1048) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1049) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1050)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1051) /* Арифметический сдвиг двух байтов влево на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1052) void isal_16( __mpu_uint16_t *c, __mpu_uint16_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1053) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1054) __mpu_uint16_t *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1055) signed int carry = 0, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1056)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1057) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1058)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1059) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1060) if( *x & 0x8000 ) { carry = 1; __STC; } /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1061)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1062) *c = (*x) << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1063) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1064)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1065) if( *c & 0x8000 ) { sign = 1; __STS; } /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1066)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1067) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1068)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1069) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1070) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1071)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1072) /* Арифметический сдвиг двух байтов вправо на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1073) void isar_16( __mpu_uint16_t *c, __mpu_uint16_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1074) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1075) __mpu_uint16_t *x, save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1076)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1077) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1078)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1079) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1080) save_sign = *x & 0x8000; /* save sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1081) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1082)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1083) if( *x & 1 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1084)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1085) *c = (*x) >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1086) *c |= save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1087)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1088) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1089) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1090) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1091)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1092) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1093) 32-bit operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1094) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1095) /* Логический беззнаковый сдвиг четырех байтов влево на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1096) void ishl_32( __mpu_uint32_t *c, __mpu_uint32_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1097) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1098) __mpu_uint32_t *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1099) signed int carry = 0, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1100)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1101) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1102)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1103) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1104) if( *x & 0x80000000 ) { carry = 1; __STC; } /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1105)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1106) *c = (*x) << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1107) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1108)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1109) if( *c & 0x80000000 ) { sign = 1; __STS; } /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1110)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1111) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1112)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1113) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1114) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1115)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1116) /* Логический беззнаковый сдвиг четырех байтов вправо на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1117) void ishr_32( __mpu_uint32_t *c, __mpu_uint32_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1118) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1119) __mpu_uint32_t *x, save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1120)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1121) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1122)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1123) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1124) save_sign = *x & 0x80000000; /* save sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1125) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1126)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1127) if( *x & 1 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1128)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1129) *c = (*x) >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1130) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1131) if( *c & 0x80000000 ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1132)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1133) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1134) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1135)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1136) /* Арифметический сдвиг четырех байтов влево на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1137) void isal_32( __mpu_uint32_t *c, __mpu_uint32_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1138) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1139) __mpu_uint32_t *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1140) signed int carry = 0, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1141)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1142) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1143)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1144) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1145) if( *x & 0x80000000 ) { carry = 1; __STC; } /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1146)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1147) *c = (*x) << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1148) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1149)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1150) if( *c & 0x80000000 ) { sign = 1; __STS; } /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1151)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1152) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1153)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1154) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1155) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1156)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1157) /* Арифметический сдвиг четырех байтов вправо на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1158) void isar_32( __mpu_uint32_t *c, __mpu_uint32_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1159) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1160) __mpu_uint32_t *x, save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1161)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1162) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1163)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1164) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1165) save_sign = *x & 0x80000000; /* save sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1166) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1167)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1168) if( *x & 1 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1169)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1170) *c = (*x) >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1171) *c |= save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1172)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1173) if( *c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1174) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1175) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1176)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1177) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1178) EMUSHORT (32-bit) operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1179) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1180) /* Логический беззнаковый сдвиг влево на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1181) void ishl_np( EMUSHORT *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1182) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1183) EMUSHORT *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1184) signed int carry, sign, zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1185) signed int i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1186)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1187) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1188) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1189) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1190) __integer_invalid_size( (__mpu_char8_t *)"ishl_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1191) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1192) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1193)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1194) __CLEAR_IFLAGS_WITHOUT_CARRY;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1195)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1196) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1197) x = a + np - 1; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1198) y = c + np - 1; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1199) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1200) x = a; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1201) y = c; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1202) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1203)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1204) carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1205)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1206) while( i < np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1207) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1208) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1209) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1210)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1211) if( *x & MASK_SIGN ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1212) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1213)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1214) *y = (*x) << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1215) *y |= __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1216)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1217) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1218) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1219)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1220) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1221) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1222) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1223) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1224) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1225) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1226) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1227)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1228) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1229) if( carry ) { __STC; } else { __CLC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1230)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1231) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1232) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1233) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1234) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1235) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1236) if( *y & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1237)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1238) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1239)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1240) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1241) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1242)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1243) /* Логический беззнаковый сдвиг вправо на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1244) void ishr_np( EMUSHORT *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1245) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1246) EMUSHORT *x, *y, save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1247) signed int carry, zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1248) signed int i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1249)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1250) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1251) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1252) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1253) __integer_invalid_size( (__mpu_char8_t *)"ishr_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1254) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1255) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1256)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1257) __CLEAR_IFLAGS_WITHOUT_CARRY;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1258)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1259) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1260) x = a; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1261) y = c; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1262) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1263) x = a + np - 1; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1264) y = c + np - 1; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1265) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1266)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1267) carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1268)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1269) save_sign = *x & MASK_SIGN; /* save sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1270) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1271)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1272) while( i < np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1273) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1274) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1275) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1276)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1277) if( *x & 1 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1278) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1279)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1280) *y = (*x) >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1281) if( __MFLAG(CF) ) *y |= MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1282)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1283) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1284) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1285)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1286) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1287) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1288) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1289) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1290) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1291) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1292) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1293)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1294) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1295) if( carry ) { __STC; } else { __CLC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1296) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1297)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1298) /* Арифметический сдвиг влево на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1299) void isal_np( EMUSHORT *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1300) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1301) EMUSHORT *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1302) signed int carry, sign, zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1303) signed int i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1304)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1305) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1306) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1307) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1308) __integer_invalid_size( (__mpu_char8_t *)"isal_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1309) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1310) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1311)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1312) __CLEAR_IFLAGS_WITHOUT_CARRY;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1313)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1314) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1315) x = a + np - 1; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1316) y = c + np - 1; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1317) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1318) x = a; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1319) y = c; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1320) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1321)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1322) carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1323)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1324) while( i < np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1325) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1326) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1327) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1328)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1329) if( *x & MASK_SIGN ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1330) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1331)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1332) *y = (*x) << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1333) *y |= __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1334)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1335) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1336) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1337)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1338) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1339) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1340) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1341) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1342) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1343) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1344) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1345)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1346) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1347) if( carry ) { __STC; } else { __CLC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1348)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1349) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1350) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1351) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1352) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1353) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1354) if( *y & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1355)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1356) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1357)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1358) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1359) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1360)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1361) /* Арифметический сдвиг вправо на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1362) void isar_np( EMUSHORT *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1363) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1364) EMUSHORT *x, *y, save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1365) signed int carry, zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1366) signed int i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1367)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1368) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1369) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1370) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1371) __integer_invalid_size( (__mpu_char8_t *)"isar_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1372) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1373) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1374)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1375) __CLEAR_IFLAGS_WITHOUT_CARRY;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1376)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1377) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1378) x = a; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1379) y = c; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1380) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1381) x = a + np - 1; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1382) y = c + np - 1; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1383) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1384)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1385) carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1386)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1387) save_sign = *x & MASK_SIGN; /* save sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1388) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1389)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1390) while( i < np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1391) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1392) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1393) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1394)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1395) if( *x & 1 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1396) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1397)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1398) *y = (*x) >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1399) if( __MFLAG(CF) ) *y |= MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1400)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1401) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1402) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1403)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1404) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1405) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1406) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1407) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1408) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1409) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1410) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1411)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1412) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1413) if( carry ) { __STC; } else { __CLC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1414)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1415) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1416) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1417) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1418) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1419) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1420) if( save_sign ) { *y |= save_sign; __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1421) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1422)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1423)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1424) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1425) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1426) Операции iRCL... не изменяют флаг PF сохраняя его значение,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1427) полученное после предыдущей операции. Флаг PF определяется
868b2b66 (kx 2024-12-20 16:11:07 +0300 1428) только для 8- и 16-битовых операций.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1429)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1430) Операции iRCR... не изменяют флаг SF сохраняя его значение,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1431) полученное после предыдущей операции.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1432)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1433) Обе операции (iRCL... и iRCR...) выставляют флаг ZF по AND
868b2b66 (kx 2024-12-20 16:11:07 +0300 1434) с предыдущим значением:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1435)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1436) newZF1 = newZF0 & lastZF,
868b2b66 (kx 2024-12-20 16:11:07 +0300 1437)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1438) где
868b2b66 (kx 2024-12-20 16:11:07 +0300 1439)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1440) & - oперация И (AND);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1441) newZF1 - результирующий;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1442) newZF0 - полученный в ходе операции над данным числом;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1443) lastZF - бывший до проведения операции.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1444)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1445) Данный способ вычисления значений флагов ZF, PF, SF
868b2b66 (kx 2024-12-20 16:11:07 +0300 1446) позволяет наиболее просто проводить сдвиги нескольких
868b2b66 (kx 2024-12-20 16:11:07 +0300 1447) операндов как единого целогою
868b2b66 (kx 2024-12-20 16:11:07 +0300 1448) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1449)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1450) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1451) Операции циклических сдвигов на 1 бит.
868b2b66 (kx 2024-12-20 16:11:07 +0300 1452) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 1453) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1454) 8-bit operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1455) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1456) /* Циклический сдвиг одного байта влево на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1457) void irol_8( __mpu_uint8_t *c, __mpu_uint8_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1458) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1459) __mpu_uint8_t *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1460) signed int carry = 0, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1461)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1462) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1463)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1464) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1465) if( *x & 0x80 ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1466)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1467) *c = (*x) << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1468) if( __MFLAG(CF) ) { *c |= 1; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1469)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1470) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1471)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1472) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1473) if( *c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1474)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1475) if( __MFLAG(SF) ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1476) if( __MFLAG(CF) ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1477)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1478) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1479) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1480)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1481) /* Циклический сдвиг одного байта вправо на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1482) void iror_8( __mpu_uint8_t *c, __mpu_uint8_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1483) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1484) __mpu_uint8_t *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1485) signed int sign = 0, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1486)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1487) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1488)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1489) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1490) if( *x & 0x80 ) save_sign = 1; /* save sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1491)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1492) if( *x & 1 ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1493)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1494) *c = (*x) >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1495) if( __MFLAG(CF) ) { *c |= 0x80; __STS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1496)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1497) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1498)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1499) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1500)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1501) if( __MFLAG(SF) ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1502)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1503) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1504) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1505)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1506) /* Циклический сдвиг одного байта влево на один бит с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1507) void ircl_8( __mpu_uint8_t *c, __mpu_uint8_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1508) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1509) __mpu_uint8_t *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1510) signed int carry = 0, sign = 0, zero = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1511)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1512) /* Оставляем CF, PF, ZF; остальные сбрасываем: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1513) __CLA; __CLO; __CLS; __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1514)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1515) zero = __MFLAG(ZF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1516)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1517) x = a; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1518) if( *x & 0x80 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1519)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1520) *c = (*x) << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1521) if( __MFLAG(CF) ) *c |= 0x01;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1522) if( *c ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1523) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1524)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1525) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1526) if( carry ) { __STC; } else { __CLC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1527)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1528) if( *c & 0x80 ) { sign = 1; __STS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1529)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1530) /* Не определяем parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1531)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1532) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1533) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1534)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1535) /* Циклический сдвиг одного байта вправо на один бит с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1536) void ircr_8( __mpu_uint8_t *c, __mpu_uint8_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1537) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1538) __mpu_uint8_t *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1539) signed int carry = 0, sign = 0, zero = 0, save_carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1540)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1541) /* Оставляем CF, SF, ZF; остальные сбрасываем: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1542) __CLA; __CLO; __CLP; __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1543)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1544) zero = __MFLAG(ZF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1545)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1546) x = a; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1547) if( *x & 0x80 ) sign = 1; /* save sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1548) if( __MFLAG(CF) ) save_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1549)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1550) if( *x & 1 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1551)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1552) *c = (*x) >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1553) if( save_carry ) *c |= 0x80;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1554) if( *c ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1555) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1556)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1557) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1558) if( carry ) { __STC; } else { __CLC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1559)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1560) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1561)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1562) /* Не определяем sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1563)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1564) if( (!save_carry && sign) || (save_carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1565) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1566)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1567) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1568) 16-bit operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1569) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1570) /* Циклический сдвиг двух байтов влево на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1571) void irol_16( __mpu_uint16_t *c, __mpu_uint16_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1572) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1573) __mpu_uint16_t *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1574) signed int carry = 0, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1575)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1576) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1577)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1578) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1579) if( *x & 0x8000 ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1580)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1581) *c = (*x) << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1582) if( __MFLAG(CF) ) { *c |= 1; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1583)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1584) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1585)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1586) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1587) if( *c & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1588)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1589) if( __MFLAG(SF) ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1590) if( __MFLAG(CF) ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1591)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1592) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1593) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1594)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1595) /* Циклический сдвиг двух байтов вправо на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1596) void iror_16( __mpu_uint16_t *c, __mpu_uint16_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1597) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1598) __mpu_uint16_t *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1599) signed int sign = 0, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1600)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1601) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1602)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1603) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1604) if( *x & 0x8000 ) save_sign = 1; /* save sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1605)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1606) if( *x & 1 ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1607)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1608) *c = (*x) >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1609) if( __MFLAG(CF) ) { *c |= 0x8000; __STS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1610)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1611) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1612)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1613) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1614)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1615) if( __MFLAG(SF) ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1616)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1617) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1618) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1619)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1620) /* Циклический сдвиг двух байтов влево на один бит с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1621) void ircl_16( __mpu_uint16_t *c, __mpu_uint16_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1622) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1623) __mpu_uint16_t *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1624) signed int carry = 0, sign = 0, zero = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1625)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1626) /* Оставляем CF, PF, ZF; остальные сбрасываем: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1627) __CLA; __CLO; __CLS; __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1628)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1629) zero = __MFLAG(ZF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1630)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1631) x = a; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1632) if( *x & 0x8000 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1633)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1634) *c = (*x) << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1635) if( __MFLAG(CF) ) *c |= 0x0001;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1636) if( *c ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1637) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1638)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1639) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1640) if( carry ) { __STC; } else { __CLC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1641)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1642) if( *c & 0x8000 ) { sign = 1; __STS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1643)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1644) /* Не определяем parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1645)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1646) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1647) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1648)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1649) /* Циклический сдвиг двух байтов вправо на один бит с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1650) void ircr_16( __mpu_uint16_t *c, __mpu_uint16_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1651) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1652) __mpu_uint16_t *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1653) signed int carry = 0, sign = 0, zero = 0, save_carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1654)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1655) /* Оставляем CF, SF, ZF; остальные сбрасываем: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1656) __CLA; __CLO; __CLP; __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1657)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1658) zero = __MFLAG(ZF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1659)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1660) x = a; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1661) if( *x & 0x8000 ) sign = 1; /* save sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1662) if( __MFLAG(CF) ) save_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1663)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1664) if( *x & 1 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1665)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1666) *c = (*x) >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1667) if( save_carry ) *c |= 0x8000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1668) if( *c ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1669) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1670)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1671) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1672) if( carry ) { __STC; } else { __CLC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1673)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1674) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1675)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1676) /* Не определяем sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1677)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1678) if( (!save_carry && sign) || (save_carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1679) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1680)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1681) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1682) 32-bit operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1683) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1684) /* Циклический сдвиг четырех байтов влево на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1685) void irol_32( __mpu_uint32_t *c, __mpu_uint32_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1686) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1687) __mpu_uint32_t *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1688) signed int carry = 0, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1689)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1690) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1691)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1692) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1693) if( *x & 0x80000000 ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1694)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1695) *c = (*x) << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1696) if( __MFLAG(CF) ) { *c |= 1; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1697)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1698) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1699)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1700) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1701) if( *c & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1702)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1703) if( __MFLAG(SF) ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1704) if( __MFLAG(CF) ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1705)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1706) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1707) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1708)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1709) /* Циклический сдвиг четырех байтов вправо на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1710) void iror_32( __mpu_uint32_t *c, __mpu_uint32_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1711) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1712) __mpu_uint32_t *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1713) signed int sign = 0, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1714)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1715) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1716)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1717) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1718) if( *x & 0x80000000 ) save_sign = 1; /* save sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1719)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1720) if( *x & 1 ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1721)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1722) *c = (*x) >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1723) if( __MFLAG(CF) ) { *c |= 0x80000000; __STS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1724)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1725) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1726)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1727) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1728)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1729) if( __MFLAG(SF) ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1730)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1731) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1732) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1733)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1734) /* Циклический сдвиг четырех байтов влево на один бит с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1735) void ircl_32( __mpu_uint32_t *c, __mpu_uint32_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1736) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1737) __mpu_uint32_t *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1738) signed int carry = 0, sign = 0, zero = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1739)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1740) /* Оставляем CF, PF, ZF; остальные сбрасываем: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1741) __CLA; __CLO; __CLS; __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1742)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1743) zero = __MFLAG(ZF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1744)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1745) x = a; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1746) if( *x & 0x80000000 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1747)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1748) *c = (*x) << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1749) if( __MFLAG(CF) ) *c |= 0x00000001;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1750) if( *c ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1751) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1752)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1753) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1754) if( carry ) { __STC; } else { __CLC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1755)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1756) if( *c & 0x80000000 ) { sign = 1; __STS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1757)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1758) /* Не определяем parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1759)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1760) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1761) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1762)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1763) /* Циклический сдвиг четырех байтов вправо на один бит с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1764) void ircr_32( __mpu_uint32_t *c, __mpu_uint32_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1765) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1766) __mpu_uint32_t *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1767) signed int carry = 0, sign = 0, zero = 0, save_carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1768)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1769) /* Оставляем CF, SF, ZF; остальные сбрасываем: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1770) __CLA; __CLO; __CLP; __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1771)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1772) zero = __MFLAG(ZF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1773)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1774) x = a; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1775) if( *x & 0x80000000 ) sign = 1; /* save sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1776) if( __MFLAG(CF) ) save_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1777)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1778) if( *x & 1 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1779)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1780) *c = (*x) >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1781) if( save_carry ) *c |= 0x80000000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1782) if( *c ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1783) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1784)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1785) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1786) if( carry ) { __STC; } else { __CLC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1787)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1788) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1789)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1790) /* Не определяем sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1791)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1792) if( (!save_carry && sign) || (save_carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1793) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1794)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1795) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 1796) EMUSHORT (32-bit) operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 1797) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1798) /* Циклический сдвиг влево на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1799) void irol_np( EMUSHORT *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1800) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1801) EMUSHORT *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1802) signed int carry, sign = 0, zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1803) signed int i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1804)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1805) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1806) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1807) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1808) __integer_invalid_size( (__mpu_char8_t *)"irol_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1809) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1810) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1811)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1812) __CLEAR_IFLAGS_WITHOUT_CARRY;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1813)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1814) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1815) x = a + np - 1; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1816) y = c + np - 1; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1817) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1818) x = a; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1819) y = c; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1820) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1821)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1822) carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1823)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1824) while( i < np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1825) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1826) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1827) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1828)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1829) if( *x & MASK_SIGN ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1830) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1831)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1832) *y = (*x) << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1833) *y |= __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1834)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1835) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1836) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1837)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1838) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1839) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1840) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1841) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1842) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1843) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1844) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1845)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1846) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1847) if( carry ) { __STC; } else { __CLC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1848)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1849) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1850) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1851) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1852) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1853) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1854) if( *y & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1855)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1856) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1857) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1858) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1859) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1860) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1861) if( carry ) { *y |= 1; __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1862)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1863) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1864)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1865) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1866) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1867)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1868) /* Циклический сдвиг вправо на один бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1869) void iror_np( EMUSHORT *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1870) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1871) EMUSHORT *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1872) signed int carry, zero = 1, sign = 0, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1873) signed int i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1874)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1875) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1876) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1877) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1878) __integer_invalid_size( (__mpu_char8_t *)"iror_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1879) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1880) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1881)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1882) __CLEAR_IFLAGS_WITHOUT_CARRY;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1883)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1884) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1885) x = a; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1886) y = c; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1887) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1888) x = a + np - 1; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1889) y = c + np - 1; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1890) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1891)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1892) carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1893)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1894) if( *x & MASK_SIGN ) save_sign = 1; /* save sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1895)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1896) while( i < np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1897) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1898) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1899) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1900)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1901) if( *x & 1 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1902) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1903)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1904) *y = (*x) >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1905) if( __MFLAG(CF) ) *y |= MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1906)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1907) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1908) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1909)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1910) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1911) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1912) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1913) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1914) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1915) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1916) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1917)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1918) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1919) if( carry ) { __STC; } else { __CLC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1920)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1921) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1922) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1923) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1924) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1925) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1926) if( carry ) { *y |= MASK_SIGN; __STS; __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1927)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1928) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1929)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1930) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1931) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1932)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1933) /* Циклический сдвиг влево на один бит с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1934) void ircl_np( EMUSHORT *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1935) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1936) EMUSHORT *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1937) signed int carry = 0, sign = 0, zero = 1, save_zero = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1938) signed int i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1939)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1940) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1941) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1942) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1943) __integer_invalid_size( (__mpu_char8_t *)"ircl_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 1944) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1945) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1946)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1947) /* Оставляем CF, PF, ZF; остальные сбрасываем: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1948) __CLA; __CLO; __CLS; __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1949)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1950) save_zero = __MFLAG(ZF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1951)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1952) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1953) x = a + np - 1; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1954) y = c + np - 1; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1955) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1956) x = a; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1957) y = c; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1958) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1959)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1960) carry = __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1961)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1962) while( i < np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 1963) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 1964) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1965) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1966)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1967) if( *x & MASK_SIGN ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1968) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1969)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1970) *y = (*x) << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1971) *y |= __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 1972)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1973) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1974) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1975)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1976) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1977) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1978) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1979) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1980) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1981) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1982) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1983) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1984) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1985)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1986) save_zero &= zero;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1987)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1988) if( save_zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1989) if( carry ) { __STC; } else { __CLC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 1990)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1991) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 1992) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1993) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 1994) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1995) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 1996) if( *y & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 1997)
868b2b66 (kx 2024-12-20 16:11:07 +0300 1998) /* Не определяем parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 1999)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2000) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2001)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2002) if( (!carry && sign) || (carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2003) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2004)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2005) /* Циклический сдвиг вправо на один бит с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2006) void ircr_np( EMUSHORT *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2007) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2008) EMUSHORT *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2009) signed int carry, sign = 0, zero = 1, save_zero = 0, save_carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2010) signed int i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2011)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2012) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2013) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2014) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2015) __integer_invalid_size( (__mpu_char8_t *)"ircr_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2016) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2017) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2018)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2019) /* Оставляем CF, SF, ZF; остальные сбрасываем: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2020) __CLA; __CLO; __CLP; __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2021)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2022) save_zero = __MFLAG(ZF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2023)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2024) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2025) x = a; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2026) y = c; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2027) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2028) x = a + np - 1; /* operand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2029) y = c + np - 1; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2030) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2031)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2032) carry = __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2033)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2034) if( *x & MASK_SIGN ) sign = 1; /* save sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2035) if( carry ) save_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2036)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2037) while( i < np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2038) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2039) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2040) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2041)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2042) if( *x & 1 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2043) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2044)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2045) *y = (*x) >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2046) if( __MFLAG(CF) ) *y |= MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2047)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2048) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2049) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2050)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2051) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2052) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2053) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2054) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2055) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2056) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2057) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2058)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2059) save_zero &= zero;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2060)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2061) if( save_zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2062) if( carry ) { __STC; } else { __CLC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2063)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2064) /* Не определяем sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2065)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2066) if( (!save_carry && sign) || (save_carry && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2067) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2068)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2069)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2070) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 2071) POW_EMUSHORT (imply that the EMUSHORT size is 32 bits)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2072) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2073) static EMUSHORT _POW_EMUSHORT( __mpu_int32_t x, __mpu_int32_t y )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2074) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2075) __mpu_int32_t z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2076) __mpu_int32_t n = y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2077)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2078) if( y < 0 ) n = -n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2079)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2080) for( z = 1; ; x *= x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2081) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2082) if( (n & 1) != 0 ) z *= x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2083) if( (n >>= 1) == 0 ) return( y < 0 ? (EMUSHORT)(1/z) : (EMUSHORT)z );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2084) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2085) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2086)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2087) #define N_PARTS(b) ((b)>>POW2)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2088) #define N_BITS(b) ((b)&(BITS_PER_EMUSHORT-1))
868b2b66 (kx 2024-12-20 16:11:07 +0300 2089)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2090) #define MASK_LEAST_BITS(b) (_POW_EMUSHORT(2,(b))-1)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2091) #define MASK_HIGEST_BITS(b) (~(_POW_EMUSHORT(2,(b))-1))
868b2b66 (kx 2024-12-20 16:11:07 +0300 2092)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2093)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2094) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 2095) Операции сдвигов на (b) бит.
868b2b66 (kx 2024-12-20 16:11:07 +0300 2096) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 2097)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2098) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 2099) 8-bit operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2100) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2101) /* Логический сдвиг одного байта влево на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2102) void ishln_8( __mpu_uint8_t *c, __mpu_uint8_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2103) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2104) signed int carry, sign, save_carry = 0, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2105)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2106) if( b > BITS_PER_BYTE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2107) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2108) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2109) __integer_invalid_shift( (__mpu_char8_t *)"ishln_8" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2110) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2111) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2112)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2113) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2114)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2115) if( *a & 0x80 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2116) if( *a & 1 ) save_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2117)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2118) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2119)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2120) if( b == 0 || b == BITS_PER_BYTE ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2121) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2122) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2123) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2124)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2125) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2126) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2127)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2128) if( b == BITS_PER_BYTE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2129) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2130) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2131)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2132) if( save_carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2133)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2134) __STZ; __CLS; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2135)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2136) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2137) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2138)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2139) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2140)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2141) } /* End if( b == 0 || b == BITS_PER_BYTE ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2142)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2143) carry = (*c >> ((BITS_PER_BYTE-b)&(BITS_PER_BYTE-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2144) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2145) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2146)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2147) *c = *c << b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2148)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2149) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2150) if( *c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2151)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2152) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2153)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2154) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2155)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2156) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2157) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2158)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2159) /* Логический сдвиг одного байта вправо на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2160) void ishrn_8( __mpu_uint8_t *c, __mpu_uint8_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2161) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2162) signed int carry, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2163)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2164) if( b > BITS_PER_BYTE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2165) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2166) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2167) __integer_invalid_shift( (__mpu_char8_t *)"ishrn_8" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2168) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2169) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2170)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2171) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2172)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2173) if( *a & 0x80 ) save_sign = 1; /* save_sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2174)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2175) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2176)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2177) if( b == 0 || b == BITS_PER_BYTE ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2178) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2179) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2180) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2181)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2182) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2183) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2184)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2185) if( b == BITS_PER_BYTE ) /* обнуляем c */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2186) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2187) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2188)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2189) if( save_sign ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2190)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2191) __STZ; __CLS; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2192)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2193) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2194) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2195)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2196) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2197)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2198) } /* End if( b == 0 || b == BITS_PER_BYTE ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2199)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2200) carry = (*c >> ((b-1)&(BITS_PER_BYTE-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2201) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2202) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2203)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2204) *c = *c >> b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2205)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2206) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2207) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2208)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2209) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2210) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2211)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2212) /* Арифметический сдвиг одного байта влево на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2213) void isaln_8( __mpu_uint8_t *c, __mpu_uint8_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2214) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2215) signed int carry, sign, save_carry = 0, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2216)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2217) if( b > BITS_PER_BYTE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2218) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2219) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2220) __integer_invalid_shift( (__mpu_char8_t *)"isaln_8" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2221) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2222) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2223)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2224) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2225)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2226) if( *a & 0x80 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2227) if( *a & 1 ) save_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2228)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2229) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2230)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2231) if( b == 0 || b == BITS_PER_BYTE ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2232) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2233) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2234) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2235)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2236) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2237) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2238)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2239) if( b == BITS_PER_BYTE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2240) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2241) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2242)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2243) if( save_carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2244)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2245) __STZ; __CLS; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2246)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2247) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2248) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2249)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2250) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2251)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2252) } /* End if( b == 0 || b == BITS_PER_BYTE ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2253)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2254)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2255) carry = (*c >> ((BITS_PER_BYTE-b)&(BITS_PER_BYTE-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2256) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2257) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2258)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2259) *c = *c << b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2260)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2261) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2262) if( *c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2263)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2264) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2265)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2266) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2267)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2268) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2269) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2270)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2271) /* Арифметический сдвиг одного байта вправо на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2272) void isarn_8( __mpu_uint8_t *c, __mpu_uint8_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2273) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2274) __mpu_uint8_t save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2275) signed int carry, sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2276)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2277) if( b > BITS_PER_BYTE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2278) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2279) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2280) __integer_invalid_shift( (__mpu_char8_t *)"isarn_8" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2281) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2282) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2283)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2284) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2285)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2286) if( *a & 0x80 ) { save_sign = 0xff; __STS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2287) /* MASK_ALL_BITS == (-1) но при этом warning: convert type */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2288)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2289) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2290)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2291) if( b == 0 || b == BITS_PER_BYTE ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2292) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2293) /* SF = SF */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2294)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2295) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2296) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2297)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2298) if( b == BITS_PER_BYTE ) /* копируем знак c <= a */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2299) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2300) *c = save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2301)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2302) if( save_sign == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2303)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2304) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2305) if( sign ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2306) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2307)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2308) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2309) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2310)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2311) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2312)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2313) } /* End if( b == 0 || b == BITS_PER_BYTE ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2314)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2315) carry = (*c >> ((b-1)&(BITS_PER_BYTE-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2316) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2317) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2318)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2319) *c = *c >> b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2320)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2321) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2322) if( sign ) /* копируем знак */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2323) *c |= 0xff << (BITS_PER_BYTE-b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2324)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2325) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2326) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2327)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2328) /* SF (sign) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2329) /* OF (overflow) уже сброшен в 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2330) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2331)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2332)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2333) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 2334) 16-bit operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2335) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2336) #define BITS_PER_TWO_BYTES 16
868b2b66 (kx 2024-12-20 16:11:07 +0300 2337)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2338) /* Логический сдвиг двух байтов влево на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2339) void ishln_16( __mpu_uint16_t *c, __mpu_uint16_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2340) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2341) signed int carry, sign, save_carry = 0, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2342)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2343) if( b > BITS_PER_TWO_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2344) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2345) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2346) __integer_invalid_shift( (__mpu_char8_t *)"ishln_16" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2347) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2348) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2349)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2350) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2351)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2352) if( *a & 0x8000 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2353) if( *a & 1 ) save_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2354)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2355) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2356)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2357) if( b == 0 || b == BITS_PER_TWO_BYTES ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2358) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2359) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2360) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2361)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2362) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2363) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2364)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2365) if( b == BITS_PER_TWO_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2366) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2367) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2368)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2369) if( save_carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2370)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2371) __STZ; __CLS; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2372)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2373) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2374) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2375)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2376) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2377)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2378) } /* End if( b == 0 || b == BITS_PER_TWO_BYTES ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2379)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2380) carry = (*c >> ((BITS_PER_TWO_BYTES-b)&(BITS_PER_TWO_BYTES-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2381) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2382) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2383)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2384) *c = *c << b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2385)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2386) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2387) if( *c & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2388)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2389) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2390)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2391) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2392)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2393) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2394) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2395)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2396) /* Логический сдвиг двух байтов вправо на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2397) void ishrn_16( __mpu_uint16_t *c, __mpu_uint16_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2398) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2399) signed int carry, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2400)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2401) if( b > BITS_PER_TWO_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2402) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2403) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2404) __integer_invalid_shift( (__mpu_char8_t *)"ishrn_16" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2405) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2406) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2407)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2408) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2409)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2410) if( *a & 0x8000 ) save_sign = 1; /* save_sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2411)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2412) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2413)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2414) if( b == 0 || b == BITS_PER_TWO_BYTES ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2415) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2416) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2417) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2418)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2419) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2420) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2421)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2422) if( b == BITS_PER_TWO_BYTES ) /* обнуляем c */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2423) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2424) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2425)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2426) if( save_sign ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2427)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2428) __STZ; __CLS; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2429)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2430) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2431) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2432)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2433) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2434)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2435) } /* End if( b == 0 || b == BITS_PER_TWO_BYTES ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2436)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2437) carry = (*c >> ((b-1)&(BITS_PER_TWO_BYTES-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2438) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2439) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2440)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2441) *c = *c >> b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2442)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2443) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2444) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2445)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2446) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2447) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2448)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2449) /* Арифметический сдвиг двух байтов влево на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2450) void isaln_16( __mpu_uint16_t *c, __mpu_uint16_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2451) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2452) signed int carry, sign, save_carry = 0, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2453)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2454) if( b > BITS_PER_TWO_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2455) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2456) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2457) __integer_invalid_shift( (__mpu_char8_t *)"isaln_16" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2458) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2459) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2460)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2461) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2462)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2463) if( *a & 0x8000 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2464) if( *a & 1 ) save_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2465)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2466) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2467)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2468) if( b == 0 || b == BITS_PER_TWO_BYTES ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2469) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2470) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2471) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2472)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2473) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2474) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2475)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2476) if( b == BITS_PER_TWO_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2477) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2478) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2479)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2480) if( save_carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2481)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2482) __STZ; __CLS; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2483)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2484) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2485) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2486)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2487) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2488)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2489) } /* End if( b == 0 || b == BITS_PER_TWO_BYTES ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2490)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2491)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2492) carry = (*c >> ((BITS_PER_TWO_BYTES-b)&(BITS_PER_TWO_BYTES-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2493) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2494) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2495)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2496) *c = *c << b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2497)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2498) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2499) if( *c & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2500)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2501) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2502)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2503) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2504)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2505) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2506) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2507)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2508) /* Арифметический сдвиг двух байтов вправо на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2509) void isarn_16( __mpu_uint16_t *c, __mpu_uint16_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2510) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2511) __mpu_uint16_t save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2512) signed int carry, sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2513)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2514) if( b > BITS_PER_TWO_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2515) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2516) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2517) __integer_invalid_shift( (__mpu_char8_t *)"isarn_16" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2518) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2519) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2520)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2521) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2522)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2523) if( *a & 0x8000 ) { save_sign = 0xffff; __STS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2524) /* MASK_ALL_BITS == (-1) но при этом warning: convert type */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2525)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2526) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2527)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2528) if( b == 0 || b == BITS_PER_TWO_BYTES ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2529) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2530) /* SF = SF */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2531)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2532) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2533) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2534)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2535) if( b == BITS_PER_TWO_BYTES ) /* копируем знак c <= a */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2536) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2537) *c = save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2538)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2539) if( save_sign == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2540)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2541) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2542) if( sign ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2543) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2544)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2545) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2546) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2547)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2548) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2549)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2550) } /* End if( b == 0 || b == BITS_PER_TWO_BYTES ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2551)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2552) carry = (*c >> ((b-1)&(BITS_PER_TWO_BYTES-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2553) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2554) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2555)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2556) *c = *c >> b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2557)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2558) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2559) if( sign ) /* копируем знак */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2560) *c |= 0xffff << (BITS_PER_TWO_BYTES-b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2561)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2562) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2563) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2564)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2565) /* SF (sign) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2566) /* OF (overflow) уже сброшен в 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2567) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2568)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2569) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 2570) 32-bit operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2571) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2572) #define BITS_PER_FOUR_BYTES 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 2573)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2574) /* Логический сдвиг четырех байтов влево на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2575) void ishln_32( __mpu_uint32_t *c, __mpu_uint32_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2576) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2577) signed int carry, sign, save_carry = 0, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2578)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2579) if( b > BITS_PER_FOUR_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2580) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2581) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2582) __integer_invalid_shift( (__mpu_char8_t *)"ishln_32" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2583) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2584) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2585)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2586) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2587)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2588) if( *a & 0x80000000 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2589) if( *a & 1 ) save_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2590)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2591) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2592)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2593) if( b == 0 || b == BITS_PER_FOUR_BYTES ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2594) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2595) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2596) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2597)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2598) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2599) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2600)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2601) if( b == BITS_PER_FOUR_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2602) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2603) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2604)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2605) if( save_carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2606)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2607) __STZ; __CLS; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2608)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2609) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2610) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2611)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2612) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2613)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2614) } /* End if( b == 0 || b == BITS_PER_FOUR_BYTES ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2615)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2616) carry = (*c >> ((BITS_PER_FOUR_BYTES-b)&(BITS_PER_FOUR_BYTES-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2617) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2618) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2619)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2620) *c = *c << b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2621)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2622) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2623) if( *c & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2624)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2625) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2626)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2627) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2628)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2629) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2630) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2631)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2632) /* Логический сдвиг четырех байтов вправо на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2633) void ishrn_32( __mpu_uint32_t *c, __mpu_uint32_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2634) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2635) signed int carry, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2636)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2637) if( b > BITS_PER_FOUR_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2638) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2639) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2640) __integer_invalid_shift( (__mpu_char8_t *)"ishrn_32" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2641) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2642) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2643)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2644) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2645)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2646) if( *a & 0x80000000 ) save_sign = 1; /* save_sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2647)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2648) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2649)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2650) if( b == 0 || b == BITS_PER_FOUR_BYTES ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2651) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2652) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2653) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2654)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2655) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2656) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2657)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2658) if( b == BITS_PER_FOUR_BYTES ) /* обнуляем c */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2659) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2660) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2661)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2662) if( save_sign ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2663)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2664) __STZ; __CLS; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2665)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2666) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2667) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2668)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2669) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2670)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2671) } /* End if( b == 0 || b == BITS_PER_FOUR_BYTES ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2672)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2673) carry = (*c >> ((b-1)&(BITS_PER_FOUR_BYTES-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2674) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2675) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2676)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2677) *c = *c >> b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2678)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2679) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2680) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2681)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2682) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2683) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2684)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2685) /* Арифметический сдвиг четырех байтов влево на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2686) void isaln_32( __mpu_uint32_t *c, __mpu_uint32_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2687) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2688) signed int carry, sign, save_carry = 0, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2689)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2690) if( b > BITS_PER_FOUR_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2691) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2692) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2693) __integer_invalid_shift( (__mpu_char8_t *)"isaln_32" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2694) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2695) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2696)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2697) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2698)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2699) if( *a & 0x80000000 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2700) if( *a & 1 ) save_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2701)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2702) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2703)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2704) if( b == 0 || b == BITS_PER_FOUR_BYTES ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2705) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2706) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2707) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2708)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2709) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2710) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2711)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2712) if( b == BITS_PER_FOUR_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2713) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2714) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2715)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2716) if( save_carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2717)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2718) __STZ; __CLS; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2719)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2720) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2721) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2722)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2723) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2724)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2725) } /* End if( b == 0 || b == BITS_PER_FOUR_BYTES ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2726)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2727)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2728) carry = (*c >> ((BITS_PER_FOUR_BYTES-b)&(BITS_PER_FOUR_BYTES-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2729) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2730) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2731)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2732) *c = *c << b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2733)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2734) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2735) if( *c & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2736)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2737) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2738)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2739) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2740)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2741) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2742) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2743)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2744) /* Арифметический сдвиг четырех байтов вправо на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2745) void isarn_32( __mpu_uint32_t *c, __mpu_uint32_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2746) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2747) __mpu_uint32_t save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2748) signed int carry, sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2749)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2750) if( b > BITS_PER_FOUR_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2751) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2752) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2753) __integer_invalid_shift( (__mpu_char8_t *)"isarn_32" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2754) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2755) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2756)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2757) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2758)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2759) if( *a & 0x80000000 ) { save_sign = 0xffffffff; __STS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2760) /* MASK_ALL_BITS == (-1) но при этом warning: convert type */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2761)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2762) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2763)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2764) if( b == 0 || b == BITS_PER_FOUR_BYTES ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2765) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2766) /* SF = SF */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2767)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2768) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2769) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2770)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2771) if( b == BITS_PER_FOUR_BYTES ) /* копируем знак c <= a */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2772) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2773) *c = save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2774)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2775) if( save_sign == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2776)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2777) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2778) if( sign ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2779) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2780)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2781) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2782) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2783)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2784) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2785)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2786) } /* End if( b == 0 || b == BITS_PER_FOUR_BYTES ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2787)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2788) carry = (*c >> ((b-1)&(BITS_PER_FOUR_BYTES-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2789) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2790) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2791)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2792) *c = *c >> b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2793)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2794) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2795) if( sign ) /* копируем знак */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2796) *c |= 0xffffffff << (BITS_PER_FOUR_BYTES-b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2797)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2798) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2799) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2800)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2801) /* SF (sign) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2802) /* OF (overflow) уже сброшен в 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2803) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2804)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2805) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 2806) EMUSHORT (32-bit) operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 2807) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2808) /* Логический сдвиг влево на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2809) void ishln_np( EMUSHORT *c, EMUSHORT *a, unsigned int b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2810) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2811) EMUSHORT *x, *y, tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2812) signed int carry, save_carry = 0, sign, save_sign = 0, zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2813) signed int i, n_parts, n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2814)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2815) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2816) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2817) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2818) __integer_invalid_size( (__mpu_char8_t *)"ishln_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2819) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2820) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2821)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2822) if( b > BITS_PER_EMUSHORT * np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2823) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2824) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2825) __integer_invalid_shift( (__mpu_char8_t *)"ishln_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 2826) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2827) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2828)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2829) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2830)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2831) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2832) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2833) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2834) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2835) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2836) if( *x & 1 ) save_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2837)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2838) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2839) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2840) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2841) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2842) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2843) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2844) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2845)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2846) if( *x & MASK_SIGN ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2847)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2848) n_parts = N_PARTS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2849)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2850) if( b == 0 || n_parts == np ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2851) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2852) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2853) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2854)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2855) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2856) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2857) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2858) *y = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2859)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2860) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2861) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2862)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2863) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2864) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2865) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2866) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2867) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2868) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2869) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2870) if( zero ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2871)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2872) if( n_parts == np ) /* обнуляем c */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2873) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2874) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2875)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2876) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2877) while( i > 0 ) { *y = 0; ++y; --i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2878)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2879) if( save_carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2880)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2881) __STZ; __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2882)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2883) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2884) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2885)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2886) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2887)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2888) } /* End if( b == 0 || n_parts == np ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2889)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2890) n_bits = N_BITS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2891)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2892) if( n_parts == 0 ) /* переписываем c <= a, т.к. n_bits уже != 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2893) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2894) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2895) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2896)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2897) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2898) while( i > 0 ) { *y = *x; ++x; ++y; --i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2899) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2900)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2901) if( n_parts )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2902) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2903) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2904) x = a + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2905) y = c + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2906) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2907) x = a + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2908) y = c + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2909) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2910)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2911) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2912) if( *(x - 1) & 1 ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2913) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2914) if( *(x + 1) & 1 ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2915) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2916)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2917) i = np - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2918) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2919) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2920) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2921) *(y - n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2922) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2923) *(y + n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2924) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2925)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2926) if( *x ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2927) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2928)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2929) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2930) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2931) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2932) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2933) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2934) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2935) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2936)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2937) i = n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2938) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2939) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2940) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2941) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2942) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2943) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2944) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2945) *y = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2946)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2947) zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2948)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2949) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2950) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 2951)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2952) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2953) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2954) /* CF (carry) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2955)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2956) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2957) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2958) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2959) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2960) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2961) if( *y & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2962)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2963) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2964)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2965) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2966)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2967) } /* End if( n_parts ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 2968)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2969) if( n_bits )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2970) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2971) zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2972)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2973) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2974) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2975) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2976) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2977) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2978)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2979) carry = BIT(y,(BITS_PER_EMUSHORT-n_bits));
868b2b66 (kx 2024-12-20 16:11:07 +0300 2980) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2981) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2982)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2983) *y = *y << n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2984) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2985) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2986) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 2987) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2988) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 2989)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2990) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2991) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 2992) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 2993) tmp = *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2994) *y = *y << n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 2995)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2996) tmp = tmp >> (BITS_PER_EMUSHORT-n_bits);
868b2b66 (kx 2024-12-20 16:11:07 +0300 2997)
868b2b66 (kx 2024-12-20 16:11:07 +0300 2998) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 2999) *(y - 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3000) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3001) *(y + 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3002) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3003)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3004) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3005) if( *(y - 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3006) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3007) if( *(y + 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3008) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3009) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3010)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3011) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3012) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3013) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3014) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3015) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3016) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3017) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3018)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3019) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3020) if( *(y - 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3021) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3022) if( *(y + 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3023) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3024) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3025)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3026) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3027) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3028) /* CF (carry) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3029)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3030) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3031) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3032) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3033) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3034) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3035) if( *y & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3036) else __CLS; /* т.к. м.б. изменения */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3037)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3038) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3039)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3040) if( (!save_sign && sign) || (save_sign && !sign) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3041) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3042)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3043) } /* End if( n_bits ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3044)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3045) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3046)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3047) /* Логический сдвиг вправо на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3048) void ishrn_np( EMUSHORT *c, EMUSHORT *a, unsigned int b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3049) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3050) EMUSHORT *x, *y, tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3051) signed int carry, save_sign = 0, zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3052) signed int i, n_parts, n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3053)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3054) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3055) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3056) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3057) __integer_invalid_size( (__mpu_char8_t *)"ishrn_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3058) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3059) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3060)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3061) if( b > BITS_PER_EMUSHORT * np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3062) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3063) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3064) __integer_invalid_shift( (__mpu_char8_t *)"ishrn_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3065) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3066) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3067)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3068) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3069)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3070) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3071) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3072) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3073) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3074) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3075) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3076) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3077)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3078) if( *x & MASK_SIGN ) save_sign = 1; /* save_sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3079)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3080) n_parts = N_PARTS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3081)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3082) if( b == 0 || n_parts == np ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3083) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3084) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3085) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3086)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3087) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3088) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3089) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3090) *y = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3091)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3092) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3093) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3094)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3095) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3096) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3097) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3098) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3099) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3100) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3101) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3102) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3103)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3104) if( n_parts == np ) /* обнуляем c */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3105) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3106) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3107)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3108) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3109) while( i > 0 ) { *y = 0; ++y; --i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3110)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3111) if( save_sign ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3112)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3113) __STZ; __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3114)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3115) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3116) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3117)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3118) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3119)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3120) } /* End if( b == 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3121)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3122) n_bits = N_BITS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3123)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3124) if( n_parts == 0 ) /* переписываем c <= a, т.к. n_bits уже != 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3125) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3126) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3127) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3128)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3129) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3130) while( i > 0 ) { *y = *x; ++x; ++y; --i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3131) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3132)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3133) if( n_parts )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3134) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3135) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3136) x = a + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3137) y = c + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3138) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3139) x = a + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3140) y = c + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3141) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3142)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3143) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3144) if( *(x + 1) & MASK_SIGN ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3145) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3146) if( *(x - 1) & MASK_SIGN ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3147) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3148)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3149) i = np - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3150) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3151) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3152) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3153) *(y + n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3154) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3155) *(y - n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3156) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3157)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3158) if( *x ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3159) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3160)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3161) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3162) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3163) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3164) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3165) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3166) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3167) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3168)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3169) i = n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3170) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3171) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3172) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3173) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3174) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3175) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3176) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3177) *y = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3178)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3179) zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3180)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3181) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3182) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3183)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3184) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3185) /* CF (carry) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3186)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3187) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3188)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3189) } /* End if( n_parts ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3190)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3191) if( n_bits )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3192) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3193) zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3194)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3195) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3196) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3197) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3198) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3199) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3200)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3201) carry = BIT(y,(n_bits-1));
868b2b66 (kx 2024-12-20 16:11:07 +0300 3202) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3203) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3204)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3205) *y = *y >> n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3206) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3207) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3208) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3209) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3210) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3211)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3212) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3213) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3214) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3215) tmp = *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3216) *y = *y >> n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3217)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3218) tmp = tmp << (BITS_PER_EMUSHORT-n_bits);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3219)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3220) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3221) *(y + 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3222) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3223) *(y - 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3224) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3225)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3226) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3227) if( *(y + 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3228) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3229) if( *(y - 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3230) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3231) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3232)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3233) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3234) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3235) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3236) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3237) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3238) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3239) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3240)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3241) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3242) if( *(y + 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3243) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3244) if( *(y - 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3245) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3246) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3247)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3248) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3249) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3250) /* CF (carry) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3251)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3252) if( save_sign ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3253) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3254)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3255) } /* End if( n_bits ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3256)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3257) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3258)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3259) /* Арифметический сдвиг влево на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3260) void isaln_np( EMUSHORT *c, EMUSHORT *a, unsigned int b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3261) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3262) EMUSHORT *x, *y, tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3263) signed int carry, sign, save_carry = 0, save_sign = 0, zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3264) signed int i, n_parts, n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3265)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3266) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3267) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3268) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3269) __integer_invalid_size( (__mpu_char8_t *)"isaln_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3270) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3271) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3272)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3273) if( b > BITS_PER_EMUSHORT * np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3274) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3275) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3276) __integer_invalid_shift( (__mpu_char8_t *)"isaln_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3277) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3278) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3279)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3280) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3281)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3282) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3283) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3284) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3285) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3286) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3287) if( *x & 1 ) save_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3288)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3289) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3290) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3291) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3292) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3293) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3294) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3295) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3296)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3297) if( *x & MASK_SIGN ) save_sign = 1; /* save_sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3298)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3299) n_parts = N_PARTS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3300)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3301) if( b == 0 || n_parts == np ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3302) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3303) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3304) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3305)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3306) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3307) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3308) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3309) *y = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3310)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3311) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3312) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3313)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3314) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3315) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3316) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3317) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3318) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3319) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3320) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3321) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3322)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3323) if( n_parts == np ) /* обнуляем c */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3324) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3325) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3326)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3327) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3328) while( i > 0 ) { *y = 0; ++y; --i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3329)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3330) if( save_carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3331)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3332) __STZ; __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3333)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3334) if( save_sign ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3335) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3336)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3337) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3338)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3339) } /* End if( b == 0 || n_parts == np ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3340)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3341) n_bits = N_BITS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3342)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3343) if( n_parts == 0 ) /* переписываем c <= a, т.к. n_bits уже != 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3344) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3345) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3346) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3347)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3348) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3349) while( i > 0 ) { *y = *x; ++x; ++y; --i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3350) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3351)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3352) if( n_parts )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3353) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3354) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3355) x = a + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3356) y = c + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3357) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3358) x = a + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3359) y = c + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3360) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3361)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3362) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3363) if( *(x - 1) & 1 ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3364) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3365) if( *(x + 1) & 1 ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3366) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3367)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3368) i = np - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3369) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3370) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3371) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3372) *(y - n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3373) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3374) *(y + n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3375) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3376)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3377) if( *x ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3378) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3379)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3380) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3381) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3382) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3383) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3384) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3385) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3386) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3387)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3388) i = n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3389) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3390) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3391) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3392) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3393) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3394) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3395) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3396) *y = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3397)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3398) zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3399)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3400) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3401) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3402)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3403) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3404) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3405) /* CF (carry) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3406)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3407) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3408) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3409) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3410) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3411) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3412) if( *y & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3413)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3414) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3415)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3416) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3417)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3418) } /* End if( n_parts ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3419)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3420) if( n_bits )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3421) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3422) zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3423)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3424) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3425) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3426) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3427) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3428) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3429)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3430) carry = BIT(y,(BITS_PER_EMUSHORT-n_bits));
868b2b66 (kx 2024-12-20 16:11:07 +0300 3431) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3432) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3433)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3434) *y = *y << n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3435) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3436) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3437) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3438) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3439) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3440)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3441) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3442) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3443) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3444) tmp = *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3445) *y = *y << n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3446)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3447) tmp = tmp >> (BITS_PER_EMUSHORT-n_bits);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3448)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3449) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3450) *(y - 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3451) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3452) *(y + 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3453) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3454)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3455) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3456) if( *(y - 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3457) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3458) if( *(y + 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3459) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3460) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3461)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3462) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3463) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3464) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3465) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3466) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3467) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3468) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3469)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3470) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3471) if( *(y - 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3472) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3473) if( *(y + 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3474) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3475) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3476)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3477) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3478) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3479) /* CF (carry) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3480)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3481) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3482) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3483) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3484) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3485) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3486) if( *y & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3487) else __CLS; /* т.к. м.б. изменения */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3488)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3489) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3490)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3491) if( (!save_sign && sign) || (save_sign && !sign) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3492) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3493)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3494) } /* End if( n_bits ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3495)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3496) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3497)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3498) /* Арифметический сдвиг вправо на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3499) void isarn_np( EMUSHORT *c, EMUSHORT *a, unsigned int b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3500) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3501) EMUSHORT *x, *y, tmp, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3502) signed int carry, sign, zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3503) signed int i, n_parts, n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3504)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3505) if( np == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3506) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3507) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3508) __integer_invalid_size( (__mpu_char8_t *)"isarn_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3509) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3510) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3511)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3512) if( b > BITS_PER_EMUSHORT * np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3513) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3514) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3515) __integer_invalid_shift( (__mpu_char8_t *)"isarn_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3516) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3517) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3518)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3519) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3520)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3521) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3522) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3523) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3524) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3525) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3526) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3527) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3528)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3529) if( *x & MASK_SIGN ) { save_sign = MASK_ALL_BITS; __STS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3530) /* MASK_ALL_BITS == (-1) но при этом warning: convert type */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3531)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3532) n_parts = N_PARTS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3533)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3534) if( b == 0 || n_parts == np ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3535) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3536) /* SF = SF */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3537)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3538) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3539) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3540) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3541) *y = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3542)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3543) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3544) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3545)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3546) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3547) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3548) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3549) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3550) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3551) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3552) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3553) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3554)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3555) if( n_parts == np ) /* копируем знак c <= a */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3556) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3557) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3558)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3559) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3560) while( i > 0 ) { *y = save_sign; ++y; --i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3561)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3562) if( save_sign == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3563)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3564) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3565) if( sign ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3566) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3567) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3568)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3569) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3570)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3571) } /* End if( b == 0 || n_parts == np ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3572)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3573) n_bits = N_BITS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3574)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3575) if( n_parts == 0 ) /* переписываем c <= a, т.к. n_bits уже != 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3576) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3577) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3578) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3579)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3580) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3581) while( i > 0 ) { *y = *x; ++x; ++y; --i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3582) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3583)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3584) if( n_parts )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3585) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3586) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3587) x = a + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3588) y = c + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3589) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3590) x = a + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3591) y = c + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3592) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3593)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3594) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3595) if( *(x + 1) & MASK_SIGN ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3596) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3597) if( *(x - 1) & MASK_SIGN ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3598) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3599)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3600) i = np - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3601) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3602) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3603) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3604) *(y + n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3605) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3606) *(y - n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3607) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3608)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3609) if( *x ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3610) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3611)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3612) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3613) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3614) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3615) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3616) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3617) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3618) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3619)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3620) i = n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3621) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3622) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3623) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3624) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3625) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3626) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3627) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3628) *y = save_sign; /* копируем знак */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3629)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3630) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3631) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3632)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3633) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3634) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3635)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3636) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3637) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3638) /* CF (carry) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3639) /* SF (sign) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3640) /* OF (overflow) уже сброшен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3641)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3642) } /* End if( n_parts ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3643)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3644) if( n_bits )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3645) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3646) zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3647)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3648) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3649) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3650) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3651) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3652) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3653)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3654) carry = BIT(y,(n_bits-1));
868b2b66 (kx 2024-12-20 16:11:07 +0300 3655) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3656) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3657)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3658) *y = *y >> n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3659) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3660) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3661) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3662) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3663) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3664)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3665) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3666) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3667) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3668) tmp = *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3669) *y = *y >> n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3670)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3671) tmp = tmp << (BITS_PER_EMUSHORT-n_bits);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3672)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3673) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3674) *(y + 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3675) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3676) *(y - 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3677) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3678)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3679) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3680) if( *(y + 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3681) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3682) if( *(y - 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3683) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3684) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3685)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3686) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3687) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3688) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3689) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3690) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3691) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3692) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3693)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3694) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 3695) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3696) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 3697) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3698) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 3699) if( __MFLAG(SF) ) /* копируем знак */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3700) *y |= MASK_HIGEST_BITS((EMUSHORT)(BITS_PER_EMUSHORT-n_bits));
868b2b66 (kx 2024-12-20 16:11:07 +0300 3701)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3702) if( *(y) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3703) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3704)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3705) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3706) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3707) /* CF (carry) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3708) /* SF (sign) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3709) /* OF (overflow) уже сброшен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3710)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3711) } /* End if( n_bits ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3712)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3713) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3714)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3715)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3716) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3717) Операции циклических сдвигов на (b) бит.
868b2b66 (kx 2024-12-20 16:11:07 +0300 3718) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3719)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3720) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 3721) 8-bit operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 3722) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3723) /* Циклический сдвиг одного байта влево на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3724) void iroln_8( __mpu_uint8_t *c, __mpu_uint8_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3725) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3726) __mpu_uint8_t tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3727) signed int carry, sign, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3728)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3729) if( b > BITS_PER_BYTE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3730) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3731) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3732) __integer_invalid_shift( (__mpu_char8_t *)"iroln_8" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3733) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3734) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3735)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3736) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3737)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3738) if( *a & 0x80 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3739)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3740) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3741)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3742) if( b == 0 || b == BITS_PER_BYTE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3743) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3744) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3745) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3746)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3747) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3748) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3749)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3750) if( b == BITS_PER_BYTE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3751) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3752) if( *c & 1 ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3753) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3754)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3755) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3756)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3757) } /* End if( b == 0 || b == BITS_PER_BYTE ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3758)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3759)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3760) carry = (*c >> ((BITS_PER_BYTE-b)&(BITS_PER_BYTE-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3761) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3762) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3763)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3764) tmp = *c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3765) *c = *c << b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3766)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3767) tmp = tmp >> (BITS_PER_BYTE-b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3768) *c |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3769)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3770) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3771)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3772) if( *c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3773) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3774)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3775) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3776)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3777) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3778) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3779)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3780) /* Циклический сдвиг одного байта вправо на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3781) void irorn_8( __mpu_uint8_t *c, __mpu_uint8_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3782) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3783) __mpu_uint8_t tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3784) signed int carry, sign, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3785)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3786) if( b > BITS_PER_BYTE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3787) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3788) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3789) __integer_invalid_shift( (__mpu_char8_t *)"irorn_8" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3790) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3791) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3792)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3793) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3794)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3795) if( *a & 0x80 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3796)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3797) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3798)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3799) if( b == 0 || b == BITS_PER_BYTE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3800) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3801) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3802) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3803)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3804) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3805) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3806)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3807) if( b == BITS_PER_BYTE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3808) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3809) if( save_sign ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3810) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3811) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3812)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3813) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3814)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3815) } /* End if( b == 0 || b == BITS_PER_BYTE ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3816)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3817)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3818) carry = (*c >> ((b-1)&(BITS_PER_BYTE-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3819) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3820) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3821)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3822) tmp = *c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3823) *c = *c >> b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3824)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3825) tmp = tmp << (BITS_PER_BYTE-b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3826) *c |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3827)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3828) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3829)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3830) if( *c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3831) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3832)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3833) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3834)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3835) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3836) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3837)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3838) /* Циклический сдвиг одного байта влево на (b) бит с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3839) void ircln_8( __mpu_uint8_t *c, __mpu_uint8_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3840) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3841) __mpu_uint8_t tmp, save_carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3842) signed int carry, sign, save_sign = 0, zero = 0, save_parity;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3843)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3844) if( b > BITS_PER_BYTE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3845) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3846) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3847) __integer_invalid_shift( (__mpu_char8_t *)"ircln_8" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3848) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3849) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3850)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3851) /* Оставляем CF, PF, ZF; остальные сбрасываем: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3852) __CLA; __CLO; __CLS; __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3853)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3854) zero = __MFLAG(ZF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3855)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3856) if( *a & 0x80 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3857) if( __MFLAG(CF) ) save_carry = 0x80;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3858)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3859) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3860)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3861) if( b == 0 || b == BITS_PER_BYTE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3862) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3863) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3864) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3865)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3866) if( *c == 0 ) zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3867) else zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3868) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3869)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3870) /* Если сдвиг на все, то не трогаем CF (carry) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3871) if( b != BITS_PER_BYTE ) __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3872) if( b == BITS_PER_BYTE ) /* сдвиг на все */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3873) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3874) save_parity = __MFLAG(PF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3875) ishr_8( c, c ); /* set CF */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3876) if( save_parity ) { __STP; } else { __CLP; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3877)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3878) if( save_carry )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3879) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3880) *c |= save_carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3881)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3882) __CLZ; __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3883)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3884) if( !save_sign ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3885) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3886) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3887) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3888)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3889) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3890)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3891) } /* End if( b == 0 || b == BITS_PER_BYTE ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3892)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3893) carry = (*c >> ((BITS_PER_BYTE-b)&(BITS_PER_BYTE-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3894) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3895) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3896)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3897) tmp = *c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3898) *c = *c << b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3899)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3900) tmp = tmp >> (BITS_PER_BYTE-b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3901)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3902) tmp = tmp >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3903) if( save_carry ) /* SET_BIT( &tmp, b-1 ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3904) tmp |= ((__mpu_uint8_t)1 << ((b-1)&(BITS_PER_BYTE-1)));
868b2b66 (kx 2024-12-20 16:11:07 +0300 3905)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3906) *c |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3907)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3908) if( *c ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3909) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3910) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3911)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3912) if( *c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3913) /* PF (parity) не определяем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3914)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3915) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3916)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3917) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3918) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3919)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3920) /* Циклический сдвиг одного байта вправо на (b) бит с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3921) void ircrn_8( __mpu_uint8_t *c, __mpu_uint8_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3922) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3923) __mpu_uint8_t tmp, save_carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3924) signed int carry = 0, sign = 0, zero = 0, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3925)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3926) if( b > BITS_PER_BYTE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3927) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3928) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3929) __integer_invalid_shift( (__mpu_char8_t *)"ircrn_8" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 3930) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3931) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3932)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3933) /* Оставляем CF, SF, ZF; остальные сбрасываем: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3934) __CLA; __CLO; __CLP; __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3935)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3936) zero = __MFLAG(ZF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3937)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3938) if( *a & 0x80 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3939) if( __MFLAG(CF) ) save_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3940)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3941) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3942)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3943) if( b == 0 || b == BITS_PER_BYTE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3944) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3945) if( *c ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3946) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3947) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3948)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3949) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3950)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3951) /* Если сдвиг на все, то не трогаем CF (carry) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3952) if( b != BITS_PER_BYTE ) __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3953) if( b == BITS_PER_BYTE ) /* сдвиг на все */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3954) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3955) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3956) ishl_8( c, c ); /* set CF */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3957) if( sign ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3958) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3959) sign = 0; /* return previous value*/
868b2b66 (kx 2024-12-20 16:11:07 +0300 3960)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3961) if( save_carry )
868b2b66 (kx 2024-12-20 16:11:07 +0300 3962) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 3963) *c |= save_carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3964)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3965) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3966) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3967)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3968) if( *c & 0x80 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3969) if( (!save_sign && sign) || (save_sign && !sign) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3970) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3971) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3972) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3973)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3974) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3975)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3976) } /* End if( b == 0 || b == BITS_PER_BYTE ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3977)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3978) carry = (*c >> ((b-1)&(BITS_PER_BYTE-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3979) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3980) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3981)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3982) tmp = *c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3983) *c = *c >> b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3984)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3985) tmp = tmp << (BITS_PER_BYTE-b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 3986)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3987) tmp = tmp << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3988) if( save_carry ) /* SET_BIT( &tmp, BITS_PER_BYTE-b ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3989) tmp |= ((__mpu_uint8_t)1 << ((BITS_PER_BYTE-b)&(BITS_PER_BYTE-1)));
868b2b66 (kx 2024-12-20 16:11:07 +0300 3990)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3991) *c |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3992)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3993) if( *c ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3994) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3995) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 3996)
868b2b66 (kx 2024-12-20 16:11:07 +0300 3997) if( *c & 0x80 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 3998) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 3999)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4000) if( (!save_sign && sign) || (save_sign && !sign) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4001) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4002)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4003) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 4004) 16-bit operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 4005) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4006) /* Циклический сдвиг двух байтов влево на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4007) void iroln_16( __mpu_uint16_t *c, __mpu_uint16_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4008) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4009) __mpu_uint16_t tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4010) signed int carry, sign, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4011)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4012) if( b > BITS_PER_TWO_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4013) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4014) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4015) __integer_invalid_shift( (__mpu_char8_t *)"iroln_16" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4016) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4017) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4018)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4019) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4020)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4021) if( *a & 0x8000 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4022)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4023) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4024)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4025) if( b == 0 || b == BITS_PER_TWO_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4026) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4027) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4028) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4029)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4030) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4031) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4032)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4033) if( b == BITS_PER_TWO_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4034) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4035) if( *c & 1 ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4036) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4037)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4038) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4039)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4040) } /* End if( b == 0 || b == BITS_PER_TWO_BYTES ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4041)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4042)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4043) carry = (*c >> ((BITS_PER_TWO_BYTES-b)&(BITS_PER_TWO_BYTES-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4044) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4045) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4046)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4047) tmp = *c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4048) *c = *c << b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4049)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4050) tmp = tmp >> (BITS_PER_TWO_BYTES-b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4051) *c |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4052)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4053) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4054)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4055) if( *c & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4056) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4057)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4058) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4059)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4060) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4061) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4062)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4063) /* Циклический сдвиг двух байтов вправо на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4064) void irorn_16( __mpu_uint16_t *c, __mpu_uint16_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4065) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4066) __mpu_uint16_t tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4067) signed int carry, sign, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4068)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4069) if( b > BITS_PER_TWO_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4070) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4071) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4072) __integer_invalid_shift( (__mpu_char8_t *)"irorn_16" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4073) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4074) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4075)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4076) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4077)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4078) if( *a & 0x8000 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4079)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4080) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4081)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4082) if( b == 0 || b == BITS_PER_TWO_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4083) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4084) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4085) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4086)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4087) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4088) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4089)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4090) if( b == BITS_PER_TWO_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4091) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4092) if( save_sign ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4093) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4094) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4095)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4096) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4097)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4098) } /* End if( b == 0 || b == BITS_PER_TWO_BYTES ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4099)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4100)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4101) carry = (*c >> ((b-1)&(BITS_PER_TWO_BYTES-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4102) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4103) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4104)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4105) tmp = *c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4106) *c = *c >> b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4107)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4108) tmp = tmp << (BITS_PER_TWO_BYTES-b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4109) *c |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4110)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4111) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4112)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4113) if( *c & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4114) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4115)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4116) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4117)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4118) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4119) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4120)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4121) /* Циклический сдвиг двух байтов влево на (b) бит с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4122) void ircln_16( __mpu_uint16_t *c, __mpu_uint16_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4123) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4124) __mpu_uint16_t tmp, save_carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4125) signed int carry, sign, save_sign = 0, zero = 0, save_parity;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4126)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4127) if( b > BITS_PER_TWO_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4128) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4129) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4130) __integer_invalid_shift( (__mpu_char8_t *)"ircln_16" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4131) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4132) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4133)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4134) /* Оставляем CF, PF, ZF; остальные сбрасываем: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4135) __CLA; __CLO; __CLS; __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4136)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4137) zero = __MFLAG(ZF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4138)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4139) if( *a & 0x8000 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4140) if( __MFLAG(CF) ) save_carry = 0x8000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4141)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4142) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4143)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4144) if( b == 0 || b == BITS_PER_TWO_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4145) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4146) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4147) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4148)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4149) if( *c == 0 ) zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4150) else zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4151) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4152)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4153) /* Если сдвиг на все, то не трогаем CF (carry) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4154) if( b != BITS_PER_TWO_BYTES ) __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4155) if( b == BITS_PER_TWO_BYTES ) /* сдвиг на все */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4156) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4157) save_parity = __MFLAG(PF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4158) ishr_16( c, c ); /* set CF */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4159) if( save_parity ) { __STP; } else { __CLP; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4160)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4161) if( save_carry )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4162) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4163) *c |= save_carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4164)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4165) __CLZ; __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4166)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4167) if( !save_sign ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4168) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4169) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4170) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4171)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4172) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4173)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4174) } /* End if( b == 0 || b == BITS_PER_TWO_BYTES ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4175)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4176) carry = (*c >> ((BITS_PER_TWO_BYTES-b)&(BITS_PER_TWO_BYTES-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4177) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4178) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4179)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4180) tmp = *c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4181) *c = *c << b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4182)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4183) tmp = tmp >> (BITS_PER_TWO_BYTES-b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4184)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4185) tmp = tmp >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4186) if( save_carry ) /* SET_BIT( &tmp, b-1 ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4187) tmp |= ((__mpu_uint16_t)1 << ((b-1)&(BITS_PER_TWO_BYTES-1)));
868b2b66 (kx 2024-12-20 16:11:07 +0300 4188)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4189) *c |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4190)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4191) if( *c ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4192) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4193) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4194)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4195) if( *c & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4196) /* PF (parity) не определяем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4197)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4198) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4199)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4200) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4201) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4202)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4203) /* Циклический сдвиг двух байтов вправо на (b) бит с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4204) void ircrn_16( __mpu_uint16_t *c, __mpu_uint16_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4205) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4206) __mpu_uint16_t tmp, save_carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4207) signed int carry = 0, sign = 0, zero = 0, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4208)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4209) if( b > BITS_PER_TWO_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4210) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4211) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4212) __integer_invalid_shift( (__mpu_char8_t *)"ircrn_16" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4213) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4214) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4215)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4216) /* Оставляем CF, SF, ZF; остальные сбрасываем: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4217) __CLA; __CLO; __CLP; __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4218)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4219) zero = __MFLAG(ZF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4220)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4221) if( *a & 0x8000 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4222) if( __MFLAG(CF) ) save_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4223)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4224) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4225)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4226) if( b == 0 || b == BITS_PER_TWO_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4227) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4228) if( *c ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4229) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4230) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4231)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4232) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4233)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4234) /* Если сдвиг на все, то не трогаем CF (carry) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4235) if( b != BITS_PER_TWO_BYTES ) __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4236) if( b == BITS_PER_TWO_BYTES ) /* сдвиг на все */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4237) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4238) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4239) ishl_16( c, c ); /* set CF */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4240) if( sign ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4241) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4242) sign = 0; /* return previous value*/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4243)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4244) if( save_carry )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4245) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4246) *c |= save_carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4247)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4248) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4249) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4250)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4251) if( *c & 0x8000 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4252) if( (!save_sign && sign) || (save_sign && !sign) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4253) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4254) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4255) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4256)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4257) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4258)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4259) } /* End if( b == 0 || b == BITS_PER_TWO_BYTES ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4260)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4261) carry = (*c >> ((b-1)&(BITS_PER_TWO_BYTES-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4262) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4263) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4264)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4265) tmp = *c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4266) *c = *c >> b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4267)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4268) tmp = tmp << (BITS_PER_TWO_BYTES-b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4269)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4270) tmp = tmp << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4271) if( save_carry ) /* SET_BIT( &tmp, BITS_PER_TWO_BYTES-b ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4272) tmp |= ((__mpu_uint16_t)1 << ((BITS_PER_TWO_BYTES-b)&(BITS_PER_TWO_BYTES-1)));
868b2b66 (kx 2024-12-20 16:11:07 +0300 4273)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4274) *c |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4275)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4276) if( *c ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4277) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4278) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4279)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4280) if( *c & 0x8000 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4281) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4282)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4283) if( (!save_sign && sign) || (save_sign && !sign) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4284) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4285)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4286) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 4287) 32-bit operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 4288) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4289) /* Циклический сдвиг четырех байтов влево на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4290) void iroln_32( __mpu_uint32_t *c, __mpu_uint32_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4291) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4292) __mpu_uint32_t tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4293) signed int carry, sign, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4294)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4295) if( b > BITS_PER_FOUR_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4296) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4297) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4298) __integer_invalid_shift( (__mpu_char8_t *)"iroln_32" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4299) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4300) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4301)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4302) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4303)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4304) if( *a & 0x80000000 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4305)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4306) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4307)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4308) if( b == 0 || b == BITS_PER_FOUR_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4309) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4310) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4311) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4312)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4313) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4314) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4315)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4316) if( b == BITS_PER_FOUR_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4317) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4318) if( *c & 1 ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4319) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4320)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4321) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4322)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4323) } /* End if( b == 0 || b == BITS_PER_FOUR_BYTES ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4324)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4325)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4326) carry = (*c >> ((BITS_PER_FOUR_BYTES-b)&(BITS_PER_FOUR_BYTES-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4327) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4328) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4329)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4330) tmp = *c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4331) *c = *c << b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4332)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4333) tmp = tmp >> (BITS_PER_FOUR_BYTES-b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4334) *c |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4335)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4336) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4337)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4338) if( *c & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4339) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4340)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4341) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4342)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4343) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4344) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4345)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4346) /* Циклический сдвиг четырех байтов вправо на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4347) void irorn_32( __mpu_uint32_t *c, __mpu_uint32_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4348) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4349) __mpu_uint32_t tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4350) signed int carry, sign, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4351)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4352) if( b > BITS_PER_FOUR_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4353) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4354) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4355) __integer_invalid_shift( (__mpu_char8_t *)"irorn_32" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4356) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4357) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4358)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4359) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4360)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4361) if( *a & 0x80000000 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4362)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4363) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4364)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4365) if( b == 0 || b == BITS_PER_FOUR_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4366) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4367) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4368) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4369)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4370) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4371) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4372)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4373) if( b == BITS_PER_FOUR_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4374) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4375) if( save_sign ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4376) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4377) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4378)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4379) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4380)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4381) } /* End if( b == 0 || b == BITS_PER_FOUR_BYTES ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4382)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4383)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4384) carry = (*c >> ((b-1)&(BITS_PER_FOUR_BYTES-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4385) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4386) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4387)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4388) tmp = *c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4389) *c = *c >> b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4390)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4391) tmp = tmp << (BITS_PER_FOUR_BYTES-b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4392) *c |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4393)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4394) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4395)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4396) if( *c & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4397) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4398)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4399) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4400)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4401) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4402) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4403)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4404) /* Циклический сдвиг четырех байтов влево на (b) бит с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4405) void ircln_32( __mpu_uint32_t *c, __mpu_uint32_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4406) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4407) __mpu_uint32_t tmp, save_carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4408) signed int carry, sign, save_sign = 0, zero = 0, save_parity;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4409)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4410) if( b > BITS_PER_FOUR_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4411) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4412) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4413) __integer_invalid_shift( (__mpu_char8_t *)"ircln_32" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4414) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4415) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4416)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4417) /* Оставляем CF, PF, ZF; остальные сбрасываем: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4418) __CLA; __CLO; __CLS; __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4419)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4420) zero = __MFLAG(ZF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4421)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4422) if( *a & 0x80000000 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4423) if( __MFLAG(CF) ) save_carry = 0x80000000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4424)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4425) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4426)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4427) if( b == 0 || b == BITS_PER_FOUR_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4428) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4429) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4430) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4431)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4432) if( *c == 0 ) zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4433) else zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4434) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4435)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4436) /* Если сдвиг на все, то не трогаем CF (carry) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4437) if( b != BITS_PER_FOUR_BYTES ) __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4438) if( b == BITS_PER_FOUR_BYTES ) /* сдвиг на все */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4439) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4440) save_parity = __MFLAG(PF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4441) ishr_32( c, c ); /* set CF */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4442) if( save_parity ) { __STP; } else { __CLP; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4443)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4444) if( save_carry )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4445) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4446) *c |= save_carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4447)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4448) __CLZ; __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4449)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4450) if( !save_sign ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4451) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4452) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4453) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4454)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4455) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4456)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4457) } /* End if( b == 0 || b == BITS_PER_FOUR_BYTES ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4458)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4459) carry = (*c >> ((BITS_PER_FOUR_BYTES-b)&(BITS_PER_FOUR_BYTES-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4460) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4461) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4462)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4463) tmp = *c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4464) *c = *c << b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4465)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4466) tmp = tmp >> (BITS_PER_FOUR_BYTES-b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4467)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4468) tmp = tmp >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4469) if( save_carry ) /* SET_BIT( &tmp, b-1 ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4470) tmp |= ((__mpu_uint32_t)1 << ((b-1)&(BITS_PER_FOUR_BYTES-1)));
868b2b66 (kx 2024-12-20 16:11:07 +0300 4471)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4472) *c |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4473)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4474) if( *c ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4475) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4476) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4477)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4478) if( *c & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4479) /* PF (parity) не определяем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4480)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4481) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4482)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4483) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4484) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4485)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4486) /* Циклический сдвиг четырех байтов вправо на (b) бит с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4487) void ircrn_32( __mpu_uint32_t *c, __mpu_uint32_t *a, unsigned int b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4488) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4489) __mpu_uint32_t tmp, save_carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4490) signed int carry = 0, sign = 0, zero = 0, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4491)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4492) if( b > BITS_PER_FOUR_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4493) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4494) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4495) __integer_invalid_shift( (__mpu_char8_t *)"ircrn_32" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4496) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4497) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4498)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4499) /* Оставляем CF, SF, ZF; остальные сбрасываем: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4500) __CLA; __CLO; __CLP; __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4501)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4502) zero = __MFLAG(ZF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4503)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4504) if( *a & 0x80000000 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4505) if( __MFLAG(CF) ) save_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4506)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4507) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4508)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4509) if( b == 0 || b == BITS_PER_FOUR_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4510) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4511) if( *c ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4512) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4513) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4514)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4515) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4516)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4517) /* Если сдвиг на все, то не трогаем CF (carry) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4518) if( b != BITS_PER_FOUR_BYTES ) __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4519) if( b == BITS_PER_FOUR_BYTES ) /* сдвиг на все */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4520) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4521) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4522) ishl_32( c, c ); /* set CF */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4523) if( sign ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4524) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4525) sign = 0; /* return previous value*/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4526)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4527) if( save_carry )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4528) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4529) *c |= save_carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4530)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4531) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4532) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4533)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4534) if( *c & 0x80000000 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4535) if( (!save_sign && sign) || (save_sign && !sign) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4536) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4537) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4538) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4539)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4540) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4541)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4542) } /* End if( b == 0 || b == BITS_PER_FOUR_BYTES ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4543)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4544) carry = (*c >> ((b-1)&(BITS_PER_FOUR_BYTES-1)))&1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4545) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4546) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4547)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4548) tmp = *c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4549) *c = *c >> b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4550)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4551) tmp = tmp << (BITS_PER_FOUR_BYTES-b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4552)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4553) tmp = tmp << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4554) if( save_carry ) /* SET_BIT( &tmp, BITS_PER_FOUR_BYTES-b ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4555) tmp |= ((__mpu_uint32_t)1 << ((BITS_PER_FOUR_BYTES-b)&(BITS_PER_FOUR_BYTES-1)));
868b2b66 (kx 2024-12-20 16:11:07 +0300 4556)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4557) *c |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4558)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4559) if( *c ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4560) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4561) if( zero ) { __STZ; } else { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4562)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4563) if( *c & 0x80000000 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4564) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4565)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4566) if( (!save_sign && sign) || (save_sign && !sign) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4567) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4568)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4569) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 4570) EMUSHORT (32-bit) operations:
868b2b66 (kx 2024-12-20 16:11:07 +0300 4571) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4572) /* Циклический сдвиг влево на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4573) void iroln_np( EMUSHORT *c, EMUSHORT *a, unsigned int b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4574) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4575) EMUSHORT *x, *y, tmp, temp, *ptemp = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4576) signed int carry, sign, save_sign = 0, zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4577) signed int i, n_parts, n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4578)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4579) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4580)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4581) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4582) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4583) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4584) __integer_invalid_size( (__mpu_char8_t *)"iroln_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4585) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4586) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4587)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4588) if( b > BITS_PER_EMUSHORT * np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4589) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4590) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4591) __integer_invalid_shift( (__mpu_char8_t *)"iroln_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4592) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4593) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4594)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4595) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4596)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4597) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4598) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4599) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4600) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4601) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4602) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4603) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4604)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4605) if( *x & MASK_SIGN ) save_sign = 1; /* save_sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4606)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4607) n_parts = N_PARTS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4608)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4609) if( b == 0 || n_parts == np ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4610) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4611) if( save_sign ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4612) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4613)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4614) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4615) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4616) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4617) *y = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4618)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4619) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4620) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4621)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4622) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4623) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4624) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4625) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4626) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4627) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4628) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4629) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4630) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4631)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4632) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4633) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4634) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4635) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4636) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4637)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4638) if( n_parts == np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4639) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4640) if( *y & 1 ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4641) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4642) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4643)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4644) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4645)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4646) } /* End if( b == 0 || n_parts == np ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4647)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4648) n_bits = N_BITS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4649)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4650) if( n_parts == 0 ) /* переписываем c <= a, т.к. n_bits уже != 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4651) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4652) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4653) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4654)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4655) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4656) while( i > 0 ) { *y = *x; ++x; ++y; --i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4657) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4658)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4659) if( n_parts )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4660) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4661) /* save shifting (put out) parts *************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4662) ptemp = (EMUSHORT *)__mpu_sbrk( (int)(n_parts*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4663) if( !ptemp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4664) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4665) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4666) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4667) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4668)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4669) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4670) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4671) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4672) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4673) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4674)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4675) i = n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4676) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4677) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4678) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4679) ptemp[n_parts-i] = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4680) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4681) ptemp[i-1] = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4682) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4683)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4684) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4685) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4686) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4687) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4688) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4689) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4690) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4691) /*********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4692)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4693) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4694) x = a + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4695) y = c + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4696) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4697) x = a + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4698) y = c + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4699) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4700)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4701) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4702) if( *(x - 1) & 1 ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4703) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4704) if( *(x + 1) & 1 ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4705) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4706)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4707) i = np - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4708) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4709) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4710) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4711) *(y - n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4712) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4713) *(y + n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4714) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4715)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4716) if( *x ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4717) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4718)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4719) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4720) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4721) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4722) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4723) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4724) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4725) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4726)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4727) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4728) while( i < n_parts )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4729) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4730) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4731) --y; *y = ptemp[n_parts-1-i];
868b2b66 (kx 2024-12-20 16:11:07 +0300 4732) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4733) ++y; *y = ptemp[i];
868b2b66 (kx 2024-12-20 16:11:07 +0300 4734) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4735)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4736) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4737) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4738)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4739) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4740) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4741)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4742) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4743) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4744) /* CF (carry) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4745)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4746) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4747) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4748) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4749) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4750) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4751) if( *y & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4752)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4753) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4754)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4755) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4756)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4757) /* FREE ptemp *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4758) __mpu_sbrk( -(int)(n_parts*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4759) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4760)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4761) } /* End if( n_parts ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4762)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4763) if( n_bits )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4764) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4765) zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4766)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4767) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4768) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4769) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4770) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4771) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4772)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4773) carry = BIT(y,(BITS_PER_EMUSHORT-n_bits));
868b2b66 (kx 2024-12-20 16:11:07 +0300 4774) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4775) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4776)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4777) /* save shifting (put out) bits *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4778) temp = *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4779) temp = temp >> (BITS_PER_EMUSHORT-n_bits);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4780) /************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4781)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4782) *y = *y << n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4783) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4784) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4785) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4786) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4787) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4788)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4789) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4790) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4791) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4792) tmp = *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4793) *y = *y << n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4794)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4795) tmp = tmp >> (BITS_PER_EMUSHORT-n_bits);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4796)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4797) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4798) *(y - 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4799) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4800) *(y + 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4801) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4802)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4803) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4804) if( *(y - 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4805) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4806) if( *(y + 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4807) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4808) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4809)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4810) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4811) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4812) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4813) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4814) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4815) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4816) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4817) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4818) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4819) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4820) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4821) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4822)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4823) /* copy shifting bits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4824) *y |= temp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4825) /**********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4826)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4827) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4828) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4829)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4830) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4831) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4832) /* CF (carry) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4833)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4834) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4835) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4836) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4837) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4838) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4839) if( *y & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4840) else __CLS; /* т.к. м.б. изменения */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4841)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4842) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4843)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4844) if( (!save_sign && sign) || (save_sign && !sign) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4845) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4846)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4847) } /* End if( n_bits ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4848)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4849) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4850)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4851) /* Циклический сдвиг вправо на (b) бит */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4852) void irorn_np( EMUSHORT *c, EMUSHORT *a, unsigned int b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4853) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4854) EMUSHORT *x, *y, tmp, temp, *ptemp = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4855) signed int carry, sign, save_sign = 0, zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4856) signed int i, n_parts, n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4857)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4858) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4859)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4860) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4861) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4862) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4863) __integer_invalid_size( (__mpu_char8_t *)"irorn_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4864) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4865) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4866)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4867) if( b > BITS_PER_EMUSHORT * np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4868) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4869) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4870) __integer_invalid_shift( (__mpu_char8_t *)"irorn_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4871) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4872) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4873)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4874) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4875)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4876) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4877) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4878) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4879) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4880) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4881) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4882) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4883)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4884) if( *x & MASK_SIGN ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4885)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4886) n_parts = N_PARTS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4887)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4888) if( b == 0 || n_parts == np ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4889) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4890) if( save_sign ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4891) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4892)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4893) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4894) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4895) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4896) *y = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4897)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4898) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4899) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4900)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4901) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4902) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4903) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4904) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4905) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4906) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4907) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4908) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4909) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4910)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4911) if( n_parts == np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4912) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4913) if( save_sign ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4914) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4915) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4916)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4917) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4918)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4919) } /* End if( b == 0 || n_parts == np ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4920)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4921) n_bits = N_BITS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 4922)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4923) if( n_parts == 0 ) /* переписываем c <= a, т.к. n_bits уже != 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4924) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4925) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4926) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4927)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4928) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4929) while( i > 0 ) { *y = *x; ++x; ++y; --i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4930) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4931)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4932) if( n_parts )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4933) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4934) /* save shifting (put out) parts *************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4935) ptemp = (EMUSHORT *)__mpu_sbrk( (int)(n_parts*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 4936) if( !ptemp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4937) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4938) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 4939) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4940) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4941)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4942) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4943) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4944) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4945) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4946) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4947)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4948) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4949) while( i < n_parts )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4950) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4951) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4952) ptemp[n_parts-1-i] = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4953) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4954) ptemp[i] = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4955) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4956)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4957) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4958) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4959) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4960) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4961) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4962) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4963) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4964) /*********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 4965)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4966) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4967) x = a + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4968) y = c + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4969) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4970) x = a + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4971) y = c + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4972) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4973)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4974) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4975) if( *(x + 1) & MASK_SIGN ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4976) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4977) if( *(x - 1) & MASK_SIGN ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4978) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4979)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4980) i = np - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4981) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 4982) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 4983) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4984) *(y + n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4985) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4986) *(y - n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4987) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4988)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4989) if( *x ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4990) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4991)
868b2b66 (kx 2024-12-20 16:11:07 +0300 4992) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 4993) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4994) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 4995) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4996) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 4997) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 4998) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 4999)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5000) i = n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5001) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5002) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5003) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5004) ++y; *y = ptemp[n_parts-i];
868b2b66 (kx 2024-12-20 16:11:07 +0300 5005) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5006) --y; *y = ptemp[i-1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 5007) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5008)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5009) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5010) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5011)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5012) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5013) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5014)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5015) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5016) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5017) /* CF (carry) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5018)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5019) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5020) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5021) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5022) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5023) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5024) if( *y & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5025)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5026) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5027)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5028) if( (!save_sign && sign) || (save_sign && !sign) ) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5029)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5030) /* FREE ptemp *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5031) __mpu_sbrk( -(int)(n_parts*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5032) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5033)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5034) } /* End if( n_parts ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5035)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5036) if( n_bits )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5037) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5038) zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5039)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5040) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5041) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5042) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5043) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5044) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5045)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5046) carry = BIT(y,(n_bits-1));
868b2b66 (kx 2024-12-20 16:11:07 +0300 5047) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5048) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5049)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5050) /* save shifting (put out) bits *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5051) temp = *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5052) temp = temp << (BITS_PER_EMUSHORT-n_bits);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5053) /************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5054)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5055) *y = *y >> n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5056) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5057) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5058) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5059) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5060) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5061)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5062) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5063) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5064) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5065) tmp = *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5066) *y = *y >> n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5067)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5068) tmp = tmp << (BITS_PER_EMUSHORT-n_bits);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5069)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5070) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5071) *(y + 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5072) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5073) *(y - 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5074) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5075)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5076) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5077) if( *(y + 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5078) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5079) if( *(y - 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5080) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5081) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5082)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5083) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5084) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5085) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5086) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5087) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5088) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5089) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5090) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5091) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5092) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5093) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5094) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5095)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5096) /* copy shifting bits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5097) *y |= temp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5098) /**********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5099)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5100) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5101) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5102)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5103) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5104) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5105) /* CF (carry) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5106)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5107) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5108) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5109) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5110) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5111) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5112) if( *y & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5113) else __CLS; /* т.к. м.б. изменения */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5114)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5115) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5116)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5117) if( (!save_sign && sign) || (save_sign && !sign) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5118) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5119)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5120) } /* End if( n_bits ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5121)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5122) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5123)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5124) /* Циклический сдвиг влево на (b) бит с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5125) void ircln_np( EMUSHORT *c, EMUSHORT *a, unsigned int b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5126) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5127) EMUSHORT *x, *y, tmp, temp, *ptemp = 0, save_carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5128) signed int carry, sign, save_sign = 0, zero = 1, save_zero = 0, save_parity;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5129) signed int save_part_carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5130) signed int i, n_parts, n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5131)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5132) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5133)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5134) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5135) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5136) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5137) __integer_invalid_size( (__mpu_char8_t *)"ircln_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5138) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5139) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5140)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5141) if( b > BITS_PER_EMUSHORT * np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5142) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5143) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5144) __integer_invalid_shift( (__mpu_char8_t *)"ircln_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5145) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5146) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5147)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5148) /* Оставляем CF, PF, ZF; остальные сбрасываем: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5149) __CLA; __CLO; __CLS; __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5150)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5151) save_zero = __MFLAG(ZF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5152)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5153) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5154) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5155) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5156) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5157) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5158) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5159) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5160)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5161) if( *x & MASK_SIGN ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5162) if( __MFLAG(CF) ) save_carry = MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5163)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5164) n_parts = N_PARTS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5165)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5166) if( b == 0 || n_parts == np ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5167) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5168) if( save_sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5169) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5170)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5171) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5172) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5173) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5174) *y = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5175)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5176) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5177) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5178)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5179) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5180) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5181) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5182) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5183) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5184) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5185) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5186) save_zero &= zero;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5187) if( save_zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5188) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5189)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5190) /* Если сдвиг на все, то не трогаем CF (carry) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5191) if( n_parts != np ) __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5192) if( n_parts == np ) /* сдвиг на все */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5193) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5194) save_parity = __MFLAG(PF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5195) ishr_np( c, c, np ); /* set CF */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5196) if( save_parity ) __STP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5197) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5198)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5199) if( save_carry )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5200) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5201) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5202) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5203) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5204) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5205) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5206) *y |= save_carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5207)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5208) __CLZ; __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5209)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5210) if( !save_sign ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5211) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5212) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5213) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5214)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5215) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5216)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5217) } /* End if( b == 0 || n_parts == np ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5218)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5219) n_bits = N_BITS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5220)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5221) if( n_parts == 0 ) /* переписываем c <= a, т.к. n_bits уже != 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5222) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5223) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5224) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5225)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5226) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5227) while( i > 0 ) { *y = *x; ++x; ++y; --i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5228) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5229)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5230) if( n_parts )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5231) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5232) /* save shifting (put out) parts *************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5233) ptemp = (EMUSHORT *)__mpu_sbrk( (int)(n_parts*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5234) if( !ptemp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5235) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5236) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5237) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5238) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5239)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5240) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5241) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5242) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5243) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5244) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5245)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5246) i = n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5247) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5248) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5249) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5250) ptemp[n_parts-i] = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5251) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5252) ptemp[i-1] = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5253) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5254)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5255) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5256) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5257) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5258) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5259) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5260) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5261) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5262) /*********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5263)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5264) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5265) x = a + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5266) y = c + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5267) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5268) x = a + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5269) y = c + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5270) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5271)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5272) i = np - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5273) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5274) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5275) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5276) *(y - n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5277) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5278) *(y + n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5279) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5280)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5281) if( *x ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5282) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5283)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5284) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5285) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5286) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5287) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5288) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5289) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5290) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5291)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5292) /* save carry ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5293) save_parity = __MFLAG(PF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5294) ishr_np( ptemp, ptemp, n_parts ); /* set CF */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5295) if( save_parity ) __STP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5296) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5297) /* Эта операция установит правильный CF */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5298)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5299) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5300) while( i < n_parts )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5301) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5302) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5303) --y; *y = ptemp[n_parts-1-i];
868b2b66 (kx 2024-12-20 16:11:07 +0300 5304) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5305) ++y; *y = ptemp[i];
868b2b66 (kx 2024-12-20 16:11:07 +0300 5306) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5307)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5308) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5309) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5310)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5311) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5312) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5313)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5314) /* copy old carry (CF) *****/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5315) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5316) y = c + np - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5317) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5318) y = c + n_parts - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5319) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5320) *y |= save_carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5321) if( save_carry ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5322) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5323) /***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5324)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5325) save_zero &= zero;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5326) if( save_zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5327) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5328) /* CF (carry) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5329)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5330) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5331) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5332) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5333) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5334) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5335) if( *y & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5336) else __CLS; /* м.б. изменения (SHR) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5337)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5338) /* PF (parity) не определяем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5339)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5340) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5341)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5342) if( (!save_sign && sign) || (save_sign && !sign) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5343) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5344)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5345) /* FREE ptemp *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5346) __mpu_sbrk( -(int)(n_parts*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5347) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5348)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5349) } /* End if( n_parts ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5350)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5351) if( n_bits )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5352) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5353) zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5354)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5355) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5356) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5357) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5358) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5359) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5360)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5361) carry = __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5362)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5363) if( n_parts == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5364) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5365) if( carry ) save_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5366) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5367)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5368) if( n_parts )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5369) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5370) if( carry ) save_part_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5371) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5372)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5373) carry = BIT(y,(BITS_PER_EMUSHORT-n_bits));
868b2b66 (kx 2024-12-20 16:11:07 +0300 5374) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5375) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5376)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5377) /* save shifting (put out) bits *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5378) temp = *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5379) temp = temp >> (BITS_PER_EMUSHORT-n_bits);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5380) /************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5381)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5382) *y = *y << n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5383) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5384) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5385) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5386) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5387)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5388) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5389) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5390) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5391) tmp = *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5392) *y = *y << n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5393)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5394) tmp = tmp >> (BITS_PER_EMUSHORT-n_bits);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5395)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5396) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5397) *(y - 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5398) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5399) *(y + 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5400) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5401)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5402) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5403) if( *(y - 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5404) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5405) if( *(y + 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5406) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5407) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5408)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5409) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5410) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5411) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5412) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5413) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5414) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5415) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5416) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5417) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5418) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5419) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5420) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5421)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5422) /* copy shifting bits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5423) if( n_parts == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5424) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5425) temp = temp >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5426) if( save_carry ) SET_BIT( &temp, n_bits-1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5427) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5428) if( n_parts )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5429) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5430) temp = temp >> 1; /* только для RCR, RCL */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5431) if( save_part_carry )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5432) SET_BIT( &temp, n_bits-1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5433) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5434) *y |= temp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5435) /**********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5436)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5437) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5438) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5439)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5440) save_zero = __MFLAG(ZF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5441) save_zero &= zero;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5442) if( save_zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5443) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5444) /* CF (carry) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5445)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5446) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5447) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5448) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5449) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5450) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5451) if( *y & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5452) else __CLS; /* т.к. м.б. изменения */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5453)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5454) /* PF (parity) не определяем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5455)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5456) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5457)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5458) if( (!save_sign && sign) || (save_sign && !sign) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5459) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5460)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5461) } /* End if( n_bits ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5462)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5463) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5464)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5465) /* Циклический сдвиг вправо на (b) бит с переносом */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5466) void ircrn_np( EMUSHORT *c, EMUSHORT *a, unsigned int b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5467) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5468) EMUSHORT *x, *y, tmp, temp, *ptemp = 0, save_carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5469) signed int carry, sign = 0, save_sign = 0, zero = 1, save_zero;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5470) signed int save_part_carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5471) signed int i, n_parts, n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5472)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5473) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5474)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5475) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5476) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5477) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5478) __integer_invalid_size( (__mpu_char8_t *)"ircrn_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5479) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5480) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5481)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5482) if( b > BITS_PER_EMUSHORT * np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5483) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5484) /* error: Invalid number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5485) __integer_invalid_shift( (__mpu_char8_t *)"ircrn_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5486) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5487) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5488)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5489) /* Оставляем CF, SF, ZF; остальные сбрасываем: */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5490) __CLA; __CLO; __CLP; __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5491)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5492) save_zero = __MFLAG(ZF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5493)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5494) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5495) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5496) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5497) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5498) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5499) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5500) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5501)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5502) if( *x & MASK_SIGN ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5503) if( __MFLAG(CF) ) save_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5504)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5505) n_parts = N_PARTS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5506)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5507) if( b == 0 || n_parts == np ) /* выставляем флаги и уходим */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5508) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5509) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5510) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5511) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5512) *y = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5513)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5514) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5515) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5516)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5517) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5518) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5519) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5520) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5521) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5522) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5523) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5524) save_zero &= zero;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5525) if( save_zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5526) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5527)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5528) /* Если сдвиг на все, то не трогаем CF (carry) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5529) if( n_parts != np ) __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5530) if( n_parts == np ) /* сдвиг на все */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5531) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5532) sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5533) ishl_np( c, c, np ); /* set CF */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5534) if( sign ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5535) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5536) sign = 0; /* return previous value*/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5537)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5538) if( save_carry )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5539) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5540) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5541) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5542) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5543) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5544) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5545) *y |= save_carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5546)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5547) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5548)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5549) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5550) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5551) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5552) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5553) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5554) if( *y & MASK_SIGN ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5555) if( (!save_sign && sign) || (save_sign && !sign) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5556) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5557) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5558) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5559)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5560) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5561)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5562) } /* End if( b == 0 || n_parts == np ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5563)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5564) n_bits = N_BITS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5565)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5566) if( n_parts == 0 ) /* переписываем c <= a, т.к. n_bits уже != 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5567) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5568) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5569) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5570)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5571) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5572) while( i > 0 ) { *y = *x; ++x; ++y; --i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5573) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5574)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5575) if( n_parts )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5576) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5577) /* save shifting (put out) parts *************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5578) ptemp = (EMUSHORT *)__mpu_sbrk( (int)(n_parts*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5579) if( !ptemp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5580) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5581) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5582) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5583) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5584)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5585) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5586) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5587) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5588) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5589) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5590)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5591) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5592) while( i < n_parts )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5593) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5594) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5595) ptemp[n_parts-1-i] = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5596) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5597) ptemp[i] = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5598) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5599)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5600) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5601) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5602) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5603) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5604) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5605) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5606) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5607) /*********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5608)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5609) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5610) x = a + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5611) y = c + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5612) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5613) x = a + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5614) y = c + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5615) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5616)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5617) i = np - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5618) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5619) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5620) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5621) *(y + n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5622) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5623) *(y - n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5624) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5625)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5626) if( *x ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5627) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5628)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5629) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5630) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5631) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5632) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5633) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5634) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5635) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5636)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5637) /* save carry ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5638) save_sign = __MFLAG(SF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5639) ishl_np( ptemp, ptemp, n_parts );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5640) if( save_sign ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5641) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5642) /* Эта операция установит правильный CF */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5643)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5644) i = n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5645) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5646) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5647) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5648) ++y; *y = ptemp[n_parts-i];
868b2b66 (kx 2024-12-20 16:11:07 +0300 5649) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5650) --y; *y = ptemp[i-1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 5651) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5652)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5653) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5654) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5655)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5656) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5657) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5658)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5659) /* copy old carry (CF) *****/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5660) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5661) y = c + n_parts - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5662) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5663) y = c + np - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5664) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5665) *y |= save_carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5666) if( save_carry ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5667) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5668) /***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5669)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5670) save_zero &= zero;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5671) if( save_zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5672) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5673) /* CF (carry) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5674)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5675) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5676) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5677) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5678) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5679) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5680) if( *y & MASK_SIGN ) sign = 1; /* SF не устанавливаем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5681)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5682) if( (!save_sign && sign) || (save_sign && !sign) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5683) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5684)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5685) /* FREE ptemp *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5686) __mpu_sbrk( -(int)(n_parts*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5687) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5688)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5689) } /* End if( n_parts ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5690)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5691) if( n_bits )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5692) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5693) zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5694)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5695) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5696) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5697) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5698) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5699) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5700)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5701) carry = __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5702)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5703) if( n_parts == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5704) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5705) if( carry ) save_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5706) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5707)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5708) if( n_parts )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5709) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5710) if( carry ) save_part_carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5711) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5712)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5713) carry = BIT(y,(n_bits-1));
868b2b66 (kx 2024-12-20 16:11:07 +0300 5714) if( carry ) __STC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5715) else __CLC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5716)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5717) /* save shifting (put out) bits *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5718) temp = *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5719) temp = temp << (BITS_PER_EMUSHORT-n_bits);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5720) /************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5721)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5722) *y = *y >> n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5723) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5724) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5725) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5726) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5727) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5728)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5729) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5730) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5731) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5732) tmp = *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5733) *y = *y >> n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5734)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5735) tmp = tmp << (BITS_PER_EMUSHORT-n_bits);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5736)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5737) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5738) *(y + 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5739) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5740) *(y - 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5741) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5742)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5743) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5744) if( *(y + 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5745) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5746) if( *(y - 1) ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5747) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5748) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5749)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5750) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5751) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5752) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5753) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5754) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5755) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5756) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5757) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5758) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5759) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5760) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5761) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5762)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5763) /* copy shifting bits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5764) if( n_parts == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5765) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5766) temp = temp << 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5767) if( save_carry )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5768) SET_BIT( &temp, BITS_PER_EMUSHORT-n_bits );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5769) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5770)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5771) if( n_parts )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5772) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5773) temp = temp << 1; /* только для RCR, RCL */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5774) if( save_part_carry )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5775) SET_BIT( &temp, BITS_PER_EMUSHORT-n_bits );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5776) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5777) *y |= temp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5778) /**********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5779)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5780) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5781) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5782)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5783) save_zero &= zero;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5784) if( save_zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5785) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5786) /* CF (carry) уже установлен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5787)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5788) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5789) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5790) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5791) y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5792) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5793) if( *y & MASK_SIGN ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5794) else sign = 0; /* т.к. м.б. изменения */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5795)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5796) if( (!save_sign && sign) || (save_sign && !sign) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5797) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5798)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5799) } /* End if( n_bits ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5800)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5801) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5802)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5803)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5804) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5805) Операция NOT [c = (инверсия всех разрядов)a].
868b2b66 (kx 2024-12-20 16:11:07 +0300 5806) (поразрядное логическое НЕ).
868b2b66 (kx 2024-12-20 16:11:07 +0300 5807) На флаги не воздействует.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5808) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5809)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5810) void inot_8( __mpu_uint8_t *c, __mpu_uint8_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5811) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5812) *c = ~(*a);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5813) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5814)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5815) void inot_16( __mpu_uint16_t *c, __mpu_uint16_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5816) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5817) *c = ~(*a);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5818) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5819)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5820) void inot_32( __mpu_uint32_t *c, __mpu_uint32_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5821) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5822) *c = ~(*a);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5823) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5824)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5825) void inot_np( EMUSHORT *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5826) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5827) EMUSHORT *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5828) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5829)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5830) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5831) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5832) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5833) __integer_invalid_size( (__mpu_char8_t *)"inot_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5834) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5835) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5836)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5837) x = a; y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5838)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5839) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5840) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5841) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5842) *y = ~(*x);
868b2b66 (kx 2024-12-20 16:11:07 +0300 5843) ++x; ++y; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5844) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5845) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5846)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5847)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5848) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5849) Операция NEG [c = - a].
868b2b66 (kx 2024-12-20 16:11:07 +0300 5850) Воздействует на флаги: AF, CF, OF, PF, SF, ZF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5851) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5852)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5853) void ineg_8( __mpu_uint8_t *c, __mpu_uint8_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5854) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5855) __mpu_uint8_t inc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5856)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5857) inot_8( c, a );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5858) iadd_8( c, c, &inc ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5859) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5860)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5861) void ineg_16( __mpu_uint16_t *c, __mpu_uint16_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5862) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5863) __mpu_uint16_t inc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5864)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5865) inot_16( c, a );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5866) iadd_16( c, c, &inc ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5867) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5868)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5869) void ineg_32( __mpu_uint32_t *c, __mpu_uint32_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5870) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5871) __mpu_uint32_t inc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5872)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5873) inot_32( c, a );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5874) iadd_32( c, c, &inc ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5875) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5876)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5877) void ineg_np( EMUSHORT *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5878) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5879) EMUSHORT *inc = (EMUSHORT *)EMUSHORT_C( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5880)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5881) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5882)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5883) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5884) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5885) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5886) __integer_invalid_size( (__mpu_char8_t *)"ineg_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5887) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5888) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5889)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5890) /* Allocate memory and *inc = 1; *****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5891) inc = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5892) if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5893) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5894) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5895) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5896) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5897) (void)memset( (void *)inc, 0, np*SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5898) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5899) *(inc + np - 1) = (EMUSHORT) 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5900) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 5901) *inc = (EMUSHORT) 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5902) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5903) /*************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5904)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5905) inot_np( c, a, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5906) iadd_np( c, c, inc, np ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5907)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5908) /* FREE inc **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5909) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5910) /*********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5911) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5912)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5913)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5914) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 5915) Операция AND [c = a <AND> b].
868b2b66 (kx 2024-12-20 16:11:07 +0300 5916) (поразрядное логическое И).
868b2b66 (kx 2024-12-20 16:11:07 +0300 5917) Воздействует на флаги: AF=(undefined), CF=0, OF=0, PF, SF, ZF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 5918) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 5919)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5920) void iand_8( __mpu_uint8_t *c, __mpu_uint8_t *a, __mpu_uint8_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5921) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5922) /* AF (aux_carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5923) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5924)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5925) *c = *a & *b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5926)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5927) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5928) if( *c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5929)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5930) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5931) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5932)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5933) void iand_16( __mpu_uint16_t *c, __mpu_uint16_t *a, __mpu_uint16_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5934) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5935) /* AF (aux_carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5936) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5937)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5938) *c = *a & *b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5939)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5940) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5941) if( *c & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5942)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5943) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5944) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5945)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5946) void iand_32( __mpu_uint32_t *c, __mpu_uint32_t *a, __mpu_uint32_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5947) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5948) /* AF (aux_carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5949) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5950)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5951) *c = *a & *b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5952)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5953) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5954) if( *c & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5955)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5956) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5957) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5958)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5959) void iand_np( EMUSHORT *c, EMUSHORT *a, EMUSHORT *b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5960) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5961) EMUSHORT *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5962) signed int zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5963) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5964)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5965) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5966) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5967) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5968) __integer_invalid_size( (__mpu_char8_t *)"iand_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 5969) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5970) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 5971)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5972) /* AF (aux_carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5973) /* PF (parity) = 0; Не определяем (для операций > 16-bit). */
868b2b66 (kx 2024-12-20 16:11:07 +0300 5974) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5975)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5976) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5977) y = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5978)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5979) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5980)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5981) c[i] = *x & *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5982) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 5983) if( c[i] & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5984) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 5985)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5986) if( c[i] ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5987) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5988)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5989) ++x; ++y; ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5990)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5991) while( i < np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 5992) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 5993) c[i] = *x & *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5994)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5995) if( c[i] ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5996) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5997)
868b2b66 (kx 2024-12-20 16:11:07 +0300 5998) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 5999) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6000) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6001)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6002) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6003) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6004)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6005) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6006) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 6007) if( c[i] & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6008) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6009) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6010)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6011)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6012) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6013) Операция TEST [a <TEST> b]. Не изменяет значения операндов.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6014) (поразрядное логическое И).
868b2b66 (kx 2024-12-20 16:11:07 +0300 6015) Воздействует на флаги: AF=(undefined), CF=0, OF=0, PF, SF, ZF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6016) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6017)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6018) void itest_8( __mpu_uint8_t *a, __mpu_uint8_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6019) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6020) __mpu_uint8_t c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6021)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6022) /* AF (aux_carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6023) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6024)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6025) c = *a & *b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6026)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6027) if( c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6028) if( c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6029)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6030) if( __MPARITY(c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6031) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6032)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6033) void itest_16( __mpu_uint16_t *a, __mpu_uint16_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6034) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6035) __mpu_uint16_t c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6036)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6037) /* AF (aux_carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6038) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6039)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6040) c = *a & *b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6041)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6042) if( c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6043) if( c & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6044)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6045) if( __MPARITY(c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6046) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6047)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6048) void itest_32( __mpu_uint32_t *a, __mpu_uint32_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6049) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6050) __mpu_uint32_t c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6051)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6052) /* AF (aux_carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6053) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6054)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6055) c = *a & *b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6056)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6057) if( c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6058) if( c & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6059)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6060) if( __MPARITY(c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6061) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6062)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6063) void itest_np( EMUSHORT *a, EMUSHORT *b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6064) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6065) EMUSHORT *x, *y, c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6066) signed int zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6067) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6068)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6069) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6070) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6071) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6072) __integer_invalid_size( (__mpu_char8_t *)"itest_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6073) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6074) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6075)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6076) /* AF (aux_carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6077) /* PF (parity) = 0; Не определяем (для операций > 16-bit). */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6078) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6079)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6080) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6081) y = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6082)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6083) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6084)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6085) c = *x & *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6086) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 6087) if( c & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6088) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6089)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6090) if( c ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6091) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6092)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6093) ++x; ++y; ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6094)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6095) while( i < np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6096) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6097) c = *x & *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6098)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6099) if( c ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6100) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6101)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6102) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6103) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6104) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6105)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6106) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6107) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6108)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6109) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 6110) if( c & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6111) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6112) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6113)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6114)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6115) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6116) Операция сравнения CMP. [фактически <a - b>].
868b2b66 (kx 2024-12-20 16:11:07 +0300 6117) Не изменяет значения операндов.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6118) Выставляет флаги: AF, CF, OF, SF, PF, ZF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6119) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6120)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6121) /* Сравнение операндов размером в байт */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6122) void icmp_8( __mpu_uint8_t *a, __mpu_uint8_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6123) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6124) __mpu_uint16_t rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6125) __mpu_uint8_t c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6126) signed int carry, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6127)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6128) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6129)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6130) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6131)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6132) /* set auxiliary carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6133) rc = ((__mpu_uint16_t) (*a) & 0x0f) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 6134) ((__mpu_uint16_t) (*b) & 0x0f) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6135) if( rc & 0x10 ) __STA; /* set aux carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6136)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6137) /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6138) rc = (__mpu_uint16_t) (*a) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 6139) (__mpu_uint16_t) (*b) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6140) if( rc & 0x100 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6141) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6142)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6143) if( __MPARITY(rc) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6144)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6145) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6146) op1 = (__mpu_uint16_t) (*a);
868b2b66 (kx 2024-12-20 16:11:07 +0300 6147) op2 = (__mpu_uint16_t) (*b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 6148) if( op1 & 0x80 ) op1 |= 0x100;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6149) if( op2 & 0x80 ) op2 |= 0x100;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6150)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6151) rc = op1 - op2 - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6152) if( rc & 0x100 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6153) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6154) if( rc & 0x80 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6155)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6156) if((!carry && sign) || (carry && !sign)) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6157) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6158) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6159)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6160) c = (__mpu_uint8_t) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6161) if( c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6162) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6163)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6164) /* Сравнение операндов размером в два байта */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6165) void icmp_16( __mpu_uint16_t *a, __mpu_uint16_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6166) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6167) __mpu_uint32_t rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6168) __mpu_uint16_t c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6169) signed int carry, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6170)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6171) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6172)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6173) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6174)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6175) /* set auxiliary carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6176) rc = ((__mpu_uint32_t) (*a) & 0x0f) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 6177) ((__mpu_uint32_t) (*b) & 0x0f) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6178) if( rc & 0x10 ) __STA; /* set aux carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6179)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6180) /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6181) rc = (__mpu_uint32_t) (*a) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 6182) (__mpu_uint32_t) (*b) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6183) if( rc & 0x10000 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6184) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6185)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6186) if( __MPARITY(rc) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6187)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6188) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6189) op1 = (__mpu_uint32_t) (*a);
868b2b66 (kx 2024-12-20 16:11:07 +0300 6190) op2 = (__mpu_uint32_t) (*b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 6191) if( op1 & 0x8000 ) op1 |= 0x10000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6192) if( op2 & 0x8000 ) op2 |= 0x10000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6193)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6194) rc = op1 - op2 - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6195) if( rc & 0x10000 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6196) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6197) if( rc & 0x8000 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6198)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6199) if((!carry && sign) || (carry && !sign)) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6200) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6201) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6202)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6203) c = (__mpu_uint16_t) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6204) if( c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6205) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6206)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6207) /* Сравнение операндов размером в четыре байта */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6208) void icmp_32( __mpu_uint32_t *a, __mpu_uint32_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6209) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6210) __mpu_uint64_t rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6211) __mpu_uint32_t c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6212) signed int carry, sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6213)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6214) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6215)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6216) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6217)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6218) /* set auxiliary carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6219) rc = ((__mpu_uint64_t) (*a) & 0x0f) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 6220) ((__mpu_uint64_t) (*b) & 0x0f) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6221) if( rc & 0x10 ) __STA; /* set aux carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6222)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6223) /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6224) rc = (__mpu_uint64_t) (*a) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 6225) (__mpu_uint64_t) (*b) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6226) if( rc & 0x100000000 ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6227) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6228)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6229) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6230) op1 = (__mpu_uint64_t) (*a);
868b2b66 (kx 2024-12-20 16:11:07 +0300 6231) op2 = (__mpu_uint64_t) (*b);
868b2b66 (kx 2024-12-20 16:11:07 +0300 6232) if( op1 & 0x80000000 ) op1 |= 0x100000000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6233) if( op2 & 0x80000000 ) op2 |= 0x100000000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6234)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6235) rc = op1 - op2 - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6236) if( rc & 0x100000000 ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6237) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6238) if( rc & 0x80000000 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6239)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6240) if((!carry && sign) || (carry && !sign)) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6241) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6242) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6243)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6244) c = (__mpu_uint32_t) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6245) if( c == 0 ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6246) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6247)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6248) /* Сравнение целых операндов всех размеров */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6249) void icmp_np( EMUSHORT *a, EMUSHORT *b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6250) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6251) EMULONG rc, op1, op2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6252) EMUSHORT *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6253) EMUSHORT c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6254) signed int carry, sign = 0, zero = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6255) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6256)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6257) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6258) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6259) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6260) __integer_invalid_size( (__mpu_char8_t *)"icmp_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6261) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6262) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6263)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6264) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6265)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6266) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6267)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6268) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 6269) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6270) y = b + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6271) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6272) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 6273) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6274) y = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6275) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6276) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6277)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6278) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 6279) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6280) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 6281) while( i < np - 1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6282) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6283) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6284) rc = (EMULONG) (*x) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 6285) (EMULONG) (*y) - __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 6286) if( rc & MASK_CARRY ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6287) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6288) c = (EMUSHORT) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6289) if( c ) zero |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6290)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6291) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 6292) --x; --y; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6293) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 6294) ++x; ++y; ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6295) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6296) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6297)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6298) carry = __MFLAG(CF); /* save carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6299)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6300) /* set Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6301) rc = (EMULONG) (*x) -
868b2b66 (kx 2024-12-20 16:11:07 +0300 6302) (EMULONG) (*y) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6303) if( rc & MASK_CARRY ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6304) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6305)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6306) /* copy sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6307) op1 = (EMULONG) (*x);
868b2b66 (kx 2024-12-20 16:11:07 +0300 6308) op2 = (EMULONG) (*y);
868b2b66 (kx 2024-12-20 16:11:07 +0300 6309) if( op1 & MASK_SIGN ) op1 |= MASK_CARRY;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6310) if( op2 & MASK_SIGN ) op2 |= MASK_CARRY;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6311)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6312) rc = op1 - op2 - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6313) if( rc & MASK_CARRY ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6314) else carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6315) if( rc & MASK_SIGN ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6316)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6317) if((!carry && sign) || (carry && !sign)) __STO; /* set overflow flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6318) if( sign ) __STS; /* set sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6319) else __CLS; /* clear sign flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6320)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6321) c = (EMUSHORT) rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6322) if( c ) zero |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6323) zero ^= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6324)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6325) if( zero ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6326) else __CLZ; /* clear zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6327) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6328)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6329)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6330) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6331) Операция OR [c = a <OR> b].
868b2b66 (kx 2024-12-20 16:11:07 +0300 6332) (поразрядное логическое ИЛИ).
868b2b66 (kx 2024-12-20 16:11:07 +0300 6333) Воздействует на флаги: AF=(undefined), CF=0, OF=0, PF, SF, ZF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6334) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6335)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6336) void ior_8( __mpu_uint8_t *c, __mpu_uint8_t *a, __mpu_uint8_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6337) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6338) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6339) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6340)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6341) *c = *a | *b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6342)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6343) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6344)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6345) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6346) if( *c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6347) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6348)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6349) void ior_16( __mpu_uint16_t *c, __mpu_uint16_t *a, __mpu_uint16_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6350) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6351) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6352) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6353)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6354) *c = *a | *b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6355)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6356) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6357)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6358) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6359) if( *c & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6360) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6361)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6362) void ior_32( __mpu_uint32_t *c, __mpu_uint32_t *a, __mpu_uint32_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6363) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6364) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6365) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6366)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6367) *c = *a | *b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6368)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6369) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6370)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6371) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6372) if( *c & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6373) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6374)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6375) void ior_np( EMUSHORT *c, EMUSHORT *a, EMUSHORT *b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6376) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6377) EMUSHORT *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6378) signed int zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6379) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6380)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6381) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6382) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6383) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6384) __integer_invalid_size( (__mpu_char8_t *)"ior_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6385) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6386) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6387)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6388) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6389) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6390)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6391) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6392) y = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6393)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6394) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6395)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6396) c[i] = *x | *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6397)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6398) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 6399) if( c[i] & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6400) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6401)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6402) if( c[i] ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6403) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6404)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6405) ++x; ++y; ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6406)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6407) while( i < np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6408) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6409) c[i] = *x | *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6410)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6411) if( c[i] ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6412) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6413)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6414) ++x; ++y; ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6415) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6416)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6417) if( zero ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6418) else __CLZ; /* clear zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6419)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6420) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6421)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6422) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 6423) if( c[i] & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6424) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6425) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6426)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6427)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6428) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6429) Операция XOR [c = a <XOR> b].
868b2b66 (kx 2024-12-20 16:11:07 +0300 6430) (поразрядное логическое исключающее ИЛИ).
868b2b66 (kx 2024-12-20 16:11:07 +0300 6431) Воздействует на флаги: AF=(undefined), CF=0, OF=0, PF, SF, ZF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6432) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6433)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6434) void ixor_8( __mpu_uint8_t *c, __mpu_uint8_t *a, __mpu_uint8_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6435) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6436) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6437) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6438)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6439) *c = *a ^ *b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6440)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6441) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6442)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6443) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6444) if( *c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6445) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6446)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6447) void ixor_16( __mpu_uint16_t *c, __mpu_uint16_t *a, __mpu_uint16_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6448) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6449) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6450) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6451)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6452) *c = *a ^ *b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6453)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6454) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6455)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6456) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6457) if( *c & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6458) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6459)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6460) void ixor_32( __mpu_uint32_t *c, __mpu_uint32_t *a, __mpu_uint32_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6461) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6462) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6463) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6464)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6465) *c = *a ^ *b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6466)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6467) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6468)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6469) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6470) if( *c & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6471) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6472)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6473) void ixor_np( EMUSHORT *c, EMUSHORT *a, EMUSHORT *b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6474) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6475) EMUSHORT *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6476) signed int zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6477) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6478)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6479) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6480) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6481) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6482) __integer_invalid_size( (__mpu_char8_t *)"ior_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6483) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6484) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6485)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6486) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6487) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6488)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6489) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6490) y = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6491)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6492) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6493)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6494) c[i] = *x ^ *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6495)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6496) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 6497) if( c[i] & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6498) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6499)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6500) if( c[i] ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6501) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6502)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6503) ++x; ++y; ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6504)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6505) while( i < np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6506) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6507) c[i] = *x ^ *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6508)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6509) if( c[i] ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6510) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6511)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6512) ++x; ++y; ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6513) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6514)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6515) if( zero ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6516) else __CLZ; /* clear zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6517)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6518) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6519)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6520) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 6521) if( c[i] & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6522) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6523) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6524)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6525)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6526) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6527) Операция INC (инкремент) [c = a + 1].
868b2b66 (kx 2024-12-20 16:11:07 +0300 6528) Воздействует на флаги: AF, OF, PF, SF, ZF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6529) Флаг CF не изменяется.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6530) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6531)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6532) void iinc_8( __mpu_uint8_t *c, __mpu_uint8_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6533) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6534) __mpu_uint8_t inc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6535) signed int save_carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6536)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6537) save_carry = __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 6538) iadd_8( c, a, &inc ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6539) if( save_carry ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6540) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6541) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6542)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6543) void iinc_16( __mpu_uint16_t *c, __mpu_uint16_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6544) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6545) __mpu_uint16_t inc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6546) signed int save_carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6547)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6548) save_carry = __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 6549) iadd_16( c, a, &inc ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6550) if( save_carry ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6551) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6552) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6553)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6554) void iinc_32( __mpu_uint32_t *c, __mpu_uint32_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6555) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6556) __mpu_uint32_t inc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6557) signed int save_carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6558)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6559) save_carry = __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 6560) iadd_32( c, a, &inc ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6561) if( save_carry ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6562) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6563) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6564)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6565) void iinc_np( EMUSHORT *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6566) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6567) EMUSHORT *inc = (EMUSHORT *)EMUSHORT_C( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6568) signed int save_carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6569)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6570) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6571)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6572) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6573) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6574) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6575) __integer_invalid_size( (__mpu_char8_t *)"iinc_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6576) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6577) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6578)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6579) /* Allocate memory and *inc = 1; *****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6580) inc = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6581) if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6582) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6583) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6584) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6585) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6586) (void)memset( (void *)inc, 0, np*SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6587) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 6588) *(inc + np - 1) = (EMUSHORT) 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6589) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 6590) *inc = (EMUSHORT) 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6591) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6592) /*************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6593)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6594) save_carry = __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 6595) iadd_np( c, a, inc, np ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6596) if( save_carry ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6597) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6598)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6599) /* FREE inc **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6600) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6601) /*********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6602) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6603)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6604)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6605) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6606) Операция DEC (декремент) [c = a - 1].
868b2b66 (kx 2024-12-20 16:11:07 +0300 6607) Воздействует на флаги: AF, OF, PF, SF, ZF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6608) Флаг CF не изменяется.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6609) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6610)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6611) void idec_8( __mpu_uint8_t *c, __mpu_uint8_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6612) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6613) __mpu_uint8_t dec = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6614) signed int save_carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6615)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6616) save_carry = __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 6617) isub_8( c, a, &dec ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6618) if( save_carry ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6619) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6620) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6621)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6622) void idec_16( __mpu_uint16_t *c, __mpu_uint16_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6623) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6624) __mpu_uint16_t dec = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6625) signed int save_carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6626)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6627) save_carry = __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 6628) isub_16( c, a, &dec ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6629) if( save_carry ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6630) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6631) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6632)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6633) void idec_32( __mpu_uint32_t *c, __mpu_uint32_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6634) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6635) __mpu_uint32_t dec = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6636) signed int save_carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6637)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6638) save_carry = __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 6639) isub_32( c, a, &dec ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6640) if( save_carry ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6641) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6642) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6643)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6644) void idec_np( EMUSHORT *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6645) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6646) EMUSHORT *dec = (EMUSHORT *)EMUSHORT_C( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6647) signed int save_carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6648)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6649) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6650)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6651) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6652) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6653) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6654) __integer_invalid_size( (__mpu_char8_t *)"idec_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6655) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6656) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6657)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6658) /* Allocate memory and *inc = 1; *****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6659) dec = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6660) if( !dec )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6661) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6662) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6663) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6664) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6665) (void)memset( (void *)dec, 0, np*SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6666) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 6667) *(dec + np - 1) = (EMUSHORT) 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6668) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 6669) *dec = (EMUSHORT) 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6670) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6671) /*************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6672)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6673) save_carry = __MFLAG(CF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 6674) isub_np( c, a, dec, np ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6675) if( save_carry ) __STC; /* set carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6676) else __CLC; /* clear carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6677)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6678) /* FREE inc **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6679) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6680) /*********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6681) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6682)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6683)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6684) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6685) Операции копирования данных CPY.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6686) Воздействует на флаги: OF, PF, SF, ZF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6687) Флаги CF, AF не изменяются.
868b2b66 (kx 2024-12-20 16:11:07 +0300 6688) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6689)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6690) /***********************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6691) Копирование равнозначных [c <= a]
868b2b66 (kx 2024-12-20 16:11:07 +0300 6692) ***********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6693)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6694) void icpy_8( __mpu_uint8_t *c, __mpu_uint8_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6695) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6696) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6697) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6698) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6699)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6700) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6701)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6702) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6703)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6704) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6705) if( *c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6706)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6707) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6708)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6709) void icpy_16( __mpu_uint16_t *c, __mpu_uint16_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6710) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6711) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6712) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6713) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6714)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6715) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6716)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6717) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6718)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6719) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6720) if( *c & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6721)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6722) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6723)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6724) void icpy_32( __mpu_uint32_t *c, __mpu_uint32_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6725) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6726) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6727) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6728) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6729)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6730) *c = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6731)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6732) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6733)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6734) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6735) if( *c & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6736)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6737) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6738)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6739) static void scpy_s2s_np( EMUSHORT *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6740) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6741) EMUSHORT *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6742) signed int zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6743) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6744)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6745) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6746) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6747) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6748)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6749) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6750) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6751)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6752) c[i] = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6753) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 6754) if( c[i] & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6755) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6756)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6757) if( c[i] ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6758) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6759)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6760) ++x; ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6761)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6762) while( i < np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6763) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6764) c[i] = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6765)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6766) if( c[i] ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6767) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6768)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6769) ++x; ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6770) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6771)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6772) if( zero ) __STZ; /* set zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6773) else __CLZ; /* clear zero flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6774)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6775) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6776)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6777) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 6778) if( c[i] & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6779) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6780) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6781)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6782)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6783) /*****************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6784) Копирование меньших в большие [short to long (s2l)]
868b2b66 (kx 2024-12-20 16:11:07 +0300 6785) *****************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 6786) /**************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6787) from 8-bit:
868b2b66 (kx 2024-12-20 16:11:07 +0300 6788) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6789) void icpy_s2l_8to16( __mpu_uint16_t *c, __mpu_uint8_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6790) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6791) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6792) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6793) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6794)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6795) *c = (__mpu_uint16_t)*a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6796)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6797) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6798)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6799) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6800) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6801)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6802) void icpy_s2l_8to32( __mpu_uint32_t *c, __mpu_uint8_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6803) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6804) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6805) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6806) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6807)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6808) *c = (__mpu_uint32_t)*a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6809)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6810) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6811)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6812) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6813) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6814)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6815) void icpy_s2l_8to_np( EMUSHORT *c, __mpu_uint8_t *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6816) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6817) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6818)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6819) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6820) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6821) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6822) __integer_invalid_size( (__mpu_char8_t *)"icpy_s2l_8to_np (to emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6823) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6824) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6825)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6826) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6827) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6828) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6829)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6830) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 6831) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6832) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 6833) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6834) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6835)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6836) c[i] = (EMUSHORT)*a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6837)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6838) if( c[i] == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6839)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6840) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 6841) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6842) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6843) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6844) c[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6845) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6846) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6847) c[i] = (EMUSHORT)0; /* i == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6848) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 6849) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6850) while( i < np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6851) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6852) c[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6853) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6854) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6855) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6856) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6857)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6858) /**************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6859) from 16-bit:
868b2b66 (kx 2024-12-20 16:11:07 +0300 6860) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6861) void icpy_s2l_16to32( __mpu_uint32_t *c, __mpu_uint16_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6862) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6863) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6864) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6865) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6866)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6867) *c = (__mpu_uint32_t)*a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6868)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6869) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6870)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6871) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6872) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6873)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6874) void icpy_s2l_16to_np( EMUSHORT *c, __mpu_uint16_t *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6875) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6876) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6877)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6878) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6879) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6880) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6881) __integer_invalid_size( (__mpu_char8_t *)"icpy_s2l_16to_np (to emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6882) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6883) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6884)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6885) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6886) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6887) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6888)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6889) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 6890) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6891) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 6892) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6893) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6894)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6895) c[i] = (EMUSHORT)*a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6896)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6897) if( c[i] == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6898)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6899) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 6900) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6901) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6902) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6903) c[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6904) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6905) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6906) c[i] = (EMUSHORT)0; /* i == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6907) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 6908) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6909) while( i < np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6910) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6911) c[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6912) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6913) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6914) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6915) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6916)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6917) /**************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6918) from 32-bit:
868b2b66 (kx 2024-12-20 16:11:07 +0300 6919) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6920) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 6921) void icpy_s2l_32to_np( EMUSHORT *c, __mpu_uint32_t *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6922) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6923) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6924)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6925) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6926) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6927) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6928) __integer_invalid_size( (__mpu_char8_t *)"icpy_s2l_32to_np (to emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6929) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6930) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6931)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6932) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6933) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6934) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6935)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6936) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 6937) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6938) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 6939) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6940) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6941)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6942) c[i] = (EMUSHORT)*a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6943)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6944) if( c[i] == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6945)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6946) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 6947) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6948) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6949) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6950) c[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6951) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6952) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6953) c[i] = (EMUSHORT)0; /* i == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6954) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 6955) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6956) while( i < np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6957) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6958) c[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6959) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6960) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6961) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6962) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6963) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6964)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6965) /***********************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 6966) from emushort; size(a) < size(c):
868b2b66 (kx 2024-12-20 16:11:07 +0300 6967) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6968) static void scpy_s2l_np( EMUSHORT *c, EMUSHORT *a, int np_c, int np_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6969) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6970) EMUSHORT *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6971) signed int zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6972) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6973)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6974) if( np_c <= np_a || np_c < 1 || np_c > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 6975) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 6976) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6977) __integer_invalid_size( (__mpu_char8_t *)"scpy_s2l_np (emushort to emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 6978) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6979) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 6980)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6981) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6982) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 6983) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6984)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6985) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 6986) x = a + np_a - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6987) i = np_c - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6988) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 6989) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6990) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6991) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 6992)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6993) c[i] = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6994)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6995) if( c[i] ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6996) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 6997)
868b2b66 (kx 2024-12-20 16:11:07 +0300 6998) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 6999) --x; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7000) /* если (np_c == np_a) то цикл бесконечен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7001) while( i >= (np_c - np_a) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7002) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7003) c[i]= *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7004)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7005) if( c[i] ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7006) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7007)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7008) --x; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7009) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7010) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7011) ++x; ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7012) while( i < np_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7013) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7014) c[i]= *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7015)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7016) if( c[i] ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7017) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7018)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7019) ++x; ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7020) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7021) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7022)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7023) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7024) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7025) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7026) c[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7027) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7028) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7029) c[i] = (EMUSHORT)0; /* i = 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7030) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7031) while( i < np_c )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7032) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7033) c[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7034) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7035) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7036) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7037)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7038) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7039) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7040) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7041)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7042)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7043) /*****************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7044) Копирование больших в меньшие [long to short (l2s)]
868b2b66 (kx 2024-12-20 16:11:07 +0300 7045) *****************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7046) /**************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7047) into 8-bit:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7048) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7049) void icpy_l2s_16to8( __mpu_uint8_t *c, __mpu_uint16_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7050) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7051) __mpu_uint16_t x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7052)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7053) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7054) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7055) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7056)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7057) x = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7058)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7059) x >>= 8;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7060) if( x ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7061)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7062) *c = (__mpu_uint8_t)*a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7063)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7064) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7065)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7066) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7067) if( *c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7068) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7069)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7070) void icpy_l2s_32to8( __mpu_uint8_t *c, __mpu_uint32_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7071) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7072) __mpu_uint32_t x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7073)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7074) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7075) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7076) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7077)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7078) x = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7079)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7080) x >>= 8;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7081) if( x ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7082)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7083) *c = (__mpu_uint8_t)*a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7084)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7085) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7086)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7087) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7088) if( *c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7089) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7090)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7091) void icpy_l2s_np_to8( __mpu_uint8_t *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7092) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7093) EMUSHORT y, *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7094) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7095)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7096) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7097) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7098) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7099) __integer_invalid_size( (__mpu_char8_t *)"icpy_l2s_np_to8 (from emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7100) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7101) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7102)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7103) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7104) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7105) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7106)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7107) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7108) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7109) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7110) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7111) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7112) y = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7113)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7114) y >>= 8;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7115) if( y ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7116)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7117) *c = (__mpu_uint8_t)*x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7118)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7119) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7120) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7121) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7122) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7123) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7124) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7125) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7126) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7127) if( *x ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7128)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7129) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7130) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7131) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7132) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7133) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7134) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7135) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7136)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7137) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7138)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7139) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7140) if( *c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7141) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7142)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7143) /**************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7144) into 16-bit:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7145) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7146) void icpy_l2s_32to16( __mpu_uint16_t *c, __mpu_uint32_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7147) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7148) __mpu_uint32_t x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7149)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7150) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7151) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7152) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7153)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7154) x = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7155)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7156) x >>= 16;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7157) if( x ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7158)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7159) *c = (__mpu_uint16_t)*a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7160)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7161) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7162)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7163) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7164) if( *c & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7165) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7166)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7167) void icpy_l2s_np_to16( __mpu_uint16_t *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7168) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7169) EMUSHORT y, *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7170) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7171)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7172) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7173) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7174) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7175) __integer_invalid_size( (__mpu_char8_t *)"icpy_l2s_np_to16 (from emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7176) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7177) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7178)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7179) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7180) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7181) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7182)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7183) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7184) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7185) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7186) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7187) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7188) y = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7189)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7190) y >>= 16;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7191) if( y ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7192)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7193) *c = (__mpu_uint16_t)*x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7194)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7195) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7196) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7197) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7198) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7199) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7200) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7201) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7202) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7203) if( *x ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7204)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7205) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7206) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7207) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7208) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7209) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7210) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7211) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7212)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7213) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7214)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7215) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7216) if( *c & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7217) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7218)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7219) /**************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7220) into 32-bit:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7221) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7222) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 7223) void icpy_l2s_np_to32( __mpu_uint32_t *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7224) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7225) EMUSHORT y, *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7226) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7227)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7228) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7229) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7230) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7231) __integer_invalid_size( (__mpu_char8_t *)"icpy_l2s_np_to32 (from emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7232) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7233) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7234)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7235) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7236) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7237) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7238)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7239) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7240) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7241) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7242) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7243) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7244) y = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7245)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7246) y >>= 32;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7247) if( y ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7248)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7249) *c = (__mpu_uint32_t)*x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7250)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7251) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7252) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7253) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7254) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7255) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7256) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7257) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7258) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7259) if( *x ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7260)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7261) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7262) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7263) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7264) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7265) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7266) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7267) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7268)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7269) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7270)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7271) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7272) if( *c & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7273) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7274) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7275)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7276) /************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7277) into emushort; size(a) >= size(c):
868b2b66 (kx 2024-12-20 16:11:07 +0300 7278) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7279) static void scpy_l2s_np( EMUSHORT *c, EMUSHORT *a, int np_c, int np_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7280) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7281) EMUSHORT *y, *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7282) signed int zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7283) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7284)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7285) if( np_a < np_c || np_a < 1 || np_a > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7286) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7287) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7288) __integer_invalid_size( (__mpu_char8_t *)"scpy_l2s_np (emushort to emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7289) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7290) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7291)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7292) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7293) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7294) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7295)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7296) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7297) x = a + np_a - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7298) y = c + np_c - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7299) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7300) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7301) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7302) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7303)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7304) *y = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7305)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7306) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7307) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7308)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7309) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7310) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7311) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7312) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7313) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7314) i = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7315) while( i < np_c )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7316) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7317) *y = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7318)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7319) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7320) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7321)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7322) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7323) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7324) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7325) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7326) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7327) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7328) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7329)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7330) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7331) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7332) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7333) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7334) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7335) if( *y & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7336)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7337) while( i < np_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7338) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7339) if( *x ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7340)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7341) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7342) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7343) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7344) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7345) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7346) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7347) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7348)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7349) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7350) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7351) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7352)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7353) /*****************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7354) Копирование ALL LONG WORD [c <== a]
868b2b66 (kx 2024-12-20 16:11:07 +0300 7355) *****************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7356) void icpy_np( EMUSHORT *c, EMUSHORT *a, int np_c, int np_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7357) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7358) if( np_a < 1 || np_c < 1 || np_a > NP_MAX || np_c > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7359) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7360) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7361) __integer_invalid_size( (__mpu_char8_t *)"icpy_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7362) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7363) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7364)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7365) if( np_c > np_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7366) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7367) scpy_s2l_np( c, a, np_c, np_a );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7368) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7369) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7370)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7371) if( np_c < np_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7372) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7373) scpy_l2s_np( c, a, np_c, np_a );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7374) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7375) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7376)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7377) if( np_c == np_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7378) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7379) scpy_s2s_np( c, a, np_a );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7380) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7381) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7382) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7383)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7384)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7385) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7386) Операции преобразования (convert) данных CVT.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7387) Воздействует на флаги: OF, PF, SF, ZF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7388) Флаги CF, AF не изменяются.
868b2b66 (kx 2024-12-20 16:11:07 +0300 7389) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7390)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7391) /*****************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7392) Преобразование равнозначных не нужно,
868b2b66 (kx 2024-12-20 16:11:07 +0300 7393) можно использовать функции копирования:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7394)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7395) void icpy_8();
868b2b66 (kx 2024-12-20 16:11:07 +0300 7396) void icpy_16();
868b2b66 (kx 2024-12-20 16:11:07 +0300 7397) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 7398) void icpy_32();
868b2b66 (kx 2024-12-20 16:11:07 +0300 7399) #endif // BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 7400) static void scpy_s2s_np();
868b2b66 (kx 2024-12-20 16:11:07 +0300 7401) *****************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7402)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7403) /********************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7404) Преобразование меньших в большие [short to long (s2l)]
868b2b66 (kx 2024-12-20 16:11:07 +0300 7405) ********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7406) /**************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7407) from 8-bit:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7408) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7409) void icvt_s2l_8to16( __mpu_uint16_t *c, __mpu_uint8_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7410) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7411) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7412) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7413) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7414)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7415) *c = (__mpu_uint16_t)*a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7416)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7417) if( *a & 0x80 ) { *c |= 0xff00; __STS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7418)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7419) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7420)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7421) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7422) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7423)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7424) void icvt_s2l_8to32( __mpu_uint32_t *c, __mpu_uint8_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7425) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7426) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7427) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7428) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7429)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7430) *c = (__mpu_uint32_t)*a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7431)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7432) if( *a & 0x80 ) { *c |= 0xffffff00; __STS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7433)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7434) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7435)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7436) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7437) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7438)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7439) void icvt_s2l_8to_np( EMUSHORT *c, __mpu_uint8_t *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7440) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7441) EMUSHORT save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7442) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7443)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7444) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7445) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7446) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7447) __integer_invalid_size( (__mpu_char8_t *)"icvt_s2l_8to_np (to emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7448) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7449) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7450)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7451) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7452) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7453) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7454)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7455) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7456) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7457) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7458) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7459) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7460)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7461) c[i] = (EMUSHORT)*a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7462)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7463) if( *a & 0x80 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7464) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7465) save_sign = (EMUSHORT)MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7466) c[i] |= (save_sign << 8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 7467) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7468) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7469)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7470) if( c[i] == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7471)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7472) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7473) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7474) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7475) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7476) c[i] = save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7477) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7478) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7479) c[i] = save_sign; /* i == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7480) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7481) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7482) while( i < np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7483) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7484) c[i] = save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7485) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7486) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7487) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7488) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7489)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7490) /**************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7491) from 16-bit:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7492) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7493) void icvt_s2l_16to32( __mpu_uint32_t *c, __mpu_uint16_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7494) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7495) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7496) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7497) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7498)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7499) *c = (__mpu_uint32_t)*a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7500)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7501) if( *a & 0x8000 ) { *c |= 0xffff0000; __STS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7502)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7503) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7504)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7505) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7506) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7507)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7508) void icvt_s2l_16to_np( EMUSHORT *c, __mpu_uint16_t *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7509) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7510) EMUSHORT save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7511) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7512)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7513) if( np == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7514) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7515) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7516) __integer_invalid_size( (__mpu_char8_t *)"icvt_s2l_16to_np (to emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7517) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7518) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7519)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7520) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7521) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7522) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7523)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7524) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7525) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7526) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7527) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7528) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7529)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7530) c[i] = (EMUSHORT)*a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7531)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7532) if( *a & 0x8000 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7533) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7534) save_sign = (EMUSHORT)MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7535) c[i] |= (save_sign << 16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 7536) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7537) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7538)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7539) if( c[i] == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7540)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7541) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7542) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7543) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7544) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7545) c[i] = save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7546) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7547) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7548) c[i] = save_sign; /* i == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7549) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7550) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7551) while( i < np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7552) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7553) c[i] = save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7554) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7555) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7556) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7557) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7558)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7559) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 7560) /**************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7561) from 32-bit:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7562) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7563) void icvt_s2l_32to_np( EMUSHORT *c, __mpu_uint32_t *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7564) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7565) EMUSHORT save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7566) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7567)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7568) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7569) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7570) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7571) __integer_invalid_size( (__mpu_char8_t *)"icvt_s2l_32to_np (to emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7572) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7573) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7574)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7575) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7576) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7577) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7578)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7579) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7580) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7581) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7582) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7583) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7584)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7585) c[i] = (EMUSHORT)*a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7586)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7587) if( *a & 0x80000000 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7588) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7589) save_sign = (EMUSHORT)MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7590) c[i] |= (save_sign << 32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 7591) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7592) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7593)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7594) if( c[i] == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7595)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7596) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7597) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7598) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7599) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7600) c[i] = save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7601) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7602) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7603) c[i] = save_sign; /* i == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7604) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7605) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7606) while( i < np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7607) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7608) c[i] = save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7609) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7610) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7611) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7612) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7613) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7614)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7615) /************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7616) from emushort; size(a) < size(c):
868b2b66 (kx 2024-12-20 16:11:07 +0300 7617) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7618) static void scvt_s2l_np( EMUSHORT *c, EMUSHORT *a, int np_c, int np_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7619) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7620) EMUSHORT *x, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7621) signed int zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7622) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7623)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7624) if( np_c <= np_a || np_c < 1 || np_c > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7625) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7626) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7627) __integer_invalid_size( (__mpu_char8_t *)"scvt_s2l_np (emushort to emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7628) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7629) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7630)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7631) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7632) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7633) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7634)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7635) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7636) x = a + np_a - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7637) i = np_c - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7638) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7639) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7640) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7641) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7642)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7643) c[i] = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7644)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7645) if( c[i] ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7646) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7647)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7648) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7649) --x; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7650) /* если (np_c == np_a) то цикл бесконечен */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7651) while( i >= (np_c - np_a) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7652) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7653) c[i]= *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7654)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7655) if( c[i] ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7656) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7657)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7658) --x; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7659) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7660) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7661) ++x; ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7662) while( i < np_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7663) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7664) c[i]= *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7665)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7666) if( c[i] ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7667) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7668)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7669) ++x; ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7670) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7671) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7672)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7673) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7674) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7675) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7676) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7677) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7678) if( *x & MASK_SIGN )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7679) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7680) save_sign = (EMUSHORT)MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7681) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7682) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7683) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7684)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7685) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7686) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7687) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7688) c[i] = save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7689) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7690) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7691) c[i] = save_sign; /* i == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7692) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7693) while( i < np_c )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7694) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7695) c[i] = save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7696) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7697) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7698) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7699)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7700) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7701) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7702) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7703)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7704)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7705) /********************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7706) Преобразование больших в меньшие [long to short (l2s)]
868b2b66 (kx 2024-12-20 16:11:07 +0300 7707) ********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 7708) /**************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7709) into 8-bit:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7710) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7711) void icvt_l2s_16to8( __mpu_uint8_t *c, __mpu_uint16_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7712) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7713) __mpu_uint16_t x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7714) signed int sign = 0, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7715)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7716) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7717) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7718) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7719)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7720) x = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7721) if( x & 0x8000 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7722) if( x & 0x80 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7723)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7724) x &= 0xff00;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7725) if( !(( save_sign && sign && (x == 0xff00)) ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 7726) (!save_sign && !sign && (x == 0))
868b2b66 (kx 2024-12-20 16:11:07 +0300 7727) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7728) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7729)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7730) *c = (__mpu_uint8_t)*a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7731)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7732) if( save_sign ) *c |= 0x80;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7733) else *c &= 0x7f;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7734)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7735) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7736)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7737) if( save_sign ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7738) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7739)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7740) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7741) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7742)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7743) void icvt_l2s_32to8( __mpu_uint8_t *c, __mpu_uint32_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7744) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7745) __mpu_uint32_t x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7746) signed int sign = 0, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7747)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7748) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7749) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7750) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7751)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7752) x = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7753) if( x & 0x80000000 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7754) if( x & 0x80 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7755)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7756) x &= 0xffffff00;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7757) if( !(( save_sign && sign && (x == 0xffffff00)) ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 7758) (!save_sign && !sign && (x == 0))
868b2b66 (kx 2024-12-20 16:11:07 +0300 7759) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7760) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7761)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7762) *c = (__mpu_uint8_t)*a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7763)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7764) if( save_sign ) *c |= 0x80;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7765) else *c &= 0x7f;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7766)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7767) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7768)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7769) if( save_sign ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7770) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7771)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7772) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7773) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7774)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7775) void icvt_l2s_np_to8( __mpu_uint8_t *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7776) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7777) EMUSHORT y, *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7778) signed int sign = 0, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7779) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7780)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7781) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7782) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7783) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7784) __integer_invalid_size( (__mpu_char8_t *)"icvt_l2s_np_to8 (from emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7785) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7786) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7787)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7788) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7789) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7790) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7791)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7792) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7793) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7794) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7795) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7796) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7797) if( *x & MASK_SIGN ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7798)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7799) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7800) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7801) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7802) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7803) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7804) y = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7805) if( y & 0x80 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7806)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7807) y &= ((EMUSHORT)MASK_ALL_BITS) << 8;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7808) if( !(( save_sign && sign &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 7809) (y == (((EMUSHORT)MASK_ALL_BITS) << 8))) ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 7810) (!save_sign && !sign && (y == 0))
868b2b66 (kx 2024-12-20 16:11:07 +0300 7811) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7812) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7813)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7814) *c = (__mpu_uint8_t)*x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7815)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7816) if( save_sign ) *c |= 0x80;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7817) else *c &= 0x7f;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7818)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7819) if( save_sign ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7820) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7821)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7822) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7823) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7824) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7825) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7826) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7827) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7828) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7829) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7830) if( !(( save_sign && sign &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 7831) (*x == ((EMUSHORT)MASK_ALL_BITS))) ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 7832) (!save_sign && !sign && (*x == 0))
868b2b66 (kx 2024-12-20 16:11:07 +0300 7833) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7834) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7835)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7836) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7837) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7838) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7839) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7840) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7841) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7842) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7843)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7844) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7845)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7846) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7847) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7848)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7849) /**************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7850) into 16-bit:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7851) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7852) void icvt_l2s_32to16( __mpu_uint16_t *c, __mpu_uint32_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7853) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7854) __mpu_uint32_t x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7855) signed int sign = 0, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7856)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7857) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7858) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7859) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7860)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7861) x = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7862) if( x & 0x80000000 ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7863) if( x & 0x8000 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7864)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7865) x &= 0xffff0000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7866) if( !(( save_sign && sign && (x == 0xffff0000)) ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 7867) (!save_sign && !sign && (x == 0))
868b2b66 (kx 2024-12-20 16:11:07 +0300 7868) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7869) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7870)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7871) *c = (__mpu_uint16_t)*a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7872)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7873) if( save_sign ) *c |= 0x8000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7874) else *c &= 0x7fff;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7875)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7876) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7877)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7878) if( save_sign ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7879) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7880)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7881) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7882) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7883)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7884) void icvt_l2s_np_to16( __mpu_uint16_t *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7885) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7886) EMUSHORT y, *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7887) signed int sign = 0, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7888) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7889)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7890) if( np == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7891) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7892) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7893) __integer_invalid_size( (__mpu_char8_t *)"icvt_l2s_np_to16 (from emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7894) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7895) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7896)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7897) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7898) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7899) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7900)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7901) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7902) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7903) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7904) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7905) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7906) if( *x & MASK_SIGN ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7907)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7908) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7909) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7910) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7911) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7912) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7913) y = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7914) if( y & 0x8000 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7915)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7916) y &= ((EMUSHORT)MASK_ALL_BITS) << 16;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7917) if( !(( save_sign && sign &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 7918) (y == (((EMUSHORT)MASK_ALL_BITS) << 16))) ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 7919) (!save_sign && !sign && (y == 0))
868b2b66 (kx 2024-12-20 16:11:07 +0300 7920) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7921) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7922)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7923) *c = (__mpu_uint16_t)*x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7924)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7925) if( save_sign ) *c |= 0x8000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7926) else *c &= 0x7fff;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7927)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7928) if( save_sign ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7929) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7930)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7931) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7932) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7933) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7934) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7935) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7936) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7937) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7938) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7939) if( !(( save_sign && sign &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 7940) (*x == ((EMUSHORT)MASK_ALL_BITS))) ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 7941) (!save_sign && !sign && (*x == 0))
868b2b66 (kx 2024-12-20 16:11:07 +0300 7942) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7943) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7944)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7945) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7946) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7947) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7948) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7949) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7950) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7951) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7952)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7953) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7954)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7955) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7956) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7957)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7958) /**************
868b2b66 (kx 2024-12-20 16:11:07 +0300 7959) into 32-bit:
868b2b66 (kx 2024-12-20 16:11:07 +0300 7960) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7961) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 7962) void icvt_l2s_np_to32( __mpu_uint32_t *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7963) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7964) EMUSHORT y, *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7965) signed int sign = 0, save_sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7966) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7967)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7968) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7969) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 7970) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7971) __integer_invalid_size( (__mpu_char8_t *)"icvt_l2s_np_to32 (from emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 7972) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7973) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 7974)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7975) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7976) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 7977) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7978)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7979) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7980) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7981) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7982) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7983) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7984) if( *x & MASK_SIGN ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7985)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7986) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 7987) x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7988) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 7989) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7990) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 7991) y = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7992) if( y & 0x80000000 ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7993)
868b2b66 (kx 2024-12-20 16:11:07 +0300 7994) y &= ((EMUSHORT)MASK_ALL_BITS) << 32;
868b2b66 (kx 2024-12-20 16:11:07 +0300 7995) if( !(( save_sign && sign &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 7996) (y == (((EMUSHORT)MASK_ALL_BITS) << 32))) ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 7997) (!save_sign && !sign && (y == 0))
868b2b66 (kx 2024-12-20 16:11:07 +0300 7998) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 7999) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8000)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8001) *c = (__mpu_uint32_t)*x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8002)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8003) if( save_sign ) *c |= 0x80000000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8004) else *c &= 0x7fffffff;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8005)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8006) if( save_sign ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8007) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8008)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8009) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 8010) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8011) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 8012) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8013) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 8014) i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8015) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8016) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8017) if( !(( save_sign && sign &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 8018) (*x == ((EMUSHORT)MASK_ALL_BITS))) ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 8019) (!save_sign && !sign && (*x == 0))
868b2b66 (kx 2024-12-20 16:11:07 +0300 8020) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8021) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8022)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8023) #if MPU_WORD_ORDER_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 8024) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8025) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 8026) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8027) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 8028) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8029) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8030)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8031) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8032)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8033) if( *c == 0 ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8034) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8035) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8036)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8037) /************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8038) into emushort; size(a) >= size(c):
868b2b66 (kx 2024-12-20 16:11:07 +0300 8039) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8040) static void scvt_l2s_np( EMUSHORT *c, EMUSHORT *a, int np_c, int np_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8041) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8042) EMUSHORT *y, *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8043) signed int sign = 0, save_sign = 0, zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8044) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8045)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8046) if( np_a < np_c || np_a < 1 || np_a > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8047) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8048) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8049) __integer_invalid_size( (__mpu_char8_t *)"scvt_l2s_np (emushort to emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8050) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8051) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8052)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8053) /* AF (aux carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8054) /* CF (carry) = 0; Не определяем. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8055) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8056)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8057) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 8058) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8059) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 8060) x = a + np_a - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8061) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 8062) if( *x & MASK_SIGN ) save_sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8063)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8064) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 8065) x = a + np_a - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8066) y = c + np_c - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8067) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 8068) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8069) y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8070) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 8071)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8072) *y = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8073)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8074) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8075) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8076)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8077) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 8078) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8079) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 8080) i = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8081) while( i < np_c )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8082) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8083) *y = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8084)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8085) if( *y ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8086) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8087)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8088) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 8089) --x; --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8090) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 8091) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8092) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 8093) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8094) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8095)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8096) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 8097) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8098) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 8099) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8100) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 8101) if( *x & MASK_SIGN ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8102)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8103) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 8104) ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8105) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 8106) --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8107) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 8108) if( save_sign )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8109) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8110) *y |= ((EMUSHORT)MASK_ALL_BITS) <<
868b2b66 (kx 2024-12-20 16:11:07 +0300 8111) (BITS_PER_EMUSHORT-1);
868b2b66 (kx 2024-12-20 16:11:07 +0300 8112) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8113) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8114) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 8115) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8116) *y &= ((EMUSHORT)MASK_ALL_BITS) >> 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8117) zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8118) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8119)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8120) if( save_sign ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8121) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8122)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8123) while( i < np_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8124) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8125) if( !(( save_sign && sign &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 8126) (*x == ((EMUSHORT)MASK_ALL_BITS))) ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 8127) (!save_sign && !sign && (*x == 0))
868b2b66 (kx 2024-12-20 16:11:07 +0300 8128) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8129) ) __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8130)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8131) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 8132) --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8133) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 8134) ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8135) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 8136) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8137) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8138)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8139) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8140) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8141) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8142)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8143) /*****************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8144) Преобразование ALL LONG WORD [c <== a].
868b2b66 (kx 2024-12-20 16:11:07 +0300 8145) *****************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8146) void icvt_np( EMUSHORT *c, EMUSHORT *a, int np_c, int np_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8147) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8148) if( np_a < 1 || np_c < 1 || np_a > NP_MAX || np_c > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8149) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8150) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8151) __integer_invalid_size( (__mpu_char8_t *)"icvt_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8152) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8153) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8154)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8155) if( np_c > np_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8156) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8157) scvt_s2l_np( c, a, np_c, np_a );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8158) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8159) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8160)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8161) if( np_c < np_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8162) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8163) scvt_l2s_np( c, a, np_c, np_a );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8164) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8165) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8166)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8167) if( np_c == np_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8168) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8169) scpy_s2s_np( c, a, np_a );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8170) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8171) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8172) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8173)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8174)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8175) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8176) Операция XCHG (замена) [a <==> b].
868b2b66 (kx 2024-12-20 16:11:07 +0300 8177) Не изменяет флаги.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8178) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8179)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8180) void ixchg_8( __mpu_uint8_t *a, __mpu_uint8_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8181) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8182) __mpu_uint8_t xchg;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8183)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8184) xchg = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8185) *a = *b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8186) *b = xchg;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8187) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8188)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8189) void ixchg_16( __mpu_uint16_t *a, __mpu_uint16_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8190) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8191) __mpu_uint16_t xchg;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8192)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8193) xchg = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8194) *a = *b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8195) *b = xchg;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8196) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8197)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8198) void ixchg_32( __mpu_uint32_t *a, __mpu_uint32_t *b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8199) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8200) __mpu_uint32_t xchg;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8201)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8202) xchg = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8203) *a = *b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8204) *b = xchg;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8205) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8206)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8207) void ixchg_np( EMUSHORT *a, EMUSHORT *b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8208) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8209) EMUSHORT xchg, *y, *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8210) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8211)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8212) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8213) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8214) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8215) __integer_invalid_size( (__mpu_char8_t *)"ixchg_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8216) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8217) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8218)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8219) x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8220) y = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8221) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8222)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8223) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8224) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8225) xchg = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8226) *x = *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8227) *y = xchg;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8228)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8229) ++x; ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8230) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8231) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8232) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8233)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8234)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8235) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8236) Операции беззнакового и знакового умножения.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8237) Изменяет флаги: CF, AF=0, PF, ZF, SF, OF, RF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8238) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8239)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8240) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8241) Операция беззнакового умножения MUL.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8242) Изменяет флаги: CF, AF=0, PF, ZF, SF, OF, RF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8243) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8244) /*********************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8245) prod - произведение
868b2b66 (kx 2024-12-20 16:11:07 +0300 8246) num - множимое
868b2b66 (kx 2024-12-20 16:11:07 +0300 8247) mul - множитель
868b2b66 (kx 2024-12-20 16:11:07 +0300 8248) *********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8249) void imul_8( __mpu_uint16_t *prod, __mpu_uint8_t *num, __mpu_uint8_t *mul )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8250) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8251) __mpu_uint16_t pcpy = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8252) signed int i, k, shifts = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8253)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8254) icpy_s2l_8to16( &pcpy, num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8255)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8256) *prod = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8257)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8258) k = BITS_PER_BYTE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8259)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8260) for( i = 0; i < k; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8261) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8262) if( (*mul >> ((i)&(BITS_PER_BYTE-1)))&1 /*BIT(&mul,i)*/ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8263) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8264) ishln_16( &pcpy, &pcpy, shifts );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8265) iadd_16( prod, prod, &pcpy ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8266)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8267) shifts = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8268) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8269) else ++shifts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8270)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8271) } /* End of for( i = 0; i < k; ++i ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8272)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8273) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8274) /* flags:
868b2b66 (kx 2024-12-20 16:11:07 +0300 8275) CF - Carry Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8276) OF - Overflow Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8277) SF - Sign Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8278) PF - Parity Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8279) ZF - Zero Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8280) VF - Invalid Flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 8281) are Correct after last iadd_16 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8282)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8283) /* set RF (major/remainder) flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8284) if( *prod >> 8 ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8285) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8286) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8287)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8288) void imul_16( __mpu_uint32_t *prod, __mpu_uint16_t *num, __mpu_uint16_t *mul )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8289) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8290) __mpu_uint32_t pcpy = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8291) signed int i, k, shifts = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8292)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8293) icpy_s2l_16to32( &pcpy, num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8294)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8295) *prod = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8296)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8297) k = BITS_PER_TWO_BYTES;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8298)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8299) for( i = 0; i < k; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8300) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8301) if( (*mul >> ((i)&(BITS_PER_TWO_BYTES-1)))&1 /*BIT(&mul,i)*/ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8302) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8303) ishln_32( &pcpy, &pcpy, shifts );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8304) iadd_32( prod, prod, &pcpy ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8305)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8306) shifts = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8307) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8308) else ++shifts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8309)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8310) } /* End of for( i = 0; i < k; ++i ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8311)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8312) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8313) /* flags:
868b2b66 (kx 2024-12-20 16:11:07 +0300 8314) CF - Carry Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8315) OF - Overflow Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8316) SF - Sign Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8317) PF - Parity Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8318) ZF - Zero Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8319) VF - Invalid Flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 8320) are Correct after last iadd_32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8321)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8322) /* set RF (major/remainder) flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8323) if( *prod >> 16 ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8324) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8325) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8326)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8327) #if BITS_PER_EMUSHORT > 32 /* 64 bits only */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8328) void imul_32( __mpu_uint64_t *prod, __mpu_uint32_t *num, __mpu_uint32_t *mul )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8329) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8330) __mpu_uint64_t pcpy = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8331) signed int i, k, shifts = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8332)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8333) icpy_s2l_32to_np( (EMUSHORT *)(&pcpy), num, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8334) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 8335) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 8336) Размер EMUSHORT в зависимости от машины может принимать
868b2b66 (kx 2024-12-20 16:11:07 +0300 8337) значения 32, 64, 128, ...
868b2b66 (kx 2024-12-20 16:11:07 +0300 8338) Если BITS_PER_EMUSHORT > 32,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8339) То между директивами препроцессора
868b2b66 (kx 2024-12-20 16:11:07 +0300 8340) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 8341) #endif // BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 8342) мы рассматриваем случай когда BITS_PER_EMUSHORT == 64,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8343) а размер __mpu_uint64_t всегда 64 бита.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8344)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8345) Следовательно здесь размеры BITS_PER_EMUSHORT и
868b2b66 (kx 2024-12-20 16:11:07 +0300 8346) __mpu_uint64_t равны;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8347) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8348)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8349) *prod = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8350)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8351) k = BITS_PER_FOUR_BYTES;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8352)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8353) for( i = 0; i < k; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8354) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8355) if( (*mul >> ((i)&(BITS_PER_FOUR_BYTES-1)))&1 /*BIT(&mul,i)*/ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8356) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8357) ishln_np( (EMUSHORT *)(&pcpy),
868b2b66 (kx 2024-12-20 16:11:07 +0300 8358) (EMUSHORT *)(&pcpy), shifts,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8359) 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8360) iadd_np( (EMUSHORT *)prod,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8361) (EMUSHORT *)prod,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8362) (EMUSHORT *)(&pcpy),
868b2b66 (kx 2024-12-20 16:11:07 +0300 8363) 1 ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8364)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8365) shifts = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8366) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8367) else ++shifts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8368)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8369) } /* End of for( i = 0; i < k; ++i ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8370)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8371) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8372) /* flags:
868b2b66 (kx 2024-12-20 16:11:07 +0300 8373) CF - Carry Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8374) OF - Overflow Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8375) SF - Sign Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8376) PF - Parity Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8377) ZF - Zero Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8378) VF - Invalid Flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 8379) are Correct after last iadd_np (emushort) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8380)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8381) /* set RF (major/remainder) flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8382) if( *prod >> 32 ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8383) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8384)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8385) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8386) Проверить работу функции на 32 разрядной машине
868b2b66 (kx 2024-12-20 16:11:07 +0300 8387) можно если вместо размера 1 в функциях:
868b2b66 (kx 2024-12-20 16:11:07 +0300 8388) icpy_s2l_32to_np,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8389) ishln_np,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8390) iadd_np
868b2b66 (kx 2024-12-20 16:11:07 +0300 8391) поставить
868b2b66 (kx 2024-12-20 16:11:07 +0300 8392) 64 / BITS_PER_EMUSHORT,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8393) и убрать директивы условной компиляции, в которые
868b2b66 (kx 2024-12-20 16:11:07 +0300 8394) заключена данная функция.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8395) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8396) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8397) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8398)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8399)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8400) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8401) Операция знакового умножения SMUL.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8402) Изменяет флаги: CF, AF=0, PF, ZF, SF, OF, RF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8403) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8404)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8405) void ismul_8( __mpu_uint16_t *prod, __mpu_uint8_t *num, __mpu_uint8_t *mul )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8406) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8407) __mpu_uint16_t pcpy_num = 0, pcpy_mul = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8408) signed int sign_num = 0, sign_mul = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8409) signed int i, k, shifts = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8410)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8411) if( *num & 0x80 ) sign_num = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8412) if( *mul & 0x80 ) sign_mul = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8413)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8414) icvt_s2l_8to16( &pcpy_num, num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8415) icvt_s2l_8to16( &pcpy_mul, mul );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8416)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8417) *prod = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8418)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8419) if( sign_num ) ineg_16( &pcpy_num, &pcpy_num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8420) if( sign_mul ) ineg_16( &pcpy_mul, &pcpy_mul );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8421)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8422) k = BITS_PER_BYTE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8423)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8424) for( i = 0; i < k; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8425) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8426) if( (pcpy_mul >> ((i)&(BITS_PER_BYTE-1)))&1 /*BIT(&mul,i)*/ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8427) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8428) ishln_16( &pcpy_num, &pcpy_num, shifts );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8429) iadd_16( prod, prod, &pcpy_num ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8430)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8431) shifts = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8432) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8433) else ++shifts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8434)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8435) } /* End of for( i = 0; i < k; ++i ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8436)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8437) /* set RF (major/remainder) flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8438) if( *prod >> 7 ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8439) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8440)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8441) if( sign_num ^ sign_mul ) ineg_16( prod, prod );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8442)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8443) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8444) /* flags:
868b2b66 (kx 2024-12-20 16:11:07 +0300 8445) CF - Carry Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8446) OF - Overflow Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8447) SF - Sign Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8448) PF - Parity Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8449) ZF - Zero Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8450) VF - Invalid Flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 8451) are Correct after last iadd_16 or ineg_16 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8452)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8453) /* if( OF ) RF (major/remainder) is Not Correct */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8454) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8455)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8456) void ismul_16( __mpu_uint32_t *prod, __mpu_uint16_t *num, __mpu_uint16_t *mul )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8457) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8458) __mpu_uint32_t pcpy_num = 0, pcpy_mul = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8459) signed int sign_num = 0, sign_mul = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8460) signed int i, k, shifts = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8461)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8462) if( *num & 0x8000 ) sign_num = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8463) if( *mul & 0x8000 ) sign_mul = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8464)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8465) icvt_s2l_16to32( &pcpy_num, num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8466) icvt_s2l_16to32( &pcpy_mul, mul );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8467)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8468) *prod = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8469)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8470) if( sign_num ) ineg_32( &pcpy_num, &pcpy_num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8471) if( sign_mul ) ineg_32( &pcpy_mul, &pcpy_mul );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8472)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8473) k = BITS_PER_TWO_BYTES;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8474)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8475) for( i = 0; i < k; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8476) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8477) if( (pcpy_mul >> ((i)&(BITS_PER_TWO_BYTES-1)))&1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8478) { /*BIT(&mul,i)*/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8479) ishln_32( &pcpy_num, &pcpy_num, shifts );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8480) iadd_32( prod, prod, &pcpy_num ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8481)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8482) shifts = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8483) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8484) else ++shifts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8485)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8486) } /* End of for( i = 0; i < k; ++i ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8487)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8488) /* set RF (major/remainder) flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8489) if( *prod >> 15 ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8490) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8491)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8492) if( sign_num ^ sign_mul ) ineg_32( prod, prod );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8493)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8494) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8495) /* flags:
868b2b66 (kx 2024-12-20 16:11:07 +0300 8496) CF - Carry Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8497) OF - Overflow Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8498) SF - Sign Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8499) PF - Parity Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8500) ZF - Zero Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8501) VF - Invalid Flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 8502) are Correct after last iadd_32 or ineg_32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8503)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8504) /* if( OF ) RF (major/remainder) is Not Correct */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8505) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8506)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8507) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 8508) void ismul_32( __mpu_uint64_t *prod, __mpu_uint32_t *num, __mpu_uint32_t *mul )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8509) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8510) __mpu_uint64_t pcpy_num = 0, pcpy_mul = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8511) signed int sign_num = 0, sign_mul = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8512) signed int i, k, shifts = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8513)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8514) if( *num & 0x80000000 ) sign_num = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8515) if( *mul & 0x80000000 ) sign_mul = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8516)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8517) icvt_s2l_32to_np( (EMUSHORT *)(&pcpy_num), num, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8518) icvt_s2l_32to_np( (EMUSHORT *)(&pcpy_mul), mul, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8519) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 8520) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 8521) Размер EMUSHORT в зависимости от машины может принимать
868b2b66 (kx 2024-12-20 16:11:07 +0300 8522) значения 32, 64, 128, ...
868b2b66 (kx 2024-12-20 16:11:07 +0300 8523) Если BITS_PER_EMUSHORT > 32,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8524) То между директивами препроцессора
868b2b66 (kx 2024-12-20 16:11:07 +0300 8525) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 8526) #endif // BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 8527) мы рассматриваем случай когда BITS_PER_EMUSHORT == 64,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8528) а размер __mpu_uint64_t всегда 64 бита.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8529)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8530) Следовательно здесь размеры BITS_PER_EMUSHORT и
868b2b66 (kx 2024-12-20 16:11:07 +0300 8531) __mpu_uint64_t равны;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8532) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8533)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8534) *prod = (__mpu_uint64_t)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8535)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8536) if( sign_num ) ineg_np( (EMUSHORT *)(&pcpy_num),
868b2b66 (kx 2024-12-20 16:11:07 +0300 8537) (EMUSHORT *)(&pcpy_num), 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8538) if( sign_mul ) ineg_np( (EMUSHORT *)(&pcpy_mul),
868b2b66 (kx 2024-12-20 16:11:07 +0300 8539) (EMUSHORT *)(&pcpy_mul), 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8540)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8541) k = BITS_PER_FOUR_BYTES;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8542)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8543) for( i = 0; i < k; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8544) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8545) if( (pcpy_mul >> ((i)&(BITS_PER_FOUR_BYTES-1)))&1 /*BIT(&mul,i)*/ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8546) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8547) ishln_np( (EMUSHORT *)(&pcpy_num),
868b2b66 (kx 2024-12-20 16:11:07 +0300 8548) (EMUSHORT *)(&pcpy_num),
868b2b66 (kx 2024-12-20 16:11:07 +0300 8549) shifts, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8550) iadd_np( (EMUSHORT *)prod,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8551) (EMUSHORT *)prod,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8552) (EMUSHORT *)(&pcpy_num),
868b2b66 (kx 2024-12-20 16:11:07 +0300 8553) 1 ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8554)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8555) shifts = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8556) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8557) else ++shifts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8558)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8559) } /* End of for( i = 0; i < k; ++i ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8560)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8561) /* set RF (major/remainder) flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8562) if( *prod >> 31 ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8563) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8564)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8565) if( sign_num ^ sign_mul )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8566) ineg_np( (EMUSHORT *)prod, (EMUSHORT *)prod, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8567)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8568) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8569) /* flags:
868b2b66 (kx 2024-12-20 16:11:07 +0300 8570) CF - Carry Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8571) OF - Overflow Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8572) SF - Sign Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8573) PF - Parity Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8574) ZF - Zero Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8575) VF - Invalid Flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 8576) are Correct after last iadd_np (emushort) or ineg_np (prod) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8577)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8578) /* if( OF ) RF (major/remainder) is Not Correct */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8579)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8580) /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8581) Проверить работу функции на 32 разрядной машине
868b2b66 (kx 2024-12-20 16:11:07 +0300 8582) можно если вместо размера 1 в функциях:
868b2b66 (kx 2024-12-20 16:11:07 +0300 8583) icvt_s2l_32to_np,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8584) ishln_np,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8585) iadd_np,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8586) ineg_np
868b2b66 (kx 2024-12-20 16:11:07 +0300 8587) поставить
868b2b66 (kx 2024-12-20 16:11:07 +0300 8588) 64 / BITS_PER_EMUSHORT,
868b2b66 (kx 2024-12-20 16:11:07 +0300 8589) и убрать директивы условной компиляции, в которые
868b2b66 (kx 2024-12-20 16:11:07 +0300 8590) заключена данная функция.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8591) ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8592) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8593) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8594)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8595)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8596) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8597) Операции беззнакового и знакового деления.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8598) Изменяет флаги: CF, AF=0, PF, ZF, SF, OF, RF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8599) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8600)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8601) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8602) Операция беззнакового деления DIV.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8603) Изменяет флаги: CF, AF=0, PF, ZF, SF, OF, RF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8604) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8605) /*****************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8606) quot - частное
868b2b66 (kx 2024-12-20 16:11:07 +0300 8607) rem - остаток
868b2b66 (kx 2024-12-20 16:11:07 +0300 8608) num - делимое
868b2b66 (kx 2024-12-20 16:11:07 +0300 8609) den - делитель
868b2b66 (kx 2024-12-20 16:11:07 +0300 8610) *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8611) void idiv_8( __mpu_uint8_t *quot, __mpu_uint8_t *rem, __mpu_uint8_t *num, __mpu_uint8_t *den )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8612) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8613) __mpu_uint8_t cpy_num = 0, cpy_den = 0, j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8614) signed int i, k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8615) int b, bnum, bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8616)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8617) cpy_num = *num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8618) cpy_den = *den;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8619)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8620) *quot = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8621) *rem = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8622)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8623) b = BITS_PER_BYTE - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8624) while( !((cpy_num >> ((b)&(BITS_PER_BYTE-1)))&1) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 8625) b != (-1) ) --b; /* !BIT(cpy_num,b) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8626) bnum = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8627)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8628) if( bnum == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8629) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8630) /* dividend == 0 (делимое == 0); ==> qout = 0; rem = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8631)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8632) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8633) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8634)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8635) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8636) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8637)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8638) b = BITS_PER_BYTE - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8639) while( !((cpy_den >> ((b)&(BITS_PER_BYTE-1)))&1) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 8640) b != (-1) ) --b; /* !BIT(cpy_den,b) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8641) bden = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8642)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8643) if( bden == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8644) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8645) /* DIVISION BY ZERO */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8646)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8647) /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8648) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8649)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8650) *rem = cpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8651) if( *rem ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8652) else __CLR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8653)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8654) *quot = 0xff;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8655)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8656) __STC; __STO; __STS; __STP; /* __MPARITY(ff) == 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8657)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8658) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8659) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8660)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8661) if( bnum < bden )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8662) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8663) /* num < den; ==> qout = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8664)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8665) /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8666) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8667)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8668) *rem = cpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8669) if( *rem ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8670) else __CLR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8671)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8672) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8673)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8674) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8675) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8676)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8677) k = bnum - bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8678)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8679) ishln_8( &cpy_den, &cpy_den, k ); /* value(k) my be zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8680)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8681) ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8682)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8683) for( i = 0; i < k; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8684) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8685) icmp_8( &cpy_num, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8686) if( !__MFLAG(SF) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8687) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8688) isub_8( &cpy_num, &cpy_num, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8689) j = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8690) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8691) else j = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8692)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8693) ishl_8( quot, quot ); /* shift to 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8694) *quot |= j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8695)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8696) ishr_8( &cpy_den, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8697) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8698)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8699) if( __MPARITY(*quot) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8700) else __CLP; /* clear parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8701)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8702) if( *quot ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8703) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8704)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8705) if( *quot & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8706) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8707)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8708) if( __MFLAG(SF) ) __STO; /* warning */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8709) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8710)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8711) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8712) __CLC; /* carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8713)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8714) __CLV; /* clear invalid flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8715)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8716) /* copy cpy_num to rem */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8717) *rem = cpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8718) if( *rem ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8719) else __CLR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8720) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8721)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8722) void idiv_16( __mpu_uint16_t *quot, __mpu_uint16_t *rem, __mpu_uint16_t *num, __mpu_uint16_t *den )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8723) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8724) __mpu_uint16_t cpy_num = 0, cpy_den = 0, j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8725) signed int i, k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8726) int b, bnum, bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8727)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8728) cpy_num = *num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8729) cpy_den = *den;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8730)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8731) *quot = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8732) *rem = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8733)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8734) b = BITS_PER_TWO_BYTES - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8735) while( !((cpy_num >> ((b)&(BITS_PER_TWO_BYTES-1)))&1) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 8736) b != (-1) ) --b; /* !BIT(cpy_num,b) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8737) bnum = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8738)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8739) if( bnum == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8740) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8741) /* dividend == 0 (делимое == 0); ==> qout = 0; rem = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8742)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8743) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8744) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8745)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8746) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8747) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8748)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8749) b = BITS_PER_TWO_BYTES - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8750) while( !((cpy_den >> ((b)&(BITS_PER_TWO_BYTES-1)))&1) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 8751) b != (-1) ) --b; /* !BIT(cpy_den,b) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8752) bden = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8753)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8754) if( bden == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8755) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8756) /* DIVISION BY ZERO */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8757)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8758) /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8759) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8760)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8761) *rem = cpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8762) if( *rem ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8763) else __CLR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8764)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8765) *quot = 0xffff;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8766)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8767) __STC; __STO; __STS; __STP; /* __MPARITY(ff) == 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8768)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8769) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8770) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8771)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8772) if( bnum < bden )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8773) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8774) /* num < den; ==> qout = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8775)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8776) /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8777) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8778)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8779) *rem = cpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8780) if( *rem ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8781) else __CLR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8782)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8783) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8784)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8785) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8786) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8787)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8788) k = bnum - bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8789)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8790) ishln_16( &cpy_den, &cpy_den, k ); /* value(k) my be zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8791)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8792) ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8793)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8794) for( i = 0; i < k; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8795) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8796) icmp_16( &cpy_num, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8797) if( !__MFLAG(SF) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8798) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8799) isub_16( &cpy_num, &cpy_num, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8800) j = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8801) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8802) else j = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8803)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8804) ishl_16( quot, quot ); /* shift to 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8805) *quot |= j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8806)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8807) ishr_16( &cpy_den, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8808) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8809)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8810) if( __MPARITY(*quot) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8811) else __CLP; /* clear parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8812)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8813) if( *quot ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8814) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8815)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8816) if( *quot & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8817) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8818)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8819) if( __MFLAG(SF) ) __STO; /* warning */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8820) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8821)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8822) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8823) __CLC; /* carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8824)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8825) __CLV; /* clear invalid flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8826)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8827) /* copy cpy_num to rem */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8828) *rem = cpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8829) if( *rem ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8830) else __CLR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8831) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8832)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8833) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 8834) void idiv_32( __mpu_uint32_t *quot, __mpu_uint32_t *rem, __mpu_uint32_t *num, __mpu_uint32_t *den )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8835) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8836) __mpu_uint32_t cpy_num = 0, cpy_den = 0, j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8837) signed int i, k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8838) int b, bnum, bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8839)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8840) cpy_num = *num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8841) cpy_den = *den;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8842)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8843) *quot = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8844) *rem = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8845)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8846) b = BITS_PER_FOUR_BYTES - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8847) while( !((cpy_num >> ((b)&(BITS_PER_FOUR_BYTES-1)))&1) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 8848) b != (-1) ) --b; /* !BIT(cpy_num,b) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8849) bnum = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8850)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8851) if( bnum == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8852) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8853) /* dividend == 0 (делимое == 0); ==> qout = 0; rem = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8854)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8855) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8856) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8857)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8858) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8859) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8860)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8861) b = BITS_PER_FOUR_BYTES - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8862) while( !((cpy_den >> ((b)&(BITS_PER_FOUR_BYTES-1)))&1) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 8863) b != (-1) ) --b; /* !BIT(cpy_den,b) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8864) bden = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8865)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8866) if( bden == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8867) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8868) /* DIVISION BY ZERO */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8869)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8870) /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8871) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8872)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8873) *rem = cpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8874) if( *rem ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8875) else __CLR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8876)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8877) *quot = 0xffffffff;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8878)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8879) __STC; __STO; __STS; __STP; /* __MPARITY(ff) == 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8880)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8881) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8882) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8883)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8884) if( bnum < bden )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8885) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8886) /* num < den; ==> qout = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8887)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8888) /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8889) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8890)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8891) *rem = cpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8892) if( *rem ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8893) else __CLR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8894)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8895) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8896)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8897) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8898) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8899)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8900) k = bnum - bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8901)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8902) ishln_32( &cpy_den, &cpy_den, k ); /* value(k) my be zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8903)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8904) ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8905)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8906) for( i = 0; i < k; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8907) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8908) icmp_32( &cpy_num, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8909) if( !__MFLAG(SF) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8910) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8911) isub_32( &cpy_num, &cpy_num, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8912) j = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8913) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8914) else j = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8915)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8916) ishl_32( quot, quot ); /* shift to 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8917) *quot |= j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8918)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8919) ishr_32( &cpy_den, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8920) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8921)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8922) if( __MPARITY(*quot) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8923) else __CLP; /* clear parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8924)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8925) if( *quot ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8926) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8927)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8928) if( *quot & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8929) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8930)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8931) if( __MFLAG(SF) ) __STO; /* warning */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8932) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8933)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8934) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8935) __CLC; /* carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8936)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8937) __CLV; /* clear invalid flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8938)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8939) /* copy cpy_num to rem */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8940) *rem = cpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8941) if( *rem ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8942) else __CLR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8943) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8944) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8945)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8946)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8947) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 8948) Операция знакового деления SDIV.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8949) Изменяет флаги: CF, AF=0, PF, ZF, SF, OF, RF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 8950) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 8951)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8952) void isdiv_8( __mpu_uint8_t *quot, __mpu_uint8_t *rem, __mpu_uint8_t *num, __mpu_uint8_t *den )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8953) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8954) __mpu_uint8_t cpy_num = 0, cpy_den = 0, j = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8955) signed int sign_num = 0, sign_den = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8956) signed int i, k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8957) int b, bnum, bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8958)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8959) if( *num & 0x80 ) sign_num = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8960) if( *den & 0x80 ) sign_den = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8961)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8962) cpy_num = *num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8963) cpy_den = *den;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8964)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8965) *quot = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8966) *rem = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8967)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8968) if( sign_num ) ineg_8( &cpy_num, &cpy_num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8969) if( sign_den ) ineg_8( &cpy_den, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8970)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8971)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8972) b = BITS_PER_BYTE - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8973) while( !((cpy_num >> ((b)&(BITS_PER_BYTE-1)))&1) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 8974) b != (-1) ) --b; /* !BIT(cpy_num,b) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8975) bnum = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8976)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8977) if( bnum == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8978) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8979) /* dividend == 0 (делимое == 0); ==> qout = 0; rem = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8980)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8981) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8982) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8983)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8984) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8985) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 8986)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8987) b = BITS_PER_BYTE - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8988) while( !((cpy_den >> ((b)&(BITS_PER_BYTE-1)))&1) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 8989) b != (-1) ) --b; /* !BIT(cpy_den,b) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8990) bden = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8991)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8992) if( bden == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 8993) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 8994) /* DIVISION BY ZERO */
868b2b66 (kx 2024-12-20 16:11:07 +0300 8995)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8996) if( sign_num ) ineg_8( &cpy_num, &cpy_num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 8997)
868b2b66 (kx 2024-12-20 16:11:07 +0300 8998) *rem = cpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 8999) if( *rem ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9000) else __CLR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9001)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9002) if( !sign_num ) j = 0xff;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9003) *quot = j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9004)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9005) if( !sign_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9006) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9007) *quot ^= 0x80;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9008) __CLS; /* Sign Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9009) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9010) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9011) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9012) *quot |= 0x80;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9013) __STS; /* Sign Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9014) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9015)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9016) if( __MPARITY(*quot) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9017) else __CLP; /* clear parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9018)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9019) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9020) __STC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9021) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9022) __CLZ; /* Zero Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9023) __CLV; /* Invalid Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9024)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9025) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9026) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9027)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9028) if( bnum < bden )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9029) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9030) /* num < den; ==> qout = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9031)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9032) *rem = cpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9033) if( *rem ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9034) else __CLR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9035)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9036) if( sign_num ^ sign_den ) ineg_8( rem, rem );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9037)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9038) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9039) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9040) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9041) __CLS; /* Sign Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9042) __STZ; /* Zero Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9043) __CLV; /* Invalid Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9044)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9045) __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9046)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9047) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9048) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9049)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9050) k = bnum - bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9051)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9052) ishln_8( &cpy_den, &cpy_den, k ); /* value(k) my be zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9053)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9054) ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9055)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9056) for( i = 0; i < k; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9057) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9058) icmp_8( &cpy_num, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9059) if( !__MFLAG(SF) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9060) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9061) isub_8( &cpy_num, &cpy_num, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9062) j = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9063) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9064) else j = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9065)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9066) ishl_8( quot, quot ); /* shift to 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9067) *quot |= j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9068)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9069) ishr_8( &cpy_den, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9070) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9071)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9072) /* copy cpy_num to rem */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9073) *rem = cpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9074) if( *rem ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9075) else __CLR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9076)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9077) if( sign_num ^ sign_den )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9078) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9079) ineg_8( rem, rem );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9080) ineg_8( quot, quot );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9081)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9082) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9083) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9084)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9085) if( __MFLAG(SF) == (sign_num ^ sign_den) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9086) /* if( Correct result Sign ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9087) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9088)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9089) /* flags:
868b2b66 (kx 2024-12-20 16:11:07 +0300 9090) OF - Overflow Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9091) SF - Sign Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9092) PF - Parity Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9093) ZF - Zero Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9094) VF - Invalid Flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 9095) are Correct after last ineg_8() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9096)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9097) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9098) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9099)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9100) /* z = quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9101) if( __MPARITY(*quot) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9102) else __CLP; /* clear parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9103)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9104) if( *quot ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9105) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9106)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9107) if( *quot & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9108) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9109)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9110) if( __MFLAG(SF) ) __STO; /* warning */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9111) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9112) /* т.к. здесь идет речь о положительных числах
868b2b66 (kx 2024-12-20 16:11:07 +0300 9113) (именно в их знаковом представлении 011111)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9114) наличие 1 в старшем разряде недопустимо */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9115)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9116) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9117) __CLC; /* carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9118)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9119) __CLV; /* clear invalid flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9120) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9121)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9122) void isdiv_16( __mpu_uint16_t *quot, __mpu_uint16_t *rem, __mpu_uint16_t *num, __mpu_uint16_t *den )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9123) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9124) __mpu_uint16_t cpy_num = 0, cpy_den = 0, j = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9125) signed int sign_num = 0, sign_den = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9126) signed int i, k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9127) int b, bnum, bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9128)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9129) if( *num & 0x8000 ) sign_num = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9130) if( *den & 0x8000 ) sign_den = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9131)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9132) cpy_num = *num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9133) cpy_den = *den;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9134)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9135) *quot = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9136) *rem = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9137)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9138) if( sign_num ) ineg_16( &cpy_num, &cpy_num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9139) if( sign_den ) ineg_16( &cpy_den, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9140)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9141) b = BITS_PER_TWO_BYTES - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9142) while( !((cpy_num >> ((b)&(BITS_PER_TWO_BYTES-1)))&1) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 9143) b != (-1) ) --b; /* !BIT(cpy_num,b) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9144) bnum = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9145)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9146) if( bnum == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9147) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9148) /* dividend == 0 (делимое == 0); ==> qout = 0; rem = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9149)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9150) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9151) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9152)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9153) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9154) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9155)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9156) b = BITS_PER_TWO_BYTES - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9157) while( !((cpy_den >> ((b)&(BITS_PER_TWO_BYTES-1)))&1) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 9158) b != (-1) ) --b; /* !BIT(cpy_den,b) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9159) bden = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9160)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9161) if( bden == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9162) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9163) /* DIVISION BY ZERO */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9164)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9165) if( sign_num ) ineg_16( &cpy_num, &cpy_num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9166)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9167) *rem = cpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9168) if( *rem ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9169) else __CLR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9170)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9171) if( !sign_num ) j = 0xffff;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9172) *quot = j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9173)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9174) if( !sign_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9175) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9176) *quot ^= 0x8000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9177) __CLS; /* Sign Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9178) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9179) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9180) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9181) *quot |= 0x8000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9182) __STS; /* Sign Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9183) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9184)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9185) if( __MPARITY(*quot) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9186) else __CLP; /* clear parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9187)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9188) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9189) __STC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9190) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9191) __CLZ; /* Zero Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9192) __CLV; /* Invalid Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9193)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9194) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9195) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9196)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9197) if( bnum < bden )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9198) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9199) /* num < den; ==> qout = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9200)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9201) *rem = cpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9202) if( *rem ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9203) else __CLR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9204)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9205) if( sign_num ^ sign_den ) ineg_16( rem, rem );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9206)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9207) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9208) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9209) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9210) __CLS; /* Sign Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9211) __STZ; /* Zero Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9212) __CLV; /* Invalid Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9213)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9214) __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9215)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9216) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9217) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9218)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9219) k = bnum - bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9220)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9221) ishln_16( &cpy_den, &cpy_den, k ); /* value(k) my be zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9222)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9223) ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9224)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9225) for( i = 0; i < k; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9226) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9227) icmp_16( &cpy_num, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9228) if( !__MFLAG(SF) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9229) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9230) isub_16( &cpy_num, &cpy_num, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9231) j = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9232) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9233) else j = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9234)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9235) ishl_16( quot, quot ); /* shift to 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9236) *quot |= j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9237)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9238) ishr_16( &cpy_den, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9239) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9240)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9241) /* copy cpy_num to rem */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9242) *rem = cpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9243) if( *rem ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9244) else __CLR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9245)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9246) if( sign_num ^ sign_den )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9247) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9248) ineg_16( rem, rem );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9249) ineg_16( quot, quot );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9250)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9251) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9252) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9253)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9254) if( __MFLAG(SF) == (sign_num ^ sign_den) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9255) /* if( Correct result Sign ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9256) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9257)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9258) /* flags:
868b2b66 (kx 2024-12-20 16:11:07 +0300 9259) OF - Overflow Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9260) SF - Sign Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9261) PF - Parity Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9262) ZF - Zero Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9263) VF - Invalid Flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 9264) are Correct after last ineg_16() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9265)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9266) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9267) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9268)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9269) /* z = quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9270) if( __MPARITY(*quot) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9271) else __CLP; /* clear parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9272)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9273) if( *quot ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9274) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9275)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9276) if( *quot & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9277) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9278)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9279) if( __MFLAG(SF) ) __STO; /* warning */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9280) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9281) /* т.к. здесь идет речь о положительных числах
868b2b66 (kx 2024-12-20 16:11:07 +0300 9282) (именно в их знаковом представлении 011111)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9283) наличие 1 в старшем разряде недопустимо */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9284)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9285) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9286) __CLC; /* carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9287)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9288) __CLV; /* clear invalid flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9289) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9290)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9291) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 9292) void isdiv_32( __mpu_uint32_t *quot, __mpu_uint32_t *rem, __mpu_uint32_t *num, __mpu_uint32_t *den )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9293) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9294) __mpu_uint32_t cpy_num = 0, cpy_den = 0, j = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9295) signed int sign_num = 0, sign_den = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9296) signed int i, k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9297) int b, bnum, bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9298)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9299) if( *num & 0x80000000 ) sign_num = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9300) if( *den & 0x80000000 ) sign_den = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9301)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9302) cpy_num = *num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9303) cpy_den = *den;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9304)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9305) *quot = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9306) *rem = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9307)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9308) if( sign_num ) ineg_32( &cpy_num, &cpy_num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9309) if( sign_den ) ineg_32( &cpy_den, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9310)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9311) b = BITS_PER_FOUR_BYTES - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9312) while( !((cpy_num >> ((b)&(BITS_PER_FOUR_BYTES-1)))&1) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 9313) b != (-1) ) --b; /* !BIT(cpy_num,b) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9314) bnum = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9315)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9316) if( bnum == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9317) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9318) /* dividend == 0 (делимое == 0); ==> qout = 0; rem = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9319)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9320) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9321) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9322)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9323) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9324) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9325)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9326) b = BITS_PER_FOUR_BYTES - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9327) while( !((cpy_den >> ((b)&(BITS_PER_FOUR_BYTES-1)))&1) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 9328) b != (-1) ) --b; /* !BIT(cpy_den,b) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9329) bden = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9330)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9331) if( bden == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9332) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9333) /* DIVISION BY ZERO */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9334)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9335) if( sign_num ) ineg_32( &cpy_num, &cpy_num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9336)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9337) *rem = cpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9338) if( *rem ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9339) else __CLR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9340)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9341) if( !sign_num ) j = 0xffffffff;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9342) *quot = j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9343)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9344) if( !sign_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9345) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9346) *quot ^= 0x80000000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9347) __CLS; /* Sign Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9348) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9349) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9350) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9351) *quot |= 0x80000000;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9352) __STS; /* Sign Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9353) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9354)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9355) if( __MPARITY(*quot) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9356) else __CLP; /* clear parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9357)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9358) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9359) __STC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9360) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9361) __CLZ; /* Zero Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9362) __CLV; /* Invalid Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9363)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9364) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9365) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9366)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9367) if( bnum < bden )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9368) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9369) /* num < den; ==> qout = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9370)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9371) *rem = cpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9372) if( *rem ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9373) else __CLR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9374)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9375) if( sign_num ^ sign_den ) ineg_32( rem, rem );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9376)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9377) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9378) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9379) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9380) __CLS; /* Sign Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9381) __STZ; /* Zero Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9382) __CLV; /* Invalid Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9383)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9384) __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9385)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9386) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9387) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9388)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9389) k = bnum - bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9390)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9391) ishln_32( &cpy_den, &cpy_den, k ); /* value(k) my be zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9392)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9393) ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9394)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9395) for( i = 0; i < k; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9396) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9397) icmp_32( &cpy_num, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9398) if( !__MFLAG(SF) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9399) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9400) isub_32( &cpy_num, &cpy_num, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9401) j = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9402) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9403) else j = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9404)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9405) ishl_32( quot, quot ); /* shift to 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9406) *quot |= j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9407)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9408) ishr_32( &cpy_den, &cpy_den );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9409) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9410)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9411)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9412) /* copy cpy_num to rem */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9413) *rem = cpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9414) if( *rem ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9415) else __CLR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9416)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9417) if( sign_num ^ sign_den )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9418) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9419) ineg_32( rem, rem );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9420) ineg_32( quot, quot );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9421)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9422) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9423) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9424)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9425) if( __MFLAG(SF) == (sign_num ^ sign_den) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9426) /* if( Correct result Sign ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9427) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9428)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9429) /* flags:
868b2b66 (kx 2024-12-20 16:11:07 +0300 9430) OF - Overflow Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9431) SF - Sign Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9432) PF - Parity Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9433) ZF - Zero Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9434) VF - Invalid Flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 9435) are Correct after last ineg_32() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9436)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9437) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9438) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9439)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9440) /* z = quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9441) if( __MPARITY(*quot) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9442) else __CLP; /* clear parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9443)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9444) if( *quot ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9445) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9446)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9447) if( *quot & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9448) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9449)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9450) if( __MFLAG(SF) ) __STO; /* warning */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9451) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9452) /* т.к. здесь идет речь о положительных числах
868b2b66 (kx 2024-12-20 16:11:07 +0300 9453) (именно в их знаковом представлении 011111)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9454) наличие 1 в старшем разряде недопустимо */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9455)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9456) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9457) __CLC; /* carry flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9458)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9459) __CLV; /* clear invalid flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9460) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9461) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9462)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9463)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9464) #if 1 /* Use CPU mul/div */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9465) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9466) С использованием операций умножения процессора (CPU):
868b2b66 (kx 2024-12-20 16:11:07 +0300 9467) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9468)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9469) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9470) Radix MAX[EMUSHORT] versions of multiply and divide.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9471) if BITS_PER_EMUSHORT == 16(от 0 до 65 535),
868b2b66 (kx 2024-12-20 16:11:07 +0300 9472) then Radix = 65 536;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9473) if BITS_PER_EMUSHORT == 32(от 0 до 4 294 967 295),
868b2b66 (kx 2024-12-20 16:11:07 +0300 9474) then Radix = 4 294 967 296;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9475) if BITS_PER_EMUSHORT == 64(от 0 до 18 446 744 073 709 551 616),
868b2b66 (kx 2024-12-20 16:11:07 +0300 9476) then Radix = 18 446 744 073 709 551 616;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9477) etc.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9478) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9479) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9480) prod - произведение
868b2b66 (kx 2024-12-20 16:11:07 +0300 9481) num - множимое
868b2b66 (kx 2024-12-20 16:11:07 +0300 9482) mul - множитель
868b2b66 (kx 2024-12-20 16:11:07 +0300 9483) np_prod - размер произведения
868b2b66 (kx 2024-12-20 16:11:07 +0300 9484) np_num - размер множимого
868b2b66 (kx 2024-12-20 16:11:07 +0300 9485) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9486) static void iEMUSHORTm( EMUSHORT *prod, EMUSHORT *num, EMUSHORT mul, int np_prod, int np_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9487) /*******************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9488) Multiply integer number NUM
868b2b66 (kx 2024-12-20 16:11:07 +0300 9489) by BITS_PER_EMUSHORT-bit quantity MUL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9490) return integer result to PROD.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9491) *******************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9492) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9493) EMUSHORT *pp, *z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9494) EMULONG carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9495) EMUSHORT *prd = EMUSHORT_C(0);
868b2b66 (kx 2024-12-20 16:11:07 +0300 9496) EMUSHORT *ps;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9497) EMULONG a, m;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9498) EMUSHORT i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9499)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9500) if( np_prod < 2 || np_prod > NP_MAX || np_num < 1 || np_prod < np_num + 1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9501) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9502) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9503) __integer_invalid_size( (__mpu_char8_t *)"iEMUSHORTm" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9504) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9505) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9506)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9507) /*** Allocate memory for prd . ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9508) prd = (EMUSHORT *)__mpu_sbrk( (int)(np_prod*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9509) if( !prd )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9510) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9511) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9512) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9513) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9514) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9515)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9516) a = mul;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9517)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9518) /* обнуляем произведение */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9519) z = prd + np_prod - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9520) i = np_prod;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9521) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9522) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9523) *z = (EMUSHORT)0; /* bzero prd */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9524) --z; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9525) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9526)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9527) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 9528) /* младшее слово произведения */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9529) pp = &prd[np_prod - 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 9530) /* младшее слово множимого */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9531) ps = &num[np_num - 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 9532) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9533) /* младшее слово произведения */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9534) pp = &prd[0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 9535) /* младшее слово множимого */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9536) ps = &num[0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 9537) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 9538)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9539) for( i = 0; i < np_num; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9540) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9541) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 9542) m = (EMULONG) a * *ps--;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9543) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9544) m = (EMULONG) a * *ps++;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9545) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 9546) carry = (m & MASK_ALL_BITS) + *pp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9547) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 9548) *pp-- = (EMUSHORT)carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9549) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9550) *pp++ = (EMUSHORT)carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9551) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 9552) carry = (carry >> BITS_PER_EMUSHORT) +
868b2b66 (kx 2024-12-20 16:11:07 +0300 9553) (m >> BITS_PER_EMUSHORT) + *pp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9554) *pp = (EMUSHORT)carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9555) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 9556) *(pp-1) = (EMUSHORT)(carry >> BITS_PER_EMUSHORT);
868b2b66 (kx 2024-12-20 16:11:07 +0300 9557) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9558) *(pp+1) = (EMUSHORT)(carry >> BITS_PER_EMUSHORT);
868b2b66 (kx 2024-12-20 16:11:07 +0300 9559) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 9560) } /* End for( i = 0; i < np - 1; ++i ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9561)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9562) for( i = 0; i < np_prod; ++i ) prod[i] = prd[i];
868b2b66 (kx 2024-12-20 16:11:07 +0300 9563)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9564) /* FREE prd ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9565) __mpu_sbrk( -(int)(np_prod*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9566) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9567) } /* End of iEMUSHORTm() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9568)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9569) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9570) Операции беззнакового и знакового умножения.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9571) Изменяет флаги: CF, AF=0, PF, ZF, SF, OF, RF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9572) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9573) /* Prod = Num * Mul; np_prod == 2*np_num; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9574) /****************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9575) prod - произведение
868b2b66 (kx 2024-12-20 16:11:07 +0300 9576) num - множимое
868b2b66 (kx 2024-12-20 16:11:07 +0300 9577) mul - множитель
868b2b66 (kx 2024-12-20 16:11:07 +0300 9578) np_prod - размер произв.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9579) np_num - размер множ.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9580) ****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9581) void imul_np( EMUSHORT *prod, EMUSHORT *num, EMUSHORT *mul, int np_prod, int np_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9582) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9583) EMUSHORT *z, *p, *pcpy = 0, *quot = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9584) signed int major = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9585) signed int i, shifts = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9586)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9587) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9588)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9589) if( np_prod < 2 || np_prod > NP_MAX || np_num < 1 || np_prod < 2*np_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9590) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9591) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9592) __integer_invalid_size( (__mpu_char8_t *)"imul_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9593) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9594) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9595)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9596) /* Allocate memory for quot **********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9597) quot = (EMUSHORT *)__mpu_sbrk( (int)(np_prod*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9598) if( !quot )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9599) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9600) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9601) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9602) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9603) (void)memset( (void *)quot, 0, np_prod*SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9604) /*************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9605)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9606) /* Allocate memory for Copy num ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9607) pcpy = (EMUSHORT *)__mpu_sbrk( (int)(np_prod*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9608) if( !pcpy )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9609) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9610) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9611) /* FREE quot *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9612) __mpu_sbrk( -((int)(np_prod*SIZE_OF_EMUSHORT)) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9613) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9614) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9615) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9616) scpy_s2l_np( pcpy, num, np_prod, np_num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9617) /*************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9618)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9619) z = prod + np_prod - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9620) i = np_prod;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9621) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9622) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9623) *z = 0; /* bzero prod */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9624) --z; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9625) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9626) /* ++z; */ /* z = prod; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9627)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9628) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 9629) p = mul + np_num - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9630) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9631) p = mul; /* z = low part of mul; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9632) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 9633)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9634) for( i = 0; i < np_num; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9635) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9636) if( *p == (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9637) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9638) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 9639) --p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9640) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9641) ++p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9642) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 9643) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9644) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9645) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9646) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 9647) iEMUSHORTm( prod, pcpy+np_num, *p--, np_prod, np_num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9648) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9649) iEMUSHORTm( prod, pcpy, *p++, np_prod, np_num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9650) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 9651) ishln_np( prod, prod, shifts*BITS_PER_EMUSHORT, np_prod );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9652) iadd_np( quot, quot, prod, np_prod ); /* set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9653) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9654) ++shifts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9655)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9656) } /* End for() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9657)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9658) /* FREE pcpy *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9659) __mpu_sbrk( -((int)(np_prod*SIZE_OF_EMUSHORT)) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9660) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9661)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9662) for( i = 0; i < np_prod; ++i ) prod[i] = quot[i];
868b2b66 (kx 2024-12-20 16:11:07 +0300 9663)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9664) /* FREE quot *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9665) __mpu_sbrk( -((int)(np_prod*SIZE_OF_EMUSHORT)) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9666) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9667)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9668) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9669) /* flags:
868b2b66 (kx 2024-12-20 16:11:07 +0300 9670) CF - Carry Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9671) OF - Overflow Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9672) SF - Sign Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9673) PF - Parity Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9674) ZF - Zero Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9675) VF - Invalid Flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 9676) are Correct after last iadd_np */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9677)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9678) /* Set RF (major/remainder) flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9679) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 9680) z = prod + np_num - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9681) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9682) z = prod + np_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9683) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 9684)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9685) i = np_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9686) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9687) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9688) if( *z ) major |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9689) else major |= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9690)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9691) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 9692) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9693) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9694) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9695) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 9696) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9697) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9698)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9699) if( major ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9700) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9701) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9702)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9703) /* (signed) Prod = Num * Mul; np_prod == 2*np_num; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9704) void ismul_np( EMUSHORT *prod, EMUSHORT *num, EMUSHORT *mul, int np_prod, int np_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9705) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9706) EMUSHORT *z, *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9707) EMUSHORT *pcpy_num = 0, *pcpy_mul = 0, *quot = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9708) signed int sign_num = 0, sign_mul = 0, major = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9709) signed int i, shifts = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9710)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9711) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9712)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9713) if( np_prod < 2 || np_prod > NP_MAX || np_num < 1 || np_prod < 2*np_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9714) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9715) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9716) __integer_invalid_size( (__mpu_char8_t *)"ismul_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9717) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9718) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9719)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9720) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 9721) p = num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9722) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9723) p = num + np_num - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9724) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 9725) if( *p & MASK_SIGN ) sign_num = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9726)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9727) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 9728) p = mul;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9729) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9730) p = mul + np_num - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9731) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 9732) if( *p & MASK_SIGN ) sign_mul = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9733)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9734) /* Allocate memory for quot **********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9735) quot = (EMUSHORT *)__mpu_sbrk( (int)(np_prod*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9736) if( !quot )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9737) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9738) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9739) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9740) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9741) (void)memset( (void *)quot, 0, np_prod*SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9742) /*************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9743)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9744) /* Allocate memory for ConVerT num ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9745) pcpy_num = (EMUSHORT *)__mpu_sbrk( (int)(np_prod*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9746) if( !pcpy_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9747) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9748) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9749) /* FREE quot *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9750) __mpu_sbrk( -((int)(np_prod*SIZE_OF_EMUSHORT)) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9751) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9752) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9753) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9754) scvt_s2l_np( pcpy_num, num, np_prod, np_num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9755) /*************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9756)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9757) /* Allocate memory for ConVerT mul ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9758) pcpy_mul = (EMUSHORT *)__mpu_sbrk( (int)(np_prod*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9759) if( !pcpy_mul )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9760) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9761) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9762) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9763) __mpu_sbrk( -(int)(np_prod*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9764) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9765) /* FREE quot *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9766) __mpu_sbrk( -((int)(np_prod*SIZE_OF_EMUSHORT)) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9767) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9768) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9769) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9770) scvt_s2l_np( pcpy_mul, mul, np_prod, np_num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9771) /*************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9772)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9773) z = prod + np_prod - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9774) i = np_prod;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9775) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9776) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9777) *z = 0; /* bzero Prod */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9778) --z; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9779) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9780) /* ++z; */ /* z = prod; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9781)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9782) if( sign_num ) ineg_np( pcpy_num, pcpy_num, np_prod );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9783) if( sign_mul ) ineg_np( pcpy_mul, pcpy_mul, np_prod );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9784)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9785)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9786) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 9787) p = pcpy_mul + np_num - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9788) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9789) p = pcpy_mul; /* z = low part of mul; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9790) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 9791)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9792) for( i = 0; i < np_num; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9793) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9794) if( *p == (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9795) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9796) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 9797) --p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9798) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9799) ++p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9800) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 9801) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9802) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9803) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9804) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 9805) iEMUSHORTm( prod, pcpy_num, *p--, np_prod, np_num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9806) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9807) iEMUSHORTm( prod, pcpy_num, *p++, np_prod, np_num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9808) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 9809) ishln_np( prod, prod, shifts*BITS_PER_EMUSHORT, np_prod );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9810) iadd_np( quot, quot, prod, np_prod ); /* set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9811) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9812) ++shifts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9813)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9814) } /* End of for( i = 0; i < np_num; ++i ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9815)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9816) /* FREE pcpy_mul ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9817) __mpu_sbrk( -(int)(np_prod*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9818) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9819) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9820) __mpu_sbrk( -(int)(np_prod*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9821) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9822)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9823) for( i = 0; i < np_prod; ++i ) prod[i] = quot[i];
868b2b66 (kx 2024-12-20 16:11:07 +0300 9824)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9825) /* FREE quot *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9826) __mpu_sbrk( -((int)(np_prod*SIZE_OF_EMUSHORT)) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9827) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9828)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9829) /* Set RF (major/remainder) flag (with minor sign) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9830) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 9831) z = prod + np_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9832) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9833) z = prod + np_num - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9834) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 9835)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9836) if( *z & MASK_SIGN ) major |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9837) else major |= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9838)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9839) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 9840) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9841) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9842) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9843) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 9844)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9845) i = np_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9846) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9847) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9848) if( *z ) major |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9849) else major |= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9850)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9851) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 9852) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9853) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9854) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9855) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 9856) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9857) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9858)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9859) if( major ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9860) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9861)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9862) if( sign_num ^ sign_mul ) ineg_np( prod, prod, np_prod );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9863)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9864) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9865) /* flags:
868b2b66 (kx 2024-12-20 16:11:07 +0300 9866) CF - Carry Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9867) OF - Overflow Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9868) SF - Sign Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9869) PF - Parity Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9870) ZF - Zero Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9871) VF - Invalid Flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 9872) are Correct after last iadd_np or ineg_np */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9873)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9874) /* if( OF ) RF (major/remainder) is Not Correct */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9875) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9876)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9877) #else /* Do not use CPU mul/div */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9878) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9879) Без использования операций умножения процессора (CPU):
868b2b66 (kx 2024-12-20 16:11:07 +0300 9880) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9881)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9882) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 9883) Операции беззнакового и знакового умножения.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9884) Изменяет флаги: CF, AF=0, PF, ZF, SF, OF, RF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 9885) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9886)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9887) /* Prod = Num * Mul; np_prod == 2*np_num; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9888) void imul_np( EMUSHORT *prod, EMUSHORT *num, EMUSHORT *mul, int np_prod, int np_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9889) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9890) EMUSHORT *z, *x, *y, *pcpy = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9891) signed int major = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9892) signed int i, k, shifts = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9893)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9894) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9895)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9896) if( np_prod < 2 || np_prod > NP_MAX || np_num < 1 || np_prod < 2*np_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9897) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9898) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9899) __integer_invalid_size( (__mpu_char8_t *)"imul_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9900) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9901) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9902)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9903) /* Allocate memory for Copy num ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9904) pcpy = (EMUSHORT *)__mpu_sbrk( (int)(np_prod*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9905) if( !pcpy )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9906) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9907) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9908) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9909) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9910) /* (void)memset( (void *)pcpy, 0, np_prod*SIZE_OF_EMUSHORT ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9911) scpy_s2l_np( pcpy, num, np_prod, np_num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9912) /*************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9913)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9914) z = prod + np_prod - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9915) i = np_prod;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9916) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9917) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9918) *z = 0; /* bzero Prod */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9919) --z; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9920) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9921) ++z; /* z = prod; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9922)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9923) x = pcpy;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9924) y = mul;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9925)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9926) k = BITS_PER_EMUSHORT*np_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9927)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9928) for( i = 0; i < k; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9929) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9930) if( ORDER_BIT(y,i,np_num) ) /* см. mpu-emutype.h */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9931) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9932) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 9933) следующие операции корректно работают
868b2b66 (kx 2024-12-20 16:11:07 +0300 9934) при любом MPU_WORD_ORDER_BIG_ENDIAN
868b2b66 (kx 2024-12-20 16:11:07 +0300 9935) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9936) ishln_np( x, x, shifts, np_prod );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9937) iadd_np( z, z, x, np_prod ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9938)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9939) shifts = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9940) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9941) else ++shifts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9942)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9943) } /* End of for( i = 0; i < k; ++i ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9944)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9945) /* FREE pcpy *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9946) __mpu_sbrk( -((int)(np_prod*SIZE_OF_EMUSHORT)) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9947) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 9948)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9949) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9950) /* flags:
868b2b66 (kx 2024-12-20 16:11:07 +0300 9951) CF - Carry Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9952) OF - Overflow Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9953) SF - Sign Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9954) PF - Parity Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9955) ZF - Zero Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 9956) VF - Invalid Flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 9957) are Correct after last iadd_np */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9958)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9959) /* Set RF (major/remainder) flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9960) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 9961) z = prod + np_num - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9962) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9963) z = prod + np_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9964) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 9965)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9966) i = np_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9967) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9968) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9969) if( *z ) major |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9970) else major |= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9971)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9972) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 9973) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9974) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 9975) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9976) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 9977) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9978) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9979)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9980) if( major ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9981) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9982) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 9983)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9984) /* (signed) Prod = Num * Mul; np_prod == 2*np_num; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9985) void ismul_np( EMUSHORT *prod, EMUSHORT *num, EMUSHORT *mul, int np_prod, int np_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9986) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9987) EMUSHORT *z, *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9988) EMUSHORT *pcpy_num = 0, *pcpy_mul = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9989) signed int sign_num = 0, sign_mul = 0, major = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9990) signed int i, k, shifts = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9991)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9992) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9993)
868b2b66 (kx 2024-12-20 16:11:07 +0300 9994) if( np_prod < 2 || np_prod > NP_MAX || np_num < 1 || np_prod < 2*np_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 9995) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 9996) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 9997) __integer_invalid_size( (__mpu_char8_t *)"ismul_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 9998) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 9999) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10000)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10001) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10002) x = num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10003) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10004) x = num + np_num - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10005) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10006) if( *x & MASK_SIGN ) sign_num = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10007)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10008) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10009) y = mul;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10010) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10011) y = mul + np_num - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10012) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10013) if( *y & MASK_SIGN ) sign_mul = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10014)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10015) /* Allocate memory for ConVerT num ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10016) pcpy_num = (EMUSHORT *)__mpu_sbrk( (int)(np_prod*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10017) if( !pcpy_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10018) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10019) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10020) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10021) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10022) scvt_s2l_np( pcpy_num, num, np_prod, np_num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10023) /*************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10024)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10025) /* Allocate memory for ConVerT mul ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10026) pcpy_mul = (EMUSHORT *)__mpu_sbrk( (int)(np_prod*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10027) if( !pcpy_mul )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10028) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10029) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10030) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10031) __mpu_sbrk( -(int)(np_prod*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10032) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10033) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10034) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10035) scvt_s2l_np( pcpy_mul, mul, np_prod, np_num );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10036) /*************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10037)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10038) z = prod + np_prod - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10039) i = np_prod;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10040) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10041) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10042) *z = 0; /* bzero Prod */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10043) --z; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10044) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10045) ++z; /* z = prod; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10046)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10047) if( sign_num ) ineg_np( pcpy_num, pcpy_num, np_prod );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10048) if( sign_mul ) ineg_np( pcpy_mul, pcpy_mul, np_prod );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10049)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10050) x = pcpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10051) y = pcpy_mul;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10052)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10053) k = BITS_PER_EMUSHORT*np_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10054)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10055) for( i = 0; i < k; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10056) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10057) if( ORDER_BIT(y,i,np_prod) ) /* см. mpu-emutype.h */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10058) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10059) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 10060) следующие операции корректно работают
868b2b66 (kx 2024-12-20 16:11:07 +0300 10061) при любом MPU_WORD_ORDER_BIG_ENDIAN
868b2b66 (kx 2024-12-20 16:11:07 +0300 10062) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10063) ishln_np( x, x, shifts, np_prod );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10064) iadd_np( z, z, x, np_prod ); /* Set Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10065)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10066) shifts = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10067) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10068) else ++shifts;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10069)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10070) } /* End if for( i = 0; i < k; ++i ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10071)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10072) /* FREE pcpy_mul ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10073) __mpu_sbrk( -(int)(np_prod*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10074) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10075) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10076) __mpu_sbrk( -(int)(np_prod*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10077) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10078)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10079) /* Set RF (major/remainder) flag (with minor sign) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10080) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10081) z = prod + np_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10082) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10083) z = prod + np_num - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10084) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10085)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10086) if( *z & MASK_SIGN ) major |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10087) else major |= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10088)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10089) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10090) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10091) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10092) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10093) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10094)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10095) i = np_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10096) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10097) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10098) if( *z ) major |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10099) else major |= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10100)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10101) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10102) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10103) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10104) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10105) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10106) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10107) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10108)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10109) if( major ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10110) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10111)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10112) if( sign_num ^ sign_mul ) ineg_np( prod, prod, np_prod );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10113)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10114) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10115) /* flags:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10116) CF - Carry Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10117) OF - Overflow Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10118) SF - Sign Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10119) PF - Parity Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10120) ZF - Zero Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10121) VF - Invalid Flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 10122) are Correct after last iadd_np or ineg_np */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10123)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10124) /* if( OF ) RF (major/remainder) is Not Correct */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10125) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10126)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10127) #endif /* Use CPU mul/div */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10128)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10129)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10130) #if 1 /* Use CPU mul/div */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10131) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10132) С использованием операций деления процессора (CPU):
868b2b66 (kx 2024-12-20 16:11:07 +0300 10133) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10134)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10135) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10136) Radix MAX[EMUSHORT] versions of multiply and divide.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10137) if BITS_PER_EMUSHORT == 16(от 0 до 65 535),
868b2b66 (kx 2024-12-20 16:11:07 +0300 10138) then Radix = 65 536;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10139) if BITS_PER_EMUSHORT == 32(от 0 до 4 294 967 295),
868b2b66 (kx 2024-12-20 16:11:07 +0300 10140) then Radix = 4 294 967 296;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10141) if BITS_PER_EMUSHORT == 64(от 0 до 18 446 744 073 709 551 616),
868b2b66 (kx 2024-12-20 16:11:07 +0300 10142) then Radix = 18 446 744 073 709 551 616;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10143) etc.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10144) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10145)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10146) #define BASE MASK_CARRY
868b2b66 (kx 2024-12-20 16:11:07 +0300 10147)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10148) static void iSINGLE_EMUSHORTm( EMUSHORT *prod, EMUSHORT *num, EMUSHORT mul, int np_prod, int np_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10149) /*******************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10150) Multiply integer number NUM
868b2b66 (kx 2024-12-20 16:11:07 +0300 10151) by BITS_PER_EMUSHORT-bit quantity MUL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10152) return integer result to PROD.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10153) *******************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10154) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10155) EMUSHORT *prd = 0, *p, *n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10156) EMULONG carry = 0, tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10157) int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10158)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10159) if( np_prod < 2 || np_prod > NP_MAX || np_num < 1 || np_prod < np_num+1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10160) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10161) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10162) __integer_invalid_size( (__mpu_char8_t *)"iSINGLE_EMUSHORTm" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10163) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10164) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10165)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10166) /*** Allocate memory for prd . ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10167) prd = (EMUSHORT *)__mpu_sbrk( (int)(np_prod*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10168) if( !prd )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10169) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10170) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10171) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10172) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10173) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10174)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10175) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10176) p = prd;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10177) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10178) p = prd + np_prod - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10179) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10180) i = np_prod;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10181) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10182) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10183) *p = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10184)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10185) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10186) ++p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10187) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10188) --p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10189) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10190) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10191) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10192) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10193) --p; /* младшее слово prd */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10194) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10195) ++p; /* младшее слово prd */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10196) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10197)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10198) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10199) n = num + np_num - 1; /* младшее слово num */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10200) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10201) n = num; /* младшее слово num */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10202) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10203)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10204) for( i = 0; i < np_num; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10205) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10206) tmp = (EMULONG)*n * (EMULONG)mul + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10207) carry = tmp / BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10208) *p = (EMUSHORT)(tmp - carry * BASE); /* prd[i] = tmp % BASE; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10209)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10210) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10211) --p; --n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10212) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10213) ++p; ++n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10214) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10215) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10216)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10217) if( carry )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10218) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10219) *p = (EMUSHORT)carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10220) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10221)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10222) for( i = 0; i < np_prod; ++i ) prod[i] = prd[i];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10223)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10224) /* FREE prd ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10225) __mpu_sbrk( -(int)(np_prod*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10226) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10227) } /* End of iSINGLE_EMUSHORTm() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10228)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10229) static void iSINGLE_EMUSHORTd( EMUSHORT *quot, EMUSHORT *rem, EMUSHORT *num, EMUSHORT den, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10230) /******************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10231) quot - частное
868b2b66 (kx 2024-12-20 16:11:07 +0300 10232) rem - остаток (размером в одно слово)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10233) num - делимое
868b2b66 (kx 2024-12-20 16:11:07 +0300 10234) den - делитель
868b2b66 (kx 2024-12-20 16:11:07 +0300 10235) np - размер
868b2b66 (kx 2024-12-20 16:11:07 +0300 10236) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10237) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10238) EMUSHORT *tquot = 0, *q, *n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10239) EMULONG r = 0, tmp = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10240) int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10241)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10242) if( !den ) return; /* деление на 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10243)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10244) if( np == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10245) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10246) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10247) __integer_invalid_size( (__mpu_char8_t *)"iSINGLE_EMUSHORTd" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10248) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10249) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10250)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10251) /*** Allocate memory for tquot . ****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10252) tquot = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10253) if( !tquot )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10254) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10255) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10256) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10257) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10258) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10259)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10260) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10261) q = tquot + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10262) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10263) q = tquot;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10264) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10265) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10266) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10267) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10268) *q = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10269)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10270) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10271) --q;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10272) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10273) ++q;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10274) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10275) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10276) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10277) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10278) ++q; /* старшее слово tquot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10279) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10280) --q; /* старшее слово tquot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10281) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10282)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10283) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10284) n = num; /* старшее слово num */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10285) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10286) n = num + np - 1; /* старшее слово num */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10287) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10288)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10289) for( i = 0; i < np; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10290) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10291) tmp = r * BASE + (EMULONG)(*n);
868b2b66 (kx 2024-12-20 16:11:07 +0300 10292) *q = tmp / (EMULONG)den;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10293) r = tmp - (EMULONG)(*q) * (EMULONG)den;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10294)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10295) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10296) ++n; ++q;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10297) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10298) --n; --q;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10299) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10300) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10301) *rem = r;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10302)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10303) for( i = 0; i < np; ++i ) quot[i] = tquot[i];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10304)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10305) /* FREE tquot *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10306) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10307) /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10308) } /* End of iSINGLE_EMUSHORTd() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10309)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10310)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10311) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10312) Операции беззнакового и знакового деления.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10313) Изменяет флаги: CF, AF=0, PF, ZF, SF, OF, RF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10314) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10315) /******************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10316) quot - частное
868b2b66 (kx 2024-12-20 16:11:07 +0300 10317) rem - остаток
868b2b66 (kx 2024-12-20 16:11:07 +0300 10318) num - делимое
868b2b66 (kx 2024-12-20 16:11:07 +0300 10319) den - делитель
868b2b66 (kx 2024-12-20 16:11:07 +0300 10320) np - размер в EMUSHORT словах
868b2b66 (kx 2024-12-20 16:11:07 +0300 10321) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10322) void idiv_np( EMUSHORT *quot, EMUSHORT *rem, EMUSHORT *num, EMUSHORT *den, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10323) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10324) EMUSHORT *z, *r, *x, *y, *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10325) EMUSHORT *pcpy_num = 0, *pcpy_den = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10326) signed int remainder = 0, zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10327) int b, bnum, bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10328)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10329) EMUSHORT scale;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10330) int i, j, k, m;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10331)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10332) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10333)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10334) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10335) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10336) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10337) __integer_invalid_size( (__mpu_char8_t *)"idiv_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10338) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10339) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10340)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10341) /* Allocate memory for Copy num ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10342) pcpy_num = (EMUSHORT *)__mpu_sbrk( (int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10343) if( !pcpy_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10344) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10345) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10346) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10347) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10348) scpy_s2l_np( pcpy_num, num, np+1, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10349) /*************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10350)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10351) /* Allocate memory for Copy den ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10352) pcpy_den = (EMUSHORT *)__mpu_sbrk( (int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10353) if( !pcpy_den )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10354) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10355) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10356) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10357) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10358) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10359) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10360) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10361) scpy_s2l_np( pcpy_den, den, np+1, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10362) /*************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10363)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10364) z = quot + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10365) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10366) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10367) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10368) *z = 0; /* bzero Quotient */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10369) --z; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10370) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10371) ++z; /* z = quot; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10372)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10373) r = rem + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10374) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10375) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10376) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10377) *r = 0; /* bzero Remainder */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10378) --r; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10379) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10380) ++r; /* r = rem; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10381)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10382) x = pcpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10383) y = pcpy_den;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10384)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10385) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10386) Размер делимого в словах:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10387) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10388) b = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10389) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10390) while( x[np-b] == 0 && b != (-1) ) --b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10391) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10392) while( x[b] == 0 && b != (-1) ) --b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10393) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10394) bnum = b; /* b равен индексу наиболее старшего и неравного нулю слова */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10395)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10396) if( bnum == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10397) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10398) /* dividend == 0 (делимое == 0); ==> qout = 0; rem = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10399)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10400) /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10401) /* PF (parity) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10402) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10403) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10404)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10405) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10406) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10407) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10408) /* FREE pcpy_den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10409) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10410) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10411)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10412) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10413) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10414)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10415) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10416) Размер делителя в словах:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10417) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10418) b = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10419) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10420) while( y[np-b] == 0 && b != (-1) ) --b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10421) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10422) while( y[b] == 0 && b != (-1) ) --b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10423) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10424) bden = b; /* b равен индексу наиболее старшего и неравного нулю слова */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10425)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10426) if( bden == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10427) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10428) /* DIVISION BY ZERO */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10429)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10430) /* x = pcpy_num; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10431) /* r = rem = x; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10432) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10433) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10434) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10435) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10436) *r = *(x+1);
868b2b66 (kx 2024-12-20 16:11:07 +0300 10437) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10438) *r = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10439) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10440)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10441) if( *r ) remainder |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10442)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10443) ++x; ++r;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10444) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10445) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10446)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10447) /* z = quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10448) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10449) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10450) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10451) *z = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10452) ++z; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10453) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10454)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10455) /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10456) /* PF (parity) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10457) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10458)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10459) if( remainder ) __STR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10460) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10461)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10462) __STC; __STO; __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10463)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10464)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10465) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10466) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10467) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10468) /* FREE pcpy_den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10469) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10470) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10471)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10472) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10473) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10474)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10475) if( bden == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10476) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10477) /************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10478) Лишь самое младшее слово делителя неравно нулю,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10479) следовательно, здесь можно применить функцию
868b2b66 (kx 2024-12-20 16:11:07 +0300 10480) iSINGLE_EMUSHORTd()
868b2b66 (kx 2024-12-20 16:11:07 +0300 10481) ************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10482) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10483) iSINGLE_EMUSHORTd( z, &r[np-1], x+1, y[np], np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10484) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10485) iSINGLE_EMUSHORTd( z, &r[0], x, y[0], np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10486) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10487)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10488) goto check_flags_and_stop;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10489) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10490)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10491) if( bnum < bden )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10492) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10493) /* num < den; ==> qout = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10494)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10495) /* x = pcpy_num; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10496) /* r = rem = x; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10497) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10498) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10499) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10500) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10501) *r = *(x+1);
868b2b66 (kx 2024-12-20 16:11:07 +0300 10502) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10503) *r = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10504) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10505)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10506) if( *r ) remainder |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10507)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10508) ++x; ++r;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10509) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10510) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10511)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10512) /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10513) /* PF (parity) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10514) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10515)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10516) if( remainder ) __STR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10517) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10518)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10519) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10520)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10521) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10522) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10523) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10524) /* FREE pcpy_den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10525) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10526) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10527)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10528) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10529) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10530)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10531) m = bnum - bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10532)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10533) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10534) scale = BASE / (y[np-bden] + 1); /* коэффициент нормализации */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10535) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10536) scale = BASE / (y[bden] + 1); /* коэффициент нормализации */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10537) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10538) if( scale > 1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10539) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10540) /* нормализация */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10541) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10542) iSINGLE_EMUSHORTm( x, x+1, scale, np + 1, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10543) iSINGLE_EMUSHORTm( y, y+1, scale, np + 1, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10544) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10545) iSINGLE_EMUSHORTm( x, x, scale, np + 1, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10546) iSINGLE_EMUSHORTm( y, y, scale, np + 1, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10547) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10548) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10549)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10550) /************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10551) Главный цикл шагов деления. Каждая итерация дает очередную
868b2b66 (kx 2024-12-20 16:11:07 +0300 10552) цифру частного.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10553) K - текущий сдвиг делителя (Y) относительно копии
868b2b66 (kx 2024-12-20 16:11:07 +0300 10554) делимого (X), используемый при вычитании, кроме
868b2b66 (kx 2024-12-20 16:11:07 +0300 10555) того - индекс очередной цифры частного;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10556) J - индекс текущей цифры копии делимого (X).
868b2b66 (kx 2024-12-20 16:11:07 +0300 10557) ************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10558) for( k = m, j = bden + k; k >= 0; --k, --j )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10559) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10560) EMULONG guess, rm;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10561) EMULONG borrow, carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10562) EMULONG tmp, tmp1, tmp2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10563)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10564) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10565) guess = ((EMULONG)x[np-j-1] * BASE + (EMULONG)x[np-j]) / (EMULONG)y[np-bden];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10566) rm = ((EMULONG)x[np-j-1] * BASE + (EMULONG)x[np-j]) % (EMULONG)y[np-bden];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10567) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10568) guess = ((EMULONG)x[j+1] * BASE + (EMULONG)x[j]) / (EMULONG)y[bden];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10569) rm = ((EMULONG)x[j+1] * BASE + (EMULONG)x[j]) % (EMULONG)y[bden];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10570) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10571)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10572) /*********************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10573) Пока не будут выполнены условия, уменьшаем частное.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10574) *********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10575) while( rm < BASE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10576) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10577) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10578) tmp2 = (EMULONG)y[np-bden+1] * guess;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10579) tmp1 = rm * BASE + (EMULONG)x[np-j+1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10580) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10581) tmp2 = (EMULONG)y[bden-1] * guess;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10582) tmp1 = rm * BASE + (EMULONG)x[j-1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10583) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10584) if( (tmp2 > tmp1) || (guess == BASE) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10585) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10586) --guess;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10587) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10588) rm += (EMULONG)y[np-bden];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10589) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10590) rm += (EMULONG)y[bden];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10591) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10592) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10593) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10594) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10595) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10596)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10597) /*********************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10598) Теперь guess - правильное или на единицу большее
868b2b66 (kx 2024-12-20 16:11:07 +0300 10599) частное. Вычесть делитель (Y), умноженный на guess из
868b2b66 (kx 2024-12-20 16:11:07 +0300 10600) делимого (X), начиная с позиции k + i.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10601) *********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10602) carry = 0; borrow = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10603) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10604) p = &x[np-k];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10605) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10606) p = x + k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10607) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10608)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10609) /* Цикл по цифрам делителя (Y). */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10610) for( i = 0; i <= bden; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10611) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10612) /* Получить в tmp1 цифру произведения y * guess. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10613) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10614) tmp1 = (EMULONG)y[np-i] * guess + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10615) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10616) tmp1 = (EMULONG)y[i] * guess + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10617) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10618) carry = tmp1 / BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10619) tmp1 -= carry * BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10620)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10621) /* Сразу же вычесть из делимого (X). */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10622) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10623) tmp2 = (EMULONG)p[-i] - tmp1 - borrow;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10624) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10625) tmp2 = (EMULONG)p[i] - tmp1 - borrow;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10626) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10627) if( (tmp2 >> BITS_PER_EMUSHORT) & MASK_SIGN )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10628) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10629) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10630) p[-i] = tmp2 + BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10631) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10632) p[i] = tmp2 + BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10633) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10634) borrow = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10635) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10636) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10637) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10638) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10639) p[-i] = tmp2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10640) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10641) p[i] = tmp2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10642) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10643) borrow = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10644) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10645) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10646)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10647) /*********************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10648) Возможно, умноженное на guess число Y удлиннилось.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10649) Если это так, то после умножения остался
868b2b66 (kx 2024-12-20 16:11:07 +0300 10650) неиспользованный перенос carry. Вычесть и его тоже.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10651) *********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10652) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10653) tmp2 = (EMULONG)p[-i] - carry - borrow;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10654) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10655) tmp2 = (EMULONG)p[i] - carry - borrow;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10656) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10657) if( (tmp2 >> BITS_PER_EMUSHORT) & MASK_SIGN )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10658) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10659) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10660) p[-i] = tmp2 + BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10661) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10662) p[i] = tmp2 + BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10663) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10664) borrow = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10665) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10666) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10667) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10668) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10669) p[-i] = tmp2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10670) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10671) p[i] = tmp2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10672) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10673) borrow = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10674) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10675)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10676) /* Прошло ли вычитание нормально? */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10677) if( borrow == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10678) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10679) /* Да, частное угадано правильно. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10680) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10681) z[np-1-k] = guess;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10682) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10683) z[k] = guess;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10684) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10685) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10686) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10687) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10688) /******************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10689) Нет, последний перенос при вычитании borrow = -1,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10690) значит, guess на единицу больше истинного частного.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10691) ******************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10692) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10693) z[np-1-k] = guess - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10694) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10695) z[k] = guess - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10696) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10697)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10698) /* Добавить одно, вычтенное сверх необходимого Y к X. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10699) carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10700) for( i = 0; i <= bden; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10701) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10702) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10703) tmp = (EMULONG)p[-i] + (EMULONG)y[np-i] + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10704) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10705) tmp = (EMULONG)p[i] + (EMULONG)y[i] + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10706) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10707) if( tmp >= BASE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10708) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10709) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10710) p[-i] = tmp - BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10711) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10712) p[i] = tmp - BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10713) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10714) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10715) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10716) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10717) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10718) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10719) p[-i] = tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10720) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10721) p[i] = tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10722) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10723) carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10724) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10725) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10726) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10727) p[-i] = (EMULONG)p[-i] + carry - BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10728) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10729) p[i] = (EMULONG)p[i] + carry - BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10730) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10731) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10732)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10733) } /* End for( k = m, j = bden + k; k >= 0; --k, --j ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10734)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10735) /* Деление завершено. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10736)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10737) /************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10738) Если происходила нормализация - разделить на нормализующий
868b2b66 (kx 2024-12-20 16:11:07 +0300 10739) множитель. То, что остадось от делимого (X) - остаток.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10740) ************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10741) if( scale > 1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10742) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10743) EMUSHORT junk;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10744)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10745) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10746) /* iSINGLE_EMUSHORTd( y+1, &junk, y+1, scale, np ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10747) iSINGLE_EMUSHORTd( rem, &junk, x+1, scale, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10748) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10749) /* iSINGLE_EMUSHORTd( y, &junk, y, scale, np ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10750) iSINGLE_EMUSHORTd( rem, &junk, x, scale, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10751) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10752) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10753) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10754) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10755) for( i = 0; i < np; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10756) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10757) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10758) rem[i] = x[i+1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10759) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10760) rem[i] = x[i];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10761) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10762) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10763) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10764)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10765) /************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10766) CHECK FLAGS:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10767) ************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10768) check_flags_and_stop:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10769)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10770) /* z = quot; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10771)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10772) /* PF (parity) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10773) __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10774)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10775) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10776) /* z = (high part of)quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10777) if( *z & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10778) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10779) /* z = (low part of)quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10780) if( z[np-1] & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10781) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10782) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10783)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10784) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10785) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10786) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10787) if( *z ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10788) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10789)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10790) ++z; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10791) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10792)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10793) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10794) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10795)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10796) if( __MFLAG(SF) ) __STO; /* warning */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10797) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10798)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10799) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10800) __CLC; /* CF (carry) flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10801) __CLV; /* VF (invalid) flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10802)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10803) /* r = rem; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10804) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10805) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10806) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10807) if( *r ) remainder |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10808) ++r; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10809) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10810)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10811) if( remainder ) __STR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10812) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10813)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10814) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10815) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10816) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10817) /* FREE pcpy_den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10818) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10819) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10820)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10821) } /* End of idiv_np() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10822)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10823) void isdiv_np( EMUSHORT *quot, EMUSHORT *rem, EMUSHORT *num, EMUSHORT *den, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10824) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10825) EMUSHORT *z, *r, *x, *y, *p, sj = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10826) EMUSHORT *pcpy_num = 0, *pcpy_den = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10827) signed int sign_num = 0, sign_den = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10828) signed int remainder = 0, zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10829) int b, bnum, bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10830)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10831) EMUSHORT scale;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10832) int i, j, k, m;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10833)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10834) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10835)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10836) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10837) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10838) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10839) __integer_invalid_size( (__mpu_char8_t *)"isdiv_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10840) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10841) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10842)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10843) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10844) x = num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10845) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10846) x = num + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10847) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10848) if( *x & MASK_SIGN ) sign_num = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10849)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10850) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10851) y = den;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10852) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10853) y = den + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10854) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10855) if( *y & MASK_SIGN ) sign_den = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10856)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10857) /* Allocate memory for Copy num ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10858) pcpy_num = (EMUSHORT *)__mpu_sbrk( (int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10859) if( !pcpy_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10860) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10861) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10862) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10863) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10864) scvt_s2l_np( pcpy_num, num, np+1, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10865) /*************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10866)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10867) /* Allocate memory for Copy den ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10868) pcpy_den = (EMUSHORT *)__mpu_sbrk( (int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10869) if( !pcpy_den )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10870) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10871) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10872) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10873) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10874) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10875) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10876) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10877) scvt_s2l_np( pcpy_den, den, np+1, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10878) /*************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10879)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10880) if( sign_num ) ineg_np( pcpy_num, pcpy_num, np+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10881) if( sign_den ) ineg_np( pcpy_den, pcpy_den, np+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10882)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10883) z = quot + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10884) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10885) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10886) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10887) *z = 0; /* bzero Quotient */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10888) --z; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10889) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10890) ++z; /* z = quot; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10891)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10892) r = rem + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10893) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10894) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10895) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10896) *r = 0; /* bzero Remainder */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10897) --r; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10898) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10899) ++r; /* r = rem; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10900)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10901) x = pcpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10902) y = pcpy_den;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10903)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10904) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10905) Размер делимого в словах:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10906) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10907) b = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10908) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10909) while( x[np-b] == 0 && b != (-1) ) --b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10910) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10911) while( x[b] == 0 && b != (-1) ) --b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10912) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10913) bnum = b; /* b равен индексу наиболее старшего и неравного нулю слова */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10914)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10915) if( bnum == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10916) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10917) /* dividend == 0 (делимое == 0); ==> qout = 0; rem = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10918)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10919) /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10920) /* PF (parity) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10921) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10922) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10923)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10924) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10925) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10926) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10927) /* FREE pcpy_den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10928) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10929) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10930)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10931) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10932) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10933)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10934) /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10935) Размер делителя в словах:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10936) ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10937) b = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10938) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10939) while( y[np-b] == 0 && b != (-1) ) --b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10940) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10941) while( y[b] == 0 && b != (-1) ) --b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10942) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10943) bden = b; /* b равен индексу наиболее старшего и неравного нулю слова */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10944)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10945) if( bden == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10946) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10947) /* DIVISION BY ZERO */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10948)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10949) /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10950) /* PF (parity) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10951) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10952)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10953) if( sign_num ) ineg_np( pcpy_num, pcpy_num, np+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10954) /* x = pcpy_num; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10955) /* r = rem = x; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10956) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10957) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10958) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10959) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10960) *r = *(x+1);
868b2b66 (kx 2024-12-20 16:11:07 +0300 10961) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10962) *r = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10963) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10964)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10965) if( *r ) remainder |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10966)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10967) ++x; ++r;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10968) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10969) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10970)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10971) if( !sign_num ) sj = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10972)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10973) /* z = quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10974) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10975) z = z + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10976) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10977) /* z = (low part of)quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10978) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10979) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10980) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10981) *z = sj;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10982)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10983) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10984) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10985) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10986) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10987) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10988) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10989) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10990)
868b2b66 (kx 2024-12-20 16:11:07 +0300 10991) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10992) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10993) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10994) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10995) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10996) if( !sign_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10997) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10998) *z ^= MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10999) __CLS; /* Sign Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11000) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11001) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11002) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11003) *z |= MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11004) __STS; /* Sign Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11005) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11006)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11007) if( remainder ) __STR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11008) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11009)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11010) __STC; __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11011)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11012) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11013) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11014) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11015) /* FREE pcpy_den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11016) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11017) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11018)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11019) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11020) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11021)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11022) if( bden == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11023) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11024) /************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11025) Лишь самое младшее слово делителя неравно нулю,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11026) следовательно, здесь можно применить функцию
868b2b66 (kx 2024-12-20 16:11:07 +0300 11027) iSINGLE_EMUSHORTd()
868b2b66 (kx 2024-12-20 16:11:07 +0300 11028) ************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11029) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11030) iSINGLE_EMUSHORTd( z, &r[np-1], x+1, y[np], np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11031) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11032) iSINGLE_EMUSHORTd( z, &r[0], x, y[0], np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11033) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11034)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11035) goto check_flags_and_stop;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11036) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11037)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11038) if( bnum < bden )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11039) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11040) /* num < den; ==> qout = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11041)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11042) x = pcpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11043) /* r = rem = x; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11044) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11045) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11046) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11047) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11048) *r = *(x+1);
868b2b66 (kx 2024-12-20 16:11:07 +0300 11049) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11050) *r = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11051) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11052)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11053) if( *r ) remainder |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11054)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11055) ++x; ++r;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11056) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11057) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11058)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11059) if( sign_num ^ sign_den ) ineg_np( rem, rem, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11060)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11061) /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11062) /* PF (parity) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11063) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11064)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11065) if( remainder ) __STR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11066) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11067)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11068) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11069)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11070) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11071) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11072) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11073) /* FREE pcpy_den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11074) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11075) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11076)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11077) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11078) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11079)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11080) m = bnum - bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11081)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11082) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11083) scale = BASE / (y[np-bden] + 1); /* коэффициент нормализации */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11084) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11085) scale = BASE / (y[bden] + 1); /* коэффициент нормализации */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11086) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11087) if( scale > 1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11088) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11089) /* нормализация */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11090) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11091) iSINGLE_EMUSHORTm( x, x+1, scale, np + 1, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11092) iSINGLE_EMUSHORTm( y, y+1, scale, np + 1, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11093) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11094) iSINGLE_EMUSHORTm( x, x, scale, np + 1, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11095) iSINGLE_EMUSHORTm( y, y, scale, np + 1, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11096) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11097) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11098)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11099)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11100) /************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11101) Главный цикл шагов деления. Каждая итерация дает очередную
868b2b66 (kx 2024-12-20 16:11:07 +0300 11102) цифру частного.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11103) K - текущий сдвиг делителя (Y) относительно копии
868b2b66 (kx 2024-12-20 16:11:07 +0300 11104) делимого (X), используемый при вычитании, кроме
868b2b66 (kx 2024-12-20 16:11:07 +0300 11105) того - индекс очередной цифры частного;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11106) J - индекс текущей цифры копии делимого (X).
868b2b66 (kx 2024-12-20 16:11:07 +0300 11107) ************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11108) for( k = m, j = bden + k; k >= 0; --k, --j )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11109) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11110) EMULONG guess, rm;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11111) EMULONG borrow, carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11112) EMULONG tmp, tmp1, tmp2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11113)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11114) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11115) guess = ((EMULONG)x[np-j-1] * BASE + (EMULONG)x[np-j]) / (EMULONG)y[np-bden];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11116) rm = ((EMULONG)x[np-j-1] * BASE + (EMULONG)x[np-j]) % (EMULONG)y[np-bden];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11117) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11118) guess = ((EMULONG)x[j+1] * BASE + (EMULONG)x[j]) / (EMULONG)y[bden];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11119) rm = ((EMULONG)x[j+1] * BASE + (EMULONG)x[j]) % (EMULONG)y[bden];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11120) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11121)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11122) /*********************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11123) Пока не будут выполнены условия, уменьшаем частное.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11124) *********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11125) while( rm < BASE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11126) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11127) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11128) tmp2 = (EMULONG)y[np-bden+1] * guess;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11129) tmp1 = rm * BASE + (EMULONG)x[np-j+1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11130) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11131) tmp2 = (EMULONG)y[bden-1] * guess;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11132) tmp1 = rm * BASE + (EMULONG)x[j-1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11133) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11134) if( (tmp2 > tmp1) || (guess == BASE) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11135) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11136) --guess;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11137) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11138) rm += (EMULONG)y[np-bden];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11139) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11140) rm += (EMULONG)y[bden];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11141) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11142) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11143) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11144) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11145) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11146)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11147) /*********************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11148) Теперь guess - правильное или на единицу большее
868b2b66 (kx 2024-12-20 16:11:07 +0300 11149) частное. Вычесть делитель (Y), умноженный на guess из
868b2b66 (kx 2024-12-20 16:11:07 +0300 11150) делимого (X), начиная с позиции k + i.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11151) *********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11152) carry = 0; borrow = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11153) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11154) p = &x[np-k];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11155) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11156) p = x + k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11157) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11158)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11159) /* Цикл по цифрам делителя (Y). */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11160) for( i = 0; i <= bden; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11161) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11162) /* Получить в tmp1 цифру произведения y * guess. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11163) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11164) tmp1 = (EMULONG)y[np-i] * guess + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11165) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11166) tmp1 = (EMULONG)y[i] * guess + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11167) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11168) carry = tmp1 / BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11169) tmp1 -= carry * BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11170)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11171) /* Сразу же вычесть из делимого (X). */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11172) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11173) tmp2 = (EMULONG)p[-i] - tmp1 - borrow;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11174) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11175) tmp2 = (EMULONG)p[i] - tmp1 - borrow;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11176) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11177) if( (tmp2 >> BITS_PER_EMUSHORT) & MASK_SIGN )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11178) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11179) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11180) p[-i] = tmp2 + BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11181) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11182) p[i] = tmp2 + BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11183) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11184) borrow = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11185) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11186) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11187) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11188) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11189) p[-i] = tmp2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11190) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11191) p[i] = tmp2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11192) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11193) borrow = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11194) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11195) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11196)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11197) /*********************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11198) Возможно, умноженное на guess число Y удлиннилось.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11199) Если это так, то после умножения остался
868b2b66 (kx 2024-12-20 16:11:07 +0300 11200) неиспользованный перенос carry. Вычесть и его тоже.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11201) *********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11202) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11203) tmp2 = (EMULONG)p[-i] - carry - borrow;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11204) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11205) tmp2 = (EMULONG)p[i] - carry - borrow;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11206) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11207) if( (tmp2 >> BITS_PER_EMUSHORT) & MASK_SIGN )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11208) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11209) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11210) p[-i] = tmp2 + BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11211) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11212) p[i] = tmp2 + BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11213) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11214) borrow = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11215) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11216) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11217) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11218) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11219) p[-i] = tmp2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11220) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11221) p[i] = tmp2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11222) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11223) borrow = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11224) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11225)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11226) /* Прошло ли вычитание нормально? */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11227) if( borrow == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11228) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11229) /* Да, частное угадано правильно. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11230) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11231) z[np-1-k] = guess;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11232) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11233) z[k] = guess;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11234) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11235) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11236) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11237) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11238) /******************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11239) Нет, последний перенос при вычитании borrow = -1,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11240) значит, guess на единицу больше истинного частного.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11241) ******************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11242) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11243) z[np-1-k] = guess - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11244) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11245) z[k] = guess - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11246) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11247)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11248) /* Добавить одно, вычтенное сверх необходимого Y к X. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11249) carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11250) for( i = 0; i <= bden; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11251) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11252) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11253) tmp = (EMULONG)p[-i] + (EMULONG)y[np-i] + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11254) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11255) tmp = (EMULONG)p[i] + (EMULONG)y[i] + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11256) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11257) if( tmp >= BASE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11258) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11259) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11260) p[-i] = tmp - BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11261) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11262) p[i] = tmp - BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11263) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11264) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11265) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11266) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11267) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11268) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11269) p[-i] = tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11270) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11271) p[i] = tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11272) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11273) carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11274) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11275) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11276) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11277) p[-i] = (EMULONG)p[-i] + carry - BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11278) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11279) p[i] = (EMULONG)p[i] + carry - BASE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11280) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11281) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11282)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11283) } /* End for( k = m, j = bden + k; k >= 0; --k, --j ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11284)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11285) /* Деление завершено. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11286)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11287) /************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11288) Если происходила нормализация - разделить на нормализующий
868b2b66 (kx 2024-12-20 16:11:07 +0300 11289) множитель. То, что остадось от делимого (X) - остаток.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11290) ************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11291) if( scale > 1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11292) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11293) EMUSHORT junk;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11294)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11295) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11296) /* iSINGLE_EMUSHORTd( y+1, &junk, y+1, scale, np ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11297) iSINGLE_EMUSHORTd( rem, &junk, x+1, scale, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11298) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11299) /* iSINGLE_EMUSHORTd( y, &junk, y, scale, np ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11300) iSINGLE_EMUSHORTd( rem, &junk, x, scale, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11301) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11302) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11303) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11304) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11305) for( i = 0; i < np; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11306) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11307) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11308) rem[i] = x[i+1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11309) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11310) rem[i] = x[i];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11311) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11312) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11313) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11314)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11315) /************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11316) CHECK FLAGS:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11317) ************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11318) check_flags_and_stop:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11319)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11320) /* r = rem; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11321) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11322) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11323) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11324) if( *r ) remainder |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11325) ++r; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11326) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11327)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11328) if( remainder ) __STR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11329) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11330)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11331) if( sign_num ^ sign_den )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11332) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11333) ineg_np( rem, rem, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11334) ineg_np( quot, quot, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11335)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11336) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11337) __CLC; /* CF (carry) flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11338)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11339) if( __MFLAG(SF) == (sign_num ^ sign_den) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11340) /* if( Correct result Sign ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11341) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11342)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11343) /* flags:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11344) OF - Overflow Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11345) SF - Sign Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11346) PF - Parity Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11347) ZF - Zero Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11348) VF - Invalid Flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 11349) are Correct after last ineg_np() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11350)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11351) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11352) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11353) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11354) /* FREE pcpy_den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11355) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11356) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11357)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11358) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11359) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11360)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11361) /* z = quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11362)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11363) /* PF (parity) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11364) __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11365)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11366) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11367) /* z = (high part of)quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11368) if( *z & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11369) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11370) /* z = (low part of)quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11371) if( z[np-1] & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11372) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11373) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11374)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11375) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11376) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11377) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11378) if( *z ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11379) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11380)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11381) ++z; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11382) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11383)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11384) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11385) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11386)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11387) if( __MFLAG(SF) ) __STO; /* warning */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11388) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11389) /* т.к. здесь идет речь о положительных числах
868b2b66 (kx 2024-12-20 16:11:07 +0300 11390) (именно в их знаковом представлении 011111)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11391) наличие 1 в старшем разряде недопустимо */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11392)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11393) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11394) __CLC; /* CF (carry) flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11395) __CLV; /* VF (invalid) flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11396)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11397) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11398) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11399) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11400) /* FREE pcpy_den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11401) __mpu_sbrk( -(int)((np+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11402) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11403)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11404) } /* End of isdiv_np() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11405)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11406) #undef BASE
868b2b66 (kx 2024-12-20 16:11:07 +0300 11407)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11408) #else /* Do not use CPU mul/div */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11409) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11410) Без использования операций деления процессора (CPU):
868b2b66 (kx 2024-12-20 16:11:07 +0300 11411) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11412)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11413) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11414) Операции беззнакового и знакового деления.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11415) Изменяет флаги: CF, AF=0, PF, ZF, SF, OF, RF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11416) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11417)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11418) void idiv_np( EMUSHORT *quot, EMUSHORT *rem, EMUSHORT *num, EMUSHORT *den, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11419) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11420) EMUSHORT *z, *r, *x, *y, j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11421) EMUSHORT *pcpy_num = 0, *pcpy_den = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11422) signed int remainder = 0, zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11423) signed int i, k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11424) int b, bnum, bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11425)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11426) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11427)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11428) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11429) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11430) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11431) __integer_invalid_size( (__mpu_char8_t *)"idiv_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11432) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11433) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11434)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11435) /* Allocate memory for Copy num ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11436) pcpy_num = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11437) if( !pcpy_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11438) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11439) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11440) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11441) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11442) scpy_s2s_np( pcpy_num, num, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11443) /*************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11444)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11445) /* Allocate memory for Copy den ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11446) pcpy_den = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11447) if( !pcpy_den )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11448) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11449) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11450) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11451) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11452) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11453) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11454) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11455) scpy_s2s_np( pcpy_den, den, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11456) /*************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11457)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11458) z = quot + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11459) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11460) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11461) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11462) *z = 0; /* bzero Quotient */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11463) --z; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11464) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11465) ++z; /* z = quot; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11466)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11467) r = rem + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11468) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11469) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11470) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11471) *r = 0; /* bzero Remainder */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11472) --r; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11473) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11474) ++r; /* r = rem; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11475)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11476) x = pcpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11477) y = pcpy_den;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11478)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11479) b = np * BITS_PER_EMUSHORT - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11480) while( !ORDER_BIT(x,b,np) && b != (-1) ) --b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11481) bnum = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11482)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11483) if( bnum == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11484) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11485) /* dividend == 0 (делимое == 0); ==> qout = 0; rem = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11486)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11487) /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11488) /* PF (parity) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11489) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11490) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11491)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11492) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11493) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11494) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11495) /* FREE pcpy_den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11496) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11497) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11498)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11499) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11500) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11501)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11502) b = np * BITS_PER_EMUSHORT - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11503) while( !ORDER_BIT(y,b,np) && b != (-1) ) --b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11504) bden = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11505)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11506) if( bden == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11507) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11508) /* DIVISION BY ZERO */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11509)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11510) /* x = pcpy_num; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11511) /* r = rem */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11512) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11513) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11514) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11515) *r = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11516)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11517) if( *r ) remainder |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11518)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11519) ++x; ++r;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11520) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11521) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11522)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11523) /* z = quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11524) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11525) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11526) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11527) *z = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11528) ++z; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11529) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11530)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11531) /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11532) /* PF (parity) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11533) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11534)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11535) if( remainder ) __STR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11536) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11537)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11538) __STC; __STO; __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11539)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11540) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11541) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11542) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11543) /* FREE pcpy_den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11544) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11545) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11546)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11547) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11548) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11549)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11550) if( bnum < bden )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11551) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11552) /* num < den; ==> qout = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11553)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11554) /* x = pcpy_num; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11555) /* r = rem */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11556) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11557) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11558) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11559) *r = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11560)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11561) if( *r ) remainder |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11562)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11563) ++x; ++r;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11564) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11565) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11566)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11567) /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11568) /* PF (parity) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11569) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11570)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11571) if( remainder ) __STR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11572) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11573)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11574) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11575)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11576) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11577) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11578) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11579) /* FREE pcpy_den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11580) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11581) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11582)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11583) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11584) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11585)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11586) k = bnum - bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11587)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11588) ishln_np( y, y, k, np ); /* value(k) my be zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11589)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11590) ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11591)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11592) /* z = quot; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11593) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11594) z = z + np - 1; /* z = (low part of)quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11595) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11596) for( i = 0; i < k; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11597) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11598) icmp_np( x, y, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11599) if( !__MFLAG(SF) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11600) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11601) isub_np( x, x, y, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11602) j = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11603) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11604) else j = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11605)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11606) ishl_np( quot, quot, np ); /* shift to 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11607) *z |= j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11608)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11609) ishr_np( y, y, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11610) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11611)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11612) /* z = (low part of)quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11613)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11614) /* PF (parity) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11615)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11616) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11617) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11618) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11619) if( *z ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11620) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11621)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11622) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11623) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11624) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11625) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11626) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11627) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11628) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11629)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11630) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11631) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11632)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11633) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11634) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11635) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11636) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11637) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11638) /* z = (high part of)quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11639) if( *z & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11640) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11641)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11642) if( __MFLAG(SF) ) __STO; /* warning */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11643) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11644)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11645) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11646) __CLC; /* CF (carry) flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11647) __CLV; /* VF (invalid) flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11648)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11649) /* copy pcpy_num to rem */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11650) /* r = rem; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11651) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11652) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11653) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11654) *r = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11655)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11656) if( *r ) remainder |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11657)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11658) ++x; ++r;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11659) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11660) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11661)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11662) if( remainder ) __STR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11663) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11664)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11665) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11666) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11667) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11668) /* FREE pcpy_den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11669) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11670) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11671)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11672) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11673)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11674) void isdiv_np( EMUSHORT *quot, EMUSHORT *rem, EMUSHORT *num, EMUSHORT *den, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11675) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11676) EMUSHORT *z, *r, *x, *y, j = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11677) EMUSHORT *pcpy_num = 0, *pcpy_den = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11678) signed int sign_num = 0, sign_den = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11679) signed int remainder = 0, zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11680) signed int i, k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11681) int b, bnum, bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11682)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11683) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11684)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11685) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11686) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11687) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11688) __integer_invalid_size( (__mpu_char8_t *)"isdiv_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11689) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11690) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11691)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11692) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11693) x = num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11694) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11695) x = num + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11696) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11697) if( *x & MASK_SIGN ) sign_num = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11698)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11699) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11700) y = den;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11701) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11702) y = den + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11703) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11704) if( *y & MASK_SIGN ) sign_den = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11705)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11706) /* Allocate memory for ConVerT num ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11707) pcpy_num = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11708) if( !pcpy_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11709) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11710) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11711) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11712) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11713) scpy_s2s_np( pcpy_num, num, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11714) /*************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11715)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11716) /* Allocate memory for ConVerT den ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11717) pcpy_den = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11718) if( !pcpy_den )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11719) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11720) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11721) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11722) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11723) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11724) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11725) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11726) scpy_s2s_np( pcpy_den, den, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11727) /*************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11728)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11729) if( sign_num ) ineg_np( pcpy_num, pcpy_num, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11730) if( sign_den ) ineg_np( pcpy_den, pcpy_den, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11731)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11732) z = quot + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11733) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11734) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11735) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11736) *z = 0; /* bzero Quotient */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11737) --z; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11738) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11739) ++z; /* z = quot; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11740)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11741) r = rem + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11742) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11743) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11744) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11745) *r = 0; /* bzero Remainder */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11746) --r; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11747) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11748) ++r; /* r = rem; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11749)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11750) x = pcpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11751) y = pcpy_den;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11752)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11753) b = np * BITS_PER_EMUSHORT - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11754) while( !ORDER_BIT(x,b,np) && b != (-1) ) --b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11755) bnum = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11756)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11757) if( bnum == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11758) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11759) /* dividend == 0 (делимое == 0); ==> qout = 0; rem = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11760)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11761) /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11762) /* PF (parity) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11763) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11764) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11765)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11766) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11767) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11768) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11769) /* FREE pcpy_den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11770) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11771) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11772)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11773) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11774) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11775)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11776) b = np * BITS_PER_EMUSHORT - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11777) while( !ORDER_BIT(y,b,np) && b != (-1) ) --b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11778) bden = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11779)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11780) if( bden == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11781) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11782) /* DIVISION BY ZERO */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11783)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11784) /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11785) /* PF (parity) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11786) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11787)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11788) if( sign_num ) ineg_np( pcpy_num, pcpy_num, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11789) /* x = pcpy_num; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11790) /* r = rem */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11791) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11792) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11793) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11794) *r = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11795)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11796) if( *r ) remainder |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11797)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11798) ++x; ++r;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11799) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11800) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11801)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11802) if( !sign_num ) j = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11803)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11804) /* z = quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11805) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11806) z = z + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11807) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11808) /* z = (low part of)quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11809) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11810) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11811) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11812) *z = j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11813)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11814) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11815) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11816) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11817) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11818) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11819) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11820) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11821)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11822) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11823) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11824) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11825) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11826) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11827) if( !sign_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11828) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11829) *z ^= MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11830) __CLS; /* Sign Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11831) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11832) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11833) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11834) *z |= MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11835) __STS; /* Sign Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11836) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11837)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11838) if( remainder ) __STR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11839) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11840)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11841) __STC; __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11842)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11843) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11844) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11845) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11846) /* FREE pcpy_den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11847) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11848) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11849)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11850) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11851) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11852)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11853) if( bnum < bden )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11854) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11855) /* num < den; ==> qout = 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11856)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11857) x = pcpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11858) /* r = rem */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11859) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11860) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11861) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11862) *r = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11863)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11864) if( *r ) remainder |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11865)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11866) ++x; ++r;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11867) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11868) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11869)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11870) if( sign_num ^ sign_den ) ineg_np( rem, rem, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11871)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11872) /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11873) /* PF (parity) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11874) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11875)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11876) if( remainder ) __STR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11877) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11878)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11879) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11880)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11881) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11882) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11883) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11884) /* FREE pcpy_den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11885) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11886) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11887)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11888) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11889) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11890)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11891) k = bnum - bden;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11892)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11893) ishln_np( y, y, k, np ); /* value(k) my be zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11894)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11895) ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11896)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11897) /* z = quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11898) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11899) z = z + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11900) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11901) /* z = (low part of)quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11902) for( i = 0; i < k; ++i )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11903) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11904) icmp_np( x, y, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11905) if( !__MFLAG(SF) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11906) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11907) isub_np( x, x, y, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11908) j = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11909) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11910) else j = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11911)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11912) ishl_np( quot, quot, np ); /* shift to 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11913) *z |= j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11914)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11915) ishr_np( y, y, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11916) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11917)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11918)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11919) /* copy pcpy_num to rem */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11920) /* x = pcpy_num */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11921) /* r = rem; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11922) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11923) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11924) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11925) *r = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11926)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11927) if( *r ) remainder |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11928)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11929) ++x; ++r;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11930) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11931) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11932)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11933) if( remainder ) __STR; /* RF=1, if(rem != 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11934) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11935)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11936) if( sign_num ^ sign_den )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11937) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11938) ineg_np( rem, rem, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11939) ineg_np( quot, quot, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11940)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11941) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11942) __CLC; /* CF (carry) flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11943)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11944) if( __MFLAG(SF) == (sign_num ^ sign_den) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11945) /* if( Correct result Sign ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11946) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11947)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11948) /* flags:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11949) OF - Overflow Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11950) SF - Sign Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11951) PF - Parity Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11952) ZF - Zero Flag,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11953) VF - Invalid Flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 11954) are Correct after last ineg_np() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11955)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11956) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11957) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11958) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11959) /* FREE pcpy_den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11960) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11961) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11962)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11963) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11964) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11965)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11966) /* z = (low part of)quot */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11967) /* PF (parity) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11968) __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11969)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11970) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11971) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11972) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11973) if( *z ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11974) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11975)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11976) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11977) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11978) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11979) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11980) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11981) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11982) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11983)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11984) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11985) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11986)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11987) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11988) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11989) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11990) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11991) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11992) if( *z & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11993) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11994)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11995) if( __MFLAG(SF) ) __STO; /* warning */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11996) else __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11997) /* т.к. здесь идет речь о положительных числах
868b2b66 (kx 2024-12-20 16:11:07 +0300 11998) (именно в их знаковом представлении 011111)
868b2b66 (kx 2024-12-20 16:11:07 +0300 11999) наличие 1 в старшем разряде недопустимо */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12000)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12001) __CLA; /* AF (aux carry) не определяем. Сбрасываем */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12002) __CLC; /* CF (carry) flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12003) __CLV; /* VF (invalid) flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12004)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12005) /* FREE pcpy_num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12006) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12007) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12008) /* FREE pcpy_den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12009) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12010) /*******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12011) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12012)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12013) #endif /* Use CPU mul/div */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12014)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12015)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12016) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12017) Операции преобразования целых чисел в строку и обратно.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12018) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12019)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12020) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12021) NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12022) ====
868b2b66 (kx 2024-12-20 16:11:07 +0300 12023) Числа, в виде строки, могут быть представлены следующим
868b2b66 (kx 2024-12-20 16:11:07 +0300 12024) образом:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12025)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12026) 0b111111
868b2b66 (kx 2024-12-20 16:11:07 +0300 12027) 0B111111 - двоичное число; разряды содержат
868b2b66 (kx 2024-12-20 16:11:07 +0300 12028) символы '0' или '1'; префикс 0b или
868b2b66 (kx 2024-12-20 16:11:07 +0300 12029) 0B.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12030)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12031) 01234567 - восьмеричное число; разряды содержат
868b2b66 (kx 2024-12-20 16:11:07 +0300 12032) символы ['0'-'7']; число начинается
868b2b66 (kx 2024-12-20 16:11:07 +0300 12033) с '0'.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12034)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12035) 0x123456789abcdef
868b2b66 (kx 2024-12-20 16:11:07 +0300 12036) 0X123456789ABCDEF - шестнадцатеричное число; разряды
868b2b66 (kx 2024-12-20 16:11:07 +0300 12037) содержат символы ['0'-'9'] и ['a'-'f']
868b2b66 (kx 2024-12-20 16:11:07 +0300 12038) в любом регистре; префикс 0x или 0X.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12039) (0X123456789aBcDeF - смесь
868b2b66 (kx 2024-12-20 16:11:07 +0300 12040) допускается.)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12041)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12042) 1234567890 - десятичное число; разряды содержат
868b2b66 (kx 2024-12-20 16:11:07 +0300 12043) символы ['0'-'9']; число не может
868b2b66 (kx 2024-12-20 16:11:07 +0300 12044) начинаться с символа '0'; допускаются
868b2b66 (kx 2024-12-20 16:11:07 +0300 12045) знаки '+', '-' перед числом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12046)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12047) Функции переводящие строку символов в число воспринимают
868b2b66 (kx 2024-12-20 16:11:07 +0300 12048) числа, представленные строкой, согласно префиксу и
868b2b66 (kx 2024-12-20 16:11:07 +0300 12049) переводят ее в целое, заданной длины; если число не
868b2b66 (kx 2024-12-20 16:11:07 +0300 12050) умещается в заданный формат - выставляется флаг
868b2b66 (kx 2024-12-20 16:11:07 +0300 12051) переполнения (OF).
868b2b66 (kx 2024-12-20 16:11:07 +0300 12052) =============================
868b2b66 (kx 2024-12-20 16:11:07 +0300 12053)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12054) Функции, переводящие число в строку, могут выводить число
868b2b66 (kx 2024-12-20 16:11:07 +0300 12055) символов равное количеству бит исходного формата плюс два
868b2b66 (kx 2024-12-20 16:11:07 +0300 12056) (max-префикс[2] и естественно завершающий + '\0').
868b2b66 (kx 2024-12-20 16:11:07 +0300 12057) ЕСЛИ ПОЛЬЗОВАТЕЛЬ ОТДАЛ ФУНКЦИИ УКАЗАТЕЛЬ НА СТРОКУ
868b2b66 (kx 2024-12-20 16:11:07 +0300 12058) МЕНЬШЕГО РАЗМЕРА ЧЕМ НЕОБХОДИМО ТО РЕЗУЛЬТАТ ОПРЕДЕЛЯЕТСЯ
868b2b66 (kx 2024-12-20 16:11:07 +0300 12059) РЕАКЦИЕЙ СИСТЕМНОЙ ФУНКЦИИ strcpy( char *, char * )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12060) НА ТАКОГО РОДА ОШИБКУ.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12061)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12062) Данные функции имеют дополнительный параметр radix,
868b2b66 (kx 2024-12-20 16:11:07 +0300 12063) который может быть равен 2, 8. 10 или 16 и по нему будет
868b2b66 (kx 2024-12-20 16:11:07 +0300 12064) установлен соответствующий префикс.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12065)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12066) Вообще, число может сопровождаться суффиксом:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12067)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12068) i128 - целое со знаком 128 бит (int128)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12069) ui128 - целое без знака 128 бит (unsigned int128)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12070)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12071) I128 - целое со знаком 128 бит
868b2b66 (kx 2024-12-20 16:11:07 +0300 12072) UI128 - целое без знака 128 бит
868b2b66 (kx 2024-12-20 16:11:07 +0300 12073)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12074) u - целое без знака зависимое от машины (int)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12075) U - целое без знака зависимое от машины (int)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12076) l - целое со знаком зависимое от машины (long int)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12077) L - целое со знаком зависимое от машины (long int)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12078)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12079) и естественно ul, Ul, uL, UL.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12080)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12081) ==========================================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 12082) = Описываемые ниже функции не читают суффиксы и требуют =
868b2b66 (kx 2024-12-20 16:11:07 +0300 12083) = от пользователя задавать правильный размер числа; =
868b2b66 (kx 2024-12-20 16:11:07 +0300 12084) ==========================================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 12085) При записи строки суффиксы тоже не добавляются.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12086)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12087)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12088) ПЕРЕВОД СТРОКИ В ЧИСЛО
868b2b66 (kx 2024-12-20 16:11:07 +0300 12089) ======================
868b2b66 (kx 2024-12-20 16:11:07 +0300 12090)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12091) Для функций перевода строки в число исходная строка должна
868b2b66 (kx 2024-12-20 16:11:07 +0300 12092) иметь форму:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12093)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12094) [пробелы][знак][пробелы][префикс][цифры]
868b2b66 (kx 2024-12-20 16:11:07 +0300 12095)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12096) к пробелам относятся: ' ', '\n', '\t', '\v', '\r'.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12097) знак: '+', '-'.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12098) префикс: 0b, 0B, 0, 0x, 0X.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12099) цифры: 1234567890 abcdef (ABCDEF).
868b2b66 (kx 2024-12-20 16:11:07 +0300 12100)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12101) Функции пропускают пробельные символы, анализируют знак,
868b2b66 (kx 2024-12-20 16:11:07 +0300 12102) если после знака есть пробелы, то они игнорируются и, после
868b2b66 (kx 2024-12-20 16:11:07 +0300 12103) этого, начинается разбор числа. После анализа префикса
868b2b66 (kx 2024-12-20 16:11:07 +0300 12104) становится ясно в какой системе счисления представлено
868b2b66 (kx 2024-12-20 16:11:07 +0300 12105) число. Если имеет место двоичное, восьмеричное или
868b2b66 (kx 2024-12-20 16:11:07 +0300 12106) шестнадцатеричное представление, то считанный ранее знак
868b2b66 (kx 2024-12-20 16:11:07 +0300 12107) просто игнорируется (ПОЛЬЗОВАТЕЛЮ СЛЕДУЕТ ОБРАТИТЬ ВНИМАНИЕ
868b2b66 (kx 2024-12-20 16:11:07 +0300 12108) НА ДАННОЕ ОБСТОЯТЕЛЬСТВО), число воспринимается как
868b2b66 (kx 2024-12-20 16:11:07 +0300 12109) беззнаковое.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12110) Если все значащие биты числа, представленного в строке, не
868b2b66 (kx 2024-12-20 16:11:07 +0300 12111) удается разместить в приемнике, то выставляется флаг OF и
868b2b66 (kx 2024-12-20 16:11:07 +0300 12112) работа функции завершается без дополнительных
868b2b66 (kx 2024-12-20 16:11:07 +0300 12113) предупреждений.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12114)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12115) После данных операций выставляются флаги PF, ZF, SF
868b2b66 (kx 2024-12-20 16:11:07 +0300 12116) согласно результату, флаги AF, CF сбрасываются в 0, а флаг
868b2b66 (kx 2024-12-20 16:11:07 +0300 12117) OF сигнализирует о наличии или отсутствии переполнения.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12118) Флаг RF не изменяется.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12119)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12120) Примеры:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12121)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12122) перевод строки в байт
868b2b66 (kx 2024-12-20 16:11:07 +0300 12123)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12124) "+0377" --> 11 111 111 OF=0, SF=1, PF=0, ZF=0.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12125) "-0477" --> 00 111 111 OF=1, SF=0, PF=0, ZF=0.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12126)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12127) знак здесь игнорируется, и так как для числа из второго
868b2b66 (kx 2024-12-20 16:11:07 +0300 12128) примера необходимо 9 бит, выставляется флаг OF=1.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12129) Результирующий знак определяется самим числом!
868b2b66 (kx 2024-12-20 16:11:07 +0300 12130)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12131) "+15" --> 0000 1111 OF=0, SF=0, PF=0, ZF=0.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12132) "-8" --> 1111 1000 OF=0, SF=1, PF=1, ZF=0.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12133)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12134) "+0xff" --> 1111 1111 OF=0, SF=1, PF=0, ZF=0.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12135)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12136) По отношению к bin, oct, hex числам Знаковые и Беззнаковые
868b2b66 (kx 2024-12-20 16:11:07 +0300 12137) функции действуют одинаково.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12138) По отношению к десятичным числам знаковые и беззнаковые
868b2b66 (kx 2024-12-20 16:11:07 +0300 12139) функции отличаются, например:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12140)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12141) знаковый перевод (iATOI...)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12142)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12143) "+128" --> 1000 0000 OF=1, т.к. 8-битное число
868b2b66 (kx 2024-12-20 16:11:07 +0300 12144) ограничено пределом +127.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12145)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12146) беззнаковый перевод (iATOUI...)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12147)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12148) "+128" --> 1000 0000 OF=0, т.к. беззнаковое
868b2b66 (kx 2024-12-20 16:11:07 +0300 12149) 8-битное целое не ограничено
868b2b66 (kx 2024-12-20 16:11:07 +0300 12150) числом 128.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12151)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12152)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12153) Строка читается до тех пор пока не будет обнаружен
868b2b66 (kx 2024-12-20 16:11:07 +0300 12154) символ, который нельзя отнести к числу. Если до этого
868b2b66 (kx 2024-12-20 16:11:07 +0300 12155) не было цифр то в приемник будет записан 0.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12156)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12157)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12158) ПЕРЕВОД ЧИСЛА В СТРОКУ
868b2b66 (kx 2024-12-20 16:11:07 +0300 12159) ======================
868b2b66 (kx 2024-12-20 16:11:07 +0300 12160)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12161) Флаги не выставляются и не изменяются!
868b2b66 (kx 2024-12-20 16:11:07 +0300 12162)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12163) Выводится префикс и число.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12164) для dес. чисел существует знаковый (iITOA...)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12165) и беззнаковый (iUITOA...) перевод
868b2b66 (kx 2024-12-20 16:11:07 +0300 12166)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12167) 1000 0000 --> "-128" знаковый
868b2b66 (kx 2024-12-20 16:11:07 +0300 12168) 1000 0000 --> "128" беззнаковый
868b2b66 (kx 2024-12-20 16:11:07 +0300 12169)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12170) 1111 1111 --> "-1" знаковый
868b2b66 (kx 2024-12-20 16:11:07 +0300 12171) 1111 1111 --> "255" беззнаковый
868b2b66 (kx 2024-12-20 16:11:07 +0300 12172)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12173) Числа 0b, 0, 0x выводятся без знака
868b2b66 (kx 2024-12-20 16:11:07 +0300 12174)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12175) 1111 1111 --> "0377" если radix=8
868b2b66 (kx 2024-12-20 16:11:07 +0300 12176) 1111 1111 --> "0xff" если radix=16
868b2b66 (kx 2024-12-20 16:11:07 +0300 12177) 1111 1111 --> "0b11111111" если radix=2
868b2b66 (kx 2024-12-20 16:11:07 +0300 12178)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12179) Если число равно 0, то будет выведен
868b2b66 (kx 2024-12-20 16:11:07 +0300 12180) "0" (radix = 8 or 10);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12181) "0x0" (radix = 16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12182) "0b0" (radix = 2).
868b2b66 (kx 2024-12-20 16:11:07 +0300 12183)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12184) Еще один параметр функций - uf если он равен
868b2b66 (kx 2024-12-20 16:11:07 +0300 12185) единице uf = 1, то буквы префикса и числа будут
868b2b66 (kx 2024-12-20 16:11:07 +0300 12186) выводиться в верхнем регистре, если он равен нулю
868b2b66 (kx 2024-12-20 16:11:07 +0300 12187) uf = 0, то в нижнем
868b2b66 (kx 2024-12-20 16:11:07 +0300 12188)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12189) pref=1 ---> "0XFF"
868b2b66 (kx 2024-12-20 16:11:07 +0300 12190) pref=0 ---> "0xff"
868b2b66 (kx 2024-12-20 16:11:07 +0300 12191)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12192) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12193)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12194) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12195) Операции преобразования символьных строк в целые числа.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12196) Изменяет флаги: CF=0, AF=0, PF, ZF, SF, OF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12197) Не изменяет: RF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12198) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12199)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12200) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12201) STATIC:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12202) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12203) #define _IS_SPACE_(c) ( (c) == NEWLINE || \
868b2b66 (kx 2024-12-20 16:11:07 +0300 12204) (c) == CR || \
868b2b66 (kx 2024-12-20 16:11:07 +0300 12205) (c) == SP || \
868b2b66 (kx 2024-12-20 16:11:07 +0300 12206) (c) == HT || \
868b2b66 (kx 2024-12-20 16:11:07 +0300 12207) (c) == VT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12208)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12209) #define _IS_DIGIT_(c) (((c) >= '0')&&((c) <= '9'))
868b2b66 (kx 2024-12-20 16:11:07 +0300 12210)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12211) #define _IS_XDIGIT_(c) ( (((c) >= '0')&&((c) <= '9')) || \
868b2b66 (kx 2024-12-20 16:11:07 +0300 12212) (((c) >= 'A')&&((c) <= 'F')) || \
868b2b66 (kx 2024-12-20 16:11:07 +0300 12213) (((c) >= 'a')&&((c) <= 'f')) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12214)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12215) static int hexval( int c )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12216) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12217) if( c >= '0' && c <= '9' ) return ( c - '0' );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12218) if( c >= 'A' && c <= 'F' ) return ( c - 'A' + 10 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12219) if( c >= 'a' && c <= 'f' ) return ( c - 'a' + 10 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12220)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12221) return( -1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12222) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12223)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12224) /*******************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12225) Функции:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12226) sATOI_..._10();
868b2b66 (kx 2024-12-20 16:11:07 +0300 12227) sATOI_..._16();
868b2b66 (kx 2024-12-20 16:11:07 +0300 12228) sATOI_..._8();
868b2b66 (kx 2024-12-20 16:11:07 +0300 12229) sATOI_..._2();
868b2b66 (kx 2024-12-20 16:11:07 +0300 12230) получают указатель на не пустую строку без префикса
868b2b66 (kx 2024-12-20 16:11:07 +0300 12231) (0b, 0B, 0, 0x или 0X), содержащую только цифры:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12232) 0123456789abcdef (или ABCDEF) (пробелы перед цифрами
868b2b66 (kx 2024-12-20 16:11:07 +0300 12233) не допускаются).
868b2b66 (kx 2024-12-20 16:11:07 +0300 12234)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12235) sATOI_..._10(); - читает число пока не встретит
868b2b66 (kx 2024-12-20 16:11:07 +0300 12236) символ который нельзя отнести
868b2b66 (kx 2024-12-20 16:11:07 +0300 12237) к набору десятичных чисел
868b2b66 (kx 2024-12-20 16:11:07 +0300 12238) [0123456789].
868b2b66 (kx 2024-12-20 16:11:07 +0300 12239) sATOI_..._16(); - читает число пока не встретит
868b2b66 (kx 2024-12-20 16:11:07 +0300 12240) символ который нельзя отнести
868b2b66 (kx 2024-12-20 16:11:07 +0300 12241) к набору шестнадцатиричных чисел
868b2b66 (kx 2024-12-20 16:11:07 +0300 12242) [0123456789abcdef(ABCDEF)].
868b2b66 (kx 2024-12-20 16:11:07 +0300 12243) sATOI_..._8(); - читает число пока не встретит
868b2b66 (kx 2024-12-20 16:11:07 +0300 12244) символ который нельзя отнести
868b2b66 (kx 2024-12-20 16:11:07 +0300 12245) к набору восмеричных чисел
868b2b66 (kx 2024-12-20 16:11:07 +0300 12246) [01234567].
868b2b66 (kx 2024-12-20 16:11:07 +0300 12247) sATOI_..._2(); - читает число пока не встретит
868b2b66 (kx 2024-12-20 16:11:07 +0300 12248) символ который нельзя отнести
868b2b66 (kx 2024-12-20 16:11:07 +0300 12249) к набору двоичных чисел
868b2b66 (kx 2024-12-20 16:11:07 +0300 12250) [01].
868b2b66 (kx 2024-12-20 16:11:07 +0300 12251) *******************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12252) static void satoi8_10( __mpu_uint8_t *c, __mpu_char8_t *str )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12253) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12254) __mpu_uint8_t b, weight = 10;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12255) __mpu_uint16_t tmp = 0, mul = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12256) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12257) signed int save_RF;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12258) signed int i = 0; /* number of digits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12259)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12260) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12261)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12262) save_RF = __MFLAG(RF); /* save RF */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12263)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12264) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12265)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12266) while( _IS_DIGIT_(*ptr) ) { ++ptr; ++i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12267) --ptr; /* указывает на младшую цифру */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12268)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12269) *c = 0; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12270)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12271) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12272) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12273) b = (__mpu_uint8_t) *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12274) b -= '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 12275)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12276) icpy_s2l_8to16( (__mpu_uint16_t *)&tmp, &b );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12277) imul_8( (__mpu_uint16_t *)&tmp, (__mpu_uint8_t *)&tmp, (__mpu_uint8_t *)&mul );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12278)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12279) if( !__MFLAG(RF) ) /* high part of tmp[] is null */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12280) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12281) iadd_8( c, c, (__mpu_uint8_t *)&tmp );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12282)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12283) if( __MFLAG(CF) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12284) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12285) /* overflow */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12286) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12287)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12288) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12289) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12290) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12291)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12292) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12293) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12294)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12295) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12296) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12297)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12298) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12299) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12300) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12301) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12302) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12303) /* overflow */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12304) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12305)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12306) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12307) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12308) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12309)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12310) if( *c ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12311) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12312)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12313) if( *c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12314) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12315)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12316) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12317) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12318)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12319) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12320) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12321)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12322) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12323) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12324)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12325) imul_8( (__mpu_uint16_t *)&mul, (__mpu_uint8_t *)&mul, &weight );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12326)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12327) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12328) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12329)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12330) if( i && __MFLAG(RF) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12331) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12332) /* overflow */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12333) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12334)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12335) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12336) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12337) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12338)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12339) if( *c ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12340) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12341)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12342) if( *c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12343) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12344)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12345) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12346) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12347)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12348) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12349) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12350)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12351) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12352) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12353)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12354) } /* End while( i > 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12355)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12356) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12357) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12358) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12359)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12360) if( *c ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12361) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12362)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12363) if( *c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12364) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12365)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12366) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12367) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12368) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12369)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12370) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12371) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12372) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12373)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12374) static void satoi8_16( __mpu_uint8_t *c, __mpu_char8_t *str )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12375) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12376) __mpu_uint8_t b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12377) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12378) signed int i = 0; /* number of digits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12379) signed int k = 0; /* number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12380)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12381) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12382)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12383) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12384)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12385) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12386)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12387) while( _IS_XDIGIT_(*ptr) ) { ++ptr; ++i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12388) --ptr; /* указывает на младшую цифру */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12389)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12390) *c = 0; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12391)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12392) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12393) if( i > 2 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12394) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12395) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12396) i = 2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12397) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12398)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12399) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12400) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12401) b = (__mpu_uint8_t) *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12402) b = (__mpu_uint8_t) hexval( b );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12403)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12404) *c |= b << (k*4);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12405)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12406) --i; --ptr; ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12407)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12408) } /* End while( i > 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12409)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12410) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12411) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12412) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12413)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12414) if( *c ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12415) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12416)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12417) if( *c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12418) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12419)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12420) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12421) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12422) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12423)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12424) static void satoi8_8( __mpu_uint8_t *c, __mpu_char8_t *str )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12425) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12426) __mpu_uint8_t b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12427) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12428) signed int i = 0; /* number of digits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12429) signed int k = 0; /* number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12430)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12431) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12432)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12433) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12434)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12435) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12436)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12437) while( *ptr >= '0' && *ptr <= '7' ) { ++ptr; ++i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12438) --ptr; /* указывает на младшую цифру */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12439)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12440) *c = 0; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12441)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12442) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12443) if( i >= 3 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12444) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12445) b = (__mpu_uint8_t) *(ptr - 2);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12446) b -= '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 12447)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12448) if( b > 3 || i > 3 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12449) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12450) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12451) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12452) i = 3;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12453) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12454)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12455) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12456) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12457) b = (__mpu_uint8_t) *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12458) b -= '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 12459)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12460) *c |= b << (k*3);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12461)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12462) --i; --ptr; ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12463)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12464) } /* End while( i > 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12465)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12466) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12467) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12468) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12469)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12470) if( *c ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12471) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12472)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12473) if( *c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12474) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12475)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12476) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12477) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12478) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12479)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12480) static void satoi8_2( __mpu_uint8_t *c, __mpu_char8_t *str )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12481) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12482) __mpu_uint8_t b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12483) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12484) signed int i = 0; /* number of digits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12485) signed int k = 0; /* number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12486)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12487) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12488)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12489) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12490)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12491) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12492)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12493) while( *ptr == '0' || *ptr == '1' ) { ++ptr; ++i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12494) --ptr; /* указывает на младшую цифру */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12495)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12496) *c = 0; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12497)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12498) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12499) if( i > BITS_PER_BYTE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12500) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12501) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12502) i = BITS_PER_BYTE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12503) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12504)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12505) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12506) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12507) b = (__mpu_uint8_t) *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12508) b -= '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 12509)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12510) *c |= b << (k);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12511)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12512) --i; --ptr; ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12513)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12514) } /* End while( i > 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12515)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12516) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12517) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12518) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12519)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12520) if( *c ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12521) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12522)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12523) if( *c & 0x80 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12524) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12525)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12526) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12527) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12528) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12529) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 12530) End of STATIC.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12531) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12532)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12533) /* от -128 до +127 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12534) void iatoi_8( __mpu_uint8_t *c, __mpu_char8_t *str )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12535) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12536) signed int sign = 0, save_RF;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12537) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12538)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12539) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12540)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12541) save_RF = __MFLAG(RF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12542)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12543) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12544)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12545) while( _IS_SPACE_(*ptr) ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12546) if( *ptr == '-' || *ptr == '+' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12547) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12548) if( *ptr == '-' ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12549) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12550) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12551) while( _IS_SPACE_(*ptr) ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12552)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12553) if( !_IS_DIGIT_( *ptr ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12554) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12555) /* error: invalid number in string */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12556) __integer_invalid_number( (__mpu_char8_t *)"iatoi_8" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12557)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12558) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12559)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12560) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12561) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12562) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12563)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12564) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12565) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12566)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12567) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12568) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12569)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12570) if( *ptr == '0' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12571) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12572) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12573) switch( *ptr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12574) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12575) case 'b':
868b2b66 (kx 2024-12-20 16:11:07 +0300 12576) case 'B':
868b2b66 (kx 2024-12-20 16:11:07 +0300 12577) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12578) /* binary */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12579) satoi8_2( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12580) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12581) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12582)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12583) case 'x':
868b2b66 (kx 2024-12-20 16:11:07 +0300 12584) case 'X':
868b2b66 (kx 2024-12-20 16:11:07 +0300 12585) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12586) /* hexadecimal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12587) satoi8_16( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12588) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12589) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12590)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12591) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12592) /* octal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12593) if( !_IS_DIGIT_(*ptr) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12594) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12595) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12596)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12597) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12598) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12599) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12600)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12601) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12602) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12603) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12604) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12605) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12606) satoi8_8( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12607) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12608) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12609) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12610)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12611) } /* End of switch( *ptr ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12612) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12613) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12614) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12615) satoi8_10( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12616) if( __MFLAG(OF) ) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12617)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12618) if( sign ) ineg_8( c, c );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12619) if( sign == __MFLAG(SF) ) __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12620) else __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12621)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12622) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12623) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12624)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12625) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12626) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12627) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12628)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12629) /* от 0 до +255 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12630) void iatoui_8( __mpu_uint8_t *c, __mpu_char8_t *str )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12631) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12632) signed int save_RF;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12633) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12634)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12635) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12636)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12637) save_RF = __MFLAG(RF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12638)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12639) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12640)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12641) while( _IS_SPACE_(*ptr) ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12642) if( *ptr == '-' || *ptr == '+' ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12643) while( _IS_SPACE_(*ptr) ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12644)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12645) if( !_IS_DIGIT_( *ptr ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12646) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12647) /* error: invalid number in string */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12648) __integer_invalid_number( (__mpu_char8_t *)"iatoui_8" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12649)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12650) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12651)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12652) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12653) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12654) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12655)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12656) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12657) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12658)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12659) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12660) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12661)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12662) if( *ptr == '0' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12663) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12664) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12665) switch( *ptr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12666) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12667) case 'b':
868b2b66 (kx 2024-12-20 16:11:07 +0300 12668) case 'B':
868b2b66 (kx 2024-12-20 16:11:07 +0300 12669) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12670) /* binary */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12671) satoi8_2( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12672) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12673) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12674)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12675) case 'x':
868b2b66 (kx 2024-12-20 16:11:07 +0300 12676) case 'X':
868b2b66 (kx 2024-12-20 16:11:07 +0300 12677) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12678) /* hexadecimal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12679) satoi8_16( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12680) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12681) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12682)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12683) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12684) /* octal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12685) if( !_IS_DIGIT_(*ptr) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12686) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12687) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12688)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12689) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12690) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12691) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12692)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12693) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12694) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12695) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12696) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12697) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12698) satoi8_8( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12699) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12700) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12701) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12702)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12703) } /* End of switch( *ptr ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12704) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12705) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12706) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12707) satoi8_10( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12708) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12709) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12710) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12711)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12712) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12713) STATIC:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12714) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12715) static void satoi16_10( __mpu_uint16_t *c, __mpu_char8_t *str )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12716) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12717) __mpu_uint16_t b, weight = 10;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12718) __mpu_uint32_t tmp = 0, mul = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12719) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12720) signed int save_RF;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12721) signed int i = 0; /* number of digits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12722)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12723) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12724)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12725) save_RF = __MFLAG(RF); /* save RF */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12726)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12727) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12728)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12729) while( _IS_DIGIT_(*ptr) ) { ++ptr; ++i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12730) --ptr; /* указывает на младшую цифру */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12731)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12732) *c = 0; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12733)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12734) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12735) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12736) b = (__mpu_uint16_t) *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12737) b -= '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 12738)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12739) icpy_s2l_16to32( &tmp, &b );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12740) imul_16( &tmp, (__mpu_uint16_t *)&tmp, (__mpu_uint16_t *)&mul );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12741)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12742) if( !__MFLAG(RF) ) /* high part of tmp[] is null */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12743) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12744) iadd_16( c, c, (__mpu_uint16_t *)&tmp );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12745)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12746) if( __MFLAG(CF) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12747) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12748) /* overflow */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12749) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12750)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12751) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12752) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12753) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12754)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12755) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12756) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12757)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12758) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12759) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12760)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12761) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12762) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12763)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12764) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12765) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12766) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12767) /* overflow */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12768) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12769)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12770) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12771) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12772) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12773)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12774) if( *c ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12775) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12776)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12777) if( *c & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12778) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12779)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12780) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12781) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12782)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12783) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12784) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12785)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12786) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12787) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12788)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12789) imul_16( &mul, (__mpu_uint16_t *)&mul, &weight );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12790)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12791) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12792) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12793)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12794) if( i && __MFLAG(RF) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12795) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12796) /* overflow */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12797) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12798)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12799) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12800) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12801) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12802)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12803) if( *c ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12804) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12805)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12806) if( *c & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12807) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12808)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12809) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12810) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12811)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12812) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12813) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12814)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12815) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12816) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12817)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12818) } /* End while( i > 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12819)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12820) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12821) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12822) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12823)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12824) if( *c ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12825) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12826)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12827) if( *c & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12828) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12829)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12830) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12831) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12832) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12833)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12834) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12835) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12836) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12837)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12838) static void satoi16_16( __mpu_uint16_t *c, __mpu_char8_t *str )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12839) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12840) __mpu_uint16_t b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12841) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12842) signed int i = 0; /* number of digits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12843) signed int k = 0; /* number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12844)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12845) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12846)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12847) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12848)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12849) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12850)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12851) while( _IS_XDIGIT_(*ptr) ) { ++ptr; ++i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12852) --ptr; /* указывает на младшую цифру */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12853)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12854) *c = 0; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12855)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12856) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12857) if( i > 4 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12858) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12859) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12860) i = 4;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12861) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12862)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12863) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12864) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12865) b = (__mpu_uint16_t) *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12866) b = (__mpu_uint16_t) hexval( b );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12867)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12868) *c |= b << (k*4);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12869)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12870) --i; --ptr; ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12871)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12872) } /* End while( i > 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12873)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12874) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12875) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12876) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12877)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12878) if( *c ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12879) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12880)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12881) if( *c & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12882) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12883)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12884) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12885) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12886) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12887)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12888) static void satoi16_8( __mpu_uint16_t *c, __mpu_char8_t *str )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12889) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12890) __mpu_uint16_t b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12891) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12892) signed int i = 0; /* number of digits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12893) signed int k = 0; /* number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12894)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12895) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12896)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12897) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12898)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12899) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12900)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12901) while( *ptr >= '0' && *ptr <= '7' ) { ++ptr; ++i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12902) --ptr; /* указывает на младшую цифру */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12903)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12904) *c = 0; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12905)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12906) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12907) if( i >= 6 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12908) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12909) b = (__mpu_uint16_t) *(ptr - 5);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12910) b -= '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 12911)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12912) if( b > 1 || i > 6 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12913) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12914) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12915) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12916) i = 6;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12917) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12918)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12919) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12920) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12921) b = (__mpu_uint16_t) *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12922) b -= '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 12923)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12924) *c |= b << (k*3);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12925)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12926) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12927) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12928) ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12929)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12930) } /* End while( i > 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12931)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12932) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12933) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12934) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12935)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12936) if( *c ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12937) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12938)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12939) if( *c & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12940) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12941)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12942) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12943) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12944) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12945)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12946) static void satoi16_2( __mpu_uint16_t *c, __mpu_char8_t *str )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12947) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12948) __mpu_uint16_t b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12949) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12950) signed int i = 0; /* number of digits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12951) signed int k = 0; /* number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12952)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12953) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12954)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12955) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12956)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12957) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12958)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12959) while( *ptr == '0' || *ptr == '1' ) { ++ptr; ++i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12960) --ptr; /* указывает на младшую цифру */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12961)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12962) *c = 0; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12963)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12964) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12965) if( i > BITS_PER_TWO_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12966) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12967) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12968) i = BITS_PER_TWO_BYTES;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12969) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12970)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12971) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12972) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12973) b = (__mpu_uint16_t) *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12974) b -= '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 12975)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12976) *c |= b << (k);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12977)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12978) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12979) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12980) ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12981)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12982) } /* End while( i > 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12983)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12984) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12985) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12986) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12987)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12988) if( *c ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12989) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12990)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12991) if( *c & 0x8000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12992) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12993)
868b2b66 (kx 2024-12-20 16:11:07 +0300 12994) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12995) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12996) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12997) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 12998) End of STATIC.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12999) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13000)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13001) /* от -32768 до +32767 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13002) void iatoi_16( __mpu_uint16_t *c, __mpu_char8_t *str )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13003) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13004) signed int sign = 0, save_RF;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13005) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13006)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13007) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13008)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13009) save_RF = __MFLAG(RF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 13010)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13011) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13012)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13013) while( _IS_SPACE_(*ptr) ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13014) if( *ptr == '-' || *ptr == '+' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13015) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13016) if( *ptr == '-' ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13017) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13018) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13019) while( _IS_SPACE_(*ptr) ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13020)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13021) if( !_IS_DIGIT_( *ptr ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13022) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13023) /* error: invalid number in string */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13024) __integer_invalid_number( (__mpu_char8_t *)"iatoi_16" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13025)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13026) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13027)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13028) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13029) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13030) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13031)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13032) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13033) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13034)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13035) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13036) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13037)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13038) if( *ptr == '0' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13039) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13040) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13041) switch( *ptr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13042) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13043) case 'b':
868b2b66 (kx 2024-12-20 16:11:07 +0300 13044) case 'B':
868b2b66 (kx 2024-12-20 16:11:07 +0300 13045) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13046) /* binary */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13047) satoi16_2( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13048) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13049) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13050)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13051) case 'x':
868b2b66 (kx 2024-12-20 16:11:07 +0300 13052) case 'X':
868b2b66 (kx 2024-12-20 16:11:07 +0300 13053) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13054) /* hexadecimal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13055) satoi16_16( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13056) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13057) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13058)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13059) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 13060) /* octal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13061) if( !_IS_DIGIT_(*ptr) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13062) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13063) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13064)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13065) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13066) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13067) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13068)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13069) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13070) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13071) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13072) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13073) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13074) satoi16_8( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13075) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13076) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13077) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13078)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13079) } /* End of switch( *ptr ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13080) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13081) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13082) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13083) satoi16_10( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13084) if( __MFLAG(OF) ) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13085)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13086) if( sign ) ineg_16( c, c );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13087) if( sign == __MFLAG(SF) ) __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13088) else __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13089)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13090) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13091) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13092)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13093) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13094) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13095) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13096)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13097)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13098) /* от 0 до +65535 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13099) void iatoui_16( __mpu_uint16_t *c, __mpu_char8_t *str )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13100) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13101) signed int save_RF;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13102) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13103)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13104) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13105)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13106) save_RF = __MFLAG(RF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 13107)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13108) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13109)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13110) while( _IS_SPACE_(*ptr) ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13111) if( *ptr == '-' || *ptr == '+' ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13112) while( _IS_SPACE_(*ptr) ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13113)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13114) if( !_IS_DIGIT_( *ptr ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13115) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13116) /* error: invalid number in string */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13117) __integer_invalid_number( (__mpu_char8_t *)"iatoui_16" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13118)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13119) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13120)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13121) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13122) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13123) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13124)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13125) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13126) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13127)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13128) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13129) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13130)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13131) if( *ptr == '0' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13132) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13133) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13134) switch( *ptr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13135) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13136) case 'b':
868b2b66 (kx 2024-12-20 16:11:07 +0300 13137) case 'B':
868b2b66 (kx 2024-12-20 16:11:07 +0300 13138) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13139) /* binary */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13140) satoi16_2( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13141) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13142) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13143)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13144) case 'x':
868b2b66 (kx 2024-12-20 16:11:07 +0300 13145) case 'X':
868b2b66 (kx 2024-12-20 16:11:07 +0300 13146) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13147) /* hexadecimal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13148) satoi16_16( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13149) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13150) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13151)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13152) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 13153) /* octal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13154) if( !_IS_DIGIT_(*ptr) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13155) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13156) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13157)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13158) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13159) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13160) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13161)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13162) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13163) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13164) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13165) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13166) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13167) satoi16_8( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13168) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13169) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13170) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13171)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13172) } /* End of switch( *ptr ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13173) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13174) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13175) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13176) satoi16_10( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13177) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13178) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13179) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13180)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13181)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13182) #define BITS_PER_EIGHT_BYTES 64
868b2b66 (kx 2024-12-20 16:11:07 +0300 13183)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13184) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 13185) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 13186) STATIC:
868b2b66 (kx 2024-12-20 16:11:07 +0300 13187) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13188) static void satoi32_10( __mpu_uint32_t *c, __mpu_char8_t *str )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13189) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13190) __mpu_uint32_t b, weight = 10;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13191) __mpu_uint64_t tmp = 0, mul = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13192) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13193) signed int save_RF;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13194) signed int i = 0; /* number of digits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13195)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13196) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13197)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13198) save_RF = __MFLAG(RF); /* save RF */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13199)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13200) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13201)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13202) while( _IS_DIGIT_(*ptr) ) { ++ptr; ++i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13203) --ptr; /* указывает на младшую цифру */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13204)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13205) *c = 0; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13206)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13207) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13208) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13209) b = (__mpu_uint32_t) *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13210) b -= '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 13211)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13212) icpy_s2l_32to_np( (EMUSHORT *)&tmp, &b, BITS_PER_EIGHT_BYTES/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13213) BITS_PER_EMUSHORT /* == 1 */ );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13214) imul_32( &tmp, (__mpu_uint32_t *)&tmp, (__mpu_uint32_t *)&mul );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13215)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13216) if( !__MFLAG(RF) ) /* high part of tmp[] is null */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13217) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13218) iadd_32( c, c, (__mpu_uint32_t *)&tmp );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13219)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13220) if( __MFLAG(CF) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13221) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13222) /* overflow */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13223) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13224)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13225) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13226) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13227) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13228)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13229) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13230) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13231)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13232) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13233) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13234)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13235) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13236) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13237)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13238) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13239) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13240) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13241) /* overflow */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13242) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13243)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13244) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13245) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13246) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13247)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13248) if( *c ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13249) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13250)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13251) if( *c & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13252) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13253)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13254) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13255) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13256)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13257) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13258) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13259)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13260) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13261) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13262)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13263) imul_32( &mul, (__mpu_uint32_t *)&mul, &weight );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13264)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13265) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13266) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13267)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13268) if( i && __iflag_major_rem )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13269) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13270) /* overflow */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13271) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13272)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13273) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13274) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13275) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13276)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13277) if( *c ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13278) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13279)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13280) if( *c & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13281) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13282)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13283) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13284) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13285)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13286) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13287) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13288)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13289) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13290) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13291)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13292) } /* End while( i > 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13293)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13294) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13295) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13296) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13297)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13298) if( *c ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13299) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13300)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13301) if( *c & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13302) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13303)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13304) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13305) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13306) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13307)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13308) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13309) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13310) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13311)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13312) static void satoi32_16( __mpu_uint32_t *c, __mpu_char8_t *str )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13313) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13314) __mpu_uint32_t b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13315) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13316) signed int i = 0; /* number of digits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13317) signed int k = 0; /* number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13318)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13319) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13320)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13321) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13322)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13323) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13324)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13325) while( _IS_XDIGIT_(*ptr) ) { ++ptr; ++i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13326) --ptr; /* указывает на младшую цифру */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13327)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13328) *c = 0; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13329)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13330) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13331) if( i > 8 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13332) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13333) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13334) i = 8;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13335) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13336)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13337) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13338) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13339) b = (__mpu_uint32_t) *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13340) b = (__mpu_uint32_t) hexval( b );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13341)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13342) *c |= b << (k*4);
868b2b66 (kx 2024-12-20 16:11:07 +0300 13343)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13344) --i; --ptr; ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13345)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13346) } /* End while( i > 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13347)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13348) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13349) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13350) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13351)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13352) if( *c ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13353) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13354)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13355) if( *c & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13356) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13357)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13358) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13359) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13360) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13361)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13362) static void satoi32_8( __mpu_uint32_t *c, __mpu_char8_t *str )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13363) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13364) __mpu_uint32_t b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13365) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13366) signed int i = 0; /* number of digits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13367) signed int k = 0; /* number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13368)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13369) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13370)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13371) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13372)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13373) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13374)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13375) while( *ptr >= '0' && *ptr <= '7' ) { ++ptr; ++i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13376) --ptr; /* указывает на младшую цифру */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13377)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13378) *c = 0; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13379)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13380) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13381) if( i >= 11 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13382) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13383) b = *(ptr - 10);
868b2b66 (kx 2024-12-20 16:11:07 +0300 13384) b -= '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 13385)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13386) if( b > 3 || i > 11 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13387) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13388) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13389) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13390) i = 11;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13391) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13392)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13393) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13394) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13395) b = (__mpu_uint32_t) *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13396) b -= '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 13397)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13398) *c |= b << (k*3);
868b2b66 (kx 2024-12-20 16:11:07 +0300 13399)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13400) --i; --ptr; ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13401)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13402) } /* End while( i > 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13403)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13404) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13405) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13406) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13407)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13408) if( *c ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13409) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13410)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13411) if( *c & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13412) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13413)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13414) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13415) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13416) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13417)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13418) static void satoi32_2( __mpu_uint32_t *c, __mpu_char8_t *str )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13419) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13420) __mpu_uint32_t b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13421) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13422) signed int i = 0; /* number of digits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13423) signed int k = 0; /* number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13424)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13425) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13426)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13427) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13428)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13429) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13430)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13431) while( *ptr == '0' || *ptr == '1' ) { ++ptr; ++i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13432) --ptr; /* указывает на младшую цифру */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13433)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13434) *c = 0; /* result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13435)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13436) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13437) if( i > BITS_PER_FOUR_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13438) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13439) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13440) i = BITS_PER_FOUR_BYTES;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13441) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13442)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13443) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13444) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13445) b = (__mpu_uint32_t) *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13446) b -= '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 13447)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13448) *c |= b << (k);
868b2b66 (kx 2024-12-20 16:11:07 +0300 13449)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13450) --i; --ptr; ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13451)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13452) } /* End while( i > 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13453)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13454) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13455) if( __MPARITY(*c) ) __STP; /* set parity flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13456) else __CLP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13457)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13458) if( *c ) __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13459) else __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13460)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13461) if( *c & 0x80000000 ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13462) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13463)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13464) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13465) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13466) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13467) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 13468) End of STATIC.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13469) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13470)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13471) /* от -2 147 483 648 до +2 147 483 647 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13472) void iatoi_32( __mpu_uint32_t *c, __mpu_char8_t *str )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13473) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13474) signed int sign = 0, save_RF;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13475) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13476)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13477) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13478)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13479) save_RF = __MFLAG(RF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 13480)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13481) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13482)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13483) while( _IS_SPACE_(*ptr) ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13484) if( *ptr == '-' || *ptr == '+' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13485) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13486) if( *ptr == '-' ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13487) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13488) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13489) while( _IS_SPACE_(*ptr) ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13490)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13491) if( !_IS_DIGIT_( *ptr ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13492) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13493) /* error: invalid number in string */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13494) __integer_invalid_number( (__mpu_char8_t *)"iatoi_32" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13495)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13496) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13497)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13498) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13499) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13500) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13501)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13502) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13503) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13504)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13505) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13506) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13507)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13508) if( *ptr == '0' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13509) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13510) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13511) switch( *ptr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13512) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13513) case 'b':
868b2b66 (kx 2024-12-20 16:11:07 +0300 13514) case 'B':
868b2b66 (kx 2024-12-20 16:11:07 +0300 13515) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13516) /* binary */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13517) satoi32_2( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13518) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13519) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13520)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13521) case 'x':
868b2b66 (kx 2024-12-20 16:11:07 +0300 13522) case 'X':
868b2b66 (kx 2024-12-20 16:11:07 +0300 13523) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13524) /* hexadecimal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13525) satoi32_16( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13526) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13527) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13528)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13529) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 13530) /* octal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13531) if( !_IS_DIGIT_(*ptr) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13532) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13533) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13534)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13535) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13536) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13537) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13538)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13539) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13540) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13541) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13542) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13543) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13544) satoi32_8( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13545) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13546) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13547) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13548)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13549) } /* End of switch( *ptr ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13550) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13551) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13552) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13553) satoi32_10( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13554) if( __MFLAG(OF) ) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13555)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13556) if( sign ) ineg_32( c, c );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13557) if( sign == __MFLAG(SF) ) __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13558) else __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13559)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13560) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13561) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13562)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13563) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13564) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13565) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13566)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13567)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13568) /* от 0 до +4 294 967 295 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13569) void iatoui_32( __mpu_uint32_t *c, __mpu_char8_t *str )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13570) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13571) signed int save_RF;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13572) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13573)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13574) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13575)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13576) save_RF = __MFLAG(RF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 13577)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13578) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13579)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13580) while( _IS_SPACE_(*ptr) ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13581) if( *ptr == '-' || *ptr == '+' ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13582) while( _IS_SPACE_(*ptr) ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13583)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13584) if( !_IS_DIGIT_( *ptr ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13585) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13586) /* error: invalid number in string */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13587) __integer_invalid_number( (__mpu_char8_t *)"iatoui_32" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13588)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13589) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13590)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13591) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13592) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13593) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13594)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13595) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13596) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13597)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13598) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13599) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13600)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13601) if( *ptr == '0' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13602) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13603) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13604) switch( *ptr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13605) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13606) case 'b':
868b2b66 (kx 2024-12-20 16:11:07 +0300 13607) case 'B':
868b2b66 (kx 2024-12-20 16:11:07 +0300 13608) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13609) /* binary */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13610) satoi32_2( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13611) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13612) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13613)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13614) case 'x':
868b2b66 (kx 2024-12-20 16:11:07 +0300 13615) case 'X':
868b2b66 (kx 2024-12-20 16:11:07 +0300 13616) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13617) /* hexadecimal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13618) satoi32_16( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13619) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13620) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13621)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13622) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 13623) /* octal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13624) if( !_IS_DIGIT_(*ptr) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13625) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13626) *c = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13627)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13628) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13629) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13630) __STZ; __CLP; /* __MPARITY(0) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13631)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13632) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13633) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13634) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13635) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13636) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13637) satoi32_8( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13638) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13639) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13640) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13641)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13642) } /* End of switch( *ptr ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13643) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13644) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13645) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13646) satoi32_10( c, ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13647) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13648) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13649) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13650)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13651) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13652)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13653)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13654) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 13655) STATIC:
868b2b66 (kx 2024-12-20 16:11:07 +0300 13656) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13657) static void satoi_np_10( EMUSHORT *c, __mpu_char8_t *str, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13658) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13659) EMUSHORT b, *z, *weight=0, *tmp=0, *mul=0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13660) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13661) signed int save_RF, zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13662) signed int n, i = 0; /* number of digits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13663)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13664) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13665)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13666) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13667)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13668) /* Allocate memory and *weight = 10; ************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13669) weight = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13670) if( !weight )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13671) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13672) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13673) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13674) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13675) (void)memset( (void *)weight, 0, np*SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13676) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13677) *(weight+np-1) = (EMUSHORT) 10;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13678) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13679) *weight = (EMUSHORT) 10;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13680) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13681) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13682)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13683) /* Allocate memory and *mul = 1; ****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13684) mul = (EMUSHORT *)__mpu_sbrk( (int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13685) if( !mul )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13686) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13687) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13688) /* FREE weight **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13689) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13690) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13691) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13692) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13693) (void)memset( (void *)mul, 0, 2*np*SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13694) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13695) *(mul+2*np-1) = (EMUSHORT) 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13696) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13697) *mul = (EMUSHORT) 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13698) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13699) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13700)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13701) /* Allocate memory and *tmp = 0; ****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13702) tmp = (EMUSHORT *)__mpu_sbrk( (int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13703) if( !tmp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13704) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13705) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13706) /* FREE mul *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13707) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13708) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13709) /* FREE weight **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13710) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13711) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13712) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13713) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13714) (void)memset( (void *)tmp, 0, 2*np*SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13715) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13716)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13717)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13718) save_RF = __MFLAG(RF); /* save RF */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13719)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13720) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13721)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13722) while( _IS_DIGIT_(*ptr) ) { ++ptr; ++i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13723) --ptr; /* указывает на младшую цифру */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13724)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13725) z = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13726) n = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13727) while( n > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13728) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13729) *z = 0; /* bzero Result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13730) --z; --n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13731) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13732) ++z; /* z = c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13733)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13734) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13735) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13736) b = (EMUSHORT) *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13737) b -= '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 13738)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13739) /* static: sCPY_s2l_emushort2emushort */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13740) scpy_s2l_np( (EMUSHORT *)tmp, &b, np*2, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13741) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13742) imul_np( tmp, tmp+np, mul+np, np*2, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13743) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13744) imul_np( tmp, tmp, mul, np*2, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13745) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13746) if( !__MFLAG(RF) ) /* high part of tmp[] is null */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13747) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13748) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13749) iadd_np( z, z, tmp+np, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13750) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13751) iadd_np( z, z, tmp, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13752) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13753)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13754) if( __MFLAG(CF) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13755) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13756) /* overflow */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13757) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13758)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13759) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13760) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13761) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13762)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13763) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13764) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13765)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13766) /* other flags is correct after ADD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13767)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13768) /* FREE tmp *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13769) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13770) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13771) /* FREE mul *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13772) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13773) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13774) /* FREE weight **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13775) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13776) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13777)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13778) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13779) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13780)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13781) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13782) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13783) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13784) /* overflow */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13785) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13786)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13787) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13788) /* z = c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13789) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13790) z = z + np - 1; /* z = (low part of)c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13791) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13792)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13793) n = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13794) while( n > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13795) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13796) if( *z ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13797) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13798)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13799) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13800) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13801) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13802) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13803) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13804) --n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13805) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13806) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13807) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13808)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13809) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13810) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13811) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13812) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13813) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13814) if( *z & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13815) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13816)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13817) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13818) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13819)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13820) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13821) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13822)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13823) /* FREE tmp *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13824) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13825) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13826) /* FREE mul *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13827) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13828) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13829) /* FREE weight **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13830) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13831) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13832)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13833) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13834) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13835)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13836) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13837) imul_np( mul, mul+np, weight, np*2, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13838) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13839) imul_np( mul, mul, weight, np*2, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13840) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13841)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13842) --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13843) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13844)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13845) if( i && __MFLAG(RF) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13846) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13847) /* overflow */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13848) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13849)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13850) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13851) /* z = c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13852) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13853) z = z + np - 1; /* z = (low part of)c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13854) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13855)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13856) n = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13857) while( n > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13858) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13859) if( *z ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13860) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13861)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13862) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13863) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13864) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13865) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13866) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13867) --n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13868) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13869) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13870) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13871)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13872) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13873) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13874) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13875) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13876) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13877) if( *z & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13878) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13879)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13880) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13881) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13882)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13883) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13884) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13885)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13886) /* FREE tmp *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13887) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13888) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13889) /* FREE mul *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13890) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13891) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13892) /* FREE weight **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13893) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13894) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13895)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13896) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13897) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13898)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13899) } /* End while( i ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13900)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13901) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13902) /* z = c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13903) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13904) z = z + np - 1; /* z = (low part of)c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13905) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13906)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13907) n = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13908) while( n > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13909) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13910) if( *z ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13911) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13912)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13913) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13914) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13915) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13916) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13917) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13918) --n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13919) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13920) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13921) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13922)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13923) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13924) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13925) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13926) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13927) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13928) if( *z & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13929) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13930)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13931) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13932) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13933) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13934)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13935) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13936) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13937)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13938) /* FREE tmp *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13939) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13940) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13941) /* FREE mul *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13942) __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13943) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13944) /* FREE weight **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13945) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13946) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13947) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13948)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13949) static void satoi_np_16( EMUSHORT *c, __mpu_char8_t *str, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13950) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13951) EMUSHORT b, *z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13952) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13953) signed int zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13954) signed int n, i = 0; /* number of digits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13955) signed int k = 0; /* number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13956)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13957) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13958)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13959) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13960)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13961) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13962)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13963) while( _IS_XDIGIT_(*ptr) ) { ++ptr; ++i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13964) --ptr; /* указывает на младшую цифру */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13965)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13966) z = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13967) n = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13968) while( n > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13969) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13970) *z = 0; /* bzero Result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13971) --z; --n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13972) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13973) ++z; /* z = c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13974)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13975) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13976) if( i > BITS_PER_EMUSHORT*np/4 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13977) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13978) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13979) i = BITS_PER_EMUSHORT*np/4;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13980) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13981)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13982) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13983) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13984) b = (EMUSHORT) *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13985) b = (EMUSHORT) hexval( b );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13986)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13987) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13988) z[(np-1) - N_PARTS(k*4)] |= b << (N_BITS(k*4));
868b2b66 (kx 2024-12-20 16:11:07 +0300 13989) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13990) z[N_PARTS(k*4)] |= b << (N_BITS(k*4));
868b2b66 (kx 2024-12-20 16:11:07 +0300 13991) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13992)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13993) --i; --ptr; ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13994)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13995) } /* End while( i ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13996)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13997) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13998) /* z = c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13999) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14000) z = z + np - 1; /* z = (low part of)c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14001) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14002)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14003) n = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14004) while( n > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14005) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14006) if( *z ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14007) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14008)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14009) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14010) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14011) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14012) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14013) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14014) --n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14015) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14016) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14017) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14018)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14019) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14020) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14021) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14022) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14023) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14024) if( *z & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14025) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14026)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14027) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14028) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14029) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14030)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14031) static void satoi_np_8( EMUSHORT *c, __mpu_char8_t *str, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14032) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14033) EMUSHORT b, *z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14034) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14035) signed int zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14036) signed int n, i = 0; /* number of digits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14037) signed int k = 0; /* number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14038)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14039) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14040)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14041) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14042)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14043) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14044)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14045) while( *ptr >= '0' && *ptr <= '7' ) { ++ptr; ++i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14046) --ptr; /* указывает на младшую цифру */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14047)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14048) z = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14049) n = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14050) while( n > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14051) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14052) *z = 0; /* bzero Result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14053) --z; --n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14054) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14055) ++z; /* z = c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14056)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14057) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14058) if( i >= BITS_PER_EMUSHORT*np/3+1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14059) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14060) b = (EMUSHORT) *(ptr - BITS_PER_EMUSHORT*np/3);
868b2b66 (kx 2024-12-20 16:11:07 +0300 14061) b -= '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14062)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14063) if( b > ((BITS_PER_EMUSHORT*np%3) | 1) ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 14064) /**********************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14065) Т.к. число бит всегда четное (кроме того мы
868b2b66 (kx 2024-12-20 16:11:07 +0300 14066) ориентируемся только на числа с четным
868b2b66 (kx 2024-12-20 16:11:07 +0300 14067) количеством частей [и это очень важно]),
868b2b66 (kx 2024-12-20 16:11:07 +0300 14068) остаток от деления его на 3 может быть равен
868b2b66 (kx 2024-12-20 16:11:07 +0300 14069) 1 или 2, по этому мы определяем максимальное
868b2b66 (kx 2024-12-20 16:11:07 +0300 14070) старшее восьмеричное число как
868b2b66 (kx 2024-12-20 16:11:07 +0300 14071) ((BITS_PER_EMUSHORT*np%3) | 1)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14072)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14073) Для двоичного представления это выглядит
868b2b66 (kx 2024-12-20 16:11:07 +0300 14074) следующим образом:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14075)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14076) количество бит: 0b0001 (1) 0b0010 (2)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14077) операция ИЛИ: |
868b2b66 (kx 2024-12-20 16:11:07 +0300 14078) 0b0001 (1) 0b0001 (1)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14079) = -----------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 14080) результат: 0b0001 (1) 0b0011 (3)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14081)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14082) ***********************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14083) i > (BITS_PER_EMUSHORT*np/3 + 1) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14084) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14085) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14086) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14087) i = BITS_PER_EMUSHORT*np/3+1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14088) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14089)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14090) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14091) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14092) b = (EMUSHORT) *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14093) b -= '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14094)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14095) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14096) z[(np-1) - N_PARTS(k*3)] |= b << (N_BITS(k*3));
868b2b66 (kx 2024-12-20 16:11:07 +0300 14097) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14098) z[N_PARTS(k*3)] |= b << (N_BITS(k*3));
868b2b66 (kx 2024-12-20 16:11:07 +0300 14099) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14100)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14101) /* code for octal only ***********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14102) if( k ) /* не делать стыковки при k == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14103) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14104) if( !(k%(BITS_PER_EMUSHORT*(N_PARTS(k*3)+1)/3)) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14105) {/***********************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14106) Если остаток от деления равен 0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14107) то мы работаем на стыке частей
868b2b66 (kx 2024-12-20 16:11:07 +0300 14108) (размером BITS_PER_EMUSHORT)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14109) целого.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14110) ***********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14111)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14112) if( !(N_PARTS(k*3) == np - 1) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14113) {/***********************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14114) Если мы не в старшей части
868b2b66 (kx 2024-12-20 16:11:07 +0300 14115) (размером BITS_PER_EMUSHORT)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14116) целого.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14117) ***********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14118)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14119) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14120) z[(np-1) - N_PARTS(k*3)-1] |=
868b2b66 (kx 2024-12-20 16:11:07 +0300 14121) b >> ((BITS_PER_EMUSHORT*(N_PARTS(k*3)+1))%3);
868b2b66 (kx 2024-12-20 16:11:07 +0300 14122) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14123) z[N_PARTS(k*3)+1] |=
868b2b66 (kx 2024-12-20 16:11:07 +0300 14124) b >> ((BITS_PER_EMUSHORT*(N_PARTS(k*3)+1))%3);
868b2b66 (kx 2024-12-20 16:11:07 +0300 14125) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14126) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14127) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14128) } /* End if( k ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14129) /*********************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14130)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14131) Все эти действия легко понять, если проследить их на
868b2b66 (kx 2024-12-20 16:11:07 +0300 14132) примере целого, состоящего из четырех частей по 32 бита:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14133)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14134) [part1] 11 111 111 111 111 111 111 111 111 111 111
868b2b66 (kx 2024-12-20 16:11:07 +0300 14135) == макс. число в старшем разряде равно
868b2b66 (kx 2024-12-20 16:11:07 +0300 14136) (2 | 1) = 3
868b2b66 (kx 2024-12-20 16:11:07 +0300 14137)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14138) [part1] 111 111 111 111 111 111 111 111 111 111 11
868b2b66 (kx 2024-12-20 16:11:07 +0300 14139) = сдвиг b для z+1 происходит на 0 бит
868b2b66 (kx 2024-12-20 16:11:07 +0300 14140)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14141) [part1] 1 111 111 111 111 111 111 111 111 111 111 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14142) = сдвиг b для z+1 происходит на 1 бита
868b2b66 (kx 2024-12-20 16:11:07 +0300 14143)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14144) [part0] 11 111 111 111 111 111 111 111 111 111 111
868b2b66 (kx 2024-12-20 16:11:07 +0300 14145) == сдвиг b для z+1 происходит на 2 бита
868b2b66 (kx 2024-12-20 16:11:07 +0300 14146)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14147) *********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14148)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14149) /* End code for octal only *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14150)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14151) --i; --ptr; ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14152)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14153) } /* End while( i ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14154)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14155) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14156) /* z = c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14157) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14158) z = z + np - 1; /* z = (low part of)c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14159) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14160)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14161) n = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14162) while( n > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14163) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14164) if( *z ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14165) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14166)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14167) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14168) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14169) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14170) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14171) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14172) --n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14173) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14174) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14175) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14176)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14177) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14178) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14179) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14180) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14181) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14182) if( *z & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14183) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14184)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14185) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14186) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14187) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14188)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14189) static void satoi_np_2( EMUSHORT *c, __mpu_char8_t *str, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14190) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14191) EMUSHORT b, *z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14192) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14193) signed int zero = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14194) signed int n, i = 0; /* number of digits */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14195) signed int k = 0; /* number of shifts */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14196)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14197) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14198)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14199) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14200)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14201) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14202)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14203) while( *ptr == '0' || *ptr == '1' ) { ++ptr; ++i; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14204) --ptr; /* указывает на младшую цифру */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14205)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14206) z = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14207) n = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14208) while( n > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14209) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14210) *z = 0; /* bzero Result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14211) --z; --n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14212) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14213) ++z; /* z = c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14214)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14215) __CLO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14216) if( i > BITS_PER_EMUSHORT*np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14217) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14218) __STO; /* Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14219) i = BITS_PER_EMUSHORT*np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14220) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14221)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14222) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14223) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14224) b = (EMUSHORT) *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14225) b -= '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14226)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14227) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14228) z[(np-1) - N_PARTS(k)] |= b << (N_BITS(k));
868b2b66 (kx 2024-12-20 16:11:07 +0300 14229) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14230) z[N_PARTS(k)] |= b << (N_BITS(k));
868b2b66 (kx 2024-12-20 16:11:07 +0300 14231) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14232)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14233) --i; --ptr; ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14234)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14235) } /* End while( i ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14236)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14237) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14238) /* z = c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14239) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14240) z = z + np - 1; /* z = (low part of)c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14241) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14242)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14243) n = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14244) while( n > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14245) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14246) if( *z ) zero &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14247) else zero &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14248)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14249) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14250) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14251) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14252) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14253) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14254) --n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14255) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14256) if( zero ) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14257) else __CLZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14258)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14259) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14260) ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14261) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14262) --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14263) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14264) if( *z & MASK_SIGN ) __STS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14265) else __CLS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14266)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14267) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14268) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14269) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14270) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 14271) End of STATIC.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14272) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14273)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14274) void iatoi_np( EMUSHORT *c, __mpu_char8_t *str, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14275) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14276) EMUSHORT *z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14277) signed int sign = 0, save_RF;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14278) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14279) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14280)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14281) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14282) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14283) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14284) __integer_invalid_size( (__mpu_char8_t *)"iatoi_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14285) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14286) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14287)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14288) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14289)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14290) save_RF = __MFLAG(RF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 14291)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14292) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14293)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14294) while( _IS_SPACE_(*ptr) ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14295) if( *ptr == '-' || *ptr == '+' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14296) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14297) if( *ptr == '-' ) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14298) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14299) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14300) while( _IS_SPACE_(*ptr) ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14301)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14302) if( !_IS_DIGIT_( *ptr ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14303) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14304) /* error: invalid number in string */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14305) __integer_invalid_number( (__mpu_char8_t *)"iatoi_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14306)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14307) z = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14308) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14309) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14310) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14311) *z = 0; /* bzero Result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14312) --z; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14313) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14314) /* ++z; */ /* z = c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14315)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14316) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14317) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14318) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14319)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14320) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14321) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14322)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14323) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14324) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14325)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14326) if( *ptr == '0' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14327) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14328) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14329) switch( *ptr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14330) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14331) case 'b':
868b2b66 (kx 2024-12-20 16:11:07 +0300 14332) case 'B':
868b2b66 (kx 2024-12-20 16:11:07 +0300 14333) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14334) /* binary */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14335) satoi_np_2( c, ptr, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14336) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14337) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14338)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14339) case 'x':
868b2b66 (kx 2024-12-20 16:11:07 +0300 14340) case 'X':
868b2b66 (kx 2024-12-20 16:11:07 +0300 14341) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14342) /* hexadecimal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14343) satoi_np_16( c, ptr, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14344) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14345) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14346)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14347) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14348) /* octal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14349) if( !_IS_DIGIT_(*ptr) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14350) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14351) z = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14352) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14353) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14354) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14355) *z = 0; /* bzero Result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14356) --z; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14357) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14358) /* ++z; */ /* z = c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14359)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14360) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14361) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14362) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14363)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14364) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14365) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14366) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14367) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14368) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14369) satoi_np_8( c, ptr, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14370) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14371) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14372) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14373)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14374) } /* End of switch( *ptr ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14375) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14376) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14377) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14378) satoi_np_10( c, ptr, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14379) if( __MFLAG(OF) ) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14380)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14381) if( sign ) ineg_np( c, c, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14382) if( sign == __MFLAG(SF) ) __CLO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14383) else __STO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14384)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14385) __CLA; /* Auxiliary Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14386) __CLC; /* Carry Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14387)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14388) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14389) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14390) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14391)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14392) void iatoui_np( EMUSHORT *c, __mpu_char8_t *str, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14393) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14394) EMUSHORT *z;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14395) __mpu_char8_t *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14396) signed int save_RF;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14397) signed int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14398)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14399) if( np < 1 || np > NP_MAX )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14400) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14401) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14402) __integer_invalid_size( (__mpu_char8_t *)"iatoui_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14403) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14404) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14405)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14406) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14407)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14408) save_RF = __MFLAG(RF);
868b2b66 (kx 2024-12-20 16:11:07 +0300 14409)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14410) ptr = str;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14411)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14412) while( _IS_SPACE_(*ptr) ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14413) if( *ptr == '-' || *ptr == '+' ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14414) while( _IS_SPACE_(*ptr) ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14415)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14416) if( !_IS_DIGIT_( *ptr ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14417) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14418) /* error: invalid number in string */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14419) __integer_invalid_number( (__mpu_char8_t *)"iatoui_np (emushort)" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14420)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14421) z = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14422) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14423) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14424) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14425) *z = 0; /* bzero Result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14426) --z; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14427) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14428) /* ++z; */ /* z = c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14429)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14430) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14431) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14432) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14433)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14434) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14435) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14436)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14437) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14438) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14439)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14440) if( *ptr == '0' )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14441) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14442) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14443) switch( *ptr )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14444) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14445) case 'b':
868b2b66 (kx 2024-12-20 16:11:07 +0300 14446) case 'B':
868b2b66 (kx 2024-12-20 16:11:07 +0300 14447) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14448) /* binary */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14449) satoi_np_2( c, ptr, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14450) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14451) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14452)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14453) case 'x':
868b2b66 (kx 2024-12-20 16:11:07 +0300 14454) case 'X':
868b2b66 (kx 2024-12-20 16:11:07 +0300 14455) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14456) /* hexadecimal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14457) satoi_np_16( c, ptr, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14458) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14459) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14460)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14461) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14462) /* octal */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14463) if( !_IS_DIGIT_(*ptr) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14464) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14465) z = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14466) i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14467) while( i > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14468) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14469) *z = 0; /* bzero Result */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14470) --z; --i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14471) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14472) /* ++z; */ /* z = c; (result) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14473)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14474) /* Set flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14475) __CLEAR_IFLAGS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14476) __STZ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14477)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14478) if( save_RF ) __STR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14479) else __CLR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14480) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14481) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14482) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14483) satoi_np_8( c, ptr, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14484) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14485) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14486) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14487)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14488) } /* End of switch( *ptr ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14489) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14490) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14491) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14492) satoi_np_10( c, ptr, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14493) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14494) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14495) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14496)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14497)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14498) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14499) Операции преобразования целых чисел в символьные строки.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14500) Не изменяет флаги: CF, AF, PF, ZF, SF, OF, RF.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14501) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14502) /* radix = 2(bin), 8(oct), 10(dec), or 16(hex). */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14503) /* uf = 0(lowercase letter) or
868b2b66 (kx 2024-12-20 16:11:07 +0300 14504) 1(uppercase letter) in prefix and hex-digits. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14505) /* sign = 0(' '), or 1('-'). */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14506)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14507) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14508) STATIC:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14509) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14510) static int hexdigit( int c, int uf )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14511) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14512) if( c >= 0 && c <= 9 ) return( '0' + c );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14513) if( c >= 10 && c <= 15 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14514) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14515) if( uf ) return( 'A' + c - 10 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14516) else return( 'a' + c - 10 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14517) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14518) return( -1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14519) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14520)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14521) /******************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14522) str - result
868b2b66 (kx 2024-12-20 16:11:07 +0300 14523) a - operand
868b2b66 (kx 2024-12-20 16:11:07 +0300 14524) sign - sign
868b2b66 (kx 2024-12-20 16:11:07 +0300 14525) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14526) static void sitoa8_10( __mpu_char8_t *str, __mpu_uint8_t *a, int sign )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14527) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14528) __mpu_uint8_t b, x, weight = 10;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14529) __mpu_char8_t *s = 0, *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14530) __mpu_uint32_t flags; /* temporary saved mpu flags register */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14531)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14532) int size = (int)((BITS_PER_BYTE+3)*sizeof( __mpu_char8_t )); /* n_bits + prefix[2] + '\0' */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14533)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14534) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14535)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14536) flags = __MPU_FLAGS; /* Store all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14537)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14538) s = (__mpu_char8_t *)__mpu_sbrk( size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14539) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14540) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14541) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14542) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14543) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14544) (void)memset( (void *)s, 0, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14545)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14546) ptr = s + BITS_PER_BYTE + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14547)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14548) b = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14549)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14550) if( b == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14551) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14552) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14553) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14554) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14555) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14556) do
868b2b66 (kx 2024-12-20 16:11:07 +0300 14557) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14558) idiv_8( &b, &x, &b, &weight );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14559)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14560) *ptr = 0x30 | x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14561) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14562)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14563) } while( b );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14564) *ptr = '0'; /* last symbol is zero ('0') */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14565)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14566) if( sign ) *ptr = '-';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14567) else ++ptr; /* *ptr is first (not zero) symbol */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14568)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14569) } /* End if( b == 0 ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14570) strncpy( (char *)str, (const char *)ptr, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14571)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14572) /* FREE *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14573) if( s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14574) __mpu_sbrk( -size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14575) /********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14576)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14577) __MPU_FLAGS = flags; /* Restore all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14578) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14579)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14580) /******************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14581) str - result
868b2b66 (kx 2024-12-20 16:11:07 +0300 14582) a - operand
868b2b66 (kx 2024-12-20 16:11:07 +0300 14583) uf - uppercase letter flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 14584) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14585) static void sitoa8_16( __mpu_char8_t *str, __mpu_uint8_t *a, int uf )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14586) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14587) __mpu_uint8_t b, x, mask = 15;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14588) __mpu_char8_t *s = 0, *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14589) int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14590)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14591) int size = (int)((BITS_PER_BYTE+3)*sizeof( __mpu_char8_t )); /* n_bits + prefix[2] + '\0' */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14592)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14593) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14594)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14595) s = (__mpu_char8_t *)__mpu_sbrk( size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14596) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14597) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14598) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14599) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14600) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14601) (void)memset( (void *)s, 0, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14602)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14603) ptr = s + BITS_PER_BYTE + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14604)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14605) b = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14606)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14607) if( b == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14608) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14609) *ptr = '0'; --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14610) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14611) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14612) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14613) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14614) while( i < BITS_PER_BYTE / 4 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14615) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14616) x = (b >> (i*4)) & mask;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14617) x = (__mpu_uint8_t)hexdigit( x, uf );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14618)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14619) *ptr = x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14620) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14621) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14622) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14623) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14624) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14625) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14626)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14627) } /* End if( b == 0 ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14628)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14629) if( uf ) *ptr = 'X';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14630) else *ptr = 'x';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14631) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14632) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14633)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14634) strncpy( (char *)str, (const char *)ptr, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14635)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14636) /* FREE *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14637) if( s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14638) __mpu_sbrk( -size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14639) /********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14640) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14641)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14642) /******************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14643) str - result
868b2b66 (kx 2024-12-20 16:11:07 +0300 14644) a - operand
868b2b66 (kx 2024-12-20 16:11:07 +0300 14645) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14646) static void sitoa8_8( __mpu_char8_t *str, __mpu_uint8_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14647) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14648) __mpu_uint8_t b, x, mask = 7;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14649) __mpu_char8_t *s = 0, *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14650) int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14651)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14652) int size = (int)((BITS_PER_BYTE+3)*sizeof( __mpu_char8_t )); /* n_bits + prefix[2] + '\0' */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14653)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14654) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14655)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14656) s = (__mpu_char8_t *)__mpu_sbrk( size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14657) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14658) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14659) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14660) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14661) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14662) (void)memset( (void *)s, 0, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14663)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14664) ptr = s + BITS_PER_BYTE + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14665)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14666) b = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14667)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14668) if( b == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14669) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14670) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14671) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14672) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14673) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14674) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14675) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14676) while( i < BITS_PER_BYTE / 3 + 1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14677) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14678) x = (b >> (i*3)) & mask;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14679)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14680) *ptr = 0x30 | x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14681) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14682) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14683) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14684)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14685) } /* End if( b == 0 ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14686)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14687) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14688)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14689) while( *ptr == '0' ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14690) --ptr; /* skip zero (exclude first) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14691)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14692) strncpy( (char *)str, (const char *)ptr, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14693)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14694) /* FREE *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14695) if( s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14696) __mpu_sbrk( -size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14697) /********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14698) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14699)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14700) /******************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14701) str - result
868b2b66 (kx 2024-12-20 16:11:07 +0300 14702) a - operand
868b2b66 (kx 2024-12-20 16:11:07 +0300 14703) uf - uppercase letter flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 14704) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14705) static void sitoa8_2( __mpu_char8_t *str, __mpu_uint8_t *a, int uf )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14706) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14707) __mpu_uint8_t b, x, mask = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14708) __mpu_char8_t *s = 0, *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14709) int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14710)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14711) int size = (int)((BITS_PER_BYTE+3)*sizeof( __mpu_char8_t )); /* n_bits + prefix[2] + '\0' */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14712)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14713) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14714)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14715) s = (__mpu_char8_t *)__mpu_sbrk( size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14716) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14717) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14718) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14719) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14720) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14721) (void)memset( (void *)s, 0, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14722)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14723) ptr = s + BITS_PER_BYTE + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14724)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14725) b = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14726)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14727) if( b == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14728) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14729) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14730) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14731) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14732) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14733) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14734) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14735) while( i < BITS_PER_BYTE )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14736) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14737) x = (b >> (i)) & mask;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14738)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14739) if( x ) *ptr = '1';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14740) else *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14741)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14742) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14743) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14744) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14745) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14746) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14747) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14748)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14749) } /* End if( b == 0 ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14750)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14751) if( uf ) *ptr = 'B';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14752) else *ptr = 'b';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14753) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14754) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14755)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14756) strncpy( (char *)str, (const char *)ptr, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14757)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14758) /* FREE *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14759) if( s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14760) __mpu_sbrk( -size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14761) /********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14762) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14763) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 14764) End of STATIC.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14765) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14766)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14767) /********************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14768) str - result
868b2b66 (kx 2024-12-20 16:11:07 +0300 14769) a - operand
868b2b66 (kx 2024-12-20 16:11:07 +0300 14770) radix - bin, oct, dec, hex
868b2b66 (kx 2024-12-20 16:11:07 +0300 14771) uf - uppercase letter flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 14772) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14773) void iitoa_8( __mpu_char8_t *str, __mpu_uint8_t *a, int radix, int uf )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14774) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14775) __mpu_uint8_t b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14776) int sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14777) __mpu_uint32_t flags; /* temporary saved mpu flags register */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14778)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14779) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14780)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14781) flags = __MPU_FLAGS; /* Store all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14782)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14783) switch( radix )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14784) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14785) case 2:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14786) sitoa8_2( str, a, uf );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14787) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14788)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14789) case 8:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14790) sitoa8_8( str, a );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14791) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14792)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14793) case 10:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14794) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14795) b = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14796)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14797) if( b & 0x80 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14798) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14799) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14800) ineg_8( &b, &b );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14801) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14802) sitoa8_10( str, &b, sign );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14803) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14804) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14805)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14806) case 16:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14807) sitoa8_16( str, a, uf );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14808) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14809)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14810) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14811) /* error: invalid radix for string */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14812) __integer_invalid_radix( (__mpu_char8_t *)"iitoa_8" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14813)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14814) *str = NUL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14815) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14816)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14817) } /* End of switch( radix ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14818)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14819) __MPU_FLAGS = flags; /* Restore all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14820) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14821)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14822) void iuitoa_8( __mpu_char8_t *str, __mpu_uint8_t *a, int radix, int uf )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14823) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14824) switch( radix )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14825) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14826) case 2:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14827) sitoa8_2( str, a, uf );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14828) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14829) case 8:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14830) sitoa8_8( str, a );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14831) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14832) case 10:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14833) sitoa8_10( str, a, 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14834) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14835) case 16:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14836) sitoa8_16( str, a, uf );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14837) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14838) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14839) /* error: invalid radix for string */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14840) __integer_invalid_radix( (__mpu_char8_t *)"iuitoa_8" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14841)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14842) *str = NUL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14843) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14844) } /* End of switch( radix ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14845) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14846)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14847) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14848) STATIC:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14849) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14850) /******************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14851) str - result
868b2b66 (kx 2024-12-20 16:11:07 +0300 14852) a - operand
868b2b66 (kx 2024-12-20 16:11:07 +0300 14853) sign - sign
868b2b66 (kx 2024-12-20 16:11:07 +0300 14854) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14855) static void sitoa16_10( __mpu_char8_t *str, __mpu_uint16_t *a, int sign )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14856) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14857) __mpu_uint16_t b, x, weight = 10;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14858) __mpu_char8_t *s = 0, *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14859) __mpu_uint32_t flags; /* temporary saved mpu flags register */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14860)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14861) int size = (int)((BITS_PER_TWO_BYTES+3)*sizeof( __mpu_char8_t )); /* n_bits + prefix[2] + '\0' */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14862)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14863) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14864)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14865) flags = __MPU_FLAGS; /* Store all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14866)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14867) s = (__mpu_char8_t *)__mpu_sbrk( size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14868) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14869) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14870) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14871) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14872) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14873) (void)memset( (void *)s, 0, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14874)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14875) ptr = s + BITS_PER_TWO_BYTES + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14876)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14877) b = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14878)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14879) if( b == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14880) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14881) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14882) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14883) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14884) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14885) do
868b2b66 (kx 2024-12-20 16:11:07 +0300 14886) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14887) idiv_16( &b, &x, &b, &weight );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14888)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14889) *ptr = 0x30 | (__mpu_uint8_t)x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14890) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14891)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14892) } while( b );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14893) *ptr = '0'; /* last symbol is zero ('0') */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14894)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14895) if( sign ) *ptr = '-';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14896) else ++ptr; /* *ptr is first (not zero) symbol */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14897)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14898) } /* End if( b == 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14899) strncpy( (char *)str, (const char *)ptr, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14900)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14901) /* FREE *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14902) if( s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14903) __mpu_sbrk( -size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14904) /********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14905)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14906) __MPU_FLAGS = flags; /* Restore all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14907) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14908)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14909) /******************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14910) str - result
868b2b66 (kx 2024-12-20 16:11:07 +0300 14911) a - operand
868b2b66 (kx 2024-12-20 16:11:07 +0300 14912) uf - uppercase letter flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 14913) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14914) static void sitoa16_16( __mpu_char8_t *str, __mpu_uint16_t *a, int uf )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14915) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14916) __mpu_uint16_t b, x, mask = 15;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14917) __mpu_char8_t *s = 0, *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14918) int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14919)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14920) int size = (int)((BITS_PER_TWO_BYTES+3)*sizeof( __mpu_char8_t )); /* n_bits + prefix[2] + '\0' */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14921)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14922) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14923)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14924) s = (__mpu_char8_t *)__mpu_sbrk( size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14925) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14926) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14927) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14928) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14929) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14930) (void)memset( (void *)s, 0, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14931)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14932) ptr = s + BITS_PER_TWO_BYTES + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14933)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14934) b = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14935)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14936) if( b == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14937) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14938) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14939) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14940) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14941) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14942) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14943) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14944) while( i < BITS_PER_TWO_BYTES / 4 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14945) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14946) x = (b >> (i*4)) & mask;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14947) x = (__mpu_uint16_t)hexdigit( x, uf );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14948)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14949) *ptr = (__mpu_uint8_t)x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14950) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14951) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14952) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14953) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14954) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14955) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14956)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14957) } /* End if( b == 0 ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14958)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14959) if( uf ) *ptr = 'X';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14960) else *ptr = 'x';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14961) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14962) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 14963)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14964) strncpy( (char *)str, (const char *)ptr, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14965)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14966) /* FREE *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14967) if( s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14968) __mpu_sbrk( -size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14969) /********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14970) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14971)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14972) /******************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14973) str - result
868b2b66 (kx 2024-12-20 16:11:07 +0300 14974) a - operand
868b2b66 (kx 2024-12-20 16:11:07 +0300 14975) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14976) static void sitoa16_8( __mpu_char8_t *str, __mpu_uint16_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14977) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14978) __mpu_uint16_t b, x, mask = 7;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14979) __mpu_char8_t *s = 0, *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14980) int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14981)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14982) int size = (int)((BITS_PER_TWO_BYTES+3)*sizeof( __mpu_char8_t )); /* n_bits + prefix[2] + '\0' */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14983)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14984) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14985)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14986) s = (__mpu_char8_t *)__mpu_sbrk( size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14987) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14988) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14989) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14990) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14991) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14992) (void)memset( (void *)s, 0, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14993)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14994) ptr = s + BITS_PER_TWO_BYTES + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14995)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14996) b = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14997)
868b2b66 (kx 2024-12-20 16:11:07 +0300 14998) if( b == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14999) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15000) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15001) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15002) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15003) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15004) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15005) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15006) while( i < BITS_PER_TWO_BYTES / 3 + 1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15007) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15008) x = (b >> (i*3)) & mask;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15009)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15010) *ptr = 0x30 | (__mpu_uint8_t)x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15011) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15012) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15013) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15014)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15015) } /* End if( b == 0 ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15016)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15017) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15018)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15019) while( *ptr == '0' ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15020) --ptr; /* skip zero (exclude first) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15021)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15022) strncpy( (char *)str, (const char *)ptr, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15023)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15024) /* FREE *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15025) if( s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15026) __mpu_sbrk( -size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15027) /********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15028) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15029)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15030) /******************
868b2b66 (kx 2024-12-20 16:11:07 +0300 15031) str - result
868b2b66 (kx 2024-12-20 16:11:07 +0300 15032) a - operand
868b2b66 (kx 2024-12-20 16:11:07 +0300 15033) uf - uppercase letter flag
868b2b66 (kx 2024-12-20 16:11:07 +0300 15034) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15035) static void sitoa16_2( __mpu_char8_t *str, __mpu_uint16_t *a, int uf )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15036) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15037) __mpu_uint16_t b, x, mask = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15038) __mpu_char8_t *s = 0, *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15039) int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15040)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15041) int size = (int)((BITS_PER_TWO_BYTES+3)*sizeof( __mpu_char8_t )); /* n_bits + prefix[2] + '\0' */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15042)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15043) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15044)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15045) s = (__mpu_char8_t *)__mpu_sbrk( size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15046) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15047) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15048) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15049) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15050) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15051) (void)memset( (void *)s, 0, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15052)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15053) ptr = s + BITS_PER_TWO_BYTES + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15054)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15055) b = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15056)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15057) if( b == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15058) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15059) *ptr = '0'; --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15060) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15061) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15062) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15063) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15064) while( i < BITS_PER_TWO_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15065) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15066) x = (b >> (i)) & mask;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15067)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15068) if( x ) *ptr = '1';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15069) else *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15070)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15071) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15072) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15073) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15074) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15075) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15076) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15077)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15078) } /* End if( b == 0 ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15079)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15080) if( uf ) *ptr = 'B';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15081) else *ptr = 'b';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15082) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15083) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15084)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15085) strncpy( (char *)str, (const char *)ptr, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15086)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15087) /* FREE *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15088) if( s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15089) __mpu_sbrk( -size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15090) /********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15091) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15092) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 15093) End of STATIC.
868b2b66 (kx 2024-12-20 16:11:07 +0300 15094) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15095)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15096) void iitoa_16( __mpu_char8_t *str, __mpu_uint16_t *a, int radix, int uf )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15097) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15098) __mpu_uint16_t b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15099) int sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15100) __mpu_uint32_t flags; /* temporary saved mpu flags register */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15101)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15102) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15103)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15104) flags = __MPU_FLAGS; /* Store all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15105)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15106) switch( radix )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15107) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15108) case 2:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15109) sitoa16_2( str, a, uf );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15110) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15111)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15112) case 8:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15113) sitoa16_8( str, a );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15114) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15115)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15116) case 10:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15117) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15118) b = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15119)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15120) if( b & 0x8000 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15121) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15122) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15123) ineg_16( &b, &b );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15124) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15125) sitoa16_10( str, &b, sign );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15126) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15127) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15128)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15129) case 16:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15130) sitoa16_16( str, a, uf );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15131) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15132)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15133) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15134) /* error: invalid radix for string */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15135) __integer_invalid_radix( (__mpu_char8_t *)"iitoa_16" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15136)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15137) *str = NUL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15138) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15139) } /* End of switch( radix ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15140) __MPU_FLAGS = flags; /* Restore all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15141) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15142)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15143) void iuitoa_16( __mpu_char8_t *str, __mpu_uint16_t *a, int radix, int uf )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15144) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15145) switch( radix )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15146) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15147) case 2:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15148) sitoa16_2( str, a, uf );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15149) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15150) case 8:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15151) sitoa16_8( str, a );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15152) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15153) case 10:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15154) sitoa16_10( str, a, 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15155) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15156) case 16:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15157) sitoa16_16( str, a, uf );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15158) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15159) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15160) /* error: invalid radix for string */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15161) __integer_invalid_radix( (__mpu_char8_t *)"iuitoa_16" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15162)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15163) *str = NUL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15164) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15165) } /* End of switch( radix ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15166) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15167)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15168)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15169) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 15170) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 15171) STATIC:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15172) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15173) static void sitoa32_10( __mpu_char8_t *str, __mpu_uint32_t *a, int sign )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15174) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15175) __mpu_uint32_t b, x, weight = 10;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15176) __mpu_char8_t *s = 0, *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15177) __mpu_uint32_t flags; /* temporary saved mpu flags register */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15178)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15179) int size = (int)((BITS_PER_FOUR_BYTES+3)*sizeof( __mpu_char8_t )); /* n_bits + prefix[2] + '\0' */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15180)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15181) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15182)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15183) flags = __MPU_FLAGS; /* Store all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15184)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15185) s = (__mpu_char8_t *)__mpu_sbrk( size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15186) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15187) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15188) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15189) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15190) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15191) (void)memset( (void *)s, 0, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15192)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15193) ptr = s + BITS_PER_FOUR_BYTES + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15194)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15195) b = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15196)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15197) if( b == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15198) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15199) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15200) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15201) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15202) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15203) do
868b2b66 (kx 2024-12-20 16:11:07 +0300 15204) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15205) idiv_32( &b, &x, &b, &weight );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15206)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15207) *ptr = 0x30 | (__mpu_uint8_t)x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15208) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15209)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15210) } while( b );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15211) *ptr = '0'; /* last symbol is zero ('0') */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15212)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15213) if( sign ) *ptr = '-';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15214) else ++ptr; /* *ptr is first (not zero) symbol */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15215)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15216) } /* End if( b == 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15217) strncpy( (char *)str, (const char *)ptr, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15218)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15219) /* FREE *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15220) if( s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15221) __mpu_sbrk( -size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15222) /********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15223)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15224) __MPU_FLAGS = flags; /* Restore all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15225) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15226)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15227) static void sitoa32_16( __mpu_char8_t *str, __mpu_uint32_t *a, int uf )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15228) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15229) __mpu_uint32_t b, x, mask = 15;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15230) __mpu_char8_t *s = 0, *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15231) int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15232)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15233) int size = (int)((BITS_PER_FOUR_BYTES+3)*sizeof( __mpu_char8_t )); /* n_bits + prefix[2] + '\0' */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15234)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15235) s = (__mpu_char8_t *)__mpu_sbrk( size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15236) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15237) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15238) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15239) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15240) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15241) (void)memset( (void *)s, 0, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15242)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15243) ptr = s + BITS_PER_FOUR_BYTES + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15244)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15245) b = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15246)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15247) if( b == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15248) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15249) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15250) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15251) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15252) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15253) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15254) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15255) while( i < BITS_PER_FOUR_BYTES / 4 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15256) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15257) x = (b >> (i*4)) & mask;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15258) x = (__mpu_uint32_t)hexdigit( x, uf );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15259)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15260) *ptr = (__mpu_uint8_t)x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15261) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15262) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15263) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15264) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15265) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15266) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15267)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15268) } /* End if( b == 0 ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15269)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15270) if( uf ) *ptr = 'X';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15271) else *ptr = 'x';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15272) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15273) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15274)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15275) strncpy( (char *)str, (const char *)ptr, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15276)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15277) /* FREE *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15278) if( s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15279) __mpu_sbrk( -size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15280) /********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15281) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15282)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15283) static void sitoa32_8( __mpu_char8_t *str, __mpu_uint32_t *a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15284) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15285) __mpu_uint32_t b, x, mask = 7;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15286) __mpu_char8_t *s = 0, *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15287) int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15288)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15289) int size = (int)((BITS_PER_FOUR_BYTES+3)*sizeof( __mpu_char8_t )); /* n_bits + prefix[2] + '\0' */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15290)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15291) s = (__mpu_char8_t *)__mpu_sbrk( size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15292) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15293) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15294) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15295) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15296) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15297) (void)memset( (void *)s, 0, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15298)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15299) ptr = s + BITS_PER_FOUR_BYTES + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15300)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15301) b = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15302)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15303) if( b == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15304) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15305) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15306) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15307) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15308) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15309) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15310) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15311) while( i < BITS_PER_FOUR_BYTES / 3 + 1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15312) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15313) x = (b >> (i*3)) & mask;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15314)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15315) *ptr = 0x30 | (__mpu_uint8_t)x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15316) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15317) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15318) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15319)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15320) } /* End if( b == 0 ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15321)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15322) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15323)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15324) while( *ptr == '0' ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15325) --ptr; /* skip zero (кроме first) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15326)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15327) strncpy( (char *)str, (const char *)ptr, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15328)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15329) /* FREE *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15330) if( s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15331) __mpu_sbrk( -size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15332) /********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15333) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15334)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15335) static void sitoa32_2( __mpu_char8_t *str, __mpu_uint32_t *a, int uf )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15336) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15337) __mpu_uint32_t b, x, mask = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15338) __mpu_char8_t *s = 0, *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15339) int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15340)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15341) int size = (int)((BITS_PER_FOUR_BYTES+3)*sizeof( __mpu_char8_t )); /* n_bits + prefix[2] + '\0' */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15342)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15343) s = (__mpu_char8_t *)__mpu_sbrk( size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15344) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15345) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15346) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15347) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15348) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15349) (void)memset( (void *)s, 0, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15350)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15351) ptr = s + BITS_PER_FOUR_BYTES + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15352)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15353) b = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15354)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15355) if( b == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15356) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15357) *ptr = '0'; --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15358) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15359) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15360) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15361) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15362) while( i < BITS_PER_FOUR_BYTES )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15363) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15364) x = (b >> (i)) & mask;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15365)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15366) if( x ) *ptr = '1';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15367) else *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15368)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15369) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15370) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15371) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15372) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15373) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15374) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15375)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15376) } /* End if( b == 0 ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15377)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15378) if( uf ) *ptr = 'B';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15379) else *ptr = 'b';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15380) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15381) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15382)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15383) strncpy( (char *)str, (const char *)ptr, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15384)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15385) /* FREE *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15386) if( s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15387) __mpu_sbrk( -size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15388) /********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15389) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15390) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 15391) End of STATIC.
868b2b66 (kx 2024-12-20 16:11:07 +0300 15392) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15393)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15394) void iitoa_32( __mpu_char8_t *str, __mpu_uint32_t *a, int radix, int uf )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15395) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15396) __mpu_uint32_t b;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15397) int sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15398) __mpu_uint32_t flags; /* temporary saved mpu flags register */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15399)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15400) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15401)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15402) flags = __MPU_FLAGS; /* Store all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15403)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15404) switch( radix )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15405) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15406) case 2:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15407) sitoa32_2( str, a, uf );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15408) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15409)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15410) case 8:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15411) sitoa32_8( str, a );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15412) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15413)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15414) case 10:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15415) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15416) b = *a;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15417)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15418) if( b & 0x80000000 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15419) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15420) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15421) ineg_32( &b, &b );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15422) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15423) sitoa32_10( str, &b, sign );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15424) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15425) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15426)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15427) case 16:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15428) sitoa32_16( str, a, uf );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15429) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15430)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15431) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15432) /* error: invalid radix for string */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15433) __integer_invalid_radix( (__mpu_char8_t *)"iitoa_32" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15434)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15435) *str = NUL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15436) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15437)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15438) } /* End of switch( radix ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15439)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15440) __MPU_FLAGS = flags; /* Restore all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15441) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15442)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15443) void iuitoa_32( __mpu_char8_t *str, __mpu_uint32_t *a, int radix, int uf )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15444) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15445) switch( radix )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15446) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15447) case 2:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15448) sitoa32_2( str, a, uf );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15449) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15450) case 8:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15451) sitoa32_8( str, a );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15452) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15453) case 10:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15454) sitoa32_10( str, a, 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15455) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15456) case 16:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15457) sitoa32_16( str, a, uf );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15458) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15459) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15460) /* error: invalid radix for string */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15461) __integer_invalid_radix( (__mpu_char8_t *)"iuitoa_32" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15462)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15463) *str = NUL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15464) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15465) } /* End of switch( radix ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15466) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15467) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15468)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15469)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15470) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 15471) STATIC:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15472) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15473) static void sitoa_np_10( __mpu_char8_t *str, EMUSHORT *a, int sign, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15474) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15475) EMUSHORT *b = 0, *x = 0, *weight = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15476) __mpu_char8_t *s = 0, *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15477) __mpu_uint8_t y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15478) __mpu_uint32_t flags; /* temporary saved mpu flags register */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15479)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15480) int size = (int)((BITS_PER_EMUSHORT*np+3)*sizeof( __mpu_char8_t )); /* n_bits + prefix[2] + '\0' */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15481)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15482) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15483)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15484) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15485)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15486) flags = __MPU_FLAGS; /* Store all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15487)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15488) /* Allocate memory and *weight = 10; ************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15489) weight = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15490) if( !weight )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15491) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15492) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15493) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15494) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15495) (void)memset( (void *)weight, 0, np*SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15496) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 15497) *(weight + np - 1) = (EMUSHORT)10;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15498) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15499) *weight = (EMUSHORT)10;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15500) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 15501) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15502)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15503) /* Allocate memory and *x = 0; ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15504) x = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15505) if( !x )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15506) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15507) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15508) /* FREE weight **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15509) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15510) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15511) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15512) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15513) (void)memset( (void*)x, 0, np*SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15514) /* *x = (EMUSHORT) 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15515) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15516)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15517) /* Allocate memory and *b = 0; ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15518) b = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15519) if( !b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15520) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15521) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15522) /* FREE x *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15523) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15524) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15525) /* FREE weight **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15526) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15527) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15528) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15529) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15530) (void)memset( (void *)b, 0, np*SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15531) /* *b = (EMUSHORT) 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15532) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15533)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15534) s = (__mpu_char8_t *)__mpu_sbrk( size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15535) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15536) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15537) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15538) /* FREE b *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15539) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15540) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15541) /* FREE x *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15542) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15543) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15544) /* FREE weight **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15545) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15546) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15547) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15548) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15549) (void)memset( (void *)s, 0, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15550)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15551) ptr = s + BITS_PER_EMUSHORT*np + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15552)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15553) scpy_s2s_np( b, a, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15554)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15555) icmp_np( b, x, np ); /* x == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15556) if( __MFLAG(ZF) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15557) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15558) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15559) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15560) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15561) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15562) do
868b2b66 (kx 2024-12-20 16:11:07 +0300 15563) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15564) idiv_np( b, x, b, weight, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15565)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15566) icpy_l2s_np_to8( &y, x, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15567)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15568) *ptr = 0x30 | y;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15569) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15570)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15571) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 15572) *(weight + np - 1) = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15573) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15574) *weight = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15575) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 15576) icmp_np( b, weight, np ); /* CMP b,0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15577) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 15578) *(weight + np - 1) = (EMUSHORT)10;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15579) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15580) *weight = (EMUSHORT)10;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15581) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 15582)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15583) } while( !__MFLAG(ZF) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15584) *ptr = '0'; /* last symbol is zero ('0') */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15585)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15586) if( sign ) *ptr = '-';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15587) else ++ptr; /* *ptr is first (not zero) symbol */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15588)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15589) } /* End if( b == 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15590) strncpy( (char *)str, (const char *)ptr, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15591)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15592) /* FREE *********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15593) if( s ) __mpu_sbrk( -size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15594) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15595) /* FREE b *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15596) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15597) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15598) /* FREE x *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15599) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15600) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15601) /* FREE weight **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15602) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15603) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15604)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15605) __MPU_FLAGS = flags; /* Restore all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15606) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15607)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15608) static void sitoa_np_16( __mpu_char8_t *str, EMUSHORT *a, int uf, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15609) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15610) EMUSHORT *b = 0, x, mask = 15;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15611) __mpu_char8_t *s = 0, *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15612) int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15613) __mpu_uint32_t flags; /* temporary saved mpu flags register */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15614)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15615) int size = (int)((BITS_PER_EMUSHORT*np+3)*sizeof( __mpu_char8_t )); /* n_bits + prefix[2] + '\0' */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15616)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15617) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15618)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15619) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15620)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15621) flags = __MPU_FLAGS; /* Store all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15622)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15623) /* Allocate memory and *b = 0; ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15624) b = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15625) if( !b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15626) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15627) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15628) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15629) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15630) (void)memset( (void *)b, 0, np*SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15631) /* *b = (EMUSHORT)0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15632) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15633)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15634) s = (__mpu_char8_t *)__mpu_sbrk( size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15635) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15636) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15637) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15638) /* FREE b *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15639) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15640) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15641) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15642) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15643) (void)memset( (void *)s, 0, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15644)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15645) ptr = s + BITS_PER_EMUSHORT*np + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15646)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15647) icmp_np( a, b, np ); /* b = 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15648) if( __MFLAG(ZF) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15649) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15650) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15651) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15652) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15653) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15654) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15655) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15656) while( i < BITS_PER_EMUSHORT*np / 4 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15657) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15658) ishrn_np( b, a, (i*4), np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15659) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 15660) x = *(b+np-1) & mask;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15661) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15662) x = *b & mask;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15663) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 15664) x = (EMUSHORT)hexdigit( x, uf );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15665)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15666) *ptr = (__mpu_uint8_t)x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15667) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15668) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15669) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15670) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15671) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15672) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15673)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15674) } /* End if( b == 0 ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15675)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15676) if( uf ) *ptr = 'X';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15677) else *ptr = 'x';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15678) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15679) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15680)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15681) strncpy( (char *)str, (const char *)ptr, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15682)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15683) /* FREE *********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15684) if( s ) __mpu_sbrk( -size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15685) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15686) /* FREE b *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15687) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15688) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15689)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15690) __MPU_FLAGS = flags; /* Restore all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15691) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15692)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15693) static void sitoa_np_8( __mpu_char8_t *str, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15694) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15695) EMUSHORT *b = 0, x, mask = 7;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15696) __mpu_char8_t *s = 0, *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15697) int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15698) __mpu_uint32_t flags; /* temporary saved mpu flags register */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15699)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15700) int size = (int)((BITS_PER_EMUSHORT*np+3)*sizeof( __mpu_char8_t )); /* n_bits + prefix[2] + '\0' */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15701)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15702) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15703)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15704) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15705)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15706) flags = __MPU_FLAGS; /* Store all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15707)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15708) /* Allocate memory and *b = 0; ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15709) b = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15710) if( !b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15711) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15712) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15713) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15714) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15715) (void)memset( (void *)b, 0, np*SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15716) /* *b = (EMUSHORT)0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15717) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15718)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15719) s = (__mpu_char8_t *)__mpu_sbrk( size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15720) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15721) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15722) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15723) /* FREE b *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15724) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15725) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15726) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15727) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15728) (void)memset( (void *)s, 0, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15729)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15730) ptr = s + BITS_PER_EMUSHORT*np + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15731)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15732) icmp_np( a, b, np ); /* b = 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15733) if( __MFLAG(ZF) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15734) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15735) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15736) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15737) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15738) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15739) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15740) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15741) while( i < BITS_PER_EMUSHORT*np / 3 + 1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15742) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15743) ishrn_np( b, a, (i*3), np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15744) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 15745) x = *(b+np-1) & mask;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15746) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15747) x = *b & mask;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15748) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 15749)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15750) *ptr = 0x30 | (__mpu_uint8_t)x;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15751) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15752) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15753) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15754)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15755) } /* End if( b == 0 ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15756)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15757) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15758)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15759) while( *ptr == '0' ) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15760) --ptr; /* skip zero (кроме first) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15761)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15762) strncpy( (char *)str, (const char *)ptr, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15763)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15764) /* FREE *********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15765) if( s ) __mpu_sbrk( -size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15766) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15767) /* FREE b *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15768) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15769) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15770)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15771) __MPU_FLAGS = flags; /* Restore all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15772) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15773)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15774) static void sitoa_np_2( __mpu_char8_t *str, EMUSHORT *a, int uf, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15775) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15776) EMUSHORT *b = 0, x, mask = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15777) __mpu_char8_t *s = 0, *ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15778) int i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15779) __mpu_uint32_t flags; /* temporary saved mpu flags register */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15780)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15781) int size = (int)((BITS_PER_EMUSHORT*np+3)*sizeof( __mpu_char8_t )); /* n_bits + prefix[2] + '\0' */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15782)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15783) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15784)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15785) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15786)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15787) flags = __MPU_FLAGS; /* Store all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15788)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15789) /* Allocate memory and *b = 0; ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15790) b = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15791) if( !b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15792) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15793) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15794) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15795) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15796) (void)memset( (void *)b, 0, np*SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15797) /* *b = (EMUSHORT)0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15798) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15799)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15800) s = (__mpu_char8_t *)__mpu_sbrk( size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15801) if( !s )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15802) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15803) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15804) /* FREE b *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15805) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15806) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15807) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15808) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15809) (void)memset( (void *)s, 0, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15810)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15811) ptr = s + BITS_PER_EMUSHORT*np + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15812)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15813) icmp_np( a, b, np ); /* b = 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15814) if( __MFLAG(ZF) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15815) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15816) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15817) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15818) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15819) else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15820) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15821) i = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15822) while( i < BITS_PER_EMUSHORT*np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15823) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15824) ishrn_np( b, a, (i), np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15825) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 15826) x = *(b+np-1) & mask;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15827) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15828) x = *b & mask;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15829) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 15830)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15831) if( x ) *ptr = '1';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15832) else *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15833)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15834) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15835) ++i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15836) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15837) ++ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15838) while( *ptr == '0' ) ++ptr; /* skip zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15839) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15840)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15841) } /* End if( b == 0 ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15842)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15843) if( uf ) *ptr = 'B';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15844) else *ptr = 'b';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15845) --ptr;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15846) *ptr = '0';
868b2b66 (kx 2024-12-20 16:11:07 +0300 15847)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15848) strncpy( (char *)str, (const char *)ptr, (size_t)size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15849)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15850) /* FREE *********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15851) if( s ) __mpu_sbrk( -size );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15852) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15853) /* FREE b *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15854) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15855) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15856)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15857) __MPU_FLAGS = flags; /* Restore all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15858) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15859) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 15860) End of STATIC.
868b2b66 (kx 2024-12-20 16:11:07 +0300 15861) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15862)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15863) void iitoa_np( __mpu_char8_t *str, EMUSHORT *a, int radix, int uf, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15864) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15865) EMUSHORT *b = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15866) int sign = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15867) __mpu_uint32_t flags; /* temporary saved mpu flags register */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15868)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15869) errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15870)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15871) if( np == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15872) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15873) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15874) __integer_invalid_size( (__mpu_char8_t *)"iitoa_np" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15875) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15876) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15877)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15878) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15879)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15880) flags = __MPU_FLAGS; /* Store all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15881)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15882) /* Allocate memory and *b = 0; ***((*************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15883) b = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15884) if( !b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15885) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15886) /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15887) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15888) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15889) (void)memset( (void *)b, 0, np*SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15890) /* *b = (EMUSHORT) 0; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15891) /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15892)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15893) switch( radix )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15894) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15895) case 2:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15896) sitoa_np_2( str, a, uf, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15897) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15898)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15899) case 8:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15900) sitoa_np_8( str, a, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15901) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15902)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15903) case 10:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15904) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15905) scpy_s2s_np( b, a, np ); /* b = a; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15906)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15907) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 15908) if( *(b) & MASK_SIGN )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15909) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15910) if( *(b+np-1) & MASK_SIGN )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15911) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 15912) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15913) sign = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15914) ineg_np( b, b, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15915) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15916) sitoa_np_10( str, b, sign, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15917) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15918) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15919)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15920) case 16:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15921) sitoa_np_16( str, a, uf, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15922) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15923)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15924) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15925) /* error: invalid radix for string */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15926) __integer_invalid_radix( (__mpu_char8_t *)"iitoa_np" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15927)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15928) *str = NUL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15929) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15930)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15931) } /* End of switch( radix ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15932)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15933) /* FREE b *******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15934) __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15935) /****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15936)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15937) __MPU_FLAGS = flags; /* Restore all Flags */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15938) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15939)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15940) void iuitoa_np( __mpu_char8_t *str, EMUSHORT *a, int radix, int uf, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15941) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15942) if( np == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15943) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15944) /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15945) __integer_invalid_size( (__mpu_char8_t *)"iuitoa_np" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15946) return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15947) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15948)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15949) __CLV;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15950)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15951) switch( radix )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15952) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15953) case 2:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15954) sitoa_np_2( str, a, uf, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15955) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15956) case 8:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15957) sitoa_np_8( str, a, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15958) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15959) case 10:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15960) sitoa_np_10( str, a, 0, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15961) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15962) case 16:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15963) sitoa_np_16( str, a, uf, np );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15964) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15965) default:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15966) /* error: invalid radix for string */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15967) __integer_invalid_radix( (__mpu_char8_t *)"iuitoa_np" );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15968)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15969) *str = NUL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15970) break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15971)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15972) } /* End of switch( radix ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15973) }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15974)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15975)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15976) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 15977) Hide internal symbols:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15978) ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15979) __mpu_hidden_decl(iadd_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15980) __mpu_hidden_decl(iadc_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15981) __mpu_hidden_decl(isub_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15982) __mpu_hidden_decl(isbb_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15983)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15984) __mpu_hidden_decl(iadd_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15985) __mpu_hidden_decl(iadc_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15986) __mpu_hidden_decl(isub_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15987) __mpu_hidden_decl(isbb_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15988)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15989) __mpu_hidden_decl(iadd_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15990) __mpu_hidden_decl(iadc_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15991) __mpu_hidden_decl(isub_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15992) __mpu_hidden_decl(isbb_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15993)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15994) __mpu_hidden_decl(iadd_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15995) __mpu_hidden_decl(iadc_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15996) __mpu_hidden_decl(isub_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15997) __mpu_hidden_decl(isbb_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15998)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15999)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16000) __mpu_hidden_decl(ishl_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16001) __mpu_hidden_decl(ishr_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16002) __mpu_hidden_decl(isal_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16003) __mpu_hidden_decl(isar_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16004)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16005) __mpu_hidden_decl(ishl_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16006) __mpu_hidden_decl(ishr_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16007) __mpu_hidden_decl(isal_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16008) __mpu_hidden_decl(isar_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16009)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16010) __mpu_hidden_decl(ishl_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16011) __mpu_hidden_decl(ishr_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16012) __mpu_hidden_decl(isal_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16013) __mpu_hidden_decl(isar_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16014)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16015) __mpu_hidden_decl(ishl_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16016) __mpu_hidden_decl(ishr_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16017) __mpu_hidden_decl(isal_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16018) __mpu_hidden_decl(isar_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16019)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16020)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16021) __mpu_hidden_decl(irol_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16022) __mpu_hidden_decl(iror_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16023) __mpu_hidden_decl(ircl_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16024) __mpu_hidden_decl(ircr_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16025)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16026) __mpu_hidden_decl(irol_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16027) __mpu_hidden_decl(iror_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16028) __mpu_hidden_decl(ircl_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16029) __mpu_hidden_decl(ircr_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16030)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16031) __mpu_hidden_decl(irol_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16032) __mpu_hidden_decl(iror_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16033) __mpu_hidden_decl(ircl_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16034) __mpu_hidden_decl(ircr_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16035)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16036) __mpu_hidden_decl(irol_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16037) __mpu_hidden_decl(iror_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16038) __mpu_hidden_decl(ircl_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16039) __mpu_hidden_decl(ircr_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16040)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16041)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16042) __mpu_hidden_decl(ishln_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16043) __mpu_hidden_decl(ishrn_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16044) __mpu_hidden_decl(isaln_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16045) __mpu_hidden_decl(isarn_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16046)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16047) __mpu_hidden_decl(ishln_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16048) __mpu_hidden_decl(ishrn_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16049) __mpu_hidden_decl(isaln_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16050) __mpu_hidden_decl(isarn_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16051)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16052) __mpu_hidden_decl(ishln_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16053) __mpu_hidden_decl(ishrn_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16054) __mpu_hidden_decl(isaln_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16055) __mpu_hidden_decl(isarn_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16056)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16057) __mpu_hidden_decl(ishln_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16058) __mpu_hidden_decl(ishrn_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16059) __mpu_hidden_decl(isaln_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16060) __mpu_hidden_decl(isarn_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16061)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16062)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16063) __mpu_hidden_decl(iroln_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16064) __mpu_hidden_decl(irorn_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16065) __mpu_hidden_decl(ircln_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16066) __mpu_hidden_decl(ircrn_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16067)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16068) __mpu_hidden_decl(iroln_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16069) __mpu_hidden_decl(irorn_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16070) __mpu_hidden_decl(ircln_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16071) __mpu_hidden_decl(ircrn_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16072)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16073) __mpu_hidden_decl(iroln_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16074) __mpu_hidden_decl(irorn_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16075) __mpu_hidden_decl(ircln_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16076) __mpu_hidden_decl(ircrn_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16077)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16078) __mpu_hidden_decl(iroln_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16079) __mpu_hidden_decl(irorn_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16080) __mpu_hidden_decl(ircln_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16081) __mpu_hidden_decl(ircrn_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16082)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16083)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16084) __mpu_hidden_decl(inot_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16085) __mpu_hidden_decl(inot_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16086) __mpu_hidden_decl(inot_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16087) __mpu_hidden_decl(inot_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16088)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16089) __mpu_hidden_decl(ineg_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16090) __mpu_hidden_decl(ineg_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16091) __mpu_hidden_decl(ineg_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16092) __mpu_hidden_decl(ineg_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16093)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16094) __mpu_hidden_decl(iand_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16095) __mpu_hidden_decl(iand_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16096) __mpu_hidden_decl(iand_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16097) __mpu_hidden_decl(iand_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16098)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16099) __mpu_hidden_decl(itest_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16100) __mpu_hidden_decl(itest_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16101) __mpu_hidden_decl(itest_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16102) __mpu_hidden_decl(itest_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16103)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16104) __mpu_hidden_decl(icmp_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16105) __mpu_hidden_decl(icmp_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16106) __mpu_hidden_decl(icmp_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16107) __mpu_hidden_decl(icmp_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16108)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16109) __mpu_hidden_decl(ior_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16110) __mpu_hidden_decl(ior_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16111) __mpu_hidden_decl(ior_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16112) __mpu_hidden_decl(ior_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16113)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16114) __mpu_hidden_decl(ixor_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16115) __mpu_hidden_decl(ixor_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16116) __mpu_hidden_decl(ixor_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16117) __mpu_hidden_decl(ixor_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16118)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16119) __mpu_hidden_decl(iinc_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16120) __mpu_hidden_decl(iinc_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16121) __mpu_hidden_decl(iinc_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16122) __mpu_hidden_decl(iinc_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16123)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16124) __mpu_hidden_decl(idec_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16125) __mpu_hidden_decl(idec_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16126) __mpu_hidden_decl(idec_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16127) __mpu_hidden_decl(idec_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16128)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16129) __mpu_hidden_decl(icpy_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16130) __mpu_hidden_decl(icpy_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16131) __mpu_hidden_decl(icpy_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16132)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16133) __mpu_hidden_decl(icpy_s2l_8to16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16134) __mpu_hidden_decl(icpy_s2l_8to32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16135) __mpu_hidden_decl(icpy_s2l_8to_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16136)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16137) __mpu_hidden_decl(icpy_s2l_16to32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16138) __mpu_hidden_decl(icpy_s2l_16to_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16139)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16140) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 16141) __mpu_hidden_decl(icpy_s2l_32to_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16142) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 16143)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16144) __mpu_hidden_decl(icpy_l2s_16to8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16145) __mpu_hidden_decl(icpy_l2s_32to8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16146) __mpu_hidden_decl(icpy_l2s_np_to8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16147)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16148) __mpu_hidden_decl(icpy_l2s_32to16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16149) __mpu_hidden_decl(icpy_l2s_np_to16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16150)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16151) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 16152) __mpu_hidden_decl(icpy_l2s_np_to32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16153) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 16154)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16155) __mpu_hidden_decl(icpy_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16156)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16157)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16158) __mpu_hidden_decl(icvt_s2l_8to16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16159) __mpu_hidden_decl(icvt_s2l_8to32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16160) __mpu_hidden_decl(icvt_s2l_8to_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16161)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16162) __mpu_hidden_decl(icvt_s2l_16to32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16163) __mpu_hidden_decl(icvt_s2l_16to_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16164)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16165) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 16166) __mpu_hidden_decl(icvt_s2l_32to_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16167) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 16168)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16169) __mpu_hidden_decl(icvt_l2s_16to8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16170) __mpu_hidden_decl(icvt_l2s_32to8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16171) __mpu_hidden_decl(icvt_l2s_np_to8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16172)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16173) __mpu_hidden_decl(icvt_l2s_32to16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16174) __mpu_hidden_decl(icvt_l2s_np_to16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16175) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 16176) __mpu_hidden_decl(icvt_l2s_np_to32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16177) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 16178)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16179) __mpu_hidden_decl(icvt_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16180)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16181)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16182) __mpu_hidden_decl(ixchg_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16183) __mpu_hidden_decl(ixchg_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16184) __mpu_hidden_decl(ixchg_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16185) __mpu_hidden_decl(ixchg_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16186)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16187)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16188) __mpu_hidden_decl(imul_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16189) __mpu_hidden_decl(imul_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16190) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 16191) __mpu_hidden_decl(imul_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16192) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 16193)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16194) __mpu_hidden_decl(ismul_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16195) __mpu_hidden_decl(ismul_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16196) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 16197) __mpu_hidden_decl(ismul_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16198) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 16199)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16200)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16201) __mpu_hidden_decl(idiv_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16202) __mpu_hidden_decl(idiv_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16203) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 16204) __mpu_hidden_decl(idiv_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16205) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 16206)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16207) __mpu_hidden_decl(isdiv_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16208) __mpu_hidden_decl(isdiv_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16209) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 16210) __mpu_hidden_decl(isdiv_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16211) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 16212)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16213)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16214) __mpu_hidden_decl(imul_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16215) __mpu_hidden_decl(ismul_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16216)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16217) __mpu_hidden_decl(idiv_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16218) __mpu_hidden_decl(isdiv_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16219)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16220)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16221)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16222) __mpu_hidden_decl(iatoi_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16223) __mpu_hidden_decl(iatoui_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16224)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16225) __mpu_hidden_decl(iatoi_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16226) __mpu_hidden_decl(iatoui_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16227)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16228) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 16229) __mpu_hidden_decl(iatoi_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16230) __mpu_hidden_decl(iatoui_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16231) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 16232)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16233) __mpu_hidden_decl(iatoi_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16234) __mpu_hidden_decl(iatoui_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16235)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16236)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16237) __mpu_hidden_decl(iitoa_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16238) __mpu_hidden_decl(iuitoa_8);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16239)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16240) __mpu_hidden_decl(iitoa_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16241) __mpu_hidden_decl(iuitoa_16);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16242)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16243) #if BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 16244) __mpu_hidden_decl(iitoa_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16245) __mpu_hidden_decl(iuitoa_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16246) #endif /* BITS_PER_EMUSHORT > 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 16247)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16248) __mpu_hidden_decl(iitoa_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16249) __mpu_hidden_decl(iuitoa_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 16250)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16251)
868b2b66 (kx 2024-12-20 16:11:07 +0300 16252) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 16253) End of hide internal symbols.
868b2b66 (kx 2024-12-20 16:11:07 +0300 16254) ***************************************************************/