Download Klax E1M1: At Doom's Gate ROM Hack

Klax E1M1: At Doom's Gate Game
Spread the love:
Parameter Info
Console: NES
Original Game: Klax
Type: Improvement
Genre: Puzzle
Modifications: S
Creator: Damian Yerrick
Date Created: 09/21/2018
Last Modified: 09/23/2018
Parameter Info
File Name: Klax_Dooms_Gate.zip
Downloads: 6
Requirements: No Special Requirements
Version: 1.0
Rating:

Klax E1M1: At Doom's GateDescription

Don’t think this is gonna be a 100% Gold Remake, it’ll have its differences. Extra battles (some’ll be optionals, tough but rewarding), Hoenn Pokemon (in every area, and hard to find) New areas, Remapped some dungeons (so your old guides wont work) , Extra recurring characters (some’ll hate you, some’ll help you)

Note that the hack is incomplete but feel free to enjoy the hack as-is.

Klax E1M1: At Doom's GateRead Me

Klax (Doom's Gate)
==================
A music improvement to show similarities between thrash metal
soundtracks of two games from the Nineties

Produced by Damian Yerrick in September 2018

Klax's audio driver
-------------------
The audio driver of Tengen's port of _Klax_ to NES heavily uses
hardware sweep and hardware envelopes.  The driver sets up a duty,
volume, and sweep (for detune effect) and lets the hardware trigger
a new note whenever the frequency is rewritten.

I hand-decompiled some of the music sequence processing:
```
u8 cur_channel @0x04F5;
u8 note_ticks_left[] @0x04C7;
u8 cur_note[] @0x04CC;
u16 channel_seq_pos[] @0x04D5;
const u8 durations[] = {1, 2, 4, 8, 16, 32, 64} @0xA000;
const u16 note_freqs[] @0xA30C;

void set_ch_freq(u8 semitone_num) @A2E6;

void play_next_note(void) @A291 {
  ptr_f7 = channel_seq_pos[cur_channel]++;
  Y = *ptr_f7;
  A = Y & 0xE0;
  if (A == 0xE0) {
    A = Y;
    A = func_A179();
    if (A) set_ch_freq(A);
    return;
  }
  note_ticks_left[cur_channel] = durations[A >> 5];
  A = Y & 0x1F;
  if (X != 3 /* noise */) {
    // A2D4
    if (A >= 16) A -= 32;
      A += cur_note[cur_channel];
      cur_note[cur_channel] = A;
      if (A != 1) set_ch_freq(A);
    }
  } else {
    if (A > 16) A |= 0x80;  // loopnoise
    Set noise period to A and trigger
  }
}
```

Thus bits 7-5 are log(note length), and bits 4-0 are a 2's complement
signed interval in semitones to this note.  For example, $62
represents up 2 semitones or a major second (bits 4-0: %00010 or +2)
and 8 frames long (bits 7-5: %011 or 3, and 2^3 = 8).  $9B would mean
down 5 semitones or a perfect fourth (bits 4-0: %11011 or -5) and 16
frames long (bits 7-5: %100 or 4, and 2^4 = 16).  Codes $E0-$FF have
a separate meaning that I haven't bothered to crack, as I did not
need it for this hack.

The motif in Klax
-----------------
This motif appears in two of the six pieces in the _Klax_ soundtrack
by Bügsük (Lx Rudis and Dave O'Riva).

    E, E, F#, E, E, G, E, E
    G#, E, E, A, E, E, Bb, A

Because of limits in pattern-sharing in the driver, there are several
copies of this motif in this bank of the ROM. Two are in "Title"

    A9F9: 60 60 62 7E 60 63 7D 60 64 7C 60 65 7B 60 66 7F

This starts out meaning `same same +M2 -M2 same +m3 -m3 same`, etc.
A CPU read breakpoint at `AA01` triggers halfway through this motif.
A second copy in "Title" starts with `6C 60...` where `6C` means
"go up an octave" but is otherwise identical.

The motif is repeated a few times throughout the music data of
"Caverns of Cthulu" such as at `B17A`.  One copy of the motif in
"Caverns" at `B1BC` changes the intervals to move all of the lowest
notes up an octave:

    60 60 76 6A 60 77 69 60 78 68 60 79 67 60 7A 7F

A CPU read breakpoint at B1C8 catches this one.

Changing it to Doom
-------------------
In Bobby Prince's soundtrack for _Doom_, the piece "At Doom's Gate"
is heard in episode 1 mission 1 (E1M1) "Hangar".  It employs a motif
similar in shape and rhythm to the motif in _Klax_, but upside down.

    E, E, E', E, E, D', E, E
    C', E, E, A#, E, E, B, C

To insert this motif into _Klax_, search for all instances of these
bytes:

    62 7E 60 63 7D 60 64 7C 60 65 7B 60 66 7F

replacing them with these bytes:

    6C 74 60 6A 76 60 68 78 60 66 7A 60 67 61

I left the one with the lowest notes up an octave as is because
it moves in opposite directions anyway.

The IPS patch
-------------
Searching and replacing in a hex editor as described above is enough
to get _Klax_ to sound like _Doom_.  To make this easier, use [Lipx]
or any other IPS patch software to apply "Klax (Doom's Gate).nes.ips"
to your copy of _Klax_.

    $ crc32 "Klax (U).nes"
    755cf043	Klax (U).nes
    $ md5sum "Klax (U).nes"
    f957b5d342a2106afc470577c3412588  Klax (U).nes
    $ sha1sum "Klax (U).nes"
    80a2ea6e52b96506613912ff9a15657a29c9684a  Klax (U).nes
    $ sha256sum "Klax (U).nes"
    d010708d6e4bfd208d9ce0a5ae55a6319700b05d87eabbebc1df5527781773e0  Klax (U).nes

I also decided to change the title of "Caverns of Cthulu" in Options.
This required figuring out a "table" for the character encoding used
on that screen.  It turned out that glyphs are in the same order as
ASCII, with $80-$B9 in _Klax_ corresponding to $21-$5A in ASCII.
Space is $BD.  With "Klax (U).tbl" loaded into FCEUX's hex editor,
I changed the title to `AT_DOOM'S_`/`GATE__`, filling unused parts of
the string with spaces in order not to waste time on pointer hunting.


[Lipx]: https://github.com/kylon/Lipx