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@3:2bc2b0dce10e, 2012-09-19 (annotated)
- 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?
User | Revision | Line number | New 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 |