catch up on the fx9860g application

This commit is contained in:
Lephe 2019-07-18 17:53:54 -04:00
parent f56201af6c
commit 89537dd133
26 changed files with 287 additions and 157 deletions

3
.gitignore vendored
View File

@ -5,6 +5,3 @@ build.cg/
# Targets
gintctl.g1a
gintctl.g3a
# Full, heavier version of libfxcg
libfxcg-full.a

View File

@ -14,13 +14,14 @@ cf-cg := $(cf) -m4-nofpu -DFXCG50
# Linker flags
lf-fx := -Tfx9860g.ld -lprof -lgint-fx -lgcc -Wl,-Map=build.fx/map
lf-cg := -Tfxcg50.ld -lprof -lgint-cg -lgcc -Wl,-Map=build.cg/map -L. -lfxcg
lf-cg := -Tfxcg50.ld -lprof -lgint-cg -lgcc -Wl,-Map=build.cg/map
dflags = -MMD -MT $@ -MF $(@:.o=.d) -MP
cpflags := -R .bss -R .gint_bss
g1af := -i icon-fx.png -n gintctl --internal=@GINTCTL
g3af := -n basic:" " -i uns:icon-cg-uns.png -i sel:icon-cg-sel.png
g1af := -i assets-fx/icon.png -n gintctl --internal=@GINTCTL
g3af := -n basic:" " -i uns:assets-cg/icon-uns.png \
-i sel:assets-cg/icon-sel.png
#
# File listings
@ -33,13 +34,14 @@ target-cg := gintctl.g3a
# Source and object files
src := $(shell find src -name '*.c')
res := $(wildcard resources/*.png)
obj-fx := $(src:%.c=build.fx/%.o) $(res:resources/%=build.fx/%.o)
obj-cg := $(src:%.c=build.cg/%.o) $(res:resources/%=build.cg/%.o)
assets-fx := $(wildcard assets-fx/*.png)
assets-cg := $(wildcard assets-cg/*.png)
obj-fx := $(src:%.c=build.fx/%.o) $(assets-fx:assets-fx/%=build.fx/%.o)
obj-cg := $(src:%.c=build.cg/%.o) $(assets-ch:assets-cg/%=build.cg/%.o)
# Additional dependencies
deps-fx := icon-fx.png
deps-cg := icon-cg-uns.png icon-cg-sel.png
deps-fx := assets-fx/icon.png
deps-cg := assets-cg/icon-uns.png assets-cg/icon-sel.png
#
# Build rules
@ -71,10 +73,10 @@ build.cg/%.o: %.c
sh4eb-elf-gcc -c $< -o $@ $(cf-cg) $(dflags)
# Images
build.fx/%.png.o: resources/%.png
build.fx/%.png.o: assets-fx/%.png
@ mkdir -p $(dir $@)
fxconv -i $< -o $@ name:$*
build.cg/%.png.o: resources/%.png
build.cg/%.png.o: assets-cg/%.png
@ echo -e "\e[31;1mWARNING: conversion for fxcg50 not supported yet\e[0m"
@ mkdir -p $(dir $@)
fxconv -i $< -o $@ name:$*

1
TODO
View File

@ -1 +0,0 @@
* perf: Try 284x124 at (-60,-28) (all disadvantages)

View File

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 259 B

After

Width:  |  Height:  |  Size: 259 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
assets-fx/opt_main.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

Before

Width:  |  Height:  |  Size: 7.8 KiB

After

Width:  |  Height:  |  Size: 7.8 KiB

View File

@ -20,15 +20,17 @@ struct menu {
int len;
int offset;
int pos;
int visible;
int top;
int bottom;
struct menuentry entries[];
};
/* menu_init(): Initialize a menu list
@menu Any list menu, even unitialized
@visible Number of lines that can be shown simultaneously */
void menu_init(struct menu *menu, int visible);
@menu Any list menu, even uninitialized
@top Number of lines reserved on top (including title on fx9860g)
@bottom Number of lines reserved at bottom */
void menu_init(struct menu *menu, int top, int bottom);
/* menu_move(): Move the cursor in a menu
@menu Initialized list menu

View File

@ -10,6 +10,7 @@
enum {
PROFCTX_BASICS = 0,
PROFCTX_EMPTY,
PROFCTX_DCLEAR,
PROFCTX_DUPDATE,

View File

@ -36,7 +36,7 @@ void row_highlight(int row);
void row_right(int row, char const *character);
/* scrollbar(): Show a scrollbar */
void scrollbar(int offset, int length);
void scrollbar(int offset, int length, int top, int bottom);
/* row_count(): Number of rows available to row_print() */
int row_count(void);

BIN
libfxcg.a

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 770 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -39,8 +39,8 @@ static void hw_mpucpu(int *row)
else put(" %s", mpu_names[mpu]);
if(!isSH4()) return;
put(_(" PVR"," Processor Version Register") ": %08x", gint[HWCPUVR]);
put(_(" PRR"," Product Register") ": %08x", gint[HWCPUPR]);
put(_(" PVR:"," Processor Version Register: ") "%08x", gint[HWCPUVR]);
put(_(" PRR:"," Product Register: ") "%08x", gint[HWCPUPR]);
}
/* Memory */
@ -54,10 +54,10 @@ static void hw_memory(int *row)
put("Memory and MMU" _(,":"));
load_barrier(mmu);
put(" ROM: %dM", rom >> 20);
put(" ROM:" _(," ") "%dM", rom >> 20);
#ifdef FX9860G
put(" RAM: %dk (%dk user)", ram >> 10, uram >> 10);
put(" RAM:%dk (%dk user)", ram >> 10, uram >> 10);
#else
put(" RAM: %dM (%dk mapped in userspace)", ram >> 20, uram >> 10);
#endif
@ -72,13 +72,13 @@ static void hw_cpg(int *row)
{
int cpg = gint[HWCPG];
put("Clock Pulse Generator" _(,":"));
put(_("Clock Generator", "Clock Pulse Generator:"));
load_barrier(cpg);
if(cpg & HWCPG_COMP) put(
_(" Input freq known"," Input clock frequency is known"));
if(cpg & HWCPG_EXT) put(
_(" CPG is extended"," SH7724-style extended module"));
_(" SH7724-style CPG"," SH7724-style extended module"));
}
/* Direct Memory Access Controller */
@ -224,10 +224,13 @@ void gintctl_gint_hardware(void)
while(key != KEY_EXIT)
{
dclear(C_WHITE);
row_title(_("Hardware", "Hardware and loaded drivers"));
#ifdef FXCG50
row_title("Hardware and loaded drivers");
#endif
max = display_data(offset);
scrollbar(offset, max);
scrollbar(offset, max, 1, row_count() + 1);
dupdate();

View File

@ -7,52 +7,77 @@
#include <gintctl/util.h>
#include <gintctl/gint.h>
/* tmu_print(): Print a TMU's details */
void tmu_print(int x, int y, char const *name, tmu_t *tmu, int running)
/* timer_print(): Print a timer's details */
void timer_print(int x, int y, char const *name, uint32_t TCOR, uint32_t TCNT,
int UNIE, int UNF, int STR)
{
int dx = _(27,45), dy = _(8,14);
int dy = _(8,14);
print(x, y, "%s:", name);
if(!tmu)
{
print(x, y + dy, "(null)");
return;
}
print(x, y + dy, "TCOR");
print(x + dx, y + dy, "%08x", tmu->TCOR);
#ifdef FXCG50
print(x, y+dy, "TCOR");
print(x, y+2*dy, "TCNT");
#endif
print(x, y + 2 * dy, "TCNT");
print(x + dx, y + 2 * dy, "%08x", tmu->TCNT);
print(_(x+6, x+45), y+dy, "%08x", TCOR);
print(_(x+60, x+45), _(y+dy, y+2*dy), "%08x", TCNT);
print(x, y + 3 * dy, "%s%s%s",
tmu->TCR.UNIE ? "UNIE " : "",
tmu->TCR.UNF ? "UNF " : "",
running ? "TSTR " : ""
print(_(x+36, x), _(y, y+3*dy), "%s%s%s",
UNIE ? "UNIE " : "",
UNF ? "UNF " : "",
STR ? "STR " : ""
);
}
/* tmu_print(): Print a TMU's details */
void tmu_print(int x, int y, char const *name, tmu_t *tmu, int STR)
{
timer_print(x, y, name, tmu->TCOR, tmu->TCNT, tmu->TCR.UNIE,
tmu->TCR.UNF, STR);
}
/* etmu_print(): Print an ETMU's details */
void etmu_print(int x, int y, char const *name, etmu_t *etmu)
{
int dx = _(27,45), dy = _(8,14);
print(x, y, "%s:", name);
if(!etmu)
{
print(x, y + dy, "(null)");
return;
}
timer_print(x, y, name, etmu->TCOR, etmu->TCNT, etmu->TCR.UNIE,
etmu->TCR.UNF, etmu->TSTR);
}
print(x, y + dy, "TCOR");
print(x + dx, y + dy, "%08x", etmu->TCOR);
print(x, y + 2 * dy, "TCNT");
print(x + dx, y + 2 * dy, "%08x", etmu->TCNT);
#ifdef FX9860G
static int x[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1 };
static int y[] = { 0, 16, 32, 0, 16, 32, 0, 16, 32 };
#else
static int x[] = { 6, 138, 270, 6, 138, 270, 6, 138, 270 };
static int y[] = { 24, 24, 24, 84, 84, 84, 144, 144, 144 };
#endif
print(x, y + 3 * dy, "%s%s%s",
etmu->TCR.UNIE ? "UNIE " : "",
etmu->TCR.UNF ? "UNF " : "",
etmu->TSTR ? "TSTR " : ""
);
void show_tmu(void)
{
volatile uint8_t *TSTR;
timer_address(0, &TSTR);
tmu_print(x[0], y[0], "TMU0", timer_address(0, NULL), *TSTR & 0x1);
tmu_print(x[1], y[1], "TMU1", timer_address(1, NULL), *TSTR & 0x2);
tmu_print(x[2], y[2], "TMU2", timer_address(2, NULL), *TSTR & 0x4);
}
void show_etmu_1(void)
{
etmu_print(x[3], y[3], "ETMU0", timer_address(3, NULL));
if(isSH3()) return;
etmu_print(x[4], y[4], "ETMU1", timer_address(4, NULL));
etmu_print(x[5], y[5], "ETMU2", timer_address(5, NULL));
}
void show_etmu_2(void)
{
if(isSH3()) return;
etmu_print(x[6], y[6], "ETMU3", timer_address(6, NULL));
etmu_print(x[7], y[7], "ETMU4", timer_address(7, NULL));
etmu_print(x[8], y[8], "ETMU5", timer_address(8, NULL));
}
/* gintctl_gint_timer(): Show the timer status in real-time */
@ -64,30 +89,29 @@ void gintctl_gint_timer(void)
program to ~90 FPS.) */
int key = 0, timeout = 1;
#ifdef FX9860G
int tab = 1;
#endif
while(key != KEY_EXIT)
{
dclear(C_WHITE);
#ifdef FX9860G
#warning gintctl_gint_timer not implemented yet
if(tab == 1) show_tmu();
if(tab == 2) show_etmu_1();
if(tab == 3) show_etmu_2();
extern image_t opt_gint_timers;
dimage(0, 56, &opt_gint_timers);
#endif
#ifdef FXCG50
row_title("Timer status");
volatile uint8_t *TSTR;
timer_address(0, &TSTR);
tmu_print(6, 24, "TMU0", timer_address(0, NULL),*TSTR & 0x1);
tmu_print(138, 24, "TMU1", timer_address(1, NULL),*TSTR & 0x2);
tmu_print(270, 24, "TMU2", timer_address(2, NULL),*TSTR & 0x4);
etmu_print(6, 84, "ETMU0", timer_address(3, NULL));
etmu_print(138, 84, "ETMU1", timer_address(4, NULL));
etmu_print(270, 84, "ETMU2", timer_address(5, NULL));
etmu_print(6, 144, "ETMU3", timer_address(6, NULL));
etmu_print(138, 144, "ETMU4", timer_address(7, NULL));
etmu_print(270, 144, "ETMU5", timer_address(8, NULL));
show_tmu();
show_etmu_1();
show_etmu_2();
fkey_button(1, "SLEEP");
#endif
@ -95,15 +119,22 @@ void gintctl_gint_timer(void)
dupdate();
key = getkey_opt(GETKEY_DEFAULT, &timeout).key;
/* On F1, pretend to sleep and just see what happens */
if(key == KEY_F1)
{
volatile int flag = 0;
int tid = 0;
int free = timer_setup(5, timer_delay(5, 1000000), 0,
timer_timeout, &flag);
if(free >= 0) timer_start(5);
int free = timer_setup(tid, timer_delay(tid, 1000000),
0, timer_timeout, &flag);
if(free == tid) timer_start(tid);
}
#ifdef FX9860G
/* On F4, F5 and F6, switch tabs */
if(key == KEY_F4) tab = 1;
if(key == KEY_F5) tab = 2;
if(key == KEY_F6) tab = 3;
#endif
}
}

