Bytecode Bug

Filed under: Bytecode, Crusaders of Khazan, Debug — denormative @ 23:55

A particularly odd bytecode bug I found whilst reverse engineering the data. It looks like the original bytecode compiler failed to emit an “else” clause for a conditional statement. For the binary code:

Offset    0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
00003230 73 20 77 72 65 63 6B 69 6E 67 20 6C 69 66 65 2E s wrecking life.
00003240 0A 00 1E FD 31 21 05 1E 34 54 6F 20 65 6E 74 65 ....1!..4To ente
00003250 72 20 74 68 65 20 6D 6F 6E 73 74 65 72 73 20 6F r the monsters o

The string that ends with a null at 3241 is fine.

Opcode 1E is “print a string” and it takes a two byte parameter. This happens to point to the “To enter the monsters…” string just after it. So it looks fine.

At 3245 opcode 0x21 is “prompt yes/no”, given the question is: “To enter the monsters own environment requires some thought. Is there some preparation you are neglecting? Do you just leap in?\n” this makes logical sense

Opcode 0x05 at offset 3246 is a two byte parameter code that says “jump to location of the zero flag is false”, the zeroflag is what the yes/no opcode sets. So:

1E FD 31 - print the "To enter the..."
21 - Prompt for question
05 1E 34 - jump to 341E if zeroflag is set
54 6F 20 65 6E 74 65 - "To ente"
(Which is the string 1E FD 31 printed.)

So it didn’t emit the “else” clause of 05 XX XX.

Offset    0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
00003230 73 20 77 72 65 63 6B 69 6E 67 20 6C 69 66 65 2E s wrecking life.
00003240 0A 00 1E FD 31 21 05 1E 34 54 6F 20 65 6E 74 65 ....1!..4To ente
00003250 72 20 74 68 65 20 6D 6F 6E 73 74 65 72 73 20 6F r the monsters o
00003260 77 6E 20 65 6E 76 69 72 6F 6E 6D 65 6E 74 20 72 wn environment r
00003270 65 71 75 69 72 65 73 20 73 6F 6D 65 20 74 68 6F equires some tho
00003280 75 67 68 74 2E 20 20 49 73 20 74 68 65 72 65 20 ught.  Is there
00003290 73 6F 6D 65 20 70 72 65 70 61 72 61 74 69 6F 6E some preparation
000032A0 20 79 6F 75 20 61 72 65 20 6E 65 67 6C 65 63 74  you are neglect
000032B0 69 6E 67 3F 20 20 44 6F 20 79 6F 75 20 6A 75 73 ing?  Do you jus
000032C0 74 20 6C 65 61 70 20 69 6E 3F 0A 00 1E 94 32 23 t leap in?.....#
000032D0 BF 00 00 01 02 C0 52 01 00 00 0E 00 00 03 56 35 ......R.......V5
000032E0 49 6E 20 61 6E 20 61 63 74 69 6F 6E 20 74 6F 6F In an action too
000032F0 20 62 6F 6C 64 20 74 6F 20 62 65 20 62 65 6C 69  bold to be beli

At 32CC, right after that chunk of “To enter…. leap in?” text, is an output, 1E 94 32 dumps out the text below the “In an action too…”, which is basically the “no” response to the “are you neglecting something?”. Where you dive into the water without removing your armour first.

Since I vaguely know where this is, on my list of things to do is to actually visit the location and say “no” and see if the game dies.


Working date/time

Filed under: Crusaders of Khazan, Tunnels & Trolls — denormative @ 23:20

Only thing of note in these images is the working date/time in the top right hand corner in the new screen-shot.

The day of the week is calculated as:

 ( (year * 365) + ((month-1) * 12) + day ) % 7

Which should hopefully be correct, but it wouldn’t surprise me if there’s something quirky as far as time goes.

Pondering turning the all-caps month/day names back into the usual title-caps format. Small sized fonts don’t need to be small-caped at this resolution nowadays.

New Timestamp

Original Timestamp

Character Details Data Test

Filed under: Crusaders of Khazan, Debug, QML — denormative @ 21:01

Similar to the item details debug list, this one’s for characters.

Spell details aren’t being displayed, even though I know the spell availability bits, since I haven’t yet got the model loading it yet, though 90% of the record of each spell is documented.

On the other hand, there’s still another 370 or so bytes undocumented for each character record. There’s a couple of simple ones still missing, like the “missing hand, replaced with gremlin/diamond/whatever hand” status bits, presumably for both hands, and the appropriate character portrait index, however there’s a lot of space left over still. I know the bytecode has a number of references to being able to store other  data relating to characters, similar to how it stores them  in the global data, or map data areas, but that still seems like an awful lot of bytes.

Also “hits taken” is strange. It appears to be stored as a byte, but given it increments for every hit in combat, I would assume that it would easily exceed 255, but the only available space for storage as a word would be if it was stored in big endian format, rather then little endian like the rest

Character Data Test


You Are Dead

Filed under: Crusaders of Khazan, Tunnels & Trolls — denormative @ 22:30

Totally party kill screens. Nothing too complex.

Original has time-stamp in upper right, new ones don’t. I probably won’t bother adding it since it doesn’t make much sense on this screen anyway.

Somewhat tidied up the text on the screen. Removed the “chars” contraction and tidied up the title. (Maybe I should be using “your” rather than “the”? It sounds more fluid but the text uses “the brave adventurers”.)

