1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
use crate::cfg::DiscConfig;
use crate::edsk::{ExtendedDsk, Head};
pub fn build_disc_from_cfg(cfg: &DiscConfig) -> ExtendedDsk {
let mut edsk = ExtendedDsk::default();
edsk.disc_information_bloc.creator_name = "RUST CPC - BND".to_string();
assert_eq!(edsk.disc_information_bloc.creator_name.len(), 14);
edsk.disc_information_bloc.number_of_heads = cfg.nb_heads;
edsk.disc_information_bloc.number_of_tracks = cfg.nb_tracks;
edsk.disc_information_bloc.track_size_table = cfg
.track_idx_iterator()
.map(|idx| {
let info = cfg
.track_information_for_track(*idx.0, idx.1)
.unwrap_or_else(|| panic!("Unable to acquire information for track {:?}", idx));
let sectors_size = info.sector_size as usize * info.number_of_sectors();
let header_size = 256;
((sectors_size + header_size) / 256) as u8
})
.collect::<Vec<_>>();
for (head, track_idx) in cfg.track_idx_iterator() {
let mut track = edsk.track_list.add_empty_track();
track.track_number = track_idx;
track.head_number = match *head {
Head::A | Head::Unspecified => Head::A,
Head::B => Head::B,
}
.into();
track.track_size =
u16::from(edsk.disc_information_bloc.track_size_table[track_idx as usize]) * 256 + 512;
}
for (&head, track_idx) in cfg.track_idx_iterator() {
let track_info = edsk
.get_track_information_mut(head, track_idx)
.unwrap_or_else(|| {
panic!(
"Unable to acquire track {} on head {:?} on the dsk",
track_idx, head
)
});
let track_model = cfg.track_information_for_track(head, track_idx).unwrap();
track_info.track_number = track_idx;
track_info.head_number = track_model.head.into();
track_info.data_rate = 1.into();
track_info.recording_mode = 2.into();
track_info.sector_size = track_model.sector_size_dsk_format();
track_info.number_of_sectors = track_model.sector_id.len() as _;
track_info.gap3_length = track_model.gap3;
track_info.filler_byte = 0xe5;
track_info.sector_information_list.fill_with(
&track_model.sector_id,
&track_model.sector_id_head,
track_idx,
track_model.sector_size_dsk_format(),
track_info.filler_byte,
)
}
edsk
}
#[allow(missing_docs)]
impl From<DiscConfig> for ExtendedDsk {
fn from(config: DiscConfig) -> Self {
build_disc_from_cfg(&config)
}
}
#[allow(missing_docs)]
impl From<&DiscConfig> for ExtendedDsk {
fn from(config: &DiscConfig) -> Self {
build_disc_from_cfg(config)
}
}
pub fn single_head_data_dsk() -> ExtendedDsk {
DiscConfig::single_head_data_format().into()
}
pub fn single_head_data42_dsk() -> ExtendedDsk {
DiscConfig::single_head_data42_format().into()
}