	.module kernel.c
	.area text
_get_task_id::
; //kernel.c
; 
; #include <912d60.h>
; #include <stdio.h>
; #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
L3:
	.dbline 0 ; func end
	rts
;             id -> 3,x
_get_task_state::
	pshd
	pshx
	tfr s,x
; }
; 
; 
; 
; unsigned char get_task_state(unsigned char id) { 
; 
; 		 if (id > (numtasks-1)) {
	ldab 3,x
	cmpb #2
	bls L5
; 	 	 	puts("kernel: illegal task id");
	ldd #L7
	jsr _puts
; 			return -1;
	ldd #-1
	clra
	bra L4
L5:
; 		 }
; 		 else
; 		 	 return task[id].state; 
	ldab 3,x
	clra
	xgdy
	ldd #9
	emuls
	addd #_task+1
	xgdy
	ldab 0,y
	clra
L4:
	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) { 
; 
; 		 if (id > (numtasks-1)) {
	ldab 3,x
	cmpb #2
	bls L10
; 	 	 	puts("kernel: illegal task id");
	ldd #L7
	jsr _puts
; 			return -1;
	ldd #-1
	clra
	bra L9
L10:
; 		 }
; 	 	 else
; 		 	 return task[id].priority; 
	ldab 3,x
	clra
	xgdy
	ldd #9
	emuls
	addd #_task+2
	xgdy
	ldab 0,y
	clra
L9:
	tfr x,s
	pulx
	leas 2,sp
	.dbline 0 ; func end
	rts
L14:
	.byte 'k,'e,'r,'n,'e,'l,58,32,'i,'l,'l,'e,'g,'a,'l,32
	.byte 't,'a,'s,'k,32,'s,'t,'a,'t,'e,32,'r,'e,'q,'u,'e
	.byte 's,'t,0
;          ?temp -> -37,x
;      error_msg -> -35,x
;          state -> 7,x
;             id -> 3,x
_set_task_state::
	pshd
	pshx
	tfr s,x
	leas -38,sp
; }
; 
; 
; 
; int set_task_state(unsigned char id, unsigned char state) {
; 
; 	// LOCAL VARIABLES
; 	char error_msg[35] = "kernel: illegal task state request";
	leay -35,x
	xgdy
	ldy #L14
	pshx
	tfr d,x
	ldd #17
X0:
	movw 2,y+,2,x+
	dbne d,X0
	movb 0,y,0,x
	pulx
; 	//INTR_OFF();
; 	
; 	if (id > (numtasks-1)) {
	ldab 3,x
	cmpb #2
	bls L15
; 	   puts("kernel: illegal task id");
	ldd #L7
	jsr _puts
; 	   return -1;
	ldd #-1
	lbra L13
L15:
	ldab 7,x
	cmpb #4
	bhi L19
	tst 7,x
	bhs L17
L19:
; 	}
; 	if ((state > 4) || (state < 0)) {
; 	   puts(error_msg);
	leay -35,x
	xgdy
	jsr _puts
; 	   return -1;
	ldd #-1
	lbra L13
L17:
; 	}
; 	if (state == running) {
	ldab 7,x
	cmpb #2
	bne L20
; 	   puts(error_msg);
	leay -35,x
	xgdy
	jsr _puts
; 	   return -1;
	ldd #-1
	lbra L13
L20:
	ldab 3,x
	clra
	xgdy
	ldd #9
	emuls
	addd #_task+1
	xgdy
	ldab 0,y
	clra
	std -37,x
	beq L26
	ldd -37,x
	cpd #1
	beq L32
	ldd -37,x
	cpd #3
	lbeq L38
	ldd -37,x
	cpd #4
	lbeq L42
	lbra L22
X1:
; 	} 
; 	 
; 	switch (task[id].state) {
L26:
; 		   case idle:
; 				 if (state == idle)
	tst 7,x
	bne L27
; 				 	return 0;
	ldd #0
	lbra L13
L27:
; 				 if (state == pending) {
	ldab 7,x
	cmpb #1
	bne L29
; 				 	task[id].state = pending;
	ldab 3,x
	clra
	xgdy
	ldd #9
	emuls
	addd #_task+1
	xgdy
	ldab #1
	stab 0,y
; 					return 0;
	ldd #0
	lbra L13
L29:
; 				 }
; 				 else {
; 				 	  puts(error_msg);
	leay -35,x
	xgdy
	jsr _puts
; 					  return -1;
	ldd #-1
	lbra L13
X2:
; 				 }
; 				 break;
L32:
; 		   case pending:
; 				if (state == pending)
	ldab 7,x
	cmpb #1
	bne L33
; 				 	return 0;
	ldd #0
	lbra L13
L33:
; 				if (state == idle) {
	tst 7,x
	bne L35
; 				   task[id].state = idle;
	ldab 3,x
	clra
	xgdy
	ldd #9
	emuls
	addd #_task+1
	xgdy
	clr 0,y
; 				   return 0;
	ldd #0
	lbra L13
L35:
; 				}	
; 				else {
; 				   puts(error_msg);
	leay -35,x
	xgdy
	jsr _puts
; 				   return -1;
	ldd #-1
	bra L13
X3:
; 				}
; 				break;
L38:
; 		   case waiting:
; 		   		if (state == waiting)
	ldab 7,x
	cmpb #3
	bne L39
; 				   return 0;
	ldd #0
	bra L13
L39:
; 				else {
; 					 puts("kernel: unimplimented");
	ldd #L41
	jsr _puts
; 					 return -1;
	ldd #-1
	bra L13
X4:
; 				}
; 				break;
L42:
; 		   case finished:
; 		   		if (state == finished)
	ldab 7,x
	cmpb #4
	bne L43
; 				   return 0;
	ldd #0
	bra L13
L43:
; 				if (state == idle) {
	tst 7,x
	bne L45
; 				   task[id].state = idle;
	ldab 3,x
	clra
	xgdy
	ldd #9
	emuls
	addd #_task+1
	xgdy
	clr 0,y
; 				   return 0;
	ldd #0
	bra L13
L45:
; 				}
; 				else if (state == pending) {
	ldab 7,x
	cmpb #1
	bne L48
; 				   task[id].state = pending;
	ldab 3,x
	clra
	xgdy
	ldd #9
	emuls
	addd #_task+1
	xgdy
	ldab #1
	stab 0,y
; 				   return 0;
	ldd #0
	bra L13
L48:
; 				}
; 				else {
; 					 puts(error_msg);
	leay -35,x
	xgdy
	jsr _puts
; 					 return -1;
	ldd #-1
	bra L13
X5:
; 				}
; 				break;
L22:
; 		   default:
; 		   		   puts("kernel: unimplimented");
	ldd #L41
	jsr _puts
; 				   return -1;
	ldd #-1
; 				   break;
L13:
	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
; 	 }
; 	 
; 
; 	 //INTR_ON();
; 	 //return -1;
; }
; 
; 
; 
; void set_task_priority(unsigned char id, unsigned char priority) {
; 
; 	 if (priority == 0) priority = 1;
	tst 7,x
	bne L52
	ldab #1
	stab 7,x
L52:
; 	 if (id > (numtasks-1))
	ldab 3,x
	cmpb #2
	bls L54
; 	 	puts("kernel: illegal task id");
	ldd #L7
	jsr _puts
	bra L55
L54:
; 	 else if ((priority > 255) || (priority < 0))
	ldab 7,x
	cmpb #255
	bhi L58
	tst 7,x
	bhs L56
L58:
; 	 	  puts("kernel: illegal priority");
	ldd #L59
	jsr _puts
	bra L57
L56:
; 	 else
; 	 	 task[id].priority=priority;
	ldab 3,x
	clra
	xgdy
	ldd #9
	emuls
	addd #_task+2
	xgdy
	ldab 7,x
	stab 0,y
L57:
L55:
; }
L51:
	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
	.area text
L59:
	.byte 'k,'e,'r,'n,'e,'l,58,32,'i,'l,'l,'e,'g,'a,'l,32
	.byte 'p,'r,'i,'o,'r,'i,'t,'y,0
L41:
	.byte 'k,'e,'r,'n,'e,'l,58,32,'u,'n,'i,'m,'p,'l,'i,'m
	.byte 'e,'n,'t,'e,'d,0
L7:
	.byte 'k,'e,'r,'n,'e,'l,58,32,'i,'l,'l,'e,'g,'a,'l,32
	.byte 't,'a,'s,'k,32,'i,'d,0

