view cos/kernel/kernel.c @ 18:6129643f5c34

Fixed interrupt issue, ds, es, ss, fs and gs were not initialized to 0
author windel
date Sun, 20 Nov 2011 20:35:51 +0100
parents f3e3e0e9c4bc
children f454e3c592dd
line wrap: on
line source

#include "kernel.h"

static int shiftstate = 0;
static volatile uint8_t charAvail = 0;
static volatile char kbdchar = ' ';

static char keymap[128] = {
  '?','?','1','2', '3', '4', '5','6', '7', '8','9', '0', '-','=', 0xe, '?',
  'q','w','e','r', 't', 'y', 'u','i', 'o', 'p','[', ']', '\n','?', 'a', 's',
  'd','f','g','h', 'j', 'k', 'l',';', '\'', '?','?', '?', 'z','x', 'c', 'v',
  'b','n','m',',', '.', '/', '?','?', '?', ' ','?', '?', '?','?', '?', '?',

  '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?',
  '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?',
  '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?',
  '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?'
};

static char keymapUPPER[128] = {
  '?','?','!','@', '#', '$', '%','^', '&', '*','(', ')', '_','+', '?', '?',
  'Q','W','E','R', 'T', 'Y', 'U','I', 'O', 'P','{', '}', '|','?', 'A', 'S',
  'D','F','G','H', 'J', 'K', 'L',':', '"', '?','?', '?', 'Z','X', 'C', 'V',
  'B','N','M','<', '>', '?', '?','?', '?', ' ','?', '?', '?','?', '?', '?',

  '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?',
  '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?',
  '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?',
  '?','?','?','?', '?', '?', '?','?', '?', '?','?', '?', '?','?', '?', '?'
};

// IO port helpers:
void outb(uint16_t port, uint8_t value)
{
   asm volatile ("outb %1, %0" : : "dN" (port), "a" (value));
}

uint8_t inb(uint16_t port)
{
   uint8_t ret;
   asm volatile ("inb %1, %0" : "=a" (ret) : "dN" (port));
   return ret;
}

uint16_t inw(uint16_t port)
{
   uint16_t ret;
   asm volatile ("inw %1, %0" : "=a" (ret) : "dN" (port));
   return ret;
}


static uint64_t ticks = 0;
void timerDriverUpdate()
{
  ticks++;
}

uint64_t getTimeMS()
{
  return 55*ticks;
}

int strncmp(const char* s1, const char* s2, int size) {
  int i;
  for (i=0; i<size; i++) {
    if (s1[i] != s2[i]) return 0;
  }
  return 1;
}

void keyboardDriverUpdate(unsigned char scancode)
{
  switch(scancode) {
    case 0x2a:
      shiftstate = 1;
      break;
    case 0xaa:
      shiftstate = 0;
      break;
    default:
      if (scancode < 128) {
        if (charAvail == 0) {
          if (shiftstate == 0) {
            kbdchar = keymap[scancode];
          } else {
            kbdchar = keymapUPPER[scancode];
          }
          
          charAvail = 1;
        }
      } else {
        // Key release
        //printf("Unhandled scancode: 0x%x\n", scancode);
      }
      break;
  }
}

char getChar() {
  while (charAvail == 0);
  char c = kbdchar;
  charAvail = 0;
  return c;
}

void getline(char *buffer, int len) {
  char c;
  int i = 0;
  while (i < len-1) {
    c = getChar();
    if (c == '\n') {
      // Enter
      break;
    }
    if (c == 0x0e) {
      if (i>0) {
         printf(" ");
         i--;
      }
      continue;
    }
    buffer[i] = c;
    printf("%c", c);
    i++;
  }
  buffer[i] = 0;
}

/*
  malloc and free divide the chunks of memory present at the heap
  of the kernel into smaller parts.
  The heap is located at: 0x
*/
static void* kernel_heap = (void*) 0xD0000000;
/* Allocates 'size' bytes and returns the pointer if succesfull.
   Kernelpanic in case of failure..
*/
void* malloc(uint64_t size) {
  printf("Malloc %d bytes\n", size);
  return kernel_heap;
}

void free(void* ptr) {
  printf("Free address %x\n", ptr);
}

void kmain()
{
  init_screen();
  printf("Welcome! .. ");

  printf("Enabling interrupts .. ");
  setupIDT();
  printf("Entering mainloop!\n");

  while (1==1) 
  {
    char buffer[70];
    printf(">>>");
    getline(buffer, 70);
    // TODO: interpret this line with python :)
    printf("\n");
    printf("Got line: '%s'\n", buffer);
    if (buffer[0] == 'x') 
    {
      printf("System time in ms: %d\n", getTimeMS());
    }
    if ( strncmp(buffer, "help", 4)) 
    {
      printf("Help\n Try one of these commands:\n");
      printf(" x: print system time in ms\n");
    }
  }
}