Welcome to z64.me. Here you will find a collection of Zelda 64 tools, guides, and patches. If you're a fan of Ocarina of Time or Majora's Mask, you've come to the right place.

For new visitors who found their way here on their quest for beta content, you may be looking for this.


RIP in peace, Google Sites

posted by z64me   [ updated ]

Legacy Google Sites are being discontinued, so I'm mirroring everything over to old.z64.me. This is a great opportunity to break away from the Web 1.0 meme and do something new with the website.

z64compress release

posted Apr 29, 2021, 8:48 PM by z64me   [ updated Apr 29, 2021, 8:48 PM]

My Zelda 64 rom compressor. Find it on GitHub.

new play-as pipeline released

posted Feb 12, 2021, 7:37 AM by z64me   [ updated Feb 12, 2021, 7:37 AM]

It is pretty much final now.

The new Blender tutorial explains how to use everything.

A huge thank you to everyone who contributed. :)

Can't wait for the bug reports. ;(

gfxasm source code released

posted Dec 4, 2020, 10:31 AM by z64me   [ updated Dec 4, 2020, 10:32 AM]

Something I've been meaning to open-source since I wrote it.

Find it on GitHub.

zzrtl revision 4

posted Aug 20, 2020, 12:57 PM by z64me   [ updated Aug 20, 2020, 1:14 PM]

Remember this junk from the manual?

