コード例 #1
0
ファイル: CommonTest.cs プロジェクト: ilahsa/bai_pro
        public void FlagUtils_TestAll()
        {
            Assert.IsTrue(FlagUtils.GetOrder(0x08) == 3);
            Assert.IsTrue(FlagUtils.GetOrder(0x01) == 0);
            Assert.IsTrue(FlagUtils.GetMask(0) == 1);
            Assert.IsTrue(FlagUtils.GetMask(2) == 4);

            int test1 = 0x1010;

            Assert.IsTrue(FlagUtils.GetBit(test1, 0x1000) == true);
            Assert.AreEqual(FlagUtils.GetBit(test1, 0x0100), false);
            Assert.AreEqual(FlagUtils.GetBit(test1, 0x0010), true);

            test1 = FlagUtils.SetBit(test1, 0x0100, true);
            Assert.AreEqual(test1, 0x1110);

            test1 = FlagUtils.SetBit(test1, 0x1000, false);
            Assert.AreEqual(test1, 0x0110);

            int test2 = 0x1055;

            Assert.AreEqual(FlagUtils.GetBits(test2, 0x00f0), 5);
            Assert.AreEqual(FlagUtils.GetBits(test2, 0x000f), 5);

            test2 = FlagUtils.SetBits(test2, 0x00f0, 6);
            Assert.AreEqual(test2, 0x1065);

            test2 = FlagUtils.SetBits(test2, 0x000f, 8);
            Assert.AreEqual(test2, 0x1068);
        }
コード例 #2
0
        public void ShiftRightLogic(ref byte target, ref byte flags)
        {
            bool carry = (target & 1) > 0;

            target = (byte)(target >> 1);
            FlagUtils.SetFlags(ref flags, target == 0, false, false, carry);
        }
コード例 #3
0
        public void ShiftLeftArithmetic(ref byte target, ref byte flags)
        {
            bool setCarry = (target & 0x80) > 0;

            target = (byte)((target << 1) & 0xFF);
            FlagUtils.SetFlags(ref flags, target == 0, false, false, setCarry);
        }
コード例 #4
0
ファイル: MiscUnit.cs プロジェクト: jarkkopa/GeemuBoy
        public void DecimalAdjust(ref byte register, ref byte flags)
        {
            bool subtract  = FlagUtils.GetFlag(Flag.N, flags);
            bool carry     = FlagUtils.GetFlag(Flag.C, flags);
            bool halfCarry = FlagUtils.GetFlag(Flag.H, flags);

            if (subtract)
            {
                if (carry)
                {
                    register -= 0x60;
                }
                if (halfCarry)
                {
                    register -= 0x6;
                }
            }
            else
            {
                if (register > 0x99 || carry)
                {
                    register += 0x60;
                    FlagUtils.SetFlag(Flag.C, true, ref flags);
                }
                if ((register & 0xF) > 0x9 || halfCarry)
                {
                    register += 0x6;
                }
            }
            FlagUtils.SetFlag(Flag.Z, register == 0x00, ref flags);
            FlagUtils.SetFlag(Flag.H, false, ref flags);
        }
コード例 #5
0
 public void CallConditional(ushort address, ref ushort sp, ref ushort pc, Flag flag, bool condition, byte flags)
 {
     if (FlagUtils.GetFlag(flag, flags) == condition)
     {
         Call(address, ref sp, ref pc);
     }
 }
コード例 #6
0
 public void JumpRelativeConditional(byte value, ref ushort pc, Flag flag, bool condition, byte flags)
 {
     if (FlagUtils.GetFlag(flag, flags) == condition)
     {
         JumpRelative(value, ref pc);
     }
 }
コード例 #7
0
 public void JumpToAddressConditional(ushort address, ref ushort pc, Flag flag, bool condition, byte flags)
 {
     if (FlagUtils.GetFlag(flag, flags) == condition)
     {
         JumpToAddress(address, ref pc);
     }
 }
