123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- /*******************************************************************************
- * Filename: OSAL_Math.s51
- * Revised: $Date: 2010-02-23 10:47:02 -0800 (Tue, 23 Feb 2010) $
- * Revision: $Revision: 21759 $
- *
- * Description: This module contains optimized math routines needed to
- * perform efficient as possible calculations for BLE operations
- * such as timer drift adjustments.
- *
- * Copyright 2010 Texas Instruments Incorporated. All rights reserved.
- *
- * IMPORTANT: Your use of this Software is limited to those specific rights
- * granted under the terms of a software license agreement between the user
- * who downloaded the software, his/her employer (which must be your employer)
- * and Texas Instruments Incorporated (the "License"). You may not use this
- * Software unless you agree to abide by the terms of the License. The License
- * limits your use, and you acknowledge, that the Software may not be modified,
- * copied or distributed unless embedded on a Texas Instruments microcontroller
- * or used solely and exclusively in conjunction with a Texas Instruments radio
- * frequency transceiver, which is integrated into your product. Other than for
- * the foregoing purpose, you may not use, reproduce, copy, prepare derivative
- * works of, modify, distribute, perform, display or sell this Software and/or
- * its documentation for any purpose.
- * YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE
- * PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
- * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,
- * NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL
- * TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,
- * NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER
- * LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES
- * INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE
- * OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT
- * OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
- * (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
- *
- * Should you have any questions regarding your right to use this Software,
- * contact Texas Instruments Incorporated at www.TI.com.
- *******************************************************************************/
- MODULE OSAL_Math.s51
- /*******************************************************************************
- *
- * @fn osalMcuDivide31By16To16
- *
- * @brief This function is used to divide a 31 bit dividend by a 16 bit
- * divisor and return a packed 16 bit quotient and 16 bit
- * remainder.
- *
- * C Syntax
- * uint32 osalMcuDivide31By16To16( uint32 dividend, uint16 divisor );
- *
- * Preserved registers used:
- * R7:R6
- *
- * Note: This routine takes ~25.6us @32MHz. With C overhead, the
- * time is ~32us.
- *
- * input parameters
- *
- * @param R5:R4:R3:R2 - 31 bit dividend.
- * @param XDATA Stack - 16 bit divisor.
- *
- * After initialization, the following register mapping is used:
- * R7:R6 - divisor
- * R5:R4 - quotient
- * R3:R2 - upper half of dividend; will become the remainder
- * R1:R0 - lower half of dividend
- * B - loop counter
- *
- * output parameters
- *
- * @param None.
- *
- * @return R5:R4:R3:R2 - The 16 bit quotient is in R5:R4 and the 16 bit
- * remainder is in R3:R2.
- *
- ******************************************************************************/
- PUBLIC osalMcuDivide31By16To16
- FUNCTION osalMcuDivide31By16To16,0201H
- EXTERN ?XSP
- RSEG DATA_Z:DATA:NOROOT(0)
- savedR6:
- DS 1
- savedR7:
- DS 1
- savedRemHi:
- DS 1
- savedRemLow:
- DS 1
- savedDPH:
- DS 1
- savedDPL:
- DS 1
- RSEG NEAR_CODE:CODE:NOROOT(2)
- osalMcuDivide31By16To16:
- #ifdef DEBUG_GPIO
- //SETB P0.1
- #endif
- // initialize loop counter
- MOV B,#16
- // save preserved registers R6 and R7
- MOV savedR6,R6
- MOV savedR7,R7
- // save DPTR (which ever one is currently selected)
- MOV savedDPL,DPL
- MOV savedDPH,DPH
- // get divisor from the XDATA stack
- MOV DPL,?XSP
- MOV DPH,?XSP+1
- MOVX A,@DPTR
- XCH A,R6
- INC DPTR
- MOVX A,@DPTR
- XCH A,R7
- // restore DPTR
- MOV DPL,savedDPL
- MOV DPH,savedDPH
- // move lower dividend R3:R2 to R1:R0
- MOV A,R3
- XCH A,R1
- MOV A,R2
- XCH A,R0
- // move upper dividend R5:R4 to what will be the remainder R3:R2
- MOV A,R5
- XCH A,R3
- MOV A,R4
- XCH A,R2
- TopOfLoop:
- // Step 1: Shift dividend and remainder left, feeding dividend into remainder.
- CLR C
- MOV A,R0
- RLC A
- XCH A,R0
- MOV A,R1
- RLC A
- XCH A,R1
- MOV A,R2
- RLC A
- XCH A,R2
- MOV A,R3
- RLC A
- XCH A,R3
- // Step 2: Subtract divisor from remainder. If there is a borrow, then restore
- // the remainder.
- CLR C
- MOV A,R2
- SUBB A,R6
- MOV savedRemLow,A ; save remainder in case it needs to be restored
- MOV A,R3
- SUBB A,R7
- MOV savedRemHi,A ; save remainder in case it needs to be restored
- // Step 3: Shift quotient left, feeding complement of borrow bit
- // Note: Remainder is left unchanged if there was a borrow.
- CPL C
- JNC ShiftQuotient
- //
- MOV R3,savedRemHi
- MOV R2,savedRemLow
- ShiftQuotient:
- MOV A,R4
- RLC A
- XCH A,R4
- MOV A,R5
- RLC A
- XCH A,R5
- // Step 4: Decrement count and loop if not zero.
- DJNZ B,TopOfLoop
- // restore R6 and R7
- MOV R6,savedR6
- MOV R7,savedR7
- #ifdef DEBUG_GPIO
- //CLR P0.1
- #endif
- RET
- /*******************************************************************************
- *******************************************************************************/
- END
|