Added configurable block-size support
[SCSI2SD.git] / software / SCSI2SD / src / geometry.h
1 //      Copyright (C) 2013 Michael McMaster <michael@codesrc.com>
2 //
3 //      This file is part of SCSI2SD.
4 //
5 //      SCSI2SD is free software: you can redistribute it and/or modify
6 //      it under the terms of the GNU General Public License as published by
7 //      the Free Software Foundation, either version 3 of the License, or
8 //      (at your option) any later version.
9 //
10 //      SCSI2SD is distributed in the hope that it will be useful,
11 //      but WITHOUT ANY WARRANTY; without even the implied warranty of
12 //      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 //      GNU General Public License for more details.
14 //
15 //      You should have received a copy of the GNU General Public License
16 //      along with SCSI2SD.  If not, see <http://www.gnu.org/licenses/>.
17 #ifndef GEOMETRY_H
18 #define GEOMETRY_H
19
20 #include "device.h"
21
22 #include "config.h"
23 #include "sd.h"
24
25 // Max allowed by legacy IBM-PC Bios (6 bits)
26 #define SCSI_SECTORS_PER_TRACK 63
27
28 // MS-DOS up to 7.10 will crash on 256 heads.
29 #define SCSI_HEADS_PER_CYLINDER 255
30
31 typedef enum
32 {
33         ADDRESS_BLOCK = 0,
34         ADDRESS_PHYSICAL_BYTE = 4,
35         ADDRESS_PHYSICAL_SECTOR = 5
36 } SCSI_ADDRESS_FORMAT;
37
38 static inline int SDSectorsPerSCSISector()
39 {
40         return (config->bytesPerSector + SD_SECTOR_SIZE - 1) / SD_SECTOR_SIZE;
41 }
42
43 uint32_t getScsiCapacity();
44
45 uint32_t SCSISector2SD(uint32_t scsiSector);
46
47 uint64 CHS2LBA(uint32 c, uint8 h, uint32 s);
48 void LBA2CHS(uint32 lba, uint32* c, uint8* h, uint32* s);
49
50 // Convert an address in the given SCSI_ADDRESS_FORMAT to
51 // a linear byte address.
52 // addr must be >= 8 bytes.
53 uint64 scsiByteAddress(int format, const uint8* addr);
54 void scsiSaveByteAddress(int format, uint64 byteAddr, uint8* buf);
55
56
57 #endif