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 04:44:07 2012 +0000
Revision:
3:2bc2b0dce10e
Child:
4:b44c27404035
Adding a small forth interpreter

Who changed what in which revision?

UserRevisionLine numberNew contents of line
earlz 3:2bc2b0dce10e 1 #include "mbedconsole.h"
earlz 3:2bc2b0dce10e 2 #include "plEarlz.h"
earlz 3:2bc2b0dce10e 3 #include <stdarg.h>
earlz 3:2bc2b0dce10e 4 //Basically a non-conforming take on Forth, btw.
earlz 3:2bc2b0dce10e 5
earlz 3:2bc2b0dce10e 6 inline int internal_captureline(void* pBuffer, char const* pFormatString, ...)
earlz 3:2bc2b0dce10e 7 {
earlz 3:2bc2b0dce10e 8 char* pStringEnd = (char*)pBuffer + strlen((char*)pBuffer);
earlz 3:2bc2b0dce10e 9 va_list valist;
earlz 3:2bc2b0dce10e 10
earlz 3:2bc2b0dce10e 11 va_start(valist, pFormatString);
earlz 3:2bc2b0dce10e 12
earlz 3:2bc2b0dce10e 13 return vsprintf(pStringEnd, pFormatString, valist);
earlz 3:2bc2b0dce10e 14 }
earlz 3:2bc2b0dce10e 15 void printheapstats()
earlz 3:2bc2b0dce10e 16 {
earlz 3:2bc2b0dce10e 17 char buffer[256];
earlz 3:2bc2b0dce10e 18 __heapstats(internal_captureline, buffer);
earlz 3:2bc2b0dce10e 19 vputs("Memory info: ");
earlz 3:2bc2b0dce10e 20 vputs(buffer);
earlz 3:2bc2b0dce10e 21 }
earlz 3:2bc2b0dce10e 22
earlz 3:2bc2b0dce10e 23 struct pl_word
earlz 3:2bc2b0dce10e 24 {
earlz 3:2bc2b0dce10e 25
earlz 3:2bc2b0dce10e 26 };
earlz 3:2bc2b0dce10e 27
earlz 3:2bc2b0dce10e 28 #define MAXSTACK 256
earlz 3:2bc2b0dce10e 29 #define MAXCALLS 64
earlz 3:2bc2b0dce10e 30 #define MAXLINELENGTH 128
earlz 3:2bc2b0dce10e 31
earlz 3:2bc2b0dce10e 32 int stackpos=0;
earlz 3:2bc2b0dce10e 33 int pl_stack[MAXSTACK];
earlz 3:2bc2b0dce10e 34
earlz 3:2bc2b0dce10e 35 //int *pl_callstack[MAXCALLS];
earlz 3:2bc2b0dce10e 36
earlz 3:2bc2b0dce10e 37 enum WordType
earlz 3:2bc2b0dce10e 38 {
earlz 3:2bc2b0dce10e 39 Unknown,
earlz 3:2bc2b0dce10e 40 Number,
earlz 3:2bc2b0dce10e 41 Word,
earlz 3:2bc2b0dce10e 42 Quote
earlz 3:2bc2b0dce10e 43 };
earlz 3:2bc2b0dce10e 44
earlz 3:2bc2b0dce10e 45 void execute_word(char *word)
earlz 3:2bc2b0dce10e 46 {
earlz 3:2bc2b0dce10e 47
earlz 3:2bc2b0dce10e 48
earlz 3:2bc2b0dce10e 49 }
earlz 3:2bc2b0dce10e 50
earlz 3:2bc2b0dce10e 51 void parse_line(char *line)
earlz 3:2bc2b0dce10e 52 {
earlz 3:2bc2b0dce10e 53 int len=strlen(line);
earlz 3:2bc2b0dce10e 54 char word[16];
earlz 3:2bc2b0dce10e 55 word[0]=0;
earlz 3:2bc2b0dce10e 56 int wordpos=0;
earlz 3:2bc2b0dce10e 57 WordType type=Unknown;
earlz 3:2bc2b0dce10e 58 for(int i=0;i<len;i++)
earlz 3:2bc2b0dce10e 59 {
earlz 3:2bc2b0dce10e 60 char c=line[i];
earlz 3:2bc2b0dce10e 61 if(is_whitespace(c))
earlz 3:2bc2b0dce10e 62 {
earlz 3:2bc2b0dce10e 63 if(word[0]!=0)
earlz 3:2bc2b0dce10e 64 {
earlz 3:2bc2b0dce10e 65 execute_word(word);
earlz 3:2bc2b0dce10e 66 word[0]=0;
earlz 3:2bc2b0dce10e 67 type=Unknown;
earlz 3:2bc2b0dce10e 68 }
earlz 3:2bc2b0dce10e 69 }else if(is_numeric(c)){
earlz 3:2bc2b0dce10e 70 type=Number;
earlz 3:2bc2b0dce10e 71 word[wordpos]=c;
earlz 3:2bc2b0dce10e 72 wordpos++;
earlz 3:2bc2b0dce10e 73 }else if(is_quote(c)){
earlz 3:2bc2b0dce10e 74 vputs("This isn't supported yet foo!");
earlz 3:2bc2b0dce10e 75 }else{
earlz 3:2bc2b0dce10e 76 type=Word;
earlz 3:2bc2b0dce10e 77 word[wordpos]=c;
earlz 3:2bc2b0dce10e 78 wordpos++;
earlz 3:2bc2b0dce10e 79 }
earlz 3:2bc2b0dce10e 80 }
earlz 3:2bc2b0dce10e 81 }
earlz 3:2bc2b0dce10e 82
earlz 3:2bc2b0dce10e 83
earlz 3:2bc2b0dce10e 84
earlz 3:2bc2b0dce10e 85 int pl_shell()
earlz 3:2bc2b0dce10e 86 {
earlz 3:2bc2b0dce10e 87 vputs(">>plEarlz -- A forth-ish shell<<\n");
earlz 3:2bc2b0dce10e 88 printheapstats();
earlz 3:2bc2b0dce10e 89 vputs("\n");
earlz 3:2bc2b0dce10e 90 char *line=(char*)malloc(MAXLINELENGTH);
earlz 3:2bc2b0dce10e 91 sprintf(line, "Stack Size: %i; Max Recursion Level %i; Loaded WORDs: %i", MAXSTACK, MAXCALLS, 0);
earlz 3:2bc2b0dce10e 92 vputs(line);
earlz 3:2bc2b0dce10e 93 sprintf(line, "Max line length: %i", MAXLINELENGTH);
earlz 3:2bc2b0dce10e 94 vputs(line);
earlz 3:2bc2b0dce10e 95 char *tmp=(char*)malloc(32); //for constructing words/elements
earlz 3:2bc2b0dce10e 96 while(1)
earlz 3:2bc2b0dce10e 97 {
earlz 3:2bc2b0dce10e 98 vputs("cmd> ");
earlz 3:2bc2b0dce10e 99 vgetsl(line, MAXLINELENGTH);
earlz 3:2bc2b0dce10e 100 line[MAXLINELENGTH-1]=0;
earlz 3:2bc2b0dce10e 101 parse_line(line);
earlz 3:2bc2b0dce10e 102
earlz 3:2bc2b0dce10e 103 }
earlz 3:2bc2b0dce10e 104 return 0;
earlz 3:2bc2b0dce10e 105 }
earlz 3:2bc2b0dce10e 106
earlz 3:2bc2b0dce10e 107