	.module kernel.c
	.area text
_get_task_id::
; //kernel.c
; 
; #include "kernel.h"
; 
; 
; // GLOBAL VARIABLE DEFINITIONS
; unsigned int current;		   	 		    // current task id number
; unsigned long int system_tick;
; 
; 
; // task control block
; typedef struct task_block {
; 	 	unsigned char id; 			  		// ID of task
; 		enum task_state state;				// State
; 		unsigned char priority;				// Priority
; 	 	unsigned char *heap_ptr;			// heap addr while not current task
; 		unsigned int heap_size;				// heap size
; 		unsigned char *frame_ptr;			// CCR pointer
; 		};
; 
; 
; // resource control block
; typedef struct resource_block {
; 		unsigned char id;	   				// ID of resource
; 		enum resource_state state;			// State (busy, free...)
; 		unsigned char user;					// Current resource user/owner
; 		signed char queue[4];				// Tasks waiting on resource
; 		unsigned char queue_pos;			// Next free spot in queue
; 		};
; 
; 		
; struct task_block task[numtasks];
; struct resource_block resource[numresources];
; 
; 
; 
; // FUNCTIONS
; 
; unsigned char get_task_id() { 
; 		 return task[current].id; 
	ldd #9
	ldy _current
	emul
	addd #_task
	xgdy
	ldab 0,y
	clra
L1:
	.dbline 0 ; func end
	rts
;             id -> 3,x
_get_task_state::
	pshd
	pshx
	tfr s,x
; }
; 
; unsigned char get_task_state(unsigned char id) { 
; 		 return task[id].state; 
	ldab 3,x
	clra
	xgdy
	ldd #9
	emuls
	addd #_task+1
	xgdy
	ldab 0,y
	clra
L2:
	tfr x,s
	pulx
	leas 2,sp
	.dbline 0 ; func end
	rts
;             id -> 3,x
_get_task_priority::
	pshd
	pshx
	tfr s,x
; }
; 
; unsigned char get_task_priority(unsigned char id) { 
; 		 return task[id].priority; 
	ldab 3,x
	clra
	xgdy
	ldd #9
	emuls
	addd #_task+2
	xgdy
	ldab 0,y
	clra
L4:
	tfr x,s
	pulx
	leas 2,sp
	.dbline 0 ; func end
	rts
;          state -> 7,x
;             id -> 3,x
_set_task_state::
	pshd
	pshx
	tfr s,x
; }
; 
; void set_task_state(unsigned char id, unsigned char state) {
; 	 task[id].state=state; 
	ldab 3,x
	clra
	xgdy
	ldd #9
	emuls
	addd #_task+1
	xgdy
	ldab 7,x
	stab 0,y
; }
L6:
	tfr x,s
	pulx
	leas 2,sp
	.dbline 0 ; func end
	rts
;       priority -> 7,x
;             id -> 3,x
_set_task_priority::
	pshd
	pshx
	tfr s,x
; 
; void set_task_priority(unsigned char id, unsigned char priority) {
; 
; 	 if (priority == 0) priority = 1;
	tst 7,x
	bne L9
	ldab #1
	stab 7,x
L9:
; 	 task[id].priority=priority;
	ldab 3,x
	clra
	xgdy
	ldd #9
	emuls
	addd #_task+2
	xgdy
	ldab 7,x
	stab 0,y
; }
L8:
	tfr x,s
	pulx
	leas 2,sp
	.dbline 0 ; func end
	rts
	.area bss
_resource::
	.blkb 16
_task::
	.blkb 27
_system_tick::
	.blkb 4
_current::
	.blkb 2

