aboutsummaryrefslogtreecommitdiff
path: root/fmdsp
diff options
context:
space:
mode:
authorTakamichi Horikawa <takamichiho@gmail.com>2017-04-15 01:00:20 +0900
committerTakamichi Horikawa <takamichiho@gmail.com>2017-04-15 01:00:20 +0900
commit680ab52d9e151676b8f90d105b23d2d0d89b0471 (patch)
tree5a05e82900393d2e1ecdf034cf1735d4ebfaec98 /fmdsp
parent428126ee4c8802a4b5f9c9ee491d54013857741b (diff)
add fmdsp fft analyzer
Diffstat (limited to 'fmdsp')
-rw-r--r--fmdsp/fmdsp-vramlookup-neon.s5
-rw-r--r--fmdsp/fmdsp.c371
-rw-r--r--fmdsp/fmdsp.h14
-rw-r--r--fmdsp/fmdsp_platform_info.h9
-rw-r--r--fmdsp/fmdsp_platform_unix.c44
-rw-r--r--fmdsp/fmdsp_platform_win.c57
-rw-r--r--fmdsp/fmdsp_sprites.h405
-rw-r--r--fmdsp/font_fmdsp_small_data.h15
8 files changed, 860 insertions, 60 deletions
diff --git a/fmdsp/fmdsp-vramlookup-neon.s b/fmdsp/fmdsp-vramlookup-neon.s
index 3cfb957..c5d6db2 100644
--- a/fmdsp/fmdsp-vramlookup-neon.s
+++ b/fmdsp/fmdsp-vramlookup-neon.s
@@ -22,9 +22,8 @@ fmdsp_vramlookup_neon:
push {lr}
@ load palette
vld3.8 {d26, d28, d30}, [r2]!
- vld1.8 {d27}, [r2]!
- vld1.8 {d29}, [r2]!
- vld1.8 {d31}, [r2]!
+ vld3.8 {d27[0], d29[0], d31[0]}, [r2]!
+ vld3.8 {d27[1], d29[1], d31[1]}, [r2]!
mov r14, #400
.loopcol:
diff --git a/fmdsp/fmdsp.c b/fmdsp/fmdsp.c
index fdec110..8f3499e 100644
--- a/fmdsp/fmdsp.c
+++ b/fmdsp/fmdsp.c
@@ -4,6 +4,8 @@
#include "fmdriver/fmdriver.h"
#include <stdio.h>
#include "libopna/opna.h"
+#include "fmdsp_platform_info.h"
+#include "version.h"
fmdsp_vramlookup_type fmdsp_vramlookup_func = fmdsp_vramlookup_c;
@@ -45,7 +47,7 @@ void fmdsp_init(struct fmdsp *fmdsp, const struct fmdsp_font *font98) {
fmdsp->target_palette[i] = s_palettes[0][i];
}
fmdsp->font98 = font98;
- fmdsp->style = FMDSP_DISPSTYLE_DEFAULT;
+ fmdsp->style = FMDSP_DISPSTYLE_ORIGINAL;
fmdsp->style_updated = true;
}
@@ -225,6 +227,7 @@ static void fmdsp_track_init_13(struct fmdsp *fmdsp,
}
}
}
+
static void fmdsp_track_init_10(struct fmdsp *fmdsp,
uint8_t *vram) {
for (int y = 0; y < TRACK_H*FMDSP_TRACK_DISP_CNT_DEFAULT; y++) {
@@ -234,7 +237,7 @@ static void fmdsp_track_init_10(struct fmdsp *fmdsp,
}
for (int i = 0; i < FMDSP_TRACK_DISP_CNT_DEFAULT; i++) {
int t;
- if (fmdsp->style == FMDSP_DISPSTYLE_DEFAULT) t = track_disp_table_default[i];
+ if (fmdsp->style == FMDSP_DISPSTYLE_DEFAULT || fmdsp->style == FMDSP_DISPSTYLE_ORIGINAL) t = track_disp_table_default[i];
else if (fmdsp->style == FMDSP_DISPSTYLE_OPN) t = track_disp_table_opn[i];
else t = track_disp_table_ppz8[i];
if (t < 0) continue;
@@ -270,6 +273,133 @@ static void fmdsp_track_init_10(struct fmdsp *fmdsp,
s_bar, BAR_W, BAR_H, 3);
}
}
+ if (fmdsp->style == FMDSP_DISPSTYLE_ORIGINAL) {
+ vramblit(vram, LOGO_FM_X, LOGO_Y, s_logo_fm, LOGO_FM_W, LOGO_H);
+ vramblit(vram, LOGO_DS_X, LOGO_Y, s_logo_ds, LOGO_DS_W, LOGO_H);
+ vramblit(vram, LOGO_P_X, LOGO_Y, s_logo_p, LOGO_P_W, LOGO_H);
+ fmdsp_putline("MUS", vram, &font_fmdsp_small, TOP_MUS_X, TOP_MUSIC_Y, 2, true);
+ fmdsp_putline("IC", vram, &font_fmdsp_small, TOP_IC_X, TOP_MUSIC_Y, 2, true);
+ fmdsp_putline("F", vram, &font_fmdsp_small, TOP_F_X, TOP_MUSIC_Y, 2, true);
+ fmdsp_putline("ILE", vram, &font_fmdsp_small, TOP_ILE_X, TOP_MUSIC_Y, 2, true);
+ fmdsp_putline("SELECTOR", vram, &font_fmdsp_small, TOP_SELECTOR_X, TOP_MUSIC_Y, 2, true);
+ fmdsp_putline("&", vram, &font_fmdsp_small, TOP_AND_X, TOP_MUSIC_Y, 2, true);
+ fmdsp_putline("STATUS", vram, &font_fmdsp_small, TOP_STATUS_X, TOP_MUSIC_Y, 2, true);
+ fmdsp_putline("D", vram, &font_fmdsp_small, TOP_D_X, TOP_MUSIC_Y, 2, true);
+ fmdsp_putline("ISPLAY", vram, &font_fmdsp_small, TOP_ISPLAY_X, TOP_MUSIC_Y, 2, true);
+ vramblit(vram, TOP_VER_X, VER_Y, s_ver, VER_W, VER_H);
+ fmdsp_putline(FMPLAYER_VERSION_0 ".", vram, &font_fmdsp_small, VER_0_X, TOP_MUSIC_Y, 2, true);
+ fmdsp_putline(FMPLAYER_VERSION_1 ".", vram, &font_fmdsp_small, VER_1_X, TOP_MUSIC_Y, 2, true);
+ fmdsp_putline(FMPLAYER_VERSION_2, vram, &font_fmdsp_small, VER_2_X, TOP_MUSIC_Y, 2, true);
+
+ vramblit(vram, TOP_MUS_X, TOP_TEXT_Y, s_text, TOP_TEXT_W, TOP_TEXT_H);
+
+ fmdsp_putline("DR", vram, &font_fmdsp_small, DRIVER_TEXT_X, DRIVER_TEXT_Y, 7, true);
+ fmdsp_putline("IVER", vram, &font_fmdsp_small, DRIVER_TEXT_2_X, DRIVER_TEXT_Y, 7, true);
+ vramblit_color(vram, DRIVER_TRI_X, DRIVER_TRI_Y, s_filebar_tri, FILEBAR_TRI_W, FILEBAR_TRI_H, 7);
+ vramblit(vram, CURL_LEFT_X, CURL_Y, s_curl_left, CURL_W, CURL_H);
+ vramblit(vram, CURL_RIGHT_X, CURL_Y, s_curl_right, CURL_W, CURL_H);
+
+ for (int x = 0; x < 82; x++) {
+ vram[14*PC98_W+312+x] = 2;
+ }
+ for (int x = 0; x < 239; x++) {
+ vram[14*PC98_W+395+x] = 7;
+ }
+ for (int x = 0; x < TIME_BAR_W; x++) {
+ for (int y = 0; y < TIME_BAR_H; y++) {
+ vram[(TIME_Y-2+y)*PC98_W+TIME_BAR_X+x] = 2;
+ vram[(CLOCK_Y-2+y)*PC98_W+TIME_BAR_X+x] = 2;
+ vram[(TIMERB_Y-2+y)*PC98_W+TIME_BAR_X+x] = 2;
+ vram[(LOOPCNT_Y-2+y)*PC98_W+TIME_BAR_X+x] = 2;
+ vram[(VOLDOWN_Y-2+y)*PC98_W+TIME_BAR_X+x] = 2;
+ vram[(PGMNUM_Y-2+y)*PC98_W+TIME_BAR_X+x] = 2;
+ }
+ }
+ for (int i = 0; i < 6; i++) {
+ vramblit(vram, TIME_TRI_X, TIME_Y+8+19*i, s_filebar_tri, FILEBAR_TRI_W, FILEBAR_TRI_H);
+ }
+ fmdsp_putline("PASSED", vram, &font_fmdsp_small, TIME_TEXT_X, TIME_Y-2, 2, true);
+ fmdsp_putline("T", vram, &font_fmdsp_small, TIME_TEXT_X+11, TIME_Y+5, 2, true);
+ fmdsp_putline("IME", vram, &font_fmdsp_small, TIME_TEXT_X+15, TIME_Y+5, 2, true);
+ fmdsp_putline("CLOCK", vram, &font_fmdsp_small, TIME_TEXT_X, CLOCK_Y-2, 2, true);
+ fmdsp_putline(" COUNT", vram, &font_fmdsp_small, TIME_TEXT_X, CLOCK_Y+5, 2, true);
+ fmdsp_putline("T", vram, &font_fmdsp_small, TIME_TEXT_X, TIMERB_Y-2, 2, true);
+ fmdsp_putline("IMER", vram, &font_fmdsp_small, TIME_TEXT_X+4, TIMERB_Y-2, 2, true);
+ fmdsp_putline(" CYCLE", vram, &font_fmdsp_small, TIME_TEXT_X, TIMERB_Y+5, 2, true);
+ fmdsp_putline("LOOP", vram, &font_fmdsp_small, TIME_TEXT_X, LOOPCNT_Y-2, 2, true);
+ fmdsp_putline(" COUNT", vram, &font_fmdsp_small, TIME_TEXT_X, LOOPCNT_Y+5, 2, true);
+ fmdsp_putline("VOLUME", vram, &font_fmdsp_small, TIME_TEXT_X, VOLDOWN_Y-2, 2, true);
+ fmdsp_putline(" DOWN", vram, &font_fmdsp_small, TIME_TEXT_X, VOLDOWN_Y+5, 2, true);
+ fmdsp_putline("PGM", vram, &font_fmdsp_small, TIME_TEXT_X, PGMNUM_Y-2, 2, true);
+ fmdsp_putline("NUMBER", vram, &font_fmdsp_small, TIME_TEXT_X, PGMNUM_Y+5, 2, true);
+
+ for (int x = 0; x < TIME_BAR_W; x++) {
+ for (int y = 0; y < TIME_BAR_H; y++) {
+ vram[(CPU_Y+y)*PC98_W+CPU_BAR_X+x] = 2;
+ }
+ }
+ fmdsp_putline("CPU", vram, &font_fmdsp_small, CPU_X, CPU_Y, 2, true);
+ fmdsp_putline("POWER", vram, &font_fmdsp_small, CPU_X+17, CPU_Y, 2, true);
+ fmdsp_putline("COUNT", vram, &font_fmdsp_small, CPU_X+17, CPU_Y+7, 2, true);
+ vramblit(vram, CPU_TRI_X, CPU_TRI_Y, s_filebar_tri, FILEBAR_TRI_W, FILEBAR_TRI_H);
+ for (int x = 0; x < TIME_BAR_W; x++) {
+ for (int y = 0; y < TIME_BAR_H; y++) {
+ vram[(CPU_Y+y)*PC98_W+FPS_BAR_X+x] = 2;
+ }
+ }
+ fmdsp_putline("FRAMES", vram, &font_fmdsp_small, FPS_X, CPU_Y, 2, true);
+ fmdsp_putline("PER", vram, &font_fmdsp_small, FPS_X+32, CPU_Y, 2, true);
+ fmdsp_putline("SECOND", vram, &font_fmdsp_small, FPS_X+17, CPU_Y+7, 2, true);
+ vramblit(vram, FPS_TRI_X, CPU_TRI_Y, s_filebar_tri, FILEBAR_TRI_W, FILEBAR_TRI_H);
+ for (int x = 0; x < 322; x++) {
+ vram[132*PC98_W+312+x] = 7;
+ }
+ fmdsp_putline("SENS", vram, &font_fmdsp_small, SPECTRUM_X-40, SPECTRUM_Y-6, 7, true);
+ fmdsp_putline("-48", vram, &font_fmdsp_small, SPECTRUM_X-19, SPECTRUM_Y-6, 7, true);
+ fmdsp_putline("0", vram, &font_fmdsp_small, SPECTRUM_X-9, SPECTRUM_Y-63, 7, true);
+ fmdsp_putline("dB", vram, &font_fmdsp_small, SPECTRUM_X-14, SPECTRUM_Y-71, 7, true);
+ fmdsp_putline("SPECTRUM", vram, &font_fmdsp_small, SPECTRUM_X+197, SPECTRUM_Y-71, 7, true);
+ fmdsp_putline("ANAL", vram, &font_fmdsp_small, SPECTRUM_X+241, SPECTRUM_Y-71, 7, true);
+ fmdsp_putline("YzER", vram, &font_fmdsp_small, SPECTRUM_X+260, SPECTRUM_Y-71, 7, true);
+ for (int y = 0; y < 63; y++) {
+ vram[(SPECTRUM_Y-y)*PC98_W+SPECTRUM_X-2] = 2;
+ if (!(y % 2)) {
+ vram[(SPECTRUM_Y-y)*PC98_W+SPECTRUM_X-3] = 2;
+ }
+ if (!(y % 8)) {
+ vram[(SPECTRUM_Y-y)*PC98_W+SPECTRUM_X-4] = 2;
+ }
+ }
+ fmdsp_putline("FREQ", vram, &font_fmdsp_small, SPECTRUM_X-24, SPECTRUM_Y+1, 1, true);
+ for (int x = 0; x < 17; x++) {
+ vram[(SPECTRUM_Y+4)*PC98_W+SPECTRUM_X+1+2*x] = 1;
+ }
+ fmdsp_putline("250", vram, &font_fmdsp_small, SPECTRUM_X+36, SPECTRUM_Y+1, 1, true);
+ for (int x = 0; x < 15; x++) {
+ vram[(SPECTRUM_Y+4)*PC98_W+SPECTRUM_X+52+2*x] = 1;
+ }
+ fmdsp_putline("500", vram, &font_fmdsp_small, SPECTRUM_X+83, SPECTRUM_Y+1, 1, true);
+ for (int x = 0; x < 17; x++) {
+ vram[(SPECTRUM_Y+4)*PC98_W+SPECTRUM_X+99+2*x] = 1;
+ }
+ fmdsp_putline("1", vram, &font_fmdsp_small, SPECTRUM_X+133, SPECTRUM_Y+1, 1, true);
+ fmdsp_putline("k", vram, &font_fmdsp_small, SPECTRUM_X+133+6, SPECTRUM_Y+1, 1, true);
+ for (int x = 0; x < 19; x++) {
+ vram[(SPECTRUM_Y+4)*PC98_W+SPECTRUM_X+144+2*x] = 1;
+ }
+ fmdsp_putline("2k", vram, &font_fmdsp_small, SPECTRUM_X+183, SPECTRUM_Y+1, 1, true);
+ for (int x = 0; x < 18; x++) {
+ vram[(SPECTRUM_Y+4)*PC98_W+SPECTRUM_X+193+2*x] = 1;
+ }
+ fmdsp_putline("4k", vram, &font_fmdsp_small, SPECTRUM_X+230, SPECTRUM_Y+1, 1, true);
+ for (int x = 0; x < 20; x++) {
+ vram[(SPECTRUM_Y+4)*PC98_W+SPECTRUM_X+240+2*x] = 1;
+ }
+ fmdsp_putline("ON/OFF", vram, &font_fmdsp_small, LEVEL_TEXT_X, LEVEL_TEXT_Y, 1, true);
+ fmdsp_putline("PANPOT", vram, &font_fmdsp_small, LEVEL_TEXT_X, LEVEL_TEXT_Y+8, 1, true);
+ fmdsp_putline("PROGRAM", vram, &font_fmdsp_small, LEVEL_TEXT_X-5, LEVEL_TEXT_Y+16, 1, true);
+ fmdsp_putline("KEYCODE", vram, &font_fmdsp_small, LEVEL_TEXT_X-5, LEVEL_TEXT_Y+23, 1, true);
+ }
}
void fmdsp_vram_init(struct fmdsp *fmdsp,
@@ -551,7 +681,8 @@ static void fmdsp_track_without_key(
fmdsp_putline("TN:", vram, &font_fmdsp_small, TDETAIL_TN_X, y+6, 1, true);
snprintf(numbuf, sizeof(numbuf), "%03d", track->tonenum);
fmdsp_putline(numbuf, vram, &font_fmdsp_small, TDETAIL_TN_V_X, y+6, 1, true);
- fmdsp_putline("VL:", vram, &font_fmdsp_small, TDETAIL_VL_X, y+6, 1, true);
+ fmdsp_putline("Vl", vram, &font_fmdsp_small, TDETAIL_VL_X, y+6, 1, true);
+ fmdsp_putline(":", vram, &font_fmdsp_small, TDETAIL_VL_C_X, y+6, 1, true);
snprintf(numbuf, sizeof(numbuf), "%03d", track->volume);
fmdsp_putline(numbuf, vram, &font_fmdsp_small, TDETAIL_VL_V_X, y+6, 1, true);
fmdsp_putline("GT:", vram, &font_fmdsp_small, TDETAIL_GT_X, y+6, 1, true);
@@ -583,45 +714,50 @@ static void fmdsp_track_without_key(
static void fmdsp_update_10(struct fmdsp *fmdsp,
const struct fmdriver_work *work,
const struct opna *opna,
- uint8_t *vram) {
- for (int y = 0; y < 320; y++) {
- for (int x = 320; x < PC98_W; x++) {
- vram[y*PC98_W+x] = 0;
+ uint8_t *vram,
+ struct fmplayer_fft_input_data *idata) {
+ if (fmdsp->style != FMDSP_DISPSTYLE_ORIGINAL) {
+ for (int y = 0; y < 320; y++) {
+ for (int x = 320; x < PC98_W; x++) {
+ vram[y*PC98_W+x] = 0;
+ }
}
}
for (int it = 0; it < FMDSP_TRACK_DISP_CNT_DEFAULT; it++) {
int t;
- if (fmdsp->style == FMDSP_DISPSTYLE_DEFAULT) t = track_disp_table_default[it];
+ if (fmdsp->style == FMDSP_DISPSTYLE_DEFAULT || fmdsp->style == FMDSP_DISPSTYLE_ORIGINAL) t = track_disp_table_default[it];
else if (fmdsp->style == FMDSP_DISPSTYLE_OPN) t = track_disp_table_opn[it];
else t = track_disp_table_ppz8[it];
if (t < 0) continue;
const struct fmdriver_track_status *track = &work->track_status[t];
- if (((track->info == FMDRIVER_TRACK_INFO_PPZ8)
- || (track->info == FMDRIVER_TRACK_INFO_PDZF))
- && track->ppz8_ch) {
- fmdsp_track_info_ppz8(work->ppz8, track->ppz8_ch-1,
- 320, TRACK_H*it+6, vram);
- } else {
- switch (track_type_table[t].type) {
- case FMDRIVER_TRACKTYPE_FM:
- fmdsp_track_info_fm(opna,
- track_type_table[t].num-1,
- track->info == FMDRIVER_TRACK_INFO_FM3EX ? track->fmslotmask : 0,
- 320, TRACK_H*it+6, vram);
- break;
- case FMDRIVER_TRACKTYPE_SSG:
- fmdsp_track_info_ssg(opna,
- track_type_table[t].num-1,
- 320, TRACK_H*it+6, vram);
- break;
- case FMDRIVER_TRACKTYPE_ADPCM:
- fmdsp_track_info_adpcm(opna, 320, TRACK_H*it+6, vram);
- break;
- case FMDRIVER_TRACKTYPE_PPZ8:
- fmdsp_track_info_ppz8(work->ppz8, track_type_table[t].num-1,
+ if (fmdsp->style != FMDSP_DISPSTYLE_ORIGINAL) {
+ if (((track->info == FMDRIVER_TRACK_INFO_PPZ8)
+ || (track->info == FMDRIVER_TRACK_INFO_PDZF))
+ && track->ppz8_ch) {
+ fmdsp_track_info_ppz8(work->ppz8, track->ppz8_ch-1,
320, TRACK_H*it+6, vram);
- break;
+ } else {
+ switch (track_type_table[t].type) {
+ case FMDRIVER_TRACKTYPE_FM:
+ fmdsp_track_info_fm(opna,
+ track_type_table[t].num-1,
+ track->info == FMDRIVER_TRACK_INFO_FM3EX ? track->fmslotmask : 0,
+ 320, TRACK_H*it+6, vram);
+ break;
+ case FMDRIVER_TRACKTYPE_SSG:
+ fmdsp_track_info_ssg(opna,
+ track_type_table[t].num-1,
+ 320, TRACK_H*it+6, vram);
+ break;
+ case FMDRIVER_TRACKTYPE_ADPCM:
+ fmdsp_track_info_adpcm(opna, 320, TRACK_H*it+6, vram);
+ break;
+ case FMDRIVER_TRACKTYPE_PPZ8:
+ fmdsp_track_info_ppz8(work->ppz8, track_type_table[t].num-1,
+ 320, TRACK_H*it+6, vram);
+ break;
+ }
}
}
fmdsp_track_without_key(fmdsp, work, track, t, TRACK_H*it, vram);
@@ -642,6 +778,167 @@ static void fmdsp_update_10(struct fmdsp *fmdsp,
}
}
}
+ if (fmdsp->style == FMDSP_DISPSTYLE_ORIGINAL) {
+ // control status
+ bool playing = work->playing && !work->paused;
+ bool stopped = !work->playing;
+ bool paused = work->paused;
+ vramblit_color(vram, PLAY_X, PLAY_Y, s_play, PLAY_W, PLAY_H, playing ? 2 : 3);
+ vramblit_color(vram, STOP_X, STOP_Y, s_stop, STOP_W, STOP_H, stopped ? 2 : 3);
+ vramblit_color(vram, PAUSE_X, PAUSE_Y, s_pause, PAUSE_W, PAUSE_H, paused ? 2 : 3);
+ vramblit(vram, FADE_X, FADE_Y, s_fade, FADE_W, FADE_H);
+ vramblit(vram, FF_X, FF_Y, s_ff, FF_W, FF_H);
+ vramblit(vram, REW_X, REW_Y, s_rew, REW_W, REW_H);
+ vramblit(vram, FLOPPY_X, FLOPPY_Y, s_floppy, FLOPPY_W, FLOPPY_H);
+ const uint8_t *num[8];
+ // passed time
+ {
+ uint64_t frames = opna->generated_frames;
+ int ssec = (int)(frames % 55467u) * 100 / 55467;
+ uint64_t sec = frames / 55467u;
+ uint64_t min = sec / 60u;
+ sec %= 60u;
+ num[0] = s_num[(min/10)%10];
+ num[1] = s_num[min%10];
+ vramblit(vram, TIME_X+NUM_W*0, TIME_Y, num[0], NUM_W, NUM_H);
+ vramblit(vram, TIME_X+NUM_W*1, TIME_Y, num[1], NUM_W, NUM_H);
+ vramblit(vram, TIME_X+NUM_W*2, TIME_Y, s_num_colon[sec%2u], NUM_W, NUM_H);
+ num[0] = s_num[(sec/10)%10];
+ num[1] = s_num[sec%10];
+ vramblit(vram, TIME_X+NUM_W*3, TIME_Y, num[0], NUM_W, NUM_H);
+ vramblit(vram, TIME_X+NUM_W*4, TIME_Y, num[1], NUM_W, NUM_H);
+ vramblit(vram, TIME_X+NUM_W*5, TIME_Y, s_num_bar, NUM_W, NUM_H);
+ num[0] = s_num[(ssec/10)%10];
+ num[1] = s_num[ssec%10];
+ vramblit(vram, TIME_X+NUM_W*6, TIME_Y, num[0], NUM_W, NUM_H);
+ vramblit(vram, TIME_X+NUM_W*7, TIME_Y, num[1], NUM_W, NUM_H);
+ }
+ // clock count
+ {
+ uint64_t clock = work->timerb_cnt;
+ for (int i = 0; i < 8; i++) {
+ num[7-i] = s_num[clock%10u];
+ clock /= 10u;
+ }
+ for (int i = 0; i < 8; i++) {
+ vramblit(vram, TIME_X+NUM_W*i, CLOCK_Y, num[i], NUM_W, NUM_H);
+ }
+ }
+ // timerb
+ {
+ uint8_t timerb = work->timerb;
+ for (int i = 0; i < 3; i++) {
+ num[2-i] = s_num[timerb%10];
+ timerb /= 10;
+ }
+ for (int i = 0; i < 3; i++) {
+ vramblit(vram, TIME_X+NUM_W*(5+i), TIMERB_Y, num[i], NUM_W, NUM_H);
+ }
+ }
+ // loop count
+ {
+ uint8_t loop = work->loop_cnt;
+ for (int i = 0; i < 4; i++) {
+ num[3-i] = s_num[loop%10];
+ loop /= 10;
+ }
+ for (int i = 0; i < 4; i++) {
+ vramblit(vram, TIME_X+NUM_W*(4+i), LOOPCNT_Y, num[i], NUM_W, NUM_H);
+ }
+ }
+ //
+ int pos = 0;
+ if (work->loop_timerb_cnt) pos = work->timerb_cnt_loop * (72+1-4) / work->loop_timerb_cnt;
+ for (int x = 0; x < 72; x++) {
+ if (x == 0 || x == 36 || x == 71) {
+ vram[(70-2)*PC98_W+352+x*2] = 7;
+ } else if (!(x % 9)) {
+ vram[(70-2)*PC98_W+352+x*2] = 3;
+ }
+ uint8_t c = 3;
+ if (work->playing && ((pos <= x) && (x < (pos+4)))) c = 2;
+ for (int y = 0; y < 4; y++) {
+ vram[(70+y)*PC98_W+352+x*2] = c;
+ }
+ }
+ for (int x = 0; x < 16; x++) {
+ for (int y = 0; y < 4; y++) {
+ vram[(70+y)*PC98_W+496+x] = work->loop_cnt ? 7 : 3;
+ }
+ }
+ // cpu
+ int cpuusage = fmdsp->cpuusage;
+ for (int i = 0; i < 3; i++) {
+ num[2-i] = s_num[cpuusage % 10];
+ cpuusage /= 10;
+ }
+ for (int i = 0; i < 3; i++) {
+ vramblit(vram, CPU_NUM_X+NUM_W*i, CPU_NUM_Y, num[i], NUM_W, NUM_H);
+ }
+ // fps
+ int fps = fmdsp->fps;
+ for (int i = 0; i < 3; i++) {
+ num[2-i] = s_num[fps % 10];
+ fps /= 10;
+ }
+ for (int i = 0; i < 3; i++) {
+ vramblit(vram, FPS_NUM_X+NUM_W*i, CPU_NUM_Y, num[i], NUM_W, NUM_H);
+ }
+ // circle
+ for (int y = 0; y < CIRCLE_H; y++) {
+ for (int x = 0; x < CIRCLE_W; x++) {
+ int c = 0;
+ int clock = (work->timerb_cnt / 8) % 8;
+ int p;
+ if ((p = s_circle[y*CIRCLE_W+x])) {
+ c = (work->playing && (!work->paused || (fmdsp->framecnt % 60) < 30) && (p == (clock + 1))) ? 2 : 3;
+ }
+ vram[(CIRCLE_Y+y)*PC98_W+CIRCLE_X+x] = c;
+ }
+ }
+ // fft
+ struct fmplayer_fft_disp_data ddata;
+ fft_calc(&ddata, idata);
+ for (int x = 0; x < FFTDISPLEN; x++) {
+ for (int y = 0; y < 32; y++) {
+ int px = SPECTRUM_X+x*4;
+ int py = SPECTRUM_Y-y*2;
+ int c = y < ddata.buf[x] ? 2 : 3;
+ vram[py*PC98_W+px+0] = c;
+ vram[py*PC98_W+px+1] = c;
+ vram[py*PC98_W+px+2] = c;
+ }
+ }
+ for (int i = 0; i < FFTDISPLEN; i++) {
+ if (fmdsp->fftdata[i] <= ddata.buf[i]) {
+ fmdsp->fftdata[i] = ddata.buf[i];
+ fmdsp->fftcnt[i] = 30;
+ } else {
+ if (fmdsp->fftcnt[i]) {
+ fmdsp->fftcnt[i]--;
+ } else {
+ if (fmdsp->fftdata[i]) {
+ if (fmdsp->fftdropdiv[i]) {
+ fmdsp->fftdropdiv[i]--;
+ } else {
+ static const uint8_t divtab[16] = {
+ 32, 16, 8, 8, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 2, 2,
+ };
+ fmdsp->fftdropdiv[i] = divtab[fmdsp->fftdata[i] / 2];
+ fmdsp->fftdata[i]--;
+ }
+ }
+ }
+ }
+ }
+ for (int x = 0; x < FFTDISPLEN; x++) {
+ int px = SPECTRUM_X+x*4;
+ int py = SPECTRUM_Y-fmdsp->fftdata[x]*2;
+ vram[py*PC98_W+px+0] = 7;
+ vram[py*PC98_W+px+1] = 7;
+ vram[py*PC98_W+px+2] = 7;
+ }
+ }
}
static void fmdsp_update_13(struct fmdsp *fmdsp,
const struct fmdriver_work *work,
@@ -701,7 +998,8 @@ static void fmdsp_update_13(struct fmdsp *fmdsp,
void fmdsp_update(struct fmdsp *fmdsp,
const struct fmdriver_work *work,
const struct opna *opna,
- uint8_t *vram) {
+ uint8_t *vram,
+ struct fmplayer_fft_input_data *idata) {
if (fmdsp->style_updated) {
if (fmdsp->style == FMDSP_DISPSTYLE_13) {
fmdsp_track_init_13(fmdsp, vram);
@@ -739,9 +1037,14 @@ void fmdsp_update(struct fmdsp *fmdsp,
if (fmdsp->style == FMDSP_DISPSTYLE_13) {
fmdsp_update_13(fmdsp, work, opna, vram);
} else {
- fmdsp_update_10(fmdsp, work, opna, vram);
+ fmdsp_update_10(fmdsp, work, opna, vram, idata);
}
fmdsp_palette_fade(fmdsp);
+ if (!(fmdsp->framecnt % 30)) {
+ fmdsp->cpuusage = fmdsp_cpu_usage();
+ fmdsp->fps = fmdsp_fps_30();
+ }
+ fmdsp->framecnt++;
}
void fmdsp_vrampalette(struct fmdsp *fmdsp, const uint8_t *vram, uint8_t *vram32, int stride) {
diff --git a/fmdsp/fmdsp.h b/fmdsp/fmdsp.h
index 1aba5d9..6a98707 100644
--- a/fmdsp/fmdsp.h
+++ b/fmdsp/fmdsp.h
@@ -5,6 +5,7 @@
#include <stdbool.h>
#include "font.h"
#include "fmdriver/fmdriver.h"
+#include "fft/fft.h"
#ifdef __cplusplus
extern "C" {
@@ -18,10 +19,11 @@ enum {
};
enum {
- FMDSP_PALETTE_COLORS = 9
+ FMDSP_PALETTE_COLORS = 10
};
enum FMDSP_DISPSTYLE {
+ FMDSP_DISPSTYLE_ORIGINAL,
FMDSP_DISPSTYLE_DEFAULT,
FMDSP_DISPSTYLE_OPN,
FMDSP_DISPSTYLE_PPZ8,
@@ -36,6 +38,12 @@ struct fmdsp {
enum FMDSP_DISPSTYLE style;
bool style_updated;
bool masked[FMDRIVER_TRACK_NUM];
+ uint8_t fftdata[FFTDISPLEN];
+ uint8_t fftcnt[FFTDISPLEN];
+ uint8_t fftdropdiv[FFTDISPLEN];
+ uint64_t framecnt;
+ int cpuusage;
+ int fps;
};
struct fmdriver_work;
@@ -44,7 +52,9 @@ void fmdsp_vram_init(struct fmdsp *fmdsp,
struct fmdriver_work *work,
uint8_t *vram);
void fmdsp_update(struct fmdsp *fmdsp, const struct fmdriver_work *work,
- const struct opna *opna, uint8_t *vram);
+ const struct opna *opna, uint8_t *vram,
+ struct fmplayer_fft_input_data *idata
+ );
void fmdsp_vrampalette(struct fmdsp *fmdsp, const uint8_t *vram, uint8_t *vram32, int stride);
void fmdsp_font_from_fontrom(uint8_t *font, const uint8_t *fontrom);
void fmdsp_palette_set(struct fmdsp *fmdsp, int p);
diff --git a/fmdsp/fmdsp_platform_info.h b/fmdsp/fmdsp_platform_info.h
new file mode 100644
index 0000000..9afb2d6
--- /dev/null
+++ b/fmdsp/fmdsp_platform_info.h
@@ -0,0 +1,9 @@
+#ifndef MYON_FMPLAYER_FMDSP_PLATFORM_INFO_H_INCLUDED
+#define MYON_FMPLAYER_FMDSP_PLATFORM_INFO_H_INCLUDED
+
+int fmdsp_cpu_usage(void);
+
+// call once per 30 frames to obtain fps
+int fmdsp_fps_30(void);
+
+#endif // MYON_FMPLAYER_FMDSP_PLATFORM_INFO_H_INCLUDED
diff --git a/fmdsp/fmdsp_platform_unix.c b/fmdsp/fmdsp_platform_unix.c
new file mode 100644
index 0000000..446cee7
--- /dev/null
+++ b/fmdsp/fmdsp_platform_unix.c
@@ -0,0 +1,44 @@
+#include "fmdsp_platform_info.h"
+#include <sys/times.h>
+#include <time.h>
+#include <limits.h>
+#include <stdint.h>
+
+static struct {
+ clock_t lastall;
+ clock_t lastcpu;
+ struct timespec lasttimespec;
+} g;
+
+int fmdsp_cpu_usage(void) {
+ struct tms tmsbuf;
+ clock_t all = times(&tmsbuf);
+ clock_t cpu = tmsbuf.tms_utime + tmsbuf.tms_stime;
+ clock_t percentage = 0;
+ clock_t alld = all - g.lastall;
+ clock_t cpud = cpu - g.lastcpu;
+ if (alld) percentage = cpud * 100 / alld;
+ g.lastall = all;
+ g.lastcpu = cpu;
+ if (!g.lastall) percentage = 0;
+ if (percentage > INT_MAX) percentage = INT_MAX;
+ if (percentage < 0) percentage = 0;
+ return percentage;
+}
+
+int fmdsp_fps_30(void) {
+ struct timespec time;
+ clock_gettime(CLOCK_MONOTONIC, &time);
+ uint64_t fps = 0;
+ if (g.lasttimespec.tv_sec || g.lasttimespec.tv_nsec) {
+ uint64_t diffns = time.tv_sec - g.lasttimespec.tv_sec;
+ diffns *= 1000000000ull;
+ diffns += time.tv_nsec - g.lasttimespec.tv_nsec;
+ if (diffns) {
+ fps = 30ull * 1000000000ull / diffns;
+ }
+ }
+ g.lasttimespec = time;
+ if (fps > INT_MAX) fps = INT_MAX;
+ return fps;
+}
diff --git a/fmdsp/fmdsp_platform_win.c b/fmdsp/fmdsp_platform_win.c
new file mode 100644
index 0000000..3dc4074
--- /dev/null
+++ b/fmdsp/fmdsp_platform_win.c
@@ -0,0 +1,57 @@
+#include "fmdsp_platform_info.h"
+#include <stdint.h>
+#include <limits.h>
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+
+static struct {
+ HANDLE currproc;
+ uint64_t lastall;
+ uint64_t lastcpu;
+ uint64_t lastfpstime;
+} g;
+
+int fmdsp_cpu_usage(void) {
+ if (!g.currproc) g.currproc = GetCurrentProcess();
+ FILETIME ft_sys, ft_creat, ft_exit, ft_kern, ft_user;
+ GetSystemTimeAsFileTime(&ft_sys);
+ GetProcessTimes(g.currproc, &ft_creat, &ft_exit, &ft_kern, &ft_user);
+ uint64_t all = ft_sys.dwHighDateTime;
+ all <<= 32;
+ all |= ft_sys.dwLowDateTime;
+ uint64_t kern = ft_kern.dwHighDateTime;
+ kern <<= 32;
+ kern |= ft_kern.dwLowDateTime;
+ uint64_t user = ft_user.dwHighDateTime;
+ user <<= 32;
+ user |= ft_user.dwLowDateTime;
+ uint64_t cpu = kern + user;
+ uint64_t alld = all - g.lastall;
+ uint64_t cpud = cpu - g.lastcpu;
+ int percentage = 0;
+ if (alld) percentage = cpud * 100 / alld;
+ g.lastall = all;
+ g.lastcpu = cpu;
+ if (!g.lastall) return 0;
+ if (percentage > INT_MAX) percentage = INT_MAX;
+ if (percentage < 0) percentage = 0;
+ return percentage;
+}
+
+int fmdsp_fps_30(void) {
+ FILETIME ft;
+ GetSystemTimeAsFileTime(&ft);
+ uint64_t time = ft.dwHighDateTime;
+ time <<= 32;
+ time |= ft.dwLowDateTime;
+ uint64_t fps = 0;
+ if (g.lastfpstime) {
+ uint64_t diff = time - g.lastfpstime;
+ if (diff) {
+ fps = 30ull * 10000000ull / diff;
+ }
+ }
+ g.lastfpstime = time;
+ if (fps > INT_MAX) fps = INT_MAX;
+ return fps;
+}
diff --git a/fmdsp/fmdsp_sprites.h b/fmdsp/fmdsp_sprites.h
index cb011a6..d9d71ac 100644
--- a/fmdsp/fmdsp_sprites.h
+++ b/fmdsp/fmdsp_sprites.h
@@ -3,36 +3,37 @@ enum {
TRACK_H_S = 24,
TNAME_W = 26,
TNAME_H = 5,
- TINFO_X = 48,
- TDETAIL_X = 69,
+ TINFO_X = 47,
+ TDETAIL_X = 67,
TDETAIL_KN_V_X = TDETAIL_X+13,
- TDETAIL_TN_X = TDETAIL_KN_V_X+27,
+ TDETAIL_TN_X = TDETAIL_KN_V_X+28,
TDETAIL_TN_V_X = TDETAIL_TN_X+13,
TDETAIL_VL_X = TDETAIL_TN_V_X+20,
- TDETAIL_VL_V_X = TDETAIL_VL_X+13,
- TDETAIL_GT_X = TDETAIL_VL_V_X+20,
+ TDETAIL_VL_C_X = TDETAIL_VL_X+9,
+ TDETAIL_VL_V_X = TDETAIL_VL_X+12,
+ TDETAIL_GT_X = TDETAIL_VL_V_X+19,
TDETAIL_GT_V_X = TDETAIL_GT_X+13,
- TDETAIL_DT_X = TDETAIL_GT_V_X+20,
+ TDETAIL_DT_X = TDETAIL_GT_V_X+23,
TDETAIL_DT_S_X = TDETAIL_DT_X+12,
- TDETAIL_DT_V_X = TDETAIL_DT_S_X+4,
- TDETAIL_M_X = 250,
+ TDETAIL_DT_V_X = TDETAIL_DT_S_X+5,
+ TDETAIL_M_X = 249,
TDETAIL_M_V_X = TDETAIL_M_X+8,
NUM_X = 31,
NUM_W = 8,
NUM_H = 11,
- KEY_X = 8,
+ KEY_X = 7,
KEY_Y = 14,
KEY_W = 35,
KEY_H = 17,
KEY_S_OFFSET = KEY_W*4,
KEY_H_S = KEY_H - 8,
- KEY_LEFT_X = 1,
+ KEY_LEFT_X = 0,
KEY_LEFT_W = 6,
KEY_LEFT_S_OFFSET = KEY_LEFT_W*4,
KEY_RIGHT_W = 11,
KEY_RIGHT_S_OFFSET = KEY_RIGHT_W*4,
KEY_OCTAVES = 8,
- BAR_L_X = 68,
+ BAR_L_X = 66,
BAR_L_W = 14,
BAR_X = BAR_L_X + BAR_L_W,
BAR_Y = 1,
@@ -45,8 +46,8 @@ enum {
PLAYING_Y = 324,
PLAYING_W = 72,
PLAYING_H = 9,
- FILEBAR_X = 80,
- FILEBAR_MUS_X = FILEBAR_X + 5,
+ FILEBAR_X = 78,
+ FILEBAR_MUS_X = FILEBAR_X + 6,
FILEBAR_IC_X = FILEBAR_MUS_X + 14,
FILEBAR_F_X = FILEBAR_IC_X + 11,
FILEBAR_ILE_X = FILEBAR_F_X + 4,
@@ -67,6 +68,104 @@ enum {
PCM2FILENAME_X = PCM2FILETRI_X + 8,
DT_SIGN_W = 3,
DT_SIGN_H = 3,
+ SPECTRUM_X = 352,
+ SPECTRUM_Y = 207,
+ CPU_Y = 115,
+ CPU_X = 320,
+ CPU_BAR_X = CPU_X-6,
+ CPU_NUM_X = CPU_X+56,
+ CPU_NUM_Y = CPU_Y+2,
+ CPU_TRI_X = CPU_X+43,
+ CPU_TRI_Y = CPU_Y+10,
+ FPS_X = CPU_X+100,
+ FPS_BAR_X = FPS_X-6,
+ FPS_NUM_X = FPS_X+61,
+ FPS_TRI_X = FPS_X+48,
+ TIME_TEXT_X = 530,
+ TIME_X = TIME_TEXT_X+38,
+ TIME_BAR_X = TIME_TEXT_X-6,
+ TIME_TRI_X = TIME_TEXT_X+31,
+ TIME_BAR_W = 3,
+ TIME_BAR_H = 14,
+ TIME_Y = 22,
+ CLOCK_Y = TIME_Y+19,
+ TIMERB_Y = CLOCK_Y+19,
+ LOOPCNT_Y = TIMERB_Y+19,
+ VOLDOWN_Y = LOOPCNT_Y+19,
+ PGMNUM_Y = VOLDOWN_Y+19,
+ LOGO_NUM = 1,
+ LOGO_Y = 1,
+ LOGO_FM_W = 31,
+ LOGO_DS_W = 32,
+ LOGO_P_W = 15,
+ LOGO_H = 12,
+ LOGO_FM_X = 312,
+ LOGO_DS_X = LOGO_FM_X+LOGO_FM_W+2,
+ LOGO_P_X = LOGO_DS_X+LOGO_DS_W+2,
+ CIRCLE_W = 31,
+ CIRCLE_H = 31,
+ CIRCLE_X = 312,
+ CIRCLE_Y = 70,
+ TOP_MUS_X = 397,
+ TOP_MUSIC_Y = 7,
+ TOP_IC_X = TOP_MUS_X+14,
+ TOP_F_X = TOP_IC_X+12,
+ TOP_ILE_X = TOP_F_X+4,
+ TOP_SELECTOR_X = TOP_ILE_X+17,
+ TOP_AND_X = TOP_SELECTOR_X+42,
+ TOP_STATUS_X = TOP_AND_X+7,
+ TOP_D_X = TOP_STATUS_X+32,
+ TOP_ISPLAY_X = TOP_D_X+4,
+ TOP_VER_X = TOP_ISPLAY_X+32,
+ TOP_TEXT_W = 231,
+ TOP_TEXT_H = 5,
+ TOP_TEXT_Y = TOP_MUSIC_Y-6,
+ VER_W = 13,
+ VER_H = 5,
+ VER_Y = 8,
+ VER_0_X = TOP_VER_X+15,
+ VER_1_X = VER_0_X+7,
+ VER_2_X = VER_1_X+7,
+ DRIVER_TEXT_X = 312,
+ DRIVER_TEXT_Y = 27,
+ DRIVER_TEXT_2_X = DRIVER_TEXT_X+9,
+ DRIVER_TRI_X = DRIVER_TEXT_2_X+26,
+ DRIVER_TRI_Y = DRIVER_TEXT_Y+3,
+ CURL_W = 11,
+ CURL_H = 11,
+ CURL_LEFT_X = 347,
+ CURL_RIGHT_X = 509,
+ CURL_Y = 80,
+ PLAY_W = 30,
+ PLAY_H = 7,
+ PLAY_X = 354,
+ PLAY_Y = 77,
+ STOP_W = 31,
+ STOP_H = 7,
+ STOP_X = 393,
+ STOP_Y = 77,
+ PAUSE_W = 37,
+ PAUSE_H = 7,
+ PAUSE_X = 433,
+ PAUSE_Y = 77,
+ FADE_W = 31,
+ FADE_H = 7,
+ FADE_X = 481,
+ FADE_Y = 77,
+ FF_W = 20,
+ FF_H = 7,
+ FF_X = 360,
+ FF_Y = 87,
+ REW_W = 26,
+ REW_H = 7,
+ REW_X = 392,
+ REW_Y = 87,
+ FLOPPY_W = 74,
+ FLOPPY_H = 7,
+ FLOPPY_X = 432,
+ FLOPPY_Y = 87,
+ LEVEL_TEXT_X = 318,
+ LEVEL_TEXT_Y = 290,
};
enum {
@@ -100,6 +199,7 @@ static const uint8_t s_palettes[PALETTE_NUM][FMDSP_PALETTE_COLORS*3] = {
136, 255, 68,
51, 51, 238,
0, 187, 255,
+ 68, 102, 170,
},
{
0, 0, 0,
@@ -111,6 +211,7 @@ static const uint8_t s_palettes[PALETTE_NUM][FMDSP_PALETTE_COLORS*3] = {
153, 255, 119,
102, 85, 255,
0, 204, 255,
+ 85, 119, 170,
},
{
0, 0, 0,
@@ -122,6 +223,7 @@ static const uint8_t s_palettes[PALETTE_NUM][FMDSP_PALETTE_COLORS*3] = {
255, 221, 85,
255, 102, 0,
255, 85, 0,
+ 170, 119, 85,
},
{
0, 0, 0,
@@ -133,6 +235,7 @@ static const uint8_t s_palettes[PALETTE_NUM][FMDSP_PALETTE_COLORS*3] = {
119, 255, 34,
136, 68, 221,
0, 187, 255,
+ 136, 102, 187,
},
{
0, 0, 0,
@@ -144,6 +247,7 @@ static const uint8_t s_palettes[PALETTE_NUM][FMDSP_PALETTE_COLORS*3] = {
255, 68, 0,
85, 85, 255,
255, 119, 255,
+ 119, 119, 187,
},
{
0, 0, 0,
@@ -155,6 +259,7 @@ static const uint8_t s_palettes[PALETTE_NUM][FMDSP_PALETTE_COLORS*3] = {
255, 221, 0,
255, 0, 51,
255, 0, 51,
+ 170, 136, 0,
},
{
102, 170, 238,
@@ -166,6 +271,7 @@ static const uint8_t s_palettes[PALETTE_NUM][FMDSP_PALETTE_COLORS*3] = {
0, 51, 136,
34, 102, 187,
0, 85, 204,
+ 68, 136, 255,
},
{
0, 0, 0,
@@ -177,6 +283,7 @@ static const uint8_t s_palettes[PALETTE_NUM][FMDSP_PALETTE_COLORS*3] = {
85, 255, 68,
34, 17, 255,
0, 170, 255,
+ 68, 85, 170,
},
{
LCDB(255),
@@ -188,6 +295,7 @@ static const uint8_t s_palettes[PALETTE_NUM][FMDSP_PALETTE_COLORS*3] = {
LCDB(218),
LCDB(109),
LCDB(218),
+ LCDB(0),
},
{
LCD(255),
@@ -199,6 +307,7 @@ static const uint8_t s_palettes[PALETTE_NUM][FMDSP_PALETTE_COLORS*3] = {
LCD(0),
LCD(109),
LCD(0),
+ LCD(0),
},
};
@@ -356,6 +465,50 @@ static const uint8_t s_num[11][NUM_W*NUM_H] = {
0, 0, 3, 3, 3, 0, 0, 0,
}
};
+
+static const uint8_t s_num_colon[2][NUM_W*NUM_H] = {
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0, 2, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, 0, 0, 0,
+ 0, 0, 0, 2, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ },
+ {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 3, 0, 0, 0,
+ 0, 0, 0, 0, 3, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 3, 0, 0, 0, 0,
+ 0, 0, 0, 3, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ },
+};
+
+static const uint8_t s_num_bar[NUM_W*NUM_H] = {
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 0, 2, 2, 2, 0, 0, 0,
+};
+
static const uint8_t s_key_bg[KEY_W*KEY_H] = {
4,4,4,0,0,0,4,4,0,0,0,4,4,4,0,4,4,4,0,0,0,4,4,0,0,0,4,4,0,0,0,4,4,4,0,
4,4,4,0,0,0,4,4,0,0,0,4,4,4,0,4,4,4,0,0,0,4,4,0,0,0,4,4,0,0,0,4,4,4,0,
@@ -488,3 +641,229 @@ static const uint8_t s_dt_sign[3][DT_SIGN_W*DT_SIGN_H] = {
0, 1, 0,
}
};
+
+static const uint8_t s_logo_fm[LOGO_FM_W*LOGO_H] = {
+ 0,9,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,9,2,2,2,0,0,0,0,0,2,2,2,9,0,
+ 9,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,9,2,2,2,2,2,0,0,0,2,2,2,2,2,9,
+ 2,2,2,9,3,3,3,3,3,3,3,3,3,3,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,2,2,2,2,2,0,0,2,2,2,
+ 2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,2,2,2,0,0,0,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,2,2,2,
+ 2,2,2,3,3,3,3,3,3,3,3,3,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,2,2,2,
+ 2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,2,2,2,
+ 2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,2,2,2,
+ 2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,2,2,2,
+ 2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,2,2,2,
+};
+
+static const uint8_t s_logo_ds[LOGO_DS_W*LOGO_H] = {
+ 2,2,2,2,2,2,2,2,2,2,2,2,9,0,0,0,0,0,9,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,9,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+ 2,2,2,3,3,3,3,3,3,3,3,9,2,2,9,0,0,2,2,2,9,3,3,3,3,3,3,3,3,3,3,3,
+ 2,2,2,0,0,0,0,0,0,0,0,0,2,2,2,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,
+ 2,2,2,0,0,0,0,0,0,0,0,0,2,2,2,0,0,2,2,2,9,0,0,0,0,0,0,0,0,0,0,0,
+ 2,2,2,0,0,0,0,0,0,0,0,0,2,2,2,0,0,9,2,2,2,2,2,2,2,2,2,2,2,2,9,0,
+ 2,2,2,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,9,2,2,2,2,2,2,2,2,2,2,2,2,9,
+ 2,2,2,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,3,3,3,3,3,3,3,3,9,2,2,2,
+ 2,2,2,0,0,0,0,0,0,0,0,0,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,
+ 2,2,2,0,0,0,0,0,0,0,0,9,2,2,9,0,0,0,0,0,0,0,0,0,0,0,0,0,9,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,
+ 2,2,2,2,2,2,2,2,2,2,2,2,9,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,9,0,
+};
+
+static const uint8_t s_logo_p[LOGO_P_W*LOGO_H] = {
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,9,0,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,
+ 2,2,2,3,3,3,3,3,3,3,3,9,2,2,2,
+ 2,2,2,0,0,0,0,0,0,0,0,0,2,2,2,
+ 2,2,2,0,0,0,0,0,0,0,0,9,2,2,2,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,2,9,
+ 2,2,2,2,2,2,2,2,2,2,2,2,2,9,0,
+ 2,2,2,3,3,3,3,3,3,3,3,3,3,0,0,
+ 2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,
+ 2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,
+ 2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,
+ 2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,
+};
+
+static const uint8_t s_circle[CIRCLE_W*CIRCLE_H] = {
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,8,0,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,8,0,8,0,0,0,1,0,1,0,0,0,2,0,2,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,8,0,0,8,0,0,1,0,1,0,0,2,0,0,2,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,7,0,0,0,8,0,8,0,0,1,0,1,0,0,2,0,2,0,0,0,3,0,0,0,0,0,
+ 0,0,0,0,7,0,7,0,0,8,0,0,8,0,1,0,1,0,2,0,0,2,0,0,3,0,3,0,0,0,0,
+ 0,0,0,0,0,7,0,7,0,0,8,0,8,0,1,0,1,0,2,0,2,0,0,3,0,3,0,0,0,0,0,
+ 0,0,0,0,0,0,7,0,7,0,8,0,0,0,0,0,0,0,0,0,2,0,3,0,3,0,0,0,0,0,0,
+ 0,0,6,6,0,0,0,7,0,7,0,0,0,0,0,0,0,0,0,0,0,3,0,3,0,0,0,4,4,0,0,
+ 0,0,0,0,6,6,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,4,4,0,0,0,0,
+ 0,6,6,0,0,0,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,4,4,0,
+ 0,0,0,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,
+ 0,0,0,0,0,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,5,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,0,0,0,0,0,
+ 0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,0,0,0,
+ 0,4,4,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,0,0,0,6,6,0,
+ 0,0,0,0,4,4,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,6,6,0,0,0,0,
+ 0,0,4,4,0,0,0,3,0,3,0,0,0,0,0,0,0,0,0,0,0,7,0,7,0,0,0,6,6,0,0,
+ 0,0,0,0,0,0,3,0,3,0,2,0,0,0,0,0,0,0,0,0,8,0,7,0,7,0,0,0,0,0,0,
+ 0,0,0,0,0,3,0,3,0,0,2,0,2,0,1,0,1,0,8,0,8,0,0,7,0,7,0,0,0,0,0,
+ 0,0,0,0,3,0,3,0,0,2,0,0,2,0,1,0,1,0,8,0,0,8,0,0,7,0,7,0,0,0,0,
+ 0,0,0,0,0,3,0,0,0,2,0,2,0,0,1,0,1,0,0,8,0,8,0,0,0,7,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,2,0,0,2,0,0,1,0,1,0,0,8,0,0,8,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,2,0,2,0,0,0,1,0,1,0,0,0,8,0,8,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,1,0,0,0,8,0,0,0,0,0,0,0,0,0,0,
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+};
+
+static const uint8_t s_text[TOP_TEXT_W*TOP_TEXT_H] = {
+ 0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,7,0,7,0,0,7,0,7,7,7,0,7,0,0,7,0,0,0,0,0,
+ 7,0,0,0,0,7,7,7,0,7,0,0,7,0,7,0,0,7,0,7,0,0,7,0,0,0,0,7,7,7,0,7,7,7,7,0,7,0,
+ 0,7,0,0,0,0,0,0,7,7,7,0,0,0,0,0,7,0,0,7,0,0,7,7,0,0,0,7,7,0,0,0,0,0,0,0,7,7,
+ 0,0,7,0,0,7,0,7,7,7,0,0,0,7,7,0,0,0,0,7,0,0,0,0,0,0,0,7,7,0,0,7,7,7,0,0,7,0,
+ 0,7,0,0,0,0,7,0,0,0,0,0,7,0,0,7,0,7,7,7,0,7,0,0,7,0,7,7,7,0,0,0,7,7,0,0,7,0,
+ 0,7,0,0,7,7,7,0,0,0,0,7,7,0,0,0,7,7,0,0,0,7,7,0,0,0,7,7,0,0,0,0,0,0,7,0,0,0,
+ 7,7,0,0,7,0,0,0,7,7,0,0,7,0,7,0,0,0,7,0,0,7,0,7,7,0,7,0,0,7,0,0,0,7,7,0,0,0,
+ 0,7,0,7,0,0,0,0,0,7,0,0,7,7,0,7,0,7,0,0,7,0,0,7,7,0,0,0,0,7,0,0,0,0,0,0,0,0,
+ 0,7,0,7,0,0,0,7,0,0,0,0,0,0,7,0,0,0,0,0,7,7,0,0,7,0,0,7,0,7,0,0,0,0,0,0,7,0,
+ 7,0,0,7,0,7,7,7,7,0,7,0,0,7,0,7,0,0,0,0,0,7,7,0,0,0,0,7,0,7,0,0,7,0,7,0,0,7,
+ 0,7,7,7,7,0,0,0,7,0,7,0,0,0,0,7,0,0,7,0,0,7,0,0,7,7,0,7,0,7,0,0,7,0,7,0,0,7,
+ 0,7,0,0,7,0,7,0,0,0,0,0,0,7,0,0,7,0,7,0,0,7,0,7,0,0,7,0,7,0,0,7,0,0,0,0,7,7,
+ 0,0,7,0,0,7,7,7,7,0,7,0,0,7,0,7,7,0,0,0,0,7,0,0,7,0,7,0,7,7,0,0,7,0,0,0,0,0,
+ 0,0,0,7,0,0,7,0,0,0,0,0,7,0,0,7,0,7,7,0,7,0,0,7,0,0,0,0,0,0,0,0,7,0,7,7,0,0,
+ 7,7,0,0,7,0,0,0,0,7,7,7,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,7,7,7,0,0,0,
+ 7,0,0,7,0,0,7,0,7,0,0,7,0,7,0,0,7,0,7,7,7,0,0,7,0,7,0,0,0,7,0,0,7,0,0,7,0,7,
+ 0,0,7,0,7,0,0,7,0,0,0,0,7,0,7,0,0,0,7,0,0,7,0,0,7,0,0,7,0,7,7,0,7,0,0,7,0,7,
+ 0,0,7,0,7,0,0,7,0,0,7,7,0,0,0,0,0,0,7,0,0,7,0,0,7,0,7,0,0,7,0,7,0,0,7,0,7,7,
+ 0,0,7,0,0,7,0,0,7,0,7,0,0,7,0,0,7,0,7,0,0,0,0,0,7,0,0,7,0,7,0,0,7,0,0,7,0,0,
+ 0,7,7,0,0,7,0,0,0,7,0,0,0,0,0,7,0,0,7,0,0,7,0,7,0,0,7,0,0,7,7,0,0,0,0,7,0,0,
+ 7,0,0,7,7,0,0,7,0,7,0,0,0,7,0,0,0,0,0,0,7,0,0,0,0,0,7,7,0,0,7,0,0,7,0,7,0,0,
+ 7,0,7,0,0,0,7,0,7,7,0,7,0,0,7,0,0,0,0,7,0,7,0,0,7,0,7,7,7,7,0,7,0,0,0,7,0,7,
+ 7,0,7,0,7,0,0,7,0,0,7,0,0,0,7,0,7,0,0,0,0,7,7,7,7,0,0,7,0,0,7,0,0,7,0,0,0,0,
+ 7,0,7,0,0,7,0,7,7,7,7,0,0,0,0,7,0,0,0,0,7,0,0,0,7,0,0,7,0,7,0,0,7,0,7,0,0,7,
+ 0,0,0,0,0,7,0,0,7,0,0,7,0,7,0,0,0,7,7,0,0,7,0,0,0,0,0,0,7,7,0,0,7,0,0,7,0,7,
+ 7,7,0,7,0,0,7,0,0,0,0,0,0,7,7,7,0,7,7,7,0,7,0,0,7,0,0,7,7,0,0,7,0,0,7,0,0,0,
+ 0,7,7,7,0,0,7,7,0,0,7,0,0,7,0,0,0,0,0,0,7,7,7,0,0,0,0,0,7,0,0,7,0,0,7,7,0,0,
+ 0,7,7,0,0,0,0,0,0,7,0,0,7,0,7,0,0,7,0,7,7,7,0,0,0,7,7,0,0,0,0,7,0,0,0,0,0,0,
+ 7,0,0,7,0,7,0,0,7,0,7,0,0,7,0,0,0,0,7,0,7,0,0,0,7,0,0,7,0,7,7,7,0,7,0,0,7,0,
+ 7,7,7,0,0,0,7,7,0,0,7,0,0,7,0,7,7,7,0,0,0,0,7,7,7,7,0,0,7,7,0,0,0,7,7,0,0,0,
+ 7,7,0,0,0,0,0,7,7,7,0,0,7,7,0
+};
+
+static const uint8_t s_ver[VER_W*VER_H] = {
+ 2,0,0,2,0,0,0,0,0,0,0,0,0,
+ 2,0,0,2,0,0,2,2,0,0,2,0,2,
+ 2,0,0,2,0,2,2,2,2,0,2,2,0,
+ 0,2,2,0,0,2,0,0,0,0,2,0,0,
+ 0,2,2,0,0,0,2,2,2,0,2,0,0,
+};
+
+static const uint8_t s_curl_left[CURL_W*CURL_H] = {
+ 0,3,3,3,0,0,0,0,0,0,0,
+ 3,0,0,0,0,0,0,0,0,0,0,
+ 3,0,0,0,0,0,0,0,0,0,0,
+ 3,0,0,0,0,0,0,0,0,0,0,
+ 3,0,0,0,0,0,0,0,0,0,0,
+ 3,0,0,0,0,0,0,0,0,0,0,
+ 3,0,0,0,0,0,0,0,0,0,0,
+ 3,0,0,0,0,0,0,0,0,0,0,
+ 3,0,0,0,0,0,0,0,0,0,0,
+ 3,0,0,0,0,0,0,0,0,0,0,
+ 0,3,3,3,3,3,3,3,3,3,3,
+};
+
+static const uint8_t s_curl_right[CURL_W*CURL_H] = {
+ 0,0,0,0,0,0,0,3,3,3,0,
+ 0,0,0,0,0,0,0,0,0,0,3,
+ 0,0,0,0,0,0,0,0,0,0,3,
+ 0,0,0,0,0,0,0,0,0,0,3,
+ 0,0,0,0,0,0,0,0,0,0,3,
+ 0,0,0,0,0,0,0,0,0,0,3,
+ 0,0,0,0,0,0,0,0,0,0,3,
+ 0,0,0,0,0,0,0,0,0,0,3,
+ 0,0,0,0,0,0,0,0,0,0,3,
+ 0,0,0,0,0,0,0,0,0,0,3,
+ 3,3,3,3,3,3,3,3,3,3,0,
+};
+
+static const uint8_t s_play[PLAY_W*PLAY_H] = {
+ 1,0,0,0,0,0,0,1,1,1,1,0,0,1,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,1,
+ 1,1,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,1,
+ 1,1,1,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,0,1,0,
+ 1,1,1,1,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,
+ 1,1,1,0,0,0,0,1,1,1,1,0,0,1,0,0,0,0,0,1,1,1,1,1,0,0,0,1,0,0,
+ 1,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,
+ 1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,0,1,0,0,0,1,0,0,0,1,0,0,
+};
+
+static const uint8_t s_stop[STOP_W*STOP_H] = {
+ 0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,1,1,1,1,0,0,1,1,1,0,0,1,1,1,1,0,
+ 1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,1,
+ 1,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,1,
+ 1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,1,
+ 1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,1,1,1,0,
+ 1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,0,0,0,0,
+ 0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,0,0,0,0,1,1,1,0,0,1,0,0,0,0,
+};
+
+static const uint8_t s_pause[PAUSE_W*PAUSE_H] = {
+ 0,0,0,0,0,0,0,0,3,3,3,3,0,0,0,3,3,3,0,0,3,0,0,0,3,0,0,3,3,3,3,0,0,3,3,3,3,
+ 3,3,0,3,3,0,0,0,3,0,0,0,3,0,3,0,0,0,3,0,3,0,0,0,3,0,3,0,0,0,0,0,3,0,0,0,0,
+ 3,3,0,3,3,0,0,0,3,0,0,0,3,0,3,0,0,0,3,0,3,0,0,0,3,0,3,0,0,0,0,0,3,0,0,0,0,
+ 3,3,0,3,3,0,0,0,3,0,0,0,3,0,3,0,0,0,3,0,3,0,0,0,3,0,0,3,3,3,0,0,3,3,3,3,0,
+ 3,3,0,3,3,0,0,0,3,3,3,3,0,0,3,3,3,3,3,0,3,0,0,0,3,0,0,0,0,0,3,0,3,0,0,0,0,
+ 3,3,0,3,3,0,0,0,3,0,0,0,0,0,3,0,0,0,3,0,3,0,0,0,3,0,0,0,0,0,3,0,3,0,0,0,0,
+ 0,0,0,0,0,0,0,0,3,0,0,0,0,0,3,0,0,0,3,0,0,3,3,3,0,0,3,3,3,3,0,0,0,3,3,3,3,
+};
+
+static const uint8_t s_fade[FADE_W*FADE_H] = {
+ 0,0,0,0,0,0,0,0,0,3,3,3,3,0,0,3,3,3,0,0,3,3,3,3,0,0,0,3,3,3,3,
+ 3,0,0,0,0,0,0,0,3,0,0,0,0,0,3,0,0,0,3,0,3,0,0,0,3,0,3,0,0,0,0,
+ 3,0,0,0,0,0,0,0,3,0,0,0,0,0,3,0,0,0,3,0,3,0,0,0,3,0,3,0,0,0,0,
+ 3,0,3,0,0,0,0,0,3,3,3,3,0,0,3,0,0,0,3,0,3,0,0,0,3,0,3,3,3,3,0,
+ 3,0,3,0,0,0,0,0,3,0,0,0,0,0,3,3,3,3,3,0,3,0,0,0,3,0,3,0,0,0,0,
+ 3,0,3,0,3,0,0,0,3,0,0,0,0,0,3,0,0,0,3,0,3,0,0,0,3,0,3,0,0,0,0,
+ 3,0,3,0,3,0,0,0,3,0,0,0,0,0,3,0,0,0,3,0,3,3,3,3,0,0,0,3,3,3,3,
+};
+
+static const uint8_t s_ff[FF_W*FF_H] = {
+ 3,0,0,3,0,0,0,0,0,0,3,3,3,3,0,0,3,3,3,3,
+ 3,3,0,3,3,0,0,0,0,3,0,0,0,0,0,3,0,0,0,0,
+ 3,3,0,3,3,3,0,0,0,3,0,0,0,0,0,3,0,0,0,0,
+ 3,3,0,3,3,3,3,0,0,3,3,3,3,0,0,3,3,3,3,0,
+ 3,3,0,3,3,3,0,0,0,3,0,0,0,0,0,3,0,0,0,0,
+ 3,3,0,3,3,0,0,0,0,3,0,0,0,0,0,3,0,0,0,0,
+ 3,0,0,3,0,0,0,0,0,3,0,0,0,0,0,3,0,0,0,0,
+};
+
+static const uint8_t s_rew[REW_W*REW_H] = {
+ 0,0,0,3,0,0,3,0,0,3,3,3,3,0,0,0,3,3,3,3,0,3,0,0,0,3,
+ 0,0,3,3,0,3,3,0,0,3,0,0,0,3,0,3,0,0,0,0,0,3,0,3,0,3,
+ 0,3,3,3,0,3,3,0,0,3,0,0,0,3,0,3,0,0,0,0,0,3,0,3,0,3,
+ 3,3,3,3,0,3,3,0,0,3,0,0,3,0,0,3,3,3,3,0,0,3,0,3,0,3,
+ 0,3,3,3,0,3,3,0,0,3,3,3,0,0,0,3,0,0,0,0,0,3,0,3,0,3,
+ 0,0,3,3,0,3,3,0,0,3,0,0,3,0,0,3,0,0,0,0,0,3,0,3,0,3,
+ 0,0,0,3,0,0,3,0,0,3,0,0,0,3,0,0,3,3,3,3,0,0,3,0,3,0,
+};
+
+static uint8_t s_floppy[FLOPPY_W*FLOPPY_H] = {
+ 3,3,3,3,3,3,3,0,0,0,3,3,3,3,0,0,3,3,3,0,0,3,0,0,0,0,0,0,3,3,3,3,0,3,3,3,3,0,
+ 0,0,3,3,3,0,0,3,0,0,0,3,0,0,0,3,0,0,0,0,3,3,3,0,0,0,3,3,3,0,0,0,0,0,3,0,3,3,
+ 3,3,3,3,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,3,0,0,0,0,0,3,0,0,0,3,0,3,
+ 0,0,0,3,0,3,3,0,3,3,0,0,3,3,0,0,0,3,0,0,0,3,0,3,0,0,0,3,0,0,0,3,3,0,3,3,3,0,
+ 3,3,3,0,0,3,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,3,0,0,0,0,0,3,0,0,0,3,0,3,0,0,
+ 0,0,0,3,0,3,0,3,0,0,0,3,0,0,0,0,0,0,0,3,0,0,0,0,0,3,0,0,3,0,3,0,3,3,0,0,0,3,
+ 3,0,0,3,3,3,3,0,0,0,0,3,0,0,0,3,0,0,0,0,0,3,3,3,3,0,0,3,0,0,0,3,0,3,0,0,0,0,
+ 0,3,0,0,0,3,0,0,0,3,0,0,0,0,0,0,3,0,0,0,0,3,3,0,0,3,0,0,3,0,3,3,3,0,3,3,3,0,
+ 0,3,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,3,0,0,0,0,0,3,3,3,3,0,0,3,0,0,0,0,0,3,
+ 0,0,0,3,0,0,0,3,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,3,3,3,3,3,3,3,3,3,3,3,3,0,0,3,
+ 0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,3,0,0,0,0,0,3,0,0,0,0,0,3,0,0,0,3,0,3,0,0,
+ 0,3,0,0,0,3,0,0,0,0,3,0,0,0,0,3,0,0,0,3,0,0,0,0,3,0,3,3,3,3,3,3,3,0,0,3,0,0,
+ 0,0,0,0,3,3,3,0,0,0,3,3,3,3,0,0,3,3,3,3,0,3,0,0,0,0,0,0,3,3,3,0,0,3,0,0,0,3,
+ 0,0,3,3,3,0,0,3,3,3,3,3,0,0,3,3,3,0,0,0,0,0,3,0,
+};
diff --git a/fmdsp/font_fmdsp_small_data.h b/fmdsp/font_fmdsp_small_data.h
index d5f9105..60ee56a 100644
--- a/fmdsp/font_fmdsp_small_data.h
+++ b/fmdsp/font_fmdsp_small_data.h
@@ -1,5 +1,4 @@
-static const unsigned char fontdat[] = {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+static unsigned char fontdat[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -19,10 +18,11 @@ static const unsigned char fontdat[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x40, 0xa0, 0x50, 0xa0, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xe0, 0x40, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x10, 0x20, 0x40, 0x00,
0x00, 0x60, 0x90, 0x90, 0x90, 0x60, 0x00, 0x20, 0x60, 0x20, 0x20, 0x70,
0x00, 0x60, 0x90, 0x20, 0x40, 0xf0, 0x00, 0xe0, 0x10, 0x60, 0x10, 0xe0,
0x00, 0x20, 0x60, 0xa0, 0xf0, 0x20, 0x00, 0xf0, 0x80, 0xe0, 0x10, 0xe0,
@@ -49,18 +49,18 @@ static const unsigned char fontdat[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x80, 0xb0, 0x80, 0xf0,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x70, 0x90, 0x80, 0x70, 0x00, 0xf0, 0x80, 0xb0, 0x80, 0xf0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xa0, 0xc0, 0xa0, 0x90,
+ 0x00, 0x80, 0x80, 0x80, 0x80, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x90, 0x90, 0x60,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0xf0, 0x00, 0x20, 0x40, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -128,4 +128,3 @@ static const unsigned char fontdat[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
-