summaryrefslogtreecommitdiff
path: root/source/framebuffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/framebuffer.c')
-rw-r--r--source/framebuffer.c193
1 files changed, 139 insertions, 54 deletions
diff --git a/source/framebuffer.c b/source/framebuffer.c
index 691862e..6d16529 100644
--- a/source/framebuffer.c
+++ b/source/framebuffer.c
@@ -25,12 +25,16 @@
#include <stdarg.h>
#include <string.h>
+#include "framebuffer.h"
+
/* ---------------------------------------- STATIC DATA
*/
#define WIDTH 256
+#define SCAN 128
#define HEIGHT 192
-static uint16 *buff=0;
+static uint16 *buff;
+static uint16 *pal;
static uint8 font[]=
{
@@ -132,60 +136,138 @@ static uint8 font[]=
0x3c, 0x42, 0x99, 0x85, 0x85, 0x99, 0x42, 0x3c
};
+
+/* ---------------------------------------- PRIVATE INTERFACES
+*/
+static inline void Plot(int x, int y, int col)
+{
+ uint16 *base;
+ uint16 cur;
+ int odd;
+
+ if (col == -1)
+ return;
+
+ odd = x&1;
+ x /= 2;
+
+ base = buff+x+y*SCAN;
+ cur = *base;
+
+ if (odd)
+ {
+ cur = (cur & 0xff) | (col<<8);
+ }
+ else
+ {
+ cur = (cur & 0xff00) | col;
+ }
+
+ *base = cur;
+}
+
+
/* ---------------------------------------- PUBLIC INTERFACES
*/
-void FB_Init(uint16 *vram)
+void FB_Init(uint16 *vram, uint16 *palette)
{
- buff=vram;
+ buff = vram;
+ pal = palette;
+
+ pal[COL_BLACK] = RGB15(0,0,0);
+ pal[COL_WHITE] = RGB15(31,31,31);
+ pal[COL_RED] = RGB15(31,0,0);
+ pal[COL_GREEN] = RGB15(0,31,0);
+ pal[COL_BLUE] = RGB15(0,0,31);
+ pal[COL_GUISELECT] = RGB15(8,8,31);
+ pal[COL_GREY] = RGB15(15,15,15);
+ pal[COL_LIGHTGREY] = RGB15(22,22,22);
+ pal[COL_DARKGREY] = RGB15(8,8,8);
+ pal[COL_YELLOW] = RGB15(31,31,0);
}
-void FB_Print(const char *text, int x, int y, int colour, int paper)
+void FB_LoadASCIITiles(uint16 *tiles)
{
- uint16 *base;
+ uint8 *src;
+ int c;
+ int row;
+ int val;
+ int mask;
- base=buff+y*WIDTH+x;
+ src = font;
- while(*text)
+ for(c = 32; c < 127; c++)
{
- int x,y;
- int ch;
+ for(row = 0; row < 8; row++)
+ {
+ for(mask = 1; mask < 0xff; mask<<=1)
+ {
+ if (*src & mask)
+ {
+ val = COL_WHITE;
+ }
+ else
+ {
+ val = 0;
+ }
+
+ mask <<= 1;
+
+ if (*src & mask)
+ {
+ val |= COL_WHITE << 8;
+ }
+
+ *tiles++ = val;
+ }
+
+ src++;
+ }
+ }
+}
+
+void FB_Print(const char *text, int x, int y, FB_Colour colour, FB_Colour paper)
+{
+ int cx,cy;
+ int ch;
+
+ while(*text)
+ {
ch=((*text)-32)*8;
- for(y=0;y<8;y++)
+ for(cy=0;cy<8;cy++)
{
- for(x=0;x<8;x++)
+ for(cx=0;cx<8;cx++)
{
- if (font[ch]&(1<<x))
+ if (font[ch]&(1<<cx))
{
- *(base+x+y*WIDTH)=colour;
+ Plot(x+cx, y+cy, colour);
}
else
{
- if (paper!=-1)
- {
- *(base+x+y*WIDTH)=paper;
- }
+ Plot(x+cx, y+cy, paper);
}
}
ch++;
}
- base+=8;
+ x+=8;
text++;
}
}
-void FB_Centre(const char *text, int y, int colour, int paper)
+void FB_Centre(const char *text, int y, FB_Colour colour, FB_Colour paper)
{
FB_Print(text,WIDTH/2-strlen(text)*4,y,colour,paper);
}
-void FB_printf(int x, int y, int colour, int paper, const char *format, ...)
+void FB_printf(int x, int y, FB_Colour colour, FB_Colour paper,
+ const char *format, ...)
{
char buff[80];
va_list va;
@@ -198,7 +280,7 @@ void FB_printf(int x, int y, int colour, int paper, const char *format, ...)
}
-void FB_HLine(int x1, int x2, int y, int colour)
+void FB_HLine(int x1, int x2, int y, FB_Colour colour)
{
uint16 *line;
@@ -206,28 +288,21 @@ void FB_HLine(int x1, int x2, int y, int colour)
while(x1<=x2)
{
- *line++=colour;
- x1++;
+ Plot(x1++,y,colour);
}
}
-void FB_VLine(int x, int y1, int y2, int colour)
+void FB_VLine(int x, int y1, int y2, FB_Colour colour)
{
- uint16 *line;
-
- line=buff+y1*WIDTH+x;
-
while(y1<=y2)
{
- *line=colour;
- line+=WIDTH;
- y1++;
+ Plot(x,y1++,colour);
}
}
-void FB_Box(int x, int y, int w, int h, int colour)
+void FB_Box(int x, int y, int w, int h, FB_Colour colour)
{
FB_HLine(x,x+w-1,y,colour);
FB_HLine(x,x+w-1,y+h-1,colour);
@@ -236,21 +311,11 @@ void FB_Box(int x, int y, int w, int h, int colour)
}
-void FB_FillBox(int x, int y, int w, int h, int colour)
+void FB_FillBox(int x, int y, int w, int h, FB_Colour colour)
{
- int f;
- uint16 *base;
-
- base=buff+x+y*WIDTH;
-
while(h--)
{
- for(f=0;f<w;f++)
- {
- *(base+f)=colour;
- }
-
- base+=WIDTH;
+ FB_HLine(x,x+w-1,y++,colour);
}
}
@@ -260,30 +325,50 @@ void FB_Clear(void)
uint16 *p;
int f;
- f=WIDTH*HEIGHT;
+ f=WIDTH*HEIGHT/2;
p=buff;
while(f--)
{
- *p++=0x8000;
+ *p++=0;
}
}
-void FB_Blit(sImage *img, int x, int y)
+void FB_Blit(sImage *img, int x, int y, int offset)
{
- if (img->width==WIDTH && img->height==HEIGHT)
+ uint16 *dest;
+ uint16 *row;
+ uint8 *src;
+ uint16 pix;
+ int hww;
+ int ht;
+ int f;
+
+ x /= 2;
+
+ ht = img->height;
+ hww = img->width / 2;
+ dest = buff+x+y*SCAN;
+ src = img->image.data8;
+
+ for(f=0;f<16;f++)
{
- dmaCopy(img->image.data8,buff,SCREEN_WIDTH*SCREEN_HEIGHT*2);
+ pal[offset+f] = img->palette[f];
}
- else
+
+ while(ht--)
{
- int f;
+ row = dest;
- for(f=0;f<img->height;f++)
+ for(f=0;f<hww;f++)
{
- dmaCopy(img->image.data16+(f*img->width),
- buff+x+(y+f)*WIDTH,img->width*2);
+ pix = *src++ + offset;
+ pix |= (*src++ + offset) << 8;
+
+ *row++ = pix;
}
+
+ dest += SCAN;
}
}