UnZ - Unpack Z-machine file format information

I’ve been working on and off with a tool for analyzing/unpacking the compiled z-machine story file information (think ztools). I’ve done it mostly for my own education and amusement but now feel that it maybe is time to release something for bug testing and suggestions for further development. There’s a lot of inconsistency how the information is presented and that’s because different parts where developed at different times (lately I spent an unreasonable amount of time on version 2 of the Infocom grammar format, a format hardly never used…) and I havn’t reallty decided what I think looks best

There’s lots of things that I want for the future, among, for example:

  • Better information on the individual properties on objects.
  • Unpack and identify arrays and their content, now in unidentified data areas.
  • Better support for Dialog.
  • Allow external symbol-file that names identified symbols (attributes, variables, routines, …).
  • GUI that lets you click and follow addresses in, for example, z-code

Help page to wet the appetite:

UnZ 0.10 (2024-02-17) by Henrik Åsman, (c) 2021-2024
Usage: unz [option] [file]
Unpack Z-machine file format information.

 -a                 Show the abbreviation sections.
 -d                 Show the dictionary section.
 -f                 Show all sections (default).
 -g                 Show the grammar section.
 --gametext         Output only a'gametext.txt' format of all text in the file.
 -h, --help, /?     Show this help.
 --hexdump          Show raw hexdump before each section.
 --hide             Don't show the abbreviation insertion points in the strings.
 -i                 Show the header section.
 -m                 Show the memory map.
 -o                 Show the objects sections.
 -s                 Show the strings section.
 --syntax 0/txd     Use TXD default syntax for the z-code decompilation. (default)
          1/inform  Use Inform syntax for the z-code decompilation. (txd -a)
          2/ZAP     Use ZAP syntax for the z-code decompilation.
 -u                 Show the unidentified sections.
 -v                 Show the variable section.
 -x                 Show miscellaneous other sections.
 -z                 Show the z-code section.
 -z <hexaddress>    Show the single decompiled z-code routine at <hexaddress>

Report bugs/suggestions to: heasm66@gmail.com
UnZ homepage: https://github.com/heasm66/UnZ

There are precompiled binaries for win-x64, linux-x64 and osx-x64 here.

The source code is a palimpsest of different iterations and testcode and nothing for the weak minded, visit the GitHub-page at your own risk, you have been warned.

Report bugs/suggestions here, via email or as an issue at the project page.

18 Likes

I have given it a quick but, I think, stressful, test:

across.z8 (one of the two largest .z8, using the full 512K z8 memory)
curses-r7.z3 (the oldest, and by Lord Inform’s admission,the most buggy)
curves.z8 (the other full 512K .z8 story file)
dejavu.z3 (the oldest Inform binary known)
Mansion.z5 (a “normal” .z5 story, chosen admittely at random)
moments.z6 (a very heavy-using .z6 features story file)

of all six, only curses-r3 crashed unZ:

***** SYNTAX/GRAMMAR TABLE DATA (028EC-02E5C, 1.393 bytes) *****

Verb 255 'get'/'lift'/'pick'/'take'
028EC 07 00 FF 00 00 00 00 00 00 Unhandled exception. System.NullReferenceException: Object reference not set to an instance of an object.
   at UnZ.Program.DecodeGrammarsInformV1(Int32, DictionaryEntries, Int32, Int32, Int32)
   at UnZ.Program.Main(String[])

so, I can assess that, as first release, 0.10, is a promising good tool, whose can be improved.

Thanks for your effort, and
Best regards from Italy,
dott. Piergiorgio.

4 Likes

I now have a fix for Curses-r7. Its ‘Adjective Table’ isn’t formatted as expected. This can also be observed if one tries to dump the information with INFODUMP:

    **** Prepositions ****

  Table entries = 17

