diff options
author | Takamichi Horikawa <takamichiho@gmail.com> | 2017-01-18 23:37:07 +0900 |
---|---|---|
committer | Takamichi Horikawa <takamichiho@gmail.com> | 2017-01-18 23:37:07 +0900 |
commit | e8fd09abf68b944b05554c82adb577514cad5ca5 (patch) | |
tree | f8882715e86534cec2dc20154fd24c6bef3c668b /fmdsp/fmdsp.c | |
parent | 09ea1fe272aca6ebb6840f02765acd44ac3ecebc (diff) |
improve FMDSP and enable title display on win32
Diffstat (limited to 'fmdsp/fmdsp.c')
-rw-r--r-- | fmdsp/fmdsp.c | 144 |
1 files changed, 72 insertions, 72 deletions
diff --git a/fmdsp/fmdsp.c b/fmdsp/fmdsp.c index 4698842..bf29f56 100644 --- a/fmdsp/fmdsp.c +++ b/fmdsp/fmdsp.c @@ -1,5 +1,6 @@ #include "fmdsp.h" #include "fmdsp_sprites.h" +#include "font.h" #include "fmdriver/fmdriver.h" static void vramblit(uint8_t *vram, int x, int y, @@ -21,6 +22,16 @@ static void vramblit_color(uint8_t *vram, int x, int y, } } +static void vramfill_color(uint8_t *vram, int x, int y, + int w, int h, + uint8_t color) { + for (int yi = 0; yi < h; yi++) { + for (int xi = 0; xi < w; xi++) { + vram[(y+yi)*PC98_W+(x+xi)] = color; + } + } +} + static void vramblit_key(uint8_t *vram, int x, int y, const uint8_t *data, int w, int h, uint8_t key, uint8_t color) { @@ -34,66 +45,53 @@ static void vramblit_key(uint8_t *vram, int x, int y, } } -void fmdsp_init(struct fmdsp *fmdsp) { +void fmdsp_init(struct fmdsp *fmdsp, const struct fmdsp_font *font98) { for (int i = 0; i < FMDSP_PALETTE_COLORS; i++) { fmdsp->palette[i*3+0] = s_palettes[0][i*3+0]; fmdsp->palette[i*3+1] = s_palettes[0][i*3+1]; fmdsp->palette[i*3+2] = s_palettes[0][i*3+2]; } + fmdsp->font98 = font98; } -static bool sjis_is_mb_start(uint8_t c) { - if (0x81 <= c && c <= 0x9f) return true; - if (0xe0 <= c && c <= 0xef) return true; - return false; -} -static uint16_t sjis2jis(uint8_t sjis_1st, uint8_t sjis_2nd) { - uint16_t jis; - if (sjis_1st >= 0xe0) sjis_1st -= 0x40; - sjis_1st -= 0x81; - jis = sjis_1st << 9; - if (sjis_2nd >= 0x80) sjis_2nd--; - if (sjis_2nd >= 0x9e) { - jis |= 0x100 | (sjis_2nd - 0x9e); - } else { - jis |= (sjis_2nd - 0x40); - } - jis += 0x2121; - return jis; -} - -static void vram_putchar(uint16_t ptr, uint8_t *vram, const uint8_t *font, - int x, int y, uint8_t color) { - for (int yi = 0; yi < 16; yi++) { - for (int xi = 0; xi < 8; xi++) { - if (font[(ptr<<4)+yi] & (1<<(7-xi))) { +static void vram_putchar(uint8_t *vram, const void *data, + int x, int y, int w, int h, uint8_t color) { + 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; } } } } -static void fmdsp_putline(const char *strptr, uint8_t *vram, const uint8_t *font, - int y, uint8_t color) { +static void fmdsp_putline(const char *strptr, uint8_t *vram, + const struct fmdsp_font *font, + int x, int y, uint8_t color) { const uint8_t *cp932str = (const uint8_t *)strptr; bool sjis_is2nd = false; uint8_t sjis_1st; - int x = 0; + int fw = font->width_half; + int fh = font->height; + int xo = 0; while (*cp932str) { if (!sjis_is2nd) { if (!sjis_is_mb_start(*cp932str)) { if (*cp932str == '\t') { - if ((x+8*8) > PC98_W) return; - x += 8*8; - x &= ~(8*8-1); + xo += fw*8; + xo -= (xo % (fw*8)); cp932str++; } else { - if ((x+8) > PC98_W) return; - vram_putchar(0x8000+*cp932str++, vram, font, x, y, color); - x += 8; + 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); + } + xo += fw; } } else { sjis_is2nd = true; @@ -102,15 +100,19 @@ static void fmdsp_putline(const char *strptr, uint8_t *vram, const uint8_t *font } else { uint8_t sjis_2nd = *cp932str++; uint16_t jis = sjis2jis(sjis_1st, sjis_2nd); - uint8_t jis_1st = jis >> 8; - uint8_t jis_2nd = jis; - bool half = (jis_1st == 0x29); - if ((x+(half ? 8 : 16)) > PC98_W) return; - vram_putchar((jis_2nd<<8) | (jis_1st-0x20), vram, font, x, y, color); - x += 8; + bool half = jis_is_halfwidth(jis); + 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); + } + xo += fw; if (!half) { - vram_putchar((jis_2nd<<8) | (jis_1st-0x20+0x80), vram, font, x, y, color); - x += 8; + fp = font->get(font, jis, FMDSP_FONT_JIS_RIGHT); + if (fp) { + vram_putchar(vram, fp, x+xo, y, fw, fh, color); + } + xo += 8; } sjis_is2nd = false; } @@ -119,7 +121,6 @@ static void fmdsp_putline(const char *strptr, uint8_t *vram, const uint8_t *font void fmdsp_vram_init(struct fmdsp *fmdsp, struct fmdriver_work *work, - const uint8_t *font, uint8_t *vram) { for (int y = 0; y < PC98_H; y++) { for (int x = 0; x < PC98_W; x++) { @@ -127,6 +128,23 @@ void fmdsp_vram_init(struct fmdsp *fmdsp, } } for (int t = 0; t < 10; t++) { + struct fmdriver_track_status *track = &work->track_status[t]; + uint8_t *track_type; + switch (track->type) { + case FMDRIVER_TRACK_FM: + track_type = s_t_fm; + break; + case FMDRIVER_TRACK_SSG: + track_type = s_t_ssg; + break; + case FMDRIVER_TRACK_ADPCM: + track_type = s_t_adpcm; + break; + } + vramblit(vram, 1, TRACK_H*t+1, track_type, TNAME_W, TNAME_H); + 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, KEY_LEFT_X, TRACK_H*t+KEY_Y, s_key_left, KEY_LEFT_W, KEY_H); for (int i = 0; i < KEY_OCTAVES; i++) { @@ -155,8 +173,11 @@ void fmdsp_vram_init(struct fmdsp *fmdsp, } vram[(PC98_H-height)*PC98_W] = 0; vram[(PC98_H-1)*PC98_W] = 0; - for (int i = 0; i < 3; i++) { - fmdsp_putline(work->comment[i], vram, font, COMMENT_Y+COMMENT_H*i, 2); + 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); + } } } @@ -164,24 +185,13 @@ void fmdsp_update(struct fmdsp *fmdsp, const struct fmdriver_work *work, uint8_t *vram) { for (int t = 0; t < 10; t++) { struct fmdriver_track_status *track = &work->track_status[t]; - uint8_t *track_type; - switch (track->type) { - case FMDRIVER_TRACK_FM: - track_type = s_t_fm; - break; - case FMDRIVER_TRACK_SSG: - track_type = s_t_ssg; - break; - case FMDRIVER_TRACK_ADPCM: - track_type = s_t_adpcm; - break; - case FMDRIVER_TRACK_PPZ8: - track_type = s_t_ppz8; + 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); } - vramblit(vram, 1, TRACK_H*t+1, track_type, TNAME_W, TNAME_H); - 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); 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); @@ -240,13 +250,3 @@ static void fontrom_copy_rows(uint8_t *font, const uint8_t *fontrom, } } } - -void fmdsp_font_from_fontrom(uint8_t *font, const uint8_t *fontrom) { - // ANK - for (int i = 0; i < 256*16; i++) { - font[0x80000+i] = fontrom[0x800+i]; - } - fontrom_copy_rows(font, fontrom, 0x21, 0x50); - fontrom_copy_rows(font, fontrom, 0x50, 0x76); - fontrom_copy_rows(font, fontrom, 0x78, 0x7d); -} |