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; }
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"); }
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; } }