Пример #1
0
 private void SetRegisterPair(WordRegister registerPair, ushort value)
 {
     if (registerPair != WordRegister.None)
     {
         Set16BitValue((int)registerPair, value);
     }
 }
 public Micron_MT25Q(MicronFlashSize size, Endianess dataEndianess = Endianess.LittleEndian)
 {
     if (!Enum.IsDefined(typeof(MicronFlashSize), size))
     {
         throw new ConstructionException($"Undefined memory size: {size}");
     }
     this.dataEndianess                    = dataEndianess;
     volatileConfigurationRegister         = new ByteRegister(this, 0xfb).WithFlag(3, name: "XIP");
     nonVolatileConfigurationRegister      = new WordRegister(this, 0xffff).WithFlag(0, out numberOfAddressBytes, name: "addressWith3Bytes");
     enhancedVolatileConfigurationRegister = new ByteRegister(this, 0xff)
                                             .WithValueField(0, 3, name: "Output driver strength")
                                             .WithReservedBits(3, 1)
                                             .WithTaggedFlag("Reset/hold", 4)
                                             //these flags are intentionally not implemented, as they described physical details
                                             .WithFlag(5, name: "Double transfer rate protocol")
                                             .WithFlag(6, name: "Dual I/O protocol")
                                             .WithFlag(7, name: "Quad I/O protocol");
     statusRegister     = new ByteRegister(this).WithFlag(1, out enable, name: "volatileControlBit");
     flagStatusRegister = new ByteRegister(this)
                          .WithFlag(0, FieldMode.Read, valueProviderCallback: _ => numberOfAddressBytes.Value, name: "Addressing")
                          //other bits indicate either protection errors (not implemented) or pending operations (they already finished)
                          .WithReservedBits(3, 1);
     fileBackendSize     = (uint)size;
     isCustomFileBackend = false;
     dataBackend         = DataStorage.Create(fileBackendSize, 0xFF);
     deviceData          = GetDeviceData();
 }
Пример #3
0
        public static WordRegister AsWordRegister(this InstructionElement argument)
        {
            argument = argument switch
            {
                InstructionElement.AddressFromIXAndOffset => InstructionElement.IX,
                InstructionElement.AddressFromIYAndOffset => InstructionElement.IY,
                var a when(a >= InstructionElement.AddressFromHL && a <= InstructionElement.AddressFromSP) => (InstructionElement)(a - 6),
                _ => argument
            };

            // this looks clunky but it's *much* faster than using Enum.ToString()
            WordRegister register = argument switch
            {
                InstructionElement.AF => WordRegister.AF,
                InstructionElement.BC => WordRegister.BC,
                InstructionElement.DE => WordRegister.DE,
                InstructionElement.HL => WordRegister.HL,
                InstructionElement.IX => WordRegister.IX,
                InstructionElement.IY => WordRegister.IY,
                InstructionElement.SP => WordRegister.SP,
                _ => WordRegister.None
            };

            return(register);
        }
Пример #4
0
        public Micron_MT25Q(MappedMemory underlyingMemory)
        {
            // original MT25Q supports capacity 8MB to 256MB,
            // but we extended it down to 64KB
            // to become compatible with N25Q line
            if (underlyingMemory.Size < 64.KB() || underlyingMemory.Size > 256.MB() || !Misc.IsPowerOfTwo((ulong)underlyingMemory.Size))
            {
                throw new ConstructionException("Size of the underlying memory must be a power of 2 value in range 64KB - 256MB");
            }

            volatileConfigurationRegister         = new ByteRegister(this, 0xfb).WithFlag(3, name: "XIP");
            nonVolatileConfigurationRegister      = new WordRegister(this, 0xffff).WithFlag(0, out numberOfAddressBytes, name: "addressWith3Bytes");
            enhancedVolatileConfigurationRegister = new ByteRegister(this, 0xff)
                                                    .WithValueField(0, 3, name: "Output driver strength")
                                                    .WithReservedBits(3, 1)
                                                    .WithTaggedFlag("Reset/hold", 4)
                                                    //these flags are intentionally not implemented, as they described physical details
                                                    .WithFlag(5, name: "Double transfer rate protocol")
                                                    .WithFlag(6, name: "Dual I/O protocol")
                                                    .WithFlag(7, name: "Quad I/O protocol");
            statusRegister     = new ByteRegister(this).WithFlag(1, out enable, name: "volatileControlBit");
            flagStatusRegister = new ByteRegister(this)
                                 .WithFlag(0, FieldMode.Read, valueProviderCallback: _ => numberOfAddressBytes.Value, name: "Addressing")
                                 //other bits indicate either protection errors (not implemented) or pending operations (they already finished)
                                 .WithReservedBits(3, 1)
                                 .WithFlag(7, FieldMode.Read, valueProviderCallback: _ => true, name: "ProgramOrErase");

            this.underlyingMemory      = underlyingMemory;
            underlyingMemory.ResetByte = EmptySegment;

            deviceData = GetDeviceData();
        }
