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
plEarlz.cpp@4:b44c27404035, 2012-09-19 (annotated)
- 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?
User | Revision | Line number | New 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 |