Commit 4d9fc048 by triazo

Merge branch 'interactive' into 'master'

Interactive

Good enough for merge.

See merge request !15
parents 3e410fcd 4dc758a4
#include "comp.h"
int cstack[128];
int cstack_size;
void cpush(int n)
{
cstack[cstack_size]=n;
cstack_size++;
}
void cpop()
{
if(cstack_size==0)
return;
cstack_size--;
}
int cpeek()
{
return cstack[cstack_size-1];
}
void cadd()
{
if(cstack_size<2)
return;
int a=cpeek();
cpop();
int b=cpeek();
cpop();
cpush(a+b);
}
void cmult()
{
if(cstack_size<2)
return;
int a=cpeek();
cpop();
int b=cpeek();
cpop();
cpush(a*b);
}
void csub()
{
if(cstack_size<2)
return;
int a=cpeek();
cpop();
int b=cpeek();
cpop();
cpush(a-b);
}
void crsub()
{
if(cstack_size<2)
return;
int a=cpeek();
cpop();
int b=cpeek();
cpop();
cpush(b-a);
}
void cdiv()
{
if(cstack_size<2)
return;
int a=cpeek();
cpop();
int b=cpeek();
cpop();
cpush(a/b);
}
void crdiv()
{
if(cstack_size<2)
return;
int a=cpeek();
cpop();
int b=cpeek();
cpop();
cpush(b/a);
}
#ifndef _INC_COMP
#define _INC_COMP
void cpush(int n);
void cpop();
int cpeek();
void cadd();
void cmult();
void csub();
void crsub();
void cdiv();
void crdiv();
#endif
......@@ -43,30 +43,16 @@ void load_error_handlers()
}
}
void default_handler(struct reg_state reg, uint32_t interrupt, uint32_t error, struct stack_state stack)
void default_handler(struct reg_state __attribute__((unused))reg, uint32_t interrupt, uint32_t error, struct stack_state stack)
{
/*for(uint32_t i=stack.eip-16;i<=stack.eip+16;i+=4)
{
serial_hexword(i);
serial_writestring(": ");
serial_hexword(*((uint32_t*)(void*)i));
serial_writestring("\n");
}*/
if(interrupt<32)
stack.eip+=2;
//serial_writestring("int caught ");
//char f[20];
//serial_val(interrupt);
//serial_hexword(error);serial_writestring(" ");
//serial_hexword(stack.eip);serial_writestring(" ");
//serial_val(stack.cd);
//serial_val(stack.eflags);
//serial_writestring("\n");
if(handlers[interrupt]!=NULL)
{
handlers[interrupt](error);
}
//asm("hlt");
return;
}
......
......@@ -2,28 +2,200 @@
#include "pic.h"
#include "serial.h"
#include "idt.h"
#include "string.h"
#include "term.h"
#include "comp.h"
char scan_map[256] = {' ','E','1','2','3','4','5','6','7','8','9','0','-','=','\b','\t','q','w','e','r','t','y','u','i','o','p',
'[',']','\n','^','a','s','d','f','g','h','j','k','l',';','\'','`','S','\\','z','x','c','v','b','n','m',
',','.','/','S','O','A',' ','C','F','F','F','F','F','F','F','F','F','F','L','L',};
char scan_map[256] = {'\0','\0','1','2','3','4','5','6','7','8','9','0','-','=','\b','\t',
'q','w','e','r','t','y','u','i','o','p','[',']','\n','\0','a','s',
'd','f','g','h','j','k','l',';','\'','`','\0','\\','z','x','c','v',
'b','n','m',',','.','/','\0','\0','\0',' ','\0','\0','\0','\0','\0','\0',
'\0','\0','\0','\0','\0','\0','\0'};
char shift_map[256] = {'\0','\0','!','@','#','$','%','^','&','*','(',')','_','+','\b','\t',
'Q','W','E','R','T','Y','U','I','O','P','{','}','\n','\0','A','S',
'D','F','G','H','J','K','L',':','\"','~','S','|','Z','X','C','V',
'B','N','M','<','>','?','\0','\0','\0',' ','\0','\0','\0','\0','\0','\0',
'\0','\0','\0','\0','\0','\0','\0'};
char kb_buf[256];
int kb_buf_size;
int modifiers[6] = {0,0,0};
#define MOD_SHIFT 0
#define MOD_CTRL 1
#define MOD_ALT 2
void terminal_writeint(int n)
{
char f[20];
itoa(n,f);
terminal_writestring(f);
}
void io_process(char* s, int ss)
{
terminal_putchar('\n');
if(strncmp(s,"echo ",5)==0)
{
terminal_writestring(s+5);
terminal_putchar('\n');
}
else if(strncmp(s,"serial ",7)==0)
{
serial_writestring("\n");
serial_writestring(s+7);
serial_writestring("\n");
}
else if(strncmp(s,"clear",5)==0)
{
terminal_clear();
}
else if(strncmp(s,"hex ",4)==0)
{
terminal_hexstring(s+4,ss-4);
terminal_putchar('\n');
}
else if(strncmp(s,"push ",5)==0)
{
int n = stoi(s+5);
cpush(n);
}
else if(strncmp(s,"peek",4)==0)
{
terminal_writeint(cpeek());
terminal_putchar('\n');
}
else if(strncmp(s,"pop",3)==0)
{
terminal_writeint(cpeek());
cpop();
terminal_putchar('\n');
}
else if(strncmp(s,"add",3)==0)
{
cadd();
terminal_writeint(cpeek());
terminal_putchar('\n');
}
else if(strncmp(s,"mult",3)==0)
{
cmult();
terminal_writeint(cpeek());
terminal_putchar('\n');
}
else if(strncmp(s,"sub",3)==0)
{
csub();
terminal_writeint(cpeek());
terminal_putchar('\n');
}
else if(strncmp(s,"rsub",3)==0)
{
crsub();
terminal_writeint(cpeek());
terminal_putchar('\n');
}
else if(strncmp(s,"div",3)==0)
{
cdiv();
terminal_writeint(cpeek());
terminal_putchar('\n');
}
else if(strncmp(s,"rdiv",3)==0)
{
crdiv();
terminal_writeint(cpeek());
terminal_putchar('\n');
}
else
{
terminal_writestring("Command not recognized\n");
}
}
void kbd_irq()
{
int a = inb(0x60);
serial_hexword(a);
if(a==0x2a || a==0x36)
{
modifiers[MOD_SHIFT]=1;
}
else if(a==0xaa || a==0xba)
{
modifiers[MOD_SHIFT]=0;
}
else if(a==0x1d)
{
modifiers[MOD_CTRL]=1;
}
else if(a==0x9d)
{
modifiers[MOD_CTRL]=0;
}
else
{
if(a==0x4b)
{
terminal_adjustcursor(-1,0);
}
else if(a==0x4d)
{
terminal_adjustcursor(1,0);
}
else if(a==0x48)
terminal_adjustcursor(0,-1);
{
terminal_adjustcursor(0,0);//-1);
}
else if(a==0x50)
terminal_adjustcursor(0,1);
{
terminal_adjustcursor(0,0);//1);
}
else if(a<0x80)
terminal_putchar(scan_map[a]);
{
char in = scan_map[a];
if(modifiers[MOD_SHIFT]==1)
{
in = shift_map[a];
}
if(in == '\n')//enter pressed
{
io_process(kb_buf, kb_buf_size);
for(int i=0;i<kb_buf_size;i++)
{
kb_buf[i]='\0';
}
kb_buf_size=0;
terminal_writestring("> ");
}
else if(in=='\b')
{
if(kb_buf_size>0)
{
kb_buf_size--;
kb_buf[kb_buf_size]='\0';
terminal_putchar(in);
}
}
else if(modifiers[MOD_CTRL]==1&&(in=='l'||in=='L'))
{
terminal_clear();
for(int i=0;i<kb_buf_size;i++)
{
kb_buf[i]='\0';
}
kb_buf_size=0;
terminal_writestring("> ");
}
else if(in!='\0')
{
kb_buf[kb_buf_size]=in;
kb_buf_size++;
terminal_putchar(in);
}
}
}
//else
//terminal_putchar(scan_map[a-0x80]);
serial_writestring("\n");
//serial_writestring("\n");
pic_command(0, PIC_OCW2_EOI);
}
......
......@@ -42,7 +42,7 @@ void kernel_main(multiboot_info* mbt, uint32_t magic)
serial_writestring("Hello, kernel World!\n");
terminal_writestring("Hello, kernel World!\n");
terminal_writestring("> ");
// Abort if magic is not correct.
if (magic != 0x2badb002)
{
......
......@@ -81,7 +81,7 @@ page_directory_entry* mem_init_kern_tables(multiboot_memory_map* mmap, multiboot
uint32_t i;
for (i = 0; i+0x1000000 < mmap->length; i += 0x1000000)
{
populate_page_table(next_table, (void*) mmap->base_addr + i, 1024 ,0);
populate_page_table(next_table, (void*)(intptr_t) mmap->base_addr + i, 1024 ,0);
page_directory[current_dir_entry] = (uint32_t) next_table;
page_directory[current_dir_entry] |= PAGE_WRITABLE | PAGE_PRESENT;
......@@ -92,7 +92,7 @@ page_directory_entry* mem_init_kern_tables(multiboot_memory_map* mmap, multiboot
// full page table to be mapped. This handlis this case.
if (i != mmap->length)
{
populate_page_table(next_table, (void*) mmap->base_addr + i, (mmap->length - i) / 0x1000 ,0);
populate_page_table(next_table, (void*)(intptr_t) mmap->base_addr + i, (mmap->length - i) / 0x1000 ,0);
page_directory[current_dir_entry] = (uint32_t) next_table;
page_directory[current_dir_entry] |= PAGE_WRITABLE | PAGE_PRESENT;
......
#include "string.h"
#include <stdbool.h>
void *memset(void *s, int c, size_t n){
unsigned char* p=s;
......@@ -48,3 +49,110 @@ size_t strlen(const char* str)
ret++;
return ret;
}
int strcmp(const char* s1, const char* s2)
{
while(*s1 && (*s1==*s2))
{
s1++,s2++;
}
return *(const unsigned char*)s1-*(const unsigned char*)s2;
}
int strncmp(const char *s1, const char *s2, size_t n)
{
for ( ; n > 0; s1++, s2++, --n)
if (*s1 != *s2)
return ((*(unsigned char *)s1 < *(unsigned char *)s2) ? -1 : +1);
else if (*s1 == '\0')
return 0;
return 0;
}
int atoi(const char *p)
{
int k = 0;
while (*p) {
k = (k<<3)+(k<<1)+(*p)-'0';
p++;
}
return k;
}
bool isNumericChar(char x)
{
return (x >= '0' && x <= '9')? true: false;
}
int stoi(const char *str)
{
if ((*str) == 0)
return 0;
int res = 0;
int sign = 1;
int i = 0;
if (str[0] == '-')
{
sign = -1;
i++;
}
for (; str[i] != '\0'; ++i)
{
if (isNumericChar(str[i]) == false)
return 0;
res = res*10 + str[i] - '0';
}
return sign*res;
}
double atof(const char* num)
{
if (!num || !*num)
return 0;
double integerPart = 0;
double fractionPart = 0;
int divisorForFraction = 1;
int sign = 1;
bool inFraction = false;
if (*num == '-')
{
++num;
sign = -1;
}
else if (*num == '+')
{
++num;
}
while (*num != '\0')
{
if (*num >= '0' && *num <= '9')
{
if (inFraction)
{
fractionPart = fractionPart*10 + (*num - '0');
divisorForFraction *= 10;
}
else
{
integerPart = integerPart*10 + (*num - '0');
}
}
else if (*num == '.')
{
if (inFraction)
return sign * (integerPart + fractionPart/divisorForFraction);
else
inFraction = true;
}
else
{
return sign * (integerPart + fractionPart/divisorForFraction);
}
++num;
}
return sign * (integerPart + fractionPart/divisorForFraction);
}
......@@ -5,5 +5,9 @@
void* memset(void *s, int c, size_t n);
void itoa(int n, char s[]);
size_t strlen(const char* str);
int strcmp(const char* s1, const char* s2);
int strncmp(const char* s1, const char* s2, size_t n);
int atoi(const char *p);
int stoi(const char* str);
double atof(const char* num);
#endif
......@@ -36,6 +36,33 @@ void update_csr()
outb(0x3D5, temp);
}
void terminal_scroll()
{
for(size_t y=0;y<VGA_HEIGHT-1;y++)
{
for(size_t x=0;x<VGA_WIDTH;x++)
{
terminal_buffer[y*VGA_WIDTH + x]=terminal_buffer[(y+1)*VGA_WIDTH + x];
}
}
for(size_t x=0;x<VGA_WIDTH;x++)
{
terminal_buffer[(VGA_HEIGHT-1)*VGA_WIDTH + x]=make_vgaentry(' ', terminal_color);
}
}
void terminal_clear()
{
for(size_t y=0;y<VGA_HEIGHT;y++)
{
for(size_t x=0;x<VGA_WIDTH;x++)
{
terminal_buffer[y*VGA_WIDTH + x]=make_vgaentry(' ', terminal_color);;
}
}
terminal_row = terminal_column = 0;
}
void terminal_initialize()
{
terminal_row = 0;
......@@ -79,6 +106,11 @@ void terminal_putchar(char c)
{
terminal_column=0;
terminal_row++;
if(terminal_row>=VGA_HEIGHT)
{
terminal_scroll();
terminal_row=VGA_HEIGHT-1;
}
}
else if(c=='\t')
{
......@@ -92,13 +124,27 @@ void terminal_putchar(char c)
terminal_column = 0;
if (++terminal_row == VGA_HEIGHT)
{
terminal_row = 0;
//terminal_row = 0;
terminal_scroll();
terminal_row=VGA_HEIGHT-1;
}
}
}
update_csr();
}
const char* hexcharss = "0123456789abcdef";
void terminal_hexstring(void* s, uint32_t n)
{
char* d = (char*)s;
for (uint32_t i = 0; i < n; i++)
{
terminal_putchar(hexcharss[(d[i]>>4)&0xf]);
terminal_putchar(hexcharss[d[i]&0xf]);
}
}
void terminal_writestring(const char* data)
{
size_t datalen = strlen(data);
......
......@@ -32,9 +32,11 @@ uint8_t make_color(enum vga_color fg, enum vga_color bg);
uint16_t make_vgaentry(char c, uint8_t color);
void terminal_initialize();
void terminal_clear();
void terminal_setcolor(uint8_t color);
void terminal_putentryat(char c, uint8_t color, size_t x, size_t y);
void terminal_putchar(char c);
void terminal_writestring(const char* data);
void terminal_movecursor(size_t x, size_t y);
void terminal_adjustcursor(int x, int y);
void terminal_hexstring(void* s, uint32_t n);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment