.module shell.c .area data 0000 _error: 0000 .blkb 21 .area idata 0000 7368656C6C3A206F7574206F66206D65 .byte 's,'h,'e,'l,'l,58,32,'o,'u,'t,32,'o,'f,32,'m,'e 0010 6D6F727900 .byte 'm,'o,'r,'y,0 .area data 0015 .blkb 20 .area idata 0015 7368656C6C3A2073796E746178206572 .byte 's,'h,'e,'l,'l,58,32,'s,'y,'n,'t,'a,'x,32,'e,'r 0025 726F7200 .byte 'r,'o,'r,0 .area data 0029 .blkb 1 .area idata 0029 00 .byte 0 .area data 002A .blkb 20 .area idata 002A 7368656C6C3A20333220636861727320 .byte 's,'h,'e,'l,'l,58,32,51,50,32,'c,'h,'a,'r,'s,32 003A 6D617800 .byte 'm,'a,'x,0 .area data 003E .blkb 1 .area idata 003E 00 .byte 0 .area data 003F .blkb 21 .area idata 003F 7368656C6C3A20756E696D706C696D65 .byte 's,'h,'e,'l,'l,58,32,'u,'n,'i,'m,'p,'l,'i,'m,'e 004F 6E74656400 .byte 'n,'t,'e,'d,0 .area data .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 ; static char error[4][21] = {"shell: out of memory", // error[0] 0006 ; "shell: syntax error", // error[1] 0006 ; "shell: 32 chars max", // error[2] 0006 ; "shell: unimplimented" // error[3] 0006 ; }; 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 CC06F1 ldd #L69 0352 160000 jsr _puts 0355 ; puts("[] -- optional arguments\n"); 0355 CC06D7 ldd #L70 0358 160000 jsr _puts 035B ; puts("help [cmd] -- help on a specific command"); 035B CC06AE ldd #L71 035E 160000 jsr _puts 0361 ; puts("tcb [task_id] -- prints task control block"); 0361 CC0683 ldd #L72 0364 160000 jsr _puts 0367 ; puts("rcb [task_id] -- prints resource control block"); 0367 CC0654 ldd #L73 036A 160000 jsr _puts 036D ; puts("ticks -- shows system tick"); 036D CC0639 ldd #L74 0370 160000 jsr _puts 0373 ; puts("start -- start a task"); 0373 CC0619 ldd #L75 0376 160000 jsr _puts 0379 ; puts("stop -- stop a task"); 0379 CC05FA ldd #L76 037C 160000 jsr _puts 037F ; puts("priority -- change prio"); 037F CC05C8 ldd #L77 0382 160000 jsr _puts 0385 ; puts("quit -- quit the shell (carefull!)"); 0385 CC05A5 ldd #L78 0388 160000 jsr _puts 038B ; putchar('\n'); 038B CC000A ldd #10 038E 160000 jsr _putchar 0391 ; } 0391 18200094 lbra L63 0395 L66: 0395 ; else if (argc == 2) 0395 ECE1D5 ldd -43,x 0398 8C0002 cpd #2 039B 1826008A lbne L63 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 L63 03AB L81: 03AB ; case tcb: 03AB ; if (argc == 1) 03AB ECE1D5 ldd -43,x 03AE 8C0001 cpd #1 03B1 2605 bne L82 03B3 ; shellcmd_tcb(); 03B3 16046E jsr _shellcmd_tcb 03B6 2071 bra L63 03B8 L82: 03B8 ; else if (argc > 1) 03B8 ECE1D5 ldd -43,x 03BB 8C0001 cpd #1 03BE 2F69 ble L63 03C0 ; puts(error[3]); 03C0 CC003F ldd #_error+63 03C3 160000 jsr _puts 03C6 ; break; 03C6 2061 bra L63 03C8 L87: 03C8 ; case rcb: 03C8 ; puts(error[3]); 03C8 CC003F ldd #_error+63 03CB 160000 jsr _puts 03CE ; break; 03CE 2059 bra L63 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[1]); 03D8 CC0015 ldd #_error+21 03DB 160000 jsr _puts 03DE 2049 bra L63 03E0 L90: 03E0 ; else 03E0 ; shellcmd_ticks(); 03E0 1604C0 jsr _shellcmd_ticks 03E3 ; break; 03E3 2044 bra L63 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[1]); 03FD CC0015 ldd #_error+21 0400 160000 jsr _puts 0403 2024 bra L63 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 1604E8 jsr _shellcmd_start_task 0411 ; break; 0411 2016 bra L63 0413 L98: 0413 ; case stop: 0413 ; puts(error[3]); 0413 CC003F ldd #_error+63 0416 160000 jsr _puts 0419 ; break; 0419 200E bra L63 041B L100: 041B ; case priority: 041B ; puts(error[3]); 041B CC003F ldd #_error+63 041E 160000 jsr _puts 0421 ; break; 0421 2006 bra L63 0423 L102: 0423 ; case quit: 0423 ; puts(error[3]); 0423 CC003F ldd #_error+63 0426 160000 jsr _puts 0429 ; break; 0429 ; default: 0429 ; break; 0429 L63: 0429 ; }} 0429 L60: 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[3]); 0467 CC003F ldd #_error+63 046A 160000 jsr _puts 046D ; } 046D L108: 046D .dbline 0 ; func end 046D 3D rts 046E ; id -> -2,x 046E _shellcmd_tcb:: 046E 34 pshx 046F B775 tfr s,x 0471 1B96 leas -10,sp 0473 ; 0473 ; 0473 ; 0473 ; void shellcmd_tcb(void) { 0473 ; 0473 ; // LOCAL VARIABLES 0473 ; int id; 0473 ; 0473 ; 0473 ; /* this takes a while, so treat as a critical section in order 0473 ; to get reliable data */ 0473 ; INTR_OFF(); 0473 1410 sei 0475 0475 CC0000 ldd #0 0478 6C1E std -2,x 047A L111: 047A CC0583 ldd #L115 047D 160000 jsr _puts 0480 EC1E ldd -2,x 0482 87 clra 0483 160000 jsr _get_task_state 0486 6C1C std -4,x 0488 EC1E ldd -2,x 048A 87 clra 048B 160000 jsr _get_task_priority 048E 87 clra 048F 6C84 std 4,sp 0491 EC1C ldd -4,x 0493 87 clra 0494 6C82 std 2,sp 0496 18021E80 movw -2,x,0,sp 049A CC0560 ldd #L116 049D 160000 jsr _printf 04A0 L112: 04A0 ; 04A0 ; for (id=0; id -4,x 04C0 ; lreg2 -> -8,x 04C0 _shellcmd_ticks:: 04C0 34 pshx 04C1 B775 tfr s,x 04C3 1B94 leas -12,sp 04C5 ; 04C5 ; 04C5 ; 04C5 ; 04C5 ; void shellcmd_ticks(void) { 04C5 ; 04C5 ; INTR_OFF(); 04C5 1410 sei 04C7 04C7 ; printf("Ticks: %ld\n", system_tick); 04C7 CD0000 ldy #_system_tick 04CA 1802401C movw 0,y,-4,x 04CE 1802421E movw 2,y,-2,x 04D2 1980 leay 0,sp 04D4 18021C40 movw -4,x,0,y 04D8 18021E42 movw -2,x,2,y 04DC CC0520 ldd #L119 04DF 160000 jsr _printf 04E2 ; INTR_ON(); 04E2 10EF cli 04E4 04E4 ; } 04E4 L118: 04E4 B757 tfr x,s 04E6 30 pulx 04E7 .dbline 0 ; func end 04E7 3D rts 04E8 ; id -> 3,x 04E8 _shellcmd_start_task:: 04E8 3B pshd 04E9 34 pshx 04EA B775 tfr s,x 04EC 1B9E leas -2,sp 04EE ; 04EE ; 04EE ; 04EE ; 04EE ; void shellcmd_start_task(unsigned char id) { 04EE ; 04EE ; if (set_task_state(id, pending) == 0) 04EE CC0001 ldd #1 04F1 6C80 std 0,sp 04F3 E603 ldab 3,x 04F5 87 clra 04F6 160000 jsr _set_task_state 04F9 8C0000 cpd #0 04FC 260B bne L121 04FE ; printf("task %d started\n", id); 04FE E603 ldab 3,x 0500 87 clra 0501 6C80 std 0,sp 0503 CC050F ldd #L123 0506 160000 jsr _printf 0509 L121: 0509 ; } 0509 L120: 0509 B757 tfr x,s 050B 30 pulx 050C 1B82 leas 2,sp 050E .dbline 0 ; func end 050E 3D rts 050F L123: 050F 7461736B20256420737461727465640A .byte 't,'a,'s,'k,32,37,'d,32,'s,'t,'a,'r,'t,'e,'d,10 051F 00 .byte 0 0520 L119: 0520 5469636B733A20256C640A00 .byte 'T,'i,'c,'k,'s,58,32,37,'l,'d,10,0 052C L117: 052C 49646C653D302C2050656E64696E673D .byte 'I,'d,'l,'e,61,48,44,32,'P,'e,'n,'d,'i,'n,'g,61 053C 312C2052756E6E696E673D322C205761 .byte 49,44,32,'R,'u,'n,'n,'i,'n,'g,61,50,44,32,'W,'a 054C 6974696E673D332C2046696E69736865 .byte 'i,'t,'i,'n,'g,61,51,44,32,'F,'i,'n,'i,'s,'h,'e 055C 643D3400 .byte 'd,61,52,0 0560 L116: 0560 5461736B49443A202564207C20537461 .byte 'T,'a,'s,'k,'I,'D,58,32,37,'d,32,124,32,'S,'t,'a 0570 74653A202564207C205072696F3A2025 .byte 't,'e,58,32,37,'d,32,124,32,'P,'r,'i,'o,58,32,37 0580 640A00 .byte 'd,10,0 0583 L115: 0583 2D2D2D2D2D2D2D2D2D2D2B2D2D2D2D2D .byte 45,45,45,45,45,45,45,45,45,45,43,45,45,45,45,45 0593 2D2D2D2D2D2B2D2D2D2D2D2D2D2D2D2D .byte 45,45,45,45,45,43,45,45,45,45,45,45,45,45,45,45 05A3 2B00 .byte 43,0 05A5 L78: 05A5 71756974202D2D207175697420746865 .byte 'q,'u,'i,'t,32,45,45,32,'q,'u,'i,'t,32,'t,'h,'e 05B5 207368656C6C20286361726566756C6C .byte 32,'s,'h,'e,'l,'l,32,40,'c,'a,'r,'e,'f,'u,'l,'l 05C5 212900 .byte 33,41,0 05C8 L77: 05C8 7072696F72697479203C7461736B5F69 .byte 'p,'r,'i,'o,'r,'i,'t,'y,32,60,'t,'a,'s,'k,95,'i 05D8 642C207461736B5F7072696F72697479 .byte 'd,44,32,'t,'a,'s,'k,95,'p,'r,'i,'o,'r,'i,'t,'y 05E8 3E20202D2D206368616E676520707269 .byte 62,32,32,45,45,32,'c,'h,'a,'n,'g,'e,32,'p,'r,'i 05F8 6F00 .byte 'o,0 05FA L76: 05FA 73746F70203C7461736B5F69643E2020 .byte 's,'t,'o,'p,32,60,'t,'a,'s,'k,95,'i,'d,62,32,32 060A 2D2D2073746F702061207461736B00 .byte 45,45,32,'s,'t,'o,'p,32,'a,32,'t,'a,'s,'k,0 0619 L75: 0619 7374617274203C7461736B5F69643E20 .byte 's,'t,'a,'r,'t,32,60,'t,'a,'s,'k,95,'i,'d,62,32 0629 2D2D2073746172742061207461736B00 .byte 45,45,32,'s,'t,'a,'r,'t,32,'a,32,'t,'a,'s,'k,0 0639 L74: 0639 7469636B73202D2D2073686F77732073 .byte 't,'i,'c,'k,'s,32,45,45,32,'s,'h,'o,'w,'s,32,'s 0649 797374656D207469636B00 .byte 'y,'s,'t,'e,'m,32,'t,'i,'c,'k,0 0654 L73: 0654 726362205B7461736B5F69645D202D2D .byte 'r,'c,'b,32,91,'t,'a,'s,'k,95,'i,'d,93,32,45,45 0664 207072696E7473207265736F75726365 .byte 32,'p,'r,'i,'n,'t,'s,32,'r,'e,'s,'o,'u,'r,'c,'e 0674 20636F6E74726F6C20626C6F636B00 .byte 32,'c,'o,'n,'t,'r,'o,'l,32,'b,'l,'o,'c,'k,0 0683 L72: 0683 746362205B7461736B5F69645D202D2D .byte 't,'c,'b,32,91,'t,'a,'s,'k,95,'i,'d,93,32,45,45 0693 207072696E7473207461736B20636F6E .byte 32,'p,'r,'i,'n,'t,'s,32,'t,'a,'s,'k,32,'c,'o,'n 06A3 74726F6C20626C6F636B00 .byte 't,'r,'o,'l,32,'b,'l,'o,'c,'k,0 06AE L71: 06AE 68656C70205B636D645D202D2D206865 .byte 'h,'e,'l,'p,32,91,'c,'m,'d,93,32,45,45,32,'h,'e 06BE 6C70206F6E2061207370656369666963 .byte 'l,'p,32,'o,'n,32,'a,32,'s,'p,'e,'c,'i,'f,'i,'c 06CE 20636F6D6D616E6400 .byte 32,'c,'o,'m,'m,'a,'n,'d,0 06D7 L70: 06D7 5B5D202D2D206F7074696F6E616C2061 .byte 91,93,32,45,45,32,'o,'p,'t,'i,'o,'n,'a,'l,32,'a 06E7 7267756D656E74730A00 .byte 'r,'g,'u,'m,'e,'n,'t,'s,10,0 06F1 L69: 06F1 3C3E202D2D2072657175697265642061 .byte 60,62,32,45,45,32,'r,'e,'q,'u,'i,'r,'e,'d,32,'a 0701 7267756D656E747300 .byte 'r,'g,'u,'m,'e,'n,'t,'s,0 070A L68: 070A 2D2D2D48454C502D2D2D0A00 .byte 45,45,45,'H,'E,'L,'P,45,45,45,10,0 0716 L58: 0716 00 .byte 0 0717 L55: 0717 7175697400 .byte 'q,'u,'i,'t,0 071C L52: 071C 7072696F7269747900 .byte 'p,'r,'i,'o,'r,'i,'t,'y,0 0725 L49: 0725 73746F7000 .byte 's,'t,'o,'p,0 072A L46: 072A 737461727400 .byte 's,'t,'a,'r,'t,0 0730 L43: 0730 7469636B7300 .byte 't,'i,'c,'k,'s,0 0736 L40: 0736 72636200 .byte 'r,'c,'b,0 073A L37: 073A 74636200 .byte 't,'c,'b,0 073E L34: 073E 68656C7000 .byte 'h,'e,'l,'p,0