Paul Clarke
/
JTAG_Programmer_copy
Currently Non-working JTAG programmer
lenval.c@0:a23e8a7c9275, 2012-06-28 (annotated)
- Committer:
- monpjc
- Date:
- Thu Jun 28 13:36:55 2012 +0000
- Revision:
- 0:a23e8a7c9275
new
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
monpjc | 0:a23e8a7c9275 | 1 | /*******************************************************/ |
monpjc | 0:a23e8a7c9275 | 2 | /* file: lenval.c */ |
monpjc | 0:a23e8a7c9275 | 3 | /* abstract: This file contains routines for using */ |
monpjc | 0:a23e8a7c9275 | 4 | /* the lenVal data structure. */ |
monpjc | 0:a23e8a7c9275 | 5 | /*******************************************************/ |
monpjc | 0:a23e8a7c9275 | 6 | #include "lenval.h" |
monpjc | 0:a23e8a7c9275 | 7 | #include "ports.h" |
monpjc | 0:a23e8a7c9275 | 8 | |
monpjc | 0:a23e8a7c9275 | 9 | /***************************************************************************** |
monpjc | 0:a23e8a7c9275 | 10 | * Function: value |
monpjc | 0:a23e8a7c9275 | 11 | * Description: Extract the long value from the lenval array. |
monpjc | 0:a23e8a7c9275 | 12 | * Parameters: plvValue - ptr to lenval. |
monpjc | 0:a23e8a7c9275 | 13 | * Returns: long - the extracted value. |
monpjc | 0:a23e8a7c9275 | 14 | *****************************************************************************/ |
monpjc | 0:a23e8a7c9275 | 15 | long value( lenVal* plvValue ) |
monpjc | 0:a23e8a7c9275 | 16 | { |
monpjc | 0:a23e8a7c9275 | 17 | long lValue; /* result to hold the accumulated result */ |
monpjc | 0:a23e8a7c9275 | 18 | short sIndex; |
monpjc | 0:a23e8a7c9275 | 19 | |
monpjc | 0:a23e8a7c9275 | 20 | lValue = 0; |
monpjc | 0:a23e8a7c9275 | 21 | for ( sIndex = 0; sIndex < plvValue->len ; ++sIndex ) |
monpjc | 0:a23e8a7c9275 | 22 | { |
monpjc | 0:a23e8a7c9275 | 23 | lValue <<= 8; /* shift the accumulated result */ |
monpjc | 0:a23e8a7c9275 | 24 | lValue |= plvValue->val[ sIndex]; /* get the last byte first */ |
monpjc | 0:a23e8a7c9275 | 25 | } |
monpjc | 0:a23e8a7c9275 | 26 | |
monpjc | 0:a23e8a7c9275 | 27 | return( lValue ); |
monpjc | 0:a23e8a7c9275 | 28 | } |
monpjc | 0:a23e8a7c9275 | 29 | |
monpjc | 0:a23e8a7c9275 | 30 | /***************************************************************************** |
monpjc | 0:a23e8a7c9275 | 31 | * Function: initLenVal |
monpjc | 0:a23e8a7c9275 | 32 | * Description: Initialize the lenval array with the given value. |
monpjc | 0:a23e8a7c9275 | 33 | * Assumes lValue is less than 256. |
monpjc | 0:a23e8a7c9275 | 34 | * Parameters: plv - ptr to lenval. |
monpjc | 0:a23e8a7c9275 | 35 | * lValue - the value to set. |
monpjc | 0:a23e8a7c9275 | 36 | * Returns: void. |
monpjc | 0:a23e8a7c9275 | 37 | *****************************************************************************/ |
monpjc | 0:a23e8a7c9275 | 38 | void initLenVal( lenVal* plv, |
monpjc | 0:a23e8a7c9275 | 39 | long lValue ) |
monpjc | 0:a23e8a7c9275 | 40 | { |
monpjc | 0:a23e8a7c9275 | 41 | plv->len = 1; |
monpjc | 0:a23e8a7c9275 | 42 | plv->val[0] = (unsigned char)lValue; |
monpjc | 0:a23e8a7c9275 | 43 | } |
monpjc | 0:a23e8a7c9275 | 44 | |
monpjc | 0:a23e8a7c9275 | 45 | /***************************************************************************** |
monpjc | 0:a23e8a7c9275 | 46 | * Function: EqualLenVal |
monpjc | 0:a23e8a7c9275 | 47 | * Description: Compare two lenval arrays with an optional mask. |
monpjc | 0:a23e8a7c9275 | 48 | * Parameters: plvTdoExpected - ptr to lenval #1. |
monpjc | 0:a23e8a7c9275 | 49 | * plvTdoCaptured - ptr to lenval #2. |
monpjc | 0:a23e8a7c9275 | 50 | * plvTdoMask - optional ptr to mask (=0 if no mask). |
monpjc | 0:a23e8a7c9275 | 51 | * Returns: short - 0 = mismatch; 1 = equal. |
monpjc | 0:a23e8a7c9275 | 52 | *****************************************************************************/ |
monpjc | 0:a23e8a7c9275 | 53 | short EqualLenVal( lenVal* plvTdoExpected, |
monpjc | 0:a23e8a7c9275 | 54 | lenVal* plvTdoCaptured, |
monpjc | 0:a23e8a7c9275 | 55 | lenVal* plvTdoMask ) |
monpjc | 0:a23e8a7c9275 | 56 | { |
monpjc | 0:a23e8a7c9275 | 57 | short sEqual; |
monpjc | 0:a23e8a7c9275 | 58 | short sIndex; |
monpjc | 0:a23e8a7c9275 | 59 | unsigned char ucByteVal1; |
monpjc | 0:a23e8a7c9275 | 60 | unsigned char ucByteVal2; |
monpjc | 0:a23e8a7c9275 | 61 | unsigned char ucByteMask; |
monpjc | 0:a23e8a7c9275 | 62 | |
monpjc | 0:a23e8a7c9275 | 63 | sEqual = 1; |
monpjc | 0:a23e8a7c9275 | 64 | sIndex = plvTdoExpected->len; |
monpjc | 0:a23e8a7c9275 | 65 | |
monpjc | 0:a23e8a7c9275 | 66 | while ( sEqual && sIndex-- ) |
monpjc | 0:a23e8a7c9275 | 67 | { |
monpjc | 0:a23e8a7c9275 | 68 | ucByteVal1 = plvTdoExpected->val[ sIndex ]; |
monpjc | 0:a23e8a7c9275 | 69 | ucByteVal2 = plvTdoCaptured->val[ sIndex ]; |
monpjc | 0:a23e8a7c9275 | 70 | if ( plvTdoMask ) |
monpjc | 0:a23e8a7c9275 | 71 | { |
monpjc | 0:a23e8a7c9275 | 72 | ucByteMask = plvTdoMask->val[ sIndex ]; |
monpjc | 0:a23e8a7c9275 | 73 | ucByteVal1 &= ucByteMask; |
monpjc | 0:a23e8a7c9275 | 74 | ucByteVal2 &= ucByteMask; |
monpjc | 0:a23e8a7c9275 | 75 | } |
monpjc | 0:a23e8a7c9275 | 76 | if ( ucByteVal1 != ucByteVal2 ) |
monpjc | 0:a23e8a7c9275 | 77 | { |
monpjc | 0:a23e8a7c9275 | 78 | sEqual = 0; |
monpjc | 0:a23e8a7c9275 | 79 | } |
monpjc | 0:a23e8a7c9275 | 80 | } |
monpjc | 0:a23e8a7c9275 | 81 | |
monpjc | 0:a23e8a7c9275 | 82 | return( sEqual ); |
monpjc | 0:a23e8a7c9275 | 83 | } |
monpjc | 0:a23e8a7c9275 | 84 | |
monpjc | 0:a23e8a7c9275 | 85 | |
monpjc | 0:a23e8a7c9275 | 86 | /***************************************************************************** |
monpjc | 0:a23e8a7c9275 | 87 | * Function: RetBit |
monpjc | 0:a23e8a7c9275 | 88 | * Description: return the (byte, bit) of lv (reading from left to right). |
monpjc | 0:a23e8a7c9275 | 89 | * Parameters: plv - ptr to lenval. |
monpjc | 0:a23e8a7c9275 | 90 | * iByte - the byte to get the bit from. |
monpjc | 0:a23e8a7c9275 | 91 | * iBit - the bit number (0=msb) |
monpjc | 0:a23e8a7c9275 | 92 | * Returns: short - the bit value. |
monpjc | 0:a23e8a7c9275 | 93 | *****************************************************************************/ |
monpjc | 0:a23e8a7c9275 | 94 | short RetBit( lenVal* plv, |
monpjc | 0:a23e8a7c9275 | 95 | int iByte, |
monpjc | 0:a23e8a7c9275 | 96 | int iBit ) |
monpjc | 0:a23e8a7c9275 | 97 | { |
monpjc | 0:a23e8a7c9275 | 98 | /* assert( ( iByte >= 0 ) && ( iByte < plv->len ) ); */ |
monpjc | 0:a23e8a7c9275 | 99 | /* assert( ( iBit >= 0 ) && ( iBit < 8 ) ); */ |
monpjc | 0:a23e8a7c9275 | 100 | return( (short)( ( plv->val[ iByte ] >> ( 7 - iBit ) ) & 0x1 ) ); |
monpjc | 0:a23e8a7c9275 | 101 | } |
monpjc | 0:a23e8a7c9275 | 102 | |
monpjc | 0:a23e8a7c9275 | 103 | /***************************************************************************** |
monpjc | 0:a23e8a7c9275 | 104 | * Function: SetBit |
monpjc | 0:a23e8a7c9275 | 105 | * Description: set the (byte, bit) of lv equal to val |
monpjc | 0:a23e8a7c9275 | 106 | * Example: SetBit("00000000",byte, 1) equals "01000000". |
monpjc | 0:a23e8a7c9275 | 107 | * Parameters: plv - ptr to lenval. |
monpjc | 0:a23e8a7c9275 | 108 | * iByte - the byte to get the bit from. |
monpjc | 0:a23e8a7c9275 | 109 | * iBit - the bit number (0=msb). |
monpjc | 0:a23e8a7c9275 | 110 | * sVal - the bit value to set. |
monpjc | 0:a23e8a7c9275 | 111 | * Returns: void. |
monpjc | 0:a23e8a7c9275 | 112 | *****************************************************************************/ |
monpjc | 0:a23e8a7c9275 | 113 | void SetBit( lenVal* plv, |
monpjc | 0:a23e8a7c9275 | 114 | int iByte, |
monpjc | 0:a23e8a7c9275 | 115 | int iBit, |
monpjc | 0:a23e8a7c9275 | 116 | short sVal ) |
monpjc | 0:a23e8a7c9275 | 117 | { |
monpjc | 0:a23e8a7c9275 | 118 | unsigned char ucByteVal; |
monpjc | 0:a23e8a7c9275 | 119 | unsigned char ucBitMask; |
monpjc | 0:a23e8a7c9275 | 120 | |
monpjc | 0:a23e8a7c9275 | 121 | ucBitMask = (unsigned char)(1 << ( 7 - iBit )); |
monpjc | 0:a23e8a7c9275 | 122 | ucByteVal = (unsigned char)(plv->val[ iByte ] & (~ucBitMask)); |
monpjc | 0:a23e8a7c9275 | 123 | |
monpjc | 0:a23e8a7c9275 | 124 | if ( sVal ) |
monpjc | 0:a23e8a7c9275 | 125 | { |
monpjc | 0:a23e8a7c9275 | 126 | ucByteVal |= ucBitMask; |
monpjc | 0:a23e8a7c9275 | 127 | } |
monpjc | 0:a23e8a7c9275 | 128 | plv->val[ iByte ] = ucByteVal; |
monpjc | 0:a23e8a7c9275 | 129 | } |
monpjc | 0:a23e8a7c9275 | 130 | |
monpjc | 0:a23e8a7c9275 | 131 | /***************************************************************************** |
monpjc | 0:a23e8a7c9275 | 132 | * Function: AddVal |
monpjc | 0:a23e8a7c9275 | 133 | * Description: add val1 to val2 and store in resVal; |
monpjc | 0:a23e8a7c9275 | 134 | * assumes val1 and val2 are of equal length. |
monpjc | 0:a23e8a7c9275 | 135 | * Parameters: plvResVal - ptr to result. |
monpjc | 0:a23e8a7c9275 | 136 | * plvVal1 - ptr of addendum. |
monpjc | 0:a23e8a7c9275 | 137 | * plvVal2 - ptr of addendum. |
monpjc | 0:a23e8a7c9275 | 138 | * Returns: void. |
monpjc | 0:a23e8a7c9275 | 139 | *****************************************************************************/ |
monpjc | 0:a23e8a7c9275 | 140 | void addVal( lenVal* plvResVal, |
monpjc | 0:a23e8a7c9275 | 141 | lenVal* plvVal1, |
monpjc | 0:a23e8a7c9275 | 142 | lenVal* plvVal2 ) |
monpjc | 0:a23e8a7c9275 | 143 | { |
monpjc | 0:a23e8a7c9275 | 144 | unsigned char ucCarry; |
monpjc | 0:a23e8a7c9275 | 145 | unsigned short usSum; |
monpjc | 0:a23e8a7c9275 | 146 | unsigned short usVal1; |
monpjc | 0:a23e8a7c9275 | 147 | unsigned short usVal2; |
monpjc | 0:a23e8a7c9275 | 148 | short sIndex; |
monpjc | 0:a23e8a7c9275 | 149 | |
monpjc | 0:a23e8a7c9275 | 150 | plvResVal->len = plvVal1->len; /* set up length of result */ |
monpjc | 0:a23e8a7c9275 | 151 | |
monpjc | 0:a23e8a7c9275 | 152 | /* start at least significant bit and add bytes */ |
monpjc | 0:a23e8a7c9275 | 153 | ucCarry = 0; |
monpjc | 0:a23e8a7c9275 | 154 | sIndex = plvVal1->len; |
monpjc | 0:a23e8a7c9275 | 155 | while ( sIndex-- ) |
monpjc | 0:a23e8a7c9275 | 156 | { |
monpjc | 0:a23e8a7c9275 | 157 | usVal1 = plvVal1->val[ sIndex ]; /* i'th byte of val1 */ |
monpjc | 0:a23e8a7c9275 | 158 | usVal2 = plvVal2->val[ sIndex ]; /* i'th byte of val2 */ |
monpjc | 0:a23e8a7c9275 | 159 | |
monpjc | 0:a23e8a7c9275 | 160 | /* add the two bytes plus carry from previous addition */ |
monpjc | 0:a23e8a7c9275 | 161 | usSum = (unsigned short)( usVal1 + usVal2 + ucCarry ); |
monpjc | 0:a23e8a7c9275 | 162 | |
monpjc | 0:a23e8a7c9275 | 163 | /* set up carry for next byte */ |
monpjc | 0:a23e8a7c9275 | 164 | ucCarry = (unsigned char)( ( usSum > 255 ) ? 1 : 0 ); |
monpjc | 0:a23e8a7c9275 | 165 | |
monpjc | 0:a23e8a7c9275 | 166 | /* set the i'th byte of the result */ |
monpjc | 0:a23e8a7c9275 | 167 | plvResVal->val[ sIndex ] = (unsigned char)usSum; |
monpjc | 0:a23e8a7c9275 | 168 | } |
monpjc | 0:a23e8a7c9275 | 169 | } |
monpjc | 0:a23e8a7c9275 | 170 | |
monpjc | 0:a23e8a7c9275 | 171 | /***************************************************************************** |
monpjc | 0:a23e8a7c9275 | 172 | * Function: readVal |
monpjc | 0:a23e8a7c9275 | 173 | * Description: read from XSVF numBytes bytes of data into x. |
monpjc | 0:a23e8a7c9275 | 174 | * Parameters: plv - ptr to lenval in which to put the bytes read. |
monpjc | 0:a23e8a7c9275 | 175 | * sNumBytes - the number of bytes to read. |
monpjc | 0:a23e8a7c9275 | 176 | * Returns: void. |
monpjc | 0:a23e8a7c9275 | 177 | *****************************************************************************/ |
monpjc | 0:a23e8a7c9275 | 178 | void readVal( lenVal* plv, |
monpjc | 0:a23e8a7c9275 | 179 | short sNumBytes ) |
monpjc | 0:a23e8a7c9275 | 180 | { |
monpjc | 0:a23e8a7c9275 | 181 | unsigned char* pucVal; |
monpjc | 0:a23e8a7c9275 | 182 | |
monpjc | 0:a23e8a7c9275 | 183 | plv->len = sNumBytes; /* set the length of the lenVal */ |
monpjc | 0:a23e8a7c9275 | 184 | for ( pucVal = plv->val; sNumBytes; --sNumBytes, ++pucVal ) |
monpjc | 0:a23e8a7c9275 | 185 | { |
monpjc | 0:a23e8a7c9275 | 186 | /* read a byte of data into the lenVal */ |
monpjc | 0:a23e8a7c9275 | 187 | readByte( pucVal ); |
monpjc | 0:a23e8a7c9275 | 188 | } |
monpjc | 0:a23e8a7c9275 | 189 | } |
monpjc | 0:a23e8a7c9275 | 190 |