Пример #1
0
        public Emulator(IVideoOutput video = null, IAudioOutput audio = null, ISaveMemory saveMemory = null) : base(video, audio, saveMemory)
        {
            for (int i = 0; i < WIDTH * HEIGHT; i++)
            {
                SetPixel(i, 0xFF000000);
            }

            Video?.SetSize(WIDTH, HEIGHT);
        }
Пример #2
0
        public Emulator(IVideoOutput video, IAudioOutput audio = null, ISaveMemory saveMemory = null) : base(video, audio, saveMemory)
        {
            for (int i = 0; i < pixels.Length; i++)
            {
                pixels [i] = 0xFF000000;
            }

            Video.SetSize(WIDTH, HEIGHT);
        }
Пример #3
0
		// -------------------------------- EMU

		public Emulator(IVideoOutput video, IAudioOutput audio = null, ISaveMemory saveMemory = null) : base(video, audio, saveMemory)
		{
			pressButton.Instance.onClick += onClick;

			for (int i = 0; i < pixels.Length; i++)
			{
				pixels [i] = 0xFF000000;
			}

			Video.SetSize(WIDTH, HEIGHT);
		}
Пример #4
0
 public EmulatorBase(IVideoOutput video, IAudioOutput audio = null, ISaveMemory saveMemory = null)
 {
     Video      = video;
     Audio      = audio;
     SaveMemory = saveMemory;
 }
Пример #5
0
        public Game(byte[] fileData, ISaveMemory saveMemory)
        {
            this.saveMemory  = saveMemory;
            title            = ExtractGameTitle(fileData);
            gameBoyColorGame = fileData [0x0143] == 0x80;
            licenseCode      = (((int)fileData [0x0144]) << 4) | fileData [0x0145];
            gameBoy          = fileData [0x0146] == 0x00;
            romType          = (RomType)fileData [0x0147];

            switch (fileData [0x0148])
            {
            case 0x00:
                romSize  = 32 * 1024;
                romBanks = 2;
                break;

            case 0x01:
                romSize  = 64 * 1024;
                romBanks = 4;
                break;

            case 0x02:
                romSize  = 128 * 1024;
                romBanks = 8;
                break;

            case 0x03:
                romSize  = 256 * 1024;
                romBanks = 16;
                break;

            case 0x04:
                romSize  = 512 * 1024;
                romBanks = 32;
                break;

            case 0x05:
                romSize  = 1024 * 1024;
                romBanks = 64;
                break;

            case 0x06:
                romSize  = 2 * 1024 * 1024;
                romBanks = 128;
                break;

            case 0x52:
                romSize  = 1179648;
                romBanks = 72;
                break;

            case 0x53:
                romSize  = 1310720;
                romBanks = 80;
                break;

            case 0x54:
                romSize  = 1572864;
                romBanks = 96;
                break;
            }

            switch (fileData [0x0149])
            {
            case 0x00:
                ramSize  = 0;
                ramBanks = 0;
                break;

            case 0x01:
                ramSize  = 2 * 1024;
                ramBanks = 1;
                break;

            case 0x02:
                ramSize  = 8 * 1024;
                ramBanks = 1;
                break;

            case 0x03:
                ramSize  = 32 * 1024;
                ramBanks = 4;
                break;

            case 0x04:
                ramSize  = 128 * 1024;
                ramBanks = 16;
                break;
            }

            japanese       = fileData [0x014A] == 0x00;
            oldLicenseCode = fileData [0x014B];
            maskRomVersion = fileData [0x014C];

            headerChecksum = fileData [0x014D];
            for (int i = 0x0134; i <= 0x014C; i++)
            {
                actualHeaderChecksum = actualHeaderChecksum - fileData [i] - 1;
            }
            actualHeaderChecksum &= 0xFF;

            checksum = (((int)fileData [0x014E]) << 8) | fileData [0x014F];
            for (int i = 0; i < fileData.Length; i++)
            {
                if (i != 0x014E && i != 0x014F)
                {
                    actualChecksum += fileData [i];
                }
            }
            actualChecksum &= 0xFFFF;

            noVerticalBlankInterruptHandler            = fileData [0x0040] == 0xD9;
            noLCDCStatusInterruptHandler               = fileData [0x0048] == 0xD9;
            noTimerOverflowInterruptHandler            = fileData [0x0050] == 0xD9;
            noSerialTransferCompletionInterruptHandler = fileData [0x0058] == 0xD9;
            noHighToLowOfP10ToP13InterruptHandler      = fileData [0x0060] == 0xD9;

            byte[] savedData = null;
            if (saveMemory != null)
            {
                savedData = saveMemory.Load(title);
            }

            switch (romType)
            {
            case RomType.ROM:
                cartridge = new ROM(fileData);
                break;

            case RomType.ROM_MBC1:
            case RomType.ROM_MBC1_RAM:
            case RomType.ROM_MBC1_RAM_BATT:
                cartridge = new MBC1(fileData, savedData, romType, romSize, romBanks);
                break;

            case RomType.ROM_MBC2:
            case RomType.ROM_MBC2_BATTERY:
                cartridge = new MBC2(fileData, savedData, romType, romSize, romBanks);
                break;

            case RomType.ROM_MBC3:
            case RomType.ROM_MBC3_RAM:
            case RomType.ROM_MBC3_RAM_BATT:
            case RomType.ROM_MBC3_TIMER_BATT:
            case RomType.ROM_MBC3_TIMER_RAM_BATT:
            case RomType.ROM_MBC5:
            case RomType.ROM_MBC5_RAM:
            case RomType.ROM_MBC5_RAM_BATT:

                cartridge = new MBC3(fileData, savedData, romType, romSize, romBanks);
                break;

            default:
                throw new Exception(string.Format("Cannot emulate cartridge type {0}.", romType));
            }
        }
