Пример #1
0
        public DmaChannel(GameboyAdvance gba, int channelNumber)
        {
            this.gba           = gba;
            this.channelNumber = channelNumber;

            DmaCnt = new DmaControlRegister(this);
        }
Пример #2
0
 public TimerValueRegister(GameboyAdvance gba, GbaTimer timer, Memory memory, UInt32 address) :
     base(memory, address, true, false)
 {
     this.gba     = gba;
     this.timer   = timer;
     this.address = address;
 }
Пример #3
0
 public BgAffineMatrix(GameboyAdvance gba, UInt32 address)
 {
     pa = new MemoryRegister16(gba.Memory, address, false, true);
     pb = new MemoryRegister16(gba.Memory, address + 2, false, true);
     pc = new MemoryRegister16(gba.Memory, address + 4, false, true);
     pd = new MemoryRegister16(gba.Memory, address + 6, false, true);
 }
Пример #4
0
        public ObjController(GameboyAdvance gba)
        {
            this.gba = gba;

            Obj = new Obj[Max_Sprites];
            for (int i = 0; i < Max_Sprites; i++)
            {
                Obj[i] = new Obj(gba, new ObjAttributes(gba, i * 8, gba.Memory.OamRam));
            }

            OamAffineMatrices = new OamAffineMatrix[Max_OAM_Matrices];
            UInt32 address = 0x00000006;

            for (int i = 0; i < 32; i++)
            {
                OamAffineMatrices[i] = new OamAffineMatrix(gba.Memory.OamRam, address);

                address += 0x20;
            }

            for (int i = 0; i < 4; i++)
            {
                priorityObjList[i] = new List <Obj>();
            }
        }
Пример #5
0
        public BgControlRegister(GameboyAdvance gba, LcdController lcd, int bgNumber, UInt32 address)
        {
            this.lcd      = lcd;
            this.bgNumber = bgNumber;

            MemoryRegister8WithSetHook r0 = new MemoryRegister8WithSetHook(gba.Memory, address, true, true);
            MemoryRegister8WithSetHook r1 = new MemoryRegister8WithSetHook(gba.Memory, address + 1, true, true);

            register = new MemoryRegister16(gba.Memory, address, true, true, r0, r1);

            r0.OnSet = (oldValue, newValue) =>
            {
                lcd.Bg[bgNumber].CacheRenderData();
            };

            r1.OnSet = (oldValue, newValue) =>
            {
                // This *should* be 0x1F but it breaks bg on mario kart track 1. Hopefully we can just get rid of tilemap reset and be done with this
                //if ((oldValue & 0x1F) != (newValue & 0x1F))
                {
                    // THIS HAS GOT TO GO! Mario Kart canes it!
                    lcd.Bg[bgNumber].TileMap.Reset();
                }

                lcd.Bg[bgNumber].CacheRenderData();
            };
        }
Пример #6
0
        public static int PixelWindowRegion(int screenX, int screenY, GameboyAdvance gba)
        {
            int result = 0;

            if (gba.LcdController.DisplayControlRegister.DisplayWin0 &&
                screenX >= gba.LcdController.Windows[0].Left && screenX < gba.LcdController.Windows[0].RightAdjusted() &&
                screenY >= gba.LcdController.Windows[0].Top && screenY < gba.LcdController.Windows[0].BottomAdjusted())
            {
                result |= (int)WindowRegion.Window0;
                result |= (int)WindowRegion.WindowIn;
            }

            if (gba.LcdController.DisplayControlRegister.DisplayWin1 &&
                screenX >= gba.LcdController.Windows[1].Left && screenX < gba.LcdController.Windows[1].RightAdjusted() &&
                screenY >= gba.LcdController.Windows[1].Top && screenY < gba.LcdController.Windows[1].BottomAdjusted())
            {
                result |= (int)WindowRegion.Window1;
                result |= (int)WindowRegion.WindowIn;
            }

            // TODO : OBJ WINDOW


            return(result);
        }
Пример #7
0
        public DisplayStatusRegister(GameboyAdvance gba, LcdController lcd)
        {
            this.lcd = lcd;
            DispStatRegister r0 = new DispStatRegister(lcd, this, gba.Memory, 0x4000004);
            MemoryRegister8  r1 = new MemoryRegister8(gba.Memory, 0x4000005, true, true);

            register = new MemoryRegister16(gba.Memory, 0x4000004, true, true, r0, r1);
        }
