Full graphic 640x400 monochrome VGA driver library

Dependents:   vga640x400graphic

Committer:
gertk
Date:
Sun Jul 24 11:53:05 2011 +0000
Revision:
0:ca7defdc9e44
version 0.1

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gertk 0:ca7defdc9e44 1 #include "vga_font.h"
gertk 0:ca7defdc9e44 2 #define FRAMEBUFFERMAX 32000
gertk 0:ca7defdc9e44 3 #define VGA_HEIGHT 400
gertk 0:ca7defdc9e44 4 #define VGA_WIDTH 640
gertk 0:ca7defdc9e44 5 #include "mbed.h"
gertk 0:ca7defdc9e44 6
gertk 0:ca7defdc9e44 7 extern unsigned char *framebuffer;
gertk 0:ca7defdc9e44 8
gertk 0:ca7defdc9e44 9 static const unsigned char rmask[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
gertk 0:ca7defdc9e44 10 static const unsigned char smask[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
gertk 0:ca7defdc9e44 11
gertk 0:ca7defdc9e44 12 // clear the screen
gertk 0:ca7defdc9e44 13 void vga_cls() {
gertk 0:ca7defdc9e44 14 memset(framebuffer,0,FRAMEBUFFERMAX);
gertk 0:ca7defdc9e44 15 }
gertk 0:ca7defdc9e44 16
gertk 0:ca7defdc9e44 17 // scroll the screen one text line up
gertk 0:ca7defdc9e44 18 void vga_scroll() {
gertk 0:ca7defdc9e44 19 memcpy(framebuffer,framebuffer+(FONTHEIGHT*80),FRAMEBUFFERMAX-80*(FONTHEIGHT));
gertk 0:ca7defdc9e44 20 memset(framebuffer+FRAMEBUFFERMAX-80*(FONTHEIGHT),0,FONTHEIGHT*80);
gertk 0:ca7defdc9e44 21 }
gertk 0:ca7defdc9e44 22
gertk 0:ca7defdc9e44 23 // set or reset a single pixel on screen
gertk 0:ca7defdc9e44 24 void vga_plot(int x,int y,char color) {
gertk 0:ca7defdc9e44 25 unsigned int ad;
gertk 0:ca7defdc9e44 26
gertk 0:ca7defdc9e44 27 ad=80*y+((x/8)^1); // calculate offset
gertk 0:ca7defdc9e44 28 if (ad>=FRAMEBUFFERMAX) return; // crude clip
gertk 0:ca7defdc9e44 29 framebuffer[ad]&=rmask[x%8]; // clear the bit
gertk 0:ca7defdc9e44 30 if (color) framebuffer[ad]|=smask[x%8]; // if color != 0 set the bit
gertk 0:ca7defdc9e44 31 }
gertk 0:ca7defdc9e44 32
gertk 0:ca7defdc9e44 33 // put a character from the vga font on screen
gertk 0:ca7defdc9e44 34 void vga_putchar(int x,int y,int ch, char color) {
gertk 0:ca7defdc9e44 35 int n,m;
gertk 0:ca7defdc9e44 36 for (n=0; n<FONTHEIGHT; n++) {
gertk 0:ca7defdc9e44 37 for (m=0; m<FONTWIDTH; m++) {
gertk 0:ca7defdc9e44 38 if (vga_font8x16[ch*FONTHEIGHT+n] & (1<<(7-m))) vga_plot(x+m,y+n, color);
gertk 0:ca7defdc9e44 39 else vga_plot(x+m,y+n,0);
gertk 0:ca7defdc9e44 40 }
gertk 0:ca7defdc9e44 41 }
gertk 0:ca7defdc9e44 42 }
gertk 0:ca7defdc9e44 43
gertk 0:ca7defdc9e44 44 // put a string on screen
gertk 0:ca7defdc9e44 45 void vga_putstring(int x,int y, char *s, char color) {
gertk 0:ca7defdc9e44 46 while (*s) {
gertk 0:ca7defdc9e44 47 vga_putchar(x,y,*(s++),color);
gertk 0:ca7defdc9e44 48 x+=FONTWIDTH;
gertk 0:ca7defdc9e44 49 }
gertk 0:ca7defdc9e44 50 }
gertk 0:ca7defdc9e44 51
gertk 0:ca7defdc9e44 52 // Bresenham line routine
gertk 0:ca7defdc9e44 53 void vga_line(int x0, int y0, int x1, int y1,char color) {
gertk 0:ca7defdc9e44 54
gertk 0:ca7defdc9e44 55 char steep=1;
gertk 0:ca7defdc9e44 56 int li,dx,dy,le;
gertk 0:ca7defdc9e44 57 int sx,sy;
gertk 0:ca7defdc9e44 58
gertk 0:ca7defdc9e44 59 // if same coordinates
gertk 0:ca7defdc9e44 60 if (x0==x1 && y0==y1) {
gertk 0:ca7defdc9e44 61 vga_plot(x0,y0,color);
gertk 0:ca7defdc9e44 62 return;
gertk 0:ca7defdc9e44 63 }
gertk 0:ca7defdc9e44 64
gertk 0:ca7defdc9e44 65 dx = abs(x1-x0);
gertk 0:ca7defdc9e44 66 sx = ((x1 - x0) >0) ? 1 : -1;
gertk 0:ca7defdc9e44 67 dy=abs(y1-y0);
gertk 0:ca7defdc9e44 68 sy = ((y1 - y0) >0) ? 1 : -1;
gertk 0:ca7defdc9e44 69
gertk 0:ca7defdc9e44 70 if (dy > dx) {
gertk 0:ca7defdc9e44 71 steep=0;
gertk 0:ca7defdc9e44 72 // swap X0 and Y0
gertk 0:ca7defdc9e44 73 x0=x0 ^ y0;
gertk 0:ca7defdc9e44 74 y0=x0 ^ y0;
gertk 0:ca7defdc9e44 75 x0=x0 ^ y0;
gertk 0:ca7defdc9e44 76
gertk 0:ca7defdc9e44 77 // swap DX and DY
gertk 0:ca7defdc9e44 78 dx=dx ^ dy;
gertk 0:ca7defdc9e44 79 dy=dx ^ dy;
gertk 0:ca7defdc9e44 80 dx=dx ^ dy;
gertk 0:ca7defdc9e44 81
gertk 0:ca7defdc9e44 82 // swap SX and SY
gertk 0:ca7defdc9e44 83 sx=sx ^ sy;
gertk 0:ca7defdc9e44 84 sy=sx ^ sy;
gertk 0:ca7defdc9e44 85 sx=sx ^ sy;
gertk 0:ca7defdc9e44 86 }
gertk 0:ca7defdc9e44 87
gertk 0:ca7defdc9e44 88 le = (dy << 1) - dx;
gertk 0:ca7defdc9e44 89
gertk 0:ca7defdc9e44 90 for (li=0; li<=dx; li++) {
gertk 0:ca7defdc9e44 91 if (steep) {
gertk 0:ca7defdc9e44 92 vga_plot(x0,y0,color);
gertk 0:ca7defdc9e44 93 } else {
gertk 0:ca7defdc9e44 94 vga_plot(y0,x0,color);
gertk 0:ca7defdc9e44 95 }
gertk 0:ca7defdc9e44 96 while (le >= 0) {
gertk 0:ca7defdc9e44 97 y0 += sy;
gertk 0:ca7defdc9e44 98 le -= (dx << 1);
gertk 0:ca7defdc9e44 99 }
gertk 0:ca7defdc9e44 100 x0 += sx;
gertk 0:ca7defdc9e44 101 le += (dy << 1);
gertk 0:ca7defdc9e44 102 }
gertk 0:ca7defdc9e44 103 }
gertk 0:ca7defdc9e44 104
gertk 0:ca7defdc9e44 105 // draw an outline box
gertk 0:ca7defdc9e44 106 void vga_box(int x0, int y0, int x1, int y1,char color) {
gertk 0:ca7defdc9e44 107 vga_line(x0,y0,x1,y0,color);
gertk 0:ca7defdc9e44 108 vga_line(x1,y0,x1,y1,color);
gertk 0:ca7defdc9e44 109 vga_line(x1,y1,x0,y1,color);
gertk 0:ca7defdc9e44 110 vga_line(x0,y1,x0,y0,color);
gertk 0:ca7defdc9e44 111 }
gertk 0:ca7defdc9e44 112
gertk 0:ca7defdc9e44 113 // draw a filled box
gertk 0:ca7defdc9e44 114 void vga_filledbox(int x0, int y0, int x1, int y1,char color) {
gertk 0:ca7defdc9e44 115 int n,dn;
gertk 0:ca7defdc9e44 116
gertk 0:ca7defdc9e44 117 if (y1>y0) dn=1;
gertk 0:ca7defdc9e44 118 else dn=-1;
gertk 0:ca7defdc9e44 119
gertk 0:ca7defdc9e44 120 for (n=abs(y1-y0); n>=0; n--) {
gertk 0:ca7defdc9e44 121 vga_line(x0,y0,x1,y0,color);
gertk 0:ca7defdc9e44 122 y0+=dn;
gertk 0:ca7defdc9e44 123 }
gertk 0:ca7defdc9e44 124 }
gertk 0:ca7defdc9e44 125
gertk 0:ca7defdc9e44 126 // Bresenham circle routine
gertk 0:ca7defdc9e44 127 void vga_circle(int x0,int y0, int radius, char color) {
gertk 0:ca7defdc9e44 128
gertk 0:ca7defdc9e44 129 int cf = 1 - radius;
gertk 0:ca7defdc9e44 130 int dx = 1;
gertk 0:ca7defdc9e44 131 int dy = -2 * radius;
gertk 0:ca7defdc9e44 132 int cx = 0;
gertk 0:ca7defdc9e44 133 int py = radius;
gertk 0:ca7defdc9e44 134
gertk 0:ca7defdc9e44 135 vga_plot(x0, y0 + radius,color);
gertk 0:ca7defdc9e44 136 vga_plot(x0, y0 - radius,color);
gertk 0:ca7defdc9e44 137 vga_plot(x0 + radius, y0,color);
gertk 0:ca7defdc9e44 138 vga_plot(x0 - radius, y0,color);
gertk 0:ca7defdc9e44 139
gertk 0:ca7defdc9e44 140 while (cx < py) {
gertk 0:ca7defdc9e44 141 if (cf >= 0) {
gertk 0:ca7defdc9e44 142 py--;
gertk 0:ca7defdc9e44 143 dy += 2;
gertk 0:ca7defdc9e44 144 cf += dy;
gertk 0:ca7defdc9e44 145 }
gertk 0:ca7defdc9e44 146 cx++;
gertk 0:ca7defdc9e44 147 dx += 2;
gertk 0:ca7defdc9e44 148 cf += dx;
gertk 0:ca7defdc9e44 149 vga_plot(x0 + cx, y0 + py,color);
gertk 0:ca7defdc9e44 150 vga_plot(x0 - cx, y0 + py,color);
gertk 0:ca7defdc9e44 151 vga_plot(x0 + cx, y0 - py,color);
gertk 0:ca7defdc9e44 152 vga_plot(x0 - cx, y0 - py,color);
gertk 0:ca7defdc9e44 153 vga_plot(x0 + py, y0 + cx,color);
gertk 0:ca7defdc9e44 154 vga_plot(x0 - py, y0 + cx,color);
gertk 0:ca7defdc9e44 155 vga_plot(x0 + py, y0 - cx,color);
gertk 0:ca7defdc9e44 156 vga_plot(x0 - py, y0 - cx,color);
gertk 0:ca7defdc9e44 157 }
gertk 0:ca7defdc9e44 158 }