239. "about"
240. "with"
241. "under"
242. "inside"
243. "throug"
244. "over"
245. "at"
246. "to"
247. "down"
248. "on"
249. "c  c      1hs "
250. "c  c      1hs "
251. "c  c      1hs "
252. "c  c      1hs "
253. "c  c      1hs "
254. "c  c      1hs "
255. "c  c      1hs "

A release 0.11 is coming soon with the fix as below:

***** PREPOSITION/ADJECTIVE TABLE (03009-0304E, 70 bytes) *****

03009 00 11                    Number of entries: 17
0300B 30 5D 00 EF              Preposition #239: 'about'
0300F 42 15 00 F0              Preposition #240: 'with'
03013 41 20 00 F1              Preposition #241: 'under'
03017 38 21 00 F2              Preposition #242: 'inside'
0301B 40 78 00 F3              Preposition #243: 'throug'
0301F 3A D6 00 F4              Preposition #244: 'over'
03023 30 FE 00 F5              Preposition #245: 'at'
03027 40 A9 00 F6              Preposition #246: 'to'
0302B 34 CB 00 F7              Preposition #247: 'down'
0302F 3A B3 00 F8              Preposition #248: 'on'
03033 00 FF 00 F9              Preposition #249: 'into' (table is corrupt at this entry, word taken from dictionary.)
03037 00 FF 00 FA              Preposition #250: 'off' (table is corrupt at this entry, word taken from dictionary.)
0303B 00 FF 00 FB              Preposition #251: 'in' (table is corrupt at this entry, word taken from dictionary.)
0303F 00 FF 00 FC              Preposition #252: 'from' (table is corrupt at this entry, word taken from dictionary.)
03043 00 FF 00 FD              Preposition #253: 'invent' (table is corrupt at this entry, word taken from dictionary.)
03047 00 FF 00 FE              Preposition #254: 'up' (table is corrupt at this entry, word taken from dictionary.)
0304B 00 FF 00 FF              Preposition #255: 'out' (table is corrupt at this entry, word taken from dictionary.)
5 Likes

UnZ is updated to version 0.11 (some small cosmetic fixes and the bugfix discussed above). Binaries and source code at the same places pointed to in the initial post.

5 Likes

I have update UnZ to version 0.12.

Changelog:

  1. Call without options or file prints help (same as -h).
  2. Cosmetic changes to printing in the objects section.
  3. List calls from property, action and preaction/parsing in z-code routine header.
  4. List possible startingpoint for arrays in “undentified data”, collected from opcodes loadb, loadw, storeb, storew and globals.

Example of 3:

Routine: 0x02C30               Called from routine(s) at 0x02C18
                               Called from property #40 at object #12 ("pair of sunglasses")
02C30 01                       1 local
                               (L00)

02C31 FD 87 01 15 12 66        COPY_TABLE L00 0x1512 0x66
02C37 B0                       RTRUE

Routine: 0x02C38               Called from routine(s) at 0x02C78
02C38 02                       2 locals
                               (L00 L01)

02C39 61 01 1B C0              JE L00 G0B [TRUE] RFALSE
02C3D 4A 01 20 40              TEST_ATTR L00 ATTRIBUTE32 [FALSE] RFALSE
02C41 4A 01 1D C0              TEST_ATTR L00 ATTRIBUTE29 [TRUE] RFALSE
02C45 4A 01 18 C0              TEST_ATTR L00 ATTRIBUTE24 [TRUE] RFALSE
02C49 D9 2F 05 8A 02 00        CALL_2S 0x2C50 (L01) -> -(SP)
02C4F B8                       RET_POPPED

Example of 4:

***** UNIDENTIFIED DATA (0097D-016D9, 3,421 bytes) *****

00970                                        00 00 00               ...
00980 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
00990 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
.
.
.
016B0 00 03 00 02 15 A3 14 F9 00 04 00 02 17 3B 16 32  .............;.2
016C0 16 65 00 03 00 02 15 D2 16 27 00 03 00 02 14 A0  .e.......'......
016D0 16 21 00 03 00 02 15 04 16 89                    .!........