Пример #8
0
Файл: Bios.cs Проект: Y2JB/Y2Gba
        public Bios(GameboyAdvance gba, string fn)
        {
            this.gba   = gba;
            State      = Status.STARTUP;
            UseGbaBios = true;

            biosData = new MemoryStream(File.ReadAllBytes(fn)).ToArray();
        }
Пример #9
0
 public Cpu(GameboyAdvance gba)
 {
     this.Gba            = gba;
     Memory              = gba.Memory;
     InstructionPipeline = new UInt32[Pipeline_Size];
     CalculateArmDecodeLookUpTable();
     CalculateThumbDecodeLookUpTable();
     RegisterConditionalHandlers();
 }
Пример #10
0
        public Joypad(GameboyAdvance gba)
        {
            this.gba = gba;

            JoypadRegister r0 = new JoypadRegister(this, gba.Memory, 0x4000130);
            JoypadRegister r1 = new JoypadRegister(this, gba.Memory, 0x4000131);

            register = new MemoryRegister16(gba.Memory, 0x4000130, true, false, r0, r1);
        }
Пример #11
0
        public Timers(GameboyAdvance gba)
        {
            this.gba = gba;

            this.Timer = new GbaTimer[4];
            for (int i = 0; i < 4; i++)
            {
                Timer[i] = new GbaTimer(this, gba.Interrupts, i);
            }
        }
Пример #12
0
        public Obj(GameboyAdvance gba, ObjAttributes attributes)
        {
            this.gba   = gba;
            Attributes = attributes;

            BoundingBoxScreenSpace = new BoundingBox();

            // OBJ Tiles are stored in a separate area in VRAM: 06010000-06017FFF (32 KBytes) in BG Mode 0-2, or 06014000-06017FFF (16 KBytes) in BG Mode 3-5.
            vramBaseOffset = 0x00010000;
        }
Пример #13
0
        public Background(GameboyAdvance gba, int bgNumber, BgControlRegister cntRegister)
        {
            this.gba      = gba;
            this.BgNumber = bgNumber;
            CntRegister   = cntRegister;
            AffineMode    = false;
            TileMap       = new TileMap(gba.Memory.VRam, cntRegister, bgNumber);

            AffineMatrix = new BgAffineMatrix();
        }
Пример #14
0
        public Scheduler(GameboyAdvance gba)
        {
            this.gba = gba;

            scheduledItems    = new IScheudledItem[6];
            scheduledItems[0] = gba.LcdController;
            scheduledItems[1] = gba.Timers;
            scheduledItems[2] = gba.Dma[0];
            scheduledItems[3] = gba.Dma[1];
            scheduledItems[4] = gba.Dma[2];
            scheduledItems[5] = gba.Dma[3];
        }
Пример #15
0
        public Memory(GameboyAdvance gba)
        {
            this.gba = gba;

            IoRegisters8Read  = new Dictionary <uint, IMemoryRegister8>();
            IoRegisters16Read = new Dictionary <uint, IMemoryRegister16>();
            IoRegisters32Read = new Dictionary <uint, IMemoryRegister32>();

            IoRegisters8Write  = new Dictionary <uint, IMemoryRegister8>();
            IoRegisters16Write = new Dictionary <uint, IMemoryRegister16>();
            IoRegisters32Write = new Dictionary <uint, IMemoryRegister32>();
        }
Пример #16
0
        public Timers(GameboyAdvance gba)
        {
            this.gba = gba;

            this.Timer = new GbaTimer[4];
            for (int i = 0; i < 4; i++)
            {
                Timer[i] = new GbaTimer(this, gba, i);
            }

            ScheduledUpdateOnCycle = 0xFFFFFFFF;
        }