Пример #5
0
        public static ushort MarshalSourceWord(this Instruction instruction, InstructionData data, Processor cpu, out ushort address)
        {
            Registers r = cpu.Registers;

            address = 0x0000;

            ushort       value;
            WordRegister source = instruction.Source.AsWordRegister();

            if (source != WordRegister.None)
            {
                value = r[source];
            }
            else
            {
                if (instruction.Argument1 == InstructionElement.ByteValue && instruction.Argument2 == InstructionElement.ByteValue)
                {
                    value = data.ArgumentsAsWord;
                }
                else
                {
                    address = instruction.Source.AsWordRegister() switch
                    {
                        WordRegister.IX => (ushort)(r.IX + (sbyte)data.Argument1),
                        WordRegister.IY => (ushort)(r.IY + (sbyte)data.Argument1),
                        _ => r.HL
                    };

                    value = cpu.Memory.Timed.ReadWordAt(address);
                }
            }

            return(value);
        }
    }
Пример #6
0
 private ushort GetRegisterPair(WordRegister registerPair)
 {
     if (registerPair == WordRegister.None)
     {
         return(0xFF);
     }
     return(Get16BitValue((int)registerPair));
 }
Пример #7
0
        public ExecutionResult Execute(Processor cpu, InstructionPackage package)
        {
            Instruction instruction = package.Instruction;

            WordRegister register = instruction.Target.AsWordRegister();

            cpu.Pop(register);

            return(new ExecutionResult(package, null));
        }
Пример #8
0
        /// <summary>
        /// Used to swap this register with another
        /// </summary>
        /// <param name="Register">Register to swap with this</param>
        public void Swap(WordRegister Register)
        {
            byte hValue = Register._high.Value;
            byte lValue = Register._low.Value;

            Register._high.Value = _high.Value;
            Register._low.Value = _low.Value;

            _high.Value = hValue;
            _low.Value = lValue;
        }
Пример #9
0
        internal void Push(WordRegister register)
        {
            ushort value = Registers[register];

            Registers.SP--;
            Timing.BeginStackWriteCycle(true, value.HighByte());
            Memory.Untimed.WriteByteAt(Registers.SP, value.HighByte());
            Timing.EndStackWriteCycle();

            Registers.SP--;
            Timing.BeginStackWriteCycle(false, value.LowByte());
            Memory.Untimed.WriteByteAt(Registers.SP, value.LowByte());
            Timing.EndStackWriteCycle();
        }
Пример #10
0
        public void EX_xSP_rr(WordRegister wordRegister)
        {
            ushort sp        = 0x4000;
            ushort value     = 0x8020;
            ushort valueAtSP = 0x2080;

            Registers.SP = sp;
            CPU.Memory.Untimed.WriteWordAt(sp, valueAtSP);
            Registers[wordRegister] = value;

            ExecuteInstruction($"EX (SP),{ wordRegister.ToString() }");
            ushort newValueAtSP = CPU.Memory.Untimed.ReadWordAt(sp);

            Assert.That(Registers[wordRegister] == valueAtSP && newValueAtSP == value);
        }
Пример #11
0
        public ExecutionResult Execute(Processor cpu, InstructionPackage package)
        {
            Instruction     instruction = package.Instruction;
            InstructionData data        = package.Data;
            Registers       r           = cpu.Registers;
            byte            offset      = data.Argument1;
            Flags           flags       = cpu.Flags;

            if (instruction.TargetsWordRegister)
            {
                // inc 16-bit
                WordRegister register = instruction.Target.AsWordRegister();
                ushort       value    = r[register];
                r[register] = (ushort)(value + 1);
            }
            else
            {
                byte value = 0;
                if (instruction.TargetsByteInMemory)
                {
                    // inc byte in memory
                    if (instruction.IsIndexed)
                    {
                        cpu.Timing.InternalOperationCycle(5);
                    }
                    value = instruction.MarshalSourceByte(data, cpu, out ushort address, out ByteRegister source);
                    cpu.Memory.Timed.WriteByteAt(address, (byte)(value + 1));
                }
                else
                {
                    // it's an 8-bit inc
                    ByteRegister register = instruction.Target.AsByteRegister();
                    value       = r[register];
                    r[register] = (byte)(value + 1);
                }

                bool carry = flags.Carry;
                flags = FlagLookup.ByteArithmeticFlags(value, 1, false, false);
                flags.ParityOverflow = (value == 0x7F);
                flags.Carry          = carry; // always unaffected
                flags.Subtract       = false;
            }

            return(new ExecutionResult(package, flags));
        }
