static int pt3_test(HIO_HANDLE *f, char *t, const int start) { if (hio_read32b(f) != MAGIC_FORM) return -1; hio_read32b(f); /* skip size */ if (hio_read32b(f) != MAGIC_MODL) return -1; if (hio_read32b(f) != MAGIC_VERS) return -1; hio_read32b(f); /* skip size */ hio_seek(f, 10, SEEK_CUR); if (hio_read32b(f) == MAGIC_INFO) { hio_read32b(f); /* skip size */ libxmp_read_title(f, t, 32); } else { libxmp_read_title(f, t, 0); } return 0; }
static int med4_test(HIO_HANDLE *f, char *t, const int start) { if (hio_read32b(f) != MAGIC_MED4) return -1; libxmp_read_title(f, t, 0); return 0; }
static int psm_test(HIO_HANDLE *f, char *t, const int start) { if (hio_read32b(f) != MAGIC_PSM_) return -1; libxmp_read_title(f, t, 60); return 0; }
static int mfp_test(HIO_HANDLE *f, char *t, const int start) { uint8 buf[384]; int i, len, lps, lsz; if (HIO_HANDLE_TYPE(f) != HIO_HANDLE_TYPE_FILE) return -1; if (hio_read(buf, 1, 384, f) < 384) return -1; /* check restart byte */ if (buf[249] != 0x7f) return -1; for (i = 0; i < 31; i++) { /* check size */ len = readmem16b(buf + i * 8); if (len > 0x7fff) return -1; /* check finetune */ if (buf[i * 8 + 2] & 0xf0) return -1; /* check volume */ if (buf[i * 8 + 3] > 0x40) return -1; /* check loop start */ lps = readmem16b(buf + i * 8 + 4); if (lps > len) return -1; /* check loop size */ lsz = readmem16b(buf + i * 8 + 6); if (lps + lsz - 1 > len) return -1; if (len > 0 && lsz == 0) return -1; } if (buf[248] != readmem16b(buf + 378)) return -1; if (readmem16b(buf + 378) != readmem16b(buf + 380)) return -1; libxmp_read_title(f, t, 0); return 0; }
static int tcb_test(HIO_HANDLE *f, char *t, const int start) { uint8 buffer[10]; if (hio_read(buffer, 1, 8, f) < 8) return -1; if (memcmp(buffer, "AN COOL.", 8) && memcmp(buffer, "AN COOL!", 8)) return -1; libxmp_read_title(f, t, 0); return 0; }
static int mtp_test(HIO_HANDLE *f, char *t, const int start) { char buf[6]; if (hio_read(buf, 1, 6, f) < 6) return -1; if (memcmp(buf, "SONGOK", 6) && memcmp(buf, "IAN92a", 6)) return -1; libxmp_read_title(f, t, 0); return 0; }
static int gdm_test(HIO_HANDLE *f, char *t, const int start) { if (hio_read32b(f) != MAGIC_GDM) return -1; hio_seek(f, start + 0x47, SEEK_SET); if (hio_read32b(f) != MAGIC_GMFS) return -1; hio_seek(f, start + 4, SEEK_SET); libxmp_read_title(f, t, 32); return 0; }
static int rtm_test(HIO_HANDLE *f, char *t, const int start) { char buf[4]; if (hio_read(buf, 1, 4, f) < 4) return -1; if (memcmp(buf, "RTMM", 4)) return -1; if (hio_read8(f) != 0x20) return -1; libxmp_read_title(f, t, 32); return 0; }
static int amd_test(HIO_HANDLE *f, char *t, const int start) { char buf[9]; hio_seek(f, start + 1062, SEEK_SET); if (hio_read(buf, 1, 9, f) < 9) return -1; if (memcmp(buf, "<o", 2) || memcmp(buf + 6, "RoR", 3)) return -1; hio_seek(f, start + 0, SEEK_SET); libxmp_read_title(f, t, 24); return 0; }
static int ult_test(HIO_HANDLE *f, char *t, const int start) { char buf[15]; if (hio_read(buf, 1, 15, f) < 15) return -1; if (memcmp(buf, "MAS_UTrack_V000", 14)) return -1; if (buf[14] < '0' || buf[14] > '4') return -1; libxmp_read_title(f, t, 32); return 0; }
static int alm_test(HIO_HANDLE *f, char *t, const int start) { char buf[7]; if (HIO_HANDLE_TYPE(f) != HIO_HANDLE_TYPE_FILE) return -1; if (hio_read(buf, 1, 7, f) < 7) return -1; if (memcmp(buf, "ALEYMOD", 7) && memcmp(buf, "ALEY MO", 7)) return -1; libxmp_read_title(f, t, 0); return 0; }
static int chip_test(HIO_HANDLE *f, char *t, const int start) { char buf[4]; hio_seek(f, start + 952, SEEK_SET); if (hio_read(buf, 1, 4, f) < 4) return -1; /* Also RASP? */ if (memcmp(buf, "KRIS", 4) != 0) return -1; hio_seek(f, start + 0, SEEK_SET); libxmp_read_title(f, t, 20); return 0; }
static int gal5_test(HIO_HANDLE *f, char *t, const int start) { if (hio_read32b(f) != MAGIC4('R', 'I', 'F', 'F')) return -1; hio_read32b(f); if (hio_read32b(f) != MAGIC4('A', 'M', ' ', ' ')) return -1; if (hio_read32b(f) != MAGIC4('I', 'N', 'I', 'T')) return -1; hio_read32b(f); /* skip size */ libxmp_read_title(f, t, 64); return 0; }
static int digi_test(HIO_HANDLE *f, char *t, const int start) { char buf[20]; if (hio_read(buf, 1, 20, f) < 20) return -1; if (memcmp(buf, "DIGI Booster module", 19)) return -1; hio_seek(f, 156, SEEK_CUR); hio_seek(f, 3 * 4 * 32, SEEK_CUR); hio_seek(f, 2 * 1 * 32, SEEK_CUR); libxmp_read_title(f, t, 32); return 0; }
static int no_test(HIO_HANDLE *f, char *t, const int start) { int nsize, pat, chn; int i; hio_seek(f, start, SEEK_CUR); if (hio_read32b(f) != 0x4e4f0000) /* NO 0x00 0x00 */ return -1; nsize = hio_read8(f); if (nsize != 20) return -1; /* test title */ for (i = 0; i < nsize; i++) { if (hio_read8(f) == 0) return -1; } hio_seek(f, 9, SEEK_CUR); /* test number of patterns */ pat = hio_read8(f); if (pat == 0) return -1; hio_read8(f); /* test number of channels */ chn = hio_read8(f); if (chn <= 0 || chn > 16) return -1; hio_seek(f, start + 5, SEEK_SET); libxmp_read_title(f, t, nsize); return 0; }
static int hsc_test(HIO_HANDLE *f, char *t, const int start) { int p, i, r, c; uint8 buf[1200]; hio_seek(f, 128 * 12, SEEK_CUR); if (hio_read(buf, 1, 51, f) != 51) return -1; for (p = i = 0; i < 51; i++) { if (buf[i] == 0xff) break; if (buf[i] > p) p = buf[i]; } if (!i || !p || i > 50 || p > 50) /* Test number of patterns */ return -1; for (i = 0; i < p; i++) { hio_read(buf, 1, 64 * 9 * 2, f); for (r = 0; r < 64; r++) { for (c = 0; c < 9; c++) { uint8 n = buf[r * 9 * 2 + c * 2]; uint8 m = buf[r * 9 * 2 + c * 2 + 1]; if (m > 0x06 && m < 0x10 && n != 0x80) /* Test effects 07..0f */ return -1; if (MSN(m) > 6 && MSN(m) < 10) /* Test effects 7x .. 9x */ return -1; } } } libxmp_read_title(f, t, 0); return 0; }
static int coco_test(HIO_HANDLE *f, char *t, const int start) { uint8 x, buf[20]; uint32 y; int n, i; x = hio_read8(f); /* check number of channels */ if (x != 0x84 && x != 0x88) return -1; hio_read(buf, 1, 20, f); /* read title */ if (check_cr(buf, 20) != 0) return -1; n = hio_read8(f); /* instruments */ if (n > 100) return -1; hio_read8(f); /* sequences */ hio_read8(f); /* patterns */ y = hio_read32l(f); if (y < 64 || y > 0x00100000) /* offset of sequence table */ return -1; y = hio_read32l(f); /* offset of patterns */ if (y < 64 || y > 0x00100000) return -1; for (i = 0; i < n; i++) { int ofs = hio_read32l(f); int len = hio_read32l(f); int vol = hio_read32l(f); int lps = hio_read32l(f); int lsz = hio_read32l(f); if (ofs < 64 || ofs > 0x00100000) return -1; if (vol > 0xff) return -1; if (len > 0x00100000 || lps > 0x00100000 || lsz > 0x00100000) return -1; if (lps + lsz - 1 > len) return -1; hio_read(buf, 1, 11, f); if (check_cr(buf, 11) != 0) return -1; hio_read8(f); /* unused */ } hio_seek(f, start + 1, SEEK_SET); libxmp_read_title(f, t, 20); #if 0 for (i = 0; i < 20; i++) { if (t[i] == 0x0d) t[i] = 0; } #endif return 0; }
static int coco_load(struct module_data *m, HIO_HANDLE *f, const int start) { struct xmp_module *mod = &m->mod; struct xmp_event *event; int i, j; int seq_ptr, pat_ptr, smp_ptr[100]; LOAD_INIT(); mod->chn = hio_read8(f) & 0x3f; libxmp_read_title(f, mod->name, 20); for (i = 0; i < 20; i++) { if (mod->name[i] == 0x0d) mod->name[i] = 0; } libxmp_set_type(m, "Coconizer"); mod->ins = mod->smp = hio_read8(f); mod->len = hio_read8(f); mod->pat = hio_read8(f); mod->trk = mod->pat * mod->chn; seq_ptr = hio_read32l(f); pat_ptr = hio_read32l(f); MODULE_INFO(); if (libxmp_init_instrument(m) < 0) return -1; m->vol_table = (int *)arch_vol_table; m->volbase = 0xff; for (i = 0; i < mod->ins; i++) { if (libxmp_alloc_subinstrument(mod, i, 1) < 0) return -1; smp_ptr[i] = hio_read32l(f); mod->xxs[i].len = hio_read32l(f); mod->xxi[i].sub[0].vol = 0xff - hio_read32l(f); mod->xxi[i].sub[0].pan = 0x80; mod->xxs[i].lps = hio_read32l(f); mod->xxs[i].lpe = mod->xxs[i].lps + hio_read32l(f); if (mod->xxs[i].lpe) mod->xxs[i].lpe -= 1; mod->xxs[i].flg = mod->xxs[i].lps > 0 ? XMP_SAMPLE_LOOP : 0; hio_read(mod->xxi[i].name, 1, 11, f); for (j = 0; j < 11; j++) { if (mod->xxi[i].name[j] == 0x0d) mod->xxi[i].name[j] = 0; } hio_read8(f); /* unused */ mod->xxi[i].sub[0].sid = i; if (mod->xxs[i].len > 0) mod->xxi[i].nsm = 1; D_(D_INFO "[%2X] %-10.10s %05x %05x %05x %c V%02x", i, mod->xxi[i].name, mod->xxs[i].len, mod->xxs[i].lps, mod->xxs[i].lpe, mod->xxs[i].flg & XMP_SAMPLE_LOOP ? 'L' : ' ', mod->xxi[i].sub[0].vol); } /* Sequence */ hio_seek(f, start + seq_ptr, SEEK_SET); for (i = 0; ; i++) { uint8 x = hio_read8(f); if (x == 0xff) break; mod->xxo[i] = x; } for (i++; i % 4; i++) /* for alignment */ hio_read8(f); /* Patterns */ if (libxmp_init_pattern(mod) < 0) return -1; D_(D_INFO "Stored patterns: %d", mod->pat); for (i = 0; i < mod->pat; i++) { if (libxmp_alloc_pattern_tracks(mod, i, 64) < 0) return -1; for (j = 0; j < (64 * mod->chn); j++) { event = &EVENT (i, j % mod->chn, j / mod->chn); event->fxp = hio_read8(f); event->fxt = hio_read8(f); event->ins = hio_read8(f); event->note = hio_read8(f); if (event->note) event->note += 12; fix_effect(event); } } /* Read samples */ D_(D_INFO "Stored samples : %d", mod->smp); for (i = 0; i < mod->ins; i++) { if (mod->xxi[i].nsm == 0) continue; hio_seek(f, start + smp_ptr[i], SEEK_SET); if (libxmp_load_sample(m, f, SAMPLE_FLAG_VIDC, &mod->xxs[i], NULL) < 0) return -1; } for (i = 0; i < mod->chn; i++) { mod->xxc[i].pan = DEFPAN((((i + 3) / 2) % 2) * 0xff); } return 0; }