Пример #17
0
        public LcdController(GameboyAdvance gba)
        {
            this.gba = gba;


            frameBuffer0 = new DirectBitmap(Screen_X_Resolution, Screen_Y_Resolution);
            frameBuffer1 = new DirectBitmap(Screen_X_Resolution, Screen_Y_Resolution);
            FrameBuffer = frameBuffer0;
            drawBuffer = frameBuffer1;

            this.Palettes = new Palettes();

            DisplayControlRegister = new DisplayControlRegister(this);
            DispStatRegister = new DisplayStatusRegister(this);
            BgControlRegisters = new BgControlRegister[4];
            Bg = new Background[4];
            for (int i = 0; i < 4; i++)
            {
                BgControlRegisters[i] = new BgControlRegister(this, i);
                Bg[i] = new Background(gba, i, BgControlRegisters[i]);

                priorityObjList[i] = new List<Obj>();
            }

            Obj = new Obj[Max_Sprites];
            for (int i = 0; i < Max_Sprites; i++)
            {
                Obj[i] = new Obj(gba, new ObjAttributes(gba, i * 8, gba.Memory.OamRam));
            }

            OamAffineMatrices = new OamAffineMatrix[Max_OAM_Matrices];
            UInt32 address = 0x00000006;
            for (int i = 0; i < 32; i++)
            {
                OamAffineMatrices[i] = new OamAffineMatrix(gba.Memory.OamRam, address);

                address += 0x20;
            }

            Windows = new Window[4];
            for (int i = 0; i < 4; i++)
            {
                Windows[i] = new Window(gba);
            }

#if THREADED_SCANLINE
            drawScanline = false;
            exitThread = false;
            scanlineThread = new Thread(new ThreadStart(ScanlineThread));
            scanlineThread.Start();
#endif
        }
Пример #18
0
        public DmaChannel(GameboyAdvance gba, int channelNumber)
        {
            this.gba           = gba;
            this.channelNumber = channelNumber;

            DmaCnt = new DmaControlRegister(gba, this, (UInt32)(0x40000BA + (channelNumber * 0xC)));

            // TODO: These are all write only!
            // Should: reads open bus if the whole 32-bit word is unused and zero otherwise.
            SourceAddress = new MemoryRegister32(gba.Memory, (UInt32)(0x40000B0 + (channelNumber * 0xC)), true, true);
            DestAddress   = new MemoryRegister32(gba.Memory, (UInt32)(0x40000B4 + (channelNumber * 0xC)), true, true);
            WordCount     = new MemoryRegister16(gba.Memory, (UInt32)(0x40000B8 + (channelNumber * 0xC)), true, true);
        }
Пример #19
0
        public Interrupts(GameboyAdvance gba)
        {
            this.gba = gba;

            InterruptMasterEnable = new MemoryRegister16(gba.Memory, 0x4000208, true, true);

            InterruptEnableRegister = new MemoryRegister16(gba.Memory, 0x4000200, true, true);

            IntFlagsRegister r0 = new IntFlagsRegister(this, gba.Memory, 0x4000202);
            IntFlagsRegister r1 = new IntFlagsRegister(this, gba.Memory, 0x4000203);

            InterruptRequestFlagsRegister = new MemoryRegister16(gba.Memory, 0x4000202, true, true, r0, r1);
        }
Пример #20
0
        public Window(GameboyAdvance gba, UInt32 rightRegisterAddress, UInt32 registerAddress)
        {
            this.gba = gba;

            if (rightRegisterAddress != 0)
            {
                Right  = new MemoryRegister8(gba.Memory, rightRegisterAddress, false, true);
                Left   = new MemoryRegister8(gba.Memory, rightRegisterAddress + 1, false, true);
                Bottom = new MemoryRegister8(gba.Memory, rightRegisterAddress + 4, false, true);
                Top    = new MemoryRegister8(gba.Memory, rightRegisterAddress + 5, false, true);
            }

            Register = new MemoryRegister8(gba.Memory, registerAddress, true, true);
        }
Пример #21
0
        public LcdController(GameboyAdvance gba)
        {
            this.gba = gba;


            frameBuffer0 = new DirectBitmap(Screen_X_Resolution, Screen_Y_Resolution);
            frameBuffer1 = new DirectBitmap(Screen_X_Resolution, Screen_Y_Resolution);
            FrameBuffer = frameBuffer0;
            drawBuffer = frameBuffer1;

            this.Palettes = new Palettes();

            DisplayControlRegister = new DisplayControlRegister(gba, this);
            DispStatRegister = new DisplayStatusRegister(gba, this);
            
            Bg = new Background[4];
            UInt32 scrollBaseAddress = 0x4000010;
            for (int i = 0; i < 4; i++)
            {
                BgControlRegister cntReg = new BgControlRegister(gba, this, i, (UInt32) (0x4000008 + (i * 2)));
                MemoryRegister16 scrollXReg = new MemoryRegister16(gba.Memory, scrollBaseAddress, false, true, 0x01);
                MemoryRegister16 scrollYReg = new MemoryRegister16(gba.Memory, scrollBaseAddress + 2, false, true, 0x01);
                Bg[i] = new Background(gba, i, cntReg, scrollXReg, scrollYReg);

                scrollBaseAddress += 4;
            }

            VCount = new MemoryRegister8(gba.Memory, 0x04000006, true, false);

            this.ObjController = new ObjController(gba);

            Windows = new Window[4];
            Windows[0] = new Window(gba, 0x4000040, 0x4000048);
            Windows[1] = new Window(gba, 0x4000042, 0x4000049);
            Windows[2] = new Window(gba, 0, 0x400004A);
            Windows[3] = new Window(gba, 0, 0x400004B);

            this.BlendControlRegister = new BlendControlRegister(this, gba);
            BlendingCoefficientRegister = new PixelCoefficientRegister(this, gba, 0x4000052);
            BrightnessCoefficientRegister = new PixelCoefficientRegister(this, gba, 0x4000054);

#if THREADED_SCANLINE
            //Interlocked.Exchange(ref drawScanline, 0);
            drawScanline = 0;
            exitThread = false;
            scanlineThread = new Thread(new ThreadStart(ScanlineThread));
            scanlineThread.Priority = ThreadPriority.Highest;
            scanlineThread.Start();
#endif
        }
