예제 #1
0
		public override void SyncState(Serializer ser)
		{
			base.SyncState(ser);
			ser.Sync("prg", ref prg);
			ser.Sync("chr", ref chr);
			ser.Sync("flash_state", ref flash_state);
			int tmp = (int)flash_mode;
			ser.Sync("flash_mode", ref tmp);
			flash_mode = (flashmode)tmp;
			ser.Sync("flash_rom", ref flash_rom, true);
		}
예제 #2
0
        public override void SyncState(Serializer ser)
        {
            base.SyncState(ser);
            ser.Sync(nameof(prg), ref prg);
            ser.Sync(nameof(chr), ref chr);
            ser.Sync(nameof(flash_state), ref flash_state);
            int tmp = (int)flash_mode;

            ser.Sync(nameof(flash_mode), ref tmp);
            flash_mode = (flashmode)tmp;
            ser.Sync(nameof(flash_rom), ref flash_rom, true);
        }
예제 #3
0
        public override void SyncState(Serializer ser)
        {
            base.SyncState(ser);
            ser.Sync("prg", ref prg);
            ser.Sync("chr", ref chr);
            ser.Sync("flash_state", ref flash_state);
            int tmp = (int)flash_mode;

            ser.Sync("flash_mode", ref tmp);
            flash_mode = (flashmode)tmp;
            ser.Sync("flash_rom", ref flash_rom, true);
        }
예제 #4
0
        public override bool Configure(NES.EDetectionOrigin origin)
        {
            switch (Cart.board_type)
            {
            case "MAPPER030":
                Cart.vram_size = 32;
                break;

            case "MAPPER0030-00":
                AssertVram(8, 16, 32);
                break;

            case "UNIF_UNROM-512-8":
                Cart.vram_size = 8;
                break;

            case "UNIF_UNROM-512-16":
                Cart.vram_size = 16;
                break;

            case "UNIF_UNROM-512-32":
                Cart.vram_size = 32;
                break;

            default:
                return(false);
            }

            if (Cart.wram_battery)
            {
                flash_state = 0;
                flash_mode  = flashmode.fm_default;
                if (flash_rom == null)
                {
                    // extra space is used to hold information about what sectors have been flashed
                    flash_rom = new byte[Cart.prg_size * 1024 + Cart.prg_size];
                }
            }
            SetMirrorType(CalculateMirrorType(Cart.pad_h, Cart.pad_v));
            AssertChr(0);
            AssertPrg(128, 256, 512);               //Flash chip sizes that fits sealie unrom-512 are 39SF010, 39SF020, 39SF040.
            Cart.wram_size    = 0;
            prg_bank_mask_16k = Cart.prg_size / 16 - 1;
            vram_bank_mask_8k = Cart.vram_size / 8 - 1;
            return(true);
        }
예제 #5
0
		public override bool Configure(NES.EDetectionOrigin origin)
		{
			switch (Cart.board_type)
			{
				case "MAPPER030":
					Cart.vram_size = 32;
					break;
				case "MAPPER0030-00":
					AssertVram(8, 16, 32);
					break;
				case "UNIF_UNROM-512-8":
					Cart.vram_size = 8;
					break;
				case "UNIF_UNROM-512-16":
					Cart.vram_size = 16;
					break;
				case "UNIF_UNROM-512-32":
					Cart.vram_size = 32;
					break;
				default:
					return false;
			}

			if (Cart.wram_battery)
			{
				flash_state = 0;
				flash_mode = flashmode.fm_default;
				if (flash_rom == null)
				{
					// extra space is used to hold information about what sectors have been flashed
					flash_rom = new byte[Cart.prg_size * 1024 + Cart.prg_size];
				}
			}
			SetMirrorType(CalculateMirrorType(Cart.pad_h, Cart.pad_v));
			AssertChr(0);
			AssertPrg(128, 256, 512);   //Flash chip sizes that fits sealie unrom-512 are 39SF010, 39SF020, 39SF040.
			Cart.wram_size = 0;
			prg_bank_mask_16k = Cart.prg_size / 16 - 1;
			vram_bank_mask_8k = Cart.vram_size / 8 - 1;
			return true;
		}
