1/* 2** Copyright 2003, Axel D��rfler, axeld@pinc-software.de. All rights reserved. 3** Distributed under the terms of the MIT License. 4*/ 5#ifndef AMIGA_RDB_H 6#define AMIGA_RDB_H 7 8 9#include "SupportDefs.h" 10#include "ByteOrder.h" 11 12 13struct rigid_disk_block { 14 uint32 id; 15 uint32 summed_longs; 16 int32 check_sum; 17 uint32 host_id; 18 uint32 block_size; 19 uint32 flags; 20 21 /* block list heads */ 22 23 uint32 bad_block_list; 24 uint32 partition_list; 25 uint32 fs_header_list; 26 uint32 drive_init; 27 28 uint32 __reserved1[6]; 29 30 /* physical drive characteristics */ 31 32 uint32 cylinders; 33 uint32 sectors; 34 uint32 heads; 35 uint32 interleave; 36 uint32 park; 37 uint32 __reserved2[3]; 38 uint32 write_precompensation; 39 uint32 reduced_write; 40 uint32 step_rate; 41 uint32 __reserved3[5]; 42 43 /* logical drive characteristics */ 44 45 uint32 rdb_blocks_low; 46 uint32 rdb_blocks_high; 47 uint32 low_cylinder; 48 uint32 high_cylinder; 49 uint32 cylinder_blocks; 50 uint32 auto_park_seconds; 51 52 uint32 __reserved4[2]; 53 54 /* drive identification */ 55 56 char disk_vendor[8]; 57 char disk_product[16]; 58 char disk_revision[4]; 59 char controller_vendor[8]; 60 char controller_product[16]; 61 char controller_revision[4]; 62 63 uint32 __reserved5[10]; 64 65 uint32 ID() const { return B_BENDIAN_TO_HOST_INT32(id); } 66 uint32 SummedLongs() const { return B_BENDIAN_TO_HOST_INT32(summed_longs); } 67 uint32 BlockSize() const { return B_BENDIAN_TO_HOST_INT32(block_size); } 68 uint32 FirstPartition() const { return B_BENDIAN_TO_HOST_INT32(partition_list); } 69}; 70 71#define RDB_DISK_ID 'RDSK' 72 73#define RDB_LOCATION_LIMIT 16 74 75enum rdb_flags { 76 RDB_LAST = 0x01, 77 RDB_LAST_LUN = 0x02, 78 RDB_LAST_TID = 0x04, 79 RDB_NO_RESELECT = 0x08, 80 RDB_HAS_DISK_ID = 0x10, 81 RDB_HAS_CONTROLLER_ID = 0x20, 82 RDB_SUPPORTS_SYNCHRONOUS = 0x40, 83}; 84 85 86/************* bad blocks *************/ 87 88struct bad_block_entry { 89}; 90 91struct bad_block_block { 92}; 93 94#define RDB_BAD_BLOCK_ID 'BADB' 95 96 97/************* partition block *************/ 98 99struct partition_block { 100 uint32 id; 101 uint32 summed_longs; 102 int32 check_sum; 103 uint32 host_id; 104 uint32 next; 105 uint32 flags; 106 uint32 __reserved1[2]; 107 uint32 open_device_flags; 108 uint8 drive_name[32]; // BSTR form (Pascal like string) 109 110 uint32 __reserved2[15]; 111 uint32 environment[17]; 112 uint32 __reserved3[15]; 113 114 uint32 ID() const { return B_BENDIAN_TO_HOST_INT32(id); } 115 uint32 SummedLongs() const { return B_BENDIAN_TO_HOST_INT32(summed_longs); } 116 uint32 Next() const { return B_BENDIAN_TO_HOST_INT32(next); } 117}; 118 119#define RDB_PARTITION_ID 'PART' 120 121enum rdb_partition_flags { 122 RDB_PARTITION_BOOTABLE = 0x01, 123 RDB_PARTITION_NO_MOUNT = 0x02, 124}; 125 126 127/************* disk environment *************/ 128 129struct disk_environment { 130 uint32 table_size; // size of this environment 131 uint32 long_block_size; // block size in longs (128 == 512 byte) 132 uint32 sec_org; // always 0 133 uint32 surfaces; 134 uint32 sectors_per_block; 135 uint32 blocks_per_track; 136 uint32 reserved_blocks_at_start; 137 uint32 reserved_blocks_at_end; 138 uint32 interleave; 139 uint32 first_cylinder; 140 uint32 last_cylinder; 141 uint32 num_buffers; 142 uint32 buffer_mem_type; 143 uint32 max_transfer; 144 uint32 dma_mask; 145 int32 boot_priority; 146 uint32 dos_type; 147 uint32 baud_rate; 148 uint32 control; 149 uint32 boot_blocks; 150 151 uint32 FirstCylinder() const { return B_BENDIAN_TO_HOST_INT32(first_cylinder); } 152 uint32 LastCylinder() const { return B_BENDIAN_TO_HOST_INT32(last_cylinder); } 153 uint32 Surfaces() const { return B_BENDIAN_TO_HOST_INT32(surfaces); } 154 uint32 BlocksPerTrack() const { return B_BENDIAN_TO_HOST_INT32(blocks_per_track); } 155 uint32 LongBlockSize() const { return B_BENDIAN_TO_HOST_INT32(long_block_size); } 156 uint32 BlockSize() const { return LongBlockSize() << 2; } 157 158 uint64 Start() 159 { 160 return uint64(FirstCylinder()) * BlocksPerTrack() * Surfaces() * BlockSize(); 161 } 162 163 uint64 Size() 164 { 165 return uint64(LastCylinder() + 1 - FirstCylinder()) * BlocksPerTrack() * Surfaces() 166 * BlockSize(); 167 } 168}; 169 170 171/************* file system header block *************/ 172 173struct fs_header_block { 174}; 175 176#define RDB_FS_HEADER_ID 'FSHD' 177 178struct load_seg_block { 179}; 180 181#define RDB_LOAD_SEG_ID 'LSEG' 182 183#endif /* AMIGA_RDB_H */ 184 185