; C02 Module bitlib.h02 Assembly Language Subroutines
; Requires external location TEMP0 (system header)

        SUBROUTINE BITLIB

;dupl(nybble) - Duplicate Low Order Nybble
;Args: A = Left Nybble
;Destroys: TEMP0
;Affects: Y
;Returns: A = Byte Containing Byte
DUPL:   TAY         ;Copy Left Nybble to Right
        BEQ PACK    ;If Zero, Return

;pack(nybble,nybble) - Pack Two Low Order Nybbles into Single Byte
;Args: A = Left Nybble
;      Y = Right Nybble
;Destroys: TEMP0
;Returns: A = Packed Byte
PACK:   ASL         ;Shift Right Nybble to High Order   
        ASL
        ASL
        ASL
        STA TEMP0   ;and Save It
        TYA         ;Get Right Nybble
        AND #$0F    ;Isolate Right Nybble
        ORA TEMP0   ;Copy in Left Nybble
        RTS

;unpack(byte) - Unpack Byte into Two Low Order Nybbles
;Args: A = Byte to Unpack
;Returns: A = Left Nybble
;         Y = Right Nybble
UNPACK: PHA         ;Save Byte
        AND #$0F    ;Isolate Right Nybble
        TAY         ;and Copy to Y Register
        PLA         ;Retrieve Byte
        LSR         ;and Shift Left Nybble to Low Order
        LSR
        LSR
        LSR
        RTS

;swap(byte) - Swap Low and High Nybbles in Byte
;Args: A = Byte to Swap
;Affects Y,N,Z,C
;Returns: A = Swapped Byte
SWAP:   LDY #4          ;Set Count to 4 and Rotate Left

;rotl(byte,count) - Rotate byte by count Bits to the Left
;Args = Byte to Rotate
;Y = Number of Bits to Rotate
;Affects Y,N,Z,C
;Returns: A = Rotated Byte
ROTL:   CPY #0          ;If Number of Bits is 0
        BEQ .RETURN     ;  Return
.LOOPRL CLC             ;Bit 0 will be 0
        ROL             ;Rotate Left
        ADC #0          ;  Copy Carry to Bit 0
        DEY             ;Decrement Counter
        BNE .LOOPRL     ;  and Loop if Not 0
.RETURN RTS

;rotr(byte,count) - Shift byte by count Bits to the Right
;Args = Byte to Rotate
;Y = Number of Bits to Rotate
;Affects Y,N,Z,C
;Returns: A = Rotated Byte
ROTR:   CPY #0          ;If Number of Bits is 0
        BEQ .RETURN     ;  Return
.LOOPRR CLC             ;Bit 7 will be 0
        ROR             ;Rotate Right
        BCC .SKIPRR     ;If Bit 0 was Set
        ORA #$80        ;  Set Bit 8
.SKIPRR DEY             ;Decrement Counter
        BNE .LOOPRR     ;  and Loop if Not 0
        RTS

;shiftl(byte,count) - Shift byte by Count bits to the Left
;Args = Byte to Shift
;Y = Number of Bits to Rotate
;Affects Y,N,Z,C
;Returns: A = Shifted Byte
SHIFTL: CPY #0          ;If Number of Bits is 0
        BEQ .RETURN     ;  Return
.LOOPSL ASL             ;Shift Byte to Left
        DEY             ;Decrement Counter
        BNE .LOOPSL     ;  and Loop if Not 0
        RTS


;shiftr(byte,count) - Shift byte by Count bits to the Right
;Args = Byte to Shift
;Y = Number of Bits to Rotate
;Affects Y,N,Z,C
;Returns: A = Shifted Byte
SHIFTR: CPY #0          ;If Number of Bits is 0
        BEQ .RETURN     ;  Return
.LOOPSR LSR             ;Shift Byte to Right
        DEY             ;Decrement Counter
        BNE .LOOPSR     ;  and Loop if Not 0
        RTS

        ENDSUBROUTINE