Пример #22
0
Файл: Cpu.cs Проект: Y2JB/Y2Gba
        public Cpu(GameboyAdvance gba)
        {
            this.Gba            = gba;
            Memory              = gba.Memory;
            InstructionPipeline = new UInt32[Pipeline_Size];
            CalculateArmDecodeLookUpTable();
            CalculateThumbDecodeLookUpTable();
            RegisterConditionalHandlers();

            MemoryRegister8WithSetHook r0 = new MemoryRegister8WithSetHook(gba.Memory, 0x4000204, true, true);
            MemoryRegister8WithSetHook r1 = new MemoryRegister8WithSetHook(gba.Memory, 0x4000205, true, true);

            waitStateControlRegister = new MemoryRegister16(gba.Memory, 0x4000204, true, true, r0, r1);

            Action <byte, byte> waitStateSet = (oldValue, newValue) =>
            {
                //Always make sure Bit 15 is 0 and Read-Only in GBA mode
                //memory_map[WAITCNT + 1] &= ~0x80;

                ushort waitControl = (ushort)(waitStateControlRegister.Value & ~0x80);

                //Determine first access cycles (Non-Sequential)
                switch ((waitControl >> 2) & 0x3)
                {
                case 0x0: nonSequentialAccessTime = 4; break;

                case 0x1: nonSequentialAccessTime = 3; break;

                case 0x2: nonSequentialAccessTime = 2; break;

                case 0x3: nonSequentialAccessTime = 8; break;
                }

                //Determine second access cycles (Sequential)
                switch ((waitControl >> 4) & 0x1)
                {
                case 0x0: sequentialAccessTime = 2; break;

                case 0x1: sequentialAccessTime = 1; break;
                }
            };

            r0.OnSet = waitStateSet;
            r1.OnSet = waitStateSet;
        }
Пример #23
0
        public DisplayControlRegister(GameboyAdvance gba, LcdController lcd)
        {
            this.lcd = lcd;

            MemoryRegister8WithSetHook r0 = new MemoryRegister8WithSetHook(gba.Memory, 0x4000000, true, true);
            MemoryRegister8            r1 = new MemoryRegister8(gba.Memory, 0x4000001, true, true);

            register = new MemoryRegister16(gba.Memory, 0x4000000, true, true, r0, r1);

            r0.OnSet = (oldValue, newValue) =>
            {
                // BgMode changed?
                if ((oldValue & 0x07) != (newValue & 0x07))
                {
                    lcd.Bg[0].CacheRenderData();
                    lcd.Bg[1].CacheRenderData();
                    lcd.Bg[2].CacheRenderData();
                    lcd.Bg[3].CacheRenderData();
                }
            };
        }