Possible starting points for arrays (from absolute addresses in
opcodes loadw/GET, loadb/GETB, storew/PUT, storeb/PUTB and globals):
     0x0097D
     0x00A09
     0x00A6D
     0x00DFF
     0x00F0A
     0x00F70
     0x00FD6
     0x01644
     0x01648
     0x01654
     0x0165C
     0x01664
     0x0166C
     0x01676
     0x0167E
     0x01686
     0x0168E
     0x01696
     0x0169E
     0x016A6
     0x016B0
     0x016B8
     0x016C2
     0x016CA
     0x016CF
     0x016D2

Binaries and source code at the same places pointed to in the initial post.

2 Likes

This is neat, thanks. A disappointment I have with glulx-strings is that it doesn’t show the dictionary.

I hope someone writes the equivalent of this for glulx (so I don’t have to!).

2 Likes

Version 0.13 is out.

Changelog:

    0.13 2024-12-27
    ---------------
      * Fixed bug that couldn't handle "no-verb" with 0 number_of_grammar_lines
        in Inform_GV2.
      * Inform6: Support for grammar version 3.
      * Support for unicode translation table.
      * Identify old compiled files right as Zilch(old Infocom files with oddly formed serials).
      * Accept files with no abbreviation tables.
      * Accept files with no objects.
      * Print object tree, special output for InvisiClues-files.
      * Dialog: Identify memory areas for heaps, predicates and scratch area.
      * Dialog: Mark data, that fills out so static mem - global start 
                always is at least 480 bytes, as padding. 

    0.12 2024-02-24
    ---------------
      * Call without options or file prints help (same as -h).
      * Cosmetic changes to printing in the objects section.
      * List calls from property, action and preaction/parsing in 
        z-code routine header.
      * List possible startingpoint for arrays in "undentified data",
        collected from opcodes loadb, loadw, storeb, storew and globals.

    0.11 2024-02-18
    ---------------
      * Minor bug fixes and error handling.
      * Handle corrupt adjective table (Curses_r7) for Inform5_ver1 grammar.

    0.10 2024-02-17
    ---------------
      * Initial commit.
3 Likes

I just wanted to say thank you so much for developing this. I’m currently working on an interpreter for the Apple Lisa based in Pascal and this tool has so far been absolutely critical in getting my text-handling unit working. I’m about 90% done with managing text and am now just down to a few granular tasks, but that’s only thanks to being able to poke and prod at text data using your tool. Being able to look at raw byte data and its corresponding “plaintext” has been an absolute godsend, so thank you again for your efforts!

4 Likes

You’ve got an apple Lisa? Congrats.

crashes on adams sampler (plays fine in frotz).

***** ANALYZING *****                                                                                                                                         
                                                                                                                                                              
Filename:                                  adams/Adventure_00_Sampler.z5                                                                                      
Compiled With:                             Inform5 (or earlier)                                                                                               
Z-machine version:                         5                                                                                                                  
Calculated checksum:                       0x7E00, checksum ok                                                                                                
Object count:                              101                                                                                                                
Unique verbs count:                        33                                                                                                                 
Grammar table version:                     1                                                                                                                  
Verb action count:                         33                                                                                                                 
Dictionary word count:                     117                                                                                                                
Unique prepositions count:                 0                                                                                                                  
Scanning for routines from:                0x02374                                                                                                            
Found first routine at address:            0x02374                                                                                                            
Lowest routine address (immediate call) :  0x02380
Highest routine address (immediate call):  0x05600
Lowest string address (immediate address): 0x0561C
Strings start at address:                  0x05614
Highest used global in z-code:             240
Number of used globals in z-code:          24
Number of unique properties:               10

***** MEMORY MAP *****

