Ejemplo n.º 1
0
        void poke(ushort addr, byte data)
        {
            addr &= 0x3f;

            switch (addr)
            {
            // INPUT PORT CONTROL
            // Only the first four bits of INPTCTRL are used:
            //     D0: lock mode (after this bit has been set high, no more mode changes can be done until the console is turned off)
            //     D1: 0=disable MARIA (only RIOT RAM is available); 1=enable MARIA (also enables system RAM)
            //     D2: 0=enable BIOS at $8000-$FFFF (actually NTSC only uses 4KB and PAL uses 16KB); 1=disable BIOS and enable cartridge
            //     D3: 0=disable TIA video pull-ups (video output is MARIA instead of TIA); 1=enable TIA video pull-ups (video output is TIA instead of MARIA)
            //
            case INPTCTRL:
                if (CtrlLock)
                {
                    Log("Maria: INPTCTRL: LOCKED: Ignoring: ${0:x2}, PC=${1:x4}", data, M.CPU.PC);
                    break;
                }

                CtrlLock = (data & (1 << 0)) != 0;
                var mariaEnable = (data & (1 << 1)) != 0;
                var biosDisable = (data & (1 << 2)) != 0;
                var tiaopEnable = (data & (1 << 3)) != 0;

                Log("Maria: INPTCTRL: ${0:x2}, PC=${1:x4}, lockMode={2}, mariaEnable={3} biosDisable={4} tiaOutput={5}",
                    data, M.CPU.PC, CtrlLock, mariaEnable, biosDisable, tiaopEnable);

                if (biosDisable)
                {
                    M.SwapOutBIOS();
                }
                else
                {
                    M.SwapInBIOS();
                }
                break;

            case WSYNC:
                // Request a CPU preemption to service the delay request
                M.CPU.EmulatorPreemptRequest = true;
                break;

            case CTRL:
                ColorKill  = (data & 0x80) != 0;
                DMAEnabled = (data & 0x60) == 0x40;
                CWidth     = (data & 0x10) != 0;
                BCntl      = (data & 0x08) != 0;
                Kangaroo   = (data & 0x04) != 0;
                RM         = (byte)(data & 0x03);
                break;

            case MSTAT:
                break;

            case CHARBASE:
            case DPPH:
            case DPPL:
                Registers[addr] = data;
                break;

            case BACKGRND:
            case P0C1:
            case P0C2:
            case P0C3:
            case P1C1:
            case P1C2:
            case P1C3:
            case P2C1:
            case P2C2:
            case P2C3:
            case P3C1:
            case P3C2:
            case P3C3:
            case P4C1:
            case P4C2:
            case P4C3:
            case P5C1:
            case P5C2:
            case P5C3:
            case P6C1:
            case P6C2:
            case P6C3:
            case P7C1:
            case P7C2:
            case P7C3:
                Registers[addr] = data;
                break;

            case AUDC0:
            case AUDC1:
            case AUDF0:
            case AUDF1:
            case AUDV0:
            case AUDV1:
                TIASound.Update(addr, data);
                break;

            case OFFSET:
                Log("Maria: OFFSET: ROM wrote ${0:x2}, PC=${1:x4} (reserved for future expansion)", data, M.CPU.PC);
                break;

            default:
                Registers[addr] = data;
                LogDebug("Maria: Unhandled poke:${0:x4} w/${1:x2}, PC=${2:x4}", addr, data, M.CPU.PC);
                break;
            }
        }