Пример #12
0
        internal void Pop(WordRegister register)
        {
            byte high, low;

            Timing.BeginStackReadCycle();
            low = Memory.Untimed.ReadByteAt(Registers.SP);
            Timing.EndStackReadCycle(false, low);
            Registers.SP++;

            Timing.BeginStackReadCycle();
            high = Memory.Untimed.ReadByteAt(Registers.SP);
            Timing.EndStackReadCycle(true, high);
            Registers.SP++;

            ushort value = (low, high).ToWord();

            Registers[register] = value;
        }
Пример #13
0
        protected override void PreProcessing()
        {
            base.PreProcessing();
            if (wordSize == 0)
            {
                source = secondByte.Value;
            }
            else
            {
                byte lo = secondByte.Value;
                byte hi = Bus.NextImmediate();
                source = new WordRegister(hi, lo);
            }

            // override default values
            // direction always = 0
            // mod/reg/rm set to use AL/AX and immediate
            direction = 0;
        }
Пример #14
0
        protected override void ExecuteInstruction()
        {
            int source;

            if (wordSize == 0)
            {
                source = secondByte.Value;
            }
            else
            {
                byte lo = secondByte.Value;
                byte hi = Bus.NextImmediate();
                source = new WordRegister(hi, lo);
            }

            // override calculated values
            // direction is always 0
            // mod/reg/rm is adjusted because these instructions are always
            // stored in AL or AX
            direction = 0;
            ADD_Destination(source, 0x03, 0x00, 0x00);
        }
Пример #15
0
        public ExecutionResult Execute(Processor cpu, InstructionPackage package)
        {
            Instruction     instruction = package.Instruction;
            InstructionData data        = package.Data;
            Flags           flags       = cpu.Flags;
            Registers       r           = cpu.Registers;

            if (instruction.TargetsWordRegister)
            {
                // it's one of the 16-bit adds (HL,DE etc)
                WordRegister destination = instruction.Target.AsWordRegister();
                ushort       left        = r[destination];
                ushort       right       = instruction.MarshalSourceWord(data, cpu, out ushort address);

                cpu.Timing.InternalOperationCycle(4);
                cpu.Timing.InternalOperationCycle(3);
                var sum = ALUOperations.Add(left, right, false, false, flags);
                r[destination] = sum.Result;
                flags          = sum.Flags;
                r.WZ           = (ushort)(left + 1);
            }
            else
            {
                // it's an 8-bit add to A
                byte left = r.A;
                if (instruction.IsIndexed)
                {
                    cpu.Timing.InternalOperationCycle(5);
                }
                byte right = instruction.MarshalSourceByte(data, cpu, out ushort address, out ByteRegister source);

                var sum = ALUOperations.Add(left, right, false);
                r.A   = sum.Result;
                flags = sum.Flags;
            }

            return(new ExecutionResult(package, flags));
        }
Пример #16
0
        public Document(string a_text, WordRegister a_register, Languages a_lang = Languages.English)
        {
            this.m_stemmer = GetStemmerByLanguage(a_lang);
            this.m_text    = a_text;
            this.m_words   = new LinkedList <Word> ();

            string[] words = WORD_REGEX.Split(a_text);

            char[] bothSidesTrimChar =
            {
                '\'',
                '«',
                '»',
                '<',
                '>',
                '/',
                ':',
                ';',
                '"',
                '{',
                '}',
                '|',
                '\\',
                '[',
                ']',
                '.',
                ',',
                '~',
                '`',
                '!',
                '?',
                '@',
                '#',
                '%',
                '^',
                '&',
                '*',
                '(',
                ')',
                '_',
                '-',
                '+',
                '='
            };
            char[] endTrimChar = { '$' };
            for (int i = 0; i < words.Length; i++)
            {
                MatchCollection match = WORD_REGEX.Matches(words [i]);
                if (match.Count <= 0 && words [i].Trim().Length > 0)
                {
                    string word = (words [i]);
                    word = word.Trim();
                    word = word.Trim(bothSidesTrimChar);
                    word = word.TrimEnd(endTrimChar);
                    word = word.Trim();

                    if (word != "")
                    {
                        m_words.AddLast(a_register.Register(word, m_stemmer));
                    }

                    Console.WriteLine(i + "/" + words.Length + " : " + word);
                }
            }
        }
Пример #17
0
 public ushort this[WordRegister registerPair] {
     get { return(GetRegisterPair(registerPair)); } set { SetRegisterPair(registerPair, value); }
 }
Пример #18
0
 public NPerceptSource()
 {
     m_documents    = new Dictionary <int, Document> ();
     m_relations    = new Dictionary <DocumentRelation, int> ();
     m_wordRegister = new BaseWordRegister();
 }
        public static WordRegister Bind(this IConvertible o, IProvidesRegisterCollection <WordRegisterCollection> p, WordRegister reg, string name = "")
        {
            if (!o.GetType().IsEnum)
            {
                throw new ArgumentException("This method should be called on enumerated type");
            }

            return(p.RegistersCollection.AddRegister(Convert.ToInt64(o), reg));
        }