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

Committer:
earlz
Date:
Wed Sep 19 05:05:31 2012 +0000
Revision:
4:b44c27404035
Parent:
3:2bc2b0dce10e
Child:
5:367397a82ddc
Hey you can actually do something now!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
earlz 4:b44c27404035 1 #include "mbedconsole.h"
earlz 4:b44c27404035 2 #include "plEarlz.h"
earlz 4:b44c27404035 3 #include <stdarg.h>
earlz 4:b44c27404035 4 //Basically a non-conforming take on Forth, btw.
earlz 4:b44c27404035 5
earlz 4:b44c27404035 6 inline int internal_captureline(void* pBuffer, char const* pFormatString, ...)
earlz 4:b44c27404035 7 {
earlz 4:b44c27404035 8 char* pStringEnd = (char*)pBuffer + strlen((char*)pBuffer);
earlz 4:b44c27404035 9 va_list valist;
earlz 4:b44c27404035 10
earlz 4:b44c27404035 11 va_start(valist, pFormatString);
earlz 4:b44c27404035 12
earlz 4:b44c27404035 13 return vsprintf(pStringEnd, pFormatString, valist);
earlz 4:b44c27404035 14 }
earlz 4:b44c27404035 15 void printheapstats()
earlz 4:b44c27404035 16 {
earlz 4:b44c27404035 17 char buffer[256];
earlz 4:b44c27404035 18 __heapstats(internal_captureline, buffer);
earlz 4:b44c27404035 19 vputs("Memory info: ");
earlz 4:b44c27404035 20 vputs(buffer);
earlz 4:b44c27404035 21 }
earlz 4:b44c27404035 22
earlz 4:b44c27404035 23 struct pl_word
earlz 4:b44c27404035 24 {
earlz 4:b44c27404035 25
earlz 4:b44c27404035 26 };
earlz 4:b44c27404035 27
earlz 4:b44c27404035 28 #define MAXSTACK 64
earlz 4:b44c27404035 29 #define MAXCALLS 32
earlz 4:b44c27404035 30 #define MAXLINELENGTH 128
earlz 4:b44c27404035 31
earlz 4:b44c27404035 32 int pl_stackpos=0;
earlz 4:b44c27404035 33 int pl_stack[MAXSTACK];
earlz 4:b44c27404035 34 enum ErrorType
earlz 4:b44c27404035 35 {
earlz 4:b44c27404035 36 None,
earlz 4:b44c27404035 37 StackOverflow,
earlz 4:b44c27404035 38 StackUnderflow
earlz 4:b44c27404035 39 };
earlz 4:b44c27404035 40
earlz 4:b44c27404035 41 ErrorType pl_error=None;
earlz 4:b44c27404035 42
earlz 4:b44c27404035 43 //int *pl_callstack[MAXCALLS];
earlz 4:b44c27404035 44
earlz 4:b44c27404035 45 enum WordType
earlz 4:b44c27404035 46 {
earlz 4:b44c27404035 47 Unknown,
earlz 4:b44c27404035 48 Number,
earlz 4:b44c27404035 49 Word,
earlz 4:b44c27404035 50 Quote
earlz 4:b44c27404035 51 };
earlz 4:b44c27404035 52
earlz 4:b44c27404035 53 void pl_push(int val)
earlz 4:b44c27404035 54 {
earlz 4:b44c27404035 55 if(pl_stackpos>=MAXSTACK)
earlz 4:b44c27404035 56 {
earlz 4:b44c27404035 57 vputs("Stack overflow!");
earlz 4:b44c27404035 58 pl_error=StackOverflow;
earlz 4:b44c27404035 59 return;
earlz 4:b44c27404035 60 }
earlz 4:b44c27404035 61 pl_stack[pl_stackpos]=val;
earlz 4:b44c27404035 62 pl_stackpos++;
earlz 4:b44c27404035 63 }
earlz 4:b44c27404035 64 int pl_pop()
earlz 4:b44c27404035 65 {
earlz 4:b44c27404035 66 if(pl_stackpos<=0)
earlz 4:b44c27404035 67 {
earlz 4:b44c27404035 68 vputs("Stack underflow!");
earlz 4:b44c27404035 69 pl_error=StackUnderflow;
earlz 4:b44c27404035 70 return 0;
earlz 4:b44c27404035 71 }
earlz 4:b44c27404035 72 pl_stackpos--;
earlz 4:b44c27404035 73 return pl_stack[pl_stackpos];
earlz 4:b44c27404035 74 }
earlz 4:b44c27404035 75
earlz 4:b44c27404035 76 void execute_word(char *word, WordType type)
earlz 4:b44c27404035 77 {
earlz 4:b44c27404035 78 if(type==Number){
earlz 4:b44c27404035 79 pl_push(atoi(word));
earlz 4:b44c27404035 80 }else{
earlz 4:b44c27404035 81 if(word[1]==0 && word[0]=='.')
earlz 4:b44c27404035 82 {
earlz 4:b44c27404035 83 int tmp=pl_pop();
earlz 4:b44c27404035 84 sprintf( word, "%i\n", tmp);
earlz 4:b44c27404035 85 vputs(word);
earlz 4:b44c27404035 86 }else{
earlz 4:b44c27404035 87 vputs("I don't know the word ");
earlz 4:b44c27404035 88 vputs(word);
earlz 4:b44c27404035 89 vputs("\n");
earlz 4:b44c27404035 90 }
earlz 4:b44c27404035 91 }
earlz 4:b44c27404035 92
earlz 4:b44c27404035 93 }
earlz 4:b44c27404035 94
earlz 4:b44c27404035 95 void parse_line(char *line)
earlz 4:b44c27404035 96 {
earlz 4:b44c27404035 97 int len=strlen(line);
earlz 4:b44c27404035 98 char word[16];
earlz 4:b44c27404035 99 word[0]=0;
earlz 4:b44c27404035 100 int wordpos=0;
earlz 4:b44c27404035 101 WordType type=Unknown;
earlz 4:b44c27404035 102 for(int i=0;i<len;i++)
earlz 4:b44c27404035 103 {
earlz 4:b44c27404035 104 char c=line[i];
earlz 4:b44c27404035 105 if(is_whitespace(c))
earlz 4:b44c27404035 106 {
earlz 4:b44c27404035 107 if(word[0]!=0)
earlz 4:b44c27404035 108 {
earlz 4:b44c27404035 109 word[wordpos]=0;
earlz 4:b44c27404035 110 execute_word(word,type);
earlz 4:b44c27404035 111 word[0]=0;
earlz 4:b44c27404035 112 }
earlz 4:b44c27404035 113 wordpos=0;
earlz 4:b44c27404035 114 type=Unknown;
earlz 4:b44c27404035 115 }else if(is_numeric(c)){
earlz 4:b44c27404035 116 if(type==Unknown){
earlz 4:b44c27404035 117 type=Number;
earlz 4:b44c27404035 118 }
earlz 4:b44c27404035 119 word[wordpos]=c;
earlz 4:b44c27404035 120 wordpos++;
earlz 4:b44c27404035 121 }else if(is_quote(c)){
earlz 4:b44c27404035 122 vputs("This isn't supported yet foo!");
earlz 4:b44c27404035 123 return;
earlz 4:b44c27404035 124 }else{
earlz 4:b44c27404035 125 if(type==Number){
earlz 4:b44c27404035 126 vputs("Syntax Error! Unexpected symbol in the middle of a number");
earlz 4:b44c27404035 127 return;
earlz 4:b44c27404035 128 }
earlz 4:b44c27404035 129 type=Word;
earlz 4:b44c27404035 130 word[wordpos]=c;
earlz 4:b44c27404035 131 wordpos++;
earlz 4:b44c27404035 132 }
earlz 4:b44c27404035 133 }
earlz 4:b44c27404035 134 }
earlz 4:b44c27404035 135
earlz 4:b44c27404035 136
earlz 4:b44c27404035 137
earlz 4:b44c27404035 138 int pl_shell()
earlz 4:b44c27404035 139 {
earlz 4:b44c27404035 140 vputs(">>plEarlz -- A forth-ish shell<<\n");
earlz 4:b44c27404035 141 printheapstats();
earlz 4:b44c27404035 142 vputs("\n");
earlz 4:b44c27404035 143 char *line=(char*)malloc(MAXLINELENGTH);
earlz 4:b44c27404035 144 sprintf(line, "Stack Size: %i; Max Recursion Level %i; Loaded WORDs: %i", MAXSTACK, MAXCALLS, 0);
earlz 4:b44c27404035 145 vputs(line);
earlz 4:b44c27404035 146 sprintf(line, "Max line length: %i\n", MAXLINELENGTH);
earlz 4:b44c27404035 147 vputs(line);
earlz 4:b44c27404035 148 char *tmp=(char*)malloc(32); //for constructing words/elements
earlz 4:b44c27404035 149 while(1)
earlz 4:b44c27404035 150 {
earlz 4:b44c27404035 151 vputs("cmd> ");
earlz 4:b44c27404035 152 vgetsl(line, MAXLINELENGTH);
earlz 4:b44c27404035 153 line[MAXLINELENGTH-1]=0;
earlz 4:b44c27404035 154 int len=strlen(line);
earlz 4:b44c27404035 155 line[len]='\n';
earlz 4:b44c27404035 156 line[len+1]=0;
earlz 4:b44c27404035 157 parse_line(line);
earlz 4:b44c27404035 158
earlz 4:b44c27404035 159 }
earlz 4:b44c27404035 160 free(line);
earlz 4:b44c27404035 161 free(tmp);
earlz 4:b44c27404035 162 return 0;
earlz 4:b44c27404035 163 }
earlz 4:b44c27404035 164
earlz 4:b44c27404035 165