.module shell.c .area text ; ?temp -> -49,x ; ?temp -> -47,x ; cmd_length -> -46,x ; cmd -> -44,x ; argc -> -43,x ; argv -> -41,x ; cursor1 -> -39,x ; j -> -37,x ; cursor2 -> -36,x ; command -> -34,x ; i -> -1,x 0000 _shell:: 0000 34 pshx 0001 B775 tfr s,x 0003 1BF1C4 leas -60,sp 0006 ; // shell.c 0006 ; 0006 ; 0006 ; #include <912d60.h> 0006 ; #include 0006 ; #include 0006 ; #include 0006 ; #include 0006 ; #include "kernel.h" 0006 ; #include "semlib.h" 0006 ; 0006 ; 0006 ; 0006 ; 0006 ; // FUNCTION PROTOTYPES 0006 ; void shellcmd_help(char *argv1); 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 ; // LOCAL GLOBAL VARIABLES (context is this file only) 0006 ; extern char error_msg[6][25]; 0006 ; 0006 ; 0006 ; void shell(void) { 0006 ; 0006 ; // LOCAL CONSTANTS 0006 ; #define cmd_size (32+1) 0006 ; 0006 ; 0006 ; 0006 ; // LOCAL ENUMERATIONS 0006 ; enum command_type { help = 1, 0006 ; tcb, 0006 ; rcb, 0006 ; ticks, 0006 ; start, 0006 ; stop, 0006 ; priority, 0006 ; quit 0006 ; }; 0006 ; 0006 ; 0006 ; 0006 ; // LOCAL VARIABLES 0006 ; char command[cmd_size], i, j, **argv, *cursor1, *cursor2; 0006 ; int cmd_length, argc; 0006 ; enum command_type cmd; 0006 ; 0006 ; 0006 ; 0006 ; 0006 ; // INITIALIZE SHELL 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 18200445 lbra L5 0012 L4: 0012 ; 0012 ; 0012 ; 0012 ; // SHELL COMMAND LINE INTERPRETER 0012 ; while (1) { 0012 ; 0012 ; i = 0; 0012 691F clr -1,x 0014 ; cursor1 = command; 0014 19E1DE leay -34,x 0017 6DE1D9 sty -39,x 001A ; cursor2 = command; 001A 19E1DE leay -34,x 001D 6DE1DC sty -36,x 0020 ; 0020 ; 0020 ; // put a PROMPT 0020 ; putchar('>'); putchar('>'); putchar(' '); 0020 CC003E ldd #62 0023 160000 jsr _putchar 0026 CC003E ldd #62 0029 160000 jsr _putchar 002C CC0020 ldd #32 002F 160000 jsr _putchar 0032 2056 bra L8 0034 L7: 0034 ; 0034 ; 0034 ; // GET AND ECHO THE COMMAND on the console 0034 ; while (((command[i]=getchar()) != 0xD) && (i -- required arguments"); 034F CC076C ldd #L71 0352 160000 jsr _puts 0355 ; puts("[] -- optional arguments\n"); 0355 CC0752 ldd #L72 0358 160000 jsr _puts 035B ; puts("help [cmd] -- help on a specific command"); 035B CC0729 ldd #L73 035E 160000 jsr _puts 0361 ; puts("tcb [task_id] -- prints task control block"); 0361 CC06FE ldd #L74 0364 160000 jsr _puts 0367 ; puts("rcb [task_id] -- prints resource control block"); 0367 CC06CF ldd #L75 036A 160000 jsr _puts 036D ; puts("ticks -- shows system tick"); 036D CC06B4 ldd #L76 0370 160000 jsr _puts 0373 ; puts("start -- start a task"); 0373 CC0694 ldd #L77 0376 160000 jsr _puts 0379 ; puts("stop -- stop a task"); 0379 CC0675 ldd #L78 037C 160000 jsr _puts 037F ; puts("priority , -- change prio"); 037F CC0641 ldd #L79 0382 160000 jsr _puts 0385 ; puts("quit -- quit the shell (carefull!)"); 0385 CC061E ldd #L80 0388 160000 jsr _puts 038B ; putchar('\n'); 038B CC000A ldd #10 038E 160000 jsr _putchar 0391 ; } 0391 18200094 lbra L65 0395 L68: 0395 ; else if (argc == 2) 0395 ECE1D5 ldd -43,x 0398 8C0002 cpd #2 039B 1826008A lbne L65 039F ; shellcmd_help(argv[1]); 039F EDE1D7 ldy -41,x 03A2 EC42 ldd 2,y 03A4 160467 jsr _shellcmd_help 03A7 ; break; 03A7 1820007E lbra L65 03AB L83: 03AB ; case tcb: 03AB ; if (argc == 1) 03AB ECE1D5 ldd -43,x 03AE 8C0001 cpd #1 03B1 2605 bne L84 03B3 ; shellcmd_tcb(); 03B3 16046E jsr _shellcmd_tcb 03B6 2071 bra L65 03B8 L84: 03B8 ; else if (argc > 1) 03B8 ECE1D5 ldd -43,x 03BB 8C0001 cpd #1 03BE 2F69 ble L65 03C0 ; puts(error_msg[0]); 03C0 CC0000 ldd #_error_msg 03C3 160000 jsr _puts 03C6 ; break; 03C6 2061 bra L65 03C8 L88: 03C8 ; case rcb: 03C8 ; puts(error_msg[0]); 03C8 CC0000 ldd #_error_msg 03CB 160000 jsr _puts 03CE ; break; 03CE 2059 bra L65 03D0 L89: 03D0 ; case ticks: 03D0 ; if (argc > 1) 03D0 ECE1D5 ldd -43,x 03D3 8C0001 cpd #1 03D6 2F08 ble L90 03D8 ; puts(error_msg[1]); 03D8 CC0019 ldd #_error_msg+25 03DB 160000 jsr _puts 03DE 2049 bra L65 03E0 L90: 03E0 ; else 03E0 ; shellcmd_ticks(); 03E0 1604CC jsr _shellcmd_ticks 03E3 ; break; 03E3 2044 bra L65 03E5 L93: 03E5 ; case start: 03E5 ; if ((argc != 2) || 03E5 ECE1D5 ldd -43,x 03E8 8C0002 cpd #2 03EB 2610 bne L96 03ED EDE1D7 ldy -41,x 03F0 ED42 ldy 2,y 03F2 E640 ldab 0,y 03F4 87 clra 03F5 160000 jsr _isdigit 03F8 8C0000 cpd #0 03FB 2608 bne L94 03FD L96: 03FD ; (!isdigit(*argv[1]))) 03FD ; puts(error_msg[1]); 03FD CC0019 ldd #_error_msg+25 0400 160000 jsr _puts 0403 2024 bra L65 0405 L94: 0405 ; else 0405 ; shellcmd_start_task(atoi(argv[1])); 0405 EDE1D7 ldy -41,x 0408 EC42 ldd 2,y 040A 160000 jsr _atoi 040D 87 clra 040E 1604F4 jsr _shellcmd_start_task 0411 ; break; 0411 2016 bra L65 0413 L98: 0413 ; case stop: 0413 ; puts(error_msg[0]); 0413 CC0000 ldd #_error_msg 0416 160000 jsr _puts 0419 ; break; 0419 200E bra L65 041B L99: 041B ; case priority: 041B ; puts(error_msg[0]); 041B CC0000 ldd #_error_msg 041E 160000 jsr _puts 0421 ; break; 0421 2006 bra L65 0423 L100: 0423 ; case quit: 0423 ; puts(error_msg[0]); 0423 CC0000 ldd #_error_msg 0426 160000 jsr _puts 0429 ; break; 0429 ; default: 0429 ; break; 0429 L65: 0429 ; 0429 ; }} // end switch/if 0429 L62: 0429 ; 0429 ; 0429 ; 0429 ; // free the argc and argv array memory 0429 ; for (i=0; i 2,x 0467 _shellcmd_help:: 0467 ; 0467 ; 0467 ; 0467 ; 0467 ; void shellcmd_help(char *argv1) { 0467 ; 0467 ; puts(error_msg[0]); 0467 CC0000 ldd #_error_msg 046A 160000 jsr _puts 046D ; } 046D L105: 046D .dbline 0 ; func end 046D 3D rts 046E ; id -> -2,x 046E _shellcmd_tcb:: 046E 34 pshx 046F B775 tfr s,x 0471 1B92 leas -14,sp 0473 ; 0473 ; 0473 ; 0473 ; void shellcmd_tcb(void) { 0473 CC0000 ldd #0 0476 6C1E std -2,x 0478 L107: 0478 CC05ED ldd #L111 047B 160000 jsr _puts 047E EC1E ldd -2,x 0480 87 clra 0481 160000 jsr _get_task_state 0484 6C1C std -4,x 0486 EC1E ldd -2,x 0488 87 clra 0489 160000 jsr _get_task_priority 048C 6C1A std -6,x 048E EC1E ldd -2,x 0490 87 clra 0491 160000 jsr _get_task_messages 0494 6C86 std 6,sp 0496 ED1A ldy -6,x 0498 6D84 sty 4,sp 049A ED1C ldy -4,x 049C 6D82 sty 2,sp 049E 18021E80 movw -2,x,0,sp 04A2 CC05B8 ldd #L112 04A5 160000 jsr _printf 04A8 L108: 04A8 ; 04A8 ; // LOCAL VARIABLES 04A8 ; int id; 04A8 ; 04A8 ; 04A8 ; /* ??this takes a while, so treat the printf() as a critical section 04A8 ; in order to get reliable data */ 04A8 ; 04A8 ; 04A8 ; for (id=0; id -4,x 04CC ; lreg2 -> -8,x 04CC _shellcmd_ticks:: 04CC 34 pshx 04CD B775 tfr s,x 04CF 1B94 leas -12,sp 04D1 ; 04D1 ; 04D1 ; 04D1 ; 04D1 ; void shellcmd_ticks(void) { 04D1 ; 04D1 ; INTR_OFF(); 04D1 1410 sei 04D3 04D3 ; printf("Ticks: %ld\n", system_tick); 04D3 CD0000 ldy #_system_tick 04D6 1802401C movw 0,y,-4,x 04DA 1802421E movw 2,y,-2,x 04DE 1980 leay 0,sp 04E0 18021C40 movw -4,x,0,y 04E4 18021E42 movw -2,x,2,y 04E8 CC052C ldd #L116 04EB 160000 jsr _printf 04EE ; INTR_ON(); 04EE 10EF cli 04F0 04F0 ; } 04F0 L115: 04F0 B757 tfr x,s 04F2 30 pulx 04F3 .dbline 0 ; func end 04F3 3D rts 04F4 ; id -> 3,x 04F4 _shellcmd_start_task:: 04F4 3B pshd 04F5 34 pshx 04F6 B775 tfr s,x 04F8 1B9E leas -2,sp 04FA ; 04FA ; 04FA ; 04FA ; 04FA ; void shellcmd_start_task(unsigned char id) { 04FA ; 04FA ; if (set_task_state(id, pending) == 0) 04FA CC0001 ldd #1 04FD 6C80 std 0,sp 04FF E603 ldab 3,x 0501 87 clra 0502 160000 jsr _set_task_state 0505 8C0000 cpd #0 0508 260B bne L118 050A ; printf("task %d started\n", id); 050A E603 ldab 3,x 050C 87 clra 050D 6C80 std 0,sp 050F CC051B ldd #L120 0512 160000 jsr _printf 0515 L118: 0515 ; } 0515 L117: 0515 B757 tfr x,s 0517 30 pulx 0518 1B82 leas 2,sp 051A .dbline 0 ; func end 051A 3D rts 051B L120: 051B 7461736B20256420737461727465640A .byte 't,'a,'s,'k,32,37,'d,32,'s,'t,'a,'r,'t,'e,'d,10 052B 00 .byte 0 052C L116: 052C 5469636B733A20256C640A00 .byte 'T,'i,'c,'k,'s,58,32,37,'l,'d,10,0 0538 L114: 0538 4D6573736167653A205B206269743720 .byte 'M,'e,'s,'s,'a,'g,'e,58,32,91,32,'b,'i,'t,55,32 0548 7C2062697436207C2062697435207C20 .byte 124,32,'b,'i,'t,54,32,124,32,'b,'i,'t,53,32,124,32 0558 62697434207C2062697433207C206269 .byte 'b,'i,'t,52,32,124,32,'b,'i,'t,51,32,124,32,'b,'i 0568 7432207C207072696F207C2073746174 .byte 't,50,32,124,32,'p,'r,'i,'o,32,124,32,'s,'t,'a,'t 0578 65205D00 .byte 'e,32,93,0 057C L113: 057C 0A53746174653A20303D69646C652C20 .byte 10,'S,'t,'a,'t,'e,58,32,48,61,'i,'d,'l,'e,44,32 058C 313D70656E64696E672C20323D72756E .byte 49,61,'p,'e,'n,'d,'i,'n,'g,44,32,50,61,'r,'u,'n 059C 6E696E672C20333D77616974696E672C .byte 'n,'i,'n,'g,44,32,51,61,'w,'a,'i,'t,'i,'n,'g,44 05AC 20343D66696E697368656400 .byte 32,52,61,'f,'i,'n,'i,'s,'h,'e,'d,0 05B8 L112: 05B8 5461736B49443A20253264207C205374 .byte 'T,'a,'s,'k,'I,'D,58,32,37,50,'d,32,124,32,'S,'t 05C8 6174653A202564207C205072696F3A20 .byte 'a,'t,'e,58,32,37,'d,32,124,32,'P,'r,'i,'o,58,32 05D8 253364207C204D7367733A2030783025 .byte 37,51,'d,32,124,32,'M,'s,'g,'s,58,32,48,'x,48,37 05E8 78207C0A00 .byte 'x,32,124,10,0 05ED L111: 05ED 2D2D2D2D2D2D2D2D2D2D2D2B2D2D2D2D .byte 45,45,45,45,45,45,45,45,45,45,45,43,45,45,45,45 05FD 2D2D2D2D2D2D2B2D2D2D2D2D2D2D2D2D .byte 45,45,45,45,45,45,43,45,45,45,45,45,45,45,45,45 060D 2D2D2B2D2D2D2D2D2D2D2D2D2D2D2D2B .byte 45,45,43,45,45,45,45,45,45,45,45,45,45,45,45,43 061D 00 .byte 0 061E L80: 061E 71756974202D2D207175697420746865 .byte 'q,'u,'i,'t,32,45,45,32,'q,'u,'i,'t,32,'t,'h,'e 062E 207368656C6C20286361726566756C6C .byte 32,'s,'h,'e,'l,'l,32,40,'c,'a,'r,'e,'f,'u,'l,'l 063E 212900 .byte 33,41,0 0641 L79: 0641 7072696F72697479203C7461736B5F69 .byte 'p,'r,'i,'o,'r,'i,'t,'y,32,60,'t,'a,'s,'k,95,'i 0651 643E2C203C7461736B5F7072696F7269 .byte 'd,62,44,32,60,'t,'a,'s,'k,95,'p,'r,'i,'o,'r,'i 0661 74793E20202D2D206368616E67652070 .byte 't,'y,62,32,32,45,45,32,'c,'h,'a,'n,'g,'e,32,'p 0671 72696F00 .byte 'r,'i,'o,0 0675 L78: 0675 73746F70203C7461736B5F69643E2020 .byte 's,'t,'o,'p,32,60,'t,'a,'s,'k,95,'i,'d,62,32,32 0685 2D2D2073746F702061207461736B00 .byte 45,45,32,'s,'t,'o,'p,32,'a,32,'t,'a,'s,'k,0 0694 L77: 0694 7374617274203C7461736B5F69643E20 .byte 's,'t,'a,'r,'t,32,60,'t,'a,'s,'k,95,'i,'d,62,32 06A4 2D2D2073746172742061207461736B00 .byte 45,45,32,'s,'t,'a,'r,'t,32,'a,32,'t,'a,'s,'k,0 06B4 L76: 06B4 7469636B73202D2D2073686F77732073 .byte 't,'i,'c,'k,'s,32,45,45,32,'s,'h,'o,'w,'s,32,'s 06C4 797374656D207469636B00 .byte 'y,'s,'t,'e,'m,32,'t,'i,'c,'k,0 06CF L75: 06CF 726362205B7461736B5F69645D202D2D .byte 'r,'c,'b,32,91,'t,'a,'s,'k,95,'i,'d,93,32,45,45 06DF 207072696E7473207265736F75726365 .byte 32,'p,'r,'i,'n,'t,'s,32,'r,'e,'s,'o,'u,'r,'c,'e 06EF 20636F6E74726F6C20626C6F636B00 .byte 32,'c,'o,'n,'t,'r,'o,'l,32,'b,'l,'o,'c,'k,0 06FE L74: 06FE 746362205B7461736B5F69645D202D2D .byte 't,'c,'b,32,91,'t,'a,'s,'k,95,'i,'d,93,32,45,45 070E 207072696E7473207461736B20636F6E .byte 32,'p,'r,'i,'n,'t,'s,32,'t,'a,'s,'k,32,'c,'o,'n 071E 74726F6C20626C6F636B00 .byte 't,'r,'o,'l,32,'b,'l,'o,'c,'k,0 0729 L73: 0729 68656C70205B636D645D202D2D206865 .byte 'h,'e,'l,'p,32,91,'c,'m,'d,93,32,45,45,32,'h,'e 0739 6C70206F6E2061207370656369666963 .byte 'l,'p,32,'o,'n,32,'a,32,'s,'p,'e,'c,'i,'f,'i,'c 0749 20636F6D6D616E6400 .byte 32,'c,'o,'m,'m,'a,'n,'d,0 0752 L72: 0752 5B5D202D2D206F7074696F6E616C2061 .byte 91,93,32,45,45,32,'o,'p,'t,'i,'o,'n,'a,'l,32,'a 0762 7267756D656E74730A00 .byte 'r,'g,'u,'m,'e,'n,'t,'s,10,0 076C L71: 076C 3C3E202D2D2072657175697265642061 .byte 60,62,32,45,45,32,'r,'e,'q,'u,'i,'r,'e,'d,32,'a 077C 7267756D656E747300 .byte 'r,'g,'u,'m,'e,'n,'t,'s,0 0785 L70: 0785 2D2D2D48454C502D2D2D0A00 .byte 45,45,45,'H,'E,'L,'P,45,45,45,10,0 0791 L60: 0791 00 .byte 0 0792 L57: 0792 7175697400 .byte 'q,'u,'i,'t,0 0797 L54: 0797 7072696F7269747900 .byte 'p,'r,'i,'o,'r,'i,'t,'y,0 07A0 L51: 07A0 73746F7000 .byte 's,'t,'o,'p,0 07A5 L48: 07A5 737461727400 .byte 's,'t,'a,'r,'t,0 07AB L45: 07AB 7469636B7300 .byte 't,'i,'c,'k,'s,0 07B1 L42: 07B1 72636200 .byte 'r,'c,'b,0 07B5 L39: 07B5 74636200 .byte 't,'c,'b,0 07B9 L36: 07B9 68656C7000 .byte 'h,'e,'l,'p,0