.module shell.c .area text ; ?temp -> -37,x ; j -> -36,x ; cmd -> -35,x ; command -> -33,x ; i -> -1,x 0000 _shell:: 0000 34 pshx 0001 B775 tfr s,x 0003 1BF1D6 leas -42,sp 0006 ; // shell.c 0006 ; 0006 ; 0006 ; #include <912d60.h> 0006 ; #include 0006 ; #include 0006 ; #include "kernel.h" 0006 ; #include "semlib.h" 0006 ; 0006 ; 0006 ; 0006 ; 0006 ; // FUNCTION PROTOTYPES 0006 ; void shellcmd_tcb(void); 0006 ; void shellcmd_rcb(void); 0006 ; void shellcmd_ticks(void); 0006 ; void shellcmd_start_task(unsigned char id); 0006 ; 0006 ; /*void shellcmd_stop_task(unsigned char id); 0006 ; void shellcmd_set_task_priority(unsigned char id, unsigned char priority); 0006 ; void shellcmd_quit_shell(void);*/ 0006 ; 0006 ; 0006 ; 0006 ; 0006 ; // GLOBAL VARIABLES 0006 ; extern unsigned long int system_tick; 0006 ; extern unsigned int current; // current task id number 0006 ; 0006 ; 0006 ; 0006 ; 0006 ; 0006 ; void shell(void) { 0006 ; 0006 ; // LOCAL VARIABLES 0006 ; char command[32], i, j; 0006 ; int cmd; 0006 ; 0006 ; 0006 ; 0006 ; // INITIALIZE 0006 ; sem_get(COM1); // get comm port 1 semaphore 0006 CC0000 ldd #0 0009 160000 jsr _sem_get 000C ; INTR_ON(); // enable interrupts 000C 10EF cli 000E 000E 18200121 lbra L5 0012 L4: 0012 ; 0012 ; 0012 ; 0012 ; // COMMAND SHELL 0012 ; while (1) { 0012 ; 0012 ; i = 0; 0012 691F clr -1,x 0014 ; 0014 ; // put a prompt 0014 ; putchar('>'); putchar('>'); putchar(' '); 0014 CC003E ldd #62 0017 160000 jsr _putchar 001A CC003E ldd #62 001D 160000 jsr _putchar 0020 CC0020 ldd #32 0023 160000 jsr _putchar 0026 2056 bra L8 0028 L7: 0028 ; 0028 ; 0028 ; // get and echo a command 0028 ; while (((command[i]=getchar()) != 0xD) && (i<7)) { 0028 ; putchar(command[i]); 0028 19E1DF leay -33,x 002B 6DE1D8 sty -40,x 002E E61F ldab -1,x 0030 87 clra 0031 E3E1D8 addd -40,x 0034 B7C6 xgdy 0036 E640 ldab 0,y 0038 87 clra 0039 160000 jsr _putchar 003C ; 003C ; if (command[i] == 8) { 003C 19E1DF leay -33,x 003F 6DE1D8 sty -40,x 0042 E61F ldab -1,x 0044 87 clra 0045 E3E1D8 addd -40,x 0048 B7C6 xgdy 004A E640 ldab 0,y 004C C108 cmpb #8 004E 2626 bne L10 0050 ; putchar(32); // space 0050 CC0020 ldd #32 0053 160000 jsr _putchar 0056 ; putchar(8); // backspace 0056 CC0008 ldd #8 0059 160000 jsr _putchar 005C ; command[i] = '\0'; // null 005C 19E1DF leay -33,x 005F 6DE1D8 sty -40,x 0062 E61F ldab -1,x 0064 87 clra 0065 E3E1D8 addd -40,x 0068 B7C6 xgdy 006A 6940 clr 0,y 006C ; i--; 006C E61F ldab -1,x 006E 87 clra 006F 830001 subd #1 0072 6B1F stab -1,x 0074 ; } else 0074 2008 bra L11 0076 L10: 0076 ; i++; 0076 E61F ldab -1,x 0078 87 clra 0079 C30001 addd #1 007C 6B1F stab -1,x 007E L11: 007E L8: 007E 160000 jsr _getchar 0081 6BE1DB stab -37,x 0084 19E1DF leay -33,x 0087 6DE1D8 sty -40,x 008A E61F ldab -1,x 008C 87 clra 008D E3E1D8 addd -40,x 0090 B7C6 xgdy 0092 E6E1DB ldab -37,x 0095 6B40 stab 0,y 0097 E6E1DB ldab -37,x 009A C10D cmpb #13 009C 2708 beq L12 009E E61F ldab -1,x 00A0 C107 cmpb #7 00A2 1825FF82 lblo L7 00A6 L12: 00A6 ; } 00A6 ; command[i] = '\0'; 00A6 19E1DF leay -33,x 00A9 6DE1D8 sty -40,x 00AC E61F ldab -1,x 00AE 87 clra 00AF E3E1D8 addd -40,x 00B2 B7C6 xgdy 00B4 6940 clr 0,y 00B6 ; putchar('\n'); 00B6 CC000A ldd #10 00B9 160000 jsr _putchar 00BC ; 00BC ; 00BC ; 00BC ; // determine/execute the command 00BC ; if (command[0] == 0xD) // CR 00BC E6E1DF ldab -33,x 00BF C10D cmpb #13 00C1 2608 bne L13 00C3 ; cmd = 0; 00C3 CC0000 ldd #0 00C6 6CE1DD std -35,x 00C9 2062 bra L14 00CB L13: 00CB ; else if (strcmp(command, "tcb") == 0) 00CB CC0295 ldd #L17 00CE 6C80 std 0,sp 00D0 19E1DF leay -33,x 00D3 B7C6 xgdy 00D5 160000 jsr _strcmp 00D8 8C0000 cpd #0 00DB 2605 bne L15 00DD ; shellcmd_tcb(); 00DD 160143 jsr _shellcmd_tcb 00E0 204B bra L16 00E2 L15: 00E2 ; else if (strcmp(command, "ticks") == 0) 00E2 CC028F ldd #L20 00E5 6C80 std 0,sp 00E7 19E1DF leay -33,x 00EA B7C6 xgdy 00EC 160000 jsr _strcmp 00EF 8C0000 cpd #0 00F2 2605 bne L18 00F4 ; shellcmd_ticks(); 00F4 16019B jsr _shellcmd_ticks 00F7 2034 bra L19 00F9 L18: 00F9 ; else if (strcmp(command, "start") == 0) 00F9 CC0289 ldd #L23 00FC 6C80 std 0,sp 00FE 19E1DF leay -33,x 0101 B7C6 xgdy 0103 160000 jsr _strcmp 0106 8C0000 cpd #0 0109 2608 bne L21 010B ; shellcmd_start_task(2); 010B CC0002 ldd #2 010E 1601C9 jsr _shellcmd_start_task 0111 201A bra L22 0113 L21: 0113 ; else if (strcmp(command, "") == 0); 0113 CC0288 ldd #L26 0116 6C80 std 0,sp 0118 19E1DF leay -33,x 011B B7C6 xgdy 011D 160000 jsr _strcmp 0120 8C0000 cpd #0 0123 2602 bne L24 0125 2006 bra L25 0127 L24: 0127 ; else 0127 ; puts("syntax error"); putchar('\n'); 0127 CC027B ldd #L27 012A 160000 jsr _puts 012D L25: 012D L22: 012D L19: 012D L16: 012D L14: 012D CC000A ldd #10 0130 160000 jsr _putchar 0133 L5: 0133 1820FEDB lbra L4 0137 X0: 0137 ; 0137 ; 0137 ; } // end while(1) 0137 ; 0137 ; INTR_OFF(); 0137 1410 sei 0139 0139 ; sem_give(COM1); 0139 CC0000 ldd #0 013C 160000 jsr _sem_give 013F ; 013F ; } 013F L3: 013F B757 tfr x,s 0141 30 pulx 0142 .dbline 0 ; func end 0142 3D rts 0143 ; id -> -2,x 0143 _shellcmd_tcb:: 0143 34 pshx 0144 B775 tfr s,x 0146 1B96 leas -10,sp 0148 ; 0148 ; 0148 ; 0148 ; 0148 ; void shellcmd_tcb(void) { 0148 CC0000 ldd #0 014B 6C1E std -2,x 014D L29: 014D CC025A ldd #L33 0150 160000 jsr _puts 0153 1410 sei 0155 0155 EC1E ldd -2,x 0157 87 clra 0158 160000 jsr _get_task_state 015B 6C1C std -4,x 015D EC1E ldd -2,x 015F 87 clra 0160 160000 jsr _get_task_priority 0163 87 clra 0164 6C84 std 4,sp 0166 EC1C ldd -4,x 0168 87 clra 0169 6C82 std 2,sp 016B 18021E80 movw -2,x,0,sp 016F CC0237 ldd #L34 0172 160000 jsr _printf 0175 L30: 0175 ; 0175 ; // LOCAL VARIABLES 0175 ; int id; 0175 ; 0175 ; 0175 ; for (id=0; id<3; id++) { 0175 EC1E ldd -2,x 0177 C30001 addd #1 017A 6C1E std -2,x 017C EC1E ldd -2,x 017E 8C0003 cpd #3 0181 2DCA blt L29 0183 ; puts ("----------+----------+---------+"); 0183 ; 0183 ; /* this takes a while, so treat as a critical section in order 0183 ; to get reliable data */ 0183 ; INTR_OFF(); 0183 ; 0183 ; printf("TaskID: %d | State: %d | Prio: %d\n", id, 0183 ; get_task_state(id), 0183 ; get_task_priority(id)); 0183 ; } // end for loop 0183 ; 0183 ; // finished with critical section 0183 ; INTR_ON(); 0183 10EF cli 0185 0185 ; 0185 ; puts ("----------+----------+---------+"); 0185 CC025A ldd #L33 0188 160000 jsr _puts 018B ; puts("Idle=0, Pending=1, Running=2, Waiting=3, Finished=4"); 018B CC0203 ldd #L35 018E 160000 jsr _puts 0191 ; putchar('\n'); 0191 CC000A ldd #10 0194 160000 jsr _putchar 0197 ; 0197 ; 0197 ; } 0197 L28: 0197 B757 tfr x,s 0199 30 pulx 019A .dbline 0 ; func end 019A 3D rts 019B ; lreg1 -> -4,x 019B ; lreg2 -> -8,x 019B _shellcmd_ticks:: 019B 34 pshx 019C B775 tfr s,x 019E 1B94 leas -12,sp 01A0 ; 01A0 ; 01A0 ; 01A0 ; 01A0 ; void shellcmd_ticks(void) { 01A0 ; 01A0 ; INTR_OFF(); 01A0 1410 sei 01A2 01A2 ; printf("Ticks: %ld\n", system_tick); 01A2 CD0000 ldy #_system_tick 01A5 1802401C movw 0,y,-4,x 01A9 1802421E movw 2,y,-2,x 01AD 1980 leay 0,sp 01AF 18021C40 movw -4,x,0,y 01B3 18021E42 movw -2,x,2,y 01B7 CC01F7 ldd #L37 01BA 160000 jsr _printf 01BD ; INTR_ON(); 01BD 10EF cli 01BF 01BF ; putchar('\n'); 01BF CC000A ldd #10 01C2 160000 jsr _putchar 01C5 ; } 01C5 L36: 01C5 B757 tfr x,s 01C7 30 pulx 01C8 .dbline 0 ; func end 01C8 3D rts 01C9 ; id -> 3,x 01C9 _shellcmd_start_task:: 01C9 3B pshd 01CA 34 pshx 01CB B775 tfr s,x 01CD 1B9E leas -2,sp 01CF ; 01CF ; 01CF ; 01CF ; 01CF ; void shellcmd_start_task(unsigned char id) { 01CF ; 01CF ; INTR_OFF(); 01CF 1410 sei 01D1 01D1 ; set_task_state(id, 1); 01D1 CC0001 ldd #1 01D4 6C80 std 0,sp 01D6 E603 ldab 3,x 01D8 87 clra 01D9 160000 jsr _set_task_state 01DC ; INTR_ON(); 01DC 10EF cli 01DE 01DE ; puts("task started"); 01DE CC01EA ldd #L39 01E1 160000 jsr _puts 01E4 ; } 01E4 L38: 01E4 B757 tfr x,s 01E6 30 pulx 01E7 1B82 leas 2,sp 01E9 .dbline 0 ; func end 01E9 3D rts 01EA L39: 01EA 7461736B207374617274656400 .byte 't,'a,'s,'k,32,'s,'t,'a,'r,'t,'e,'d,0 01F7 L37: 01F7 5469636B733A20256C640A00 .byte 'T,'i,'c,'k,'s,58,32,37,'l,'d,10,0 0203 L35: 0203 49646C653D302C2050656E64696E673D .byte 'I,'d,'l,'e,61,48,44,32,'P,'e,'n,'d,'i,'n,'g,61 0213 312C2052756E6E696E673D322C205761 .byte 49,44,32,'R,'u,'n,'n,'i,'n,'g,61,50,44,32,'W,'a 0223 6974696E673D332C2046696E69736865 .byte 'i,'t,'i,'n,'g,61,51,44,32,'F,'i,'n,'i,'s,'h,'e 0233 643D3400 .byte 'd,61,52,0 0237 L34: 0237 5461736B49443A202564207C20537461 .byte 'T,'a,'s,'k,'I,'D,58,32,37,'d,32,124,32,'S,'t,'a 0247 74653A202564207C205072696F3A2025 .byte 't,'e,58,32,37,'d,32,124,32,'P,'r,'i,'o,58,32,37 0257 640A00 .byte 'd,10,0 025A L33: 025A 2D2D2D2D2D2D2D2D2D2D2B2D2D2D2D2D .byte 45,45,45,45,45,45,45,45,45,45,43,45,45,45,45,45 026A 2D2D2D2D2D2B2D2D2D2D2D2D2D2D2D2B .byte 45,45,45,45,45,43,45,45,45,45,45,45,45,45,45,43 027A 00 .byte 0 027B L27: 027B 73796E746178206572726F7200 .byte 's,'y,'n,'t,'a,'x,32,'e,'r,'r,'o,'r,0 0288 L26: 0288 00 .byte 0 0289 L23: 0289 737461727400 .byte 's,'t,'a,'r,'t,0 028F L20: 028F 7469636B7300 .byte 't,'i,'c,'k,'s,0 0295 L17: 0295 74636200 .byte 't,'c,'b,0