// functions
        public void Disassemble(int offset)
        {
            byte temp = rom[offset++];

            cloneAmount = (byte)(temp & 0x0F);
            engageType  = (byte)((temp & 0x30) >> 4);
            temp        = rom[offset++];
            speedPlus   = (byte)(temp & 0x07);
            //
            b2b3 = (temp & 0x08) == 0x08;
            b2b4 = (temp & 0x10) == 0x10;
            b2b5 = (temp & 0x20) == 0x20;
            b2b6 = (temp & 0x40) == 0x40;
            b2b7 = (temp & 0x80) == 0x80;
            //
            temp = rom[offset++];
            b3b0 = (temp & 0x01) == 0x01;
            b3b1 = (temp & 0x02) == 0x02;
            b3b2 = (temp & 0x04) == 0x04;
            b3b3 = (temp & 0x08) == 0x08;
            b3b4 = (temp & 0x10) == 0x10;
            b3b5 = (temp & 0x20) == 0x20;
            b3b6 = (temp & 0x40) == 0x40;
            b3b7 = (temp & 0x80) == 0x80;
            //
            b4b0 = (rom[offset] & 0x01) == 0x01;
            b4b1 = (rom[offset] & 0x02) == 0x02;
            //
            npcID = (ushort)((Bits.GetShort(rom, offset++) & 0x0FFF) >> 2);
            //
            movement = (ushort)((Bits.GetShort(rom, offset++) & 0x3FF0) >> 4);
            //
            b7b6 = (rom[offset] & 0x40) == 0x40;
            b7b7 = (rom[offset++] & 0x80) == 0x80;
            //
            ushort tempShort = Bits.GetShort(rom, offset++);

            if (engageType == 2)
            {
                eventORpack = (ushort)(tempShort & 0xFF);
            }
            else
            {
                eventORpack = (ushort)(tempShort & 0xFFF);
            }
            //
            temp = rom[offset++];
            if (engageType == 2)
            {
                afterBattle = (byte)((temp >> 1) & 0x07);
            }
            engageTrigger = Math.Min((byte)((temp & 0xF0) >> 4), (byte)12);
            //
            temp = rom[offset++];
            if (engageType == 0)
            {
                propertyA = (byte)(temp & 0x07);        // npc id+
                propertyB = (byte)((temp & 0xE0) >> 5); // event id+
                propertyC = (byte)((temp & 0x18) >> 3);
            }
            else if (engageType == 1)
            {
                propertyA = temp;  // $70A7
            }
            else if (engageType == 2)
            {
                propertyA = (byte)(temp & 0x0F);        // movement+
                propertyB = (byte)((temp & 0xF0) >> 4); // pack+
            }
            //
            temp = rom[offset++];
            x    = (byte)(temp & 0x7F);
            xb7  = (temp & 0x80) == 0x80;
            temp = rom[offset++];
            y    = (byte)(temp & 0x7F);
            yb7  = (temp & 0x80) == 0x80;
            temp = rom[offset++];
            z    = (byte)(temp & 0x1F);
            f    = (byte)((temp & 0xF0) >> 5);
            //
            for (int i = 0; i < cloneAmount; i++)
            {
                Clone tClone = new Clone();
                tClone.Disassemble(offset, engageType);
                Clones.Add(tClone);
                offset += 4;
            }
        }