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