static void *psygnosis_b_write_raw( struct disk *d, unsigned int tracknr, struct stream *s) { struct track_info *ti = &d->di->track[tracknr]; char *block = memalloc(ti->len); unsigned int j, k, nr_valid_blocks = 0; while ((stream_next_bit(s) != -1) && (nr_valid_blocks != ti->nr_sectors)) { uint16_t raw_dat[6*513]; uint32_t idx_off, new_valid = 0; if ((uint16_t)s->word != 0x4489) continue; idx_off = s->index_offset_bc - 15; if (stream_next_bits(s, 32) == -1) goto done; if (s->word != 0x552aaaaa) continue; for (j = 0; j < sizeof(raw_dat)/2; j++) { uint32_t dat; if (stream_next_bytes(s, &dat, 4) == -1) goto done; mfm_decode_bytes(bc_mfm_even_odd, 2, &dat, &raw_dat[j]); } for (j = 0; j < 6; j++) { uint16_t *sec = &raw_dat[j*513]; uint16_t csum = be16toh(*sec++), c = 0; for (k = 0; k < 512; k++) c += be16toh(sec[k]); if ((c == csum) && !is_valid_sector(ti, j)) { memcpy(&block[j*1024], sec, 1024); set_sector_valid(ti, j); nr_valid_blocks++; new_valid++; } } if (new_valid) ti->data_bitoff = idx_off; } done: if (nr_valid_blocks == 0) { free(block); return NULL; } return block; }
static struct container *adf_open(struct disk *d) { struct track_info *ti; struct disk_info *di; unsigned int i, j, k; char sig[8]; off_t sz; read_exact(d->fd, sig, sizeof(sig)); if (!strncmp(sig, "UAE-1ADF", sizeof(sig))) return container_eadf.open(d); sz = lseek(d->fd, 0, SEEK_END); if (sz != 160*512*11) { warnx("ADF file bad size: %lu bytes", (unsigned long)sz); return NULL; } lseek(d->fd, 0, SEEK_SET); adf_init(d); di = d->di; for (i = 0; i < di->nr_tracks; i++) { ti = &di->track[i]; read_exact(d->fd, ti->dat, ti->len); for (j = 0; j < ti->nr_sectors; j++) { unsigned char *p = ti->dat + j*ti->bytes_per_sector; for (k = 0; k < ti->bytes_per_sector/4; k++) if (memcmp(p+k*4, "NDOS", 4)) break; if (k != ti->bytes_per_sector/4) set_sector_valid(ti, j); } } return &container_adf; }
static void *federation_of_free_traders_write_raw( struct disk *d, unsigned int tracknr, struct stream *s) { struct track_info *ti = &d->di->track[tracknr]; uint8_t *block = memalloc(ti->len); unsigned int i, nr_valid_blocks = 0, least_block = ~0u; while ((stream_next_bit(s) != -1) && (nr_valid_blocks != ti->nr_sectors)) { uint32_t idx_off = s->index_offset_bc - 31; uint16_t csum; uint8_t sec, *p; if (s->word != 0x44894489) continue; if (stream_next_bits(s, 32) == -1) goto done; if (mfm_decode_bits(bc_mfm, s->word) != (0xff00 | (tracknr^1))) continue; if (stream_next_bits(s, 16) == -1) goto done; sec = mfm_decode_bits(bc_mfm, (uint16_t)s->word); if ((sec >= ti->nr_sectors) || is_valid_sector(ti, sec)) continue; p = &block[sec * ti->bytes_per_sector]; for (i = csum = 0; i < ti->bytes_per_sector; i++) { if (stream_next_bits(s, 16) == -1) goto done; csum ^= (uint16_t)s->word; p[i] = mfm_decode_bits(bc_mfm, (uint16_t)s->word); } if (stream_next_bits(s, 32) == -1) goto done; if (csum != mfm_decode_bits(bc_mfm, s->word)) continue; set_sector_valid(ti, sec); nr_valid_blocks++; if (least_block > sec) { ti->data_bitoff = idx_off; least_block = sec; } } done: if (nr_valid_blocks == 0) { free(block); return NULL; } for (i = 0; i < ti->nr_sectors; i++) if (is_valid_sector(ti, i)) break; ti->data_bitoff -= i * 0xfc8; return block; }