/*
 * BIOS7800.cs
 * 
 * The BIOS of the Atari 7800.
 * 
 * Copyright © 2004 Mike Murphy
 * 
 */
using System;

namespace EMU7800.Core
{
    public sealed class Bios7800 : IDevice
    {
        readonly byte[] ROM;
        readonly ushort Mask;

        public ushort Size { get { return (ushort)ROM.Length; } }

        public void Reset() { }

        public byte this[ushort addr]
        {
            get { return ROM[addr & Mask]; }
            set { }
        }

        public Bios7800(byte[] rom)
        {
            if (rom == null)
                throw new ArgumentNullException("rom");
            if (rom.Length != 4096 && rom.Length != 16384)
                throw new ArgumentException("ROM size not 4096 or 16384", "rom");

            ROM = rom;
            Mask = (ushort)ROM.Length;
            Mask--;
        }

        #region Serialization Members

        public Bios7800(DeserializationContext input)
        {
            if (input == null)
                throw new ArgumentNullException("input");

            input.CheckVersion(1);
            ROM = input.ReadExpectedBytes(4096, 16384);

            Mask = (ushort)ROM.Length;
            Mask--;
        }

        public void GetObjectData(SerializationContext output)
        {
            if (output == null)
                throw new ArgumentNullException("output");

            output.WriteVersion(1);
            output.Write(ROM);
        }

        #endregion
    }
}