flex, img: Remove mutable variables from the class

This commit is contained in:
Olivier Galibert 2022-03-23 17:27:22 +01:00
parent 330162f523
commit 8b3c366a04
4 changed files with 33 additions and 34 deletions

View File

@ -110,8 +110,8 @@ int flex_format::find_size(util::random_read &io, uint32_t form_factor, const st
if (info.month < 1 || info.month > 12 || info.day < 1 || info.day > 31)
return -1;
boot0_sector_id = 1;
boot1_sector_id = 2;
uint8_t boot0_sector_id = 1;
// uint8_t boot1_sector_id = 2;
// This floppy format uses a strategy of looking for 6800 boot code to
// set the numbering of the first two sectors. If this is shown to not
@ -122,12 +122,13 @@ int flex_format::find_size(util::random_read &io, uint32_t form_factor, const st
// Found a 6800 stack load and branch, looks like a 6800 boot sector.
boot0_sector_id = 0;
// boot1 is not actually used (yet?)
// Look for a link to the next sector, normal usage.
if (boot1[0] != 0 || boot1[1] != 3)
{
// if (boot1[0] != 0 || boot1[1] != 3)
// {
// If not then assume it is a boot sector.
boot1_sector_id = 1;
}
// boot1_sector_id = 1;
// }
}
for (int i=0; formats[i].form_factor; i++) {

View File

@ -48,9 +48,6 @@ private:
static const format formats_head1[];
static const format formats_track0[];
static const format formats_head1_track0[];
uint8_t boot0_sector_id;
uint8_t boot1_sector_id;
};
extern const floppy_format_type FLOPPY_FLEX_FORMAT;

View File

@ -75,7 +75,8 @@ bool img_format::load(util::random_read &io, uint32_t form_factor, const std::ve
std::vector<uint32_t> track_data;
write_gap(track_data, 0 , PREIDX_GAP);
write_mmfm_byte(track_data , INDEX_AM , AM_CLOCK);
uint16_t crc = 0;
write_mmfm_byte(track_data , INDEX_AM , crc, AM_CLOCK);
// Compute interleave factor and skew for current track
unsigned il_factor;
@ -160,24 +161,24 @@ std::vector<uint8_t> img_format::interleaved_sectors(unsigned il_factor)
return out;
}
void img_format::write_mmfm_bit(std::vector<uint32_t> &buffer , bool data_bit , bool clock_bit)
void img_format::write_mmfm_bit(std::vector<uint32_t> &buffer , bool data_bit , bool clock_bit , uint16_t &crc)
{
bool had_transition = buffer.size() < 2 ? false : bit_r(buffer, buffer.size() - 1) || bit_r(buffer , buffer.size() - 2);
clock_bit = !data_bit && (clock_bit || !had_transition);
bit_w(buffer , clock_bit , CELL_SIZE);
bit_w(buffer , data_bit , CELL_SIZE);
if (util::BIT(m_crc , 15) ^ data_bit) {
m_crc = (m_crc << 1) ^ CRC_POLY;
if (util::BIT(crc , 15) ^ data_bit) {
crc = (crc << 1) ^ CRC_POLY;
} else {
m_crc <<= 1;
crc <<= 1;
}
}
void img_format::write_mmfm_byte(std::vector<uint32_t> &buffer , uint8_t data , uint8_t clock)
void img_format::write_mmfm_byte(std::vector<uint32_t> &buffer , uint8_t data , uint16_t &crc , uint8_t clock)
{
for (int i = 7; i >= 0; i--) {
write_mmfm_bit(buffer , util::BIT(data , i) , util::BIT(clock , i));
write_mmfm_bit(buffer , util::BIT(data , i) , util::BIT(clock , i) , crc);
}
}
@ -188,19 +189,21 @@ void img_format::write_sync(std::vector<uint32_t> &buffer)
void img_format::write_crc(std::vector<uint32_t> &buffer , uint16_t crc)
{
uint16_t xcrc = crc;
// Note that CRC is stored with MSB (x^15) first
for (unsigned i = 0; i < 16; i++) {
write_mmfm_bit(buffer , util::BIT(crc , 15 - i) , 0);
write_mmfm_bit(buffer , util::BIT(crc , 15 - i) , 0 , xcrc);
}
}
void img_format::write_gap(std::vector<uint32_t> &buffer , unsigned size_00 , unsigned size_ff)
{
uint16_t crc = 0;
for (unsigned i = 0; i < size_00; ++i) {
write_mmfm_byte(buffer, 0);
write_mmfm_byte(buffer, 0 , crc);
}
for (unsigned i = 0; i < size_ff; ++i) {
write_mmfm_byte(buffer, 0xff);
write_mmfm_byte(buffer, 0xff , crc);
}
}
@ -228,27 +231,27 @@ void img_format::write_sector(std::vector<uint32_t> &buffer , uint8_t track_no ,
// Gap1
write_sync(buffer);
// ID AM
m_crc = 0;
write_mmfm_byte(buffer , ID_AM , AM_CLOCK);
uint16_t crc = 0;
write_mmfm_byte(buffer , ID_AM , crc , AM_CLOCK);
// Track #
write_mmfm_byte(buffer , track_no);
write_mmfm_byte(buffer , 0);
write_mmfm_byte(buffer , track_no , crc);
write_mmfm_byte(buffer , 0 , crc);
// Sector #
write_mmfm_byte(buffer , sect_no);
write_mmfm_byte(buffer , 0);
write_mmfm_byte(buffer , sect_no , crc);
write_mmfm_byte(buffer , 0 , crc);
// ID CRC
write_crc(buffer , m_crc);
write_crc(buffer , crc);
// Gap 2
write_sync(buffer);
// Data AM
m_crc = 0;
write_mmfm_byte(buffer , DATA_AM , AM_CLOCK);
crc = 0;
write_mmfm_byte(buffer , DATA_AM , crc, AM_CLOCK);
for (unsigned i = 0; i < SECTOR_SIZE; i++) {
// Data
write_mmfm_byte(buffer , sect_data[ i ]);
write_mmfm_byte(buffer , sect_data[ i ] , crc);
}
// Data CRC
write_crc(buffer , m_crc);
write_crc(buffer , crc);
}
void img_format::fill_with_gap4(std::vector<uint32_t> &buffer)

View File

@ -36,11 +36,9 @@ public:
virtual bool supports_save() const override;
private:
uint16_t m_crc;
static std::vector<uint8_t> interleaved_sectors(unsigned il_factor);
void write_mmfm_bit(std::vector<uint32_t> &buffer , bool data_bit , bool clock_bit);
void write_mmfm_byte(std::vector<uint32_t> &buffer , uint8_t data , uint8_t clock = 0);
void write_mmfm_bit(std::vector<uint32_t> &buffer , bool data_bit , bool clock_bit , uint16_t &crc);
void write_mmfm_byte(std::vector<uint32_t> &buffer , uint8_t data , uint16_t &crc , uint8_t clock = 0);
void write_sync(std::vector<uint32_t> &buffer);
void write_crc(std::vector<uint32_t> &buffer , uint16_t crc);
void write_gap(std::vector<uint32_t> &buffer , unsigned size_00 , unsigned size_ff);