2025-04-04 14:43:59 +02:00

78 lines
2.2 KiB
C

#ifndef __UMDIFF_H
#define __UMDIFF_H
/**
* @file umdiff.h
* @author Karim Vergnes <me@thesola.io>
* @copyright GPLv2
* @brief Definitions for UMDiff file format
*
* This file contains all required types to read and parse a UMDiff file.
*/
#define UMDIFF_VERSION 0x00
/**
* @brief Index of commands at 1024 sector interval.
*
* This list contains the offset of the first command for every 1024 sector
* block.
*
* The value represents an offset to read the file from, in the command list.
* If a command exists across a 1024-sector boundary, the offset shall point
* to the start of that command.
*
* Pointers spanning past the end of the disc are undefined and shall not be
* used.
*/
typedef long lp_UMDiffIndex[2048];
typedef struct
__attribute__((packed)) {
char magic[7]; /* = 0x7f 'UMDiff' */
char version;
long cmd_len;
long data_start;
lp_UMDiffIndex index;
} lp_UMDiffHeader;
/**
* @brief Definition for a single patch command.
*
* This is the format for a unit 'patch command'. A patch command is comprised
* of five parameters:
*
* - <tt>sector_start</tt>: Where on the original disc the patch command takes
* effect, in sectors.
* - <tt>sector_count</tt>: How many sectors on the original disc the patch
* command spans.
* - <tt>patch_start</tt>: Where in the patch source the substitute data is
* found, in sectors.
* - <tt>patch_sector_count</tt>: How many sectors on the patch source the
* substitute data occupies. If smaller than <tt>sector_count</tt>, then
* the substitute is a repeating pattern of that length.
* - <tt>data_source</tt>: 1 if the substitute data is on the original disc,
* 0 if it is in the UMDiff file's data area.
*/
typedef struct {
long sector_start;
long sector_count;
long patch_start;
long patch_sector_count; /* if < sector_count, repeat */
long data_source; /* 0 = patchfile, 1 = source */
} lp_UMDiffCommand;
// Commands shall start immediately after the full header
#define UMDIFF_COMMANDS_START (sizeof lp_UMDiffHeader)
typedef struct {
lp_UMDiffHeader *hdr;
lp_UMDiffCommand *commands;
} lp_UMDiffFile;
#endif //__UMDIFF_H
// vim: ft=c.doxygen