예제 #6
0
		public override void WritePRG(int addr, byte value)
		{
			if ((!Cart.wram_battery) || (addr >= 0x4000))
			{
				byte value2 = value;

				if (!Cart.wram_battery)
					value2 = HandleNormalPRGConflict(addr, value);
				chr = value2 >> 5 & 3 & vram_bank_mask_8k;
				prg = value2 & prg_bank_mask_16k;
				if ((Cart.pad_h == 0) && (Cart.pad_v == 0))
				{
					int mirror = (value2 & 0x80) >> 7;
					SetMirrorType(CalculateMirrorType(mirror, mirror));
				}
			}
			else
			{
				if (flash_mode == flashmode.fm_default)
				{
					if (addr_state[flash_state] == addr && addr_bank[flash_state] == prg && addr_data[flash_state] == value)
					{
						flash_state++;
						if (flash_state == 5)
							flash_mode = flashmode.fm_erase;
					}
					else if (flash_state == 2 && addr == 0x1555 && prg == 1 && value == 0x90)
					{
						flash_mode = flashmode.fm_id;
					}
					else if (flash_state == 2 && addr == 0x1555 && prg == 1 && value == 0xA0)
					{
						flash_state++;
						flash_mode = flashmode.fm_write;
					}
					else
					{
						flash_state = 0;
						flash_mode = flashmode.fm_default;
					}
				}
				else if (flash_mode == flashmode.fm_erase)
				{
					if (value == 0x10)  //You probably don't want to do this, as this is erase entire flash chip. :)
					{                   //Of course, we gotta emulate the behaviour.
						for (int i = 0; i < (Cart.prg_size / 4); i++)
							increment_flash_write_count(i, true);
						for (int i = 0; i < flash_rom.Count(); i++)
							flash_rom[Cart.prg_size + i] = 0xFF;
					}
					else if (value == 0x30)
					{
						increment_flash_write_count(addr);
						for (int i = 0; i < 0x1000; i++)
							flash_rom[(prg << 14 | addr & 0x3000) + i + Cart.prg_size] = 0xFF;
					}
					flash_mode = 0;
					flash_state = 0;
				}
				else if (flash_mode == flashmode.fm_write)
				{
					if (get_flash_write_count(addr) == 0)
					{
						increment_flash_write_count(addr);
						for (int i = 0; i < 0x1000; i++)
							flash_rom[(prg << 14 | addr & 0x3000) + i + Cart.prg_size] = ROM[(prg << 14 | addr & 0x3000) + i];
					}
					flash_rom[Cart.prg_size + (prg << 14 | addr & 0x3fff)] &= value;
					flash_state = 0;
					flash_mode = 0;
				}
				if (flash_mode == flashmode.fm_id && value == 0xF0)
				{
					flash_state = 0;
					flash_mode = 0;
				}
			}
		}
예제 #7
0
        public override void WritePRG(int addr, byte value)
        {
            if ((!Cart.wram_battery) || (addr >= 0x4000))
            {
                byte value2 = value;

                if (!Cart.wram_battery)
                {
                    value2 = HandleNormalPRGConflict(addr, value);
                }
                chr = value2 >> 5 & 3 & vram_bank_mask_8k;
                prg = value2 & prg_bank_mask_16k;
                if ((Cart.pad_h == 0) && (Cart.pad_v == 0))
                {
                    int mirror = (value2 & 0x80) >> 7;
                    SetMirrorType(CalculateMirrorType(mirror, mirror));
                }
            }
            else
            {
                if (flash_mode == flashmode.fm_default)
                {
                    if (addr_state[flash_state] == addr && addr_bank[flash_state] == prg && addr_data[flash_state] == value)
                    {
                        flash_state++;
                        if (flash_state == 5)
                        {
                            flash_mode = flashmode.fm_erase;
                        }
                    }
                    else if (flash_state == 2 && addr == 0x1555 && prg == 1 && value == 0x90)
                    {
                        flash_mode = flashmode.fm_id;
                    }
                    else if (flash_state == 2 && addr == 0x1555 && prg == 1 && value == 0xA0)
                    {
                        flash_state++;
                        flash_mode = flashmode.fm_write;
                    }
                    else
                    {
                        flash_state = 0;
                        flash_mode  = flashmode.fm_default;
                    }
                }
                else if (flash_mode == flashmode.fm_erase)
                {
                    if (value == 0x10)                      //You probably don't want to do this, as this is erase entire flash chip. :)
                    {                                       //Of course, we gotta emulate the behaviour.
                        for (int i = 0; i < (Cart.prg_size / 4); i++)
                        {
                            increment_flash_write_count(i, true);
                        }
                        for (int i = 0; i < flash_rom.Count(); i++)
                        {
                            flash_rom[Cart.prg_size + i] = 0xFF;
                        }
                    }
                    else if (value == 0x30)
                    {
                        increment_flash_write_count(addr);
                        for (int i = 0; i < 0x1000; i++)
                        {
                            flash_rom[(prg << 14 | addr & 0x3000) + i + Cart.prg_size] = 0xFF;
                        }
                    }
                    flash_mode  = 0;
                    flash_state = 0;
                }
                else if (flash_mode == flashmode.fm_write)
                {
                    if (get_flash_write_count(addr) == 0)
                    {
                        increment_flash_write_count(addr);
                        for (int i = 0; i < 0x1000; i++)
                        {
                            flash_rom[(prg << 14 | addr & 0x3000) + i + Cart.prg_size] = ROM[(prg << 14 | addr & 0x3000) + i];
                        }
                    }
                    flash_rom[Cart.prg_size + (prg << 14 | addr & 0x3fff)] &= value;
                    flash_state = 0;
                    flash_mode  = 0;
                }
                if (flash_mode == flashmode.fm_id && value == 0xF0)
                {
                    flash_state = 0;
                    flash_mode  = 0;
                }
            }
        }