00000-01D5B DYNAMIC MEMORY
   FFFFFFFE-01D5B Unidentified data, 7,518 bytes.
   00000-0003F Header table, 64 bytes.
   00040-00041 Abbreviation strings, 2 bytes.
   00042-00101 Abbreviation table, 192 bytes.
   00102-0017F Object defaults table, 126 bytes.
   00180-00705 Object tree table, 1,414 bytes.
   00706-00E78 Object properties tables, 1,907 bytes.
   00E79-01058 Global variables, 480 bytes.
   01059-01D5B Unidentified data, 3,331 bytes.

01D5C-02373 STATIC MEMORY
   01D5C-01D9D Syntax/Grammar table, 66 bytes.
   01D5C-01F4C Unidentified data, 497 bytes.
   01D9E-01EC6 Syntax/Grammar table data, 297 bytes.
   01EC7-01F08 Action table, 66 bytes.
   01F09-FFFFFFFD Parsing routines table, -7,947 bytes.
   01F4D-02370 Vocabulary/Dictionary, 1,060 bytes.
   02371-02373 Padding, 3 bytes.

02374-0598B HIGH MEMORY
   02374-05613 Z-code, 12,960 bytes.
   05614-0598B Static strings, 888 bytes.


***** UNIDENTIFIED DATA (FFFFFFFE-01D5B, 7,518 bytes) *****

[Failed: Corrupted or unknown format on story-file.]

aand it only passes on 01 adventureland, the other 16 adams games fail with the same more or less message as above.

as an fyi; md5sum

f6c0c505240abaf6da6126f94557f41b  Adventure_00_Sampler.z5
0df3b73fbbbbe19f391087e883785169  Adventure_01_Adventureland.z5
8c4e799206a0a74bd071bfad8f518044  Adventure_02_Pirate_Adventure.z5
ef398495b5c6c892935be0014a082e57  Adventure_03_Secret_Mission.z5
e1c3479245e17381b2e29928973f4288  Adventure_04_Voodoo_Castle.z5
ed27f81d3b16b065fff9f54dfdbd4f66  Adventure_05_The_Count.z5
abd6a644b494a3d94d333a5ee7ab5b28  Adventure_06_Strange_Odyssey.z5
3acebdf645178ecc92b72e793bb78578  Adventure_07_Mystery_Fun_House.z5
b8028c56dcf4fc29ac6f7191e9988344  Adventure_08_Pyramid_Of_Doom.z5
ee6c7d8c92a1f43b6dfe207dcd296f21  Adventure_09_Ghost_Town.z5
c06f2825dd6896ffe937dced56057ee6  Adventure_10_Savage_Island_pt1.z5
5f67ec6cbde059557dfdef34215561fa  Adventure_11_Savage_Island_pt2.z5
68ea51681d830f4f3a0d7d6db51163ee  Adventure_12_Return_to_Pirates_Isle.z5
ee36e0de8f5f3497a4fa24808a0bc755  Adventure_13_Golden_Voyage.z5
9bb8fbe5da0cd00ad99d60ecc0a397cd  Adventure_14_Sorceror_Of_Claymorgue_Castle.z5
ee7f6085038cec3da7e1bbe2205dc1a4  Adventure_15_Questprobe_1_Hulk.z5
38dccec66a426f7980accdd827b77bdd  Adventure_16_Questprobe_2_Amazing_Spiderman.z5
6192508b354e132c789c91025144e60d  Adventure_18_Adventures_Of_Buckaroo_Banzai.z5

ziptest r13 has a lot of undecoded data, looks kinda odd…
bureaucracy r86 also has like a 22k undecoded chunk of data that looks like code+strings.

zork1 r5+r20 says it was made in inform 5 or earlier… (r2+r15 say zilch)

1 Like

Thank you, I’ll have a look what’s wrong. I think I fixed the z1-version of Zork already but it may be unreleased.

Unz use a lot of patter matching to find start and end of sections and can easily get lost on files compiled with old versions of the compilers.

Scott Adams-games doesn’t contain any prepositions. It was that that messed it up. This, plus the reported bugs are fixed in the next release (0.14) (currently only in the source code under development).

