aboutsummaryrefslogtreecommitdiff
path: root/fmdriver
diff options
context:
space:
mode:
Diffstat (limited to 'fmdriver')
-rw-r--r--fmdriver/fmdriver.h18
-rw-r--r--fmdriver/fmdriver_fmp.c55
-rw-r--r--fmdriver/fmdriver_fmp.h6
-rw-r--r--fmdriver/fmdriver_pmd.c12
4 files changed, 89 insertions, 2 deletions
diff --git a/fmdriver/fmdriver.h b/fmdriver/fmdriver.h
index b31c31e..ba36c3e 100644
--- a/fmdriver/fmdriver.h
+++ b/fmdriver/fmdriver.h
@@ -89,9 +89,23 @@ struct fmdriver_work {
const struct ppz8_functbl *ppz8_functbl;
struct ppz8 *ppz8;
+ // if false, 3 line comment
+ // if true, PMD memo mode
+ bool comment_mode_pmd;
+
// CP932 encoded
- //const char *title;
- char comment[3][FMDRIVER_TITLE_BUFLEN];
+ // may contain ANSI escape sequences
+ // if !comment_mode_pmd:
+ // three lines, 0 <= line < 3
+ // if comment_mode_pmd:
+ // line 0: #Title
+ // line 1: #Composer
+ // line 2: #Arranger
+ // line 3: #Memo 1st line
+ // :
+ // line n: NULL
+ const char *(*get_comment)(struct fmdriver_work *work, int line);
+
// only single-byte uppercase cp932
char filename[FMDRIVER_TITLE_BUFLEN];
// always 8 characters and pad with ' '
diff --git a/fmdriver/fmdriver_fmp.c b/fmdriver/fmdriver_fmp.c
index c57b975..54f6753 100644
--- a/fmdriver/fmdriver_fmp.c
+++ b/fmdriver/fmdriver_fmp.c
@@ -1,5 +1,6 @@
#include "fmdriver_fmp.h"
#include "fmdriver_common.h"
+#include <string.h>
static uint8_t fmp_rand71(struct driver_fmp *fmp) {
// on real PC-98, read from I/O port 0x71 (8253 Timer)
@@ -3200,6 +3201,48 @@ static void fmp_opna_interrupt(struct fmdriver_work *work) {
}
}
+static void fmp_title(
+ struct fmdriver_work *work,
+ struct driver_fmp *fmp,
+ uint16_t offset) {
+ int l = 0;
+ int li = 0;
+ for (int si = 0;; si++) {
+ if (l >= 3) {
+ // Z8X
+ fmp->pdzf.mode = 1;
+ return;
+ }
+ if ((offset + si) >= fmp->datalen) {
+ fmp->comment[l][0] = 0;
+ return;
+ }
+ if (li >= FMP_COMMENT_BUFLEN) {
+ fmp->comment[l][0] = 0;
+ return;
+ }
+ uint8_t c = fmp->data[offset+si];
+ if (c == '\r') {
+ continue;
+ } else if (c == '\n') {
+ fmp->comment[l][li] = 0;
+ li = 0;
+ l++;
+ } else {
+ fmp->comment[l][li] = c;
+ if (!c) return;
+ li++;
+ }
+ }
+}
+
+static void fmp_check_pdzf(struct driver_fmp *fmp) {
+ for (int l = 0; l < 3; l++) {
+ if (strstr((const char *)fmp->comment[l], "using PDZF")) fmp->pdzf.mode = 2;
+ }
+}
+
+/*
// copy title string (CP932) to fmdriver_work struct,
// and detect which PDZF(/Z8X) mode to use
static void fmp_title(struct fmdriver_work *work,
@@ -3289,6 +3332,7 @@ static void fmp_title(struct fmdriver_work *work,
}
}
}
+*/
bool fmp_load(struct driver_fmp *fmp,
uint8_t *data, uint16_t datalen)
@@ -3525,8 +3569,19 @@ bool fmp_load(struct driver_fmp *fmp,
return true;
}
+static const char *fmp_get_comment(struct fmdriver_work *work, int line) {
+ if (line < 0) return 0;
+ if (line >= 3) return 0;
+ struct driver_fmp *fmp = work->driver;
+ if (!fmp->comment[line][0]) return 0;
+ return (const char *)fmp->comment[line];
+}
+
void fmp_init(struct fmdriver_work *work, struct driver_fmp *fmp) {
fmp_title(work, fmp, read16le(fmp->data)+4);
+ fmp_check_pdzf(fmp);
+ work->comment_mode_pmd = false;
+ work->get_comment = fmp_get_comment;
fmp_struct_init(work, fmp);
fmp_init_parts(work, fmp);
uint16_t fmtoneptr = fmp->datainfo.fmtoneptr;
diff --git a/fmdriver/fmdriver_fmp.h b/fmdriver/fmdriver_fmp.h
index ead8074..eb89b0b 100644
--- a/fmdriver/fmdriver_fmp.h
+++ b/fmdriver/fmdriver_fmp.h
@@ -39,6 +39,10 @@ enum {
};
enum {
+ FMP_COMMENT_BUFLEN = 256,
+};
+
+enum {
FMP_DATA_FM_1,
FMP_DATA_FM_2,
FMP_DATA_FM_3,
@@ -536,6 +540,8 @@ struct driver_fmp {
} rhythm[2];
uint8_t rhythm_current_note;
} pdzf;
+
+ uint8_t comment[3][FMP_COMMENT_BUFLEN];
};
// first: call fmp_load with zero_initialized struct driver_fmp and data
diff --git a/fmdriver/fmdriver_pmd.c b/fmdriver/fmdriver_pmd.c
index a57a916..343152b 100644
--- a/fmdriver/fmdriver_pmd.c
+++ b/fmdriver/fmdriver_pmd.c
@@ -5872,16 +5872,27 @@ void pmd_filenamecopy(char *dest, const char *src) {
dest[0] = 0;
}
+static const char *pmd_get_comment(struct fmdriver_work *work, int line) {
+ struct driver_pmd *pmd = work->driver;
+ if (line < 0) return 0;
+ const char *str = pmd_get_memo(pmd, line + 1);
+ if (str && !*str) return 0;
+ return str;
+}
+
void pmd_init(struct fmdriver_work *work,
struct driver_pmd *pmd) {
// TODO: reset ppz8
// 0f99
work->driver = pmd;
+ work->comment_mode_pmd = true;
+ work->get_comment = pmd_get_comment;
pmd_reset_opna(work, pmd);
pmd_reset_timer(work, pmd);
pmd->playing = true;
work->driver_opna_interrupt = pmd_opna_interrupt;
+ /*
static const int memotable[3] = {1, 4, 5};
for (int i = 0; i < 3; i++) {
const char *title = pmd_get_memo(pmd, memotable[i]);
@@ -5894,6 +5905,7 @@ void pmd_init(struct fmdriver_work *work,
}
work->comment[i][c] = 0;
}
+ */
const char *pcmfile = pmd_get_memo(pmd, -2);
if (pcmfile) {
pmd_filenamecopy(pmd->ppzfile, pcmfile);