mirror of
https://git.code.sf.net/p/newrpl/sources
synced 2024-09-29 17:36:57 +02:00
Added color graphics library (breaks build of Desktop).
A few USB driver fixes - still not working.
This commit is contained in:
parent
ee3e6ed3ca
commit
12647140d1
34 changed files with 1343 additions and 54 deletions
67
firmware/ggl/cgl/cgl_bitblt.c
Normal file
67
firmware/ggl/cgl/cgl_bitblt.c
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
void ggl_bitblt(gglsurface * dest, gglsurface * src, int width, int height)
|
||||||
|
{
|
||||||
|
|
||||||
|
// COPIES A RECTANGULAR REGION FROM src TO dest
|
||||||
|
// gglsurface CONTAINS THE BUFFER AND OFFSETS
|
||||||
|
// width AND height ARE THE SIZE OF THE BLOCK TO MOVE
|
||||||
|
|
||||||
|
// RESTRICTIONS: NO SAFETY CHECKS REGARDING MEMORY MOVEMENTS
|
||||||
|
|
||||||
|
int doff, soff, line;
|
||||||
|
|
||||||
|
doff = dest->y * dest->width + dest->x;
|
||||||
|
soff = src->y * src->width + src->x;
|
||||||
|
|
||||||
|
for(line = 0; line < height; ++line) {
|
||||||
|
ggl_hblt(dest->addr, doff, src->addr, soff, width);
|
||||||
|
doff += dest->width;
|
||||||
|
soff += src->width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ggl_bitbltclip(gglsurface * dest, gglsurface * src, int width, int height)
|
||||||
|
{
|
||||||
|
// SOURCE CLIPPING FIRST - REDUNDANT
|
||||||
|
/*
|
||||||
|
if(src->x+width<0) return;
|
||||||
|
if(src->x>=src->width) return;
|
||||||
|
if(src->y+height<0) return;
|
||||||
|
if(src->y>=src->height) return;
|
||||||
|
if(src->x<0) { dest->x-=src->x; width+=src->x; src->x=0; }
|
||||||
|
if(src->y<0) { dest->y-=src->y; height+=src->y; src->y=0; }
|
||||||
|
if(src->x+width>src->width) { width=src->width-src->x; }
|
||||||
|
*/
|
||||||
|
|
||||||
|
// DESTINATION CLIPPING ONLY
|
||||||
|
if(dest->x > dest->clipx2)
|
||||||
|
return;
|
||||||
|
if(dest->y > dest->clipy2)
|
||||||
|
return;
|
||||||
|
if(dest->x + width < dest->clipx)
|
||||||
|
return;
|
||||||
|
if(dest->y + height < dest->clipy)
|
||||||
|
return;
|
||||||
|
if(dest->x < dest->clipx)
|
||||||
|
dest->x = dest->clipx;
|
||||||
|
if(dest->x + width > dest->clipx2)
|
||||||
|
width = dest->clipx2 - dest->x + 1;
|
||||||
|
if(dest->y < dest->clipy) {
|
||||||
|
src->y += dest->clipy - dest->y;
|
||||||
|
height -= dest->clipy - dest->y;
|
||||||
|
dest->y = dest->clipy;
|
||||||
|
}
|
||||||
|
if(dest->y + height > dest->clipy2)
|
||||||
|
height = dest->clipy2 - dest->y + 1;
|
||||||
|
|
||||||
|
ggl_bitblt(dest, src, width, height);
|
||||||
|
|
||||||
|
}
|
54
firmware/ggl/cgl/cgl_bitbltoper.c
Normal file
54
firmware/ggl/cgl/cgl_bitbltoper.c
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
void ggl_bitbltoper(gglsurface * dest, gglsurface * src, int width, int height,
|
||||||
|
int param, ggloperator fop)
|
||||||
|
{
|
||||||
|
|
||||||
|
// COPIES A RECTANGULAR REGION FROM src TO dest AND APPLIES THE GIVEN OPERATOR
|
||||||
|
// gglsurface CONTAINS THE BUFFER AND OFFSETS
|
||||||
|
// width AND height ARE THE SIZE OF THE BLOCK TO MOVE
|
||||||
|
|
||||||
|
// RESTRICTIONS: NO SAFETY CHECKS REGARDING MEMORY MOVEMENTS
|
||||||
|
|
||||||
|
int doff, soff, line;
|
||||||
|
|
||||||
|
doff = dest->y * dest->width + dest->x;
|
||||||
|
soff = src->y * src->width + src->x;
|
||||||
|
|
||||||
|
for(line = 0; line < height; ++line) {
|
||||||
|
ggl_hbltoper(dest->addr, doff, src->addr, soff, width, param, fop);
|
||||||
|
doff += dest->width;
|
||||||
|
soff += src->width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ggl_monobitbltoper(gglsurface * dest, gglsurface * src, int width,
|
||||||
|
int height, int param, ggloperator fop)
|
||||||
|
{
|
||||||
|
|
||||||
|
// COPIES A RECTANGULAR REGION FROM src TO dest AND APPLIES THE GIVEN OPERATOR
|
||||||
|
// src POINTS TO A MONOCHROME BITMAP, NOT GRAYSCALE
|
||||||
|
// gglsurface CONTAINS THE BUFFER AND OFFSETS
|
||||||
|
// width AND height ARE THE SIZE OF THE BLOCK TO MOVE
|
||||||
|
|
||||||
|
// RESTRICTIONS: NO SAFETY CHECKS REGARDING MEMORY MOVEMENTS
|
||||||
|
|
||||||
|
int doff, soff, line;
|
||||||
|
|
||||||
|
doff = dest->y * dest->width + dest->x;
|
||||||
|
soff = src->y * src->width + src->x;
|
||||||
|
|
||||||
|
for(line = 0; line < height; ++line) {
|
||||||
|
ggl_monohbltoper(dest->addr, doff, (unsigned char *)(src->addr), soff,
|
||||||
|
width, param, fop);
|
||||||
|
doff += dest->width;
|
||||||
|
soff += src->width;
|
||||||
|
}
|
||||||
|
}
|
28
firmware/ggl/cgl/cgl_filter.c
Normal file
28
firmware/ggl/cgl/cgl_filter.c
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
void ggl_filter(gglsurface * dest, int width, int height, int param,
|
||||||
|
gglfilter filterfunc)
|
||||||
|
{
|
||||||
|
|
||||||
|
// FILTERS A RECTANGULAR REGION FROM src TO dest
|
||||||
|
// gglsurface CONTAINS THE BUFFER AND OFFSETS
|
||||||
|
// width AND height ARE THE SIZE OF THE BLOCK TO MOVE
|
||||||
|
|
||||||
|
// RESTRICTIONS: NO SAFETY CHECKS REGARDING MEMORY MOVEMENTS
|
||||||
|
|
||||||
|
int doff, line;
|
||||||
|
|
||||||
|
doff = dest->y * dest->width + dest->x;
|
||||||
|
|
||||||
|
for(line = 0; line < height; ++line) {
|
||||||
|
ggl_hbltfilter(dest->addr, doff, width, param, filterfunc);
|
||||||
|
doff += dest->width;
|
||||||
|
}
|
||||||
|
}
|
24
firmware/ggl/cgl/cgl_fltdarken.c
Normal file
24
firmware/ggl/cgl/cgl_fltdarken.c
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
unsigned ggl_fltdarken(unsigned word, int param)
|
||||||
|
{
|
||||||
|
register int f;
|
||||||
|
register unsigned int res = 0;
|
||||||
|
for(f = 0; f < 8; ++f, word >>= 4) {
|
||||||
|
// filter the pixel here
|
||||||
|
if(((word & 0xf) + param) >= 0xf)
|
||||||
|
res |= 0xf;
|
||||||
|
else
|
||||||
|
res |= (word & 0xf) + param;
|
||||||
|
|
||||||
|
res = (res >> 4) | (res << 28);
|
||||||
|
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
23
firmware/ggl/cgl/cgl_fltinvert.c
Normal file
23
firmware/ggl/cgl/cgl_fltinvert.c
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
unsigned int ggl_fltinvert(unsigned word, int param)
|
||||||
|
{
|
||||||
|
(void)param; // THIS IS JUST TO SILENCE THE UNUSED ARGUMENT WARNING
|
||||||
|
|
||||||
|
register int f;
|
||||||
|
register unsigned int res = 0;
|
||||||
|
for(f = 0; f < 8; ++f, word >>= 4) {
|
||||||
|
// filter the pixel here
|
||||||
|
res |= 0xf - (word & 0xf);
|
||||||
|
|
||||||
|
res = (res >> 4) | (res << 28);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
22
firmware/ggl/cgl/cgl_fltlighten.c
Normal file
22
firmware/ggl/cgl/cgl_fltlighten.c
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
unsigned int ggl_fltlighten(unsigned word, int param)
|
||||||
|
{
|
||||||
|
register int f;
|
||||||
|
register unsigned int res = 0;
|
||||||
|
for(f = 0; f < 8; ++f, word >>= 4) {
|
||||||
|
// filter the pixel here
|
||||||
|
if((word & 0xf) > (unsigned)param)
|
||||||
|
res |= (word & 0xf) - param;
|
||||||
|
|
||||||
|
res = (res >> 4) | (res << 28);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
25
firmware/ggl/cgl/cgl_fltreplace.c
Normal file
25
firmware/ggl/cgl/cgl_fltreplace.c
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
// param = 0xMN where M is the color to replace, N is the color to replace with.
|
||||||
|
unsigned ggl_fltreplace(unsigned word, int param)
|
||||||
|
{
|
||||||
|
register int f;
|
||||||
|
register unsigned int res = 0;
|
||||||
|
for(f = 0; f < 8; ++f, word >>= 4) {
|
||||||
|
// filter the pixel here
|
||||||
|
if(((word & 0xf) == ((param >> 4) & 0xf)))
|
||||||
|
res |= (param & 0xf);
|
||||||
|
else
|
||||||
|
res |= (word & 0xf);
|
||||||
|
|
||||||
|
res = (res >> 4) | (res << 28);
|
||||||
|
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
23
firmware/ggl/cgl/cgl_getnib.c
Normal file
23
firmware/ggl/cgl/cgl_getnib.c
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
int ggl_getnib(int *buf, int addr)
|
||||||
|
{
|
||||||
|
register char *ptr = ((char *)buf) + (addr >> 1);
|
||||||
|
register int a = (int)(*ptr);
|
||||||
|
if(addr & 1)
|
||||||
|
a >>= 4;
|
||||||
|
return a & 0xf;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ggl_getmonopix(char *buf, int addr)
|
||||||
|
{
|
||||||
|
register char *ptr = ((char *)buf) + (addr >> 3);
|
||||||
|
return (*ptr & (1 << (addr & 7))) ? 1 : 0;
|
||||||
|
}
|
244
firmware/ggl/cgl/cgl_hblitoper.c
Normal file
244
firmware/ggl/cgl/cgl_hblitoper.c
Normal file
|
@ -0,0 +1,244 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
void ggl_hbltoper(int *dest, int destoff, int *src, int srcoff, int npixels,
|
||||||
|
int param, ggloperator foperator)
|
||||||
|
{
|
||||||
|
|
||||||
|
// SAME AS hblt BUT THIS ONE APPLIES AN ARBITRARY OPERATOR BETWEEN 2 SURFACES
|
||||||
|
// COPIES npixels NIBBLES FROM src TO dest
|
||||||
|
// dest AND src ARE WORD ALIGNED ADDRESSES
|
||||||
|
// destoff AND srcoff ARE OFFSETS IN NIBBLES (PIXELS) FROM dest AND src
|
||||||
|
// tcolor INDICATES WHICH OF THE 16 COLORS IS TRANSPARENT
|
||||||
|
// RESTRICTIONS:
|
||||||
|
// npixels<=512 (NO CHECKS MADE HERE)
|
||||||
|
|
||||||
|
while(npixels > 504) {
|
||||||
|
ggl_hbltoper(dest, destoff, src, srcoff, 504, param, foperator);
|
||||||
|
npixels -= 504;
|
||||||
|
destoff += 504;
|
||||||
|
srcoff += 504;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tempmem[HBLT_BUFFER];
|
||||||
|
|
||||||
|
// CALCULATE ROTATION
|
||||||
|
int rot = ((srcoff & 7) - (destoff & 7)) * 4;
|
||||||
|
unsigned a, b = 0;
|
||||||
|
int *ptr = tempmem, *start = src + (srcoff >> 3), *end =
|
||||||
|
src + ((srcoff + npixels - 1) >> 3);
|
||||||
|
|
||||||
|
// FIRST STAGE: COPY AND ROTATION
|
||||||
|
|
||||||
|
++end;
|
||||||
|
if(rot < 0) {
|
||||||
|
// ROTATION RIGHT
|
||||||
|
rot = -rot;
|
||||||
|
while(start <= end) {
|
||||||
|
a = *start;
|
||||||
|
*ptr = (a << rot) | (b >> (32 - rot));
|
||||||
|
b = a;
|
||||||
|
++ptr;
|
||||||
|
++start;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(rot > 0) {
|
||||||
|
// ROTATION LEFT
|
||||||
|
b = *start;
|
||||||
|
++start;
|
||||||
|
while(start <= end) {
|
||||||
|
a = *start;
|
||||||
|
*ptr = (b >> rot) | (a << (32 - rot));
|
||||||
|
b = a;
|
||||||
|
++ptr;
|
||||||
|
++start;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// ROTATION IS ZERO, JUST COPY
|
||||||
|
while(start <= end) {
|
||||||
|
*ptr = *start;
|
||||||
|
++ptr;
|
||||||
|
++start;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SECOND STAGE: MASK AND UPDATE
|
||||||
|
|
||||||
|
int ml = ggl_leftmask(destoff), mr = ggl_rightmask(destoff + npixels - 1);
|
||||||
|
ptr = tempmem;
|
||||||
|
start = dest + (destoff >> 3);
|
||||||
|
end = dest + ((destoff + npixels - 1) >> 3);
|
||||||
|
|
||||||
|
if(start == end) {
|
||||||
|
// single word operation
|
||||||
|
ml |= mr;
|
||||||
|
*start = (*start & ml) | (((*foperator) (*start, *ptr, param)) & (~ml));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*start = (*start & ml) | (((*foperator) (*start, *ptr, param)) & (~ml));
|
||||||
|
++start;
|
||||||
|
++ptr;
|
||||||
|
|
||||||
|
while(start != end) {
|
||||||
|
*start = (*foperator) (*start, *ptr, param);
|
||||||
|
++start;
|
||||||
|
++ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
*start = (*start & mr) | (((*foperator) (*start, *ptr, param)) & (~mr));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// TABLE TO EXPAND MONOCHROME BITMAP TO 16-GRAYS
|
||||||
|
|
||||||
|
const unsigned int const ggl_mono2gray[256] = {
|
||||||
|
0x0,
|
||||||
|
0xF, 0xF0, 0xFF, 0xF00, 0xF0F, 0xFF0, 0xFFF, 0xF000, 0xF00F, 0xF0F0, 0xF0FF,
|
||||||
|
0xFF00, 0xFF0F, 0xFFF0, 0xFFFF, 0xF0000,
|
||||||
|
0xF000F, 0xF00F0, 0xF00FF, 0xF0F00, 0xF0F0F, 0xF0FF0, 0xF0FFF, 0xFF000,
|
||||||
|
0xFF00F, 0xFF0F0, 0xFF0FF, 0xFFF00, 0xFFF0F, 0xFFFF0, 0xFFFFF,
|
||||||
|
0xF00000,
|
||||||
|
0xF0000F, 0xF000F0, 0xF000FF, 0xF00F00, 0xF00F0F, 0xF00FF0, 0xF00FFF,
|
||||||
|
0xF0F000, 0xF0F00F, 0xF0F0F0, 0xF0F0FF, 0xF0FF00, 0xF0FF0F,
|
||||||
|
0xF0FFF0, 0xF0FFFF, 0xFF0000,
|
||||||
|
0xFF000F, 0xFF00F0, 0xFF00FF, 0xFF0F00, 0xFF0F0F, 0xFF0FF0, 0xFF0FFF,
|
||||||
|
0xFFF000, 0xFFF00F, 0xFFF0F0, 0xFFF0FF, 0xFFFF00, 0xFFFF0F,
|
||||||
|
0xFFFFF0, 0xFFFFFF, 0xF000000,
|
||||||
|
0xF00000F, 0xF0000F0, 0xF0000FF, 0xF000F00, 0xF000F0F, 0xF000FF0, 0xF000FFF,
|
||||||
|
0xF00F000, 0xF00F00F, 0xF00F0F0, 0xF00F0FF, 0xF00FF00, 0xF00FF0F,
|
||||||
|
0xF00FFF0, 0xF00FFFF, 0xF0F0000,
|
||||||
|
0xF0F000F, 0xF0F00F0, 0xF0F00FF, 0xF0F0F00, 0xF0F0F0F, 0xF0F0FF0, 0xF0F0FFF,
|
||||||
|
0xF0FF000, 0xF0FF00F, 0xF0FF0F0, 0xF0FF0FF, 0xF0FFF00, 0xF0FFF0F,
|
||||||
|
0xF0FFFF0, 0xF0FFFFF, 0xFF00000,
|
||||||
|
0xFF0000F, 0xFF000F0, 0xFF000FF, 0xFF00F00, 0xFF00F0F, 0xFF00FF0, 0xFF00FFF,
|
||||||
|
0xFF0F000, 0xFF0F00F, 0xFF0F0F0, 0xFF0F0FF, 0xFF0FF00, 0xFF0FF0F,
|
||||||
|
0xFF0FFF0, 0xFF0FFFF, 0xFFF0000,
|
||||||
|
0xFFF000F, 0xFFF00F0, 0xFFF00FF, 0xFFF0F00, 0xFFF0F0F, 0xFFF0FF0, 0xFFF0FFF,
|
||||||
|
0xFFFF000, 0xFFFF00F, 0xFFFF0F0, 0xFFFF0FF, 0xFFFFF00, 0xFFFFF0F,
|
||||||
|
0xFFFFFF0, 0xFFFFFFF, 0xF0000000,
|
||||||
|
0xF000000F, 0xF00000F0, 0xF00000FF, 0xF0000F00, 0xF0000F0F, 0xF0000FF0,
|
||||||
|
0xF0000FFF, 0xF000F000, 0xF000F00F, 0xF000F0F0, 0xF000F0FF,
|
||||||
|
0xF000FF00, 0xF000FF0F, 0xF000FFF0, 0xF000FFFF, 0xF00F0000,
|
||||||
|
0xF00F000F, 0xF00F00F0, 0xF00F00FF, 0xF00F0F00, 0xF00F0F0F, 0xF00F0FF0,
|
||||||
|
0xF00F0FFF, 0xF00FF000, 0xF00FF00F, 0xF00FF0F0, 0xF00FF0FF,
|
||||||
|
0xF00FFF00, 0xF00FFF0F, 0xF00FFFF0, 0xF00FFFFF, 0xF0F00000,
|
||||||
|
0xF0F0000F, 0xF0F000F0, 0xF0F000FF, 0xF0F00F00, 0xF0F00F0F, 0xF0F00FF0,
|
||||||
|
0xF0F00FFF, 0xF0F0F000, 0xF0F0F00F, 0xF0F0F0F0, 0xF0F0F0FF,
|
||||||
|
0xF0F0FF00, 0xF0F0FF0F, 0xF0F0FFF0, 0xF0F0FFFF, 0xF0FF0000,
|
||||||
|
0xF0FF000F, 0xF0FF00F0, 0xF0FF00FF, 0xF0FF0F00, 0xF0FF0F0F, 0xF0FF0FF0,
|
||||||
|
0xF0FF0FFF, 0xF0FFF000, 0xF0FFF00F, 0xF0FFF0F0, 0xF0FFF0FF,
|
||||||
|
0xF0FFFF00, 0xF0FFFF0F, 0xF0FFFFF0, 0xF0FFFFFF, 0xFF000000,
|
||||||
|
0xFF00000F, 0xFF0000F0, 0xFF0000FF, 0xFF000F00, 0xFF000F0F, 0xFF000FF0,
|
||||||
|
0xFF000FFF, 0xFF00F000, 0xFF00F00F, 0xFF00F0F0, 0xFF00F0FF,
|
||||||
|
0xFF00FF00, 0xFF00FF0F, 0xFF00FFF0, 0xFF00FFFF, 0xFF0F0000,
|
||||||
|
0xFF0F000F, 0xFF0F00F0, 0xFF0F00FF, 0xFF0F0F00, 0xFF0F0F0F, 0xFF0F0FF0,
|
||||||
|
0xFF0F0FFF, 0xFF0FF000, 0xFF0FF00F, 0xFF0FF0F0, 0xFF0FF0FF,
|
||||||
|
0xFF0FFF00, 0xFF0FFF0F, 0xFF0FFFF0, 0xFF0FFFFF, 0xFFF00000,
|
||||||
|
0xFFF0000F, 0xFFF000F0, 0xFFF000FF, 0xFFF00F00, 0xFFF00F0F, 0xFFF00FF0,
|
||||||
|
0xFFF00FFF, 0xFFF0F000, 0xFFF0F00F, 0xFFF0F0F0, 0xFFF0F0FF,
|
||||||
|
0xFFF0FF00, 0xFFF0FF0F, 0xFFF0FFF0, 0xFFF0FFFF, 0xFFFF0000,
|
||||||
|
0xFFFF000F, 0xFFFF00F0, 0xFFFF00FF, 0xFFFF0F00, 0xFFFF0F0F, 0xFFFF0FF0,
|
||||||
|
0xFFFF0FFF, 0xFFFFF000, 0xFFFFF00F, 0xFFFFF0F0, 0xFFFFF0FF,
|
||||||
|
0xFFFFFF00, 0xFFFFFF0F, 0xFFFFFFF0, 0xFFFFFFFF
|
||||||
|
};
|
||||||
|
|
||||||
|
void ggl_monohbltoper(int *dest, int destoff, unsigned char *src, int srcoff,
|
||||||
|
int npixels, int param, ggloperator foperator)
|
||||||
|
{
|
||||||
|
|
||||||
|
// SAME AS hbltoper BUT SOURCE BITMAP IS MONOCHROME, AND CONVERTED TO 16-GRAYS ON-THE-FLY
|
||||||
|
// COPIES npixels NIBBLES FROM src TO dest
|
||||||
|
// dest IS WORD ALIGNED ADDRESSES, src IS BYTE ALIGNED
|
||||||
|
// destoff AND srcoff ARE OFFSETS IN NIBBLES (PIXELS) FROM dest AND src
|
||||||
|
// tcolor INDICATES WHICH OF THE 16 COLORS IS TRANSPARENT
|
||||||
|
// RESTRICTIONS:
|
||||||
|
// npixels<=512 (NO CHECKS MADE HERE)
|
||||||
|
|
||||||
|
while(npixels > 504) {
|
||||||
|
ggl_monohbltoper(dest, destoff, src, srcoff, 504, param, foperator);
|
||||||
|
npixels -= 504;
|
||||||
|
destoff += 504;
|
||||||
|
srcoff += 504;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tempmem[HBLT_BUFFER];
|
||||||
|
|
||||||
|
// CALCULATE ROTATION
|
||||||
|
int rot = ((srcoff & 7) - (destoff & 7)) * 4;
|
||||||
|
unsigned a, b = 0;
|
||||||
|
int *ptr = tempmem, *dstart, *dend;
|
||||||
|
unsigned char *start = src + (srcoff >> 3), *end =
|
||||||
|
src + ((srcoff + npixels - 1) >> 3);
|
||||||
|
|
||||||
|
// FIRST STAGE: COPY AND ROTATION
|
||||||
|
|
||||||
|
++end;
|
||||||
|
if(rot < 0) {
|
||||||
|
// ROTATION RIGHT
|
||||||
|
rot = -rot;
|
||||||
|
while(start <= end) {
|
||||||
|
a = ggl_mono2gray[*start];
|
||||||
|
*ptr = (a << rot) | (b >> (32 - rot));
|
||||||
|
b = a;
|
||||||
|
++ptr;
|
||||||
|
++start;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(rot > 0) {
|
||||||
|
// ROTATION LEFT
|
||||||
|
b = ggl_mono2gray[*start];
|
||||||
|
++start;
|
||||||
|
while(start <= end) {
|
||||||
|
a = ggl_mono2gray[*start];
|
||||||
|
*ptr = (b >> rot) | (a << (32 - rot));
|
||||||
|
b = a;
|
||||||
|
++ptr;
|
||||||
|
++start;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// ROTATION IS ZERO, JUST COPY
|
||||||
|
while(start <= end) {
|
||||||
|
*ptr = ggl_mono2gray[*start];
|
||||||
|
++ptr;
|
||||||
|
++start;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SECOND STAGE: MASK AND UPDATE
|
||||||
|
|
||||||
|
int ml = ggl_leftmask(destoff), mr = ggl_rightmask(destoff + npixels - 1);
|
||||||
|
ptr = tempmem;
|
||||||
|
dstart = dest + (destoff >> 3);
|
||||||
|
dend = dest + ((destoff + npixels - 1) >> 3);
|
||||||
|
|
||||||
|
if(dstart == dend) {
|
||||||
|
// single word operation
|
||||||
|
ml |= mr;
|
||||||
|
*dstart =
|
||||||
|
(*dstart & ml) | (((*foperator) (*dstart, *ptr,
|
||||||
|
param)) & (~ml));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*dstart = (*dstart & ml) | (((*foperator) (*dstart, *ptr, param)) & (~ml));
|
||||||
|
++dstart;
|
||||||
|
++ptr;
|
||||||
|
|
||||||
|
while(dstart != dend) {
|
||||||
|
*dstart = (*foperator) (*dstart, *ptr, param);
|
||||||
|
++dstart;
|
||||||
|
++ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
*dstart = (*dstart & mr) | (((*foperator) (*dstart, *ptr, param)) & (~mr));
|
||||||
|
|
||||||
|
}
|
93
firmware/ggl/cgl/cgl_hblt.c
Normal file
93
firmware/ggl/cgl/cgl_hblt.c
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
void ggl_hblt(int *dest, int destoff, int *src, int srcoff, int npixels)
|
||||||
|
{
|
||||||
|
|
||||||
|
// COPIES npixels NIBBLES FROM src TO dest
|
||||||
|
// dest AND src ARE WORD ALIGNED ADDRESSES
|
||||||
|
// destoff AND srcoff ARE OFFSETS IN NIBBLES (PIXELS) FROM dest AND src
|
||||||
|
|
||||||
|
while(npixels > 504) {
|
||||||
|
ggl_hblt(dest, destoff, src, srcoff, 504);
|
||||||
|
npixels -= 504;
|
||||||
|
destoff += 504;
|
||||||
|
srcoff += 504;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tempmem[HBLT_BUFFER];
|
||||||
|
|
||||||
|
// CALCULATE ROTATION
|
||||||
|
int rot = ((srcoff & 7) - (destoff & 7)) * 4;
|
||||||
|
unsigned a, b = 0;
|
||||||
|
int *ptr = tempmem, *start = src + (srcoff >> 3), *end =
|
||||||
|
src + ((srcoff + npixels - 1) >> 3);
|
||||||
|
|
||||||
|
// FIRST STAGE: COPY AND ROTATION
|
||||||
|
|
||||||
|
++end;
|
||||||
|
if(rot < 0) {
|
||||||
|
// ROTATION RIGHT
|
||||||
|
rot = -rot;
|
||||||
|
while(start <= end) {
|
||||||
|
a = *start;
|
||||||
|
*ptr = (a << rot) | (b >> (32 - rot));
|
||||||
|
b = a;
|
||||||
|
++ptr;
|
||||||
|
++start;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(rot > 0) {
|
||||||
|
// ROTATION LEFT
|
||||||
|
b = *start;
|
||||||
|
++start;
|
||||||
|
while(start <= end) {
|
||||||
|
a = *start;
|
||||||
|
*ptr = (b >> rot) | (a << (32 - rot));
|
||||||
|
b = a;
|
||||||
|
++ptr;
|
||||||
|
++start;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// ROTATION IS ZERO, JUST COPY
|
||||||
|
while(start <= end) {
|
||||||
|
*ptr = *start;
|
||||||
|
++ptr;
|
||||||
|
++start;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// SECOND STAGE: MASK AND UPDATE
|
||||||
|
|
||||||
|
int ml = ggl_leftmask(destoff), mr = ggl_rightmask(destoff + npixels - 1);
|
||||||
|
ptr = tempmem;
|
||||||
|
start = dest + (destoff >> 3);
|
||||||
|
end = dest + ((destoff + npixels - 1) >> 3);
|
||||||
|
|
||||||
|
if(start == end) {
|
||||||
|
// single word operation
|
||||||
|
ml |= mr;
|
||||||
|
*start = (*start & ml) | (*ptr & (~ml));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*start = (*start & ml) | (*ptr & (~ml));
|
||||||
|
++start;
|
||||||
|
++ptr;
|
||||||
|
|
||||||
|
while(start != end) {
|
||||||
|
*start = *ptr;
|
||||||
|
++start;
|
||||||
|
++ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
*start = (*start & mr) | (*ptr & (~mr));
|
||||||
|
|
||||||
|
}
|
46
firmware/ggl/cgl/cgl_hbltfilter.c
Normal file
46
firmware/ggl/cgl/cgl_hbltfilter.c
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
void ggl_hbltfilter(int *dest, int destoff, int npixels, int param,
|
||||||
|
gglfilter filterfunc)
|
||||||
|
{
|
||||||
|
|
||||||
|
// APPLIES A UNARY OPERATOR (A FILTER) TO A SERIES OF NIBBLES
|
||||||
|
// THE OPERATOR SHOULD ACT WORD BY WORD
|
||||||
|
// dest IS A WORD ALIGNED ADDRESSES
|
||||||
|
// destoff OFFSET IN NIBBLES (PIXELS) FROM dest
|
||||||
|
// param IS AN ARBITRARY PARAMETER PASSED TO THE FILTER FUNCTION
|
||||||
|
// filterfunc IS THE CUSTOM FILTER FUNCTION
|
||||||
|
|
||||||
|
int *start, *end;
|
||||||
|
|
||||||
|
// MASK AND UPDATE
|
||||||
|
|
||||||
|
int ml = ggl_leftmask(destoff), mr = ggl_rightmask(destoff + npixels - 1);
|
||||||
|
start = dest + (destoff >> 3);
|
||||||
|
end = dest + ((destoff + npixels - 1) >> 3);
|
||||||
|
|
||||||
|
if(start == end) {
|
||||||
|
// single word operation
|
||||||
|
ml |= mr;
|
||||||
|
*start = (*start & ml) | (((*filterfunc) (*start, param)) & (~ml));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*start = (*start & ml) | (((*filterfunc) (*start, param)) & (~ml));
|
||||||
|
++start;
|
||||||
|
|
||||||
|
while(start != end) {
|
||||||
|
*start = (*filterfunc) (*start, param);
|
||||||
|
++start;
|
||||||
|
}
|
||||||
|
|
||||||
|
*start = (*start & mr) | (((*filterfunc) (*start, param)) & (~mr));
|
||||||
|
|
||||||
|
}
|
94
firmware/ggl/cgl/cgl_hline.c
Normal file
94
firmware/ggl/cgl/cgl_hline.c
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
// VERSION DRAWS HORIZONTAL LINES IN A COLOR BITMAP
|
||||||
|
// Supports 16-bit per pixel RGB555
|
||||||
|
// Color is a single color, no pattern supported
|
||||||
|
|
||||||
|
void ggl_hline(gglsurface * srf, int y, int xl, int xr, int color)
|
||||||
|
{
|
||||||
|
// PAINTS A HORIZONTAL LINE FROM xl TO xr BOTH INCLUSIVE
|
||||||
|
// color=COLORED PATTERN TO USE, 8 PIXELS - 1 NIBBLE PER PIXEL
|
||||||
|
// PATTERN IS ALWAYS WORD ALIGNED
|
||||||
|
|
||||||
|
// RESTRICTIONS: xr>=xl
|
||||||
|
// y MUST BE VALID
|
||||||
|
|
||||||
|
int loff = (y * srf->width + xl);
|
||||||
|
int roff = (y * srf->width + xr);
|
||||||
|
register int *left = (int *)srf->addr + (loff >> 3);
|
||||||
|
register int *right = (int *)srf->addr + (roff >> 3);
|
||||||
|
int ml = ggl_leftmask(loff), mr = ggl_rightmask(roff);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
if(left == right) {
|
||||||
|
// single word operation
|
||||||
|
ml |= mr;
|
||||||
|
*left = (*left & ml) | (color & (~ml));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*left = (*left & ml) | (color & (~ml));
|
||||||
|
++left;
|
||||||
|
while(left != right) {
|
||||||
|
*left = color;
|
||||||
|
++left;
|
||||||
|
}
|
||||||
|
|
||||||
|
*right = (*right & mr) | (color & (~mr));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ggl_cliphline(gglsurface * srf, int y, int xl, int xr, int color)
|
||||||
|
{
|
||||||
|
// PAINTS A HORIZONTAL LINE FROM xl TO xr BOTH INCLUSIVE
|
||||||
|
// color=COLORED PATTERN TO USE, 8 PIXELS - 1 NIBBLE PER PIXEL
|
||||||
|
// PATTERN IS ALWAYS WORD ALIGNED
|
||||||
|
|
||||||
|
// RESTRICTIONS: xr>=xl
|
||||||
|
// y MUST BE VALID
|
||||||
|
|
||||||
|
if(y < srf->clipy)
|
||||||
|
return;
|
||||||
|
if(y > srf->clipy2)
|
||||||
|
return;
|
||||||
|
if(xr < srf->clipx)
|
||||||
|
return;
|
||||||
|
if(xl > srf->clipx2)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(xl < srf->clipx)
|
||||||
|
xl = srf->clipx;
|
||||||
|
if(xr > srf->clipx2)
|
||||||
|
xr = srf->clipx2;
|
||||||
|
|
||||||
|
int loff = (y * srf->width + xl);
|
||||||
|
int roff = (y * srf->width + xr);
|
||||||
|
register int *left = (int *)srf->addr + (loff >> 3);
|
||||||
|
register int *right = (int *)srf->addr + (roff >> 3);
|
||||||
|
int ml = ggl_leftmask(loff), mr = ggl_rightmask(roff);
|
||||||
|
|
||||||
|
if(left == right) {
|
||||||
|
// single word operation
|
||||||
|
ml |= mr;
|
||||||
|
*left = (*left & ml) | (color & (~ml));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
*left = (*left & ml) | (color & (~ml));
|
||||||
|
++left;
|
||||||
|
while(left != right) {
|
||||||
|
*left = color;
|
||||||
|
++left;
|
||||||
|
}
|
||||||
|
|
||||||
|
*right = (*right & mr) | (color & (~mr));
|
||||||
|
|
||||||
|
}
|
18
firmware/ggl/cgl/cgl_initscr.c
Normal file
18
firmware/ggl/cgl/cgl_initscr.c
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <ui.h>
|
||||||
|
|
||||||
|
void ggl_initscr(gglsurface * srf)
|
||||||
|
{
|
||||||
|
srf->addr = (int *)MEM_PHYS_SCREEN;
|
||||||
|
srf->width = LCD_W;
|
||||||
|
srf->x = srf->y = 0;
|
||||||
|
srf->clipx = srf->clipy = 0;
|
||||||
|
srf->clipx2 = SCREEN_WIDTH - 1;
|
||||||
|
srf->clipy2 = SCREEN_HEIGHT - 1;
|
||||||
|
}
|
19
firmware/ggl/cgl/cgl_mkcolor.c
Normal file
19
firmware/ggl/cgl/cgl_mkcolor.c
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
int ggl_mkcolor(int color)
|
||||||
|
{
|
||||||
|
// RETURNS A SOLID PATTERN WITH ALL 8 PIXELS SET TO color
|
||||||
|
color &= 0xf;
|
||||||
|
color |= color << 4;
|
||||||
|
color |= color << 8;
|
||||||
|
color |= color << 16;
|
||||||
|
|
||||||
|
return color;
|
||||||
|
}
|
24
firmware/ggl/cgl/cgl_mkcolor32.c
Normal file
24
firmware/ggl/cgl/cgl_mkcolor32.c
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
void ggl_mkcolor32(int col, int *pattern)
|
||||||
|
{
|
||||||
|
// RETURNS A DITHERED PATTERN FOR 32 COLORS
|
||||||
|
// color= from 0 to 30 --> 30 and 31 = both black
|
||||||
|
int color = col >> 1, mask = (col & 1) ? 0x01010101 : 0;
|
||||||
|
int c;
|
||||||
|
color &= 0xf;
|
||||||
|
color |= color << 4;
|
||||||
|
color |= color << 8;
|
||||||
|
color |= color << 16;
|
||||||
|
|
||||||
|
for(c = 0; c < 8; ++c) {
|
||||||
|
pattern[c] = color + ((c & 1) ? (mask << 4) : mask);
|
||||||
|
}
|
||||||
|
}
|
45
firmware/ggl/cgl/cgl_opmask.c
Normal file
45
firmware/ggl/cgl/cgl_opmask.c
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
unsigned int ggl_opmask(unsigned int dest, unsigned int src, int tcol)
|
||||||
|
{
|
||||||
|
// APPLY 100% TRANSPARENCY MASK
|
||||||
|
// tcol = TRANSPARENT COLOR IN src
|
||||||
|
register int f;
|
||||||
|
register unsigned int res = 0;
|
||||||
|
for(f = 0; f < 8; ++f, src >>= 4, dest >>= 4) {
|
||||||
|
if((src & 0xf) == (unsigned int)tcol)
|
||||||
|
res |= dest & 0xf;
|
||||||
|
else
|
||||||
|
res |= src & 0xf;
|
||||||
|
res = (res >> 4) | (res << 28);
|
||||||
|
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
// COPY src INTO dest, WITH tcol=TRANSPARENT COLOR IN src, AND THEN REPLACE BLACK COLOR IN src
|
||||||
|
// WITH THE COLOR GIVEN IN newcolor
|
||||||
|
|
||||||
|
unsigned int ggl_opmaskcol(unsigned int dest, unsigned int src, int tcol,
|
||||||
|
int newcolor)
|
||||||
|
{
|
||||||
|
// APPLY 100% TRANSPARENCY MASK
|
||||||
|
// tcol = TRANSPARENT COLOR IN src
|
||||||
|
register int f;
|
||||||
|
register unsigned int res = 0;
|
||||||
|
for(f = 0; f < 8; ++f, src >>= 4, dest >>= 4) {
|
||||||
|
if((src & 0xf) == (unsigned int)tcol)
|
||||||
|
res |= dest & 0xf;
|
||||||
|
else
|
||||||
|
res |= src & newcolor;
|
||||||
|
res = (res >> 4) | (res << 28);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
23
firmware/ggl/cgl/cgl_optransp.c
Normal file
23
firmware/ggl/cgl/cgl_optransp.c
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
unsigned int ggl_optransp(unsigned int dest, unsigned int src, int weight)
|
||||||
|
{
|
||||||
|
// APPLY 100% TRANSPARENCY MASK
|
||||||
|
// tcol = TRANSPARENT COLOR IN src
|
||||||
|
register int f;
|
||||||
|
register unsigned int res = 0;
|
||||||
|
for(f = 0; f < 8; ++f, src >>= 4, dest >>= 4) {
|
||||||
|
|
||||||
|
res |= ((src & 0xf) * (16 - weight) + (dest & 0xf) * weight) >> 4;
|
||||||
|
res = (res >> 4) | (res << 28);
|
||||||
|
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
39
firmware/ggl/cgl/cgl_ovlblt.c
Normal file
39
firmware/ggl/cgl/cgl_ovlblt.c
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
void ggl_ovlblt(gglsurface * dest, gglsurface * src, int width, int height)
|
||||||
|
{
|
||||||
|
|
||||||
|
// SAME AS ggl_bitblt BUT WITH OVERLAPPING CHECK
|
||||||
|
// IT COPIES CORRECTLY WHEN dest AND src ZONES OVERLAP
|
||||||
|
|
||||||
|
// COPIES A RECTANGULAR REGION FROM src TO dest
|
||||||
|
// gglsurface CONTAINS THE BUFFER AND OFFSETS
|
||||||
|
// width AND height ARE THE SIZE OF THE BLOCK TO MOVE
|
||||||
|
|
||||||
|
// RESTRICTIONS: NO SAFETY CHECKS REGARDING MEMORY MOVEMENTS
|
||||||
|
|
||||||
|
int doff, soff;
|
||||||
|
int *dst, *dend, *st; //,*send;
|
||||||
|
|
||||||
|
// CHECK FOR OVERLAPPING ZONES
|
||||||
|
|
||||||
|
doff = dest->y * dest->width + dest->x;
|
||||||
|
soff = src->y * src->width + src->x;
|
||||||
|
|
||||||
|
dst = dest->addr + (doff >> 3);
|
||||||
|
st = src->addr + (soff >> 3);
|
||||||
|
dend = dst + ((height * dest->width) >> 3);
|
||||||
|
//send=st+((height*src->width)>>3);
|
||||||
|
|
||||||
|
if(dst >= st && dst <= dend)
|
||||||
|
ggl_revblt(dest, src, width, height);
|
||||||
|
else
|
||||||
|
ggl_bitblt(dest, src, width, height);
|
||||||
|
}
|
17
firmware/ggl/cgl/cgl_pltnib.c
Normal file
17
firmware/ggl/cgl/cgl_pltnib.c
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
void ggl_pltnib(int *buf, int addr, int color)
|
||||||
|
{
|
||||||
|
register char *ptr = ((char *)buf) + (addr >> 1);
|
||||||
|
if(addr & 1)
|
||||||
|
*ptr = (*ptr & 0xf) | ((color << 4) & 0xf0);
|
||||||
|
else
|
||||||
|
*ptr = (*ptr & 0xf0) | (color & 0xf);
|
||||||
|
}
|
70
firmware/ggl/cgl/cgl_rect.c
Normal file
70
firmware/ggl/cgl/cgl_rect.c
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
void ggl_rect(gglsurface * srf, int x1, int y1, int x2, int y2, int color)
|
||||||
|
{
|
||||||
|
// DRAWS A RECTANGLE BETWEEN x1,y1 and x2,y2 ALL INCLUSIVE
|
||||||
|
// color CAN BE AN 8-BIT PATTERN THAT REPEATS VERTICALLY
|
||||||
|
// RESTRICTIONS:
|
||||||
|
// NO BOUNDARY CHECKS
|
||||||
|
// y2>=y1 && x2>=x1
|
||||||
|
|
||||||
|
while(y1 <= y2) {
|
||||||
|
ggl_hline(srf, y1, x1, x2, color);
|
||||||
|
++y1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void ggl_cliprect(gglsurface * srf, int x1, int y1, int x2, int y2, int color)
|
||||||
|
{
|
||||||
|
// SAME AS ggl_rect BUT WITH CLIPPING
|
||||||
|
|
||||||
|
if(x1 > x2) {
|
||||||
|
int tmp;
|
||||||
|
tmp = x1;
|
||||||
|
x1 = x2;
|
||||||
|
x2 = tmp;
|
||||||
|
}
|
||||||
|
if(y1 > y2) {
|
||||||
|
int tmp;
|
||||||
|
tmp = y1;
|
||||||
|
y1 = y2;
|
||||||
|
y2 = tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(x1 > srf->clipx2)
|
||||||
|
return;
|
||||||
|
if(y1 > srf->clipy2)
|
||||||
|
return;
|
||||||
|
if(y2 < srf->clipy)
|
||||||
|
return;
|
||||||
|
if(x2 < srf->clipx)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(x1 < srf->clipx)
|
||||||
|
x1 = srf->clipx;
|
||||||
|
if(y1 < srf->clipy)
|
||||||
|
y1 = srf->clipy;
|
||||||
|
if(x2 > srf->clipx2)
|
||||||
|
x2 = srf->clipx2;
|
||||||
|
if(y2 > srf->clipy2)
|
||||||
|
y2 = srf->clipy2;
|
||||||
|
|
||||||
|
// DRAWS A RECTANGLE BETWEEN x1,y1 and x2,y2 ALL INCLUSIVE
|
||||||
|
// color CAN BE AN 8-BIT PATTERN THAT REPEATS VERTICALLY
|
||||||
|
// RESTRICTIONS:
|
||||||
|
// NO BOUNDARY CHECKS
|
||||||
|
// y2>=y1 && x2>=x1
|
||||||
|
|
||||||
|
while(y1 <= y2) {
|
||||||
|
ggl_hline(srf, y1, x1, x2, color);
|
||||||
|
++y1;
|
||||||
|
}
|
||||||
|
}
|
23
firmware/ggl/cgl/cgl_rectp.c
Normal file
23
firmware/ggl/cgl/cgl_rectp.c
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
void ggl_rectp(gglsurface * srf, int x1, int y1, int x2, int y2, int *color)
|
||||||
|
{
|
||||||
|
// DRAWS A RECTANGLE BETWEEN x1,y1 and x2,y2 ALL INCLUSIVE
|
||||||
|
// color IS AN 8x8-BIT PATTERN (int color[8])
|
||||||
|
// RESTRICTIONS:
|
||||||
|
// NO BOUNDARY CHECKS
|
||||||
|
// y2>=y1 && x2>=x1
|
||||||
|
|
||||||
|
while(y1 <= y2) {
|
||||||
|
ggl_hline(srf, y1, x1, x2, color[y1 & 7]);
|
||||||
|
++y1;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
34
firmware/ggl/cgl/cgl_revblt.c
Normal file
34
firmware/ggl/cgl/cgl_revblt.c
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
void ggl_revblt(gglsurface * dest, gglsurface * src, int width, int height)
|
||||||
|
{
|
||||||
|
// REVERSE bitblt
|
||||||
|
// COPIES A RECTANGULAR REGION FROM src TO dest
|
||||||
|
// gglsurface CONTAINS THE BUFFER AND OFFSETS
|
||||||
|
// width AND height ARE THE SIZE OF THE BLOCK TO MOVE
|
||||||
|
|
||||||
|
// RESTRICTIONS: NO SAFETY CHECKS REGARDING MEMORY MOVEMENTS
|
||||||
|
|
||||||
|
int doff, soff, line;
|
||||||
|
|
||||||
|
doff = dest->y * dest->width + dest->x;
|
||||||
|
soff = src->y * src->width + src->x;
|
||||||
|
|
||||||
|
// REVERSE LOOP NEEDED
|
||||||
|
doff += dest->width * height;
|
||||||
|
soff += src->width * height;
|
||||||
|
|
||||||
|
for(line = 0; line < height; ++line) {
|
||||||
|
doff -= dest->width;
|
||||||
|
soff -= src->width;
|
||||||
|
ggl_hblt(dest->addr, doff, src->addr, soff, width);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
28
firmware/ggl/cgl/cgl_scrolldn.c
Normal file
28
firmware/ggl/cgl/cgl_scrolldn.c
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
void ggl_scrolldn(gglsurface * dest, int width, int height, int npixels)
|
||||||
|
{
|
||||||
|
|
||||||
|
// SCROLLS A RECTANGULAR REGION DOWN npixels
|
||||||
|
// gglsurface CONTAINS THE BUFFER AND OFFSETS
|
||||||
|
// width AND height ARE THE SIZE OF THE BLOCK TO MOVE
|
||||||
|
|
||||||
|
// RESTRICTIONS: NO SAFETY CHECKS REGARDING MEMORY MOVEMENTS
|
||||||
|
|
||||||
|
gglsurface srf;
|
||||||
|
|
||||||
|
srf.addr = dest->addr;
|
||||||
|
srf.width = dest->width;
|
||||||
|
srf.x = dest->x;
|
||||||
|
srf.y = dest->y + npixels;
|
||||||
|
|
||||||
|
ggl_revblt(&srf, dest, width, height - npixels);
|
||||||
|
|
||||||
|
}
|
28
firmware/ggl/cgl/cgl_scrolllf.c
Normal file
28
firmware/ggl/cgl/cgl_scrolllf.c
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
void ggl_scrolllf(gglsurface * dest, int width, int height, int npixels)
|
||||||
|
{
|
||||||
|
|
||||||
|
// SCROLLS A RECTANGULAR REGION LEFT npixelsup
|
||||||
|
// gglsurface CONTAINS THE BUFFER AND OFFSETS
|
||||||
|
// width AND height ARE THE SIZE OF THE BLOCK TO MOVE
|
||||||
|
|
||||||
|
// RESTRICTIONS: NO SAFETY CHECKS REGARDING MEMORY MOVEMENTS
|
||||||
|
|
||||||
|
gglsurface srf;
|
||||||
|
|
||||||
|
srf.addr = dest->addr;
|
||||||
|
srf.width = dest->width;
|
||||||
|
srf.x = dest->x + npixels;
|
||||||
|
srf.y = dest->y;
|
||||||
|
|
||||||
|
ggl_bitblt(dest, &srf, width - npixels, height);
|
||||||
|
|
||||||
|
}
|
28
firmware/ggl/cgl/cgl_scrollrt.c
Normal file
28
firmware/ggl/cgl/cgl_scrollrt.c
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
void ggl_scrollrt(gglsurface * dest, int width, int height, int npixels)
|
||||||
|
{
|
||||||
|
|
||||||
|
// SCROLLS A RECTANGULAR REGION RIGHT npixelsup
|
||||||
|
// gglsurface CONTAINS THE BUFFER AND OFFSETS
|
||||||
|
// width AND height ARE THE SIZE OF THE BLOCK TO MOVE
|
||||||
|
|
||||||
|
// RESTRICTIONS: NO SAFETY CHECKS REGARDING MEMORY MOVEMENTS
|
||||||
|
|
||||||
|
gglsurface srf;
|
||||||
|
|
||||||
|
srf.addr = dest->addr;
|
||||||
|
srf.width = dest->width;
|
||||||
|
srf.x = dest->x + npixels;
|
||||||
|
srf.y = dest->y;
|
||||||
|
|
||||||
|
ggl_bitblt(&srf, dest, width - npixels, height);
|
||||||
|
|
||||||
|
}
|
28
firmware/ggl/cgl/cgl_scrollup.c
Normal file
28
firmware/ggl/cgl/cgl_scrollup.c
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
void ggl_scrollup(gglsurface * dest, int width, int height, int npixelsup)
|
||||||
|
{
|
||||||
|
|
||||||
|
// SCROLLS A RECTANGULAR REGION UP npixelsup
|
||||||
|
// gglsurface CONTAINS THE BUFFER AND OFFSETS
|
||||||
|
// width AND height ARE THE SIZE OF THE BLOCK TO MOVE
|
||||||
|
|
||||||
|
// RESTRICTIONS: NO SAFETY CHECKS REGARDING MEMORY MOVEMENTS
|
||||||
|
|
||||||
|
gglsurface srf;
|
||||||
|
|
||||||
|
srf.addr = dest->addr;
|
||||||
|
srf.width = dest->width;
|
||||||
|
srf.x = dest->x;
|
||||||
|
srf.y = dest->y + npixelsup;
|
||||||
|
|
||||||
|
ggl_bitblt(dest, &srf, width, height - npixelsup);
|
||||||
|
|
||||||
|
}
|
56
firmware/ggl/cgl/cgl_vline.c
Normal file
56
firmware/ggl/cgl/cgl_vline.c
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014-2015, Claudio Lapilli and the newRPL Team
|
||||||
|
* All rights reserved.
|
||||||
|
* This file is released under the 3-clause BSD license.
|
||||||
|
* See the file LICENSE.txt that shipped with this distribution.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cgl.h>
|
||||||
|
|
||||||
|
void ggl_vline(gglsurface * srf, int x, int yt, int yb, int color)
|
||||||
|
{
|
||||||
|
// PAINTS A VERTICAL LINE FROM yt TO yb BOTH INCLUSIVE
|
||||||
|
// color=number from 0 to 15
|
||||||
|
// RESTRICTIONS: yb>=yt
|
||||||
|
|
||||||
|
int offset = srf->width * yt + x;
|
||||||
|
|
||||||
|
while(yt <= yb) {
|
||||||
|
ggl_pltnib(srf->addr, offset, color >> ((yt & 7) << 2));
|
||||||
|
offset += srf->width;
|
||||||
|
++yt;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// SAME AS VLINE BU WITH CLIPPING
|
||||||
|
void ggl_clipvline(gglsurface * srf, int x, int yt, int yb, int color)
|
||||||
|
{
|
||||||
|
// PAINTS A VERTICAL LINE FROM yt TO yb BOTH INCLUSIVE
|
||||||
|
// color=number from 0 to 15
|
||||||
|
// RESTRICTIONS: yb>=yt
|
||||||
|
|
||||||
|
if(yt > srf->clipy2)
|
||||||
|
return;
|
||||||
|
if(yb < srf->clipy)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(yt < srf->clipy)
|
||||||
|
yt = srf->clipy;
|
||||||
|
if(yb > srf->clipy2)
|
||||||
|
yb = srf->clipy2;
|
||||||
|
|
||||||
|
if(x < srf->clipx)
|
||||||
|
return;
|
||||||
|
if(x > srf->clipx2)
|
||||||
|
return;
|
||||||
|
|
||||||
|
int offset = srf->width * yt + x;
|
||||||
|
|
||||||
|
while(yt <= yb) {
|
||||||
|
ggl_pltnib(srf->addr, offset, color >> ((yt & 7) << 2));
|
||||||
|
offset += srf->width;
|
||||||
|
++yt;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -9,7 +9,7 @@
|
||||||
#define _HAL_API_H
|
#define _HAL_API_H
|
||||||
|
|
||||||
#include "newrpl.h"
|
#include "newrpl.h"
|
||||||
#include "ggl.h"
|
#include "xgl.h"
|
||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
|
|
||||||
#ifndef EXTERN
|
#ifndef EXTERN
|
||||||
|
|
|
@ -71,7 +71,7 @@ extern int __usb_timeout;
|
||||||
// USABLE SCREEN WINDOW SIZE
|
// USABLE SCREEN WINDOW SIZE
|
||||||
#define SCREEN_WIDTH 320
|
#define SCREEN_WIDTH 320
|
||||||
#define SCREEN_HEIGHT 240
|
#define SCREEN_HEIGHT 240
|
||||||
#define PIXELS_PER_WORD 8
|
#define PIXELS_PER_WORD 2
|
||||||
|
|
||||||
// PHYSICAL SCREEN SIZE
|
// PHYSICAL SCREEN SIZE
|
||||||
// WIDTH MUST BE AT LEAST ONE MORE THAN THE WINDOW SIZE
|
// WIDTH MUST BE AT LEAST ONE MORE THAN THE WINDOW SIZE
|
||||||
|
@ -100,8 +100,8 @@ extern int __usb_timeout;
|
||||||
#define HAL_USBCLOCK 48000000
|
#define HAL_USBCLOCK 48000000
|
||||||
#define HAL_FASTCLOCK 192000000
|
#define HAL_FASTCLOCK 192000000
|
||||||
|
|
||||||
extern char PhysicalScreen[(SCREEN_W*SCREEN_H)/(PIXELS_PER_WORD/4)];
|
extern char PhysicalScreen[(SCREEN_W*SCREEN_H)*4/PIXELS_PER_WORD];
|
||||||
extern char ExceptionScreen[(SCREEN_W*SCREEN_H)/(PIXELS_PER_WORD/4)];
|
extern char ExceptionScreen[(SCREEN_W*SCREEN_H)*4/PIXELS_PER_WORD];
|
||||||
|
|
||||||
typedef unsigned int INTERRUPT_TYPE;
|
typedef unsigned int INTERRUPT_TYPE;
|
||||||
|
|
||||||
|
|
|
@ -770,6 +770,10 @@
|
||||||
#define EP0_TZLS 1
|
#define EP0_TZLS 1
|
||||||
// SHT = STALL HANDHAKE TRANSMITTED BIT
|
// SHT = STALL HANDHAKE TRANSMITTED BIT
|
||||||
#define EP0_SHT 0x10
|
#define EP0_SHT 0x10
|
||||||
|
// LWO = LAST WORD ODD
|
||||||
|
#define EP0_LWO 0x40
|
||||||
|
|
||||||
|
|
||||||
// ESS = ENDPOINT STALL SET
|
// ESS = ENDPOINT STALL SET
|
||||||
#define EP_ESS 2
|
#define EP_ESS 2
|
||||||
// FLUSH FIFO
|
// FLUSH FIFO
|
||||||
|
|
28
firmware/include/xgl.h
Normal file
28
firmware/include/xgl.h
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
#ifndef XGL_H
|
||||||
|
#define XGL_H
|
||||||
|
|
||||||
|
// Select the proper library according to the target (4-bit grayscale or full color)
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef TARGET_PC_PRIMEG1
|
||||||
|
#include "cgl.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef TARGET_PRIME1
|
||||||
|
//#include "cgl.h"
|
||||||
|
#include "ggl.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef TARGET_50G
|
||||||
|
#include "ggl.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef TARGET_39GS
|
||||||
|
#include "ggl.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef TARGET_40GS
|
||||||
|
#include "ggl.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // XGL_H
|
|
@ -16,8 +16,8 @@ int __lcd_mode = -1;
|
||||||
int __lcd_needsupdate = 0;
|
int __lcd_needsupdate = 0;
|
||||||
unsigned int *__lcd_buffer;
|
unsigned int *__lcd_buffer;
|
||||||
// SIMULATED SCREEN MEMORY
|
// SIMULATED SCREEN MEMORY
|
||||||
char PhysicalScreen[(SCREEN_W*SCREEN_H)/(PIXELS_PER_WORD/4)];
|
char PhysicalScreen[(SCREEN_W*SCREEN_H)*4/PIXELS_PER_WORD];
|
||||||
char ExceptionScreen[(SCREEN_W*SCREEN_H)/(PIXELS_PER_WORD/4)];
|
char ExceptionScreen[(SCREEN_W*SCREEN_H)*4/PIXELS_PER_WORD];
|
||||||
|
|
||||||
int __lcd_contrast __SYSTEM_GLOBAL__;
|
int __lcd_contrast __SYSTEM_GLOBAL__;
|
||||||
|
|
||||||
|
|
|
@ -451,6 +451,8 @@ void usb_init(int force)
|
||||||
if(!force)
|
if(!force)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
red_led_off();
|
||||||
|
green_led_on();
|
||||||
|
|
||||||
//__usb_intcount=0;
|
//__usb_intcount=0;
|
||||||
|
|
||||||
|
@ -511,7 +513,8 @@ void usb_shutdown()
|
||||||
if(!(__usb_drvstatus & USB_STATUS_INIT))
|
if(!(__usb_drvstatus & USB_STATUS_INIT))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
red_led_on();
|
||||||
|
green_led_off();
|
||||||
|
|
||||||
// MASK INTERRUPT AND REMOVE HANDLER
|
// MASK INTERRUPT AND REMOVE HANDLER
|
||||||
__irq_mask(25);
|
__irq_mask(25);
|
||||||
|
@ -587,31 +590,42 @@ void usb_ep0_transmit(int newtransmission)
|
||||||
|
|
||||||
*EP0CR&= ~EP0_TZLS; // CLEAR TRANSMIT ZERO PACKET BIT
|
*EP0CR&= ~EP0_TZLS; // CLEAR TRANSMIT ZERO PACKET BIT
|
||||||
|
|
||||||
*BWCR = __usb_ctlcount + __usb_ctlpadding ; // TOTAL BYTES TO TRANSMIT
|
int total = __usb_ctlcount + __usb_ctlpadding ;
|
||||||
|
*BWCR = (total>EP0_FIFO_SIZE)? EP0_FIFO_SIZE : total ; // BWCR = WRITE COUNT - IN BYTES DESPITE THE FIFO USING HALF-WORDS
|
||||||
|
|
||||||
*EP0SR= EP_TPS; // CLEAR TRANSMIT PACKET SUCCESS BIT (READY FOR NEXT PACKET)
|
*EP0SR= EP_TPS; // CLEAR TRANSMIT PACKET SUCCESS BIT (READY FOR NEXT PACKET)
|
||||||
|
|
||||||
|
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
while(__usb_ctlcount && (cnt < EP0_FIFO_SIZE)) {
|
int halfword;
|
||||||
*EP0BR = (WORD) * __usb_ctlbufptr;
|
while((__usb_ctlcount>1) && (cnt < EP0_FIFO_SIZE)) {
|
||||||
++__usb_ctlbufptr;
|
halfword = __usb_ctlbufptr[0] | (__usb_ctlbufptr[1]<<8);
|
||||||
++cnt;
|
*EP0BR = (WORD) halfword;
|
||||||
--__usb_ctlcount;
|
__usb_ctlbufptr+=2;
|
||||||
|
cnt+=2;
|
||||||
|
__usb_ctlcount-=2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(__usb_ctlcount == 1) {
|
||||||
|
halfword = __usb_ctlbufptr[0] ; // UPPER BYTE IS ZERO
|
||||||
|
*EP0BR = (WORD) halfword;
|
||||||
|
__usb_ctlbufptr++;
|
||||||
|
cnt+=2;
|
||||||
|
__usb_ctlcount--;
|
||||||
|
__usb_ctlpadding--;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(__usb_ctlcount == 0) {
|
if(__usb_ctlcount == 0) {
|
||||||
// SEND ANY PADDING
|
// SEND ANY PADDING
|
||||||
while((__usb_ctlpadding != 0) && (cnt < EP0_FIFO_SIZE)) {
|
while((__usb_ctlpadding > 0) && (cnt < EP0_FIFO_SIZE)) {
|
||||||
*EP0BR = 0;
|
*EP0BR = 0;
|
||||||
++cnt;
|
cnt+=2;
|
||||||
--__usb_ctlpadding;
|
__usb_ctlpadding-=2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if((__usb_ctlcount == 0) && (__usb_ctlpadding == 0)) {
|
if((__usb_ctlcount == 0) && (__usb_ctlpadding == 0)) {
|
||||||
|
|
||||||
// SEND A 0-LENGTH PACKET
|
// SEND A 0-LENGTH PACKET TO INDICATE END OF TRANSMISSION
|
||||||
|
|
||||||
*EP0CR |= EP0_TZLS; // SEND A ZERO-LENGTH PACKET
|
*EP0CR |= EP0_TZLS; // SEND A ZERO-LENGTH PACKET
|
||||||
|
|
||||||
|
@ -649,13 +663,29 @@ void usb_ep0_receive(int newtransmission)
|
||||||
}
|
}
|
||||||
|
|
||||||
int cnt = 0;
|
int cnt = 0;
|
||||||
|
int halfword;
|
||||||
|
int lwo = *EP0SR & EP0_LWO; // GET THE LAST WORD ODD BIT BEFORE IT'S AUTOMATICALLY CLEARED
|
||||||
|
|
||||||
while(__usb_ctlcount && (cnt < EP0_FIFO_SIZE) && (*BRCR&0x1ff)) {
|
while(__usb_ctlcount && (cnt < EP0_FIFO_SIZE) && (*BRCR&0x1ff)) {
|
||||||
*__usb_ctlbufptr = (BYTE) * EP0BR;
|
halfword=*EP0BR;
|
||||||
++__usb_ctlbufptr;
|
*__usb_ctlbufptr++ = (BYTE) halfword;
|
||||||
--__usb_ctlcount;
|
*__usb_ctlbufptr++ = (BYTE) (halfword>>8);
|
||||||
++cnt;
|
__usb_ctlcount-=2;
|
||||||
|
cnt+=2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(lwo && (cnt>0) && !(*BRCR&0x1ff)) {
|
||||||
|
// DISCARD THE LAST BYTE IF THE LAST WORD WAS ODD
|
||||||
|
__usb_ctlcount++;
|
||||||
|
__usb_ctlbufptr--;
|
||||||
|
cnt--;
|
||||||
|
}
|
||||||
|
|
||||||
|
// THERE WAS EXTRA DATA IN THE PACKET??
|
||||||
|
// JUST IN CASE CLEAN THE FIFO
|
||||||
|
while(*BRCR) halfword=*EP0BR;
|
||||||
|
|
||||||
|
|
||||||
*EP0SR = EP0_RSR; // CLEAR PACKET RECEIVED
|
*EP0SR = EP0_RSR; // CLEAR PACKET RECEIVED
|
||||||
|
|
||||||
|
|
||||||
|
@ -726,13 +756,13 @@ void ep0_irqservice()
|
||||||
// READ ALL 8 BYTES FROM THE FIFO
|
// READ ALL 8 BYTES FROM THE FIFO
|
||||||
|
|
||||||
reqtype = *EP0BR;
|
reqtype = *EP0BR;
|
||||||
request = *EP0BR;
|
|
||||||
|
request = reqtype >> 8;
|
||||||
|
reqtype &= 0xff;
|
||||||
|
|
||||||
value = *EP0BR;
|
value = *EP0BR;
|
||||||
value |= (*EP0BR) << 8;
|
|
||||||
index = *EP0BR;
|
index = *EP0BR;
|
||||||
index |= (*EP0BR) << 8;
|
|
||||||
length = *EP0BR;
|
length = *EP0BR;
|
||||||
length |= (*EP0BR) << 8;
|
|
||||||
|
|
||||||
if((reqtype & 0x60) == 0) // STANDARD REQUESTS
|
if((reqtype & 0x60) == 0) // STANDARD REQUESTS
|
||||||
{
|
{
|
||||||
|
@ -1486,6 +1516,7 @@ void usb_irqservice()
|
||||||
return;
|
return;
|
||||||
__usb_drvstatus |= USB_STATUS_INSIDEIRQ;
|
__usb_drvstatus |= USB_STATUS_INSIDEIRQ;
|
||||||
|
|
||||||
|
|
||||||
blue_led_on();
|
blue_led_on();
|
||||||
|
|
||||||
*IR = 0;
|
*IR = 0;
|
||||||
|
@ -1495,10 +1526,12 @@ void usb_irqservice()
|
||||||
if(__usb_drvstatus & (USB_STATUS_EP0TX | USB_STATUS_EP0RX))
|
if(__usb_drvstatus & (USB_STATUS_EP0TX | USB_STATUS_EP0RX))
|
||||||
ep0_irqservice();
|
ep0_irqservice();
|
||||||
__usb_drvstatus &= ~USB_STATUS_INSIDEIRQ;
|
__usb_drvstatus &= ~USB_STATUS_INSIDEIRQ;
|
||||||
|
*EIR = *EIR;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(*EIR & 1) {
|
if(*EIR & 1) {
|
||||||
|
|
||||||
ep0_irqservice();
|
ep0_irqservice();
|
||||||
*EIR = 1;
|
*EIR = 1;
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,33 @@ TEMPLATE = app
|
||||||
DEFINES += TARGET_PC TARGET_PC_PRIMEG1 "NEWRPL_BUILDNUM=$$system(git rev-list --count HEAD)"
|
DEFINES += TARGET_PC TARGET_PC_PRIMEG1 "NEWRPL_BUILDNUM=$$system(git rev-list --count HEAD)"
|
||||||
|
|
||||||
SOURCES += main.cpp\
|
SOURCES += main.cpp\
|
||||||
|
firmware/ggl/cgl/cgl_bitblt.c \
|
||||||
|
firmware/ggl/cgl/cgl_bitbltoper.c \
|
||||||
|
firmware/ggl/cgl/cgl_filter.c \
|
||||||
|
firmware/ggl/cgl/cgl_fltdarken.c \
|
||||||
|
firmware/ggl/cgl/cgl_fltinvert.c \
|
||||||
|
firmware/ggl/cgl/cgl_fltlighten.c \
|
||||||
|
firmware/ggl/cgl/cgl_fltreplace.c \
|
||||||
|
firmware/ggl/cgl/cgl_getnib.c \
|
||||||
|
firmware/ggl/cgl/cgl_hblitoper.c \
|
||||||
|
firmware/ggl/cgl/cgl_hblt.c \
|
||||||
|
firmware/ggl/cgl/cgl_hbltfilter.c \
|
||||||
|
firmware/ggl/cgl/cgl_hline.c \
|
||||||
|
firmware/ggl/cgl/cgl_initscr.c \
|
||||||
|
firmware/ggl/cgl/cgl_mkcolor.c \
|
||||||
|
firmware/ggl/cgl/cgl_mkcolor32.c \
|
||||||
|
firmware/ggl/cgl/cgl_opmask.c \
|
||||||
|
firmware/ggl/cgl/cgl_optransp.c \
|
||||||
|
firmware/ggl/cgl/cgl_ovlblt.c \
|
||||||
|
firmware/ggl/cgl/cgl_pltnib.c \
|
||||||
|
firmware/ggl/cgl/cgl_rect.c \
|
||||||
|
firmware/ggl/cgl/cgl_rectp.c \
|
||||||
|
firmware/ggl/cgl/cgl_revblt.c \
|
||||||
|
firmware/ggl/cgl/cgl_scrolldn.c \
|
||||||
|
firmware/ggl/cgl/cgl_scrolllf.c \
|
||||||
|
firmware/ggl/cgl/cgl_scrollrt.c \
|
||||||
|
firmware/ggl/cgl/cgl_scrollup.c \
|
||||||
|
firmware/ggl/cgl/cgl_vline.c \
|
||||||
firmware/hal_battery_primeg1.c \
|
firmware/hal_battery_primeg1.c \
|
||||||
firmware/sys/Font18.c \
|
firmware/sys/Font18.c \
|
||||||
firmware/sys/Font24.c \
|
firmware/sys/Font24.c \
|
||||||
|
@ -20,31 +47,6 @@ SOURCES += main.cpp\
|
||||||
newrpl/lib-112-asm.c \
|
newrpl/lib-112-asm.c \
|
||||||
newrpl/lib-4081-tags.c \
|
newrpl/lib-4081-tags.c \
|
||||||
qemuscreen.cpp \
|
qemuscreen.cpp \
|
||||||
firmware/ggl/ggl/ggl_bitblt.c \
|
|
||||||
firmware/ggl/ggl/ggl_bitbltoper.c \
|
|
||||||
firmware/ggl/ggl/ggl_filter.c \
|
|
||||||
firmware/ggl/ggl/ggl_fltdarken.c \
|
|
||||||
firmware/ggl/ggl/ggl_fltlighten.c \
|
|
||||||
firmware/ggl/ggl/ggl_getnib.c \
|
|
||||||
firmware/ggl/ggl/ggl_hblt.c \
|
|
||||||
firmware/ggl/ggl/ggl_hbltfilter.c \
|
|
||||||
firmware/ggl/ggl/ggl_hbltoper.c \
|
|
||||||
firmware/ggl/ggl/ggl_hline.c \
|
|
||||||
firmware/ggl/ggl/ggl_initscr.c \
|
|
||||||
firmware/ggl/ggl/ggl_mkcolor.c \
|
|
||||||
firmware/ggl/ggl/ggl_mkcolor32.c \
|
|
||||||
firmware/ggl/ggl/ggl_opmask.c \
|
|
||||||
firmware/ggl/ggl/ggl_optransp.c \
|
|
||||||
firmware/ggl/ggl/ggl_ovlblt.c \
|
|
||||||
firmware/ggl/ggl/ggl_pltnib.c \
|
|
||||||
firmware/ggl/ggl/ggl_rect.c \
|
|
||||||
firmware/ggl/ggl/ggl_rectp.c \
|
|
||||||
firmware/ggl/ggl/ggl_revblt.c \
|
|
||||||
firmware/ggl/ggl/ggl_scrolldn.c \
|
|
||||||
firmware/ggl/ggl/ggl_scrolllf.c \
|
|
||||||
firmware/ggl/ggl/ggl_scrollrt.c \
|
|
||||||
firmware/ggl/ggl/ggl_scrollup.c \
|
|
||||||
firmware/ggl/ggl/ggl_vline.c \
|
|
||||||
firmware/hal_keyboard_primeg1.c \
|
firmware/hal_keyboard_primeg1.c \
|
||||||
firmware/hal_screen_primeg1.c \
|
firmware/hal_screen_primeg1.c \
|
||||||
firmware/sys/graphics.c \
|
firmware/sys/graphics.c \
|
||||||
|
@ -195,13 +197,11 @@ SOURCES += main.cpp\
|
||||||
newrpl/lib-20-comments.c \
|
newrpl/lib-20-comments.c \
|
||||||
firmware/sys/target_pc/flash.c \
|
firmware/sys/target_pc/flash.c \
|
||||||
firmware/ui_softmenu.c \
|
firmware/ui_softmenu.c \
|
||||||
firmware/ggl/ggl/ggl_fltinvert.c \
|
|
||||||
newrpl/lib-48-angles.c \
|
newrpl/lib-48-angles.c \
|
||||||
newrpl/lib-74-sdcard.c \
|
newrpl/lib-74-sdcard.c \
|
||||||
firmware/sys/target_pc/rtc.c \
|
firmware/sys/target_pc/rtc.c \
|
||||||
firmware/hal_clock.c \
|
firmware/hal_clock.c \
|
||||||
firmware/hal_alarm.c \
|
firmware/hal_alarm.c \
|
||||||
firmware/ggl/ggl/ggl_fltreplace.c \
|
|
||||||
newrpl/lib-76-ui.c \
|
newrpl/lib-76-ui.c \
|
||||||
newrpl/lib-zero-messages.c \
|
newrpl/lib-zero-messages.c \
|
||||||
firmware/ui_forms.c \
|
firmware/ui_forms.c \
|
||||||
|
@ -234,9 +234,10 @@ SOURCES += main.cpp\
|
||||||
|
|
||||||
|
|
||||||
HEADERS += mainwindow.h \
|
HEADERS += mainwindow.h \
|
||||||
|
firmware/include/cgl.h \
|
||||||
firmware/include/usb.h \
|
firmware/include/usb.h \
|
||||||
|
firmware/include/xgl.h \
|
||||||
qemuscreen.h \
|
qemuscreen.h \
|
||||||
firmware/include/ggl.h \
|
|
||||||
firmware/include/ui.h \
|
firmware/include/ui.h \
|
||||||
firmware/include/hal_api.h \
|
firmware/include/hal_api.h \
|
||||||
newrpl/libraries.h \
|
newrpl/libraries.h \
|
||||||
|
|
Loading…
Reference in a new issue