Version 0.14 is out.

Changelog:

    0.14 2025-06-26
    ---------------
      * Bugfixes and refactoring
      * Fix GetBuildDate
      * Fix to illegal parameter use of WINGET in Zork0_242
      * Identify zork1-r5-sXXXXXX.z1 and zork1-r20-sXXXXXX.z3 as Zilch
      * Handle Inform5-files with no prepositions (Scott Adams)
      * Handle Zilch/Zilf where there are no ACTIONS (ziptest)
      * Allow split chunks of z-code (Bureaucracy)

    0.13 2024-12-27
    ---------------
      * Fixed bug that couldn't handle "no-verb" with 0 number_of_grammar_lines
        in Inform_GV2.
      * Inform6: Support for grammar version 3.
      * Support for unicode translation table.
      * Identify old compiled files right as Zilch(old Infocom files with oddly formed serials).
      * Accept files with no abbreviation tables.
      * Accept files with no objects.
      * Print object tree, special output for InvisiClues-files.
      * Dialog: Identify memory areas for heaps, predicates and scratch area.
      * Dialog: Mark data, that fills out so static mem - global start 
                always is at least 480 bytes, as padding. 

    0.12 2024-02-24
    ---------------
      * Call without options or file prints help (same as -h).
      * Cosmetic changes to printing in the objects section.
      * List calls from property, action and preaction/parsing in 
        z-code routine header.
      * List possible startingpoint for arrays in "undentified data",
        collected from opcodes loadb, loadw, storeb, storew and globals.

    0.11 2024-02-18
    ---------------
      * Minor bug fixes and error handling.
      * Handle corrupt adjective table (Curses_r7) for Inform5_ver1 grammar.

    0.10 2024-02-17
    ---------------
      * Initial commit.
2 Likes

Version 0.15 is released.

Changelog:
    0.15 2025-07-04
    ---------------
      * Bug: Hexdump of EXTOP showed wrong byte-value
      * Bug: XCALL & IXCALL showed wrong type for operand 5-
      * Bug: @buffer_screen should have E_STORE
      * Bug: Store-var should be hex for syntax 0
      * Verbose description of opcodes (--zverbose)
      * Pseudo-code, Inform-ish syntax (syntax 3)

    0.14 2025-06-26
    ---------------
      * Bugfixes and refactoring
      * Fix GetBuildDate
      * Fix to illegal parameter use of WINGET in Zork0_242
      * Identify zork1-r5-sXXXXXX.z1 and zork1-r20-sXXXXXX.z3 as Zilch
      * Handle Inform5-files with no prepositions (Scott Adams)
      * Handle Zilch/Zilf where there are no ACTIONS (ziptest)
      * Allow split chunks of z-code (Bureaucracy)
      
    0.13 2024-12-27
    ---------------
      * Fixed bug that couldn't handle "no-verb" with 0 number_of_grammar_lines
        in Inform_GV2.
      * Inform6: Support for grammar version 3.
      * Support for unicode translation table.
      * Identify old compiled files right as Zilch(old Infocom files with oddly formed serials).
      * Accept files with no abbreviation tables.
      * Accept files with no objects.
      * Print object tree, special output for InvisiClues-files.
      * Dialog: Identify memory areas for heaps, predicates and scratch area.
      * Dialog: Mark data, that fills out so static mem - global start 
                always is at least 480 bytes, as padding. 

    0.12 2024-02-24
    ---------------
      * Call without options or file prints help (same as -h).
      * Cosmetic changes to printing in the objects section.
      * List calls from property, action and preaction/parsing in 
        z-code routine header.
      * List possible startingpoint for arrays in "undentified data",
        collected from opcodes loadb, loadw, storeb, storew and globals.

    0.11 2024-02-18
    ---------------
      * Minor bug fixes and error handling.
      * Handle corrupt adjective table (Curses_r7) for Inform5_ver1 grammar.

    0.10 2024-02-17
    ---------------
      * Initial commit.

