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.
CubeSatSim/libs/libmf/source/wtrem.c

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

Powered by TurnKey Linux.