static int check_sequence(struct stream *s, unsigned int nr, uint8_t byte) { while (--nr) { stream_next_bits(s, 16); if ((uint8_t)mfm_decode_word(s->word) != byte) break; } return !nr; }
static void *speedball_write_raw( struct disk *d, unsigned int tracknr, struct stream *s) { struct track_info *ti = &d->di->track[tracknr]; while (stream_next_bit(s) != -1) { uint32_t dat[10000], track_len, csum; uint32_t idx_off = s->index_offset_bc - 31; unsigned int i; void *block; if (s->word != 0x44894489) continue; if (stream_next_bits(s, 32) == -1) goto fail; if (mfm_decode_word(s->word) != 0xfefe) continue; if (stream_next_bytes(s, dat, 3*8) == -1) goto fail; mfm_decode_bytes(bc_mfm_even_odd, 4, &dat[0], &dat[0]); if (be32toh(dat[0]) != ID_THBB) continue; mfm_decode_bytes(bc_mfm_even_odd, 4, &dat[2], &dat[2]); track_len = be32toh(dat[2]); if (track_len != 5952) /* track length is always 5952 */ continue; mfm_decode_bytes(bc_mfm_even_odd, 4, &dat[4], &dat[4]); csum = be32toh(dat[4]); if (stream_next_bytes(s, dat, track_len*2) == -1) goto fail; mfm_decode_bytes(bc_mfm_even_odd, track_len, dat, dat); for (i = 0; i < track_len / 4; i++) csum ^= be32toh(dat[i]); if (csum != 0) continue; ti->data_bitoff = idx_off; set_all_sectors_valid(ti); ti->bytes_per_sector = ti->len = track_len; block = memalloc(ti->len); memcpy(block, dat, ti->len); return block; } fail: return NULL; }
static void *firebird_write_raw( struct disk *d, unsigned int tracknr, struct stream *s) { struct track_info *ti = &d->di->track[tracknr]; uint16_t *block = memalloc(ti->len); while (stream_next_bit(s) != -1) { uint32_t idx_off = s->index_offset_bc - 31; uint8_t dat[2*(ti->len+2)]; if (s->word != 0x89448944) continue; stream_start_crc(s); if (stream_next_bits(s, 16) == -1) goto fail; if (s->word != 0x89448944) continue; if (ti->type == TRKTYP_firebird) { if (stream_next_bits(s, 16) == -1) goto fail; if (mfm_decode_word((uint16_t)s->word) != 0xff) continue; } else if (ti->type == TRKTYP_afterburner_data) { if (stream_next_bytes(s, dat, 6) == -1) goto fail; mfm_decode_bytes(bc_mfm, 3, dat, dat); if ((dat[0] != 0x41) || (dat[1] != 0x42) || (dat[2] != (tracknr/2))) continue; } if (stream_next_bytes(s, dat, sizeof(dat)) == -1) goto fail; if (s->crc16_ccitt != 0) continue; mfm_decode_bytes(bc_mfm, ti->len, dat, block); ti->data_bitoff = idx_off; if (ti->type == TRKTYP_ikplus) ti->data_bitoff -= 2*16; /* IK+ has a pre-sync header */ set_all_sectors_valid(ti); return block; } fail: free(block); return NULL; }
static void *interceptor_software_write_raw( struct disk *d, unsigned int tracknr, struct stream *s) { struct track_info *ti = &d->di->track[tracknr]; char *ablk; unsigned int i; init_track_info(ti, TRKTYP_amigados); ablk = handlers[TRKTYP_amigados]->write_raw(d, tracknr, s); if ((ablk == NULL) || (ti->type != TRKTYP_amigados)) goto fail; stream_reset(s); while (stream_next_bit(s) != -1) { /* Sync word 0xa144 precedes the AmigaDOS block by ~2000 bits. */ if ((uint16_t)s->word != 0xa144) continue; ti->data_bitoff = s->index_offset_bc - 15; /* Check for a decent-length zero sequence after the sync. */ for (i = 0; i < 32; i++) if ((stream_next_bits(s, 32) == -1) || mfm_decode_word(s->word)) break; if (i != 32) continue; /* Skip 104400 bits after the sync pattern. Check for 0xa145 * fill pattern, repeating. */ stream_next_bits(s, 104400-32*32); if (s->word != 0xa145a145) continue; init_track_info(ti, TRKTYP_interceptor_software); ti->total_bits = 105550; return ablk; } fail: memfree(ablk); return NULL; }