aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakamichi Horikawa <takamichiho@gmail.com>2017-02-12 11:04:51 +0900
committerTakamichi Horikawa <takamichiho@gmail.com>2017-02-12 11:04:51 +0900
commitd8064039c77f3d599f63c09196d0696118813ac7 (patch)
treefcef4e66045bb8a39dc89e08cdf5f31888266109
parent93dde8cf16973e07e687e7e0740cf02c38786c38 (diff)
fmdsp: add status line
-rw-r--r--fmdsp/fmdsp.c85
-rw-r--r--fmdsp/fmdsp_sprites.h56
-rw-r--r--fmdsp/font.h2
-rw-r--r--fmdsp/font_fmdsp_small.c14
-rw-r--r--fmdsp/font_fmdsp_small_data.h131
5 files changed, 227 insertions, 61 deletions
diff --git a/fmdsp/fmdsp.c b/fmdsp/fmdsp.c
index 4c16f5e..872e6dc 100644
--- a/fmdsp/fmdsp.c
+++ b/fmdsp/fmdsp.c
@@ -2,6 +2,7 @@
#include "fmdsp_sprites.h"
#include "font.h"
#include "fmdriver/fmdriver.h"
+#include <stdio.h>
static void vramblit(uint8_t *vram, int x, int y,
const uint8_t *data, int w, int h) {
@@ -56,12 +57,16 @@ void fmdsp_init(struct fmdsp *fmdsp, const struct fmdsp_font *font98) {
static void vram_putchar(uint8_t *vram, const void *data,
- int x, int y, int w, int h, uint8_t color) {
+ int x, int y, int w, int h, uint8_t color,
+ bool bg
+ ) {
const uint8_t *font = data;
for (int yi = 0; yi < h; yi++) {
for (int xi = 0; xi < w; xi++) {
if (font[yi] & (1<<(7-xi))) {
vram[(y+yi)*PC98_W+(x+xi)] = color;
+ } else {
+ if (bg) vram[(y+yi)*PC98_W+(x+xi)] = 0;
}
}
}
@@ -69,7 +74,7 @@ static void vram_putchar(uint8_t *vram, const void *data,
static void fmdsp_putline(const char *strptr, uint8_t *vram,
const struct fmdsp_font *font,
- int x, int y, uint8_t color) {
+ int x, int y, uint8_t color, bool bg) {
const uint8_t *cp932str = (const uint8_t *)strptr;
bool sjis_is2nd = false;
uint8_t sjis_1st;
@@ -88,7 +93,7 @@ static void fmdsp_putline(const char *strptr, uint8_t *vram,
if ((x+xo+8) > PC98_W) return;
const void *fp = font->get(font, *cp932str++, FMDSP_FONT_ANK);
if (fp) {
- vram_putchar(vram, fp, x+xo, y, fw, fh, color);
+ vram_putchar(vram, fp, x+xo, y, fw, fh, color, bg);
}
xo += fw;
}
@@ -103,13 +108,13 @@ static void fmdsp_putline(const char *strptr, uint8_t *vram,
if ((x+xo+(half ? 8 : 16)) > PC98_W) return;
const void *fp = font->get(font, jis, FMDSP_FONT_JIS_LEFT);
if (fp) {
- vram_putchar(vram, fp, x+xo, y, fw, fh, color);
+ vram_putchar(vram, fp, x+xo, y, fw, fh, color, bg);
}
xo += fw;
if (!half) {
fp = font->get(font, jis, FMDSP_FONT_JIS_RIGHT);
if (fp) {
- vram_putchar(vram, fp, x+xo, y, fw, fh, color);
+ vram_putchar(vram, fp, x+xo, y, fw, fh, color, bg);
}
xo += 8;
}
@@ -128,23 +133,24 @@ void fmdsp_vram_init(struct fmdsp *fmdsp,
}
for (int t = 0; t < 10; t++) {
struct fmdriver_track_status *track = &work->track_status[t];
- const uint8_t *track_type;
+ const char *track_type;
switch (track->type) {
case FMDRIVER_TRACK_FM:
- track_type = s_t_fm;
+ track_type = "FM ";
break;
case FMDRIVER_TRACK_SSG:
- track_type = s_t_ssg;
+ track_type = "SSG ";
break;
case FMDRIVER_TRACK_ADPCM:
- track_type = s_t_adpcm;
+ track_type = "ADPCM";
break;
}
- vramblit(vram, 1, TRACK_H*t+1, track_type, TNAME_W, TNAME_H);
+ fmdsp_putline(track_type, vram, &font_fmdsp_small, 1, TRACK_H*t, 2, true);
vramblit(vram, NUM_X+NUM_W*0, TRACK_H*t+1, s_num[(track->num/10)%10], NUM_W, NUM_H);
vramblit(vram, NUM_X+NUM_W*1, TRACK_H*t+1, s_num[track->num%10], NUM_W, NUM_H);
- vramblit(vram, 1, TRACK_H*t+7, s_track, TNAME_W, TNAME_H);
+ //vramblit(vram, 1, TRACK_H*t+7, s_track, TNAME_W, TNAME_H);
+ fmdsp_putline("TRACK.", vram, &font_fmdsp_small, 1, TRACK_H*t+6, 1, true);
vramblit(vram, KEY_LEFT_X, TRACK_H*t+KEY_Y, s_key_left, KEY_LEFT_W, KEY_H);
for (int i = 0; i < KEY_OCTAVES; i++) {
vramblit(vram, KEY_X+KEY_W*i, TRACK_H*t+KEY_Y,
@@ -175,7 +181,7 @@ void fmdsp_vram_init(struct fmdsp *fmdsp,
if (fmdsp->font98) {
for (int i = 0; i < 3; i++) {
fmdsp_putline(work->comment[i], vram, fmdsp->font98,
- 0, COMMENT_Y+COMMENT_H*i, 2);
+ 0, COMMENT_Y+COMMENT_H*i, 2, false);
}
}
}
@@ -217,13 +223,55 @@ void fmdsp_update(struct fmdsp *fmdsp,
const struct fmdriver_work *work, uint8_t *vram) {
for (int t = 0; t < 10; t++) {
const struct fmdriver_track_status *track = &work->track_status[t];
- switch (track->info) {
- case FMDRIVER_TRACK_INFO_PPZ8:
- vramblit(vram, TINFO_X, TRACK_H*t+7, s_t_ppz8, TNAME_W, TNAME_H);
- break;
- default:
- vramfill_color(vram, TINFO_X, TRACK_H*t+7, TNAME_W, TNAME_H, 0);
+ char track_info[5] = " ";
+ if (track->playing) {
+ switch (track->info) {
+ case FMDRIVER_TRACK_INFO_PPZ8:
+ snprintf(track_info, sizeof(track_info), "PPZ8");
+ break;
+ case FMDRIVER_TRACK_INFO_SSG_NOISE_ONLY:
+ snprintf(track_info, sizeof(track_info), "N%02X ", work->ssg_noise_freq);
+ break;
+ case FMDRIVER_TRACK_INFO_SSG_NOISE_MIX:
+ snprintf(track_info, sizeof(track_info), "M%02X ", work->ssg_noise_freq);
+ break;
+ }
+ }
+ fmdsp_putline(track_info, vram, &font_fmdsp_small, TINFO_X, TRACK_H*t+6, 2, true);
+ char notestr[5] = " S ";
+ if (track->playing) {
+ if ((track->key&0xf) == 0xf) {
+ snprintf(notestr, sizeof(notestr), " R ");
+ } else {
+ const char *keystr = " ";
+ static const char *keytable[0x10] = {
+ "C ", "C+", "D ", "D+", "E ", "F ", "F+", "G ", "G+", "A ", "A+", "B "
+ };
+ if (keytable[track->key&0xf]) keystr = keytable[track->key&0xf];
+ snprintf(notestr, sizeof(notestr), "o%d%s", track->key>>4, keystr);
+ }
+ }
+ char numbuf[5];
+ fmdsp_putline("KN:", vram, &font_fmdsp_small, TDETAIL_X, TRACK_H*t+6, 1, true);
+ fmdsp_putline(notestr, vram, &font_fmdsp_small, TDETAIL_KN_V_X, TRACK_H*t+6, 1, true);
+ fmdsp_putline("TN:", vram, &font_fmdsp_small, TDETAIL_TN_X, TRACK_H*t+6, 1, true);
+ snprintf(numbuf, sizeof(numbuf), "%03d", track->tonenum);
+ fmdsp_putline(numbuf, vram, &font_fmdsp_small, TDETAIL_TN_V_X, TRACK_H*t+6, 1, true);
+ fmdsp_putline("VL:", vram, &font_fmdsp_small, TDETAIL_VL_X, TRACK_H*t+6, 1, true);
+ snprintf(numbuf, sizeof(numbuf), "%03d", track->volume);
+ fmdsp_putline(numbuf, vram, &font_fmdsp_small, TDETAIL_VL_V_X, TRACK_H*t+6, 1, true);
+ fmdsp_putline("GT:", vram, &font_fmdsp_small, TDETAIL_GT_X, TRACK_H*t+6, 1, true);
+ //snprintf(numbuf, sizeof(numbuf), "%03d", track->tonenum);
+ //fmdsp_putline(numbuf, vram, &font_fmdsp_small, TDETAIL_GT_V_X, TRACK_H*t+6, 1, true);
+ fmdsp_putline("DT:", vram, &font_fmdsp_small, TDETAIL_DT_X, TRACK_H*t+6, 1, true);
+ if (track->detune) {
+ snprintf(numbuf, sizeof(numbuf), "%+04d", track->detune);
+ } else {
+ snprintf(numbuf, sizeof(numbuf), " 000");
}
+ fmdsp_putline(numbuf, vram, &font_fmdsp_small, TDETAIL_DT_V_X, TRACK_H*t+6, 1, true);
+ fmdsp_putline("M:", vram, &font_fmdsp_small, TDETAIL_M_X, TRACK_H*t+6, 1, true);
+ fmdsp_putline(track->status, vram, &font_fmdsp_small, TDETAIL_M_V_X, TRACK_H*t+6, 1, true);
for (int i = 0; i < KEY_OCTAVES; i++) {
vramblit(vram, KEY_X+KEY_W*i, TRACK_H*t+KEY_Y,
s_key_bg, KEY_W, KEY_H);
@@ -252,6 +300,7 @@ void fmdsp_update(struct fmdsp *fmdsp,
vramblit_color(vram, BAR_X+BAR_W*(track->ticks>>2), TRACK_H*t+BAR_Y,
s_bar, BAR_W, BAR_H, 7);
}
+ fmdsp_putline("FMDSP", vram, &font_fmdsp_small, 320, 0, 2, true);
fmdsp_palette_fade(fmdsp);
}
diff --git a/fmdsp/fmdsp_sprites.h b/fmdsp/fmdsp_sprites.h
index 9033f6d..4ffc5b0 100644
--- a/fmdsp/fmdsp_sprites.h
+++ b/fmdsp/fmdsp_sprites.h
@@ -1,16 +1,20 @@
-static const uint8_t test[] = {
- 0, 2, 2, 2,
- 2, 0, 0, 0,
- 2, 0, 2, 2,
- 2, 0, 0, 0,
- 2, 0, 0, 0,
-};
-
enum {
TRACK_H = 32,
TNAME_W = 26,
TNAME_H = 5,
TINFO_X = 48,
+ TDETAIL_X = 69,
+ TDETAIL_KN_V_X = TDETAIL_X+13,
+ TDETAIL_TN_X = TDETAIL_KN_V_X+27,
+ 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_GT_V_X = TDETAIL_GT_X+13,
+ TDETAIL_DT_X = TDETAIL_GT_V_X+20,
+ TDETAIL_DT_V_X = TDETAIL_DT_X+13,
+ TDETAIL_M_X = 250,
+ TDETAIL_M_V_X = TDETAIL_M_X+8,
NUM_X = 31,
NUM_W = 8,
NUM_H = 11,
@@ -178,41 +182,7 @@ static const uint8_t s_palettes[PALETTE_NUM][FMDSP_PALETTE_COLORS*3] = {
#undef LCDBB
#undef LCD
-static const uint8_t s_track[TNAME_W*TNAME_H] = {
- 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0,
- 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,
- 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0,
- 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,
- 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1,
-};
-static const uint8_t s_t_fm[TNAME_W*TNAME_H] = {
- 0, 2, 2, 2, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 2, 2, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-static const uint8_t s_t_ssg[TNAME_W*TNAME_H] = {
- 0, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 2, 2, 0, 0, 0, 2, 2, 0, 0, 2, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-};
-static const uint8_t s_t_adpcm[TNAME_W*TNAME_H] = {
- 0, 2, 2, 0, 0, 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 0, 2, 2, 2, 0, 2, 0, 0, 2, 0, 0,
- 2, 0, 0, 2, 0, 2, 0, 0, 2, 0, 2, 0, 0, 2, 0, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0,
- 2, 0, 0, 2, 0, 2, 0, 0, 2, 0, 2, 0, 0, 2, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0,
- 2, 0, 2, 2, 0, 0, 0, 0, 2, 0, 2, 0, 2, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, 2, 0, 0,
- 2, 0, 0, 2, 0, 2, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 2, 0, 0, 2, 0, 0,
-};
-static const uint8_t s_t_ppz8[TNAME_W*TNAME_H] = {
- 2, 2, 2, 0, 0, 2, 2, 2, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 2, 0, 2, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 2, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 2, 0, 0, 2, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0,
- 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0,
-};
+
static const uint8_t s_num[10][NUM_W*NUM_H] = {
{
0, 0, 0, 2, 2, 2, 0, 0,
diff --git a/fmdsp/font.h b/fmdsp/font.h
index 8c57284..0176c80 100644
--- a/fmdsp/font.h
+++ b/fmdsp/font.h
@@ -68,6 +68,8 @@ enum {
void fmdsp_font_from_font_rom(struct fmdsp_font *font, const void *data);
+extern const struct fmdsp_font font_fmdsp_small;
+
#ifdef __cplusplus
}
#endif
diff --git a/fmdsp/font_fmdsp_small.c b/fmdsp/font_fmdsp_small.c
new file mode 100644
index 0000000..d25f760
--- /dev/null
+++ b/fmdsp/font_fmdsp_small.c
@@ -0,0 +1,14 @@
+#include "font.h"
+
+#include "font_fmdsp_small_data.h"
+
+static const void *fmdsp_font_get(const struct fmdsp_font *font,
+ uint16_t addr, enum fmdsp_font_type type) {
+ if (type != FMDSP_FONT_ANK) return 0;
+ if (addr >> 8) return 0;
+ return &fontdat[addr*6];
+}
+
+const struct fmdsp_font font_fmdsp_small = {
+ fmdsp_font_get, 0, 5, 6
+};
diff --git a/fmdsp/font_fmdsp_small_data.h b/fmdsp/font_fmdsp_small_data.h
new file mode 100644
index 0000000..a9a0fb9
--- /dev/null
+++ b/fmdsp/font_fmdsp_small_data.h
@@ -0,0 +1,131 @@
+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,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 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,
+ 0x00, 0x60, 0x80, 0xe0, 0x90, 0x60, 0x00, 0xf0, 0x10, 0x20, 0x40, 0x40,
+ 0x00, 0x60, 0x90, 0x60, 0x90, 0x60, 0x00, 0x60, 0x90, 0x70, 0x10, 0x60,
+ 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x90, 0x90, 0xb0, 0x90,
+ 0x00, 0xe0, 0x90, 0xa0, 0x90, 0xe0, 0x00, 0x70, 0x80, 0x80, 0x80, 0x70,
+ 0x00, 0xe0, 0x90, 0x90, 0x10, 0xe0, 0x00, 0x70, 0x80, 0xb0, 0x80, 0x70,
+ 0x00, 0x70, 0x80, 0xb0, 0x80, 0x80, 0x00, 0x70, 0x80, 0xb0, 0x90, 0x70,
+ 0x00, 0x90, 0x90, 0xb0, 0x90, 0x90, 0x00, 0x70, 0x20, 0x20, 0x20, 0x70,
+ 0x00, 0x30, 0x10, 0x10, 0x90, 0x60, 0x00, 0x90, 0xa0, 0x80, 0xa0, 0x90,
+ 0x00, 0x80, 0x80, 0x80, 0x80, 0x70, 0x00, 0x90, 0xf0, 0x90, 0x90, 0x90,
+ 0x00, 0x90, 0xd0, 0xb0, 0x90, 0x90, 0x00, 0x60, 0x90, 0x90, 0x90, 0x60,
+ 0x00, 0xe0, 0x90, 0x90, 0xa0, 0x80, 0x00, 0x60, 0x90, 0x90, 0xa0, 0x50,
+ 0x00, 0xe0, 0x90, 0x90, 0xa0, 0x90, 0x00, 0x70, 0x80, 0x60, 0x10, 0xe0,
+ 0x00, 0xf0, 0x00, 0x60, 0x60, 0x60, 0x00, 0x90, 0x90, 0x90, 0x90, 0x60,
+ 0x00, 0x90, 0x90, 0x90, 0x60, 0x60, 0x00, 0x90, 0x90, 0x90, 0xf0, 0x90,
+ 0x00, 0x90, 0x60, 0x00, 0x60, 0x90, 0x00, 0x90, 0x60, 0x00, 0x60, 0x60,
+ 0x00, 0xf0, 0x20, 0x00, 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,
+ 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+unsigned int fmdsp_dat_len = 1536;