From 680ab52d9e151676b8f90d105b23d2d0d89b0471 Mon Sep 17 00:00:00 2001 From: Takamichi Horikawa Date: Sat, 15 Apr 2017 01:00:20 +0900 Subject: add fmdsp fft analyzer --- fmdsp/fmdsp-vramlookup-neon.s | 5 +- fmdsp/fmdsp.c | 371 ++++++++++++++++++++++++++++++++++---- fmdsp/fmdsp.h | 14 +- fmdsp/fmdsp_platform_info.h | 9 + fmdsp/fmdsp_platform_unix.c | 44 +++++ fmdsp/fmdsp_platform_win.c | 57 ++++++ fmdsp/fmdsp_sprites.h | 405 ++++++++++++++++++++++++++++++++++++++++-- fmdsp/font_fmdsp_small_data.h | 15 +- 8 files changed, 860 insertions(+), 60 deletions(-) create mode 100644 fmdsp/fmdsp_platform_info.h create mode 100644 fmdsp/fmdsp_platform_unix.c create mode 100644 fmdsp/fmdsp_platform_win.c (limited to 'fmdsp') 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 #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 #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 +#include +#include +#include + +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 +#include +#define WIN32_LEAN_AND_MEAN +#include + +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 }; - -- cgit v1.2.3