From ebe392fffbe0b1481a10d3c4167f693cbc88b3c7 Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Tue, 10 Nov 2026 13:40:13 +0100 Subject: [PATCH] fix: cite XM6 Pro-68k 260920 code for its ROMs Refs cited the changelog, readme, manual and XM6 2.06 source. They now name the loaders and DLL load sites in XM6.exe 260920. ROM30.DAT and the SCSI ROMs take the exact sizes the code checks, the X68030 boots on a stub without ROM30.DAT, and SRAM.DAT takes both sizes it writes. --- emulators/xm6pro68k.yml | 244 +++++++++++++++++++--------------------- 1 file changed, 115 insertions(+), 129 deletions(-) diff --git a/emulators/xm6pro68k.yml b/emulators/xm6pro68k.yml index a55a596a7..c9cafbf6c 100644 --- a/emulators/xm6pro68k.yml +++ b/emulators/xm6pro68k.yml @@ -7,7 +7,7 @@ version_source: url: "https://mijet.eludevisibility.org/XM6%20Pro-68k/Version.txt" pattern: '^(\d+)' based_on: "XM6 v2.06 by PI." -profiled_date: "2026-10-20" +profiled_date: "2026-11-10" core_version: "260920" version_basis: kind: package @@ -24,72 +24,63 @@ systems: - sharp-x68000 notes: | - Closed-source Windows fork of PI's XM6 v2.06 (README.txt:6) by M.I.J.E.T., - distributed only from mijet.eludevisibility.org as three 7-Zip packages: the - program, a mandatory DLL Package and an optional Web Package that adds signed - update downloads. Version.txt in the build analysed here reads 260920, and the - DLL Package it pairs with is version 260101. Release 81 (261031) reads the - same system files, its executable naming only the .IPS patch extension in - addition. The first - release, 120303, forked XM6 v2.05. XM6.exe is a 32-bit MFC application whose - import directory names mfc90u.dll and MSVCR90.dll, so the Visual C++ 2008 runtime - carried by the DLL Package, or the redistributable, must sit beside the executable - for the process to start. A second non-Unicode build lives in MBCS/ and needs the - same files duplicated there. ES-DE launches it through the XM6PRO68K and - XM6PRO68K-WINDOWS find rules with the working directory set to the emulator - folder, on Linux under Wine or Proton. RetroBat registers it as xm6pro - (Program.cs:189, Installer.cs:151), runs XM6.exe from its own directory and - rewrites XM6.ini before launch (Xm6pro.Generator.cs:22-79). + Closed-source Windows fork of PI's XM6 by M.I.J.E.T., distributed from + mijet.eludevisibility.org as three 7-Zip packages: the program, a mandatory DLL + Package and an optional Web Package. The build analysed here is the one RetroBat + serves as xm6pro.7z (sha256 2b44820429989fa2...), Version.txt 260920, with + XM6.exe sha256 df1ed921f5f00cfb54950f1672f659e3ceecc756016d0a76f3ccb5c1354a76ed + and MBCS/XM6.exe sha256 a4ac21e5fe15c865b931921068b03f5c8238dd992727ddc95b5f434f74a9a453. + Every address below is a virtual address in that Unicode XM6.exe. Release 81 + (261031, XM6.exe sha256 4eb66f0229ca992c...) names the same system files, its only + new file name being the .IPS disk delta extension. XM6.exe is a 32-bit MFC + application whose import directory names mfc90u.dll and MSVCR90.dll, both + loader-resolved, so the Visual C++ 2008 runtime carried by the DLL Package, or the + redistributable, must sit beside the executable for the process to start. A + second non-Unicode build lives in MBCS/ and needs the same files duplicated there. + ES-DE launches it through the XM6PRO68K and XM6PRO68K-WINDOWS find rules with the + working directory set to the emulator folder, on Linux under Wine or Proton. + RetroBat registers it as xm6pro (Program.cs:189, Installer.cs:151), runs XM6.exe + from its own directory and rewrites XM6.ini before launch + (Xm6pro.Generator.cs:22-79). - System files are resolved beside XM6.exe. XM6 v2.06 declares them in - Filepath::SystemFile[] (vm/filepath.cpp:394-405) and Filepath::SysFile - (vm/filepath.cpp:121-137) builds each path from SystemDir when one is set and from - the executable's own directory otherwise. XM6 Pro-68k references all ten names, - nine of them in one contiguous string block mirroring that table in reverse, and - exposes no ROM directory setting, while README.txt:71-73 requires the DLL Package - files to be extracted next to the executable rather than into a subdirectory. - Loading goes through Fileio::Load and - Fileio::Read (vm/fileio.cpp:35-51, 175-192), which succeed only when the file - holds at least the requested byte count, so every size below is a floor: a longer - file loads and its tail is ignored. The XM6 v2.06 sources cited throughout are - readable in mixerjdp/XM6_Libretro, which preserves the vm/ layer. + System files sit in a ten-entry pointer table at 0x57a898 (IPLROM.DAT, + IPLROMXV.DAT, IPLROMCO.DAT, IPLROM30.DAT, ROM30.DAT, CGROM.DAT, CGROM.TMP, + SCSIINROM.DAT, SCSIEXROM.DAT, SRAM.DAT). Filepath::SysFile at 0x48b054 copies the + entry and calls 0x48ac18, which takes drive and directory from the executable + path that 0x48ab44 caches from GetModuleFileNameW (0x48aac0), so every system + file is read beside XM6.exe and no directory setting takes part. + Fileio::Load (0x489a75) opens the file and Fileio::Read (0x489d8b) succeeds only + when _read returns the full count, so the IPL and CG sizes below are floors. The + SCSI ROM loader compares _filelengthi64 (0x489e54) with the expected size and + rejects any other length. - Machine selection follows ROM presence. Memory::Init (vm/memory.cpp:171-196) - loads the base SASI machine, then probes XVI, Compact and X68030 in that order and - keeps the first that succeeds. Memory::LoadROM (vm/memory.cpp:236-372) pairs each - machine with its ROMs: XVI and Compact need their IPL plus SCSIINROM.DAT, X68030 - needs IPLROM30.DAT plus ROM30.DAT read at 0x20000 bytes instead of 0x2000, and the - base machine needs no SCSI ROM. Internal SCSI is the interface built into the - X68000 SUPER and later models, external SCSI is the CZ-6BS1 add-on board - (Reference Manual.txt:1529-1536). - - Two files diverge from XM6 v2.06. The base IPL ROM is compiled into the - executable: "The program now includes an internal copy of the basic IPL ROM. It - will still try to load IPL ROMs externally first" (Change Log.txt:124-125), and - README.txt:23-25 tells users to leave IPLROM.DAT out because loading it only costs - startup time. The hard CG ROM requirement was dropped (Change Log.txt:128), so a - missing font ROM yields garbage glyphs instead of failing initialisation - (README.txt:278-281). + Memory::LoadROM (0x4903d7) takes the memory type stored by Memory::ApplyCfg + (0x4908af, 0x4908cb) from the saved configuration: 1 to 3 are the base X68000 with + no SCSI, internal SCSI or external SCSI, 4 XVI, 5 Compact and 6 X68030. It loads + the IPL ROM, the CG ROM (0x48e737, called at 0x490560) and the SCSI ROM (0x49016a, + called at 0x490570). Memory::Init loads type 1 at 0x4909f7 and fails only when that + load fails, which cannot happen since the base IPL is built in and neither the CG + ROM nor the SCSI slot is mandatory for type 1. A requested type that fails to + load falls back to type 1 (0x49063b, 0x490658-0x49066a). Two menu tools synthesise replacements. Synthesize replacement CG-ROM builds - CGROM.TMP from the installed MS Gothic and MS Mincho fonts and aborts when either - is absent, and README.txt:295-299 warns that different machines produce different - files. Synthesize replacement SCSI ROMs asks for a Human68k version 3.02 disk - image, dialog default HUMAN302.XDF with filter *HUMAN*3*02*.???, extracts - /BIN/FORMAT.X and writes SCSIINROM.DAT and SCSIEXROM.DAT. + CGROM.TMP from the installed MS Gothic and MS Mincho fonts, resolving CGROM.TMP at + 0x45f8eb-0x45f8f4 and CGROM.DAT at 0x45fa47-0x45fa50. Synthesize replacement + SCSI ROMs asks for a Human68k version 3.02 disk image, dialog default + HUMAN302.XDF (0x45fd6a) with filter *HUMAN*3*02*.??? (0x45fced), extracts + /BIN/FORMAT.X and writes SCSIINROM.DAT and SCSIEXROM.DAT, whose paths it resolves + at 0x45fc7a-0x45fc9e. - The ROM Warning section of the Advanced options holds three checks, all enabled - by default and individually suppressible: an IPLROM.DAT version check naming - version 1.0 (05/07/1987) as recommended, a CGROM.DAT contents check and a - SCSIEXROM.DAT / SCSIINROM.DAT contents check. Since release 78 the SCSI ROMs are - read at startup only when the saved configuration needs them, and their check - otherwise runs from the SCSI page of the options (Change Log.txt:3093-3096). - Each check raises a dialog, but none rejects the file, so no hash below is + The ROM Warning options hold three checks, each suppressible. The IPL check + (0x48ee5c) accepts the base IPL when the IOCS date bytes at 0x1000a, 0x1000c and + 0x1000d spell 87/05/07, and LoadROM identifies the IPL revision from the dword at + 0x1000a against a table at 0x572458 (0x490519-0x490552). The CG check (0x48eea3) + sums and XORs 0x1000 bytes at 0x3a800 of the font and wants 0xec and 0x84. The + SCSI check (0x48eedc) reads 0x2000 bytes of SCSIINROM.DAT and SCSIEXROM.DAT and + flags a file holding "XM6 " at 0x1ff8, the stamp of synthesised replacements + (0x48ef82, 0x48efc6). Each check only raises a dialog, so no hash below is enforced by the program. - Reference Manual.txt ships with the program and Software Notes.txt is fetched by - the Web Package through Scripts\Update Notes.bat. Both are prose documents that - the Help menu and Help > Peruse Notes hand to a text editor, not data XM6 parses. XM6.ini and XM6U.ini are written by the program. files: @@ -104,17 +95,15 @@ files: md5: 7fd4caabac1d9169e289f0f7bbf71d8e sha1: 0ed038ed2133b9f78c6e37256807424e0d927560 description: "X68000 boot ROM, base SASI model" - source_ref: "Change Log.txt:124-125, README.txt:23-25, XM6 2.06 vm/memory.cpp:256-276" + source_ref: "XM6.exe 260920 Memory::LoadROM 0x4903d7: 0x490461-0x490478 (types 1 to 3 give table entry 0, Filepath::SysFile 0x48b054), 0x490496 (Fileio::Load 0x20000), 0x49049f-0x4904bf (types 1 to 3 on failure copy the built-in 0x20000 bytes from 0x552458 and skip the swap), 0x4904f8 (16-bit swap 0x407710), IPL check 0x48ee5c" note: >- XM6.exe carries this ROM internally and only reads the file when it is - present, so the emulator boots without it. The embedded copy sits at file - offset 1382488 in .rdata of the Unicode build and 1332664 in the MBCS build, - stored in the 16-bit pairwise swapped form the loader produces at - vm/memory.cpp:278-285. Unswapped it is the 131072-byte dump hashed here, + present, so the emulator boots without it. The embedded copy sits at + 0x552458, file offset 1382488, in .rdata of the Unicode build and at file + offset 1332664 in the MBCS build, stored in the 16-bit pairwise swapped form + the loader produces. Unswapped it is the 131072-byte dump hashed here, catalogued by TOSEC as Sharp X68000 Boot ROM (1987)(Sharp), and it is the - version 1.0 (05/07/1987) the startup warning recommends. README.txt:23-25 - advises against installing the file at all because reading and swapping it - only lengthens startup. + version 1.0 (05/07/1987) the IPL check accepts. - name: IPLROMXV.DAT system: sharp-x68000 @@ -122,11 +111,11 @@ files: min_size: 131072 validation: [size] description: "X68000 XVI boot ROM" - source_ref: "XM6 2.06 vm/memory.cpp:178-180, 261-263" + source_ref: "XM6.exe 260920 Memory::LoadROM 0x4903d7: 0x49041e-0x49045f (type 4 gives table entry 1), 0x490478 (Filepath::SysFile 0x48b054), 0x490496 (Fileio::Load 0x20000), 0x4904c1-0x4904eb (failure logs Missing or invalid ROM file and returns 0), 0x49063b 0x490658-0x49066a (fallback to type 1)" note: >- - Probed after the base machine loads. Its presence, together with - SCSIINROM.DAT, is what makes the XVI machine available. Absent, the base - X68000 still runs. No internal copy is compiled into XM6.exe. + Read when the configuration selects the XVI. Absent or short, LoadROM + fails and the base X68000 runs instead. No internal copy is compiled into + XM6.exe. - name: IPLROMCO.DAT system: sharp-x68000 @@ -134,10 +123,10 @@ files: min_size: 131072 validation: [size] description: "X68000 Compact boot ROM" - source_ref: "XM6 2.06 vm/memory.cpp:181-185, 264-266" + source_ref: "XM6.exe 260920 Memory::LoadROM 0x4903d7: 0x490423-0x49045a (type 5 gives table entry 2), 0x490478 (Filepath::SysFile 0x48b054), 0x490496 (Fileio::Load 0x20000), 0x4904c1-0x4904eb (failure returns 0), 0x49063b 0x490658-0x49066a (fallback to type 1)" note: >- - Probed after XVI. Selects the Compact machine when found, and that machine - also needs SCSIINROM.DAT. No internal copy is compiled into XM6.exe. + Read when the configuration selects the Compact, under the same rules as + IPLROMXV.DAT. No internal copy is compiled into XM6.exe. - name: IPLROM30.DAT system: sharp-x68000 @@ -145,25 +134,25 @@ files: min_size: 131072 validation: [size] description: "X68030 boot ROM" - source_ref: "XM6 2.06 vm/memory.cpp:186-190, 267-269" + source_ref: "XM6.exe 260920 Memory::LoadROM 0x4903d7: 0x490428-0x49042b and 0x490417 (type 6 gives table entry 3), 0x490478 (Filepath::SysFile 0x48b054), 0x490496 (Fileio::Load 0x20000), 0x4904c1-0x4904eb (failure returns 0), 0x49063b 0x490658-0x49066a (fallback to type 1)" note: >- - Probed last. Selects the X68030 machine, which also needs ROM30.DAT. No - internal copy is compiled into XM6.exe. + Read when the configuration selects the X68030, which also reads + ROM30.DAT. No internal copy is compiled into XM6.exe. - # -- X68030 SCSI ROM, the one SCSI ROM read at 0x20000 bytes -- + # -- X68030 SCSI ROM, the one SCSI-slot ROM read at 0x20000 bytes -- - name: ROM30.DAT system: sharp-x68000 required: false - min_size: 131072 + size: 131072 validation: [size] description: "X68030 SCSI ROM" - source_ref: "README.txt:25, XM6 2.06 vm/memory.cpp:316-319, 334-337" + source_ref: "XM6.exe 260920 LoadSCSIROM 0x49016a: 0x4901cc-0x4901ea (type 6 gives table entry 4 and size 0x20000), 0x49025e (open, failure logs Unable to open ROM file), 0x4902a3-0x4902b9 (_filelengthi64 must equal 0x20000, else Wrong size for ROM file), 0x4902e5 (read), 0x49034f (16-bit swap), Memory::LoadROM 0x4903d7 0x4905aa-0x490613 (absent: stub slot with the SCSIIN signature)" note: >- - The SCSI half of the X68030 machine, and the only SCSI ROM read at 0x20000 - bytes rather than 0x2000. Without it LoadROM(X68030) fails and the X68030 - machine is not offered. README.txt:25 calls it non-critical and notes that - installing it can cost performance. + The SCSI half of the X68030 machine, and the only SCSI-slot ROM read at + 0x20000 bytes, at exactly that length. When it is missing or of another + size LoadROM fills the slot with 0xff, writes a stub header carrying the + SCSIIN signature at offset 0x24, and the X68030 still starts. The copy here is the X68000 Firmware set's ROM30.DAT (SCSIIN, ROM Human 2.x, ROM FLOAT and the SCSI-IOCS binary), read out of an X68030 by the XM6 2.06 utility, which stamps its name at the tail of the image. # -- Font ROM, read at 0xc0000 bytes, CGROM.DAT first then CGROM.TMP -- @@ -177,15 +166,14 @@ files: md5: cb0a5cfcf7247a7eab74bb2716260269 sha1: 8d72c5b4d63bb14c5dbdac495244d659aa1498b6 description: "X68000 character generator ROM" - source_ref: "README.txt:278-281, Change Log.txt:128, XM6 2.06 vm/memory.cpp:287-295" + source_ref: "XM6.exe 260920 0x48e737: 0x48e783-0x48e78c (table entry 5), 0x48e7a3 (Fileio::Load 0xc0000), 0x48e7ac-0x48e7cb (CGROM.TMP tried next), 0x48e7cd-0x48e7ef (both absent: logs Unable to load CGROM.DAT or CGROM.TMP and fills the font with 0x55 at 0x42245f), 0x48e7fe (16-bit swap), CG check 0x48eea3" note: >- - Supplies the glyphs for text the X68000 renders. Stock XM6 v2.06 fails - initialisation when neither font file loads, but XM6 Pro-68k dropped that - requirement, so a missing font ROM shows garbage glyphs and the emulator - keeps running, and what remains is the suppressible contents warning. - The mandatory DLL Package ships this exact 786432-byte file, catalogued by - TOSEC as Sharp X68000 CG ROM (1987)(Sharp). The hash identifies that copy and - is not verified by the program. + Supplies the glyphs for text the X68000 renders. When neither font file + loads, the font area is filled with 0x55, text shows as garbage and the + emulator keeps running. The mandatory DLL Package ships this exact + 786432-byte file, catalogued by TOSEC as Sharp X68000 CG ROM + (1987)(Sharp), and it passes the CG check. The hash identifies that copy + and is not verified by the program. - name: CGROM.TMP system: sharp-x68000 @@ -194,63 +182,61 @@ files: min_size: 786432 validation: [size] description: "Synthesised font ROM, fallback when CGROM.DAT is absent" - source_ref: "README.txt:295-299, XM6 2.06 vm/memory.cpp:290-294" + source_ref: "XM6.exe 260920 0x48e737: 0x48e7ac-0x48e7b2 (table entry 6, reached only after CGROM.DAT fails), 0x48e7c4 (Fileio::Load 0xc0000), 0x48e7fe (16-bit swap)" note: >- - Read only when CGROM.DAT is missing, at the same size. Tools > Synthesize - replacement CG-ROM writes it from the installed MS Gothic and MS Mincho fonts - and fails when either is absent. No hash is declared because the output - depends on the fonts of the machine that generated it. XM6 refuses to use it - while CGROM.DAT is present. + Read only when CGROM.DAT is missing or short, at the same size. Tools > + Synthesize replacement CG-ROM writes it from the installed MS Gothic and MS + Mincho fonts. No hash is declared because the output depends on the fonts + of the machine that generated it. - # -- SCSI ROMs, read at 0x2000 bytes, required by the interface they drive -- + # -- SCSI ROMs, exact 0x2000 bytes, required by the interface they drive -- - name: SCSIINROM.DAT system: sharp-x68000 required: false bundled: true - min_size: 8192 + size: 8192 validation: [size] md5: aeb4607a14612606c833227437aaa16a sha1: 15a17798839a3f7f361119205aebc301c2df5967 description: "Internal SCSI interface ROM, X68000 SUPER and later" - source_ref: "Reference Manual.txt:1529-1536, XM6 2.06 vm/memory.cpp:309-315" + source_ref: "XM6.exe 260920 LoadSCSIROM 0x49016a: 0x4901b7-0x4901ea (types 2, 4 and 5 give table entry 7, size 0x2000), 0x4901fc-0x490219 (deferred while the flag read by 0x40b726 is set), 0x49025e (open), 0x4902a3-0x4902b5 (_filelengthi64 must equal 0x2000), 0x4902e5 (read), 0x49034f (swap), Memory::LoadROM 0x4903d7 0x49057d-0x4905ad (types 4 and 5 continue with the slot at 0xff, types 2 and 3 fail), SCSI check 0x48eedc 0x48ef1f-0x48ef82" note: >- - Needed to use internal SCSI drives, and also loaded as part of the XVI and - Compact machines, so those two models are unavailable without it whatever - their IPL. The mandatory DLL Package ships this exact 8192-byte file and the - hash identifies that copy, while the startup contents check only warns. + Needed for the internal SCSI option on the base X68000, which otherwise + falls back to the plain base machine. The XVI and Compact start without it + with the SCSI slot left at 0xff. The mandatory DLL Package ships this exact + 8192-byte file and the hash identifies that copy, while the startup SCSI + check only warns. - name: SCSIEXROM.DAT system: sharp-x68000 required: false bundled: true - min_size: 8160 + size: [8160, 8192] validation: [size] md5: 237be014374b74d327f15f250d4d62bf sha1: 49616c09a8986ffe6a12ad600febe512f7ba8ae4 description: "External SCSI interface ROM, CZ-6BS1 board" - source_ref: "Reference Manual.txt:1529-1536, XM6 2.06 vm/memory.cpp:320-324, 346-357" + source_ref: "XM6.exe 260920 LoadSCSIROM 0x49016a: 0x4901bc-0x4901ea (type 3 gives table entry 8, size 0x2000), 0x4902a3-0x4902d4 (_filelengthi64 must be 0x2000, or 0x1fe0 loaded at offset 0x20 behind 0x20 bytes of 0xff), 0x4902e5 (read), 0x490315-0x490346 (an 8192-byte image whose first dword is neither 0 nor 0xffffffff is moved up 0x20 bytes), 0x49034f (swap), SCSI check 0x48eedc 0x48ef8f-0x48efc6" note: >- - Needed to use the external SCSI interface, which is the only SCSI variant - that can coexist with SASI. The loader first reads 0x2000 bytes and, on - failure, retries with the 0x1fe0-byte WinX68k layout loaded at buffer offset - 0x20, so 8160 is the real floor. The mandatory DLL Package ships the - 8192-byte form hashed here. + Needed for the external SCSI option on the base X68000, which otherwise + falls back to the plain base machine. Two lengths are accepted: 8192 bytes, + and the 8160-byte WinX68k layout. An 8192-byte image that starts with + data rather than the blank register window is shifted to the same layout. + The mandatory DLL Package ships the 8192-byte form hashed here. # -- Battery-backed NVRAM -- - name: SRAM.DAT system: sharp-x68000 required: false - size: 16384 + size: [16384, 65536] description: "X68000 SRAM image, boot device and memory switch settings" - source_ref: "Reference Manual.txt:1366-1368, 2648-2651, XM6 2.06 vm/filepath.cpp:404" + source_ref: "XM6.exe 260920 SRAM init 0x4abb9d: 0x4abb9f (fills 0x10000 bytes with 0xff at 0x4ab4d8), 0x4abba4-0x4abbaa (table entry 9), 0x4abbc1 (Fileio::Load 0x10000, result ignored), 0x4abc15 (swap), 0x4ab50f 0x4ab517-0x4ab52c (save writes the configured size in KB, 16 by default at 0x4abb11)" note: >- - Read at startup and rewritten on exit when the contents changed, so XM6 - creates it on first run and a supplied image only preloads the settings. The - Tools > SRAM menu reloads, duplicates and write-protects it, and the boot - counter option updates it on exit. Size is the X68000 SRAM size and is not - checked by the program. + Read at startup and rewritten on exit, so XM6 creates it on first run and + a supplied image only preloads the settings. Up to 64 KB is read with no + size check. The program writes 16 KB, or 64 KB with the SRAM64K option. # -- Optional libraries loaded by name at runtime, shipped in the DLL Package -- @@ -261,12 +247,12 @@ files: required: false bundled: true description: "7-Zip library for .7z, .zip and .xz support" - source_ref: "README.txt:166-170, XM6.exe strings 7z.dll, Optional DLL Not Present" + source_ref: "XM6.exe 260920 0x401ce4: 0x401cfd-0x401d02 (7Z.DLL through the loader 0x40ce48: LoadLibraryW beside XM6.exe at 0x40ce90, then the system directory at 0x40cf01, then the Windows directory at 0x40cf67), 0x401d1c-0x401d22 (GetProcAddress CreateObject), 0x4505f0-0x4505fb (absent: 0x412122 index 0 shows Optional DLL Not Present at 0x412109)" note: >- - Absent from the import directory and looked up by name at runtime, so XM6 + Absent from the import directory and loaded on first archive use, so XM6 starts without it and reports Optional DLL Not Present, Archive support is - not available. Enables loading disk images and state files from archives and - writing XZ-compressed state files. + not available. Enables loading disk images and state files from archives + and writing XZ-compressed state files. - name: zlib1.dll size: 59904 @@ -275,9 +261,9 @@ files: required: false bundled: true description: "zlib, used for PNG output and deflate archives" - source_ref: "XM6.exe strings 7z.dll or zlib1.dll, ZLIB1.DLL, deflateInit2_, deflate, deflateReset, deflateEnd" + source_ref: "XM6.exe 260920 delay-load import zlib1.dll (crc32, inflate, inflateEnd, inflateInit2_, deflateEnd, deflateInit2_, deflateReset, deflate), 0x40cf85 0x40cf8e-0x40cf98 (ZLIB1.DLL through the loader 0x40ce48, handle cached at 0x59e66c), callers 0x414487, 0x4280bc and 0x489151-0x48915d (absent: 0x412122 index 1 names 7z.dll or zlib1.dll in the Optional DLL Not Present dialog)" note: >- - Looked up by name at runtime alongside 7z.dll and named in the same Optional - DLL Not Present dialog. XM6.exe resolves deflateInit2_, deflate, - deflateReset and deflateEnd from it, and the display capture commands - write PNG files. + Delay-loaded, so the process starts without it, and every caller first + loads it by name and skips its zlib path when that fails. XM6.exe resolves + inflate, deflate and crc32 from it for deflate archives and PNG display + captures.