
//
//  Fast Char Bit Reverse
//
//  Author:     Graham Cole
//
//  Input:      c       -   8-bit word R7.
//
//  Output:     R7 is c with the bit values reversed.
//
//  Function:   
//
//  Notes:      Two methods are presented, the shorter of which
//              is based on an idea by Peter Dannegger.
//

#pragma ASM

$REGUSE _fast_char_bit_reverse( A, PSW, R7 )

#pragma ENDASM


unsigned char fast_char_bit_reverse( char c )
{
    #pragma ASM
                                    ;
fast_char_bit_reverse:              ;
                                    ;
    #if 0
                                    ;
        MOV     A,R7                ;C 76543210
                                    ;  hgfedcba
        ANL     A,#0x55             ;  -g-e-c-a
        RL      A                   ;  g-e-c-a-
        XCH     A,R7                ;  hgfedcba
        ANL     A,#0xAA             ;  h-f-d-b-
        RR      A                   ;  -h-f-d-b
        ORL     A,R7                ;  ghefcdab
        MOV     R7,A                ;
                                    ;
        ANL     A,#0x33             ;  --ef--ab
        RL      A                   ;  -ef--ab-
        RL      A                   ;  ef--ab--
        XCH     A,R7                ;  ghefcdab
        ANL     A,#0xCC             ;  gh--cd--
        RR      A                   ;  -gh--cd-
        RR      A                   ;  --gh--cd
        ORL     A,R7                ;  efghabcd
                                    ;
        SWAP    A                   ;  abcdefgh
                                    ;
        MOV     R7,A                ;
                                    ;
    #else
                                    ;
        MOV     A,R7                ;C 76543210
                                    ;
        MOV     C,Acc.1             ;b hgfedcba
        RLC     A                   ;h gfedcbab
        MOV     Acc.2,C             ;h gfedchab
        MOV     C,Acc.3             ;c gfedchab
        RLC     A                   ;g fedchabc
        MOV     Acc.4,C             ;g fedghabc
        MOV     C,Acc.5             ;d fedghabc
        RLC     A                   ;f edghabcd
        MOV     Acc.6,C             ;f efghabcd
        SWAP    A                   ;f abcdefgh
                                    ;
        MOV     R7,A                ;
                                    ;
    #endif

    #pragma ENDASM

    return( c );
}
