Working on plugin to make them work again!

This commit is contained in:
Godzil 2020-01-14 18:59:22 +00:00
parent 221417c0ee
commit 2ec7a9c21e
11 changed files with 762 additions and 113 deletions

View File

@ -11,13 +11,18 @@
#define OS_DEPENDENT_H
#include <stdint.h>
#include "text.h"
/* File related functions */
/* Graphics related functions */
int graphics_init();
int graphics_drawpixel(long x, long y, long color);
int graphics_blit(long x, long y, long w, long h);
int graphics_drawline(long x, long y, long x1, long y1, long color);
int graphics_drawline(uint32_t x, uint32_t y, uint32_t x1, uint32_t y1, uint32_t colour);
int graphics_drawRect(uint32_t x0, uint32_t y0, uint32_t w, uint32_t h, uint32_t colour);
int graphics_drawFillrect(int x0, int y0, int w, int h, uint32_t colour);
int graphics_getScreenSize(int *w, int *h);
void vsync(void);
typedef struct Palette_t
@ -47,4 +52,15 @@ int console_init(ConsoleLevel DefaultLevel);
int console_printf(const ConsoleLevel level, const char *format, ...);
int console_printf_d(const char *format, ...);
#define KEY_ENTER (257)
#define KEY_LEFT (263)
#define KEY_RIGHT (262)
#define KEY_UP (265)
#define KEY_DOWN (264)
//#define KEY_ENTER 13
#endif /* OS_DEPENDENT_H */

View File

@ -26,7 +26,7 @@ int plugin_remove_keypressHandler(uint8_t key, PluginKeypress);
#else /* __TINES_PLUGINS__ */
/* Available functions outside of plugins */
int plugin_keypress(uint8_t key);
int plugin_keypress();
/* Real Prototype: TBD */
void plugin_list();

58
src/include/text.h Normal file
View File

@ -0,0 +1,58 @@
/*
* FbLib graphic library
*
* Created by Manoël TRAPIER.
* Copyright (c) 2003-2019 986-Studio. All rights reserved.
*
*/
#ifndef _FBLIB_INCLUDE_TEXT_H
#define _FBLIB_INCLUDE_TEXT_H
typedef struct FBLibFont
{
char *name; /* Font name. */
int height; /* Height in pixels. */
int index_mask; /* ((1 << N) - 1). */
int *offset; /* (1 << N) offsets into index. */
int *index;
uint32_t *content;
//void *private;
} FBLibFont;
/* ? */
FBLibFont *load_psf(char *filename);
void graphics_text_line(int x, int y, int w, int charw, uint32_t color, int valign, void *font, char *text);
int graphics_text_ex(int x, int y, int w, int h,
void *font,
uint32_t bgcolor, uint32_t fgcolor,
char valign, char halign,
uint16_t options,
void *format, ...);
void graphics_get_text_size(int *width, int *height,
const FBLibFont *font,
const char *text);
void graphics_draw_text (int x, int y,
uint32_t colour,
const FBLibFont *font,
const char *text);
#define TEXT_VALIGN_LEFT (1)
#define TEXT_VALIGN_RIGHT (2)
#define TEXT_VALIGN_CENTER (3)
#define TEXT_HALIGN_TOP (1)
#define TEXT_HALIGN_CENTER (2)
#define TEXT_HALIGN_BOTTOM (3)
#define TEXT_OPT_WORDWRAP (1<<0)
#define TEXT_DEFAULTFONT ((void*)(1))
#define TEXT_SMALLFONT ((void*)(2))
#define TEXT_LARGEFONT ((void*)(3))
#endif /* _FBLIB_INCLUDE_TEXT_H */

View File