`repack` should always be false (0)
unless you modify MM's packing functionality;
this makes it so the re-encoded files fit at
the offsets of the original files within the
archives (this is to get around MM's hard-coded
references to the assets; if you happen to use
custom code for MM archive parsing, you can use
true (1)

It turns out that was dead wrong. The actual problem was, certain parts of a certain (few?) archive(s)'s file table(s) were being overwritten thanks to a hiccup in my alignment code. Thankfully, Aroenai was able to pinpoint one of these broken files and the bug was fixed in no time.

One less thing to haunt me; thanks again, Aroenai!

r4 credits
    - Aroenai - MM yaz archive bug report and testing

r4 changes
    - relocating yaz files within archives was not
      working properly due to alignment, but now it
      is; thanks for the bug report, Aroenai!

zztexview rev 1

posted Apr 30, 2020, 4:18 PM by z64me   [ updated Apr 30, 2020, 4:18 PM]

Bug fix: could not edit value/text boxes after clicking drop-downs
Bug fix: "Scale" drop-down text now wraps properly when scrolling on it
Bug report credits: AriaHiro, Zeldaboy14

zztexview released

posted Apr 29, 2020, 4:33 PM by z64me   [ updated Apr 29, 2020, 4:34 PM]

zzrtl revision 3

posted Apr 13, 2020, 3:14 PM by z64me   [ updated Apr 13, 2020, 3:14 PM]

r3 credits
    - /Zel/ - MM script collaboration

r3 changes
    - final changes to make MM scripts possible
    - MM scripts are now available
    - updated OoT scripts
    - dump scripts now work on compressed roms
    - extension assertion: zzrtl now complains if
      provided with a file not of the extension .rtl
    - raw data assertion: zzrtl now complains if
      provided with a file that doesn't contain some
      form of "int main" (e.g. an html file saved
      with the .rtl extension)
    - added a function file_exists(fn) to check if a
      file exists (returns 1 if it does, 0 otherwise)
    - rom.inject_dma() function added for injecting
      a file over a known existing DMA entry
      (file-size must match file being overwritten)
      (rom.inject_raw_dma() also available)
    - rom.extract_dma() function added for extracting
      a file of a known DMA index
    - .next() and .remaining() are now able to be
      used with conf files of type list, for the
      purpose of stepping through list items
    - .name() and .value() functions for retrieving
      the name and value (as strings) of the
      selected conf list item have been added
    - an int_array() function to make up for zzrtl
      not supporting int array[32]; type declarations
    - a new_string() function for easy string building
    - rom version checking to reduce weird errors
      encountered from using a dump/build script with
      a rom not supported by it
    - loadfile() function added
    - tsv_col_row() function added

zzplayas revision 3

posted Mar 17, 2020, 10:18 AM by z64me   [ updated Mar 17, 2020, 10:19 AM]

This revision eliminates a rare bug that was encountered when an old pointer and a new pointer share the same offset.

zzrtl project files are now supported as well. If you used an older dump script to generate your filesystem, you will have to edit your project.zzrpl file in Notepad++ so that the variables used by zzplayas are prefixed with ZZPLAYAS_, like so:

zzrtl                   v0.01
baserom                 "baserom.z64"
ZZPLAYAS_VROM_CODE      "'baserom.z64'+0x00B3C000"
ZZPLAYAS_VROM_PLAYER    "'baserom.z64'+0x00CA7F00"

The scripts on the repo have been updated to reflect this change.

Due to popular demand, the command line utility zzobjman.exe is included in the win32 folder of this release.

As always, you can find the update on the zzplayas download page.

Bug report and testing credits for this version: CrookedPoe and Skilar

zzrtl revision 2, and some more codecs

posted Feb 10, 2020, 12:43 PM by z64me   [ updated Feb 10, 2020, 12:44 PM]

r2 changes
    - faster compression
    - compression ratio is now printed afterwards
    - removed zx7 codec (was slower than ucl and
      had a worse compression ratio than ucl)
    - added aplib codec (better ratio than ucl, and
      faster load times than ucl on Wii VC; the only
      downside is roms take a few minutes to compress)
    - lzo and aplib patches are now available

r2 credits
    - Mikau6 - hardware testing

zzrtl revision 1, codec patches

posted Feb 1, 2020, 8:29 PM by z64me   [ updated Feb 1, 2020, 8:29 PM ]

zzrtl has received the following updates. Also, codec patches are now available.

r1 changes
    - added compression codecs ucl, xz7, slowyaz
    - added support for deleted files in MM dmadata
      specification (aka pstart == pend == -1)
    - added rearchive(), file_dma(), and cloudpatch()
    - added --compress command line argument so zzrtl
      can be used as a standalone rom compressor
    - added --nocache command line argument for doing
      compression without generating a cache folder
    - added --cloudpatch command line argument for
      easy command line cloudpatching
    - added --help command line argument so a massive
      wall of documentation doesn't pop up and scare
      double-clickers away
    - stability improvements
    - when compressing a file makes it larger, its
      uncompressed counterpart is used instead
    - better compressed file packing

r1 notes
    - individual files compressed with slowyaz are
      byte-identical to those in retail roms; aside
      from weird corner cases, there is no reason
      you should use slowyaz; it is slower than yaz
      and produces files slightly larger than yaz...
    - it should now contain everything necessary
      to support Majora's Mask

r1 credits
    - Mikau6, CrookedPoe - hardware testing

zzrtl revision 0

posted Jan 12, 2020, 7:40 PM by z64me   [ updated Jan 12, 2020, 7:40 PM ]

Eliminated compression bug. Testing credits go to AriaHiro.

zzrtl initial release

posted Jan 12, 2020, 2:04 AM by z64me   [ updated Jan 12, 2020, 2:04 AM ]

it is here

zzplayas revision 2

posted Oct 10, 2019, 12:23 AM by z64me   [ updated Oct 10, 2019, 12:23 AM ]

  • Now supports DE and DA opcodes when parsing the bank ZOBJs, like MM Link's object.
  • The OBJECT section now has a pool feature for aliasing display lists. It will be possible to hot swap all ZOBJs created using the same manifest, so long as this feature is adequately employed.
  • Now supports exporting to ZOBJ (you must select a ZOBJ to overwrite).
  • OBJECT and REPOINT sections now have a HexString(x) function.
Further details lie in the manual.

And you can grab the latest revision here.

zzconvert revision 7

posted Jul 6, 2019, 9:07 PM by z64me   [ updated Jul 6, 2019, 9:07 PM ]

Hierarchical display lists derived from riggedmesh were sometimes breaking on some processors due to features introduced in revision 6. This revision fixes that problem.

Bug report credits: AriaHiroDKD

zzromtool revision 4, zzconvert revision 6

posted Jun 30, 2019, 5:25 PM by z64me   [ updated Jul 10, 2019, 9:59 PM ]

zzromtool improvements
  • scene folder and entrance-cutscenes.txt names should now be fixed for good
  • can now use patching system on actor overlays and code1
  • roms dumped with r2 now rebuild with r4 (bug report credit AriaHiroDKD)
zzconvert improvements
  • Can now write ZOBJ as C code for embedding into an actor overlay (like the Arwing, spells, and elemental arrows).
  • C output #define values are now prefixed with 0x as they should be.
  • Collision (group names ending in _COLLISION are treated as such) (reference the updated manual for information on collision flags)
  • Smoother animations (bug report credit Zel)
  • Animated texture banks are now indexed to 256 colors to reduce potential errors
  • Group names ending in _OBJECT or _COLLISION will be translated such that their Blender origin will be moved to the origin of world space (requires latest OBJEX).

zzromtool 0.01 revision 3

posted Jun 1, 2019, 12:39 AM by z64me   [ updated Jun 1, 2019, 12:39 AM ]

The following changes have been made:
  • The scene names in entrance-cutscenes.txt now work properly.
  • In actor/x/conf.txt, initialization values are no longer written on export. The import functionality still supports them, for those who wish to use them.
  • In actor/x/actor.zovl, the magic string scubadiver no longer overwrites the initialization values, in favor of overwriting unused padding bytes with the values 0xDEAD and 0xBEEF.
  • In actor/x/conf.txt, the Reserve feature has been removed, both on export and import.
  • Patch files in the patch directory that were not applied to any files during the build process will now throw errors so you know they weren't applied.
  • The VRAM address of code1 can now be customized by editing the ZZRP file in a text editor.

zzromtool 0.01 revision 2

posted Apr 2, 2019, 12:21 PM by z64me   [ updated Apr 2, 2019, 12:21 PM ]

Scuba gear is no longer necessary, as a new initialization data search method is now available for those who wish to use it:

In an actor's initialization data, the first two bytes, which normally represent the actor's number, should be replaced with the bytes 0xDEAD. Ten bytes later are two unused padding bytes, which we replace with 0xBEEF. See seagull.c for an example of this applied in C. You may also omit the Initialization section of conf.txt.

Additionally, two new tutorials are live, geared towards setting up mips64gcc and and compiling actor overlays written in C.

zzromtool 0.01 revision 1

posted Feb 4, 2019, 1:28 AM by z64me   [ updated Feb 4, 2019, 1:28 AM ]

Apparently I forgot to test dumping a rom with the previous revision before releasing.

It should work now. 8)

zzromtool 0.01 revision 0

posted Feb 2, 2019, 8:00 PM by z64me   [ updated Feb 2, 2019, 8:00 PM ]

The following updates have been made
  • repoint.tsv allows file size specifier.
  • patch directory to make 3Q integration easier
More details can be found in the manual.

zzromtool 0.01

posted Jan 31, 2019, 11:40 PM by z64me   [ updated Jan 31, 2019, 11:40 PM ]

It's finally stable enough for a public release. Please reference the guides and the manual for all the specifics, as it has its fair share of nuances and a thousand-and-one things that could go wrong when using it.

zzplayas 0.01 revision 1

posted Jan 31, 2019, 11:28 PM by z64me   [ updated Jan 31, 2019, 11:28 PM ]

Now supports non-debug OoT as long as you edit your manifest files accordingly, as well as ZZRP files when using in conjunction with zzromtool. Sample manifest files compatible with 1.0 U can be found here.

zzconvert v0.01 revision 5, zzplayas v0.01 revision 0

posted Jan 24, 2019, 3:03 AM by z64me   [ updated Jan 24, 2019, 6:22 AM ]

In this revision
  • Bone lookup code actually works now, so vertex group ordering should no longer matter.
  • Empty .anim files are dealt with in cases where the Blender exporter fails.
  • RGBA16 texture type now works.
  • Slight differences in exported play-as data, so get the revised zzplayas to keep compatible

Cylindrical billboarding woes

posted Jan 9, 2019, 5:34 PM by z64me   [ updated Jan 9, 2019, 5:57 PM ]

First, some background. If you've ever ported a map from Majora's Mask to Ocarina of Time, chances are you've seen missing or misplaced map meshes.

"What causes this?", you might ask yourself. Let's inspect the display list in a hex editor and find out.

The bytes DA380001 01000040 may catch your attention. These bytes push the matrix 01000040 onto the stack. Ocarina of Time does this all the time for billboards like Navi, bombs, the sun, and the moon, but that's with matrix 01000000. What's so special about matrix 01000040? Let's substitute one for the other and see what happens.

Perfect, everything works now. Case closed. Except, not really. How do these look from above?

Oh no, they are locked to face the camera from all angles! You'll get problems with these posts anytime the camera is looking up or down. When the camera isn't level, something is noticeably wrong with them.

It turns out that all objects using matrix 01000000 (Navi, bombs, the sun, the moon, and more) have one thing in common: they face the camera no matter what angle you view them from. We call this a spherical billboard.

After inspecting the behavior of matrix 01000040 in Majora's Mask, we conclude that all objects that use it are always upright. The objects are still forced to face the camera, but the world's up direction is always respected, so not on that axis. This is called a cylindrical billboard.

You can witness the difference for yourself outside the Astral Observatory in Majora's Mask. It turns out, one of the stars uses a spherical billboard and the other uses a cylindrical billboard. Perhaps the cylindrical billboard matrix was added late in the game's development and they forgot to update this one.

