You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
164 lines
2.9 KiB
164 lines
2.9 KiB
#include "ax8052.h"
|
|
#include "wtimer.h"
|
|
|
|
#if defined(WTIMER_USEASM) && defined(SDCC)
|
|
|
|
__reentrantb uint8_t wtimer_removecb_core(struct wtimer_callback __xdata *desc) __reentrant __naked
|
|
{
|
|
__asm
|
|
ar7 = 0x07
|
|
ar6 = 0x06
|
|
ar5 = 0x05
|
|
ar4 = 0x04
|
|
ar3 = 0x03
|
|
ar2 = 0x02
|
|
ar1 = 0x01
|
|
ar0 = 0x00
|
|
|
|
;; R5:R4 = &wtimer_pending
|
|
mov r4,#_wtimer_pending
|
|
mov r5,#(_wtimer_pending >> 8)
|
|
_wtimer_removecb_core_body:
|
|
;; R0 = 0
|
|
mov r0,#0
|
|
;; R3:R2 = desc
|
|
mov r2,dpl
|
|
mov r3,dph
|
|
00000$:
|
|
;; R7:R6 = R5:R4->next
|
|
mov dpl,r4
|
|
mov dph,r5
|
|
movx a,@dptr
|
|
mov r6,a
|
|
inc dptr
|
|
movx a,@dptr
|
|
mov r7,a
|
|
;; check R7:R6 == WTIMER_NULL
|
|
cjne r6,#(WTIMER_NULL & 0xFF),00002$
|
|
cjne r7,#(WTIMER_NULL >> 8),00002$
|
|
00001$:
|
|
mov dpl,r0
|
|
ret
|
|
00002$:
|
|
;; check R7:R6 == R3:R2
|
|
mov a,r2
|
|
cjne a,ar6,00003$
|
|
mov a,r3
|
|
cjne a,ar7,00003$
|
|
;; R7:R6 = R7:R6->next
|
|
mov dpl,r6
|
|
mov dph,r7
|
|
movx a,@dptr
|
|
mov r6,a
|
|
inc dptr
|
|
movx a,@dptr
|
|
mov r7,a
|
|
;; R5:R4->next = R7:R6
|
|
mov dpl,r4
|
|
mov dph,r5
|
|
mov a,r6
|
|
movx @dptr,a
|
|
inc dptr
|
|
mov a,r7
|
|
movx @dptr,a
|
|
;; ++R0
|
|
inc r0
|
|
;; check R7:R6 == WTIMER_NULL
|
|
cjne r6,#(WTIMER_NULL & 0xFF),00003$
|
|
cjne r7,#(WTIMER_NULL >> 8),00003$
|
|
sjmp 00001$
|
|
00003$:
|
|
;; R5:R4 = R7:R6
|
|
mov r4,ar6
|
|
mov r5,ar7
|
|
sjmp 00000$
|
|
__endasm;
|
|
}
|
|
|
|
__reentrantb uint8_t wtimer0_removecb_core(struct wtimer_desc __xdata *desc) __reentrant __naked
|
|
{
|
|
__asm
|
|
;; R5:R4 = &wtimer_state[0].queue
|
|
mov r4,#(_wtimer_state + 0x0006)
|
|
mov r5,#((_wtimer_state + 0x0006) >> 8)
|
|
sjmp _wtimer_removecb_core_body
|
|
__endasm;
|
|
}
|
|
|
|
__reentrantb uint8_t wtimer1_removecb_core(struct wtimer_desc __xdata *desc) __reentrant __naked
|
|
{
|
|
__asm
|
|
;; R5:R4 = &wtimer_state[1].queue
|
|
mov r4,#(_wtimer_state + 0x000E)
|
|
mov r5,#((_wtimer_state + 0x000E) >> 8)
|
|
sjmp _wtimer_removecb_core_body
|
|
__endasm;
|
|
}
|
|
|
|
#else
|
|
|
|
__reentrantb uint8_t wtimer_removecb_core(struct wtimer_callback __xdata *desc) __reentrant
|
|
{
|
|
struct wtimer_callback __xdata *d;
|
|
uint8_t ret = 0;
|
|
d = WTIMER_CBPTR(wtimer_pending);
|
|
for (;;) {
|
|
struct wtimer_callback __xdata *dn = d->next;
|
|
if (dn == WTIMER_NULLCB)
|
|
break;
|
|
if (dn == desc) {
|
|
dn = dn->next;
|
|
d->next = dn;
|
|
++ret;
|
|
if (dn == WTIMER_NULLCB)
|
|
break;
|
|
}
|
|
d = dn;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
__reentrantb uint8_t wtimer0_removecb_core(struct wtimer_desc __xdata *desc) __reentrant
|
|
{
|
|
struct wtimer_desc __xdata *d;
|
|
uint8_t ret = 0;
|
|
d = WTIMER_PTR(wtimer_state[0].queue);
|
|
for (;;) {
|
|
struct wtimer_desc __xdata *dn = d->next;
|
|
if (dn == WTIMER_NULLDESC)
|
|
break;
|
|
if (dn == desc) {
|
|
dn = dn->next;
|
|
d->next = dn;
|
|
++ret;
|
|
if (dn == WTIMER_NULLDESC)
|
|
break;
|
|
}
|
|
d = dn;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
__reentrantb uint8_t wtimer1_removecb_core(struct wtimer_desc __xdata *desc) __reentrant
|
|
{
|
|
struct wtimer_desc __xdata *d;
|
|
uint8_t ret = 0;
|
|
d = WTIMER_PTR(wtimer_state[1].queue);
|
|
for (;;) {
|
|
struct wtimer_desc __xdata *dn = d->next;
|
|
if (dn == WTIMER_NULLDESC)
|
|
break;
|
|
if (dn == desc) {
|
|
dn = dn->next;
|
|
d->next = dn;
|
|
++ret;
|
|
if (dn == WTIMER_NULLDESC)
|
|
break;
|
|
}
|
|
d = dn;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
#endif
|