static void federation_of_free_traders_read_raw( struct disk *d, unsigned int tracknr, struct tbuf *tbuf) { struct track_info *ti = &d->di->track[tracknr]; uint8_t *dat = (uint8_t *)ti->dat; unsigned int i, j; for (i = 0; i < ti->nr_sectors; i++) { uint16_t csum = 0, w; /* header */ tbuf_bits(tbuf, SPEED_AVG, bc_raw, 32, 0x44894489); tbuf_bits(tbuf, SPEED_AVG, bc_mfm, 8, 0xff); tbuf_bits(tbuf, SPEED_AVG, bc_mfm, 8, tracknr^1); tbuf_bits(tbuf, SPEED_AVG, bc_mfm, 8, i); /* data */ w = i; /* preceding data byte, so first clock bit is correct */ for (j = 0; j < ti->bytes_per_sector; j++) { w = (w << 8) | dat[j]; csum ^= (uint16_t)mfm_encode_word(w); tbuf_bits(tbuf, SPEED_AVG, bc_mfm, 8, dat[j]); } /* csum */ if (!is_valid_sector(ti, i)) csum = ~csum; /* bad checksum for an invalid sector */ tbuf_bits(tbuf, SPEED_AVG, bc_mfm, 16, csum); /* gap */ for (j = 0; j < 13; j++) tbuf_bits(tbuf, SPEED_AVG, bc_mfm, 8, 0); dat += ti->bytes_per_sector; } }
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; }
/* Fonction du fichier drive.c * * Change la position de la tete de lecteur du disque */ int seek_sector(const unsigned int cylinder, const unsigned int sector){ if(!is_valid_cylinder(cylinder) || !is_valid_sector(sector)){ return 0; } /* On se position sur le disque dur */ _out(HDA_DATAREGS, (cylinder>>8 & 0xFF) ); _out(HDA_DATAREGS+1, (cylinder & 0xFF) ); _out(HDA_DATAREGS+2, (sector>>8 & 0xFF) ); _out(HDA_DATAREGS+3, (sector & 0xFF) ); _out(HDA_CMDREG, CMD_SEEK); _sleep(HDA_IRQ); return 1; }
static void psygnosis_b_read_raw( struct disk *d, unsigned int tracknr, struct tbuf *tbuf) { struct track_info *ti = &d->di->track[tracknr]; uint16_t *dat = (uint16_t *)ti->dat; unsigned int i, j; tbuf_bits(tbuf, SPEED_AVG, bc_raw, 16, 0x4489); tbuf_bits(tbuf, SPEED_AVG, bc_mfm, 16, 0xf000); for (i = 0; i < 6; i++) { uint16_t csum = 0; for (j = 0; j < 512; j++) csum += be16toh(dat[j]); if (!is_valid_sector(ti, i)) csum = ~csum; /* bad checksum for an invalid sector */ tbuf_bits(tbuf, SPEED_AVG, bc_mfm_even_odd, 16, csum); for (j = 0; j < 512; j++, dat++) tbuf_bits(tbuf, SPEED_AVG, bc_mfm_even_odd, 16, be16toh(*dat)); } }
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; }