⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 misc2.a51

📁 Vitesse 24port gigabit Switch Source Code
💻 A51
📖 第 1 页 / 共 2 页
字号:
        ;*----------------------------------------------------------------
        mov     a, r1
        mov     r0, a
        mov     a, @r0          ; Read byte from internal ram
        anl     a, r6           ; Reset bit
        cjne    r5, #0, l3_4    ; Check if bit is to be set
        jmp     l3_5            ; Skip setting bit
l3_4:   orl     a, r7           ; Set bit
l3_5:   mov     @r0, a          ; Update byte in internal ram
l3_6:   ret

;* ************************************************************************ */
; void write_bit_16 (uchar bit_no, uchar value, ushort *dst_ptr) small;
_write_bit_16:
;* ------------------------------------------------------------------------ --
;* Purpose     : Set specified bit to specified value in ushort pointed to by
;*               dst_ptr.
;* Remarks     : r7 holds bit number, r5 holds value (0 or 1), 
;*               r1-r3 holds destination pointer.
;* Restrictions:
;* See also    :
;* Example     :
; * ************************************************************************ */

        ;* Check if bit number is < 8, i.e. bit is located in second byte.
        ;*----------------------------------------------------------------
        cjne    r7, #8, l5_1
l5_1:   jnc     l5_2

        ;* Bit is located in second byte, adjust destination pointer in
        ;* order to use function _write_bit_8
        ;*----------------------------------------------------------------
        inc     r1
        mov     a, r1
        jnz     l5_3
        inc     r2
        jmp     l5_3

        ;* Bit is located in first byte, adjust bit number in ordet to use
        ;* function _write_bit_8
        ;*----------------------------------------------------------------
l5_2:   mov     a, #7
        anl     a, r7
        mov     r7, a

        ;* Update bit in the byte
        ;*----------------------------------------------------------------
l5_3:   lcall   _write_bit_8
        ret

;* ************************************************************************ */
; void write_bit_32 (uchar bit_no, uchar value, ulong *dst_ptr) small;
_write_bit_32:
;* ------------------------------------------------------------------------ --
;* Purpose     : Set specified bit to specified value in ulong pointed to by
;*               dst_ptr.
;* Remarks     : r7 holds bit number, r5 holds value (0 or 1), 
;*               r1-r3 holds destination pointer.
;* Restrictions:
;* See also    :
;* Example     :
; * ************************************************************************ */

        ;* Calc byte offset as (31 - bit_no) / 8
        ;*----------------------------------------------------------------
        mov     a, #31
        clr     c
        subb    a, r7
        rrc     a
        rrc     a
        rrc     a
        anl     a, #3

        ;* Adjust destination pointer according to byte offset
        ;*----------------------------------------------------------------
        add     a, r1
        mov     r1, a
        clr     a
        addc    a, r2
        mov     r2, a

        ;* Adjust bit number to be within byte
        ;*----------------------------------------------------------------
        mov     a, #7
        anl     a, r7
        mov     r7, a

        ;* Update bit in the byte
        ;*----------------------------------------------------------------
        lcall   _write_bit_8
        ret

;* ************************************************************************ */
; bit test_bit_8 (uchar bit_no, uchar *src_ptr) small;
_test_bit_8:
;* ------------------------------------------------------------------------ --
;* Purpose     : Test specified bit in byte pointed to by src_ptr.
;* Remarks     : r7 holds bit number, r1-r3 holds source pointer.
;* Restrictions:
;* See also    :
;* Example     :        
; * ************************************************************************ */

        ;* Convert bit number to bit mask
        ;*----------------------------------------------------------------
        mov     dptr, #bit_table
        mov     a, r7
        movc    a, @a + dptr
        mov     r7, a

        ;* Check if external or internal ram
        ;*----------------------------------------------------------------
        cjne    r3, #1, l4_1

        ;* External Ram
        ;*----------------------------------------------------------------
        mov     dpl, r1
        mov     dph, r2
        movx    a, @dptr        ; Read byte from external ram
        jmp     l4_2

        ;* Skip check if neither external nor internal ram
        ;*----------------------------------------------------------------
l4_1:   cjne    r3, #0, l4_3
        mov     a, r1
        mov     r0, a
        mov     a, @r0          ; Read byte from internal ram

        ;* Check bit
        ;*----------------------------------------------------------------
l4_2:   anl     a, r7
        jz      l4_3
        setb    c
        ret
	
l4_3:   clr     c
        ret

;* ************************************************************************ */
; bit test_bit_16 (uchar bit_no, ushort *src_ptr) small;
_test_bit_16:
;* ------------------------------------------------------------------------ --
;* Purpose     : Test specified bit in ushort pointed to by src_ptr.
;* Remarks     : r7 holds bit number, r1-r3 holds source pointer.
;* Restrictions:
;* See also    :
;* Example     :
; * ************************************************************************ */

        ;* Check if bit number is < 8, i.e. bit is located in second byte.
        ;*----------------------------------------------------------------
        cjne    r7, #8, l6_1
l6_1:   jnc     l6_2

        ;* Bit is located in second byte, adjust destination pointer in
        ;* order to use function _test_bit_8
        ;*----------------------------------------------------------------
        inc     r1
        mov     a, r1
        jnz     l6_3
        inc     r2
        jmp     l6_3

        ;* Bit is located in first byte, adjust bit number in ordet to use
        ;* function _test_bit_8
        ;*----------------------------------------------------------------
l6_2:   mov     a, #7
        anl     a, r7
        mov     r7, a

        ;* Check bit in the byte
        ;*----------------------------------------------------------------
l6_3:   lcall   _test_bit_8

        ret

;* ************************************************************************ */
; void test_bit_32 (uchar bit_no, uchar value, ulong *src_ptr) small;
_test_bit_32:
;* ------------------------------------------------------------------------ --
;* Purpose     : Test specified bit in ulong pointed to by src_ptr.
;* Remarks     : r7 holds bit number, r1-r3 holds source pointer.
;* Restrictions:
;* See also    :
;* Example     :
; * ************************************************************************ */

        ;* Calc byte offset as (31 - bit_no) / 8
        ;*----------------------------------------------------------------
        mov     a, #31
        clr     c
        subb    a, r7
        rrc     a
        rrc     a
        rrc     a
        anl     a, #3

        ;* Adjust destination pointer according to byte offset
        ;*----------------------------------------------------------------
        add     a, r1
        mov     r1, a
        clr     a
        addc    a, r2
        mov     r2, a

        ;* Adjust bit number to be within byte
        ;*----------------------------------------------------------------
        mov     a, #7
        anl     a, r7
        mov     r7, a

        ;* Check bit in the byte
        ;*----------------------------------------------------------------
        lcall   _test_bit_8

        ret

        END


















⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -