News: 11 March 2016 - Forum Rules
Current Moderators - DarkSol, KingMike, MathOnNapkins, Azkadellia, Danke

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Topics - Mauron

Pages: [1]

What does the part before the hand say? I know from context it has something to do with the equipped weapon.

Programming / [SNES] Is CMP #$00 necessary in this situation?
« on: May 18, 2014, 07:29:36 pm »
Code: [Select]
LDA $CC0000,x
CMP #$00

From my understanding, LDA will set the z flag if the value loaded is 0, and bne will branch if the z flag is clear, so the CMP is unnecessary.

I just wanted to make sure I'm right on this.

ROM Hacking Discussion / Help writing a readme file.
« on: July 13, 2011, 09:42:53 am »
I wasn't sure where best to stick this. I've completed a few Temporal Flux plugins, and will be releasing them once I have a readme for them written.

1) Requirements
Temporal Flux 3.01, and the .Net Framework 2.0.
2) Installation
Copy MonsterPlugin.dll to the Temporal Flux directory.
3) Uninstallation
Delete MonsterPlugin.dll
4) Usage
Open any of the three SNES ROM versions (US, Japanese, or Pre-Release) in Temporal Flux, and choose Monster Editor from the Plugins menu.
5) Contact
For any questions or theories about unknown bytes, message Mauron on or email with Temporal Flux somewhere in the subject line.
6) Thanks
Geiger, for Temporal Flux, and the numerous people whose research over the years made this program possible.

This is for one of them. Any suggestions would be helpful.

We the Maurons, in order to form a more perfect ROMhack... wait, wrong script.

Let's just skip to the Q&A.

Q: Isn't there already a tech editor for Chrono Trigger?

A: Yes. Unfortunately, it was not, and will not, be completed. I greatly respect the previous author for what he did, but due to certain circumstances, he's unable to complete it.

Q: So there's two now? How do I know which one to use?

A: Mine should now have all the functionality of the old one. For the 4 byte headers, mine takes care of those when saving. For graphics and sound data, mine has more research included.

Q: When will yours be complete?

A: When I get there. I'd like to be more helpful, but then I'd likely miss the date.

Q: The old editor displays things differently! Why?

A: You're either referring to the new boxes, or "missing" objects. The new boxes are different object types, which was discovered after the last release of the old editor. The "missing" objects were actually the"miss" animation for a tech. They're displayed properly now.

Q: Can I have a link?

A: Sure Hi-Tech Beta 30!

Here's a sample video. It demonstrates a small tweak possible with the editor.

Edit: Updated link.

Every game on a system has a lot in common. At the simplest level, the data is the same (bytes and integers and strings, oh my). Even at higher levels, we have similarities.

What if someone (me) made a framework that could handle the things any editor might need, and provided it to the community as a framework? I was thinking of providing the following:

  • Reading data from the ROM.
  • Writing data to the ROM.
  • Handling pointers.
  • Displaying graphics.
  • Tracking used and free space.
  • Allowing for plugins, to keep everything for a game under one roof.

I've begun making something along these lines for the editor I'm developing now - The real question is it worth releasing as a separate entity? It's for the SNES, and developed in a .Net language (C# is my choice, but if the dlls are distributed, any .Net language could use them).

What are everyone's thoughts?

Programming / [Ogre Battle/LZSS] I can't get my compression routine correct.
« on: September 21, 2010, 05:42:58 pm »
Comments on problem are in the routine below. It borrows heavily from Geiger's routine for Chrono Trigger.

Code: [Select]
public List<byte> Decompressed = new List<byte>();
        public List<byte> Compressed = new List<byte>();
        public int CompressedSize;
        public int UncompressedSize;
        public bool ReadyToSave = false;
        public List<byte> Original = new List<byte>();
        private int ROMPosition;

        public bool Compress(List<byte> RawData, bool IncreasedSize)
            int MaxSize = IncreasedSize ? RawData.Count : UncompressedSize;
            Compressed.Add((byte)(MaxSize & 0xFF));
            Compressed.Add((byte)((MaxSize & 0xFF00) / 0x100));
            short j;
            short k;
            byte BitCounter;
            ushort Offset;
            ushort CopyLength;
            int SourcePosition;
            ushort WorkingPosition;
            byte[] TempData = new byte[0x10000];
            ushort PacketHeaderOffset;
            ushort Range;
            ushort CurrentSize = 0xFFFF;
            ushort MaxCopy = 34;

            Range = (ushort) 0x07FF;
            SourcePosition = 0;
            BitCounter = 0;
            Offset = 0;
            CopyLength = 0;
            WorkingPosition = 3;
            PacketHeaderOffset = 2;
            while(SourcePosition < MaxSize && WorkingPosition < CurrentSize)
                 for(; BitCounter < 8 && SourcePosition < MaxSize; BitCounter++)
                     if (SourcePosition > Range)
                         j = (short) (SourcePosition - Range);
                         j = 0;
                     for(; j < SourcePosition; j++)
                         for (k = 0; SourcePosition + k < MaxSize && RawData[j + k] == RawData[SourcePosition + k]; k++)
                         if (k > CopyLength)  //Should this be >= ? If I do that, it fixes some things but breaks others?
                             Offset = (ushort)j;
                             CopyLength = (ushort)k;
                     if (CopyLength > MaxCopy) // This was my latest experiment. Not sure if it's right at all.
                         Offset += (ushort)(CopyLength - MaxCopy);
                         CopyLength = MaxCopy;
                     if(CopyLength > 2)
                         TempData[PacketHeaderOffset] |= (byte) (1 << BitCounter);
                         Offset = (ushort)(0x800 - (SourcePosition - Offset));
                         TempData[WorkingPosition++] = (byte)((((Offset >> 8) & 0x07)) | (CopyLength - 3) << 3);
                         TempData[WorkingPosition++] = (byte)(Offset & 0xFF);
                         SourcePosition += CopyLength;
                         CopyLength = 0;
                         TempData[WorkingPosition++] = RawData[SourcePosition++];
                 if(BitCounter == 8)
                     BitCounter = 0;
                     TempData[PacketHeaderOffset] = (byte)~TempData[PacketHeaderOffset];
                     PacketHeaderOffset = WorkingPosition;
            if(WorkingPosition < MaxSize)
                if(BitCounter > 0)
                    TempData[PacketHeaderOffset] |= (byte) (0xFF << BitCounter); // Lots commented here because I hadn't started playing with that part yet.
                    //Array.Copy(TempData, PacketHeaderOffset, TempData, PacketHeaderOffset + 3, WorkingPosition - PacketHeaderOffset);
                    //TempData[PacketHeaderOffset] = (byte) (BitCounter | 0xC0);
                    //CurrentSize = (ushort) (WorkingPosition + 3);
                    //TempData[PacketHeaderOffset + 1] = (byte) CurrentSize;
                    //TempData[PacketHeaderOffset + 2] = (byte) (CurrentSize >> 8);
                    //TempData[WorkingPosition + 3] = 0;
                    CurrentSize = (ushort) (PacketHeaderOffset + 1);
                    TempData[PacketHeaderOffset] = (byte) 0xC0;
                CurrentSize = (ushort)(PacketHeaderOffset - 4);
                TempData[0] = (byte) (CurrentSize & 0xFF);
                TempData[1] = (byte) (CurrentSize >> 8);
            CurrentSize = (ushort)(PacketHeaderOffset - 2);
            for (int i = 0; i < CurrentSize; i++)
            if ((CurrentSize + 2) >= CompressedSize && !IncreasedSize)
                ReadyToSave = false;
                ReadyToSave = true;
            return ReadyToSave;

Pages: [1]