| 165 | } |
| 166 | |
| 167 | DiskLayout::DiskLayout(const ConfigProto& config) |
| 168 | { |
| 169 | minPhysicalCylinder = minPhysicalHead = UINT_MAX; |
| 170 | maxPhysicalCylinder = maxPhysicalHead = 0; |
| 171 | |
| 172 | numLogicalCylinders = config.layout().tracks(); |
| 173 | numLogicalHeads = config.layout().sides(); |
| 174 | |
| 175 | groupSize = getTrackStep(config); |
| 176 | headBias = config.drive().head_bias(); |
| 177 | swapSides = config.layout().swap_sides(); |
| 178 | |
| 179 | switch (config.drive().drive_type()) |
| 180 | { |
| 181 | case DRIVETYPE_APPLE2: |
| 182 | headWidth = 4; |
| 183 | break; |
| 184 | |
| 185 | default: |
| 186 | headWidth = 1; |
| 187 | break; |
| 188 | } |
| 189 | |
| 190 | for (unsigned logicalCylinder = 0; logicalCylinder < numLogicalCylinders; |
| 191 | logicalCylinder++) |
| 192 | for (unsigned logicalHead = 0; logicalHead < numLogicalHeads; |
| 193 | logicalHead++) |
| 194 | { |
| 195 | auto ltl = std::make_shared<LogicalTrackLayout>(); |
| 196 | CylinderHead ch(logicalCylinder, logicalHead); |
| 197 | layoutByLogicalLocation[ch] = ltl; |
| 198 | logicalLocations.push_back(ch); |
| 199 | |
| 200 | ltl->logicalCylinder = logicalCylinder; |
| 201 | ltl->logicalHead = logicalHead; |
| 202 | ltl->groupSize = groupSize; |
| 203 | ltl->physicalCylinder = |
| 204 | remapCylinderLogicalToPhysical(logicalCylinder); |
| 205 | ltl->physicalHead = remapHeadLogicalToPhysical(logicalHead); |
| 206 | |
| 207 | minPhysicalCylinder = |
| 208 | std::min(minPhysicalCylinder, ltl->physicalCylinder); |
| 209 | maxPhysicalCylinder = std::max(maxPhysicalCylinder, |
| 210 | ltl->physicalCylinder + ltl->groupSize - 1); |
| 211 | minPhysicalHead = std::min(minPhysicalHead, ltl->physicalHead); |
| 212 | maxPhysicalHead = std::max(maxPhysicalHead, ltl->physicalHead); |
| 213 | |
| 214 | auto layoutdata = |
| 215 | getLayoutData(logicalCylinder, logicalHead, config); |
| 216 | ltl->sectorSize = layoutdata.sector_size(); |
| 217 | ltl->diskSectorOrder = expandSectorList(layoutdata.physical()); |
| 218 | ltl->naturalSectorOrder = ltl->diskSectorOrder; |
| 219 | std::sort( |
| 220 | ltl->naturalSectorOrder.begin(), ltl->naturalSectorOrder.end()); |
| 221 | ltl->numSectors = ltl->naturalSectorOrder.size(); |
| 222 | |
| 223 | if (layoutdata.has_filesystem()) |
| 224 | { |
nothing calls this directly
no test coverage detected