"But Ocarina of Time does that too! What about the flame actors?", you may be thinking. This was very boggling, but it turns out actors that do this in OoT calculate their position relative to the camera and rotate the models so they align to the camera on all axes besides Y (up). In this sense, OoT does cylindrical billboards, but not via a global matrix. We cannot apply this hack on maps.

Since OoT does not create this matrix, 01000040 is junk data. This explains why the map parts that referenced it were floating around strangely.

Now, to write an assembly hack that will create a cylindrical billboard matrix that will be accessible in maps and objects by pushing matrix 01000040 onto the stack, like in MM. Do so without overwriting or breaking the matrix 01000000.

To save you a long story detailing all the trouble it was and how it still isn't perfect, I'll just say that it's usable for the purposes I intended for it to be usable for.

As an additional test, I modeled a lamppost and embedded it into Kokiri Forest's geometry.

The lower right image is a screenshot from Killgore52 (aka E-Gor) showing that the assembly and mesh are hardware compatible. Thanks man!

Finally, here's a zip containing the modified code, spot04_room_0*, and spot04_scene. Do a file comparison between this code and the original to find what has changed. Some notes are also embedded within. If you improve upon it (it needs it), please share your fixes so everyone can use cylindrical billboards that have been refined as much as possible.

* Because content was added to Kokiri Forest, its size increased, so keep that in mind when putting it in the rom for testing!

zzconvert v0.01 revision 4

posted Dec 2, 2018, 4:33 AM by z64me   [ updated Dec 2, 2018, 4:34 AM ]

The following updates are now in place:
  • Sometimes, textures were being sliced incorrectly during optimization due to conflicting optimization types (or lack thereof). It's working better now.
  • Added an annoying pop-up to notify users of when they're using NPOT textures. In the command line version, a warning is printed.
  • Textures <=16x16 are no longer optimized, eliminating this bug.
  • Thanks for all the testing, Skriller!

That'll show 'em. 8)

zzconvert v0.01 revision 3

posted Nov 27, 2018, 11:17 PM by z64me   [ updated Nov 27, 2018, 11:17 PM ]

Remember this feature on the feature page?

Unsupported texture dimensions are automatically scaled to nearest power-of-two size (ex: 27x65 -> 32x64, 512x512 -> 64x64).

It should actually work now. It still hasn't been tested very thoroughly, so the best practice is to use properly-sized textures when possible. Maybe I'll have it print a warning or pop up an annoying message box in the future, but this quick fix will do for now.

zzconvert v0.01 revision 2

posted Oct 24, 2018, 8:15 PM by z64me   [ updated Oct 24, 2018, 8:15 PM ]

The following updates have been made to improve stability and conversion quality:
  • When you try to disable culling on something, it actually works now.
Thanks for the bug report Airikita!

Get the updated version on the download page.

zzconvert revision 1

posted Sep 24, 2018, 10:06 PM by z64me   [ updated Sep 24, 2018, 10:31 PM ]

The following updates have been made to improve stability and conversion quality:
  • Added error checking so it won't crash if UVs or normals are missing.
  • MTL color checkbox wasn't working in the win32-gui build, this is now fixed.
  • Now matches by extension when searching for assembly textures (so no mixing eyes.png with eyes_X.bmp, alright?). Read the manual if you don't know what assembly textures are.
  • Added warning for animation data that exceeds the game's limit (see the manual).
  • Label names in C output are now sanitized.
  • obj.h is now exported alongside the new .zobj, in the same directory. Likewise, C style output is now the default. Disable these features by selecting "No obj.h nor C output" when converting, or use -nh on command line.
Get the updated version on the download page.

zzconvert revision 0

posted Sep 7, 2018, 3:37 PM by z64me   [ updated Sep 7, 2018, 3:37 PM ]

The following updates have been made to improve stability and conversion quality:
  • Fixed F5 opcode optimization which was causing texture glitches on back-to-back references to different textures of the same size.
  • Fixed palette generation bug that was causing issues on textures with variable levels of transparency.
  • Skips bone name lookup for unassigned vertices.
  • Now supports file paths referenced by the .obj[ex] files containing the `#` character.
Get the updated version on the download page.

zzconvert 0.01, zzplayas 0.1, new play-as tutorial

posted Aug 26, 2018, 10:52 PM by z64me   [ updated Aug 26, 2018, 10:52 PM ]

Everyone's been waiting about half a year for this stuff, so get it while it's hot. 8)

zzdec & zzdec-gui released

posted Feb 15, 2018, 1:14 AM by z64me   [ updated Feb 15, 2018, 1:14 AM ]

Get zzdec here.