.module kernel.c .area text 0000 _get_task_id:: 0000 ; //kernel.c 0000 ; 0000 ; #include <912d60.h> 0000 ; #include 0000 ; #include "kernel.h" 0000 ; 0000 ; 0000 ; // GLOBAL VARIABLE DEFINITIONS 0000 ; unsigned int current; // current task id number 0000 ; unsigned long int system_tick; 0000 ; 0000 ; 0000 ; // task control block 0000 ; typedef struct task_block { 0000 ; unsigned char id; // ID of task 0000 ; enum task_state state; // State 0000 ; unsigned char priority; // Priority 0000 ; unsigned char *heap_ptr; // heap addr while not current task 0000 ; unsigned int heap_size; // heap size 0000 ; unsigned char *frame_ptr; // CCR pointer 0000 ; }; 0000 ; 0000 ; 0000 ; // resource control block 0000 ; typedef struct resource_block { 0000 ; unsigned char id; // ID of resource 0000 ; enum resource_state state; // State (busy, free...) 0000 ; unsigned char user; // Current resource user/owner 0000 ; signed char queue[4]; // Tasks waiting on resource 0000 ; unsigned char queue_pos; // Next free spot in queue 0000 ; }; 0000 ; 0000 ; 0000 ; struct task_block task[numtasks]; 0000 ; struct resource_block resource[numresources]; 0000 ; 0000 ; 0000 ; 0000 ; // FUNCTIONS 0000 ; 0000 ; unsigned char get_task_id() { 0000 ; return task[current].id; 0000 CC0009 ldd #9 0003 FD002F ldy _current 0006 13 emul 0007 C30010 addd #_task 000A B7C6 xgdy 000C E640 ldab 0,y 000E 87 clra 000F L3: 000F .dbline 0 ; func end 000F 3D rts 0010 ; id -> 3,x 0010 _get_task_state:: 0010 3B pshd 0011 34 pshx 0012 B775 tfr s,x 0014 ; } 0014 ; 0014 ; 0014 ; 0014 ; unsigned char get_task_state(unsigned char id) { 0014 ; 0014 ; if (id > (numtasks-1)) { 0014 E603 ldab 3,x 0016 C102 cmpb #2 0018 230C bls L5 001A ; puts("kernel: illegal task id"); 001A CC0281 ldd #L7 001D 160000 jsr _puts 0020 ; return -1; 0020 CCFFFF ldd #-1 0023 87 clra 0024 2012 bra L4 0026 L5: 0026 ; } 0026 ; else 0026 ; return task[id].state; 0026 E603 ldab 3,x 0028 87 clra 0029 B7C6 xgdy 002B CC0009 ldd #9 002E 1813 emuls 0030 C30011 addd #_task+1 0033 B7C6 xgdy 0035 E640 ldab 0,y 0037 87 clra 0038 L4: 0038 B757 tfr x,s 003A 30 pulx 003B 1B82 leas 2,sp 003D .dbline 0 ; func end 003D 3D rts 003E ; id -> 3,x 003E _get_task_priority:: 003E 3B pshd 003F 34 pshx 0040 B775 tfr s,x 0042 ; } 0042 ; 0042 ; 0042 ; 0042 ; unsigned char get_task_priority(unsigned char id) { 0042 ; 0042 ; if (id > (numtasks-1)) { 0042 E603 ldab 3,x 0044 C102 cmpb #2 0046 230C bls L10 0048 ; puts("kernel: illegal task id"); 0048 CC0281 ldd #L7 004B 160000 jsr _puts 004E ; return -1; 004E CCFFFF ldd #-1 0051 87 clra 0052 2012 bra L9 0054 L10: 0054 ; } 0054 ; else 0054 ; return task[id].priority; 0054 E603 ldab 3,x 0056 87 clra 0057 B7C6 xgdy 0059 CC0009 ldd #9 005C 1813 emuls 005E C30012 addd #_task+2 0061 B7C6 xgdy 0063 E640 ldab 0,y 0065 87 clra 0066 L9: 0066 B757 tfr x,s 0068 30 pulx 0069 1B82 leas 2,sp 006B .dbline 0 ; func end 006B 3D rts 006C L14: 006C 6B65726E656C3A20696C6C6567616C20 .byte 'k,'e,'r,'n,'e,'l,58,32,'i,'l,'l,'e,'g,'a,'l,32 007C 7461736B207374617465207265717565 .byte 't,'a,'s,'k,32,'s,'t,'a,'t,'e,32,'r,'e,'q,'u,'e 008C 737400 .byte 's,'t,0 008F ; ?temp -> -37,x 008F ; error_msg -> -35,x 008F ; state -> 7,x 008F ; id -> 3,x 008F _set_task_state:: 008F 3B pshd 0090 34 pshx 0091 B775 tfr s,x 0093 1BF1DA leas -38,sp 0096 ; } 0096 ; 0096 ; 0096 ; 0096 ; int set_task_state(unsigned char id, unsigned char state) { 0096 ; 0096 ; // LOCAL VARIABLES 0096 ; char error_msg[35] = "kernel: illegal task state request"; 0096 19E1DD leay -35,x 0099 B7C6 xgdy 009B CD006C ldy #L14 009E 34 pshx 009F B745 tfr d,x 00A1 CC0011 ldd #17 00A4 X0: 00A4 18027131 movw 2,y+,2,x+ 00A8 0434F9 dbne d,X0 00AB 180A4000 movb 0,y,0,x 00AF 30 pulx 00B0 ; //INTR_OFF(); 00B0 ; 00B0 ; if (id > (numtasks-1)) { 00B0 E603 ldab 3,x 00B2 C102 cmpb #2 00B4 230D bls L15 00B6 ; puts("kernel: illegal task id"); 00B6 CC0281 ldd #L7 00B9 160000 jsr _puts 00BC ; return -1; 00BC CCFFFF ldd #-1 00BF 18200144 lbra L13 00C3 L15: 00C3 E607 ldab 7,x 00C5 C104 cmpb #4 00C7 2204 bhi L19 00C9 E707 tst 7,x 00CB 240F bhs L17 00CD L19: 00CD ; } 00CD ; if ((state > 4) || (state < 0)) { 00CD ; puts(error_msg); 00CD 19E1DD leay -35,x 00D0 B7C6 xgdy 00D2 160000 jsr _puts 00D5 ; return -1; 00D5 CCFFFF ldd #-1 00D8 1820012B lbra L13 00DC L17: 00DC ; } 00DC ; if (state == running) { 00DC E607 ldab 7,x 00DE C102 cmpb #2 00E0 260F bne L20 00E2 ; puts(error_msg); 00E2 19E1DD leay -35,x 00E5 B7C6 xgdy 00E7 160000 jsr _puts 00EA ; return -1; 00EA CCFFFF ldd #-1 00ED 18200116 lbra L13 00F1 L20: 00F1 E603 ldab 3,x 00F3 87 clra 00F4 B7C6 xgdy 00F6 CC0009 ldd #9 00F9 1813 emuls 00FB C30011 addd #_task+1 00FE B7C6 xgdy 0100 E640 ldab 0,y 0102 87 clra 0103 6CE1DB std -37,x 0106 2720 beq L26 0108 ECE1DB ldd -37,x 010B 8C0001 cpd #1 010E 2752 beq L32 0110 ECE1DB ldd -37,x 0113 8C0003 cpd #3 0116 1827007E lbeq L38 011A ECE1DB ldd -37,x 011D 8C0004 cpd #4 0120 1827008A lbeq L42 0124 182000D6 lbra L22 0128 X1: 0128 ; } 0128 ; 0128 ; switch (task[id].state) { 0128 L26: 0128 ; case idle: 0128 ; if (state == idle) 0128 E707 tst 7,x 012A 2607 bne L27 012C ; return 0; 012C CC0000 ldd #0 012F 182000D4 lbra L13 0133 L27: 0133 ; if (state == pending) { 0133 E607 ldab 7,x 0135 C101 cmpb #1 0137 261A bne L29 0139 ; task[id].state = pending; 0139 E603 ldab 3,x 013B 87 clra 013C B7C6 xgdy 013E CC0009 ldd #9 0141 1813 emuls 0143 C30011 addd #_task+1 0146 B7C6 xgdy 0148 C601 ldab #1 014A 6B40 stab 0,y 014C ; return 0; 014C CC0000 ldd #0 014F 182000B4 lbra L13 0153 L29: 0153 ; } 0153 ; else { 0153 ; puts(error_msg); 0153 19E1DD leay -35,x 0156 B7C6 xgdy 0158 160000 jsr _puts 015B ; return -1; 015B CCFFFF ldd #-1 015E 182000A5 lbra L13 0162 X2: 0162 ; } 0162 ; break; 0162 L32: 0162 ; case pending: 0162 ; if (state == pending) 0162 E607 ldab 7,x 0164 C101 cmpb #1 0166 2607 bne L33 0168 ; return 0; 0168 CC0000 ldd #0 016B 18200098 lbra L13 016F L33: 016F ; if (state == idle) { 016F E707 tst 7,x 0171 2618 bne L35 0173 ; task[id].state = idle; 0173 E603 ldab 3,x 0175 87 clra 0176 B7C6 xgdy 0178 CC0009 ldd #9 017B 1813 emuls 017D C30011 addd #_task+1 0180 B7C6 xgdy 0182 6940 clr 0,y 0184 ; return 0; 0184 CC0000 ldd #0 0187 1820007C lbra L13 018B L35: 018B ; } 018B ; else { 018B ; puts(error_msg); 018B 19E1DD leay -35,x 018E B7C6 xgdy 0190 160000 jsr _puts 0193 ; return -1; 0193 CCFFFF ldd #-1 0196 206F bra L13 0198 X3: 0198 ; } 0198 ; break; 0198 L38: 0198 ; case waiting: 0198 ; if (state == waiting) 0198 E607 ldab 7,x 019A C103 cmpb #3 019C 2605 bne L39 019E ; return 0; 019E CC0000 ldd #0 01A1 2064 bra L13 01A3 L39: 01A3 ; else { 01A3 ; puts("kernel: unimplimented"); 01A3 CC026B ldd #L41 01A6 160000 jsr _puts 01A9 ; return -1; 01A9 CCFFFF ldd #-1 01AC 2059 bra L13 01AE X4: 01AE ; } 01AE ; break; 01AE L42: 01AE ; case finished: 01AE ; if (state == finished) 01AE E607 ldab 7,x 01B0 C104 cmpb #4 01B2 2605 bne L43 01B4 ; return 0; 01B4 CC0000 ldd #0 01B7 204E bra L13 01B9 L43: 01B9 ; if (state == idle) { 01B9 E707 tst 7,x 01BB 2616 bne L45 01BD ; task[id].state = idle; 01BD E603 ldab 3,x 01BF 87 clra 01C0 B7C6 xgdy 01C2 CC0009 ldd #9 01C5 1813 emuls 01C7 C30011 addd #_task+1 01CA B7C6 xgdy 01CC 6940 clr 0,y 01CE ; return 0; 01CE CC0000 ldd #0 01D1 2034 bra L13 01D3 L45: 01D3 ; } 01D3 ; else if (state == pending) { 01D3 E607 ldab 7,x 01D5 C101 cmpb #1 01D7 2618 bne L48 01D9 ; task[id].state = pending; 01D9 E603 ldab 3,x 01DB 87 clra 01DC B7C6 xgdy 01DE CC0009 ldd #9 01E1 1813 emuls 01E3 C30011 addd #_task+1 01E6 B7C6 xgdy 01E8 C601 ldab #1 01EA 6B40 stab 0,y 01EC ; return 0; 01EC CC0000 ldd #0 01EF 2016 bra L13 01F1 L48: 01F1 ; } 01F1 ; else { 01F1 ; puts(error_msg); 01F1 19E1DD leay -35,x 01F4 B7C6 xgdy 01F6 160000 jsr _puts 01F9 ; return -1; 01F9 CCFFFF ldd #-1 01FC 2009 bra L13 01FE X5: 01FE ; } 01FE ; break; 01FE L22: 01FE ; default: 01FE ; puts("kernel: unimplimented"); 01FE CC026B ldd #L41 0201 160000 jsr _puts 0204 ; return -1; 0204 CCFFFF ldd #-1 0207 ; break; 0207 L13: 0207 B757 tfr x,s 0209 30 pulx 020A 1B82 leas 2,sp 020C .dbline 0 ; func end 020C 3D rts 020D ; priority -> 7,x 020D ; id -> 3,x 020D _set_task_priority:: 020D 3B pshd 020E 34 pshx 020F B775 tfr s,x 0211 ; } 0211 ; 0211 ; 0211 ; //INTR_ON(); 0211 ; //return -1; 0211 ; } 0211 ; 0211 ; 0211 ; 0211 ; void set_task_priority(unsigned char id, unsigned char priority) { 0211 ; 0211 ; if (priority == 0) priority = 1; 0211 E707 tst 7,x 0213 2604 bne L52 0215 C601 ldab #1 0217 6B07 stab 7,x 0219 L52: 0219 ; if (id > (numtasks-1)) 0219 E603 ldab 3,x 021B C102 cmpb #2 021D 2308 bls L54 021F ; puts("kernel: illegal task id"); 021F CC0281 ldd #L7 0222 160000 jsr _puts 0225 2025 bra L55 0227 L54: 0227 ; else if ((priority > 255) || (priority < 0)) 0227 E607 ldab 7,x 0229 C1FF cmpb #255 022B 2204 bhi L58 022D E707 tst 7,x 022F 2408 bhs L56 0231 L58: 0231 ; puts("kernel: illegal priority"); 0231 CC0252 ldd #L59 0234 160000 jsr _puts 0237 2013 bra L57 0239 L56: 0239 ; else 0239 ; task[id].priority=priority; 0239 E603 ldab 3,x 023B 87 clra 023C B7C6 xgdy 023E CC0009 ldd #9 0241 1813 emuls 0243 C30012 addd #_task+2 0246 B7C6 xgdy 0248 E607 ldab 7,x 024A 6B40 stab 0,y 024C L57: 024C L55: 024C ; } 024C L51: 024C B757 tfr x,s 024E 30 pulx 024F 1B82 leas 2,sp 0251 .dbline 0 ; func end 0251 3D rts .area bss 0000 _resource:: 0000 .blkb 16 0010 _task:: 0010 .blkb 27 002B _system_tick:: 002B .blkb 4 002F _current:: 002F .blkb 2 .area text 0252 L59: 0252 6B65726E656C3A20696C6C6567616C20 .byte 'k,'e,'r,'n,'e,'l,58,32,'i,'l,'l,'e,'g,'a,'l,32 0262 7072696F7269747900 .byte 'p,'r,'i,'o,'r,'i,'t,'y,0 026B L41: 026B 6B65726E656C3A20756E696D706C696D .byte 'k,'e,'r,'n,'e,'l,58,32,'u,'n,'i,'m,'p,'l,'i,'m 027B 656E74656400 .byte 'e,'n,'t,'e,'d,0 0281 L7: 0281 6B65726E656C3A20696C6C6567616C20 .byte 'k,'e,'r,'n,'e,'l,58,32,'i,'l,'l,'e,'g,'a,'l,32 0291 7461736B20696400 .byte 't,'a,'s,'k,32,'i,'d,0