diff --git a/README.md b/README.md index aadeb3d..b2dee91 100644 --- a/README.md +++ b/README.md @@ -224,6 +224,7 @@ Everything will immediately show up in ImHex's Content Store and gets bundled wi | ZSTD | `application/zstd` | [`patterns/zstd.hexpat`](patterns/zstd.hexpat) | Zstandard compressed data format | | MOD | `3d-model/mod` | [`patterns/DMC3HD-Mod.hexpat`](patterns/dmc3_hd_mod.hexpat) | 3D Model files used in Devil May Cry 3 HD Collection | | CBM BASIC | | [`commodore_basic.hexpat`](patterns/commodore_basic.hexpat) | Commodore BASIC | +| Atari XEX | | [`xex.hexpat`](patterns/xex.hexpat) | Atari 8-bit binary format | | Terminfo | `application/x-terminfo` and `application/x-terminfo2` | [`patterns/terminfo.hexpat`](patterns/terminfo.hexpat) | Compiled *(legacy and extended)* term info entry | ### Scripts diff --git a/patterns/xex.hexpat b/patterns/xex.hexpat new file mode 100644 index 0000000..6d6ed8a --- /dev/null +++ b/patterns/xex.hexpat @@ -0,0 +1,34 @@ +#pragma author Adiee5 +#pragma description Atari 8-bit binary format (.xex) +#pragma endian little +#pragma magic [ FF FF ] @ 0 + +import std.mem; +import std.io; + +u16 header @ 0; + +if (header != 0xFFFF) + std::error("Not a valid XEX file"); + +fn hex_dec_addr(u16 num){ + return std::format("0x{:04X} ({})", num, num); +}; + +struct block { + u16 start [[comment("Address of the first byte"), format("hex_dec_addr")]]; + if (start == 0xFFFF) continue; //an unnecessary header to be ignored + u16 end [[comment("Address of the last byte"), format("hex_dec_addr")]]; + + // since 1 and 2 byte blocks sometimes have special meanings, + // we make them regural variables instead of byte arrays, + // so that reading their values from the GUI is easier + match (end-start){ + (0): u8 data; + (1): u16 data [[format("hex_dec_addr")]]; + (_): u8 data[end-start+1]; + } + +}; + +block data_blocks[while(!std::mem::eof())] @ 2 [[name("Data Blocks")]]; \ No newline at end of file diff --git a/tests/patterns/test_data/xex.hexpat.xex b/tests/patterns/test_data/xex.hexpat.xex new file mode 100644 index 0000000..41c2aad Binary files /dev/null and b/tests/patterns/test_data/xex.hexpat.xex differ