Except for a few bug-fixes, I have added two new switches:

  • --zverbose that prints a detailed breakdown of each opcode
  • --syntax 3 that translates the opcodes to a mock-up, Inform-ish language. Most useful for the more complex opcodes that includes branching, I think.

Example of --zverbose:

1CADB 42 02 00 47              JL L01 0x00 [FALSE] 0x1CAE4
  *--------------------------------------------------
  |Opcode:
  | Byte  1    2OP:2
  |  01000010  0x42 66
  |  0         long-form (short-form in ZAP)
  |   1        variable
  |    0       constant (immediate)
  |     00010  @jl / LESS?
  |
  |Operands:
  | Byte  2    0x02 2 (L1)
  | Byte  3    0x00 0
  |
  |Branch:
  | Byte  4    0x47 71
  |  00000010
  |  0         branch if false
  |   1        6-bit branch, always forward, except when 0 (rfalse) or 1 (rtrue)
  |    000111  0x07 7  [117471 (0x1CADF) + 7 - 2 = 117476 (0x1CAE4)]
  |
  |Pseudo-code:
  |  if (local1 >= 0) jump 0x1CAE4;
  *--------------------------------------------------

A routine in --syntax 0:

Routine: 0x1CA9C               Called from routine(s) at 0x1C580
1CA9C 04                       4 locals
                               (L00 L01 L02 L03)

1CA9D 30 00 01 03              LOADB 0x00 L00 -> L02
1CAA1 A0 03 F9                 JZ L02 [TRUE] 0x1CADB
1CAA4 49 03 80 00              AND L02 0x80 -> -(SP)
1CAA8 A0 00 CF                 JZ (SP)+ [TRUE] 0x1CAB8
1CAAB 95 01                    INC L00
1CAAD 30 00 01 00              LOADB 0x00 L00 -> -(SP)
1CAB1 49 00 3F 04              AND (SP)+ 0x3F -> L03
1CAB5 8C 00 12                 JUMP 0x1CAC8
1CAB8 49 03 40 00              AND L02 0x40 -> -(SP)
1CABC A0 00 C8                 JZ (SP)+ [TRUE] 0x1CAC5
1CABF 0D 04 02                 STORE L03 0x02
1CAC2 8C 00 05                 JUMP 0x1CAC8
1CAC5 0D 04 01                 STORE L03 0x01
1CAC8 95 01                    INC L00
1CACA 49 03 3F 00              AND L02 0x3F -> -(SP)
1CACE 61 00 02 44              JE (SP)+ L01 [FALSE] 0x1CAD4
1CAD2 AB 01                    RET L00
1CAD4 74 01 04 01              ADD L00 L03 -> L00
1CAD8 8C FF C4                 JUMP 0x1CA9D
1CADB 42 02 00 47              JL L01 0x00 [FALSE] 0x1CAE4
1CADF 54 01 01 00              ADD L00 0x01 -> -(SP)
1CAE3 B8                       RET_POPPED
1CAE4 B1                       RFALSE

The same routine, but in --syntax 3:

Routine: 0x1CA9C               Called from routine(s) at 0x1C580
1CA9C 04                       4 locals
                               (local0 local1 local2 local3)