コード例 #8
0
ファイル: Extractor.cs プロジェクト: isabella232/0install-win
        /// <summary>
        /// Creates a stream for writing an extracted file to the filesystem.
        /// </summary>
        /// <param name="relativePath">A path relative to the archive's root.</param>
        /// <param name="executable"><see langword="true"/> if the file's executable bit is set; <see langword="false"/> otherwise.</param>
        /// <returns>A stream for writing the extracted file.</returns>
        protected FileStream OpenFileWriteStream([NotNull] string relativePath, bool executable = false)
        {
            CancellationToken.ThrowIfCancellationRequested();

            string fullPath      = CombinePath(relativePath);
            string directoryPath = Path.GetDirectoryName(fullPath);

            if (directoryPath != null && !Directory.Exists(directoryPath))
            {
                Directory.CreateDirectory(directoryPath);
            }

            bool alreadyExists = File.Exists(fullPath);
            var  stream        = File.Create(fullPath);

            // If a symlink is overwritten by a normal file, remove the symlink flag
            if (alreadyExists)
            {
                string flagRelativePath = string.IsNullOrEmpty(Destination) ? relativePath : Path.Combine(Destination, relativePath);
                FlagUtils.Remove(Path.Combine(TargetDir, FlagUtils.SymlinkFile), flagRelativePath);
            }

            if (executable)
            {
                SetExecutableBit(relativePath);
            }
            else if (alreadyExists)
            {
                RemoveExecutableBit(relativePath);                     // If an executable file is overwritten by a non-executable file, remove the xbit flag
            }
            return(stream);
        }
コード例 #9
0
        public void ShiftRightArithmetic(ref byte target, ref byte flags)
        {
            byte msb      = (byte)(target & 0x80);
            bool setCarry = (target & 1) > 0;

            target = (byte)((target >> 1) | msb);
            FlagUtils.SetFlags(ref flags, target == 0, false, false, setCarry);
        }
コード例 #10
0
        public void RotateRightThroughCarry(ref byte register, ref byte flags, bool alwaysResetZero)
        {
            int  carry    = FlagUtils.GetFlag(Flag.C, flags) ? 0x80 : 0x0;
            bool setCarry = register.IsBitSet(0);

            register = (byte)((register >> 1) | carry);
            FlagUtils.SetFlags(ref flags, !alwaysResetZero && register == 0, false, false, setCarry);
        }
コード例 #11
0
        public void Swap(ref byte register, ref byte flags)
        {
            int lower  = register & 0xF;
            int higher = register & 0xF0;

            register = (byte)(higher >> 4 | lower << 4);
            FlagUtils.SetFlags(ref flags, register == 0, false, false, false);
        }
コード例 #12
0
 public void ReturnConditional(ref ushort sp, ref ushort pc, Flag flag, bool condition, byte flags)
 {
     TickEvent?.Invoke();
     if (FlagUtils.GetFlag(flag, flags) == condition)
     {
         Return(ref sp, ref pc);
     }
 }
コード例 #13
0
ファイル: ALU.cs プロジェクト: jarkkopa/GeemuBoy
 public void Xor(ref byte to, byte value, ref byte flags)
 {
     to = (byte)(to ^ value);
     FlagUtils.SetFlags(ref flags,
                        to == 0,
                        false,
                        false,
                        false);
 }
コード例 #14
0
ファイル: ALU.cs プロジェクト: jarkkopa/GeemuBoy
        public void Increment(ref byte target, ref byte flags)
        {
            byte origValue = target;

            target++;
            FlagUtils.SetFlag(Flag.Z, target == 0, ref flags);
            FlagUtils.SetFlag(Flag.N, false, ref flags);
            FlagUtils.SetFlag(Flag.H, (origValue & 0x0F) + 1 > 0x0F, ref flags);
        }
コード例 #15
0
ファイル: ALU.cs プロジェクト: jarkkopa/GeemuBoy
 public void And(ref byte to, byte value, ref byte flags)
 {
     to = (byte)(to & value);
     FlagUtils.SetFlags(ref flags,
                        to == 0,
                        false,
                        true,
                        false);
 }
コード例 #16
0
ファイル: FlagUtilsTests.cs プロジェクト: jarkkopa/GeemuBoy
        public void GetFlagTest()
        {
            byte flags = 0b01010000;

            Assert.False(FlagUtils.GetFlag(Flag.Z, flags));
            Assert.True(FlagUtils.GetFlag(Flag.N, flags));
            Assert.False(FlagUtils.GetFlag(Flag.H, flags));
            Assert.True(FlagUtils.GetFlag(Flag.C, flags));
        }
