.module kernel.c .area data 0000 _error_msg:: 0000 .blkb 23 .area idata 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 .area data 0017 .blkb 2 .area idata 0017 0000 .byte 0,0 .area data 0019 .blkb 13 .area idata 0019 73796E746178206572726F7200 .byte 's,'y,'n,'t,'a,'x,32,'e,'r,'r,'o,'r,0 .area data 0026 .blkb 12 .area idata 0026 00000000000000000000 .word 0,0,0,0,0 0030 0000 .byte 0,0 .area data 0032 .blkb 16 .area idata 0032 696C6C6567616C207461736B20494400 .byte 'i,'l,'l,'e,'g,'a,'l,32,'t,'a,'s,'k,32,'I,'D,0 .area data 0042 .blkb 9 .area idata 0042 000000000000000000 .byte 0,0,0,0,0,0,0,0,0 .area data 004B .blkb 19 .area idata 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 .area data 005E .blkb 6 .area idata 005E 000000000000 .byte 0,0,0,0,0,0 .area data 0064 .blkb 22 .area idata 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 .area data 007A .blkb 3 .area idata 007A 000000 .byte 0,0,0 .area data 007D .blkb 14 .area idata 007D 6F7574206F66206D656D6F727900 .byte 'o,'u,'t,32,'o,'f,32,'m,'e,'m,'o,'r,'y,0 .area data 008B .blkb 11 .area idata 008B 00000000000000000000 .word 0,0,0,0,0 0095 00 .byte 0 .area data 0096 _error_src:: 0096 .blkb 14 .area idata 0096 6B65726E656C206572726F723A00 .byte 'k,'e,'r,'n,'e,'l,32,'e,'r,'r,'o,'r,58,0 .area data 00A4 .blkb 4 .area idata 00A4 00000000 .byte 0,0,0,0 .area data 00A8 .blkb 16 .area idata 00A8 6B65726E656C2E63206572726F723A00 .byte 'k,'e,'r,'n,'e,'l,46,'c,32,'e,'r,'r,'o,'r,58,0 .area data 00B8 .blkb 2 .area idata 00B8 0000 .byte 0,0 .area data 00BA .blkb 18 .area idata 00BA 6B65726E656C20525449206572726F72 .byte 'k,'e,'r,'n,'e,'l,32,'R,'T,'I,32,'e,'r,'r,'o,'r 00CA 3A00 .byte 58,0 .area data 00CC .blkb 13 .area idata 00CC 7368656C6C206572726F723A00 .byte 's,'h,'e,'l,'l,32,'e,'r,'r,'o,'r,58,0 .area data 00D9 .blkb 5 .area idata 00D9 0000000000 .byte 0,0,0,0,0 .area data .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 long int period_tick; // for determining if deadline is up 0000 ; unsigned int interrupt_msg_box; // flags for pending interrupts 0000 ; enum message_box message; // misc flags 0000 ; unsigned char message_data[8]; // data for misc_msg_box flags 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[3]; // 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 ; // error massages 0000 ; char error_msg[6][25] = {"unimplimented function", // error 0 0000 ; "syntax error", // error 1 0000 ; "illegal task ID", // error 2 0000 ; "illegal task state", // error 3 0000 ; "illegal task priority", // error 4 0000 ; "out of memory" // error 5 0000 ; }; 0000 ; char error_src[4][18] = {"kernel error:", // source 0 0000 ; "kernel.c error:", // source 1 0000 ; "kernel RTI error:", // source 2 0000 ; "shell error:" // source 3 0000 ; }; 0000 ; 0000 ; 0000 ; 0000 ; // FUNCTIONS 0000 ; 0000 ; char get_task_id() { 0000 ; return task[current].id; 0000 CC0018 ldd #24 0003 FD005A ldy _current 0006 13 emul 0007 C3000E 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 ; int get_task_state(unsigned char id) { 0014 ; 0014 ; if (id < numtasks) { 0014 E603 ldab 3,x 0016 C103 cmpb #3 0018 2414 bhs L5 001A ; return task[id].state; 001A E603 ldab 3,x 001C 87 clra 001D B7C6 xgdy 001F CC0018 ldd #24 0022 1813 emuls 0024 C3000F addd #_task+1 0027 B7C6 xgdy 0029 E640 ldab 0,y 002B 87 clra 002C 200F bra L4 002E L5: 002E ; } 002E ; else { 002E ; #ifdef KERNEL_ERROR_MSG 002E ; puts(error_src[1]); puts(error_msg[3]); 002E CC00A8 ldd #_error_src+18 0031 160000 jsr _puts 0034 CC004B ldd #_error_msg+75 0037 160000 jsr _puts 003A ; #endif 003A ; return -1; 003A CCFFFF ldd #-1 003D L4: 003D B757 tfr x,s 003F 30 pulx 0040 1B82 leas 2,sp 0042 .dbline 0 ; func end 0042 3D rts 0043 ; id -> 3,x 0043 _get_task_messages:: 0043 3B pshd 0044 34 pshx 0045 B775 tfr s,x 0047 ; } 0047 ; 0047 ; } 0047 ; 0047 ; 0047 ; 0047 ; int get_task_messages(unsigned char id) { 0047 ; 0047 ; if (id < numtasks) { 0047 E603 ldab 3,x 0049 C103 cmpb #3 004B 2414 bhs L11 004D ; return task[id].message; 004D E603 ldab 3,x 004F 87 clra 0050 B7C6 xgdy 0052 CC0018 ldd #24 0055 1813 emuls 0057 C30017 addd #_task+9 005A B7C6 xgdy 005C E640 ldab 0,y 005E 87 clra 005F 200F bra L10 0061 L11: 0061 ; } 0061 ; else { 0061 ; #ifdef KERNEL_ERROR_MSG 0061 ; puts(error_src[1]); puts(error_msg[3]); 0061 CC00A8 ldd #_error_src+18 0064 160000 jsr _puts 0067 CC004B ldd #_error_msg+75 006A 160000 jsr _puts 006D ; #endif 006D ; return -1; 006D CCFFFF ldd #-1 0070 L10: 0070 B757 tfr x,s 0072 30 pulx 0073 1B82 leas 2,sp 0075 .dbline 0 ; func end 0075 3D rts 0076 ; id -> 3,x 0076 _get_task_priority:: 0076 3B pshd 0077 34 pshx 0078 B775 tfr s,x 007A ; } 007A ; 007A ; } 007A ; 007A ; 007A ; 007A ; int get_task_priority(unsigned char id) { 007A ; 007A ; INTR_OFF(); 007A 1410 sei 007C 007C ; 007C ; if (id < numtasks) { 007C E603 ldab 3,x 007E C103 cmpb #3 0080 2416 bhs L17 0082 ; INTR_ON(); 0082 10EF cli 0084 0084 ; return task[id].priority; 0084 E603 ldab 3,x 0086 87 clra 0087 B7C6 xgdy 0089 CC0018 ldd #24 008C 1813 emuls 008E C30010 addd #_task+2 0091 B7C6 xgdy 0093 E640 ldab 0,y 0095 87 clra 0096 2011 bra L16 0098 L17: 0098 ; } 0098 ; else { 0098 ; #ifdef KERNEL_ERROR_MSG 0098 ; puts(error_src[1]); puts(error_msg[4]); 0098 CC00A8 ldd #_error_src+18 009B 160000 jsr _puts 009E CC0064 ldd #_error_msg+100 00A1 160000 jsr _puts 00A4 ; #endif 00A4 ; INTR_ON(); 00A4 10EF cli 00A6 00A6 ; return -1; 00A6 CCFFFF ldd #-1 00A9 L16: 00A9 B757 tfr x,s 00AB 30 pulx 00AC 1B82 leas 2,sp 00AE .dbline 0 ; func end 00AE 3D rts 00AF ; ?temp -> -2,x 00AF ; state -> 7,x 00AF ; id -> 3,x 00AF _set_task_state:: 00AF 3B pshd 00B0 34 pshx 00B1 B775 tfr s,x 00B3 1B9E leas -2,sp 00B5 ; } 00B5 ; 00B5 ; } 00B5 ; 00B5 ; 00B5 ; 00B5 ; int set_task_state(unsigned char id, unsigned char state) { 00B5 ; 00B5 ; 00B5 ; INTR_OFF(); 00B5 1410 sei 00B7 00B7 ; 00B7 ; 00B7 ; // check id validity 00B7 ; if (id < numtasks) { 00B7 E603 ldab 3,x 00B9 C103 cmpb #3 00BB 18240151 lbhs L23 00BF ; 00BF ; // check state validity 00BF ; if ((state == running) || 00BF E607 ldab 7,x 00C1 C102 cmpb #2 00C3 270C beq L28 00C5 E607 ldab 7,x 00C7 C103 cmpb #3 00C9 2706 beq L28 00CB E607 ldab 7,x 00CD C104 cmpb #4 00CF 2315 bls L25 00D1 L28: 00D1 ; (state == waiting) || 00D1 ; (state > finished)) { 00D1 ; #ifdef KERNEL_ERROR_MSG 00D1 ; puts(error_src[1]); puts(error_msg[3]); 00D1 CC00A8 ldd #_error_src+18 00D4 160000 jsr _puts 00D7 CC004B ldd #_error_msg+75 00DA 160000 jsr _puts 00DD ; #endif 00DD ; INTR_ON(); 00DD 10EF cli 00DF 00DF ; return -1; 00DF CCFFFF ldd #-1 00E2 1820013F lbra L22 00E6 L25: 00E6 E603 ldab 3,x 00E8 87 clra 00E9 B7C6 xgdy 00EB CC0018 ldd #24 00EE 1813 emuls 00F0 C3000F addd #_task+1 00F3 B7C6 xgdy 00F5 E640 ldab 0,y 00F7 87 clra 00F8 6C1E std -2,x 00FA 2716 beq L35 00FC EC1E ldd -2,x 00FE 8C0001 cpd #1 0101 18270065 lbeq L46 0105 EC1E ldd -2,x 0107 8C0004 cpd #4 010A 182700B4 lbeq L57 010E 182000EB lbra L31 0112 X0: 0112 ; } 0112 ; 0112 ; switch (task[id].state) { 0112 L35: 0112 ; case idle: 0112 ; if (state == idle) { // no change 0112 E707 tst 7,x 0114 2609 bne L36 0116 ; INTR_ON(); 0116 10EF cli 0118 0118 ; return 0; 0118 CC0000 ldd #0 011B 18200106 lbra L22 011F L36: 011F ; } 011F ; else if (state == pending) { 011F E607 ldab 7,x 0121 C101 cmpb #1 0123 2615 bne L38 0125 ; // pass msg to task[id].msgbox; 0125 ; #ifdef KERNEL_ERROR_MSG 0125 ; puts(error_src[1]); puts(error_msg[0]); 0125 CC00A8 ldd #_error_src+18 0128 160000 jsr _puts 012B CC0000 ldd #_error_msg 012E 160000 jsr _puts 0131 ; #endif 0131 ; INTR_ON(); 0131 10EF cli 0133 0133 ; return -1; 0133 CCFFFF ldd #-1 0136 182000EB lbra L22 013A L38: 013A ; } 013A ; else if (state == finished) { 013A E607 ldab 7,x 013C C104 cmpb #4 013E 2615 bne L41 0140 ; // pass msg to task[id].msgbox; 0140 ; #ifdef KERNEL_ERROR_MSG 0140 ; puts(error_src[1]); puts(error_msg[0]); 0140 CC00A8 ldd #_error_src+18 0143 160000 jsr _puts 0146 CC0000 ldd #_error_msg 0149 160000 jsr _puts 014C ; #endif 014C ; INTR_ON(); 014C 10EF cli 014E 014E ; return -1; 014E CCFFFF ldd #-1 0151 182000D0 lbra L22 0155 L41: 0155 ; } 0155 ; else { // nothing else is legalox; 0155 ; #ifdef KERNEL_ERROR_MSG 0155 ; puts(error_src[1]); puts(error_msg[3]); 0155 CC00A8 ldd #_error_src+18 0158 160000 jsr _puts 015B CC004B ldd #_error_msg+75 015E 160000 jsr _puts 0161 ; #endif 0161 ; INTR_ON(); 0161 10EF cli 0163 0163 ; return -1; 0163 CCFFFF ldd #-1 0166 182000BB lbra L22 016A X1: 016A ; } 016A ; break; 016A L46: 016A ; case pending: 016A ; if (state == pending) { // no change 016A E607 ldab 7,x 016C C101 cmpb #1 016E 2609 bne L47 0170 ; INTR_ON(); 0170 10EF cli 0172 0172 ; return 0; 0172 CC0000 ldd #0 0175 182000AC lbra L22 0179 L47: 0179 ; } 0179 ; else if (state == idle) { 0179 E707 tst 7,x 017B 2615 bne L49 017D ; // pass msg to task[id].msgbox; 017D ; #ifdef KERNEL_ERROR_MSG 017D ; puts(error_src[1]); puts(error_msg[0]); 017D CC00A8 ldd #_error_src+18 0180 160000 jsr _puts 0183 CC0000 ldd #_error_msg 0186 160000 jsr _puts 0189 ; #endif 0189 ; INTR_ON(); 0189 10EF cli 018B 018B ; return -1; 018B CCFFFF ldd #-1 018E 18200093 lbra L22 0192 L49: 0192 ; } 0192 ; else if (state == finished) { 0192 E607 ldab 7,x 0194 C104 cmpb #4 0196 2615 bne L52 0198 ; // pass msg to task[id].msgbox; 0198 ; #ifdef KERNEL_ERROR_MSG 0198 ; puts(error_src[1]); puts(error_msg[0]); 0198 CC00A8 ldd #_error_src+18 019B 160000 jsr _puts 019E CC0000 ldd #_error_msg 01A1 160000 jsr _puts 01A4 ; #endif 01A4 ; INTR_ON(); 01A4 10EF cli 01A6 01A6 ; return -1; 01A6 CCFFFF ldd #-1 01A9 18200078 lbra L22 01AD L52: 01AD ; } 01AD ; else { 01AD ; #ifdef KERNEL_ERROR_MSG 01AD ; puts(error_src[1]); puts(error_msg[3]); 01AD CC00A8 ldd #_error_src+18 01B0 160000 jsr _puts 01B3 CC004B ldd #_error_msg+75 01B6 160000 jsr _puts 01B9 ; #endif 01B9 ; INTR_ON(); 01B9 10EF cli 01BB 01BB ; return -1; 01BB CCFFFF ldd #-1 01BE 18200063 lbra L22 01C2 X2: 01C2 ; } 01C2 ; break; 01C2 L57: 01C2 ; 01C2 ; case finished: 01C2 ; if (state == finished) { // no change 01C2 E607 ldab 7,x 01C4 C104 cmpb #4 01C6 2609 bne L58 01C8 ; INTR_ON(); 01C8 10EF cli 01CA 01CA ; return 0; 01CA CC0000 ldd #0 01CD 18200054 lbra L22 01D1 L58: 01D1 ; } 01D1 ; else if (state == pending) { 01D1 E607 ldab 7,x 01D3 C101 cmpb #1 01D5 2613 bne L60 01D7 ; // pass msg to task[id].msgbox; 01D7 ; #ifdef KERNEL_ERROR_MSG 01D7 ; puts(error_src[1]); puts(error_msg[0]); 01D7 CC00A8 ldd #_error_src+18 01DA 160000 jsr _puts 01DD CC0000 ldd #_error_msg 01E0 160000 jsr _puts 01E3 ; #endif 01E3 ; INTR_ON(); 01E3 10EF cli 01E5 01E5 ; return -1; 01E5 CCFFFF ldd #-1 01E8 203B bra L22 01EA L60: 01EA ; } 01EA ; else { 01EA ; #ifdef KERNEL_ERROR_MSG 01EA ; puts(error_src[1]); puts(error_msg[3]); 01EA CC00A8 ldd #_error_src+18 01ED 160000 jsr _puts 01F0 CC004B ldd #_error_msg+75 01F3 160000 jsr _puts 01F6 ; #endif 01F6 ; INTR_ON(); 01F6 10EF cli 01F8 01F8 ; return -1; 01F8 CCFFFF ldd #-1 01FB 2028 bra L22 01FD X3: 01FD ; } 01FD ; break; 01FD L31: 01FD ; default: 01FD ; #ifdef KERNEL_ERROR_MSG 01FD ; puts(error_src[1]); puts(error_msg[3]); 01FD CC00A8 ldd #_error_src+18 0200 160000 jsr _puts 0203 CC004B ldd #_error_msg+75 0206 160000 jsr _puts 0209 ; #endif 0209 ; INTR_ON(); 0209 10EF cli 020B 020B ; return -1; 020B CCFFFF ldd #-1 020E 2015 bra L22 0210 X4: 0210 ; break; 0210 L23: 0210 ; 0210 ; } // end switch (task[id].state) 0210 ; 0210 ; } // if 0210 ; 0210 ; else { 0210 ; #ifdef KERNEL_ERROR_MSG 0210 ; puts(error_src[1]); puts(error_msg[2]); 0210 CC00A8 ldd #_error_src+18 0213 160000 jsr _puts 0216 CC0032 ldd #_error_msg+50 0219 160000 jsr _puts 021C ; #endif 021C ; INTR_ON(); 021C 10EF cli 021E 021E ; return -1; 021E CCFFFF ldd #-1 0221 2002 bra L22 0223 X5: 0223 ; } 0223 ; 0223 ; INTR_ON(); 0223 10EF cli 0225 0225 ; 0225 ; } 0225 L22: 0225 B757 tfr x,s 0227 30 pulx 0228 1B82 leas 2,sp 022A .dbline 0 ; func end 022A 3D rts 022B ; priority -> 7,x 022B ; id -> 3,x 022B _set_task_priority:: 022B 3B pshd 022C 34 pshx 022D B775 tfr s,x 022F ; 022F ; 022F ; 022F ; int set_task_priority(unsigned char id, unsigned char priority) { 022F ; 022F ; if (priority == 0) // priority 0 is reserved for the shell 022F E707 tst 7,x 0231 2604 bne L70 0233 ; priority = 1; 0233 C601 ldab #1 0235 6B07 stab 7,x 0237 L70: 0237 ; 0237 ; if (id >= (numtasks)) { 0237 E603 ldab 3,x 0239 C103 cmpb #3 023B 2511 blo L72 023D ; #ifdef KERNEL_ERROR_MSG 023D ; puts(error_src[1]); puts(error_msg[4]); 023D CC00A8 ldd #_error_src+18 0240 160000 jsr _puts 0243 CC0064 ldd #_error_msg+100 0246 160000 jsr _puts 0249 ; #endif 0249 ; return -1; 0249 CCFFFF ldd #-1 024C 2031 bra L69 024E L72: 024E E607 ldab 7,x 0250 C1FF cmpb #255 0252 2204 bhi L78 0254 E707 tst 7,x 0256 2411 bhs L76 0258 L78: 0258 ; } 0258 ; else if ((priority > 255) || (priority < 0)) { 0258 ; #ifdef KERNEL_ERROR_MSG 0258 ; puts(error_src[1]); puts(error_msg[4]); 0258 CC00A8 ldd #_error_src+18 025B 160000 jsr _puts 025E CC0064 ldd #_error_msg+100 0261 160000 jsr _puts 0264 ; #endif 0264 ; return -1; 0264 CCFFFF ldd #-1 0267 2016 bra L69 0269 L76: 0269 ; } 0269 ; else { 0269 ; task[id].priority=priority; 0269 E603 ldab 3,x 026B 87 clra 026C B7C6 xgdy 026E CC0018 ldd #24 0271 1813 emuls 0273 C30010 addd #_task+2 0276 B7C6 xgdy 0278 E607 ldab 7,x 027A 6B40 stab 0,y 027C ; return 0; 027C CC0000 ldd #0 027F L69: 027F B757 tfr x,s 0281 30 pulx 0282 1B82 leas 2,sp 0284 .dbline 0 ; func end 0284 3D rts .area bss 0000 _resource:: 0000 .blkb 14 000E _task:: 000E .blkb 72 0056 _system_tick:: 0056 .blkb 4 005A _current:: 005A .blkb 2