A project to implement a console using the Mbed using VGA for video output and a PS/2 keyboard for the input. The eventual goal is to also include tools for managing SD cards, and a semi-self-hosting programming environment.

Dependencies:   PS2_MbedConsole fastlib SDFileSystem vga640x480g_mbedconsole lightvm mbed

MbedConsole is a cool little project to have a self-contained computer all on an Mbed. So far it has VGA and PS/2 support and can stand alone without a computer powering it. Next planned features are SD card support and a lightweight programmable VM complete with a file editor and self-hosted assembler.

You can view additional details about it at http://earlz.net/tags/mbedconsole

textio.cpp

Committer:
earlz
Date:
2012-09-28
Revision:
12:3ee3062cc11c
Parent:
11:fede136943a9
Child:
13:442bd2fb4ea0

File content as of revision 12:3ee3062cc11c:

#include "mbedconsole.h"
#include "keyboard.h"

#define FONTHEIGHT 16
#define FONTWIDTH 8

int console_x=0, console_y=0;
int console_color=WHITE; //text color


void vsetcursor(int x, int y)
{
    console_x=x;
    console_y=y;
}

void vrawputc(char c)
{
    //fuck that shitv
    if(console_x>80)
    {
        return;
    }
    //shift left for fast multiply
    vga_putchar(console_x<<3, console_y<<4, c, console_color);
}
void vputc(char c)
{
    //shift left for fast multiply
    if(console_x>=79)
    {
        console_x=0;
        console_y++;
    }
    if(console_y>=24)
    {
        console_y--;
        vga_scroll();
    }
    switch(c){
        case '\n':
        case '\r':
        console_y++;
        console_x=0;
        break;
        case '\b':
        vrawputc(' ');
        if(console_x>0)
        {
            console_x--;
        }
        vrawputc(' ');
        break;
        case '\t':
        for(int i=0;i<4;i++)
        {
            console_x++;
            vrawputc(' ');
        }
        default:
        vga_putchar(console_x<<3, console_y<<4, c, console_color);
        console_x++;
    }
}

void vputs(char *s){
    while(*s!=0){
        vputc(*s);
        s++;
    }
}

char vgetc()
{
    char tmp=kbd_GetKey();
    vputc(tmp);
    return tmp;
}
int vgetsl(char *buf, int len)
{
    int pos=0;
    while(1){
        buf[pos]=kbd_GetKey();
        if(buf[pos]=='\r'){
            buf[pos]='\n';
        }
        
        vputc(buf[pos]);
        if(buf[pos]=='\b'){
            buf[pos]=0;
            if(pos>0){
                pos--;
                buf[pos--]=0;
            }
        }
        if(pos>len-1){
            break;
        }
        if(buf[pos]=='\n'){
            buf[pos]=0;
            return 1;
        }
        pos++;
    }
    return 0;
}



int strlcmp(const char *s1,const char *s2,size_t count){
    int i=0;
    while((s1[i]!=0) && (s2[i]!=0)){
        if(s1[i]!=s2[i]){
            return -1;
        }
        if(i>=count){
            return -1;
        }
        i++;
        
    }
    if(s1[i]!=s2[i]){
        return -1;
    }
    return 0;
}