Beispiel #1
0
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();
}
Beispiel #2
0
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 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();
}
Beispiel #4
0
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();
}
Beispiel #5
0
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();
}
Beispiel #7
0
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();
}
Beispiel #9
0
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();
}
Beispiel #10
0
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();
}
Beispiel #11
0
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();
}
Beispiel #12
0
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();
}
Beispiel #13
0
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();
}
Beispiel #14
0
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();
}
/*
 * (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();
}