.module kernel.c .area data 0000 _kdb_trace:: 0000 .blkb 1 .area idata 0000 00 .byte 0 .area data .area text 0000 _error_msg:: 0000 756E696D706C696D656E746564206675 .byte 'u,'n,'i,'m,'p,'l,'i,'m,'e,'n,'t,'e,'d,32,'f,'u 0010 6E6374696F6E00 .byte 'n,'c,'t,'i,'o,'n,0 0017 0000 .byte 0,0 0019 73796E746178206572726F7200 .byte 's,'y,'n,'t,'a,'x,32,'e,'r,'r,'o,'r,0 0026 00000000000000000000 .word 0,0,0,0,0 0030 0000 .byte 0,0 0032 696C6C6567616C207461736B20494400 .byte 'i,'l,'l,'e,'g,'a,'l,32,'t,'a,'s,'k,32,'I,'D,0 0042 000000000000000000 .byte 0,0,0,0,0,0,0,0,0 004B 696C6C6567616C207461736B20737461 .byte 'i,'l,'l,'e,'g,'a,'l,32,'t,'a,'s,'k,32,'s,'t,'a 005B 746500 .byte 't,'e,0 005E 000000000000 .byte 0,0,0,0,0,0 0064 696C6C6567616C207461736B20707269 .byte 'i,'l,'l,'e,'g,'a,'l,32,'t,'a,'s,'k,32,'p,'r,'i 0074 6F7269747900 .byte 'o,'r,'i,'t,'y,0 007A 000000 .byte 0,0,0 007D 6F7574206F66206D656D6F727900 .byte 'o,'u,'t,32,'o,'f,32,'m,'e,'m,'o,'r,'y,0 008B 00000000000000000000 .word 0,0,0,0,0 0095 00 .byte 0 0096 696C6C6567616C207265736F75726365 .byte 'i,'l,'l,'e,'g,'a,'l,32,'r,'e,'s,'o,'u,'r,'c,'e 00A6 20494400 .byte 32,'I,'D,0 00AA 0000000000 .byte 0,0,0,0,0 00AF 696C6C6567616C207265736F75726365 .byte 'i,'l,'l,'e,'g,'a,'l,32,'r,'e,'s,'o,'u,'r,'c,'e 00BF 20737461746500 .byte 32,'s,'t,'a,'t,'e,0 00C6 0000 .byte 0,0 00C8 63616E6E6F7420637265617465207461 .byte 'c,'a,'n,'n,'o,'t,32,'c,'r,'e,'a,'t,'e,32,'t,'a 00D8 736B00 .byte 's,'k,0 00DB 000000000000 .byte 0,0,0,0,0,0 00E1 _error_src:: 00E1 6B65726E656C206572726F723A00 .byte 'k,'e,'r,'n,'e,'l,32,'e,'r,'r,'o,'r,58,0 00EF 00000000 .byte 0,0,0,0 00F3 6B65726E656C2E63206572726F723A00 .byte 'k,'e,'r,'n,'e,'l,46,'c,32,'e,'r,'r,'o,'r,58,0 0103 0000 .byte 0,0 0105 6B65726E656C20525449206572726F72 .byte 'k,'e,'r,'n,'e,'l,32,'R,'T,'I,32,'e,'r,'r,'o,'r 0115 3A00 .byte 58,0 0117 7368656C6C206572726F723A00 .byte 's,'h,'e,'l,'l,32,'e,'r,'r,'o,'r,58,0 0124 0000000000 .byte 0,0,0,0,0 0129 73656D6C69622E63206572726F723A00 .byte 's,'e,'m,'l,'i,'b,46,'c,32,'e,'r,'r,'o,'r,58,0 0139 0000 .byte 0,0 013B ; id -> 3,x 013B _get_task_address:: 013B 3B pshd 013C 34 pshx 013D B775 tfr s,x 013F ; //kernel.c 013F ; 013F ; #include <912d60.h> 013F ; #include 013F ; #include 013F ; #include 013F ; #include "kernel.h" 013F ; 013F ; 013F ; extern void (*task_ptr[MAXTASKS])(void); 013F ; 013F ; 013F ; 013F ; // GLOBAL VARIABLE DEFINITIONS 013F ; unsigned int current; // current task id number 013F ; unsigned long int system_tick; 013F ; unsigned int cop_cycle; 013F ; 013F ; 013F ; 013F ; // task control block 013F ; typedef struct task_block { 013F ; void (*address)(); // Address of the task 013F ; unsigned char id; // ID of task 013F ; char name[9]; // Name 013F ; enum task_state state; // State 013F ; unsigned char priority; // Priority 013F ; unsigned long int period_tick; // for determining if deadline is up 013F ; unsigned int interrupt_msg_box; // flags for pending interrupts 013F ; enum message_box message; // misc flags 013F ; unsigned char message_data[2]; // data for misc_msg_box flags 013F ; unsigned char *heap_ptr; // heap addr while not current task 013F ; unsigned int heap_size; // heap size 013F ; unsigned char *frame_ptr; // CCR pointer 013F ; }; 013F ; 013F ; 013F ; // resource control block 013F ; typedef struct resource_block { 013F ; unsigned char id; // ID of resource 013F ; char name[5]; // Name of resource 013F ; enum resource_state state; // State (busy, free...) 013F ; unsigned char owner; // Current resource owner 013F ; signed char queue[3]; // Tasks waiting on resource 013F ; unsigned char queue_ptr; // Next free spot in queue 013F ; }; 013F ; 013F ; 013F ; struct task_block *task[MAXTASKS]; 013F ; struct resource_block resource[NUMRESOURCES]; 013F ; 013F ; 013F ; // global interrupt flags 013F ; //unsigned int interrupt_flags_ADC; 013F ; //unsigned int interrupt_flags_TC; 013F ; 013F ; 013F ; char kdb_trace = 0; 013F ; 013F ; 013F ; // error massages 013F ; const char error_msg[][25] = {"unimplimented function", // error 0 013F ; "syntax error", // error 1 013F ; "illegal task ID", // error 2 013F ; "illegal task state", // error 3 013F ; "illegal task priority", // error 4 013F ; "out of memory", // error 5 013F ; "illegal resource ID", // error 6 013F ; "illegal resource state", // error 7 013F ; "cannot create task" // error 8 013F ; }; 013F ; const char error_src[][18] = {"kernel error:", // source 0 013F ; "kernel.c error:", // source 1 013F ; "kernel RTI error:", // source 2 013F ; "shell error:", // source 3 013F ; "semlib.c error:" // source 4 013F ; }; 013F ; 013F ; 013F ; 013F ; // FUNCTIONS 013F ; 013F ; int get_task_address(char id) { 013F ; 013F ; return (int)task[id]->address; 013F E603 ldab 3,x 0141 87 clra 0142 59 lsld 0143 C30030 addd #_task 0146 B7C6 xgdy 0148 ECEB0000 ldd [0,y] 014C L3: 014C B757 tfr x,s 014E 30 pulx 014F 1B82 leas 2,sp 0151 .dbline 0 ; func end 0151 3D rts 0152 _get_task_id:: 0152 ; 0152 ; } 0152 ; 0152 ; 0152 ; 0152 ; 0152 ; char get_task_id() { 0152 ; 0152 ; return task[current]->id; 0152 FC0046 ldd _current 0155 59 lsld 0156 C30030 addd #_task 0159 B7C6 xgdy 015B ED40 ldy 0,y 015D E642 ldab 2,y 015F 87 clra 0160 L4: 0160 .dbline 0 ; func end 0160 3D rts 0161 ; id -> 3,x 0161 _get_task_name:: 0161 3B pshd 0162 34 pshx 0163 B775 tfr s,x 0165 ; } 0165 ; 0165 ; 0165 ; 0165 ; char *get_task_name(unsigned char id) { 0165 ; if (task[id] == NULL) 0165 E603 ldab 3,x 0167 87 clra 0168 59 lsld 0169 C30030 addd #_task 016C B7C6 xgdy 016E EC40 ldd 0,y 0170 2605 bne L6 0172 ; return NULL; 0172 CC0000 ldd #0 0175 200E bra L5 0177 L6: 0177 ; else 0177 ; return task[id]->name; 0177 E603 ldab 3,x 0179 87 clra 017A 59 lsld 017B C30030 addd #_task 017E B7C6 xgdy 0180 EC40 ldd 0,y 0182 C30003 addd #3 0185 L5: 0185 B757 tfr x,s 0187 30 pulx 0188 1B82 leas 2,sp 018A .dbline 0 ; func end 018A 3D rts 018B ; id -> 3,x 018B _get_task_state:: 018B 3B pshd 018C 34 pshx 018D B775 tfr s,x 018F ; } 018F ; 018F ; 018F ; 018F ; 018F ; int get_task_state(unsigned char id) { 018F ; 018F ; if (task[id] == NULL) 018F E603 ldab 3,x 0191 87 clra 0192 59 lsld 0193 C30030 addd #_task 0196 B7C6 xgdy 0198 EC40 ldd 0,y 019A 2605 bne L9 019C ; return -1; 019C CCFFFF ldd #-1 019F 2019 bra L8 01A1 L9: 01A1 ; else if (id < MAXTASKS) 01A1 E603 ldab 3,x 01A3 C108 cmpb #8 01A5 2410 bhs L11 01A7 ; return task[id]->state; 01A7 E603 ldab 3,x 01A9 87 clra 01AA 59 lsld 01AB C30030 addd #_task 01AE B7C6 xgdy 01B0 ED40 ldy 0,y 01B2 E64C ldab 12,y 01B4 87 clra 01B5 2003 bra L8 01B7 L11: 01B7 ; else { 01B7 ; #ifdef KERNEL_ERROR_MSG 01B7 ; puts(error_src[1]); puts(error_msg[3]); 01B7 ; #endif 01B7 ; return -1; 01B7 CCFFFF ldd #-1 01BA L8: 01BA B757 tfr x,s 01BC 30 pulx 01BD 1B82 leas 2,sp 01BF .dbline 0 ; func end 01BF 3D rts 01C0 ; id -> 3,x 01C0 _get_task_messages:: 01C0 3B pshd 01C1 34 pshx 01C2 B775 tfr s,x 01C4 ; } 01C4 ; 01C4 ; } 01C4 ; 01C4 ; 01C4 ; 01C4 ; int get_task_messages(unsigned char id) { 01C4 ; 01C4 ; if (task[id] == NULL) 01C4 E603 ldab 3,x 01C6 87 clra 01C7 59 lsld 01C8 C30030 addd #_task 01CB B7C6 xgdy 01CD EC40 ldd 0,y 01CF 2605 bne L14 01D1 ; return -1; 01D1 CCFFFF ldd #-1 01D4 201A bra L13 01D6 L14: 01D6 ; else if (id < MAXTASKS) 01D6 E603 ldab 3,x 01D8 C108 cmpb #8 01DA 2411 bhs L16 01DC ; return task[id]->message; 01DC E603 ldab 3,x 01DE 87 clra 01DF 59 lsld 01E0 C30030 addd #_task 01E3 B7C6 xgdy 01E5 ED40 ldy 0,y 01E7 E6E814 ldab 20,y 01EA 87 clra 01EB 2003 bra L13 01ED L16: 01ED ; else { 01ED ; #ifdef KERNEL_ERROR_MSG 01ED ; puts(error_src[1]); puts(error_msg[3]); 01ED ; #endif 01ED ; return -1; 01ED CCFFFF ldd #-1 01F0 L13: 01F0 B757 tfr x,s 01F2 30 pulx 01F3 1B82 leas 2,sp 01F5 .dbline 0 ; func end 01F5 3D rts 01F6 ; id -> 3,x 01F6 _get_task_priority:: 01F6 3B pshd 01F7 34 pshx 01F8 B775 tfr s,x 01FA ; } 01FA ; 01FA ; } 01FA ; 01FA ; 01FA ; 01FA ; int get_task_priority(unsigned char id) { 01FA ; 01FA ; INTR_OFF(); 01FA 1410 sei 01FC 01FC ; 01FC ; if (id < MAXTASKS) { 01FC E603 ldab 3,x 01FE C108 cmpb #8 0200 2412 bhs L19 0202 ; INTR_ON(); 0202 10EF cli 0204 0204 ; return task[id]->priority; 0204 E603 ldab 3,x 0206 87 clra 0207 59 lsld 0208 C30030 addd #_task 020B B7C6 xgdy 020D ED40 ldy 0,y 020F E64D ldab 13,y 0211 87 clra 0212 2005 bra L18 0214 L19: 0214 ; } 0214 ; else { 0214 ; #ifdef KERNEL_ERROR_MSG 0214 ; puts(error_src[1]); puts(error_msg[4]); 0214 ; #endif 0214 ; INTR_ON(); 0214 10EF cli 0216 0216 ; return -1; 0216 CCFFFF ldd #-1 0219 L18: 0219 B757 tfr x,s 021B 30 pulx 021C 1B82 leas 2,sp 021E .dbline 0 ; func end 021E 3D rts 021F ; ?temp -> -4,x 021F ; ?temp -> -4,x 021F ; ?temp -> -4,x 021F ; ?temp -> -4,x 021F ; ?temp -> -4,x 021F ; ?temp -> -2,x 021F ; newstate -> 7,x 021F ; id -> 3,x 021F _set_task_state:: 021F 3B pshd 0220 34 pshx 0221 B775 tfr s,x 0223 1B9C leas -4,sp 0225 ; } 0225 ; 0225 ; } 0225 ; 0225 ; 0225 ; 0225 ; int set_task_state(unsigned char id, unsigned char newstate) { 0225 ; 0225 ; 0225 ; INTR_OFF(); 0225 1410 sei 0227 0227 ; 0227 ; 0227 ; // check id validity 0227 ; if (id < MAXTASKS) { 0227 E603 ldab 3,x 0229 C108 cmpb #8 022B 182401DF lbhs L22 022F ; 022F ; if (task[id] == NULL) { 022F E603 ldab 3,x 0231 87 clra 0232 59 lsld 0233 C30030 addd #_task 0236 B7C6 xgdy 0238 EC40 ldd 0,y 023A 2609 bne L24 023C ; #ifdef KERNEL_ERROR_MSG 023C ; puts(error_src[1]); puts(error_msg[2]); 023C ; #endif 023C ; INTR_ON(); 023C 10EF cli 023E 023E ; return -1; 023E CCFFFF ldd #-1 0241 182001D5 lbra L21 0245 L24: 0245 ; } 0245 ; 0245 ; 0245 ; // check newstate validity 0245 ; if ((newstate == RUNNING) || 0245 E607 ldab 7,x 0247 C102 cmpb #2 0249 270C beq L29 024B E607 ldab 7,x 024D C103 cmpb #3 024F 2706 beq L29 0251 E607 ldab 7,x 0253 C104 cmpb #4 0255 2309 bls L26 0257 L29: 0257 ; (newstate == WAITING) || 0257 ; (newstate > STOPPED)) { 0257 ; #ifdef KERNEL_ERROR_MSG 0257 ; puts(error_src[1]); puts(error_msg[3]); 0257 ; #endif 0257 ; INTR_ON(); 0257 10EF cli 0259 0259 ; return -1; 0259 CCFFFF ldd #-1 025C 182001BA lbra L21 0260 L26: 0260 E603 ldab 3,x 0262 87 clra 0263 59 lsld 0264 C30030 addd #_task 0267 B7C6 xgdy 0269 ED40 ldy 0,y 026B E64C ldab 12,y 026D 87 clra 026E 6C1E std -2,x 0270 271F beq L33 0272 EC1E ldd -2,x 0274 8C0001 cpd #1 0277 1827009C lbeq L40 027B EC1E ldd -2,x 027D 8C0002 cpd #2 0280 182700F6 lbeq L48 0284 EC1E ldd -2,x 0286 8C0004 cpd #4 0289 1827012E lbeq L51 028D 18200176 lbra L30 0291 X0: 0291 ; } 0291 ; 0291 ; // referenced to the task's current state: 0291 ; switch (task[id]->state) { 0291 L33: 0291 ; case IDLE: 0291 ; if (newstate == IDLE) { // no change 0291 E707 tst 7,x 0293 2609 bne L34 0295 ; INTR_ON(); 0295 10EF cli 0297 0297 ; return 0; 0297 CC0000 ldd #0 029A 1820017C lbra L21 029E L34: 029E ; } 029E ; else if (newstate == PENDING) { 029E E607 ldab 7,x 02A0 C101 cmpb #1 02A2 2632 bne L36 02A4 ; // pass msg to task[id]->msgbox; 02A4 ; task[id]->message |= STATE_FLAG; 02A4 E603 ldab 3,x 02A6 87 clra 02A7 59 lsld 02A8 C30030 addd #_task 02AB B7C6 xgdy 02AD EC40 ldd 0,y 02AF C30014 addd #20 02B2 6C1C std -4,x 02B4 B746 tfr d,y 02B6 35 pshy ; spill 02B7 ED1C ldy -4,x 02B9 31 puly ; reload 02BA 0C4001 bset 0,y,#1 02BD ; task[id]->message_data[STATE_BOX] = PENDING; 02BD E603 ldab 3,x 02BF 87 clra 02C0 59 lsld 02C1 C30030 addd #_task 02C4 B7C6 xgdy 02C6 ED40 ldy 0,y 02C8 C601 ldab #1 02CA 6BE815 stab 21,y 02CD ; INTR_ON(); 02CD 10EF cli 02CF 02CF ; return 0; 02CF CC0000 ldd #0 02D2 18200144 lbra L21 02D6 L36: 02D6 ; } 02D6 ; else if (newstate == STOPPED) { 02D6 E607 ldab 7,x 02D8 C104 cmpb #4 02DA 2632 bne L38 02DC ; // pass msg to task[id]->msgbox; 02DC ; task[id]->message |= STATE_FLAG; 02DC E603 ldab 3,x 02DE 87 clra 02DF 59 lsld 02E0 C30030 addd #_task 02E3 B7C6 xgdy 02E5 EC40 ldd 0,y 02E7 C30014 addd #20 02EA 6C1C std -4,x 02EC B746 tfr d,y 02EE 35 pshy ; spill 02EF ED1C ldy -4,x 02F1 31 puly ; reload 02F2 0C4001 bset 0,y,#1 02F5 ; task[id]->message_data[STATE_BOX] = STOPPED; 02F5 E603 ldab 3,x 02F7 87 clra 02F8 59 lsld 02F9 C30030 addd #_task 02FC B7C6 xgdy 02FE ED40 ldy 0,y 0300 C604 ldab #4 0302 6BE815 stab 21,y 0305 ; INTR_ON(); 0305 10EF cli 0307 0307 ; return 0; 0307 CC0000 ldd #0 030A 1820010C lbra L21 030E L38: 030E ; } 030E ; else { // nothing else is legal; 030E ; #ifdef KERNEL_ERROR_MSG 030E ; puts(error_src[1]); puts(error_msg[3]); 030E ; #endif 030E ; INTR_ON(); 030E 10EF cli 0310 0310 ; return -1; 0310 CCFFFF ldd #-1 0313 18200103 lbra L21 0317 X1: 0317 ; } 0317 ; break; 0317 L40: 0317 ; case PENDING: 0317 ; if (newstate == PENDING) { // no change 0317 E607 ldab 7,x 0319 C101 cmpb #1 031B 2609 bne L41 031D ; INTR_ON(); 031D 10EF cli 031F 031F ; return 0; 031F CC0000 ldd #0 0322 182000F4 lbra L21 0326 L41: 0326 ; } 0326 ; else if (newstate == IDLE) { 0326 E707 tst 7,x 0328 2609 bne L43 032A ; // pass msg to task[id]->msgbox; 032A ; #ifdef KERNEL_ERROR_MSG 032A ; puts(error_src[1]); puts(error_msg[0]); 032A ; #endif 032A ; INTR_ON(); 032A 10EF cli 032C 032C ; return -1; 032C CCFFFF ldd #-1 032F 182000E7 lbra L21 0333 L43: 0333 ; } 0333 ; else if (newstate == STOPPED) { 0333 E607 ldab 7,x 0335 C104 cmpb #4 0337 2638 bne L45 0339 ; // pass msg to task[id]->msgbox; 0339 ; puts("TP"); 0339 CC065F ldd #L47 033C 160000 jsr _puts 033F ; task[id]->message |= STATE_FLAG; 033F E603 ldab 3,x 0341 87 clra 0342 59 lsld 0343 C30030 addd #_task 0346 B7C6 xgdy 0348 EC40 ldd 0,y 034A C30014 addd #20 034D 6C1C std -4,x 034F B746 tfr d,y 0351 35 pshy ; spill 0352 ED1C ldy -4,x 0354 31 puly ; reload 0355 0C4001 bset 0,y,#1 0358 ; task[id]->message_data[STATE_BOX] = STOPPED; 0358 E603 ldab 3,x 035A 87 clra 035B 59 lsld 035C C30030 addd #_task 035F B7C6 xgdy 0361 ED40 ldy 0,y 0363 C604 ldab #4 0365 6BE815 stab 21,y 0368 ; INTR_ON(); 0368 10EF cli 036A 036A ; return 0; 036A CC0000 ldd #0 036D 182000A9 lbra L21 0371 L45: 0371 ; } 0371 ; else { 0371 ; #ifdef KERNEL_ERROR_MSG 0371 ; puts(error_src[1]); puts(error_msg[3]); 0371 ; #endif 0371 ; INTR_ON(); 0371 10EF cli 0373 0373 ; return -1; 0373 CCFFFF ldd #-1 0376 182000A0 lbra L21 037A X2: 037A ; } 037A ; break; 037A L48: 037A ; case RUNNING: 037A ; if (newstate == STOPPED) { 037A E607 ldab 7,x 037C C104 cmpb #4 037E 2632 bne L49 0380 ; // pass msg to task[id]->msgbox; 0380 ; task[id]->message |= STATE_FLAG; 0380 E603 ldab 3,x 0382 87 clra 0383 59 lsld 0384 C30030 addd #_task 0387 B7C6 xgdy 0389 EC40 ldd 0,y 038B C30014 addd #20 038E 6C1C std -4,x 0390 B746 tfr d,y 0392 35 pshy ; spill 0393 ED1C ldy -4,x 0395 31 puly ; reload 0396 0C4001 bset 0,y,#1 0399 ; task[id]->message_data[STATE_BOX] = STOPPED; 0399 E603 ldab 3,x 039B 87 clra 039C 59 lsld 039D C30030 addd #_task 03A0 B7C6 xgdy 03A2 ED40 ldy 0,y 03A4 C604 ldab #4 03A6 6BE815 stab 21,y 03A9 ; 03A9 ; INTR_ON(); 03A9 10EF cli 03AB 03AB ; return 0; 03AB CC0000 ldd #0 03AE 18200068 lbra L21 03B2 L49: 03B2 ; } 03B2 ; else { 03B2 ; #ifdef KERNEL_ERROR_MSG 03B2 ; puts(error_src[1]); puts(error_msg[3]); 03B2 ; #endif 03B2 ; INTR_ON(); 03B2 10EF cli 03B4 03B4 ; return -1; 03B4 CCFFFF ldd #-1 03B7 1820005F lbra L21 03BB X3: 03BB ; } 03BB ; break; 03BB L51: 03BB ; case STOPPED: 03BB ; if (newstate == STOPPED) { // no change 03BB E607 ldab 7,x 03BD C104 cmpb #4 03BF 2609 bne L52 03C1 ; INTR_ON(); 03C1 10EF cli 03C3 03C3 ; return 0; 03C3 CC0000 ldd #0 03C6 18200050 lbra L21 03CA L52: 03CA ; } 03CA ; else if (newstate == PENDING) { 03CA E607 ldab 7,x 03CC C101 cmpb #1 03CE 2630 bne L54 03D0 ; // pass msg to task[id]->msgbox; 03D0 ; task[id]->message |= STATE_FLAG; 03D0 E603 ldab 3,x 03D2 87 clra 03D3 59 lsld 03D4 C30030 addd #_task 03D7 B7C6 xgdy 03D9 EC40 ldd 0,y 03DB C30014 addd #20 03DE 6C1C std -4,x 03E0 B746 tfr d,y 03E2 35 pshy ; spill 03E3 ED1C ldy -4,x 03E5 31 puly ; reload 03E6 0C4001 bset 0,y,#1 03E9 ; task[id]->message_data[STATE_BOX] = PENDING; 03E9 E603 ldab 3,x 03EB 87 clra 03EC 59 lsld 03ED C30030 addd #_task 03F0 B7C6 xgdy 03F2 ED40 ldy 0,y 03F4 C601 ldab #1 03F6 6BE815 stab 21,y 03F9 ; INTR_ON(); 03F9 10EF cli 03FB 03FB ; return 0; 03FB CC0000 ldd #0 03FE 201A bra L21 0400 L54: 0400 ; } 0400 ; else { 0400 ; #ifdef KERNEL_ERROR_MSG 0400 ; puts(error_src[1]); puts(error_msg[3]); 0400 ; #endif 0400 ; INTR_ON(); 0400 10EF cli 0402 0402 ; return -1; 0402 CCFFFF ldd #-1 0405 2013 bra L21 0407 X4: 0407 ; } 0407 ; break; 0407 L30: 0407 ; default: 0407 ; #ifdef KERNEL_ERROR_MSG 0407 ; puts(error_src[1]); puts(error_msg[3]); 0407 ; #endif 0407 ; INTR_ON(); 0407 10EF cli 0409 0409 ; return -1; 0409 CCFFFF ldd #-1 040C 200C bra L21 040E X5: 040E ; break; 040E L22: 040E ; 040E ; } // end switch (task[id]->state) 040E ; 040E ; } // if (id < MAXTASKS) 040E ; 040E ; else { 040E ; #ifdef KERNEL_ERROR_MSG 040E ; puts(error_src[1]); puts(error_msg[2]); 040E ; #endif 040E ; INTR_ON(); 040E 10EF cli 0410 0410 ; return -1; 0410 CCFFFF ldd #-1 0413 2005 bra L21 0415 X6: 0415 ; } 0415 ; 0415 ; INTR_ON(); 0415 10EF cli 0417 0417 ; return 0; 0417 CC0000 ldd #0 041A L21: 041A B757 tfr x,s 041C 30 pulx 041D 1B82 leas 2,sp 041F .dbline 0 ; func end 041F 3D rts 0420 ; priority -> 7,x 0420 ; id -> 3,x 0420 _set_task_priority:: 0420 3B pshd 0421 34 pshx 0422 B775 tfr s,x 0424 ; 0424 ; } 0424 ; 0424 ; 0424 ; 0424 ; int set_task_priority(unsigned char id, unsigned char priority) { 0424 ; 0424 ; if (priority == 0) // priority 0 is reserved for the shell 0424 E707 tst 7,x 0426 2604 bne L57 0428 ; priority = 1; 0428 C601 ldab #1 042A 6B07 stab 7,x 042C L57: 042C ; 042C ; if (id >= (MAXTASKS)) { 042C E603 ldab 3,x 042E C108 cmpb #8 0430 2505 blo L59 0432 ; #ifdef KERNEL_ERROR_MSG 0432 ; puts(error_src[1]); puts(error_msg[4]); 0432 ; #endif 0432 ; return -1; 0432 CCFFFF ldd #-1 0435 2021 bra L56 0437 L59: 0437 E607 ldab 7,x 0439 C1FF cmpb #255 043B 2204 bhi L63 043D E707 tst 7,x 043F 2405 bhs L61 0441 L63: 0441 ; } 0441 ; else if ((priority > 255) || (priority < 0)) { 0441 ; #ifdef KERNEL_ERROR_MSG 0441 ; puts(error_src[1]); puts(error_msg[4]); 0441 ; #endif 0441 ; return -1; 0441 CCFFFF ldd #-1 0444 2012 bra L56 0446 L61: 0446 ; } 0446 ; else { 0446 ; task[id]->priority = priority; 0446 E603 ldab 3,x 0448 87 clra 0449 59 lsld 044A C30030 addd #_task 044D B7C6 xgdy 044F ED40 ldy 0,y 0451 E607 ldab 7,x 0453 6B4D stab 13,y 0455 ; return 0; 0455 CC0000 ldd #0 0458 L56: 0458 B757 tfr x,s 045A 30 pulx 045B 1B82 leas 2,sp 045D .dbline 0 ; func end 045D 3D rts 045E ; lreg1 -> -4,x 045E ; lreg2 -> -8,x 045E ; id -> -10,x 045E ; i -> -9,x 045E ; state -> 10,x 045E ; priority -> 9,x 045E ; addr -> 6,x 045E ; name -> 2,x 045E _create_task:: 045E 3B pshd 045F 34 pshx 0460 B775 tfr s,x 0462 1B90 leas -16,sp 0464 ; } 0464 ; } 0464 ; 0464 ; 0464 ; 0464 ; 0464 ; int create_task(char *name, void (*addr)(), unsigned char priority, int state) { 0464 ; 0464 ; // LOCAL VARIABLES 0464 ; unsigned char id, i=0; 0464 6917 clr -9,x 0466 ; 0466 ; 0466 ; INTR_OFF(); // critical section 0466 1410 sei 0468 0468 6917 clr -9,x 046A 2015 bra L68 046C L65: 046C E617 ldab -9,x 046E 87 clra 046F 59 lsld 0470 C30000 addd #_task_ptr 0473 B7C6 xgdy 0475 EC40 ldd 0,y 0477 270E beq L67 0479 L66: 0479 E617 ldab -9,x 047B 87 clra 047C C30001 addd #1 047F 6B17 stab -9,x 0481 L68: 0481 ; 0481 ; 0481 ; //if (get_free_memory() > 64) { 0481 ; 0481 ; // determine lowest free id available to assign to this task 0481 ; for (i=0; iaddress = addr; 04B8 E616 ldab -10,x 04BA 87 clra 04BB 59 lsld 04BC C30030 addd #_task 04BF B7C6 xgdy 04C1 ED40 ldy 0,y 04C3 EC06 ldd 6,x 04C5 6C40 std 0,y 04C7 ; task[id]->id = id; 04C7 E616 ldab -10,x 04C9 87 clra 04CA 59 lsld 04CB C30030 addd #_task 04CE B7C6 xgdy 04D0 ED40 ldy 0,y 04D2 E616 ldab -10,x 04D4 6B42 stab 2,y 04D6 ; strcpy(task[id]->name, name); 04D6 18020280 movw 2,x,0,sp 04DA E616 ldab -10,x 04DC 87 clra 04DD 59 lsld 04DE C30030 addd #_task 04E1 B7C6 xgdy 04E3 EC40 ldd 0,y 04E5 C30003 addd #3 04E8 160000 jsr _strcpy 04EB ; task[id]->state = state; 04EB E616 ldab -10,x 04ED 87 clra 04EE 59 lsld 04EF C30030 addd #_task 04F2 B7C6 xgdy 04F4 ED40 ldy 0,y 04F6 EC0A ldd 10,x 04F8 6B4C stab 12,y 04FA ; task[id]->priority = priority; 04FA E616 ldab -10,x 04FC 87 clra 04FD 59 lsld 04FE C30030 addd #_task 0501 B7C6 xgdy 0503 ED40 ldy 0,y 0505 E609 ldab 9,x 0507 6B4D stab 13,y 0509 ; task[id]->period_tick = 0; 0509 E616 ldab -10,x 050B 87 clra 050C 59 lsld 050D C30030 addd #_task 0510 B7C6 xgdy 0512 ED40 ldy 0,y 0514 194E leay 14,y 0516 35 pshy ; spill 0517 CD065B ldy #L73 051A 1802401C movw 0,y,-4,x 051E 1802421E movw 2,y,-2,x 0522 31 puly ; reload 0523 18021C40 movw -4,x,0,y 0527 18021E42 movw -2,x,2,y 052B ; task[id]->interrupt_msg_box = NULL; 052B E616 ldab -10,x 052D 87 clra 052E 59 lsld 052F C30030 addd #_task 0532 B7C6 xgdy 0534 ED40 ldy 0,y 0536 CC0000 ldd #0 0539 6CE812 std 18,y 053C ; task[id]->message = NULL; 053C E616 ldab -10,x 053E 87 clra 053F 59 lsld 0540 C30030 addd #_task 0543 B7C6 xgdy 0545 ED40 ldy 0,y 0547 69E814 clr 20,y 054A ; task[id]->message_data[0] = NULL; 054A E616 ldab -10,x 054C 87 clra 054D 59 lsld 054E C30030 addd #_task 0551 B7C6 xgdy 0553 ED40 ldy 0,y 0555 69E815 clr 21,y 0558 ; task[id]->message_data[1] = NULL; 0558 E616 ldab -10,x 055A 87 clra 055B 59 lsld 055C C30030 addd #_task 055F B7C6 xgdy 0561 ED40 ldy 0,y 0563 69E816 clr 22,y 0566 ; task[id]->heap_ptr = malloc(STACK_SIZE); 0566 CC0032 ldd #50 0569 160000 jsr _malloc 056C 6C12 std -14,x 056E E616 ldab -10,x 0570 87 clra 0571 59 lsld 0572 C30030 addd #_task 0575 B7C6 xgdy 0577 ED40 ldy 0,y 0579 EC12 ldd -14,x 057B 6CE817 std 23,y 057E ; task[id]->heap_size = 0; 057E E616 ldab -10,x 0580 87 clra 0581 59 lsld 0582 C30030 addd #_task 0585 B7C6 xgdy 0587 ED40 ldy 0,y 0589 CC0000 ldd #0 058C 6CE819 std 25,y 058F ; task[id]->frame_ptr = NULL; 058F E616 ldab -10,x 0591 87 clra 0592 59 lsld 0593 C30030 addd #_task 0596 B7C6 xgdy 0598 ED40 ldy 0,y 059A CC0000 ldd #0 059D 6CE81B std 27,y 05A0 ; 05A0 ; } 05A0 ; //} 05A0 ; 05A0 ; INTR_ON(); 05A0 10EF cli 05A2 05A2 ; 05A2 ; return id; 05A2 E616 ldab -10,x 05A4 87 clra 05A5 L64: 05A5 B757 tfr x,s 05A7 30 pulx 05A8 1B82 leas 2,sp 05AA .dbline 0 ; func end 05AA 3D rts 05AB ; rid -> 3,x 05AB _get_resource_state:: 05AB 3B pshd 05AC 34 pshx 05AD B775 tfr s,x 05AF ; 05AF ; } 05AF ; 05AF ; 05AF ; 05AF ; 05AF ; int get_resource_state(unsigned char rid) { 05AF ; 05AF ; if (rid < NUMRESOURCES) { 05AF E603 ldab 3,x 05B1 C104 cmpb #4 05B3 2414 bhs L75 05B5 ; return resource[rid].state; 05B5 E603 ldab 3,x 05B7 87 clra 05B8 B7C6 xgdy 05BA CC000C ldd #12 05BD 1813 emuls 05BF C30006 addd #_resource+6 05C2 B7C6 xgdy 05C4 E640 ldab 0,y 05C6 87 clra 05C7 2003 bra L74 05C9 L75: 05C9 ; } 05C9 ; else { 05C9 ; #ifdef KERNEL_ERROR_MSG 05C9 ; puts(error_src[1]); puts(error_msg[6]); 05C9 ; #endif 05C9 ; return -1; 05C9 CCFFFF ldd #-1 05CC L74: 05CC B757 tfr x,s 05CE 30 pulx 05CF 1B82 leas 2,sp 05D1 .dbline 0 ; func end 05D1 3D rts 05D2 ; rid -> 3,x 05D2 _get_resource_owner:: 05D2 3B pshd 05D3 34 pshx 05D4 B775 tfr s,x 05D6 ; } 05D6 ; 05D6 ; } 05D6 ; 05D6 ; 05D6 ; 05D6 ; 05D6 ; 05D6 ; int get_resource_owner(unsigned char rid) { 05D6 ; 05D6 ; if (rid < NUMRESOURCES) { 05D6 E603 ldab 3,x 05D8 C104 cmpb #4 05DA 2414 bhs L79 05DC ; return resource[rid].owner; 05DC E603 ldab 3,x 05DE 87 clra 05DF B7C6 xgdy 05E1 CC000C ldd #12 05E4 1813 emuls 05E6 C30007 addd #_resource+7 05E9 B7C6 xgdy 05EB E640 ldab 0,y 05ED 87 clra 05EE 2003 bra L78 05F0 L79: 05F0 ; } 05F0 ; else { 05F0 ; #ifdef KERNEL_ERROR_MSG 05F0 ; puts(error_src[1]); puts(error_msg[6]); 05F0 ; #endif 05F0 ; return -1; 05F0 CCFFFF ldd #-1 05F3 L78: 05F3 B757 tfr x,s 05F5 30 pulx 05F6 1B82 leas 2,sp 05F8 .dbline 0 ; func end 05F8 3D rts 05F9 ; rid -> 3,x 05F9 _get_resource_queuelen:: 05F9 3B pshd 05FA 34 pshx 05FB B775 tfr s,x 05FD ; } 05FD ; 05FD ; } 05FD ; 05FD ; 05FD ; 05FD ; 05FD ; int get_resource_queuelen(unsigned char rid) { 05FD ; 05FD ; if (rid < NUMRESOURCES) { 05FD E603 ldab 3,x 05FF C104 cmpb #4 0601 2414 bhs L83 0603 ; return resource[rid].queue_ptr; 0603 E603 ldab 3,x 0605 87 clra 0606 B7C6 xgdy 0608 CC000C ldd #12 060B 1813 emuls 060D C3000B addd #_resource+11 0610 B7C6 xgdy 0612 E640 ldab 0,y 0614 87 clra 0615 2003 bra L82 0617 L83: 0617 ; } 0617 ; else { 0617 ; #ifdef KERNEL_ERROR_MSG 0617 ; puts(error_src[1]); puts(error_msg[6]); 0617 ; #endif 0617 ; return -1; 0617 CCFFFF ldd #-1 061A L82: 061A B757 tfr x,s 061C 30 pulx 061D 1B82 leas 2,sp 061F .dbline 0 ; func end 061F 3D rts 0620 ; last -> -6,x 0620 ; memory -> -4,x 0620 ; i -> -2,x 0620 _get_free_memory:: 0620 34 pshx 0621 B775 tfr s,x 0623 1B98 leas -8,sp 0625 ; } 0625 ; 0625 ; } 0625 ; 0625 ; 0625 ; 0625 ; 0625 ; int get_free_memory(void) { 0625 ; 0625 ; // LOCAL VARIABLES 0625 ; char *memory, *last; 0625 ; int i; 0625 ; 0625 ; 0625 ; INTR_OFF(); 0625 1410 sei 0627 0627 CC0000 ldd #0 062A 6C1E std -2,x 062C L87: 062C ; // check for largest free memory block 062C ; for (i=0; i