Пример #6
0
 internal static Game Load(byte[] fileData, ISaveMemory saveMemory)
 {
     return(new Game(fileData, saveMemory));
 }
Пример #7
0
		public EmulatorBase(IVideoOutput video, IAudioOutput audio = null, ISaveMemory saveMemory = null)
		{
			Video = video;
			Audio = audio;
			SaveMemory = saveMemory;
		}
Пример #8
0
		public Game(byte[] fileData, ISaveMemory saveMemory)
		{
			this.saveMemory = saveMemory;
			title = ExtractGameTitle(fileData);
			gameBoyColorGame = fileData [0x0143] == 0x80;
			licenseCode = (((int)fileData [0x0144]) << 4) | fileData [0x0145];
			gameBoy = fileData [0x0146] == 0x00;
			romType = (RomType)fileData [0x0147];

			switch (fileData [0x0148])
			{
				case 0x00:
					romSize = 32 * 1024;
					romBanks = 2;
					break;
				case 0x01:
					romSize = 64 * 1024;
					romBanks = 4;
					break;
				case 0x02:
					romSize = 128 * 1024;
					romBanks = 8;
					break;
				case 0x03:
					romSize = 256 * 1024;
					romBanks = 16;
					break;
				case 0x04:
					romSize = 512 * 1024;
					romBanks = 32;
					break;
				case 0x05:
					romSize = 1024 * 1024;
					romBanks = 64;
					break;
				case 0x06:
					romSize = 2 * 1024 * 1024;
					romBanks = 128;
					break;
				case 0x52:
					romSize = 1179648;
					romBanks = 72;
					break;
				case 0x53:
					romSize = 1310720;
					romBanks = 80;
					break;
				case 0x54:
					romSize = 1572864;
					romBanks = 96;
					break;
			}

			switch (fileData [0x0149])
			{
				case 0x00:
					ramSize = 0;
					ramBanks = 0;
					break;
				case 0x01:
					ramSize = 2 * 1024;
					ramBanks = 1;
					break;
				case 0x02:
					ramSize = 8 * 1024;
					ramBanks = 1;
					break;
				case 0x03:
					ramSize = 32 * 1024;
					ramBanks = 4;
					break;
				case 0x04:
					ramSize = 128 * 1024;
					ramBanks = 16;
					break;
			}

			japanese = fileData [0x014A] == 0x00;
			oldLicenseCode = fileData [0x014B];
			maskRomVersion = fileData [0x014C];

			headerChecksum = fileData [0x014D];
			for (int i = 0x0134; i <= 0x014C; i++)
			{
				actualHeaderChecksum = actualHeaderChecksum - fileData [i] - 1;
			}
			actualHeaderChecksum &= 0xFF;      

			checksum = (((int)fileData [0x014E]) << 8) | fileData [0x014F];
			for (int i = 0; i < fileData.Length; i++)
			{
				if (i != 0x014E && i != 0x014F)
				{
					actualChecksum += fileData [i];
				}
			}
			actualChecksum &= 0xFFFF;

			noVerticalBlankInterruptHandler = fileData [0x0040] == 0xD9;
			noLCDCStatusInterruptHandler = fileData [0x0048] == 0xD9;
			noTimerOverflowInterruptHandler = fileData [0x0050] == 0xD9;
			noSerialTransferCompletionInterruptHandler = fileData [0x0058] == 0xD9;
			noHighToLowOfP10ToP13InterruptHandler = fileData [0x0060] == 0xD9;

			byte[] savedData = null;
			if (saveMemory != null)
				savedData = saveMemory.Load(title);

			switch (romType)
			{
				case RomType.ROM:
					cartridge = new ROM(fileData);
					break;
				case RomType.ROM_MBC1:
				case RomType.ROM_MBC1_RAM:
				case RomType.ROM_MBC1_RAM_BATT:
					cartridge = new MBC1(fileData, savedData, romType, romSize, romBanks);
					break;
				case RomType.ROM_MBC2:
				case RomType.ROM_MBC2_BATTERY:
					cartridge = new MBC2(fileData, savedData, romType, romSize, romBanks);
					break;
				case RomType.ROM_MBC3:
				case RomType.ROM_MBC3_RAM:
				case RomType.ROM_MBC3_RAM_BATT:
				case RomType.ROM_MBC3_TIMER_BATT:
				case RomType.ROM_MBC3_TIMER_RAM_BATT:
				case RomType.ROM_MBC5:
				case RomType.ROM_MBC5_RAM:
				case RomType.ROM_MBC5_RAM_BATT:

					cartridge = new MBC3(fileData, savedData, romType, romSize, romBanks);
					break;
				default:
					throw new Exception(string.Format("Cannot emulate cartridge type {0}.", romType)); 
			}
		}
Пример #9
0
		internal static Game Load(byte[] fileData, ISaveMemory saveMemory)
		{
			return new Game(fileData, saveMemory);      
		}