license
  
	( TICKS TIMER )   HEX
	| 0   DUP CONSTANT #ticks_link        4+
	|     DUP CONSTANT #ticks_data        4+
	DROP
	| 0   DUP CONSTANT #ticks_time        4+
	|     DUP CONSTANT #ticks_vector      4+
	|         CONSTANT #ticks_data_length
    
	( this routine checks the timer linked list)
	| _create_listhead  ticks_link_head    
    
	\ execute words in linked list
	| CREATE (tick_timer) assembler
	ticks_link_head AB A0 MOV
	BEGIN  
		A0 D0 MOV 
	NE WHILE  
		A0 R -)  MOV
    	#ticks_data 0) A0 MOV
    	#ticks_vector 0) TST NE IF ( vector set)
    		#ticks_time 0) D0 MOV
    		xclock- AB D0 ADD CC IF ( timed out)
    			A0 D0 MOV ( address available to subroutine)
    			#ticks_vector 0) A0 MOV
    			A0 ) JSR
    		THEN
    	THEN
		R )+ A0  MOV  
		A0 ) A0  MOV
	REPEAT RTS

	HOST
	

	DECIMAL
	| 100 60 60 24 * * * CONSTANT #ticks_a_day
	HEX


	\ changed C.E 18/Aug/1999 Interrupt level
	\ preserved.
	CODE _set_new_task_level ( level --)
		S )+ D1 MOV
		SR D2 W. MOV
		7 $100 * $2000 + # SR W. MOV
		_xlevel_next AB D0 MOV
		D1 D0 CMP GT IF
			D1 _xlevel_next AB  MOV
		THEN
		D2 SR W. MOV
	NEXT
	
	#clock_high 7 ??=
	interrupt: real_clock
		\ reset interrupt	
		_#ter1_REF _breg_TER1 C!	
		\ update real clock
		1 %ticks +!
		%ticks @ #ticks_a_day < not IF
			[ #ticks_a_day NEGATE ]T LITERAL %ticks +!
			1 %today +!
		THEN

		\ update ticks	
		1 xclock+ +!
		-1 xclock- +!

		\ look at multitasker. The default xbase value is 10d
		\ this is often changed to 01 in the application.
		XAGAIN @ xclock- @ + 0< IF
			xclock+ @
			xbase @ +
			XAGAIN !
			TRUE [ TSK7 _#level_head_restart_flag + ]T LITERAL W!
			TRUE [ TSK8 _#level_head_restart_flag + ]T LITERAL W!
			TRUE [ TSK9 _#level_head_restart_flag + ]T LITERAL W! 
			#clock_high _set_new_task_level
		THEN
	;interrupt