View File

@ -50,8 +50,8 @@ struct menu menu_gint = {
struct menu menu_perf = {
_("Performance", "Performance benchmarks"), .entries = {
{ "libprof basics", gintctl_perf_libprof },
{ "Rendering primitives", gintctl_perf_render },
{ "libprof basics", gintctl_perf_libprof },
{ "Rendering functions", gintctl_perf_render },
{ NULL, NULL },
}};
@ -115,18 +115,19 @@ void gintctl_main(void)
{
#ifdef FX9860G
row_title("gint @%07x", GINT_VERSION);
row_print(2, 1, "F2:gint tests");
row_print(3, 1, "F3:MPU registers");
row_print(4, 1, "F4:Memory map/dump");
row_print(5, 1, "F5:Performance");
row_print(3, 1, "F2:gint tests");
row_print(4, 1, "F3:Performance");
row_print(5, 1, "F5:MPU registers");
row_print(6, 1, "F6:Memory map/dump");
#endif /* FX9860G */
#ifdef FXCG50
row_title("gint @%07x for fx-CG 50", GINT_VERSION);
row_print(1, 1, "F2: gint features and driver tests");
row_print(2, 1, "F3: MPU register browser");
row_print(3, 1, "F4: Hexadecimal memory editor");
row_print(4, 1, "F5: Performance benchmarks");
row_print(2, 1, "F3: Performance benchmarks");
row_print(3, 1, "F5: MPU register browser");
row_print(4, 1, "F6: Hexadecimal memory editor");
#ifdef GINT_BOOTLOG
extern char gint_bootlog[22 * 8];
@ -142,22 +143,22 @@ void gintctl_main(void)
int main(GUNUSED int isappli, GUNUSED int optnum)
{
/* Initialize menu metadata */
menu_init(&menu_gint, row_count());
menu_init(&menu_perf, row_count());
int top = _(1, 0), bottom = _(1, 0);
menu_init(&menu_gint, top, bottom);
menu_init(&menu_perf, top, bottom);
/* Start the profiling library */
prof_init(PROFCTX_COUNT, 2);
int tab = 1, key = 0;
int key = 0;
struct menu *menu = NULL;
while(key != KEY_EXIT)
{
dclear(C_WHITE);
if(tab == 1) gintctl_main();
else if(menu) menu_show(menu);
else row_title("Nothing, essentially");
if(menu) menu_show(menu);
else gintctl_main();
#ifdef FX9860G
extern image_t opt_main;
@ -165,24 +166,24 @@ int main(GUNUSED int isappli, GUNUSED int optnum)
#else
fkey_action(1, "INFO");
fkey_menu(2, "GINT");
fkey_menu(3, "REGS");
fkey_button(4, "MEMORY");
fkey_menu(5, "PERF");
fkey_menu(3, "PERF");
fkey_button(5, "REGS");
fkey_button(6, "MEMORY");
#endif
dupdate();
key = getkey().key;
if(key == KEY_F1)
tab = 1, menu = NULL;
menu = NULL;
if(key == KEY_F2)
tab = 2, menu = &menu_gint;
menu = &menu_gint;
if(key == KEY_F3)
tab = 3, menu = NULL;
if(key == KEY_F4)
/* TODO: Launch memory explorer */ { }
menu = &menu_perf;
if(key == KEY_F5)
tab = 5, menu = &menu_perf;
gintctl_regs();
if(key == KEY_F6)
/* TODO: Launch memory explorer */ { }
if(!menu) continue;

View File

@ -4,20 +4,22 @@
#include <gintctl/util.h>
/* menu_init(): Initialize a menu list */
void menu_init(struct menu *menu, int visible)
void menu_init(struct menu *menu, int top, int bottom)
{
menu->len = 0;
while(menu->entries[menu->len].name) menu->len++;
menu->offset = 0;
menu->pos = 0;
menu->visible = visible;
menu->top = top + 1;
menu->bottom = row_count() - bottom + 1;
}
/* menu_move(): Move the cursor in a menu */
void menu_move(struct menu *menu, int key, int wrap)
{
int max_offset = max(menu->len - menu->visible, 0);
int visible = menu->bottom - menu->top;
int max_offset = max(menu->len - visible, 0);
if(key == KEY_UP && menu->pos > 0)
{
@ -33,8 +35,8 @@ void menu_move(struct menu *menu, int key, int wrap)
if(key == KEY_DOWN && menu->pos + 1 < menu->len)
{
menu->pos++;
if(menu->pos > menu->offset + menu->visible - 1
&& menu->offset + 1 < max_offset)
if(menu->pos > menu->offset + visible - 1
&& menu->offset + 1 <= max_offset)
{
menu->offset++;
}
@ -51,21 +53,28 @@ void menu_show(struct menu const *menu)
{
struct menuentry const *items = menu->entries;
int offset = menu->offset, pos = menu->pos;
int i = 0;
row_title(menu->name);
/* Min and max writable rows */
int top = menu->top, bottom = menu->bottom;
while(i+1 <= menu->visible && items[offset+i].name)
int i = 0, j = top;
/* On fx9860g, only show the title if row is left for it */
if(_(top > 0, 1)) row_title(menu->name);
while(j < bottom && items[offset+i].name)
{
row_print(i+1, 2, items[offset+i].name);
i++;
row_print(j, 2, items[offset+i].name);
i++, j++;
}
if(offset > 0) row_right(1, "^");
if(items[offset+i].name) row_right(row_count(), "v");
if(menu->len > bottom - top)
{
scrollbar(offset, menu->len, top, bottom);
}
int selected = pos - offset + 1;
if(selected >= 1 && selected <= menu->visible) row_highlight(selected);
int selected = top + (pos - offset);
if(selected >= top && selected < bottom) row_highlight(selected);
}
/* menu_exec(): Execute the currently-selected function of a menu */

View File

@ -8,45 +8,59 @@
#include <libprof.h>
/* Waits 1s and returns the libprof output in microseconds */
static uint32_t run_test(void)
/* Waits some time and returns the libprof output in microseconds */
static uint32_t run_sleep(int us)
{
int ctx = PROFCTX_BASICS;
prof_clear(ctx);
prof_enter(ctx);
static int delay = 100000;
sleep_us(1, delay);
sleep_us(1, us);
prof_leave(ctx);
delay += 256;
return prof_time(ctx);
}
/* Measure overhead of an empty context */
static uint32_t run_empty(void)
{
int ctx = PROFCTX_EMPTY;
prof_clear(ctx);
prof_enter(ctx);
prof_leave(ctx);
return prof_time(ctx);
}
/* gintctl_perf_libprof(): Test the libprof implementation */
void gintctl_perf_libprof(void)
{
int key = 0, test = 0;
uint32_t elapsed = 0;
int key=0, test=0, delay=10000;
uint32_t sleep_delay = 0;
uint32_t empty = 0;
while(key != KEY_EXIT)
{
dclear(C_WHITE);
row_title("libprof basics");
#ifdef FX9860G
#warning gintctl_perf_libprof incomplete on fx9860g
row_print(1, 1, "Measures time for");
row_print(2, 1, "10ms sleep +1us each");
row_print(3, 1, "time, and empty code.");
row_print(2, 2, "Checks that libprof");
row_print(3, 2, "Press F1 to start.");
row_print(5, 2, "Delay: 1s");
if(test)
{
row_print(5, 1, "Sleep: %.3j ms", sleep_delay);
row_print(6, 1, "Empty: %d us", empty);
}
if(test == 1) row_print(6, 2, "Elapsed: %8xus", elapsed);
#endif
extern image_t opt_perf_libprof;
dimage(0, 56, &opt_perf_libprof);
#endif /* FX9860G */
#ifdef FXCG50
row_title("libprof basics");
row_print(1, 1, "This program shows the execution time "
"measured");
row_print(2, 1, "by libprof for a 100 ms sleep, with 256us "
@ -54,16 +68,26 @@ void gintctl_perf_libprof(void)
row_print(3, 1, "each time.");
row_print(5, 1, "Press F1 to start the test.");
if(test) row_print(7, 1, "Elapsed: %.1j ms (%#08x us)",
elapsed / 100, elapsed);
if(test) row_print(8, 1, "Tests: %d", test);
if(test)
{
row_print(7, 1, "Sleep: %.3j us", sleep_delay);
row_print(8, 1, "Empty: %d us", empty);
row_print(9, 1, "Tests: %d", test);
}
fkey_button(1, "START");
#endif
#endif /* FXCG50 */
dupdate();
key = getkey().key;
if(key == KEY_F1) elapsed = run_test(), test++;
if(key == KEY_F1)
{
sleep_delay = run_sleep(delay);
empty = run_empty();
delay++;
test++;
}
}
}

View File

@ -1,5 +1,6 @@
#include <gint/keyboard.h>
#include <gint/display.h>
#include <gint/std/stdio.h>
#include <gintctl/util.h>
#include <gintctl/prof-contexts.h>
@ -36,12 +37,22 @@ static void run_test(struct elapsed *time)
drect(1, 1, 32, 32, C_WHITE)
);
test(PROFCTX_DRECT3, time->rect3,
drect(0, 0, 395, 223, C_WHITE)
drect(0, 0, _(127,395), _(63,223), C_WHITE)
);
#undef test
}
char *printtime(uint32_t us)
{
static char str[20];
if(us < 1000) sprintf(str, "%d us", us);
else sprintf(str, "%.1j ms", us / 100);
return str;
}
/* gintctl_perf_render(): Profile the display primitives */
void gintctl_perf_render(void)
{
@ -51,13 +62,25 @@ void gintctl_perf_render(void)
while(key != KEY_EXIT)
{
dclear(C_WHITE);
row_title("Rendering primitives");
#ifdef FX9860G
#warning gintctl_perf_render not implemented on fx9860g
row_print(1, 1, "Rendering functions");
if(test)
{
row_print(2, 1, "dclear: %s", printtime(time.clear));
row_print(3, 1, "dupdate: %s", printtime(time.update));
row_print(4, 1, "rect1: %s", printtime(time.rect1));
row_print(5, 1, "rect2: %s", printtime(time.rect2));
row_print(6, 1, "rect3: %s", printtime(time.rect3));
}
extern image_t opt_perf_render;
dimage(0, 56, &opt_perf_render);
#endif
#ifdef FXCG50
row_title("Rendering functions");
row_print(1, 1, "This program measures the execution time of");
row_print(2, 1, "common drawing functions.");
@ -66,24 +89,19 @@ void gintctl_perf_render(void)
if(test)
{
print(6, 90, "dclear:");
print(6, 105, "%.1j ms", time.clear / 100);
print(6, 120, "%05x us", time.clear);
print(6, 105, "%s", printtime(time.clear));
print(83, 90, "dupdate:");
print(83, 105, "%.1j ms", time.update / 100);
print(83, 120, "%05x us", time.update);
print(83, 105, "%s", printtime(time.update));
print(160, 90, "rect1:");
print(160, 105, "%.1j ms", time.rect1 / 100);
print(160, 120, "%05x us", time.rect1);
print(160, 105, "%s", printtime(time.rect1));
print(237, 90, "rect2:");
print(237, 105, "%.1j ms", time.rect2 / 100);
print(237, 120, "%05x us", time.rect2);
print(237, 105, "%s", printtime(time.rect2));
print(314, 90, "rect3:");
print(314, 105, "%.1j ms", time.rect3 / 100);
print(314, 120, "%05x us", time.rect3);
print(314, 105, "%s", printtime(time.rect3));
}
fkey_button(1, "START");

43
src/regs/regs.c Normal file
View File

@ -0,0 +1,43 @@
#include <gint/mpu/intc.h>
#include <gint/hardware.h>
#include <gint/display.h>
#include <gint/keyboard.h>
#include <gintctl/util.h>
void gintctl_regs(void)
{
if(isSH3()) return;
#ifdef FX9860G
#warning gintctl_regs not implemented on SH3
#endif
#define IPR(X) SH7305_INTC._->IPR##X.word
#define IMR(X) SH7305_INTC.MSK->IMR##X
dclear(C_WHITE);
row_title("Register browser");
row_print(2, 1, "A:%04x B:%04x C:%04x", IPR(A), IPR(B), IPR(C));
row_print(3, 1, "D:%04x E:%04x F:%04x", IPR(D), IPR(E), IPR(F));
row_print(4, 1, "G:%04x H:%04x I:%04x", IPR(G), IPR(H), IPR(I));
row_print(5, 1, "J:%04x K:%04x L:%04x", IPR(J), IPR(K), IPR(L));
dupdate();
getkey();
dclear(C_WHITE);
row_title("Register browser");
row_print(2, 1, "0:%02x 1:%02x 2:%02x 3:%02x",
IMR(0), IMR(1), IMR(2), IMR(3));
row_print(3, 1, "4:%02x 5:%02x 6:%02x 7:%02x",
IMR(4), IMR(5), IMR(6), IMR(7));
row_print(4, 1, "8:%02x 9:%02x A:%02x B:%02x",
IMR(8), IMR(9), IMR(10), IMR(11));
row_print(5, 1, "C:%02x", IMR(12));
dupdate();
getkey();
}

View File

@ -19,10 +19,10 @@
#ifdef FX9860G
#define ROW_X 1
#define ROW_W 6
#define ROW_Y 8
#define ROW_Y 0
#define ROW_YPAD 0
#define ROW_H 8
#define ROW_COUNT 6
#define ROW_COUNT 8
#endif /* FX9860G */
#ifdef FXCG50
@ -54,7 +54,7 @@ void row_title(char const *format, ...)
/* row_print(): Formatted printing in a predefined row */
void row_print(int row, int x, char const *format, ...)
{
if(row < 1 || row > ROW_COUNT) return;
if(row < _(0,1) || row > ROW_COUNT) return;
char str[80];
shortprint(str, format);
@ -70,7 +70,7 @@ void row_highlight(int row)
int y2 = y1 + ROW_H;
#ifdef FX9860G
drect(0, y1, 127, y2 - 1, C_INVERT);
drect(0, y1, 125, y2 - 1, C_INVERT);
#endif
#ifdef FXCG50
@ -93,15 +93,15 @@ void row_right(int row, char const *character)
}
/* scrollbar(): Show a scrollbar */
void scrollbar(int offset, int length)
void scrollbar(int offset, int length, int top, int bottom)
{
int area_x = _(127, 391);
int area_width = _(1, 2);
int area_top = ROW_Y;
int area_height = ROW_H * ROW_COUNT;
int area_top = ROW_Y + ROW_H * (top - 1);
int area_height = ROW_H * (bottom - top);
int bar_top = (offset * area_height) / length;
int bar_height = (ROW_COUNT * area_height) / length;
int bar_height = ((bottom - top) * area_height) / length;
drect(area_x, area_top + bar_top, area_x + area_width - 1,
area_top + bar_top + bar_height, C_BLACK);