Also tinkered with the body text slightly. Adding spaces after commas where the original text was missing them. Also properly broke the text with linefeeds, and indentation, where the actual data within the executable had appropriate spaces/linefeeds, but it didn’t render them for some reason.

Screens work as they originally did. Press a key/click the mouse to swap between them, then back to the title screen.

New Death First

Original Death First

New Death Second

Original Death Second

Item Details Data Test

Filed under: Crusaders of Khazan, Debug, QML — denormative @ 21:19

A quick debug test of part of a list of all the items in the game.

Remaining four unknown bytes are b01, b07, b08, and b09. At least b01, b07 and b09 appear to be bitfields, but looks can be deceiving.

Data was pulled out of the item details records stored in the 6th index in the PGMCOM.CC file in the English version, or just the DATI file on the PRO disk on the Sharp X68000 (X68k) version. At a quick glance the data seems similar in structure and same record lengths so it should be identical. A quick diff of the two files indicated that there are a small number of changes between the two, though the patterns were indicative of the X68k version being stored via bigendian in comparison to the English x86 version stored little endian. This was expected given the X86k runs with a big endian processor.

Item Details Data Test


Odd Bug #1

Filed under: Bugs, Crusaders of Khazan — denormative @ 20:31

Apparently if you’re dead, your condition is “Good” in a red font, as opposed to when you’re in full health your condition is “Good” in a green font.

The game binary has “Dead” as one of the available options, so I’ve no idea why it’s not showing.

Odd Bug #1

First pass at character stats screen

Filed under: Crusaders of Khazan, Tunnels & Trolls — denormative @ 18:38

Beginnings of the character stats screen. All live data as per previous screens.

Still missing the data/time in the top right corner, also no icons other than the “space” work, though it’s possible to swap between characters by the usual methods.

Icon shortcuts have been re-lettered to fit better with the words they’re attached to, keyboard shortcuts have been adjusted accordingly. Though it’s possible they might need to be swapped back to the previous method, since there was obviously a reason for it and I’m not sure if I’ll be making things harder for myself in the long run with this change.

Also to ponder:

  • Moving the icon palette to the bottom right of the screen since I can’t recall that space is used for anything on these screens (maybe the “use” option on the inventory screen might have a yes/no prompt appear there? can’t recall that ever happening though).
  • Splitting up the “Money” option into two icons, one to “Gather Money” one to “Share Money” since it seems silly that using that icon just pulls up a menu with those two options.

Layout still needs a little tweaking to get the text looking nicely spaced/balanced, also a “message console” needs to be added in the blank spot to handle error messages and such when moving things around; though that’s probably only needed on the inventory screen since I don’t believe there’s anything on the stats screen that might emit messages there.

The “Condition(s)” area also needs work. It’ll require a bit of testing with the original game, since I can only recall how Good/Injured messages there worked, and not how all the other messages like Poisoned/Stoned/Dead/etc appeared.

And of course character portrait. This is a bit of a non-trivial thing since it paper-dolls with the base character’s portrait at the bottom, then armour and helmet overlaid, then on top of that weapons, shields, and other hand-held equipment.

New Stats Screen

Original Stats Screen


Beginnings of the Main Game Screen

Filed under: Crusaders of Khazan, Tunnels & Trolls — denormative @ 00:30

As per title; beginnings of the main game screen you spend most of your time in whilst playing the game.

Of note, characters load from live save-game data and their summary panes appear and disappear just like the original game depending upon the number of characters in the party. However most of the status effects don’t show, only “good” or “wounded”. Mouse over for characters works as per original game; as do key-bindings. Though they currently don’t go anywhere interesting.

The command palette in the lower right is currently inactive, and the thinner fonts are causing the red-highlighted keyboard shortcuts to be somewhat hard to read. Bolding may work to fix this, though in the long run I’m more looking towards getting a font that’s closer to the originals, but also has a full Japanese font-set to support rendering the Japanese versions of the game.

The date/time is also missing from the title-bar in the small font style as well.

The width of the uppercase characters of the font is beginning to cause issues here, with the ST/CON values in the character panels getting squished a little too close together.

Also pretty much every text string needs it’s padding or location tweaked as well so things look a little tidier.

Main Screen New

Main Screen Original


Main Screen

Filed under: Crusaders of Khazan, Tunnels & Trolls — denormative @ 23:56

Changes of note are the almost-invisible “Save 5” icon, in the new screen rather then it being completely absent in the old when saves aren’t present in the relevant slots. In addition to the faint grey mouse over highlight on “Save 1” in the new screen, in comparison to the colour inversion of the original screen.

The stylised “PC” logo in the top left is missing and will probably be included once I start doing more polishing rather then adding functionality.

Loading saves is currently supported, though starting a new game via the “First” icon isn’t currently working at the moment. In addition all key-bindings work as per original game, though with the addition of pressing the “Escape” key quits the game from this screen.

Main Menu New

Main Menu Original


Filed under: Crusaders of Khazan, Tunnels & Trolls — denormative @ 13:33

New font is Droid Sans, which seems to have pretty similar characteristics to the original T&T font, the only issue is the capital letters are wider then their equivalent in the original font; making some of the more cramped layouts using all-caps later a little more untidy.

Also currently the text doesn’t come scrolling in from the bottom like the original, rather simply appears. This needs to be tidied up at some point.

Also the issue with the text not being centred vertically is that the original text has a large number of “blank lines” at the end of the text to push the text up enough that it’s centred. Unfortunately the vertical padding of the new font pushes things up a little too much. The padding could probably be stripped and then everything would centre fine.

New Intro

Original Intro

Create a free website or blog at