Yes, it's an ugly, nonportable hack.
The shift operators work fine for unsigned 16-bit data types.
They do get strange with 32-bit data types.
This is the result of a 24-bit shift right:
unsigned char wildone (unsigned long in)
{
unsigned char out;
out = (unsigned char)(in >> 24);
006A 082E MOVF wildone_00000_arg_in, W
006B 00B3 MOVWF CompTempVar98
006C 082F MOVF wildone_00000_arg_in+D'1', W
006D 00B4 MOVWF CompTempVar99
006E 0830 MOVF wildone_00000_arg_in+D'2', W
006F 00B5 MOVWF CompTempVar100
0070 0831 MOVF wildone_00000_arg_in+D'3', W
0071 00B6 MOVWF CompTempVar101
0072 1003 BCF STATUS,C
0073 0CB6 RRF CompTempVar101, F
0074 0CB5 RRF CompTempVar100, F
0075 0CB4 RRF CompTempVar99, F
0076 0CB3 RRF CompTempVar98, F
0077 1003 BCF STATUS,C
0078 0CB6 RRF CompTempVar101, F
0079 0CB5 RRF CompTempVar100, F
007A 0CB4 RRF CompTempVar99, F
007B 0CB3 RRF CompTempVar98, F
007C 1003 BCF STATUS,C
007D 0CB6 RRF CompTempVar101, F
007E 0CB5 RRF CompTempVar100, F
007F 0CB4 RRF CompTempVar99, F
0080 0CB3 RRF CompTempVar98, F
0081 1003 BCF STATUS,C
0082 0CB6 RRF CompTempVar101, F
0083 0CB5 RRF CompTempVar100, F
0084 0CB4 RRF CompTempVar99, F
0085 0CB3 RRF CompTempVar98, F
0086 1003 BCF STATUS,C
0087 0CB6 RRF CompTempVar101, F
0088 0CB5 RRF CompTempVar100, F
0089 0CB4 RRF CompTempVar99, F
008A 0CB3 RRF CompTempVar98, F
008B 1003 BCF STATUS,C
008C 0CB6 RRF CompTempVar101, F
008D 0CB5 RRF CompTempVar100, F
008E 0CB4 RRF CompTempVar99, F
008F 0CB3 RRF CompTempVar98, F
0090 1003 BCF STATUS,C
0091 0CB6 RRF CompTempVar101, F
0092 0CB5 RRF CompTempVar100, F
0093 0CB4 RRF CompTempVar99, F
0094 0CB3 RRF CompTempVar98, F
0095 1003 BCF STATUS,C
0096 0CB6 RRF CompTempVar101, F
0097 0CB5 RRF CompTempVar100, F
0098 0CB4 RRF CompTempVar99, F
0099 0CB3 RRF CompTempVar98, F
009A 1003 BCF STATUS,C
009B 0CB6 RRF CompTempVar101, F
009C 0CB5 RRF CompTempVar100, F
009D 0CB4 RRF CompTempVar99, F
009E 0CB3 RRF CompTempVar98, F
009F 1003 BCF STATUS,C
00A0 0CB6 RRF CompTempVar101, F
00A1 0CB5 RRF CompTempVar100, F
00A2 0CB4 RRF CompTempVar99, F
00A3 0CB3 RRF CompTempVar98, F
00A4 1003 BCF STATUS,C
00A5 0CB6 RRF CompTempVar101, F
00A6 0CB5 RRF CompTempVar100, F
00A7 0CB4 RRF CompTempVar99, F
00A8 0CB3 RRF CompTempVar98, F
00A9 1003 BCF STATUS,C
00AA 0CB6 RRF CompTempVar101, F
00AB 0CB5 RRF CompTempVar100, F
00AC 0CB4 RRF CompTempVar99, F
00AD 0CB3 RRF CompTempVar98, F
00AE 1003 BCF STATUS,C
00AF 0CB6 RRF CompTempVar101, F
00B0 0CB5 RRF CompTempVar100, F
00B1 0CB4 RRF CompTempVar99, F
00B2 0CB3 RRF CompTempVar98, F
00B3 1003 BCF STATUS,C
00B4 0CB6 RRF CompTempVar101, F
00B5 0CB5 RRF CompTempVar100, F
00B6 0CB4 RRF CompTempVar99, F
00B7 0CB3 RRF CompTempVar98, F
00B8 1003 BCF STATUS,C
00B9 0CB6 RRF CompTempVar101, F
00BA 0CB5 RRF CompTempVar100, F
00BB 0CB4 RRF CompTempVar99, F
00BC 0CB3 RRF CompTempVar98, F
00BD 1003 BCF STATUS,C
00BE 0CB6 RRF CompTempVar101, F
00BF 0CB5 RRF CompTempVar100, F
00C0 0CB4 RRF CompTempVar99, F
00C1 0CB3 RRF CompTempVar98, F
00C2 1003 BCF STATUS,C
00C3 0CB6 RRF CompTempVar101, F
00C4 0CB5 RRF CompTempVar100, F
00C5 0CB4 RRF CompTempVar99, F
00C6 0CB3 RRF CompTempVar98, F
00C7 1003 BCF STATUS,C
00C8 0CB6 RRF CompTempVar101, F
00C9 0CB5 RRF CompTempVar100, F
00CA 0CB4 RRF CompTempVar99, F
00CB 0CB3 RRF CompTempVar98, F
00CC 1003 BCF STATUS,C
00CD 0CB6 RRF CompTempVar101, F
00CE 0CB5 RRF CompTempVar100, F
00CF 0CB4 RRF CompTempVar99, F
00D0 0CB3 RRF CompTempVar98, F
00D1 1003 BCF STATUS,C
00D2 0CB6 RRF CompTempVar101, F
00D3 0CB5 RRF CompTempVar100, F
00D4 0CB4 RRF CompTempVar99, F
00D5 0CB3 RRF CompTempVar98, F
00D6 1003 BCF STATUS,C
00D7 0CB6 RRF CompTempVar101, F
00D8 0CB5 RRF CompTempVar100, F
00D9 0CB4 RRF CompTempVar99, F
00DA 0CB3 RRF CompTempVar98, F
00DB 1003 BCF STATUS,C
00DC 0CB6 RRF CompTempVar101, F
00DD 0CB5 RRF CompTempVar100, F
00DE 0CB4 RRF CompTempVar99, F
00DF 0CB3 RRF CompTempVar98, F
00E0 1003 BCF STATUS,C
00E1 0CB6 RRF CompTempVar101, F
00E2 0CB5 RRF CompTempVar100, F
00E3 0CB4 RRF CompTempVar99, F
00E4 0CB3 RRF CompTempVar98, F
00E5 1003 BCF STATUS,C
00E6 0CB6 RRF CompTempVar101, F
00E7 0CB5 RRF CompTempVar100, F
00E8 0CB4 RRF CompTempVar99, F
00E9 0C33 RRF CompTempVar98, W
00EA 00B2 MOVWF wildone_00000_1_out
return (out);
00EB 0832 MOVF wildone_00000_1_out, W
00EC 00B3 MOVWF CompTempVarRet97
}
00ED 0008 RETURN
Edited by cac001, 09 February 2007 - 07:16 PM.