📄 misc2.a51
字号:
;*----------------------------------------------------------------
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 + -