xref: /haiku/src/add-ons/kernel/partitioning_systems/atari/atari.h (revision c90684742e7361651849be4116d0e5de3a817194)
1 /*
2 ** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved.
3 ** Distributed under the terms of the OpenBeOS License.
4 */
5 #ifndef ATARI_PARTITION_H
6 #define ATARI_PARTITION_H
7 
8 /*
9  * An extented partition scheme exists, (several actually), cf.
10  * http://people.debian.org/~smarenka/d-i/atari-fdisk-README
11  * boot sector stuff:
12  * http://leonard.oxg.free.fr/articles/multi_atari/multi_atari.html
13  */
14 
15 #include "SupportDefs.h"
16 #include "ByteOrder.h"
17 
18 /* this one is BIG endian */
19 struct atari_partition_entry {
20 #define ATARI_PART_EXISTS	0x01
21 #define ATARI_PART_BOOTABLE	0x80
22 	uint8	flags;
23 	/* some known types */
24 #define ATARI_PART_TYPE_GEM 'G', 'E', 'M'
25 #define ATARI_PART_TYPE_LNX 'L', 'N', 'X'
26 #define ATARI_PART_TYPE_OS9 'O', 'S', '9'
27 	/* the one we'll use */
28 #define ATARI_PART_TYPE_BFS 'B', 'F', 'S'
29 	char	id[3];
30 	uint32	start;
31 	uint32	size;
32 
33 	uint8 Flags() const { return flags; }
34 	uint32 Start() const { return B_BENDIAN_TO_HOST_INT32(start); }
35 	uint32 Size() const { return B_BENDIAN_TO_HOST_INT32(size); }
36 } _PACKED ;
37 
38 
39 /* this one is BIG endian */
40 struct atari_root_block {
41 	uint8	bootcode[0x1b6];
42 	uint16	cylinder_count;
43 	uint8	head_count;
44 	uint8	_reserved_1[1];
45 	uint16	reduced_write_current_cylinder;
46 	uint16	write_precomp_cynlinder;
47 	uint8	landing_zone;
48 	uint8	seek_rate_code;
49 	uint8	interleave_factor;
50 	uint8	sectors_per_track;
51 	uint32	maximum_partition_size; /* in sectors (in clusters) */
52 	struct atari_partition_entry	partitions[4];
53 	uint32	bad_sector_list_start;
54 	uint32	bad_sector_list_count;
55 #define ATARI_BOOTABLE_MAGIC	0x1234
56 	uint16	checksum; /* checksum? 0x1234 for bootable */
57 
58 	uint32 MaxPartitionSize() const { return B_BENDIAN_TO_HOST_INT16(maximum_partition_size); }
59 	uint32 BadSectorsStart() const { return B_BENDIAN_TO_HOST_INT32(bad_sector_list_start); }
60 	uint32 BadSectorsCount() const { return B_BENDIAN_TO_HOST_INT32(bad_sector_list_count); }
61 	uint16 Checksum() const { return B_BENDIAN_TO_HOST_INT16(checksum); }
62 } _PACKED ;
63 
64 /************* bad blocks *************/
65 
66 struct bad_block_entry {
67 };
68 
69 struct bad_block_block {
70 };
71 
72 /************* partition block *************/
73 
74 /* this one is BIG endian, but with LITTLE endian fields! marked LE */
75 /* this is part of the filesystem... */
76 struct atari_boot_block {
77 	uint16	branch; /* branch code */
78 	char	volume_id[6];
79 	uint8	disk_id[3];
80 	uint16	bytes_per_sector;	/* LE */
81 	uint8	sectors_per_cluster;
82 	uint16	reserved_sectors;	/* LE */
83 	uint8	fat_count;
84 	uint16	entries_in_root_dir;	/* LE */
85 	uint16	sector_count;		/* LE */
86 	uint8	media_descriptor;
87 	uint16	sectors_per_fat;	/* LE */
88 	uint16	sectors_per_track;	/* LE */
89 	uint16	side_count;		/* LE */
90 	uint16	hidden_sector_count;	/* LE */
91 	/* boot code... */
92 	uint16	execflag;
93 	uint16	loadmode;
94 	uint16	first_sector;
95 	uint16	num_sectors;
96 	uint32	load_addr;
97 	uint32	fat_buffer;
98 #define ATARI_BB_FILENAME_SZ (0x003a - 0x002e)
99 	char	filename[ATARI_BB_FILENAME_SZ];
100 #define ATARI_BB_BOOTCODE_SZ (0x01fe - 0x003a)
101 	uint8	bootcode[ATARI_BB_BOOTCODE_SZ];
102 	uint16	checksum;	/* 0x1234 if bootable */
103 };
104 
105 
106 
107 #endif	/* ATARI_PARTITION_H */
108 
109