Full graphic 640x400 monochrome VGA driver library
vga640x400g_functions.h@0:ca7defdc9e44, 2011-07-24 (annotated)
- Committer:
- gertk
- Date:
- Sun Jul 24 11:53:05 2011 +0000
- Revision:
- 0:ca7defdc9e44
version 0.1
Who changed what in which revision?
User | Revision | Line number | New 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 | } |