66#define SONY_BLOCK_NUMBER_MASK 0x07FFU
67#define SONY_BLOCK_VALID_FLAG 0x8000U
68#define SONY_BLOCK_ALLOWED_MASK (SONY_BLOCK_VALID_FLAG | SONY_BLOCK_NUMBER_MASK)
86 tag.
version = (uint16_t)(bytes[0] << 8 | bytes[1]);
87 tag.
kind = (bytes[2] & 0xC0) >> 6;
90 tag.
file_id = (int16_t)(bytes[4] << 8 | bytes[5]);
91 tag.
rel_page = (uint16_t)(bytes[6] << 8 | bytes[7]);
92 const uint16_t next_raw = (uint16_t)((uint16_t)bytes[8] << 8 | bytes[9]);
93 const uint16_t prev_raw = (uint16_t)((uint16_t)bytes[10] << 8 | bytes[11]);
116 tag.
version = (uint16_t)(bytes[0] << 8 | bytes[1]);
117 tag.
kind = (bytes[2] & 0xC0) >> 6;
120 tag.
file_id = (int16_t)(bytes[4] << 8 | bytes[5]);
121 tag.
used_bytes = (uint16_t)((bytes[6] & 0x7F) << 8 | bytes[7]);
123 tag.
abs_page = (uint32_t)(bytes[8] << 16 | bytes[9] << 8 | bytes[10]);
125 tag.
rel_page = (uint16_t)(bytes[12] << 8 | bytes[13]);
126 tag.
next_block = (uint32_t)(bytes[14] << 16 | bytes[15] << 8 | bytes[16]);
127 tag.
prev_block = (uint32_t)(bytes[17] << 16 | bytes[18] << 8 | bytes[19]);
128 tag.
disk_size = (uint32_t)(bytes[20] << 24 | bytes[21] << 16 | bytes[22] << 8 | bytes[23]);
146 tag.
version = (uint16_t)(bytes[0] << 8 | bytes[1]);
147 tag.
kind = (bytes[2] & 0xC0) >> 6;
150 tag.
file_id = (int16_t)(bytes[4] << 8 | bytes[5]);
151 tag.
used_bytes = (uint16_t)((bytes[6] & 0x7F) << 8 | bytes[7]);
153 tag.
abs_page = (uint32_t)(bytes[8] << 16 | bytes[9] << 8 | bytes[10]);
155 tag.
rel_page = (uint16_t)(bytes[12] << 8 | bytes[13]);
156 tag.
next_block = (uint32_t)(bytes[14] << 16 | bytes[15] << 8 | bytes[16]);
157 tag.
prev_block = (uint32_t)(bytes[17] << 16 | bytes[18] << 8 | bytes[19]);
261 const uint32_t next_number = tag.
next_block & 0xFFFFFFU;
262 const uint32_t prev_number = tag.
prev_block & 0xFFFFFFU;
295 const uint32_t next_number = tag.
next_block & 0xFFFFFFU;
296 const uint32_t prev_number = tag.
prev_block & 0xFFFFFFU;
359 uint8_t *bytes = calloc(1, 20);
360 if(!bytes)
return NULL;
362 const uint16_t version = tag.
version;
363 const uint8_t volume = tag.
volume;
364 const int16_t file_id = tag.
file_id;
365 const uint16_t rel_page = tag.
rel_page;
366 const uint32_t abs_page = tag.
abs_page & 0xFFFFFFU;
367 const uint32_t next_block = tag.
next_block & 0xFFFFFFU;
368 const uint32_t prev_block = tag.
prev_block & 0xFFFFFFU;
369 const uint16_t used_bytes = (uint16_t)(tag.
used_bytes & 0x7FFFU);
370 const uint8_t kind_bits = (uint8_t)(tag.
kind & 0x3U);
371 const uint8_t reserved = (uint8_t)(tag.
reserved & 0x3FU);
373 bytes[0] = (uint8_t)((version >> 8) & 0xFF);
374 bytes[1] = (uint8_t)(version & 0xFF);
375 bytes[2] = (uint8_t)((kind_bits << 6) | reserved);
377 bytes[4] = (uint8_t)((file_id >> 8) & 0xFF);
378 bytes[5] = (uint8_t)(file_id & 0xFF);
379 bytes[6] = (uint8_t)((used_bytes >> 8) & 0x7F);
381 bytes[7] = (uint8_t)(used_bytes & 0xFF);
382 bytes[8] = (uint8_t)((abs_page >> 16) & 0xFF);
383 bytes[9] = (uint8_t)((abs_page >> 8) & 0xFF);
384 bytes[10] = (uint8_t)(abs_page & 0xFF);
386 bytes[12] = (uint8_t)((rel_page >> 8) & 0xFF);
387 bytes[13] = (uint8_t)(rel_page & 0xFF);
388 bytes[14] = (uint8_t)((next_block >> 16) & 0xFF);
389 bytes[15] = (uint8_t)((next_block >> 8) & 0xFF);
390 bytes[16] = (uint8_t)(next_block & 0xFF);
391 bytes[17] = (uint8_t)((prev_block >> 16) & 0xFF);
392 bytes[18] = (uint8_t)((prev_block >> 8) & 0xFF);
393 bytes[19] = (uint8_t)(prev_block & 0xFF);
411 uint8_t *bytes = calloc(1, 24);
412 if(!bytes)
return NULL;
414 const uint16_t version = tag.
version;
415 const uint8_t volume = tag.
volume;
416 const int16_t file_id = tag.
file_id;
417 const uint16_t rel_page = tag.
rel_page;
418 const uint32_t abs_page = tag.
abs_page & 0xFFFFFFU;
419 const uint32_t next_block = tag.
next_block & 0xFFFFFFU;
420 const uint32_t prev_block = tag.
prev_block & 0xFFFFFFU;
421 const uint32_t disk_size = tag.
disk_size;
422 const uint16_t used_bytes = (uint16_t)(tag.
used_bytes & 0x7FFFU);
423 const uint8_t kind_bits = (uint8_t)(tag.
kind & 0x3U);
424 const uint8_t reserved = (uint8_t)(tag.
reserved & 0x3FU);
426 bytes[0] = (uint8_t)((version >> 8) & 0xFF);
427 bytes[1] = (uint8_t)(version & 0xFF);
428 bytes[2] = (uint8_t)((kind_bits << 6) | reserved);
430 bytes[4] = (uint8_t)((file_id >> 8) & 0xFF);
431 bytes[5] = (uint8_t)(file_id & 0xFF);
432 bytes[6] = (uint8_t)((used_bytes >> 8) & 0x7F);
434 bytes[7] = (uint8_t)(used_bytes & 0xFF);
435 bytes[8] = (uint8_t)((abs_page >> 16) & 0xFF);
436 bytes[9] = (uint8_t)((abs_page >> 8) & 0xFF);
437 bytes[10] = (uint8_t)(abs_page & 0xFF);
439 bytes[12] = (uint8_t)((rel_page >> 8) & 0xFF);
440 bytes[13] = (uint8_t)(rel_page & 0xFF);
441 bytes[14] = (uint8_t)((next_block >> 16) & 0xFF);
442 bytes[15] = (uint8_t)((next_block >> 8) & 0xFF);
443 bytes[16] = (uint8_t)(next_block & 0xFF);
444 bytes[17] = (uint8_t)((prev_block >> 16) & 0xFF);
445 bytes[18] = (uint8_t)((prev_block >> 8) & 0xFF);
446 bytes[19] = (uint8_t)(prev_block & 0xFF);
447 bytes[20] = (uint8_t)((disk_size >> 24) & 0xFF);
448 bytes[21] = (uint8_t)((disk_size >> 16) & 0xFF);
449 bytes[22] = (uint8_t)((disk_size >> 8) & 0xFF);
450 bytes[23] = (uint8_t)(disk_size & 0xFF);
468 uint8_t *bytes = calloc(1, 12);
469 if(!bytes)
return NULL;
471 const uint16_t version = tag.
version;
472 const uint8_t volume = tag.
volume;
473 const int16_t file_id = tag.
file_id;
474 const uint16_t rel_page = tag.
rel_page;
477 const uint8_t kind_bits = (uint8_t)(tag.
kind & 0x3U);
478 const uint8_t reserved = (uint8_t)(tag.
reserved & 0x3FU);
480 bytes[0] = (uint8_t)((version >> 8) & 0xFF);
481 bytes[1] = (uint8_t)(version & 0xFF);
482 bytes[2] = (uint8_t)((kind_bits << 6) | reserved);
484 bytes[4] = (uint8_t)((file_id >> 8) & 0xFF);
485 bytes[5] = (uint8_t)(file_id & 0xFF);
486 bytes[6] = (uint8_t)((rel_page >> 8) & 0xFF);
487 bytes[7] = (uint8_t)(rel_page & 0xFF);
488 bytes[8] = (uint8_t)((next_block >> 8) & 0xFF);
489 bytes[9] = (uint8_t)(next_block & 0xFF);
490 bytes[10] = (uint8_t)((prev_block >> 8) & 0xFF);
491 bytes[11] = (uint8_t)(prev_block & 0xFF);
priam_tag bytes_to_priam_tag(const uint8_t *bytes)
Parse a 24-byte Priam tag record into a priam_tag structure.
priam_tag sony_tag_to_priam(const sony_tag tag)
Convert a sony_tag to a priam_tag representation.
uint8_t * profile_tag_to_bytes(const profile_tag tag)
Serialize a profile_tag into a newly allocated 20-byte big-endian on-disk representation.
uint8_t * sony_tag_to_bytes(sony_tag tag)
Serialize a sony_tag into a newly allocated 12-byte big-endian on-disk representation.
profile_tag priam_tag_to_profile(const priam_tag tag)
Convert a priam_tag to a profile_tag.
#define SONY_BLOCK_ALLOWED_MASK
Preserve valid bit + 11-bit index.
profile_tag sony_tag_to_profile(const sony_tag tag)
Convert a sony_tag to a profile_tag representation.
sony_tag priam_tag_to_sony(const priam_tag tag)
Convert a priam_tag to a sony_tag.
sony_tag bytes_to_sony_tag(const uint8_t *bytes)
Parse a 12-byte Sony tag record into a sony_tag structure.
priam_tag profile_tag_to_priam(const profile_tag tag)
Convert a profile_tag to a priam_tag.
profile_tag bytes_to_profile_tag(const uint8_t *bytes)
Parse a 20-byte Profile tag record into a profile_tag structure.
sony_tag profile_tag_to_sony(const profile_tag tag)
Convert a profile_tag to a sony_tag.
uint8_t * priam_tag_to_bytes(const priam_tag tag)
Serialize a priam_tag into a newly allocated 24-byte big-endian on-disk representation.
#define SONY_BLOCK_NUMBER_MASK
Structure definitions and conversion/serialization function declarations for Lisa family disk tags.
uint8_t reserved
0x02 bits 5 to 0, reserved
int16_t file_id
0x04, file ID
uint32_t next_block
0x0E, 3 bytes, next block, 0xFFFFFF if it's last block
uint32_t prev_block
0x11, 3 bytes, previous block, 0xFFFFFF if it's first block
uint32_t disk_size
0x14, disk size
uint8_t checksum
0x0B, checksum of data
uint32_t abs_page
0x08, 3 bytes, absolute page number
uint8_t valid_chk
0x06 bit 7, checksum valid?
uint8_t kind
0x02 bits 7 to 6, kind of info in this block
uint16_t used_bytes
0x06 bits 6 to 0, used bytes in block
uint8_t volume
0x03, disk volume number
uint16_t version
0x00, Lisa OS version number
uint16_t rel_page
0x0C, relative page number
uint8_t checksum
0x0B, checksum of data
uint16_t rel_page
0x0C, relative page number
uint16_t used_bytes
0x06 bits 6 to 0, used bytes in block
uint8_t valid_chk
0x06 bit 7, checksum valid?
uint32_t abs_page
0x08, 3 bytes, absolute page number
uint8_t reserved
0x02 bits 5 to 0, reserved
uint32_t next_block
0x0E, 3 bytes, next block, 0xFFFFFF if it's last block
uint8_t volume
0x03, disk volume number
uint8_t kind
0x02 bits 7 to 6, kind of info in this block
int16_t file_id
0x04, file ID
uint16_t version
0x00, Lisa OS version number
uint32_t prev_block
0x11, 3 bytes, previous block, 0xFFFFFF if it's first block
uint8_t volume
0x03, disk volume number
int16_t file_id
0x04, file ID
uint16_t version
0x00, Lisa OS version number
uint16_t rel_page
0x06, relative page number
uint16_t next_block
0x08, next block, 0x7FF if it's last block, 0x8000 set if block is valid
uint8_t reserved
0x02 bits 5 to 0, reserved
uint8_t kind
0x02 bits 7 to 6, kind of info in this block
uint16_t prev_block
0x0A, previous block, 0x7FF if it's first block