From 89537dd133715deead8b6dcae046c499803da095 Mon Sep 17 00:00:00 2001 From: Lephe Date: Thu, 18 Jul 2019 17:53:54 -0400 Subject: [PATCH] catch up on the fx9860g application --- .gitignore | 3 - Makefile | 22 ++-- TODO | 1 - icon-cg-sel.png => assets-cg/icon-sel.png | Bin icon-cg-uns.png => assets-cg/icon-uns.png | Bin icon-fx.png => assets-fx/icon.png | Bin assets-fx/opt_gint_timers.png | Bin 0 -> 2668 bytes assets-fx/opt_main.png | Bin 0 -> 3072 bytes assets-fx/opt_perf_libprof.png | Bin 0 -> 1193 bytes assets-fx/opt_perf_render.png | Bin 0 -> 1193 bytes {resources => assets-fx}/pattern.png | Bin {resources => assets-fx}/pattern2.png | Bin include/gintctl/menu.h | 10 +- include/gintctl/prof-contexts.h | 1 + include/gintctl/util.h | 2 +- libfxcg.a | Bin 1952 -> 0 bytes res-cg/opt_main.png | Bin 770 -> 0 bytes resources/opt_main.png | Bin 3089 -> 0 bytes src/gint/hardware.c | 19 ++-- src/gint/timer.c | 131 +++++++++++++--------- src/gintctl.c | 49 ++++---- src/menu.c | 37 +++--- src/perf/libprof.c | 66 +++++++---- src/perf/render.c | 44 +++++--- src/regs/regs.c | 43 +++++++ src/util.c | 16 +-- 26 files changed, 287 insertions(+), 157 deletions(-) delete mode 100644 TODO rename icon-cg-sel.png => assets-cg/icon-sel.png (100%) rename icon-cg-uns.png => assets-cg/icon-uns.png (100%) rename icon-fx.png => assets-fx/icon.png (100%) create mode 100644 assets-fx/opt_gint_timers.png create mode 100644 assets-fx/opt_main.png create mode 100644 assets-fx/opt_perf_libprof.png create mode 100644 assets-fx/opt_perf_render.png rename {resources => assets-fx}/pattern.png (100%) rename {resources => assets-fx}/pattern2.png (100%) delete mode 100644 libfxcg.a delete mode 100644 res-cg/opt_main.png delete mode 100644 resources/opt_main.png create mode 100644 src/regs/regs.c diff --git a/.gitignore b/.gitignore index ea4a8f5..1fda17e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,3 @@ build.cg/ # Targets gintctl.g1a gintctl.g3a - -# Full, heavier version of libfxcg -libfxcg-full.a diff --git a/Makefile b/Makefile index 1217959..57ed664 100755 --- a/Makefile +++ b/Makefile @@ -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:$* diff --git a/TODO b/TODO deleted file mode 100644 index ebe3322..0000000 --- a/TODO +++ /dev/null @@ -1 +0,0 @@ -* perf: Try 284x124 at (-60,-28) (all disadvantages) diff --git a/icon-cg-sel.png b/assets-cg/icon-sel.png similarity index 100% rename from icon-cg-sel.png rename to assets-cg/icon-sel.png diff --git a/icon-cg-uns.png b/assets-cg/icon-uns.png similarity index 100% rename from icon-cg-uns.png rename to assets-cg/icon-uns.png diff --git a/icon-fx.png b/assets-fx/icon.png similarity index 100% rename from icon-fx.png rename to assets-fx/icon.png diff --git a/assets-fx/opt_gint_timers.png b/assets-fx/opt_gint_timers.png new file mode 100644 index 0000000000000000000000000000000000000000..7e541427112bcc09b1ba8d7d74e9e0de04a30d28 GIT binary patch literal 2668 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 ayYLs)W3)jBN4)9)0000 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 O0000 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 H8pfM%Ba5(c diff --git a/res-cg/opt_main.png b/res-cg/opt_main.png deleted file mode 100644 index 59bf4acd500680d9279829dbed69378d9efabb54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 770 zcmV+d1O5DoP)RCwC$T*0!#APB5)`v0GtyhCO(jv%6fk#srQ*0_t{ zil*s2&y><9l%40vwgU)&0Ei4EqNSkYralNajQ|8dkf${E4TmS_jDf*mWA+CMU@%w! zCDo-_F4=W`TGPh)cbZx>|C*nst39z0}IJldGm*3_S}a<+XP!h^8$j>8bEEZTW?wgN6sT&pqkVjC_4H!-T6hmA!qH)XkKf z@|%Qe7@t|qx^iOvxcg+YXs_uDVR%+6vvT|tLf6t-RhxaXL^Zoz z>=!G~LP;5G&LUKVATe2#=3Tzk`qm3U&jW3=lDA_jgZ))a@ipNnA+HYy(cPTzHdzoEC_E_hi_7mVHVkP3hev{&_lt*Te>zDi^VC+>Jl@(iPuZTku{^L&jQCnY)6pI!h55}mHhnHh z>cdr_-?T;2XpL=mbMu|7$;*pl^7f2Z%RtHA458WB>pF07*qoM6N<$f{dPM A*8l(j diff --git a/resources/opt_main.png b/resources/opt_main.png deleted file mode 100644 index c81b9b41571a6f0c55d5be2389774bc877af65ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3089 zcmV+s4DR!ZP) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3#tawNG8g#YstJ_1RQ1bH035aAp6`2N7wXlB>z z-F1Z3BXz4(#RoExnVfL{^-l}`;48P$L#f)^Xf5(pMj3hXp~s(J_v`(0EyePF{`g8? zKU4Vi58r>!d=%d0^Q)Gx>+*H|$Bpg#oq_(~52^m{0r{Rk|2nbG?}_toRupHP@z<~Z z^V{rnv-{cIER8a>&!#?8gdf9jPczu6`Uw{=5 ztgp!Da>72OcEf7ElEu+Ma@}LDv~<@O;(*VRl9doX{ zWR+D{Te|uhYi{VX%dWd^-F=TePd;+Wsiz%1{fskjx=<{6=dpWI6ESOyGg7lw&RH#$mi8R6AXe$dqlw3& zp@=N_#K4eXWsKgDxNYxKX?AxtlhjtPwu+u9>0WK^Y+ILK*NL(#49Qg&!Wh)fF7I*H z)7J1$iK=GZrOv5FiH5DzhTX<0nW|OvTTD?^8;8mq6A5$0v-(c9PT$;j@DknireeJ+ zQ*Z6HomGa#gO+;5(b~2wUz2-|)?`C(K%$EQhC&^*WM4@PD3t|7o~7WbyNR{5&f9ja zYE4ecckTVIjLy0Pbj)QeZTC{WX_$u$t!G)kIxE)I<{Q%=S?k=iE!7Jxlrq~Js?9@< z1{0MFZe4F_%_dkCU1M@jrtgTMF5R&zMmleoEA2fvayqKe{(M+Bv#@)UxC$oF0xXod+mxI7YSiN0 z7TJ_fa4SqQl;@t&R)To@u!aO3OI_|i_WC(zBUEiowhh;#3JC5-c|dmLoyc9xfn zwfkR=mA)Jo*2aE$hQ(Fly%%*^qP7(We;T!W-I~uB33`Rx6c7%1BHo z{aUAn+uMhB_X@II`n&>Oe@(J#-c>HGeEOQW(Tv`-ST2`L87pHCbn@7YxBEpr`kp9! z+i$Q^9)-OBPS3zfOR~QK!sUXRUMg1hMlyP%-!w8viEMQpb?%(g=pi8Mnivi)qNf6Z z+T@!OWdKaURS;%wiZfo?fWPiGRJmmR2p-CjsXcs|t%EKVKd{2vmDWMU==R{W9>PFq z6gOf+u0V2DI;}@}#Xf`eUq^}(mv?2J+DVL$D8;2FK)i?`;vBDeyfKBIPg#%Sl7R>x zd+oktyBr*}B2HU_;$0N@z^HnI17TkX*#o|);zj;o0a2QVZn-V7Y)H8;fR(&=!Uc6h z8O6jb#qfE!pS3^Ri2bc^X9VeD2j+e3!@IlORV}yo`=DV9Yeo%l(qnY?8bN6(0vE;W1zkos}Z2*=Sry5u;NJGfaA$l zV~0rG&8~5H90bQ>-1902BIkPdr3%2Z%r%c9gd8DUM$v@fl4}U!(OltQBUpH}vb~wt z);^n(XBq*;6v%3wNc9Z6Q2G_LKc;5-0+jF@uL+H*F8dVXuyg#kF@gJG2jVj_RbZ9p zB&?C!;_QJV5abDRfX2Kit-t!5i(a0oszK) zYVq+h=4h;{yXsOZA8?4SY3Du%@%*r|*TQvfu)igUSm0Nva^N-WL(e^(9AWCEkiskTKJ8 zVFOlAJWq~#cycr+2`#@9C>en)r>nY0BM)^Q>@33|(Av<@oi%Fq{4kquEak9& zWphBp1qZ;vChukyKN+E*KFdF22skT(K#t&ssGrP* zR8C_0MI9hF+oXfz3E9E)HbZhPAH>F=p=l4&j-GLF&Z~d4o5%~}UIZpAE%MbYXH&1d zsnOf$&?dM8PfbY02^*4m5YGNz2R=fk13j#LM(_g#nT|@q>Nh|S{lCwl&^eR!`B zZQ3U>ex>n03FGc09>>Ff&Ew?H;c`yG;B~TVCusDm_) zq7fOK?mW}VI}v^d0nEf>04JMI3?Nzh^{*H(KQVwpG+BzUB~H}Tory=(vf!Jx&Fk=MrSps`ycXL*hu$n>UtOaoTp?l)Re&d4Y_CqI3;1Yu%6glZ;tW^5Yh zIi%m7kZ#)e(}e1AK}z`be1g&Bn-9M%b=~~!;iO}77AEfAal007}hL_t(Y$L&^2 z3dAr7jivX$va=9Gp4M7p83x8hN#g%$Oo^G-T12#3^jF`cbI_bxAR=bgudrmR0tpr% z=2@Y-9(rG%TlAhpHAM&P#k%^?t&kpGLEu@ou3+4|wn^H``Sn%#!JWlDZ?e#Pa{g8U z04$rHwu7w0P*f~TZ1ZmArl8Xwalc4MlCurBSo~0?m^KWG+di!{O(P6YtVH!n0el?e z?vuMx0qZuN+z6;!prP}^sHV_38>qpf)EhOqu+AK7HhdC$KRI6AgPYWEuotN^UVD@0 fQSbk*`X+q$2^@*H500000NkvXXu0mjf>%RVc diff --git a/src/gint/hardware.c b/src/gint/hardware.c index 49e94bc..c39ad37 100644 --- a/src/gint/hardware.c +++ b/src/gint/hardware.c @@ -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(); diff --git a/src/gint/timer.c b/src/gint/timer.c index f3bd3fa..9d9d1f8 100644 --- a/src/gint/timer.c +++ b/src/gint/timer.c @@ -7,52 +7,77 @@ #include #include -/* 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 } } diff --git a/src/gintctl.c b/src/gintctl.c index b2e436e..06e08f9 100644 --- a/src/gintctl.c +++ b/src/gintctl.c @@ -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; diff --git a/src/menu.c b/src/menu.c index 3705420..31b3235 100644 --- a/src/menu.c +++ b/src/menu.c @@ -4,20 +4,22 @@ #include /* 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 */ diff --git a/src/perf/libprof.c b/src/perf/libprof.c index 23bd6ef..6576b62 100644 --- a/src/perf/libprof.c +++ b/src/perf/libprof.c @@ -8,45 +8,59 @@ #include -/* 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++; + } } } diff --git a/src/perf/render.c b/src/perf/render.c index bb197a0..d9f60a7 100644 --- a/src/perf/render.c +++ b/src/perf/render.c @@ -1,5 +1,6 @@ #include #include +#include #include #include @@ -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"); diff --git a/src/regs/regs.c b/src/regs/regs.c new file mode 100644 index 0000000..19b7945 --- /dev/null +++ b/src/regs/regs.c @@ -0,0 +1,43 @@ +#include +#include +#include +#include + +#include + +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(); +} diff --git a/src/util.c b/src/util.c index c71398f..01080be 100644 --- a/src/util.c +++ b/src/util.c @@ -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);