コード例 #17
0
ファイル: ALU.cs プロジェクト: jarkkopa/GeemuBoy
        public void Decrement(ref byte target, ref byte flags)
        {
            byte origValue = target;

            target--;
            FlagUtils.SetFlag(Flag.Z, target == 0, ref flags);
            FlagUtils.SetFlag(Flag.N, true, ref flags);
            FlagUtils.SetFlag(Flag.H, (origValue & 0x0F) < 1, ref flags);
        }
コード例 #18
0
ファイル: LoadUnit.cs プロジェクト: jarkkopa/GeemuBoy
 public void PopWithFlags(ref byte valueHigh, ref byte valueLow, ref ushort pointer, ref byte flags)
 {
     Pop(ref valueHigh, ref valueLow, ref pointer);
     FlagUtils.SetFlags(ref flags,
                        valueLow.IsBitSet(7),
                        valueLow.IsBitSet(6),
                        valueLow.IsBitSet(5),
                        valueLow.IsBitSet(4));
     flags = (byte)(flags & 0xF0);
 }
コード例 #19
0
ファイル: ALU.cs プロジェクト: jarkkopa/GeemuBoy
        public void Compare(byte to, byte value, ref byte flags)
        {
            byte result = (byte)((to - value) & 0xFF);

            FlagUtils.SetFlags(ref flags,
                               result == 0,
                               true,
                               (to & 0x0F) < (value & 0x0F),
                               to < value);
        }
コード例 #20
0
ファイル: FlagUtilsTests.cs プロジェクト: jarkkopa/GeemuBoy
        public void SetFlagTest()
        {
            byte flags = 0b01110000;

            FlagUtils.SetFlags(ref flags,
                               true,
                               true,
                               true,
                               true);

            Assert.Equal(0b11110000, flags);
        }
コード例 #21
0
    void Retarget()
    {
        List <GameObject> flags = FlagUtils.FindAllEnemyFlags(transform.parent);

        if (flags.Count > 0)
        {
            // get random index in filtered array
            int index = Random.Range(0, flags.Count);
            targetPos = flags[index].transform.position;
            InfoBox.PrependLine("Retarget successful: " + index + " / " + flags.Count);
        }
    }
コード例 #22
0
ファイル: ALU.cs プロジェクト: jarkkopa/GeemuBoy
        public void DecrementInMemory(byte addrHigh, byte addrLow, ref byte flags)
        {
            ushort address   = BitUtils.BytesToUshort(addrHigh, addrLow);
            byte   origValue = memory.ReadByte(address);

            TickEvent?.Invoke();
            memory.WriteByte(address, (byte)(origValue - 1));
            FlagUtils.SetFlag(Flag.Z, (byte)(origValue - 1) == 0, ref flags);
            FlagUtils.SetFlag(Flag.N, true, ref flags);
            FlagUtils.SetFlag(Flag.H, (origValue & 0x0F) < 1, ref flags);
            TickEvent?.Invoke();
        }
コード例 #23
0
ファイル: FlagUtilsTests.cs プロジェクト: jarkkopa/GeemuBoy
        public void ResetFlagsTest()
        {
            byte flags = 0b01010000;

            FlagUtils.SetFlags(ref flags,
                               false,
                               false,
                               false,
                               false);

            Assert.Equal(0b00000000, flags);
        }
コード例 #24
0
ファイル: ALU.cs プロジェクト: jarkkopa/GeemuBoy
        public void Add(ref byte to, byte value, ref byte flags, bool addCarryFlag = false)
        {
            int  additionalValue = addCarryFlag && FlagUtils.GetFlag(Flag.C, flags) ? 1 : 0;
            byte origValue       = to;
            int  newValue        = to + value + additionalValue;

            to = (byte)(newValue & 0xFF);
            FlagUtils.SetFlags(ref flags,
                               to == 0,
                               false,
                               (origValue & 0x0F) + (value & 0x0F) + additionalValue > 0x0F,
                               newValue > 0xFF);
        }
