
; allocation of tasks` wait counters
TASK1_WAITER	DATA	0x40
TASK2_WAITER	DATA	0x41
TASK3_WAITER	DATA	0x42
TASK4_WAITER	DATA	0x43
TASK5_WAITER	DATA	0x44
TASKS_NUM	EQU	(TASK5_WAITER-TASK0_WAITER+1)

; somewhere in a timer ISR
; ...
	MOV	R0,#TASK1_WAITER
INT_TASK_WAITER_C:
	CJNE	@R0,#0,INT_TASK_WAITER_0
INT_TASK_WAITER_NEXT:
	INC	R0
	CJNE	R0,#(TASK1_WAITER+TASKS_NUM),INT_TASK_WAITER_C
	JMP	INT_TASK_WAITER_END
INT_TASK_WAITER_0:
	DEC	@R0
	JMP	INT_TASK_WAITER_NEXT
INT_TASK_WAITER_END:
; ...

; MAIN LOOP
RUN:
	SETB	FLG_WATCHDOG			; ping watchdog	
	MOV	PCON,#00000001b			; idle mode (till interrupt event)
	NOP
	CALL	TASK1
	CALL	TASK2
	CALL	TASK3
	CALL	TASK4
	CALL	TASK5
	JMP	RUN


; in all tasks:
TASKx:
	MOV	A,TASK1_WAITER
	JNZ	TASKx_END
; task worktime
; ...
	MOV	TASKx_WAITER,#xx
TASKx_END:
	RET