aboutsummaryrefslogtreecommitdiff
path: root/fmdsp/fmdsp.c
diff options
context:
space:
mode:
Diffstat (limited to 'fmdsp/fmdsp.c')
-rw-r--r--fmdsp/fmdsp.c144
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);
-}