Math Processor Unit Library

libmpu – library of arithmetic functions for integer, real, and complex numbers of increased digit capacity

16 Commits   0 Branches   2 Tags
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)  ***************************************************************/