Beispiel #1
0
        private static object ReadOperand(QuasarRam memory, ref uint address, AddressingMode am)
        {
            switch (am)
            {
            case AddressingMode.DIRECT_REGISTER:
                address++;
                return((Register)memory[address - 1]);

            case AddressingMode.CONDITION_CODE:
                address++;
                return((byte)memory[address - 1]);

            case AddressingMode.INDIRECT_REG8:
            case AddressingMode.INDIRECT_REG16:
            case AddressingMode.INDIRECT_REG32:
                Register reg   = (Register)memory[address];
                byte[]   bytes = new byte[2];
                memory.Read(address + 1, 2, 0, bytes);
                address += 3;
                return(new IndirectOffset(reg, BitConverter.ToInt16(bytes, 0)));

            case AddressingMode.IMMEDIATE_32:
                address += 4;
                return(memory.ReadInt32(address - 4));
            }
            return(null);
        }
Beispiel #2
0
 public Emulator(QuasarRam memory)
 {
     Console.WriteLine(memory.Limit.ToString("x8"));
     this.memory = memory;
     this.peripheralController = new PeripheralController(this);
     this.interruptController  = new InterruptController();
     this.RegisterDevice(this.interruptController);
     this.RegisterDevice(this.peripheralController);
     this.RegisterDevice(new DeviceIntervalTimer());
 }
Beispiel #3
0
        public static Instruction Fetch(QuasarRam memory, uint address)
        {
            uint           org_add     = address;
            byte           original    = memory[address++];
            Opcode         op          = (Opcode)(original & 0x7f);
            AddressingMode am1         = AddressingMode.NONE;
            AddressingMode am2         = AddressingMode.NONE;
            bool           hasOperands = ((int)original & 128) == 0;

            if (hasOperands)
            {
                byte descr = memory[address++];
                am1 = (AddressingMode)(descr & 0x0F);
                am2 = (AddressingMode)((descr & 0xF0) >> 4);
                object op1  = ReadOperand(memory, ref address, am1);
                object op2  = ReadOperand(memory, ref address, am2);
                int    size = (int)(address - org_add);
                return(new Instruction(op, size, am1, op1, am2, op2));
            }
            else
            {
                return(new Instruction(op));
            }
        }
Beispiel #4
0
 public Stack(Emulator emu)
 {
     this.memory = emu.Memory;
     this.host   = emu;
 }