CTAOS v2
This commit is contained in:
122
kernel/shell/apps.h
Normal file
122
kernel/shell/apps.h
Normal file
@ -0,0 +1,122 @@
|
||||
const char *apps_lst[] = {
|
||||
"",
|
||||
"reboot",
|
||||
"osver",
|
||||
"date",
|
||||
"place",
|
||||
"cls",
|
||||
"memory"
|
||||
};
|
||||
int apps_count = 7;
|
||||
|
||||
void apps_osver()
|
||||
{
|
||||
puts("CTA OS v0.1");
|
||||
puts("\n(c) CTA 2010.\n");
|
||||
}
|
||||
|
||||
void apps_date()
|
||||
{
|
||||
puts("Today is ");
|
||||
puts((char*)clock_weekdays[clock.weekday]);
|
||||
puts(", "); putc((clock.day/10)+'0');
|
||||
putc((clock.day%10)+'0');
|
||||
puts(" "); puts((char*)clock_months[clock.month]);
|
||||
puts(" "); putc((clock.century/10)+'0');
|
||||
putc((clock.century%10)+'0');
|
||||
putc((clock.year/10)+'0');
|
||||
putc((clock.year%10)+'0');
|
||||
putc('\n');
|
||||
}
|
||||
|
||||
void apps_place()
|
||||
{
|
||||
puts("On your desk, if you didn't notice... \n");
|
||||
}
|
||||
|
||||
void apps_clrscr()
|
||||
{
|
||||
clrscr();
|
||||
}
|
||||
|
||||
void apps_memory(const int pn, const char* param[])
|
||||
{
|
||||
if (pn<3) {
|
||||
puts ("Correct syntax: memory [start_address] [end_address] (in hex)\n");
|
||||
return;
|
||||
}
|
||||
|
||||
byte *start, *end;
|
||||
byte l1 = strlen(param[1]), l2 = strlen(param[2]);
|
||||
unsigned int a;
|
||||
int i; byte *count;
|
||||
|
||||
a = 0;
|
||||
for(i = 0; i < l1; i++) {
|
||||
switch (param[1][i]) {
|
||||
case 'a':
|
||||
case 'A': a = a*16 + 10; break;
|
||||
case 'b':
|
||||
case 'B': a = a*16 + 11; break;
|
||||
case 'c':
|
||||
case 'C': a = a*16 + 12; break;
|
||||
case 'd':
|
||||
case 'D': a = a*16 + 13; break;
|
||||
case 'e':
|
||||
case 'E': a = a*16 + 14; break;
|
||||
case 'f':
|
||||
case 'F': a = a*16 + 15; break;
|
||||
|
||||
default: if (!(param[1][i]>='0' && param[1][i]<='9')) {
|
||||
puts ((char*)param[1]); puts(" is not a valid hex address.\n");
|
||||
return;
|
||||
}
|
||||
a = a*16 + (param[1][i] - '0');
|
||||
break;
|
||||
}
|
||||
}
|
||||
start = (byte *)a;
|
||||
|
||||
a = 0;
|
||||
for(i = 0; i < l2; i++) {
|
||||
switch (param[2][i]) {
|
||||
case 'a':
|
||||
case 'A': a = a*16 + 10; break;
|
||||
case 'b':
|
||||
case 'B': a = a*16 + 11; break;
|
||||
case 'c':
|
||||
case 'C': a = a*16 + 12; break;
|
||||
case 'd':
|
||||
case 'D': a = a*16 + 13; break;
|
||||
case 'e':
|
||||
case 'E': a = a*16 + 14; break;
|
||||
case 'f':
|
||||
case 'F': a = a*16 + 15; break;
|
||||
|
||||
default: if (!(param[2][i]>='0' && param[2][i]<='9')) {
|
||||
puts ((char*)param[2]); puts(" is not a valid hex address.\n");
|
||||
return;
|
||||
}
|
||||
a = a*16 + (param[2][i] - '0');
|
||||
break;
|
||||
}
|
||||
}
|
||||
end = (byte *)a;
|
||||
|
||||
while (start <= end) {
|
||||
put_hex ((unsigned int) start); puts(": ");
|
||||
|
||||
for (count = start; count < start+16; count++) {
|
||||
putc(hex[*count/16]); putc(hex[*count%16]);
|
||||
putc(' ');
|
||||
}
|
||||
puts(" ");
|
||||
for (count = start; count < start+16; count++)
|
||||
putc(*count);
|
||||
|
||||
putc('\n');
|
||||
start+=16;
|
||||
}
|
||||
|
||||
|
||||
}
|
81
kernel/shell/shell.c
Normal file
81
kernel/shell/shell.c
Normal file
@ -0,0 +1,81 @@
|
||||
#include <conio.h>
|
||||
#include "apps.h"
|
||||
|
||||
void get_str(char *str, int len)
|
||||
{
|
||||
kb_key alpha;
|
||||
|
||||
int i;
|
||||
for (i = 0; i<len-1 ; i++) {
|
||||
text_mode_cursor(cursor_x, cursor_y);
|
||||
alpha = kb_getkey();
|
||||
switch (alpha.character) {
|
||||
case 0x00: --i; break; // Ignore null characters
|
||||
case 0x7F: --i; break;
|
||||
case '\b': // Backspace
|
||||
if (i>0) { // Only backspace our string
|
||||
if (--cursor_x < 0) { // Begin of row - 1 = End of previous row
|
||||
cursor_x = 79; cursor_y--;
|
||||
}
|
||||
putc_pos(cursor_x, cursor_y, 0);
|
||||
str[--i] = 0;
|
||||
}
|
||||
i--; break;
|
||||
|
||||
case '\n': str[i]=0; putc('\n'); return;
|
||||
|
||||
default: putc(alpha.character);
|
||||
str[i] = alpha.character;
|
||||
str[i+1] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void shell()
|
||||
{
|
||||
char str[256];
|
||||
char* param[16];
|
||||
int i, len, params=0;
|
||||
|
||||
set_default_colors (0x07, 0x04);
|
||||
clrscr();
|
||||
|
||||
|
||||
|
||||
for (;;) {
|
||||
puts("\n] ");
|
||||
get_str(str, 256);
|
||||
|
||||
len = strlen(str);
|
||||
|
||||
// Ignore spaces in front of command
|
||||
i=0; params = 0;
|
||||
while (str[i] == ' ') i++;
|
||||
param[params] = str+i; params++; i++; // Parameter 0 = app itself
|
||||
|
||||
|
||||
for (; i < len && params<16; i++) {
|
||||
if (str[i] == ' ') str[i]=0;
|
||||
|
||||
if (str[i] != 0 && str[i-1]==0) {
|
||||
param[params] = str+i; params++;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; strcmp(apps_lst[i], param[0])!=0 && i<apps_count; i++);
|
||||
switch (i) {
|
||||
case 0: puts("You must enter a command!\n"); break;
|
||||
case 1: reboot();
|
||||
case 2: apps_osver(); break;
|
||||
case 3: apps_date(); break;
|
||||
case 4: apps_place(); break;
|
||||
case 5: apps_clrscr(); break;
|
||||
case 6: apps_memory(params, (const char**)param); break;
|
||||
default: puts("Invalid function: "); puts(param[0]);
|
||||
putc('\n');
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user