VGA 640x480 full graphic driver
Dependents: vga640x480graphic gps_fastlib Chua-VGA Wolfram-1D-VGA ... more
Diff: vga640x480g_functions.h
- Revision:
- 0:821e34a87609
diff -r 000000000000 -r 821e34a87609 vga640x480g_functions.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/vga640x480g_functions.h Wed Jul 27 19:43:07 2011 +0000 @@ -0,0 +1,171 @@ +#include "vga_font.h" +#define FRAMEBUFFERMAX 32000 +#define EXTENSIONMAX 6400 +#define VGA_HEIGHT 400 +#define VGA_WIDTH 640 +#include "mbed.h" + +extern unsigned char *framebuffer; +extern unsigned char *framebuffer2; + +static const unsigned char rmask[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; +static const unsigned char smask[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; + +// clear the screen +void vga_cls() { + memset(framebuffer,0,FRAMEBUFFERMAX); + memset(framebuffer2,0,EXTENSIONMAX); +} + +// scroll the screen one text line up +void vga_scroll() { + // move first part up + memcpy(framebuffer,framebuffer+(FONTHEIGHT*80),FRAMEBUFFERMAX-80*(FONTHEIGHT)); + // copy top line of second part into bottom of first part + memcpy(framebuffer+FRAMEBUFFERMAX-80*(FONTHEIGHT),framebuffer2,FONTHEIGHT*80); + // move bottom part up + memcpy(framebuffer2,framebuffer2+(FONTHEIGHT*80),EXTENSIONMAX-80*(FONTHEIGHT)); + // clear bottom row of second part + memset(framebuffer2+EXTENSIONMAX-80*(FONTHEIGHT),0,FONTHEIGHT*80); +} + +// set or reset a single pixel on screen +void vga_plot(int x,int y,char color) { + unsigned char *ad; + + ad=framebuffer+80*y+((x/8)^1); // calculate offset + if (ad>=framebuffer+FRAMEBUFFERMAX) { // first test for end of framebuffer + ad=framebuffer2+80*(y-400)+((x/8)^1); // calculate offset in framebuffer2 + if (ad>framebuffer2+EXTENSIONMAX) return; // clip if exceeded + } + *ad &= rmask[x%8]; // clear the bit + if (color) *ad |= smask[x%8]; // if color != 0 set the bit + +} + +// put a character from the vga font on screen +void vga_putchar(int x,int y,int ch, char color) { + int n,m; + for (n=0; n<FONTHEIGHT; n++) { + for (m=0; m<FONTWIDTH; m++) { + if (vga_font8x16[ch*FONTHEIGHT+n] & (1<<(7-m))) vga_plot(x+m,y+n, color); + else vga_plot(x+m,y+n,0); + } + } +} + +// put a string on screen +void vga_putstring(int x,int y, char *s, char color) { + while (*s) { + vga_putchar(x,y,*(s++),color); + x+=FONTWIDTH; + } +} + +// Bresenham line routine +void vga_line(int x0, int y0, int x1, int y1,char color) { + + char steep=1; + int li,dx,dy,le; + int sx,sy; + + // if same coordinates + if (x0==x1 && y0==y1) { + vga_plot(x0,y0,color); + return; + } + + dx = abs(x1-x0); + sx = ((x1 - x0) >0) ? 1 : -1; + dy=abs(y1-y0); + sy = ((y1 - y0) >0) ? 1 : -1; + + if (dy > dx) { + steep=0; + // swap X0 and Y0 + x0=x0 ^ y0; + y0=x0 ^ y0; + x0=x0 ^ y0; + + // swap DX and DY + dx=dx ^ dy; + dy=dx ^ dy; + dx=dx ^ dy; + + // swap SX and SY + sx=sx ^ sy; + sy=sx ^ sy; + sx=sx ^ sy; + } + + le = (dy << 1) - dx; + + for (li=0; li<=dx; li++) { + if (steep) { + vga_plot(x0,y0,color); + } else { + vga_plot(y0,x0,color); + } + while (le >= 0) { + y0 += sy; + le -= (dx << 1); + } + x0 += sx; + le += (dy << 1); + } +} + +// draw an outline box +void vga_box(int x0, int y0, int x1, int y1,char color) { + vga_line(x0,y0,x1,y0,color); + vga_line(x1,y0,x1,y1,color); + vga_line(x1,y1,x0,y1,color); + vga_line(x0,y1,x0,y0,color); +} + +// draw a filled box +void vga_filledbox(int x0, int y0, int x1, int y1,char color) { + int n,dn; + + if (y1>y0) dn=1; + else dn=-1; + + for (n=abs(y1-y0); n>=0; n--) { + vga_line(x0,y0,x1,y0,color); + y0+=dn; + } +} + +// Bresenham circle routine +void vga_circle(int x0,int y0, int radius, char color) { + + int cf = 1 - radius; + int dx = 1; + int dy = -2 * radius; + int cx = 0; + int py = radius; + + vga_plot(x0, y0 + radius,color); + vga_plot(x0, y0 - radius,color); + vga_plot(x0 + radius, y0,color); + vga_plot(x0 - radius, y0,color); + + while (cx < py) { + if (cf >= 0) { + py--; + dy += 2; + cf += dy; + } + cx++; + dx += 2; + cf += dx; + vga_plot(x0 + cx, y0 + py,color); + vga_plot(x0 - cx, y0 + py,color); + vga_plot(x0 + cx, y0 - py,color); + vga_plot(x0 - cx, y0 - py,color); + vga_plot(x0 + py, y0 + cx,color); + vga_plot(x0 - py, y0 + cx,color); + vga_plot(x0 + py, y0 - cx,color); + vga_plot(x0 - py, y0 - cx,color); + } +}