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@1:eb209f0468de, 2012-09-17 (annotated)
- Committer:
- earlz
- Date:
- Mon Sep 17 04:41:37 2012 +0000
- Revision:
- 1:eb209f0468de
- Child:
- 4:b44c27404035
Getting more and more useful
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
earlz | 1:eb209f0468de | 1 | #include "mbedconsole.h" |
earlz | 1:eb209f0468de | 2 | |
earlz | 1:eb209f0468de | 3 | #define FONTHEIGHT 16 |
earlz | 1:eb209f0468de | 4 | #define FONTWIDTH 8 |
earlz | 1:eb209f0468de | 5 | |
earlz | 1:eb209f0468de | 6 | int console_x=0, console_y=0; |
earlz | 1:eb209f0468de | 7 | int console_color=WHITE; //text color |
earlz | 1:eb209f0468de | 8 | |
earlz | 1:eb209f0468de | 9 | |
earlz | 1:eb209f0468de | 10 | void vsetcursor(int x, int y) |
earlz | 1:eb209f0468de | 11 | { |
earlz | 1:eb209f0468de | 12 | console_x=x; |
earlz | 1:eb209f0468de | 13 | console_y=y; |
earlz | 1:eb209f0468de | 14 | } |
earlz | 1:eb209f0468de | 15 | |
earlz | 1:eb209f0468de | 16 | void vrawputc(char c) |
earlz | 1:eb209f0468de | 17 | { |
earlz | 1:eb209f0468de | 18 | //fuck that shitv |
earlz | 1:eb209f0468de | 19 | if(console_x>80) |
earlz | 1:eb209f0468de | 20 | { |
earlz | 1:eb209f0468de | 21 | return; |
earlz | 1:eb209f0468de | 22 | } |
earlz | 1:eb209f0468de | 23 | //shift left for fast multiply |
earlz | 1:eb209f0468de | 24 | vga_putchar(console_x<<3, console_y<<4, c, console_color); |
earlz | 1:eb209f0468de | 25 | } |
earlz | 1:eb209f0468de | 26 | void vputc(char c) |
earlz | 1:eb209f0468de | 27 | { |
earlz | 1:eb209f0468de | 28 | //shift left for fast multiply |
earlz | 1:eb209f0468de | 29 | if(console_x>=79) |
earlz | 1:eb209f0468de | 30 | { |
earlz | 1:eb209f0468de | 31 | console_x=0; |
earlz | 1:eb209f0468de | 32 | console_y++; |
earlz | 1:eb209f0468de | 33 | } |
earlz | 1:eb209f0468de | 34 | if(console_y>=24) |
earlz | 1:eb209f0468de | 35 | { |
earlz | 1:eb209f0468de | 36 | console_y--; |
earlz | 1:eb209f0468de | 37 | vga_scroll(); |
earlz | 1:eb209f0468de | 38 | } |
earlz | 1:eb209f0468de | 39 | switch(c){ |
earlz | 1:eb209f0468de | 40 | case '\n': |
earlz | 1:eb209f0468de | 41 | case '\r': |
earlz | 1:eb209f0468de | 42 | console_y++; |
earlz | 1:eb209f0468de | 43 | console_x=0; |
earlz | 1:eb209f0468de | 44 | break; |
earlz | 1:eb209f0468de | 45 | case '\b': |
earlz | 1:eb209f0468de | 46 | vrawputc(' '); |
earlz | 1:eb209f0468de | 47 | if(console_x>0) |
earlz | 1:eb209f0468de | 48 | { |
earlz | 1:eb209f0468de | 49 | console_x--; |
earlz | 1:eb209f0468de | 50 | } |
earlz | 1:eb209f0468de | 51 | vrawputc(' '); |
earlz | 1:eb209f0468de | 52 | break; |
earlz | 1:eb209f0468de | 53 | case '\t': |
earlz | 1:eb209f0468de | 54 | for(int i=0;i<4;i++) |
earlz | 1:eb209f0468de | 55 | { |
earlz | 1:eb209f0468de | 56 | console_x++; |
earlz | 1:eb209f0468de | 57 | vrawputc(' '); |
earlz | 1:eb209f0468de | 58 | } |
earlz | 1:eb209f0468de | 59 | default: |
earlz | 1:eb209f0468de | 60 | vga_putchar(console_x<<3, console_y<<4, c, console_color); |
earlz | 1:eb209f0468de | 61 | console_x++; |
earlz | 1:eb209f0468de | 62 | } |
earlz | 1:eb209f0468de | 63 | } |
earlz | 1:eb209f0468de | 64 | |
earlz | 1:eb209f0468de | 65 | void vputs(char *s){ |
earlz | 1:eb209f0468de | 66 | while(*s!=0){ |
earlz | 1:eb209f0468de | 67 | vputc(*s); |
earlz | 1:eb209f0468de | 68 | s++; |
earlz | 1:eb209f0468de | 69 | } |
earlz | 1:eb209f0468de | 70 | } |
earlz | 1:eb209f0468de | 71 | |
earlz | 1:eb209f0468de | 72 | char vgetc() |
earlz | 1:eb209f0468de | 73 | { |
earlz | 1:eb209f0468de | 74 | while(!serial.readable()){ |
earlz | 1:eb209f0468de | 75 | return serial.getc(); |
earlz | 1:eb209f0468de | 76 | } |
earlz | 1:eb209f0468de | 77 | return '!'; //unreachable |
earlz | 1:eb209f0468de | 78 | } |
earlz | 1:eb209f0468de | 79 | int vgetsl(char *buf, int len) |
earlz | 1:eb209f0468de | 80 | { |
earlz | 1:eb209f0468de | 81 | int pos=0; |
earlz | 1:eb209f0468de | 82 | while(1){ |
earlz | 1:eb209f0468de | 83 | if(serial.readable()){ |
earlz | 1:eb209f0468de | 84 | buf[pos]=serial.getc(); |
earlz | 1:eb209f0468de | 85 | if(buf[pos]=='\r'){ |
earlz | 1:eb209f0468de | 86 | buf[pos]='\n'; |
earlz | 1:eb209f0468de | 87 | } |
earlz | 1:eb209f0468de | 88 | |
earlz | 1:eb209f0468de | 89 | vputc(buf[pos]); |
earlz | 1:eb209f0468de | 90 | if(buf[pos]=='\b'){ |
earlz | 1:eb209f0468de | 91 | buf[pos]=0; |
earlz | 1:eb209f0468de | 92 | if(pos>0){ |
earlz | 1:eb209f0468de | 93 | pos--; |
earlz | 1:eb209f0468de | 94 | buf[pos--]=0; |
earlz | 1:eb209f0468de | 95 | } |
earlz | 1:eb209f0468de | 96 | } |
earlz | 1:eb209f0468de | 97 | if(pos>len-1){ |
earlz | 1:eb209f0468de | 98 | break; |
earlz | 1:eb209f0468de | 99 | } |
earlz | 1:eb209f0468de | 100 | if(buf[pos]=='\n'){ |
earlz | 1:eb209f0468de | 101 | buf[pos]=0; |
earlz | 1:eb209f0468de | 102 | return 1; |
earlz | 1:eb209f0468de | 103 | } |
earlz | 1:eb209f0468de | 104 | pos++; |
earlz | 1:eb209f0468de | 105 | } |
earlz | 1:eb209f0468de | 106 | } |
earlz | 1:eb209f0468de | 107 | return 0; |
earlz | 1:eb209f0468de | 108 | } |
earlz | 1:eb209f0468de | 109 | |
earlz | 1:eb209f0468de | 110 | |
earlz | 1:eb209f0468de | 111 | |
earlz | 1:eb209f0468de | 112 | int strlcmp(const char *s1,const char *s2,size_t count){ |
earlz | 1:eb209f0468de | 113 | int i=0; |
earlz | 1:eb209f0468de | 114 | while((s1[i]!=0) && (s2[i]!=0)){ |
earlz | 1:eb209f0468de | 115 | if(s1[i]!=s2[i]){ |
earlz | 1:eb209f0468de | 116 | return -1; |
earlz | 1:eb209f0468de | 117 | } |
earlz | 1:eb209f0468de | 118 | if(i>=count){ |
earlz | 1:eb209f0468de | 119 | return -1; |
earlz | 1:eb209f0468de | 120 | } |
earlz | 1:eb209f0468de | 121 | i++; |
earlz | 1:eb209f0468de | 122 | |
earlz | 1:eb209f0468de | 123 | } |
earlz | 1:eb209f0468de | 124 | if(s1[i]!=s2[i]){ |
earlz | 1:eb209f0468de | 125 | return -1; |
earlz | 1:eb209f0468de | 126 | } |
earlz | 1:eb209f0468de | 127 | return 0; |
earlz | 1:eb209f0468de | 128 | } |
earlz | 1:eb209f0468de | 129 |