1CA9D 30 00 01 03              local2 = 0x00->local0;
1CAA1 A0 03 F9                 if (local2 == 0) jump 0x1CADB;
1CAA4 49 03 80 00              stack.push(local2 & 128);
1CAA8 A0 00 CF                 if (stack.pop() == 0) jump 0x1CAB8;
1CAAB 95 01                    local0++;
1CAAD 30 00 01 00              stack.push(0x00->local0);
1CAB1 49 00 3F 04              local3 = stack.pop() & 63;
1CAB5 8C 00 12                 jump 0x1cac8;
1CAB8 49 03 40 00              stack.push(local2 & 64);
1CABC A0 00 C8                 if (stack.pop() == 0) jump 0x1CAC5;
1CABF 0D 04 02                 local3 = 0x02;
1CAC2 8C 00 05                 jump 0x1cac8;
1CAC5 0D 04 01                 local3 = 0x01;
1CAC8 95 01                    local0++;
1CACA 49 03 3F 00              stack.push(local2 & 63);
1CACE 61 00 02 44              if (stack.pop() ~= local1) jump 0x1CAD4;
1CAD2 AB 01                    return local0;
1CAD4 74 01 04 01              local0 = local0 + local3;
1CAD8 8C FF C4                 jump 0x1ca9d;
1CADB 42 02 00 47              if (local1 >= 0) jump 0x1CAE4;
1CADF 54 01 01 00              stack.push(local0 + 1);
1CAE3 B8                       return stack.pop();
1CAE4 B1                       rfalse;
2 Likes

UnZ currently can’t handle a “hello world” program in Dialog; there’s usually not much point in disassembling such a thing, but while working on the compiler, it’s really helpful to be able to see what Z-code is produced by a minimal example.

Version with one object and one dictionary word:

helloworld.z5 (5.9 KB)

Version with no objects or dictionary words:

helloworld_bare.z5 (5.3 KB)

1 Like

Thanks

Apparently a small area of high strings can have the z-code disassembly to go out of bounds. A quick fix is to make the teststring longer, so the high strings area is, at least, 20 bytes.

I’ll release a fixed version later today..

1 Like

Version 0.16 is released.

Changelog:
    0.16 2025-07-10
    ---------------
      * Bug: stack.peek() should only be in if-statements
      * Bug: print_paddr handled variables wrong
      * Bug: Small strings area can make z-decoding go out of bounds 

    0.15 2025-07-04
    ---------------
      * Bug: Hexdump of EXTOP showed wrong byte-value
      * Bug: XCALL & IXCALL showed wrong type for operand 5-
      * Bug: @buffer_screen should have E_STORE
      * Bug: Store-var should be hex for syntax 0
      * Verbose description of opcodes (--zverbose)
      * Pseudo-code, Inform-ish syntax (syntax 3)

    0.14 2025-06-26
    ---------------
      * Bugfixes and refactoring
      * Fix GetBuildDate
      * Fix to illegal parameter use of WINGET in Zork0_242
      * Identify zork1-r5-sXXXXXX.z1 and zork1-r20-sXXXXXX.z3 as Zilch
      * Handle Inform5-files with no prepositions (Scott Adams)
      * Handle Zilch/Zilf where there are no ACTIONS (ziptest)
      * Allow split chunks of z-code (Bureaucracy)
      
    0.13 2024-12-27
    ---------------
      * Fixed bug that couldn't handle "no-verb" with 0 number_of_grammar_lines
        in Inform_GV2.
      * Inform6: Support for grammar version 3.
      * Support for unicode translation table.
      * Identify old compiled files right as Zilch(old Infocom files with oddly formed serials).
      * Accept files with no abbreviation tables.
      * Accept files with no objects.
      * Print object tree, special output for InvisiClues-files.
      * Dialog: Identify memory areas for heaps, predicates and scratch area.
      * Dialog: Mark data, that fills out so static mem - global start 
                always is at least 480 bytes, as padding. 

    0.12 2024-02-24
    ---------------
      * Call without options or file prints help (same as -h).
      * Cosmetic changes to printing in the objects section.
      * List calls from property, action and preaction/parsing in 
        z-code routine header.
      * List possible startingpoint for arrays in "undentified data",
        collected from opcodes loadb, loadw, storeb, storew and globals.

    0.11 2024-02-18
    ---------------
      * Minor bug fixes and error handling.
      * Handle corrupt adjective table (Curses_r7) for Inform5_ver1 grammar.

    0.10 2024-02-17
    ---------------
2 Likes

Thank you very much! This will be very helpful in debugging the compiler going forward.