コード例 #25
0
ファイル: ALU.cs プロジェクト: jarkkopa/GeemuBoy
        public void AddSigned(ref ushort to, byte value, ref byte flags)
        {
            ushort originalValue = to;
            sbyte  valueSigned   = unchecked ((sbyte)value);

            to = (ushort)(to + valueSigned);
            FlagUtils.SetFlag(Flag.Z, false, ref flags);
            FlagUtils.SetFlag(Flag.N, false, ref flags);
            FlagUtils.SetFlag(Flag.H, (originalValue & 0x0F) + (value & 0x0F) > 0x0F, ref flags);
            FlagUtils.SetFlag(Flag.C, (originalValue & 0xFF) + value > 0xFF, ref flags);
            TickEvent?.Invoke();
            TickEvent?.Invoke();
        }
コード例 #26
0
ファイル: ALU.cs プロジェクト: jarkkopa/GeemuBoy
        public void Subtract(ref byte from, byte value, ref byte flags, bool subtractCarryFlag = false)
        {
            int  additionalValue = subtractCarryFlag && FlagUtils.GetFlag(Flag.C, flags) ? 1 : 0;
            byte origValue       = from;
            int  newValue        = from - value - additionalValue;

            from = (byte)(newValue & 0xFF);
            FlagUtils.SetFlags(ref flags,
                               from == 0,
                               true,
                               (origValue & 0x0F) - (value & 0xF) - (additionalValue & 0xF) < 0,
                               origValue < (value + additionalValue));
        }
コード例 #27
0
        /// <summary>
        /// Determines whether a file is executable.
        /// </summary>
        protected bool IsExecutable([NotNull] string path)
        {
            #region Sanity checks
            if (string.IsNullOrEmpty(path))
            {
                throw new ArgumentNullException(nameof(path));
            }
            #endregion

            return
                (FileUtils.IsExecutable(path) ||
                 FlagUtils.GetFiles(FlagUtils.XbitFile, BaseDirectory.FullName).Contains(path));
        }
コード例 #28
0
ファイル: ALU.cs プロジェクト: jarkkopa/GeemuBoy
        public void Add(ref byte toHigh, ref byte toLow, byte valueHigh, byte valueLow, ref byte flags)
        {
            ushort to     = BitUtils.BytesToUshort(toHigh, toLow);
            ushort value  = BitUtils.BytesToUshort(valueHigh, valueLow);
            ushort result = (ushort)((to + value) & 0xFFFF);

            toHigh = BitUtils.MostSignificantByte(result);
            toLow  = BitUtils.LeastSignificantByte(result);
            // Zero flag is not affected
            FlagUtils.SetFlag(Flag.N, false, ref flags);
            FlagUtils.SetFlag(Flag.H, (to & 0xFFF) + (value & 0xFFF) > 0xFFF, ref flags);
            FlagUtils.SetFlag(Flag.C, to + value > 0xFFFF, ref flags);
            TickEvent?.Invoke();
        }
コード例 #29
0
        public void RotateRight(ref byte register, ref byte flags, bool alwaysResetZero)
        {
            bool setCarry = register.IsBitSet(0);

            register = (byte)((register >> 1) | (setCarry ? 1 << 7 : 0));
            if (alwaysResetZero)
            {
                FlagUtils.SetFlags(ref flags, false, false, false, setCarry);
            }
            else
            {
                FlagUtils.SetFlags(ref flags, register == 0, false, false, setCarry);
            }
        }
コード例 #30
0
ファイル: LoadUnit.cs プロジェクト: jarkkopa/GeemuBoy
        public void LoadAdjusted(ref byte destHigh, ref byte destLow, ushort value, byte addValue, ref byte flags)
        {
            ushort originalValue = value;
            sbyte  signed        = unchecked ((sbyte)addValue);

            FlagUtils.SetFlag(Flag.C, ((originalValue & 0xFF) + addValue) > 0xFF, ref flags);
            FlagUtils.SetFlag(Flag.H, (originalValue & 0x0F) + (addValue & 0x0F) > 0xF, ref flags);
            ushort result = (ushort)(value + signed);

            destHigh = BitUtils.MostSignificantByte(result);
            destLow  = BitUtils.LeastSignificantByte(result);
            FlagUtils.SetFlag(Flag.Z, false, ref flags);
            FlagUtils.SetFlag(Flag.N, false, ref flags);
            TickEvent?.Invoke();
        }