diff options
Diffstat (limited to 'fmdsp')
| -rw-r--r-- | fmdsp/fmdsp-vramlookup-neon.s | 5 | ||||
| -rw-r--r-- | fmdsp/fmdsp.c | 371 | ||||
| -rw-r--r-- | fmdsp/fmdsp.h | 14 | ||||
| -rw-r--r-- | fmdsp/fmdsp_platform_info.h | 9 | ||||
| -rw-r--r-- | fmdsp/fmdsp_platform_unix.c | 44 | ||||
| -rw-r--r-- | fmdsp/fmdsp_platform_win.c | 57 | ||||
| -rw-r--r-- | fmdsp/fmdsp_sprites.h | 405 | ||||
| -rw-r--r-- | fmdsp/font_fmdsp_small_data.h | 15 | 
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  }; - | 
