int ross_crt_attach(FILE *fd, uint8_t *rawcart) { crt_chip_header_t chip; int amount = 0; while (1) { if (crt_read_chip_header(&chip, fd)) { break; } amount++; if (chip.start != 0x8000 || chip.size != 0x4000 || chip.bank > 1) { return -1; } if (crt_read_chip(rawcart, chip.bank << 14, &chip, fd)) { return -1; } } if (amount == 1) { ross_is_32k = 0; } else { ross_is_32k = 1; } return ross_common_attach(); }
int freezemachine_crt_attach(FILE *fd, BYTE *rawcart) { int i; crt_chip_header_t chip; for (i = 0; i < 4; i++) { if (crt_read_chip_header(&chip, fd)) { break; } if (chip.bank > 3 || chip.size != 0x2000 || (chip.start != 0x8000 && chip.start != 0xa000)) { return -1; } if (crt_read_chip(rawcart, (chip.start & 0x2000) + (chip.bank << 14), &chip, fd)) { return -1; } } if (i != 2 && i != 4) { return -1; } allow_toggle = (i == 4); return freezemachine_common_attach(); }
int mach5_crt_attach(FILE *fd, BYTE *rawcart) { crt_chip_header_t chip; if (crt_read_chip_header(&chip, fd)) { return -1; } if (chip.size == 0x1000) { if (crt_read_chip(rawcart, 0, &chip, fd)) { return -1; } memcpy(&rawcart[0x1000], rawcart, 0x1000); } else if (chip.size == 0x2000) { if (crt_read_chip(rawcart, 0, &chip, fd)) { return -1; } } else { return -1; } return mach5_common_attach(); }
int magicdesk_crt_attach(FILE *fd, BYTE *rawcart) { crt_chip_header_t chip; while (1) { if (crt_read_chip_header(&chip, fd)) { break; } if ((chip.bank >= MAXBANKS) || ((chip.start != 0x8000) && (chip.start != 0xa000)) || (chip.size != 0x2000)) { return -1; } if (crt_read_chip(rawcart, chip.bank << 13, &chip, fd)) { return -1; } } return magicdesk_common_attach(); }
int rex_crt_attach(FILE *fd, BYTE *rawcart) { crt_chip_header_t chip; if (crt_read_chip_header(&chip, fd)) { return -1; } if (chip.size != 0x2000) { return -1; } if (crt_read_chip(rawcart, 0, &chip, fd)) { return -1; } return rex_common_attach(); }
int warpspeed_crt_attach(FILE *fd, BYTE *rawcart) { crt_chip_header_t chip; if (crt_read_chip_header(&chip, fd)) { return -1; } if (chip.start != 0x8000 || chip.size != 0x4000) { return -1; } if (crt_read_chip(rawcart, 0, &chip, fd)) { return -1; } return warpspeed_common_attach(); }
int dsm_crt_attach(FILE *fd, BYTE *rawcart) { crt_chip_header_t chip; if (crt_read_chip_header(&chip, fd)) { return -1; } if (chip.bank > 0 || chip.size != DSM_CART_SIZE) { return -1; } if (crt_read_chip(rawcart, 0, &chip, fd)) { return -1; } return dsm_common_attach(); }
static int expert_crt_load(FILE *fd, BYTE *rawcart) { crt_chip_header_t chip; if (crt_read_chip_header(&chip, fd)) { return -1; } if (chip.size != EXPERT_RAM_SIZE) { return -1; } if (crt_read_chip(rawcart, 0, &chip, fd)) { return -1; } expert_filetype = CARTRIDGE_FILETYPE_CRT; return 0; }
int freezeframe_crt_attach(FILE *fd, BYTE *rawcart) { crt_chip_header_t chip; if (crt_read_chip_header(&chip, fd)) { return -1; } if (chip.bank > 0 || chip.size != FREEZE_FRAME_CART_SIZE) { return -1; } if (crt_read_chip(rawcart, 0, &chip, fd)) { return -1; } return freezeframe_common_attach(); }
int magicdesk_crt_attach(FILE *fd, uint8_t *rawcart) { crt_chip_header_t chip; int lastbank = 0; while (1) { if (crt_read_chip_header(&chip, fd)) { break; } if ((chip.bank >= MAXBANKS) || ((chip.start != 0x8000) && (chip.start != 0xa000)) || (chip.size != 0x2000)) { return -1; } if (crt_read_chip(rawcart, chip.bank << 13, &chip, fd)) { return -1; } if (chip.bank > lastbank) { lastbank = chip.bank; } } if (lastbank >= 128) { /* more than 128 banks does not work */ return -1; } else if (lastbank >= 64) { /* min 65, max 128 banks */ bankmask = 0x7f; } else if (lastbank >= 32) { /* min 33, max 64 banks */ bankmask = 0x3f; } else if (lastbank >= 16) { /* min 17, max 32 banks */ bankmask = 0x1f; } else if (lastbank >= 8) { /* min 9, max 16 banks */ bankmask = 0x0f; } else if (lastbank >= 4) { /* min 5, max 8 banks */ bankmask = 0x07; } else { /* max 4 banks */ bankmask = 0x03; } return magicdesk_common_attach(); }
int dinamic_crt_attach(FILE *fd, BYTE *rawcart) { crt_chip_header_t chip; while (1) { if (crt_read_chip_header(&chip, fd)) { break; } if (chip.bank > 15 || chip.size != 0x2000 || chip.start != 0x8000) { return -1; } if (crt_read_chip(rawcart, chip.bank << 13, &chip, fd)) { return -1; } } return dinamic_common_attach(); }
int simon_crt_attach(FILE *fd, BYTE *rawcart) { crt_chip_header_t chip; int i; for (i = 0; i <= 1; i++) { if (crt_read_chip_header(&chip, fd)) { return -1; } if ((chip.start != 0x8000 && chip.start != 0xa000) || chip.size != 0x2000) { return -1; } if (crt_read_chip(rawcart, chip.start - 0x8000, &chip, fd)) { return -1; } } return simon_common_attach(); }
int actionreplay2_crt_attach(FILE *fd, BYTE *rawcart) { crt_chip_header_t chip; int i; for (i = 0; i <= 1; i++) { if (crt_read_chip_header(&chip, fd)) { return -1; } if (chip.bank > 1 || chip.size != 0x2000) { return -1; } if (crt_read_chip(rawcart, chip.bank << 13, &chip, fd)) { return -1; } } return actionreplay2_common_attach(); }
int se5_crt_attach(FILE *fd, BYTE *rawcart) { crt_chip_header_t chip; int i, cnt = 0; for (i = 0; i <= 0x01; i++) { if (crt_read_chip_header(&chip, fd)) { break; } if (chip.bank > 0x1f || chip.size != 0x2000) { return -1; } if (crt_read_chip(rawcart, chip.bank << 13, &chip, fd)) { return -1; } cnt++; } return se5_common_attach(); }
/* * (old) wrong formats: * * cartconv produced this until 2011: * * offset sig type bank start size chunklen * $000040 CHIP ROM #000 $8000 $2000 $2010 * $002050 CHIP ROM #001 $8000 $2000 $2010 * $004060 CHIP ROM #002 $8000 $2000 $2010 (32k ROMs only) * $006070 CHIP ROM #003 $8000 $2000 $2010 (32k ROMs only) * * cartconv produced this from 2011 to 12/2015: * * offset sig type bank start size chunklen * $000040 CHIP ROM #000 $8000 $2000 $2010 * $002050 CHIP ROM #000 $a000 $2000 $2010 * $004060 CHIP ROM #001 $8000 $2000 $2010 (32k ROMs only) * $006070 CHIP ROM #001 $a000 $2000 $2010 (32k ROMs only) * * (new) correct format (since 12/2015): * * offset sig type bank start size chunklen * $000040 CHIP ROM #000 $8000 $4000 $4010 * $004050 CHIP ROM #001 $8000 $4000 $4010 (32k ROMs only) * */ int freezemachine_crt_attach(FILE *fd, BYTE *rawcart) { int i, pos, banks, chips; crt_chip_header_t chip; /* find out how many banks and chips are in the file */ /* FIXME: this is kindof ugly, perhaps make it a generic function */ banks = 0; pos = ftell(fd); for (chips = 0; chips < 4; chips++) { if (crt_read_chip_header(&chip, fd)) { break; } if (crt_read_chip(rawcart, 0, &chip, fd)) { return -1; } if (chip.bank > banks) { banks = chip.bank; } } banks++; DBG(("fm attach: %d banks, %d chips found\n", banks, chips)); if ((chips != 1) && (chips != 2) && (chips != 4)) { DBG(("fm attach: wrong number of chips\n")); return -1; } fseek(fd, pos, SEEK_SET); for (i = 0; i < chips; i++) { if (crt_read_chip_header(&chip, fd)) { return -1; } DBG(("fm attach: chip.size %04x\n", chip.size)); /* first the new format */ if ((chip.size == 0x4000) && (((chips == 1) && (banks == 1)) || ((chips == 2) && (banks == 2)))) { if ((chip.bank > 1) || (chip.start != 0x8000)) { return -1; } if (crt_read_chip(rawcart, (chip.bank << 14), &chip, fd)) { return -1; } allow_toggle = (chips == 2); /* older format */ } else if ((chip.size == 0x2000) && (((chips == 2) && (banks == 1)) || ((chips == 4) && (banks == 2)))) { if ((chip.bank > 1) || ((chip.start != 0x8000) && (chip.start != 0xa000))) { return -1; } if (crt_read_chip(rawcart, (chip.start & 0x2000) + (chip.bank << 14), &chip, fd)) { return -1; } allow_toggle = (chips == 4); /* very old format */ } else if ((chip.size == 0x2000) && (((chips == 2) && (banks == 2)) || ((chips == 4) && (banks == 4)))) { if ((chip.bank > 3) || (chip.start != 0x8000)) { return -1; } if (crt_read_chip(rawcart, chip.bank << 13, &chip, fd)) { return -1; } allow_toggle = (chips == 4); } else { return -1; } } return freezemachine_common_attach(); }