Пример #24
0
        public GbaTimer(Timers timers, GameboyAdvance gba, int timerNumber)
        {
            this.timers      = timers;
            this.gba         = gba;
            this.timerNumber = timerNumber;

            FiresOnCycle = 0xFFFFFFFF;

            UInt32 baseAddr = (UInt32)(0x4000100 + (timerNumber * 4));

            TimerValueRegister r0 = new TimerValueRegister(gba, this, gba.Memory, baseAddr);
            TimerValueRegister r1 = new TimerValueRegister(gba, this, gba.Memory, baseAddr + 1);

            TimerValueRegister = new MemoryRegister16(gba.Memory, baseAddr, true, false, r0, r1);

            ReloadValue = new MemoryRegister16(gba.Memory, baseAddr, false, true);

            baseAddr = (UInt32)(0x4000102 + (timerNumber * 4));
            MemoryRegister8WithSetHook reg    = new MemoryRegister8WithSetHook(gba.Memory, baseAddr, true, true);
            MemoryRegister8            unused = new MemoryRegister8(gba.Memory, baseAddr + 1, true, true);

            TimerControlRegister = new MemoryRegister16(gba.Memory, baseAddr, true, true, reg, unused);
            reg.OnSet            = (oldValue, newValue) =>
            {
                CalculateWhichCycleTheTimerWillFire();
                timers.CalculateWhenToNextUpdate();

                // When a timer is enabled, it reloads it's starting value. When it is disabled it just maintains its current values
                bool wasEnabled = ((oldValue & 0x80) != 0);
                bool enabled    = ((newValue & 0x80) != 0);
                if (wasEnabled == false && enabled)
                {
                    startCycle = gba.Cpu.Cycles;

                    timers.ScheduledUpdate();
                    TimerValue = ReloadValue.Value;
                }
            };
        }
Пример #25
0
        public DmaControlRegister(GameboyAdvance gba, DmaChannel channel, UInt32 address)
        {
            this.channel = channel;

            MemoryRegister8            r0 = new MemoryRegister8(gba.Memory, address, true, true);
            MemoryRegister8WithSetHook r1 = new MemoryRegister8WithSetHook(gba.Memory, address + 1, true, true);

            register = new MemoryRegister16(gba.Memory, address, true, true, r0, r1);

            r1.OnSet = (oldValue, newValue) =>
            {
                bool oldEnable = ((oldValue & 0x80) != 0);
                bool newEnable = ((newValue & 0x80) != 0);
                if (oldEnable == false && newEnable == true)
                {
                    // Dma transfers take 2 cycles to start
                    channel.DelayTransfer          = 2;
                    channel.ScheduledUpdateOnCycle = gba.Cpu.Cycles + 2;

                    gba.Scheduler.RefreshSchedule();
                }
            };
        }
Пример #26
0
        public Background(GameboyAdvance gba, int bgNumber, BgControlRegister cntRegister, MemoryRegister16 scrollXReg, MemoryRegister16 scrollYReg)
        {
            this.gba      = gba;
            this.BgNumber = bgNumber;
            CntRegister   = cntRegister;
            AffineMode    = false;
            TileMap       = new TileMap(gba.Memory.VRam, cntRegister, bgNumber);

            BGXHOFS = scrollXReg;
            BGXVOFS = scrollYReg;

            // Only bg 2 & 3 can rotate and scale
            if (bgNumber == 2)
            {
                AffineMatrix     = new BgAffineMatrix(gba, 0x4000020);
                AffineScrollXReg = new AffineScrollRegister(gba.Memory, 0x4000028, false, true);
                AffineScrollYReg = new AffineScrollRegister(gba.Memory, 0x400002C, false, true);
            }
            else if (bgNumber == 3)
            {
                AffineMatrix     = new BgAffineMatrix(gba, 0x4000030);
                AffineScrollXReg = new AffineScrollRegister(gba.Memory, 0x4000038, false, true);
                AffineScrollYReg = new AffineScrollRegister(gba.Memory, 0x400003C, false, true);
            }

            ScanlineData = new int[LcdController.Screen_X_Resolution];



#if THREADED_SCANLINE
            Interlocked.Exchange(ref cacheScanline, 0);
            exitThread     = false;
            scanlineThread = new Thread(new ThreadStart(ScanlineThread));
            scanlineThread.Start();
#endif
        }
Пример #27
0
 public Interrupts(GameboyAdvance gba)
 {
     this.gba = gba;
 }
Пример #28
0
 public ObjAttributes(GameboyAdvance gba, int oamRamOffset, byte[] oamRam)
 {
     this.gba          = gba;
     this.oamRamOffset = oamRamOffset;
     this.oamRam       = oamRam;
 }
Пример #29
0
 public PixelCoefficientRegister(LcdController lcd, GameboyAdvance gba, UInt32 address)
 {
     this.lcd = lcd;
     register = new MemoryRegister16(gba.Memory, address, true, true);
 }
Пример #30
0
 public BlendControlRegister(LcdController lcd, GameboyAdvance gba)
 {
     this.lcd = lcd;
     register = new MemoryRegister16(gba.Memory, 0x4000050, true, true);
 }