예제 #1
0
static int load(M6502 *mpu, const char *path)
{
    Strudel* mb = (Strudel *) mpu->ext;
    FILE  *file = 0;

    if (!(file = fopen(path, "r")))
        return 0;

    fread_buffer(mb->firmware, 16384, file);
    fclose(file);

    return 1;
}
예제 #2
0
static void load_tzdata(void)
{
    char *path = str_printf("%r" SEP_S "data" SEP_S "tzdata.dat", fs->fox_home);
    FileHandle fh = open_fox(path, O_RDONLY, DEFAULT_PERMISSION);
    int32_t size;
    char *tzdata_names;
    int i;

    if (fh == -1) {
        fatal_errorf("Cannot load file %q", path);
    }
    free(path);


    tzdata_size = fread_uint32(fh);
    if (tzdata_size <= 0 || tzdata_size > fs->max_alloc / sizeof(TZData)) {
        goto ERROR_END;
    }
    tzdata = Mem_get(&fg->st_mem, tzdata_size * sizeof(TZData));
    for (i = 0; i < tzdata_size; i++) {
        TZData *p = &tzdata[i];
        p->u1.index = fread_uint32(fh);
        p->u2.index = fread_uint32(fh);
    }

    size = fread_uint32(fh);
    if (size <= 0 || size > fs->max_alloc) {
        goto ERROR_END;
    }
    tzdata_names = fread_buffer(fh, size, &fg->st_mem);

    size = fread_uint32(fh);
    if (size <= 0 || size > fs->max_alloc / sizeof(TZDataAlias)) {
        goto ERROR_END;
    }
    tzdata_alias = Mem_get(&fg->st_mem, size * sizeof(TZDataAlias));
    for (i = 0; i < size; i++) {
        TZDataAlias *p = &tzdata_alias[i];
        p->tz = NULL;
        p->index = fread_uint32(fh);
    }

    size = fread_uint32(fh);
    if (size <= 0 || size > fs->max_alloc) {
        goto ERROR_END;
    }
    tzdata_abbr = fread_buffer(fh, size, &fg->st_mem);

    size = fread_uint32(fh);
    if (size <= 0 || size > fs->max_alloc) {
        goto ERROR_END;
    }
    tzdata_line = fread_buffer(fh, size * 4, &fg->st_mem);

    size = fread_uint32(fh);
    if (size <= 0 || size > fs->max_alloc) {
        goto ERROR_END;
    }
    tzdata_data = fread_buffer(fh, size, &fg->st_mem);

    for (i = 0; i < tzdata_size; i++) {
        TZData *p = &tzdata[i];
        p->u1.name = tzdata_names + p->u1.index;
        p->u2.alias = tzdata_alias + p->u2.index;
    }
    close_fox(fh);
    return;

ERROR_END:
    fatal_errorf("Failed to load tzdata");
}
예제 #3
0
int call_cb(M6502* mpu, int type, uint16_t addr, uint8_t data) {
    static int relocated = 0;

    uint8_t buffer[256];
    Strudel* mb = (Strudel *) mpu->ext;

    uint16_t address = 0;
    uint16_t offset = 0;
    uint8_t command = 0;
    uint8_t sector = 0;
    uint8_t track = 0;

    if (debug) fprintf(stderr, "calling %04x\n", addr);

    switch (addr) {
    case 0x0:
        exit(0);

    case 0x1b03:
	relocated = 1;
	return 0;

    case 0x3d00:
        if (relocated)
            return 0;

    case 0x3d9:
		fprintf(stderr, "Calling RWTS JMP\n");

    case 0xbd00:
	address = mpu->a * 256 + mpu->y;

        track = M6502_peek(mpu, address + 4);
        sector = M6502_peek(mpu, address + 5);
        command = M6502_peek(mpu, address + 12);
        address = M6502_peekWord(mpu, address, 8);

        fprintf(stderr,
                "RWTS (%04x): Command %d, track %d, sector %d to %04x\n",
                M6502_peekWord(mpu, 0x3da, 0), command, track, sector, address);

		if (fseek(mb->s6d1, track * 4096 + sector * 256, SEEK_SET) == 0) {
			fread_buffer(buffer, sizeof(buffer), mb->s6d1);
        	for (offset = 0; offset < 256; address++, offset++) {
            	M6502_poke(mpu, address, buffer[offset]);
			}
        }

	return 0xfff9;

    case 0xc600:
        M6502_poke(mpu, 0x0003, 0);
        M6502_poke(mpu, 0x0026, 0);
        M6502_poke(mpu, 0x0027, 8);
        M6502_poke(mpu, 0x003c, 0);
        M6502_poke(mpu, 0x003d, 0);
        M6502_poke(mpu, 0x0041, 0);
        M6502_poke(mpu, 0x004f, 0x60);

        do {
            M6502_poke(mpu, 0x002b, 0x60);

    case 0xc65c:
            address = M6502_peekWord(mpu, 0x0026, 0);
            sector = M6502_peek(mpu, 0x003D);
            track = M6502_peek(mpu, 0x0041);

            fprintf(stderr, "ROM: Reading track %d, sector %d (%d) to %04x\n",
                    track, logical[sector], M6502_peek(mpu, 0x0800), address);

			if (fseek(mb->s6d1, track * 4096 + logical[sector] * 256,
			          SEEK_SET) == 0) {
				fread_buffer(buffer, sizeof(buffer), mb->s6d1);
        		for (offset = 0; offset < 256; address++, offset++) {
            		M6502_poke(mpu, address, buffer[offset]);
				}	
            }

            sector++;

            M6502_poke(mpu, 0x0040, track);
            M6502_pokeWord(mpu, 0x0026, 0, address);
            M6502_poke(mpu, 0x003d, sector);

        } while (M6502_peek(mpu, 0x0800) > sector); 

        return 0x801; 

    /* We end up here if we hit a BRK instruction. */
    case 0xc803:
        return 0;

    case 0xfa59:
        fprintf(stderr, "OLDBRK\n");
        return 0;

    case 0xfa62:
        fprintf(stderr, "RESET\n");
        return 0;

    case 0xfe89:
        fprintf(stderr, "SETKBD\n");
        return 0;

    case 0xfe93:
        fprintf(stderr, "SETVID\n");
        return 0;

    default:
        return 0;
    }
}