@ -740,12 +740,12 @@ int main(int argc, char *argv[])
ppu_setMirroring((Cart->Flags & iNES_MIRROR) ? PPU_MIRROR_VERTICAL : PPU_MIRROR_HORIZTAL);
}
console_printf(Console_Default, "Init mapper...\t\t\t");
//console_printf(Console_Default, "Init mapper...\n");
if (mapper_init(Cart) == -1)
{
return -1;
}
console_printf(Console_Default, "[ OK ]\n");
//console_printf(Console_Default, "[ OK ]\n");
// set_palette(basicPalette);
@ -933,7 +933,7 @@ void Loop6502(quick6502_cpu *R)
quick6502_reset(R);
}
// plugin_keypress(skey);
plugin_keypress();
if (cpuSignal != 0)
{

View File

@ -6,9 +6,9 @@
#
if (COVERALLS)
set(COVERAGE_SRCS src/os/unix/loadfile.c src/os/unix/graphics_dummy.c src/os/unix/sound.c src/os/unix/io.c ${COVERAGE_SRCS} PARENT_SCOPE)
add_library(oslib loadfile.c graphics_dummy.c sound.c io.c)
add_library(oslib loadfile.c graphics_dummy.c sound.c io.c text.c)
else()
add_library(oslib loadfile.c graphics.c sound.c io.c)
add_library(oslib loadfile.c graphics.c sound.c io.c text.c)
endif()
target_link_libraries(oslib glfw ${OPENGL_glu_LIBRARY} ${OPENGL_gl_LIBRARY})

Binary file not shown.

View File

@ -158,8 +158,8 @@ void kbHandler(GLFWwindow *window, int key, int scan, int action, int mod)
}
keyArray[key].debounced |= (keyArray[key].lastState == GLFW_RELEASE) && (keyArray[key].curState == GLFW_PRESS);
keyArray[key].window = window;
printf("key:%d, state:%d debounce:%d, laststate:%d\n", key, keyArray[key].curState,
keyArray[key].debounced, keyArray[key].lastState);
/*printf("key:%d, state:%d debounce:%d, laststate:%d\n", key, keyArray[key].curState,
keyArray[key].debounced, keyArray[key].lastState);*/
}
void sizeHandler(GLFWwindow *window, int xs, int ys)
@ -206,13 +206,13 @@ void initDisplay(GLWindow *g)
glfwSetWindowSizeCallback(g->windows, sizeHandler);
}
void drawPixel(GLWindow *gw, int x, int y, uint32_t colour)
static void drawPixel(GLWindow *gw, uint32_t x, uint32_t y, uint32_t colour)
{
uint8_t r, g, b, a;
uint32_t offset = (y * gw->WIDTH * 4U) + 4U * x;
if ((x < 0) || (x > gw->WIDTH) || (y < 0) || (y > gw->HEIGHT))
if ((x > (uint32_t)gw->WIDTH) || (y > (uint32_t)gw->HEIGHT))
{
return;
}
@ -228,9 +228,13 @@ void drawPixel(GLWindow *gw, int x, int y, uint32_t colour)
gw->videoMemory[offset + 3] = b;
}
void drawLine(GLWindow *g, int x0, int y0, int x1, int y1, uint32_t colour)
static void drawLine(GLWindow *g, uint32_t x0, uint32_t y0, uint32_t x1, uint32_t y1, uint32_t colour)
{
int d, dx, dy, aincr, bincr, xincr, yincr, x, y;
printf("%s:%s(%p, %d, %d, %d, %d, %d) @ %d\n", __FILE__, __func__,
g, x0, y0, x1, y1, colour,
__LINE__);
int32_t d, dx, dy, aincr, bincr, xincr, yincr;
uint32_t x, y;
if (abs(x1 - x0) < abs(y1 - y0))
{
/* parcours par l'axe vertical */
@ -306,7 +310,7 @@ exit:
return;
}
void drawCircle(GLWindow *g, int xc, int yc, int radius, uint32_t colour)
static void drawCircle(GLWindow *g, int xc, int yc, int radius, uint32_t colour)
{
int f = 1 - radius;
int ddF_x = 0;
@ -364,17 +368,24 @@ void drawCircle(GLWindow *g, int xc, int yc, int radius, uint32_t colour)
}
}
void drawRect(GLWindow *g, int x0, int y0, int w, int h, uint32_t colour)
static void drawRect(GLWindow *g, uint32_t x0, uint32_t y0, uint32_t w, uint32_t h, uint32_t colour)
{
printf("%s:%s(%p, %d, %d, %d, %d, %d) @ %d\n", __FILE__, __func__,
g, x0, y0, w, h, colour,
__LINE__);
drawLine(g, x0, y0, x0 + w, y0, colour);
drawLine(g, x0 + w, y0, x0 + w, y0 + h, colour);
drawLine(g, x0 + w, y0 + h, x0, y0 + h, colour);
drawLine(g, x0, y0 + h, x0, y0, colour);
}
void drawFillrect(GLWindow *g, int x0, int y0, int w, int h, uint32_t colour)
static void drawFillrect(GLWindow *g, uint32_t x0, uint32_t y0, uint32_t w, uint32_t h, uint32_t colour)
{
int i;
printf("%s:%s(%p, %d, %d, %d, %d, %d) @ %d\n", __FILE__, __func__,
g, x0, y0, w, h, colour,
__LINE__);
uint32_t i;
for (i = 0 ; i < h ; i++)
{
drawLine(g, x0, y0 + i, x0 + w, y0 + i, colour);
@ -431,15 +442,49 @@ static uint32_t getColour(long color)
return (b << 24) | (g << 16) | (r << 8) | a;
}
int graphics_getScreenSize(int *w, int *h)
{
*w = mainWindow.WIDTH;
*h = mainWindow.HEIGHT;
return 0;
}
int graphics_drawRect(uint32_t x0, uint32_t y0, uint32_t w, uint32_t h, uint32_t colour)
{
printf("%s:%s(%d, %d, %d, %d, %d) @ %d\n", __FILE__, __func__,
x0, y0, w, h, colour,
__LINE__);
drawRect(&mainWindow, x0, y0, w, h, colour);
return 0;
}
int graphics_drawFillrect(int x0, int y0, int w, int h, uint32_t colour)
{
printf("%s:%s(%d, %d, %d, %d, %d) @ %d\n", __FILE__, __func__,
x0, y0, w, h, colour,
__LINE__);
drawFillrect(&mainWindow, x0, y0, w, h, colour);
return 0;
}
int graphics_drawpixel(long x, long y, long color)
{
drawPixel(&mainWindow, x, y, getColour(color));
return 0;
}
int graphics_drawline(long x, long y, long x1, long y1, long color)
int graphics_drawCircle(int xc, int yc, int radius, uint32_t colour)
{
drawLine(&mainWindow, x, y, x1, y1, getColour(color));
drawCircle(&mainWindow, xc, yc, radius, colour);
return 0;
}
int graphics_drawline(uint32_t x, uint32_t y, uint32_t x1, uint32_t y1, uint32_t colour)
{
printf("%s:%s(%d, %d, %d, %d, %d) @ %d\n", __FILE__, __func__,
x, y, x1, y1, colour,
__LINE__);
drawLine(&mainWindow, x, y, x1, y1, getColour(colour));
return 0;
}

512
src/os/unix/text.c Normal file
View File

@ -0,0 +1,512 @@
/*
* FbLib graphic library
*
* Created by Manoël TRAPIER.
* Copyright (c) 2003-2019 986-Studio. All rights reserved.
*
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdarg.h>
#include <os_dependent.h>
#define DEFAULT_FONT "default_font.psf"
FBLibFont *defaultFont = NULL;
/* Function will fail, if no string terminator */
static int getNextWordLen(char *str)
{
int ret = 0, i;
/* Word delimiters */
char word_lim[] = { ' ', '\t', '\n', 0 };
while (1)
{
for (i = 0 ; word_lim[i] != 0 ; i++)
{
if (*str == word_lim[i])
{
return ret;
}
}
str++;
ret++;
}
}
void graphics_text_line(int x, int y, int w, int charw, uint32_t color, int valign, void *font, char *text)
{
uint32_t len = strlen(text);
switch (valign)
{
default:
case TEXT_VALIGN_LEFT:
graphics_draw_text(x, y, color, (const FBLibFont *)font, text);
break;
case TEXT_VALIGN_CENTER:
graphics_draw_text(x + ((w - len * charw) / 2), y, color, (const FBLibFont *)font, text);
break;
case TEXT_VALIGN_RIGHT:
graphics_draw_text(x + (w - (len * charw)), y, color, (const FBLibFont *)font, text);
break;
}
}
/* Currently halign is not honored, but valign is */
int graphics_text_ex(int x, int y, int w, int h,
void *font,
uint32_t bgcolor, uint32_t fgcolor,
char valign, char halign,
uint16_t options,
void *format, ...)
{
char string[1024];
char line[300];
int charWidth, charHeight;
int textPos = 0;
int wordLen = 0;
int nextWordLen = 0;
va_list va;
uint16_t curColPos = 0, curLinePos = 0;
uint16_t maxCharPerLine, maxTextLine;
FBLibFont *userFont = font;
if (defaultFont == NULL)
{
defaultFont = load_psf(DEFAULT_FONT);
}
if (font == NULL)
{
userFont = defaultFont;
}
/* Do some usefull calculation */
/* We use fixed size font */
graphics_get_text_size(&charWidth, &charHeight, userFont, "A");
maxCharPerLine = w / charWidth;
maxTextLine = h / charHeight;
/* Now convert to a useable string */
va_start(va, format);
vsnprintf(string, 1024, format, va);
va_end(va);
/* Fill rect with bg color */
graphics_drawFillrect(x, y, w, h, bgcolor);
/* Now fill as much as possible */
memset(line, 0, 300);
while (curLinePos < maxTextLine)
{
if (options & TEXT_OPT_WORDWRAP)
{
/* Do thoses check only one time per word, not per characters */
if (wordLen <= 0)
{
/* check if next word is too large for width */
nextWordLen = getNextWordLen(&string[textPos]);
//printf("\nNextword len = %d", nextWordLen);
if (nextWordLen <= maxCharPerLine)
{
if ((curColPos + nextWordLen) > maxCharPerLine)
{
/* Go next line... */
line[curColPos] = 0;
graphics_text_line(x, y + curLinePos * charHeight, w, charWidth, fgcolor, valign, userFont,
line);
curColPos = 0;
curLinePos++;
memset(line, 0, 300);
}
}
wordLen = nextWordLen;
}
/* Now when the word is too long for a line, it will be automatically wrapped to the next line */
}
if ((string[textPos] == '\n') || (string[textPos] == '\r'))
{
textPos++;
line[curColPos] = 0;
graphics_text_line(x, y + curLinePos * charHeight, w, charWidth, fgcolor, valign, userFont, line);
curColPos = 0;
curLinePos++;
memset(line, 0, 300);
}
else if (string[textPos] == 0)
{
line[curColPos] = 0;
graphics_text_line(x, y + curLinePos * charHeight, w, charWidth, fgcolor, valign, userFont, line);
goto exit;
}
else if (curColPos >= maxCharPerLine)
{
/* display the line */
line[curColPos] = 0;
graphics_text_line(x, y + curLinePos * charHeight, w, charWidth, fgcolor, valign, userFont, line);
/* skip until a "\n" (and exit is "\0" found)) */
if (options & TEXT_OPT_WORDWRAP)
{
curColPos = 0;
curLinePos++;
memset(line, 0, 300);
}
else
{
while (1)
{
if ((string[textPos] == '\r') || (string[textPos] == '\n'))
{
curColPos = 0;
curLinePos++;
memset(line, 0, 300);
break;
}
else if (string[textPos] == 0)
{
goto exit;
}
textPos++;
}
}
}
else
{
line[curColPos++] = string[textPos++];
}
if (options & TEXT_OPT_WORDWRAP)
{
wordLen--;
}
}
exit:
return 0;
}
void *fblib_loadfont(char *filename)
{
return (void *)load_psf(filename);
}
/* PSF management */
#define PSF1_MAGIC0 0x36
#define PSF1_MAGIC1 0x04
#define PSF1_MODE512 0x01
#define PSF1_MODEHASTAB 0x02
#define PSF1_MODEHASSEQ 0x04
#define PSF1_MAXMODE 0x05
#define PSF1_SEPARATOR 0xFFFF
#define PSF1_STARTSEQ 0xFFFE
struct psf1_header
{
unsigned char magic[2]; /* Magic number */
unsigned char mode; /* PSF font mode */
unsigned char charsize; /* Character size */
};
#define PSF2_MAGIC0 0x72
#define PSF2_MAGIC1 0xb5
#define PSF2_MAGIC2 0x4a
#define PSF2_MAGIC3 0x86
/* bits used in flags */
#define PSF2_HAS_UNICODE_TABLE 0x01
/* max version recognized so far */
#define PSF2_MAXVERSION 0
/* UTF8 separators */
#define PSF2_SEPARATOR 0xFF
#define PSF2_STARTSEQ 0xFE
struct psf2_header
{
unsigned char magic[4];
unsigned int version;
unsigned int headersize; /* offset of bitmaps in file */
unsigned int flags;
unsigned int length; /* number of glyphs */
unsigned int charsize; /* number of bytes for each character */
unsigned int height, width; /* max dimensions of glyphs */
/* charsize = height * ((width + 7) / 8) */
};
static FBLibFont *load_psf1(char *filename, FILE *fp)
{
struct psf1_header head;
struct FBLibFont *font;
fread(&head, sizeof(head), 1, fp);
if ((head.magic[0] != PSF1_MAGIC0) || (head.magic[1] != PSF1_MAGIC1))
{
return NULL;
}
font = (FBLibFont *)malloc(sizeof(FBLibFont));
if (font != NULL)
{
font->height = head.charsize;
font->index_mask = 0xFF;
}
return NULL;
}
void printbin(uint32_t val, uint8_t bitlen)
{
int i;
for (i = 0 ; i < bitlen ; i++)
{
if (val & (1 << (bitlen - 1)))
{
printf("*");
}
else
{
printf("_");
}
val <<= 1;
}
}
static FBLibFont *load_psf2(char *filename, FILE *fp)
{
struct psf2_header head;
struct FBLibFont *font, *ret = NULL;
uint32_t charWidth;
uint32_t i, j, k;
uint8_t *bitmap;
fread(&head, sizeof(head), 1, fp);
if ((head.magic[0] != PSF2_MAGIC0) || (head.magic[1] != PSF2_MAGIC1) ||
(head.magic[2] != PSF2_MAGIC2) || (head.magic[3] != PSF2_MAGIC3)
)
{
goto exit;
}
font = (FBLibFont *)malloc(sizeof(FBLibFont));
assert(head.width <= 32); /* For now, do not support font with width larger than 32 pixels */
if (font != NULL)
{
font->height = head.height;
bitmap = (uint8_t *)malloc(sizeof(uint8_t) * head.charsize * head.length);
font->index_mask = 0xFF;
font->offset = (int *)malloc(sizeof(int) * head.length);
font->index = (int *)malloc(sizeof(int) * head.length * 3);
font->content = (uint32_t *)malloc(sizeof(uint32_t) * head.length * head.height);
charWidth = ((head.width + 7) / 8);
assert(bitmap != NULL);
assert(font->offset != NULL);
assert(font->index != NULL);
assert(font->content != NULL);
fread(bitmap, sizeof(uint8_t), head.charsize * head.length, fp);
for (i = 0 ; i < head.length ; i++)
{
font->offset[i] = i * 3;
font->index[(i * 3) + 0] = head.width;
font->index[(i * 3) + 1] = i * head.height;
font->index[(i * 3) + 2] = 0;
for (j = 0 ; j < head.height ; j++)
{
font->content[(i * head.height) + j] = 0;
for (k = 0 ; k < charWidth ; k++)
{
font->content[(i * head.height) + j] |=
(bitmap[(i * head.charsize) + (j * charWidth) + k]) << 8 * (3 - k);
}
}
}
ret = font;
free(bitmap);
}
exit:
fclose(fp);
return ret;
}
FBLibFont *load_psf(char *filename)
{
FILE *fp;
uint8_t byte;
console_printf(Console_Default, "Loading font '%s'\n", filename);
fp = fopen(filename, "rb");
if (fp != NULL)
{
byte = fgetc(fp);
rewind(fp);
switch (byte)
{
default:
fclose(fp);
return NULL; // Unsuported format
case PSF1_MAGIC0:
return load_psf1(filename, fp);
case PSF2_MAGIC0:
return load_psf2(filename, fp);
}
}
return NULL;
}
/* Font rendering code based on BOGL by Ben Pfaff */
static int fblib_draw_glyph(const FBLibFont *font, uint8_t wc, uint32_t **bitmap)
{
int mask = font->index_mask;
int i;
for (;;)
{
for (i = font->offset[wc & mask] ; font->index[i] ; i += 3)
{
if ((font->index[i] & ~mask) == (wc & ~mask))
{
if (bitmap != NULL)
{
*bitmap = &font->content[font->index[i + 1]];
}
return font->index[i] & mask;
}
}
}
return 0;
}
void graphics_get_text_size(int *width, int *height,
const FBLibFont *font,
const char *text)
{
uint8_t *c = (uint8_t *)text;
uint8_t wc;
int k, n, w, h, mw;
if (defaultFont == NULL)
{
defaultFont = load_psf(DEFAULT_FONT);
}
if (font == NULL)
{
font = defaultFont;
}
n = strlen(text);
mw = h = w = 0;
for (k = 0 ; k < n ; k++)
{
wc = *(c++);
if (wc == '\n')
{
if (w > mw)
{
mw = 0;
}
h += font->height;
continue;
}
w += fblib_draw_glyph(font, wc, NULL);
}
if (width != NULL)
{
*width = (w > mw) ? w : mw;
}
if (height != NULL)
{
*height = (h == 0) ? font->height : h;
}
}
void graphics_draw_text(int x, int y,
uint32_t colour,
const FBLibFont *font,
const char *text)
{
int32_t h, w, k, n, cx, cy, dx, dy;
uint8_t *c = (uint8_t *)text;
uint8_t wc;
if (defaultFont == NULL)
{
defaultFont = load_psf(DEFAULT_FONT);
}
if (font == NULL)
{
font = defaultFont;
}
n = strlen(text);
h = font->height;
dx = dy = 0;
for (k = 0 ; k < n ; k++)
{
uint32_t *glyph = NULL;
wc = *(c++);
if (wc == '\n')
{
dy += h;
dx = 0;
continue;
}
w = fblib_draw_glyph(font, wc, &glyph);
if (glyph == NULL)
{
continue;
}
for (cy = 0 ; cy < h ; cy++)
{
uint32_t g = *glyph++;
for (cx = 0 ; cx < w ; cx++)
{
if (g & 0x80000000)
{
graphics_drawpixel(x + dx + cx, y + dy + cy, colour);
}
g <<= 1;
}
}
dx += w;
}
}
/* End of PSF */

View File

@ -55,11 +55,11 @@ int plugin_load(int id)
Plugin *ptr = &(Plugins[0]);
int i = id;
console_printf(Console_Default, "%s(%d)", __func__, id);
//console_printf(Console_Default, "%s(%d)", __func__, id);
for (; i > 1 && ptr->name != NULL ; i--)
{
console_printf(Console_Default, "%d - %s\n", i, ptr->name);
//console_printf(Console_Default, "%d - %s\n", i, ptr->name);
ptr++;
}
@ -131,14 +131,15 @@ int plugin_remove_keypressHandler(uint8_t key, PluginKeypress func)
/* Available functions outside of plugins */
int plugin_keypress(uint8_t key)
int plugin_keypress()
{
KeyHandler *ptr = keyHandlersList;
while (ptr != NULL)
{
if (ptr->key == key)
if (getKeyStatus(ptr->key))
{
console_printf(Console_Default, "Keyrrr [%d].....\n", ptr->key);
ptr->func();
}
ptr = ptr->next;

View File

@ -9,6 +9,8 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <os_dependent.h>
@ -17,12 +19,11 @@
#include <plugins/manager.h>
#undef __TINES_PLUGINS_
#include <os_dependent.h>
#include <memory/manager.h>
#include <types.h>
#if 0
typedef enum gg_States_
{
GG_S00_MAIN_STATE = 0,
@ -51,7 +52,7 @@ uint8_t gg_PatchedValue[10];
func_rdhook gg_rdhookPtr[10];
#define GG_RDHOOKPATCH(d) \
uint8_t gg_RdHookPatch##d(uint8_t addr) \
static uint8_t gg_RdHookPatch##d(uint8_t addr) \
{ \
if (addr == gg_PatchedAddr[d]) \
{ \
@ -67,30 +68,22 @@ uint8_t gg_RdHookPatch##d(uint8_t addr) \
}
#define GG_MAX_PATCH 10
/* Defines the rdhook patches */
/* Defines the read hook patches */
GG_RDHOOKPATCH(0)
GG_RDHOOKPATCH(1)
GG_RDHOOKPATCH(2)
GG_RDHOOKPATCH(3)
GG_RDHOOKPATCH(4)
GG_RDHOOKPATCH(5)
GG_RDHOOKPATCH(6)
GG_RDHOOKPATCH(7)
GG_RDHOOKPATCH(8)
GG_RDHOOKPATCH(9)
void gg_SetPatch(int id, uint8_t page, uint8_t addr, uint8_t value)
{
func_rdhook fptr;
func_rdhook cur_ptr;
if (id >= GG_MAX_PATCH)
{
@ -154,30 +147,28 @@ void gg_SetPatch(int id, uint8_t page, uint8_t addr, uint8_t value)
break;
}
cur_ptr = get_page_rdhook(page);
if (cur_ptr != fptr)
{
set_page_rd_hook(page, fptr);
}
/* Access to the bitmap Buffer */
extern BITMAP *Buffer;
BITMAP *gg_Buffer;
}
void MessageBox(char *title, char *msg)
{
int sc_w, sc_h;
int box_h, box_t, box_l, box_w;
sc_w = screen->w;
sc_h = screen->h;
sc_w = 640; //screen->w;
sc_h = 480; //screen->h;
gg_Buffer = create_bitmap(sc_w, sc_h);
/*gg_Buffer = create_bitmap(sc_w, sc_h);
blit(Buffer, gg_Buffer, 0, 0, 0, 0, 512 + 256, 480);
blit(Buffer, gg_Buffer, 0, 0, 0, 0, 512 + 256, 480);*/
box_w = text_length(font, title) + 10;
box_w = 0;// text_length(font, title) + 10;
box_w = (box_w > text_length(font, msg)) ? box_w : text_length(font, msg);
//box_w = (box_w > text_length(font, msg)) ? box_w : text_length(font, msg);
box_w += 15 * 2; /*sc_w/2;*/
box_h = 15 * 2 + 10;
@ -186,70 +177,72 @@ void MessageBox(char *title, char *msg)
box_t = (sc_h - box_h) / 2;
box_l = (sc_w - box_w) / 2;
rectfill(gg_Buffer, box_l, box_t, box_l + box_w, box_t + box_h, 60);
rect(gg_Buffer, box_l + 5, box_t + 5, box_l + box_w - 5, box_t + box_h - 5, 34);
graphics_drawFillrect(box_l, box_t, box_l + box_w, box_t + box_h, 60);
graphics_drawRect(box_l + 5, box_t + 5, box_l + box_w - 5, box_t + box_h - 5, 34);
/* Display the title */
textout_centre_ex(gg_Buffer, font, title, box_w / 2 + box_l, box_t + 2, 34, 60);
//textout_centre_ex(gg_Buffer, font, title, box_w / 2 + box_l, box_t + 2, 34, 60);
/* Display the message */
textout_centre_ex(gg_Buffer, font, msg, box_w / 2 + box_l, 15 + box_t + 2, 34, 60);
//textout_centre_ex(gg_Buffer, font, msg, box_w / 2 + box_l, 15 + box_t + 2, 34, 60);
blit(gg_Buffer, screen, 0, 0, 0, 0, 512 + 256, 480);
//blit(gg_Buffer, screen, 0, 0, 0, 0, 512 + 256, 480);
sleep(1);
sleep(1000);
release_bitmap(gg_Buffer);
//release_bitmap(gg_Buffer);
}
uint16_t SelectNumber(char *title, char *msg, uint8_t size)
{
int sc_w, sc_h;
int box_h, box_t, box_l, box_w;
//int sc_w, sc_h;
//int box_h;
int box_w;
//int box_t, box_l;
char valueText[10];
uint16_t value;
uint8_t digit = 0;
sc_w = screen->w;
sc_h = screen->h;
//sc_w = 640; //screen->w;
//sc_h = 480; //screen->h;
gg_Buffer = create_bitmap(sc_w, sc_h);
//gg_Buffer = create_bitmap(sc_w, sc_h);
blit(Buffer, gg_Buffer, 0, 0, 0, 0, 512 + 256, 480);
//blit(Buffer, gg_Buffer, 0, 0, 0, 0, 512 + 256, 480);
box_w = text_length(font, title) + 10;
//box_w = text_length(font, title) + 10;
box_w = (box_w > text_length(font, msg)) ? box_w : text_length(font, msg);
box_w = 0; //(box_w > text_length(font, msg)) ? box_w : text_length(font, msg);
sprintf(valueText, "0000");
box_w = (box_w > text_length(font, valueText)) ? box_w : text_length(font, msg);
//box_w = (box_w > text_length(font, valueText)) ? box_w : text_length(font, msg);
box_w += 15 * 2; /*sc_w/2;*/
box_h = 15 * 2 + 30;
//box_h = 15 * 2 + 30;
/* Set the box center */
box_t = (sc_h - box_h) / 2;
box_l = (sc_w - box_w) / 2;
//box_t = (sc_h - box_h) / 2;
//box_l = (sc_w - box_w) / 2;
value = 0;
while (!key[KEY_ENTER])
while (getKeyStatus(KEY_ENTER)) // ENTER
{
rectfill(gg_Buffer, box_l, box_t, box_l + box_w, box_t + box_h, 60);
rect(gg_Buffer, box_l + 5, box_t + 5, box_l + box_w - 5, box_t + box_h - 5, 34);
//rectfill(gg_Buffer, box_l, box_t, box_l + box_w, box_t + box_h, 60);
//rect(gg_Buffer, box_l + 5, box_t + 5, box_l + box_w - 5, box_t + box_h - 5, 34);
/* Display the title */
textout_centre_ex(gg_Buffer, font, title, box_w / 2 + box_l, box_t + 2, 34, 60);
//textout_centre_ex(gg_Buffer, font, title, box_w / 2 + box_l, box_t + 2, 34, 60);
/* Display the message */
textout_centre_ex(gg_Buffer, font, msg, box_w / 2 + box_l, 15 + box_t + 2, 34, 60);
//textout_centre_ex(gg_Buffer, font, msg, box_w / 2 + box_l, 15 + box_t + 2, 34, 60);
if (size == 2)
{
@ -260,44 +253,44 @@ uint16_t SelectNumber(char *title, char *msg, uint8_t size)
sprintf(valueText, "%04X", value);
}
textout_centre_ex(gg_Buffer, font, valueText, box_w / 2 + box_l, 15 + box_t + 2 + 10, 34, 60);
//textout_centre_ex(gg_Buffer, font, valueText, box_w / 2 + box_l, 15 + box_t + 2 + 10, 34, 60);
switch (digit)
{
default:
case 0:
textout_centre_ex(gg_Buffer, font, " ^", box_w / 2 + box_l, 15 + box_t + 2 + 20, 34, 60);
//textout_centre_ex(gg_Buffer, font, " ^", box_w / 2 + box_l, 15 + box_t + 2 + 20, 34, 60);
break;
case 1:
textout_centre_ex(gg_Buffer, font, " ^ ", box_w / 2 + box_l, 15 + box_t + 2 + 20, 34, 60);
//textout_centre_ex(gg_Buffer, font, " ^ ", box_w / 2 + box_l, 15 + box_t + 2 + 20, 34, 60);
break;
case 2:
textout_centre_ex(gg_Buffer, font, " ^ ", box_w / 2 + box_l, 15 + box_t + 2 + 20, 34, 60);
//textout_centre_ex(gg_Buffer, font, " ^ ", box_w / 2 + box_l, 15 + box_t + 2 + 20, 34, 60);
break;
case 3:
textout_centre_ex(gg_Buffer, font, "^ ", box_w / 2 + box_l, 15 + box_t + 2 + 20, 34, 60);
//textout_centre_ex(gg_Buffer, font, "^ ", box_w / 2 + box_l, 15 + box_t + 2 + 20, 34, 60);
break;
}
blit(gg_Buffer, screen, 0, 0, 0, 0, 512 + 256, 480);
//blit(gg_Buffer, screen, 0, 0, 0, 0, 512 + 256, 480);
if (key[KEY_UP])
if (getKeyStatus(KEY_UP)) // UP
{
usleep(100000);
value += ((digit == 0) ? 0x0001 : ((digit == 1) ? 0x0010 : ((digit == 2) ? 0x0100 : 0x1000)));
value &= (size == 2) ? 0xFF : 0xFFFF;
}
if (key[KEY_DOWN])
if (getKeyStatus(KEY_DOWN)) // DOWN
{
usleep(100000);
value -= ((digit == 0) ? 0x0001 : ((digit == 1) ? 0x0010 : ((digit == 2) ? 0x0100 : 0x1000)));
value &= (size == 2) ? 0xFF : 0xFFFF;
}
if (key[KEY_RIGHT])
if (getKeyStatus(KEY_RIGHT)) // RIGHT
{
usleep(100000);
if (digit <= 0)
@ -310,7 +303,7 @@ uint16_t SelectNumber(char *title, char *msg, uint8_t size)
}
}
if (key[KEY_LEFT])
if (getKeyStatus(KEY_LEFT))
{
usleep(100000);
if (digit >= size - 1)
@ -324,8 +317,8 @@ uint16_t SelectNumber(char *title, char *msg, uint8_t size)
}
}
release_bitmap(gg_Buffer);
while (key[KEY_ENTER])
//release_bitmap(gg_Buffer);
while (getKeyStatus(KEY_ENTER))
{
}
return value;
@ -338,20 +331,27 @@ int DispMenu(int itemc, char *itemv[], char *title)
int selection = 0;
int i;
int sc_w, sc_h;
int box_h, box_t, box_l, box_w;
int32_t box_h, box_t, box_l, box_w;
int32_t text_h;
sc_w = screen->w;
sc_h = screen->h;
graphics_getScreenSize(&sc_w, &sc_h);
gg_Buffer = create_bitmap(sc_w, sc_h);
//gg_Buffer = create_bitmap(sc_w, sc_h);
blit(Buffer, gg_Buffer, 0, 0, 0, 0, 512 + 256, 480);
//blit(Buffer, gg_Buffer, 0, 0, 0, 0, 512 + 256, 480);
graphics_get_text_size(&box_w, &text_h, NULL, title);
box_w += 10;
box_w = text_length(font, title) + 10;
for (i = 0 ; i < itemc ; i++)
{
box_w = (box_w > text_length(font, itemv[i])) ? box_w : text_length(font, itemv[i]);
int32_t tmp;
graphics_get_text_size(&tmp, NULL, NULL, itemv[i]);
if (box_w < tmp)
{
box_w = tmp;
}
}
box_w += 15 * 2; /*sc_w/2;*/
@ -362,36 +362,51 @@ int DispMenu(int itemc, char *itemv[], char *title)
box_l = (sc_w - box_w) / 2;
while (!key[KEY_ENTER])
while (!getKeyStatus(KEY_ENTER))
{
/* Draw the box and highlight the selected item */
rectfill(gg_Buffer, box_l, box_t, box_l + box_w, box_t + box_h, 60);
rect(gg_Buffer, box_l + 5, box_t + 5, box_l + box_w - 5, box_t + box_h - 5, 34);
int i;
for (i = 0; i < box_h; i++)
{
graphics_drawline(box_l, box_t+i, box_w, box_t + i, 1);
}
graphics_drawline(5, 121, 251, 121, 41);
//graphics_drawFillrect(box_l, box_t, box_w, box_h, 5);
//graphics_drawRect(box_l + 5, box_t + 5, box_w - 5, box_h - 5, 1);
/* Display the title */
textout_centre_ex(gg_Buffer, font, title, box_w / 2 + box_l, box_t + 2, 34, 60);
graphics_text_ex(box_l, box_t + 2, box_w, text_h,
NULL,
34, 60,
TEXT_VALIGN_CENTER, TEXT_HALIGN_CENTER,
0,
title);
//textout_centre_ex(gg_Buffer, font, title, box_w / 2 + box_l, box_t + 2, 34, 60);
/* Display the highlight item */
rectfill(gg_Buffer, box_l + 15, 15 + box_t + (selection * 10), box_l + box_w - 15,
15 + box_t + (selection * 10) + 10, 34);
textout_centre_ex(gg_Buffer, font, itemv[selection], box_w / 2 + box_l, 15 + box_t + (selection * 10) + 2, 60,
34);
//graphics_drawFillrect(box_l + 15, 15 + box_t + (selection * 10), box_l + box_w - 15,
// 15 + box_t + (selection * 10) + 10, 34);
graphics_draw_text(box_w / 2 + box_l, 15 + box_t + (selection * 10) + 2, 60, NULL, itemv[selection]);
//textout_centre_ex(gg_Buffer, font, itemv[selection], box_w / 2 + box_l, 15 + box_t + (selection * 10) + 2, 60,
// 34);
/* Display other items */
for (i = 0 ; i < itemc ; i++)
{
if (i != selection)
{
textout_centre_ex(gg_Buffer, font, itemv[i], box_w / 2 + box_l, 15 + box_t + (i * 10) + 2, 34, 60);
//textout_centre_ex(gg_Buffer, font, itemv[i], box_w / 2 + box_l, 15 + box_t + (i * 10) + 2, 34, 60);
}
}
/* Blit the screen buffer */
blit(gg_Buffer, screen, 0, 0, 0, 0, 512 + 256, 480);
vsync();
//blit(gg_Buffer, screen, 0, 0, 0, 0, 512 + 256, 480);
/* Now get the keyboard state */
if (key[KEY_UP])
if (getKeyStatus(KEY_UP))
{
usleep(100000);
if (selection <= 0)
@ -404,7 +419,7 @@ int DispMenu(int itemc, char *itemv[], char *title)
}
}
if (key[KEY_DOWN])
if (getKeyStatus(KEY_DOWN))
{
usleep(100000);
if (selection >= (itemc - 1))
@ -419,9 +434,10 @@ int DispMenu(int itemc, char *itemv[], char *title)
}
release_bitmap(gg_Buffer);
while (key[KEY_ENTER])
//release_bitmap(gg_Buffer);
while (getKeyStatus(KEY_ENTER))
{
vsync();
}
return selection;
}
@ -474,7 +490,7 @@ uint8_t gg_SelectPatch()
}
else
{
sprintf(tmp, "Patch %d: Put 0x%02X on address 0x%02X%02X (Code: %08lX)",
sprintf(tmp, "Patch %d: Put 0x%02X on address 0x%02X%02X (Code: %08X)",
i, gg_PatchedValue[i], gg_PatchedPage[i], gg_PatchedAddr[i],
gg_MakeCode((gg_PatchedPage[i] << 8) | gg_PatchedAddr[i], gg_PatchedValue[i]));
}
@ -698,6 +714,9 @@ void gg_Start()
int ret;
uint8_t value;
uint16_t addr;
console_printf(Console_Default, "Open GG plugin...\n");
switch (gg_state)
{
default:
@ -863,7 +882,7 @@ int gg_Init()
int i;
console_printf(Console_Default, "Initializing GG plugin...\n");
plugin_install_keypressHandler('g', gg_Start);
plugin_install_keypressHandler('G', gg_Start);
for (i = 0 ; i < GG_MAX_PATCH ; i++)
{
@ -878,5 +897,3 @@ int gg_Deinit()
{
return 0;
}
#endif

View File

@ -12,7 +12,7 @@
#include "plugins/gamegenie.h"
Plugin Plugins[] = {
// { "Game Genie", gg_Init, gg_Deinit },
{ "Game Genie", gg_Init, gg_Deinit },
/* EOL tag */
{ NULL, NULL, NULL }