Esempio n. 1
0
        public static void smap_writeDMA8Mem(System.IO.UnmanagedMemoryStream pMem, int size)
        {
            if ((DEV9Header.dev9Ru16((int)DEV9Header.SMAP_R_TXFIFO_CTRL) & DEV9Header.SMAP_TXFIFO_DMAEN) != 0)
            {
                int pMemAddr  = 0;
                int valueSize = 4;
                DEV9Header.dev9Wu32((int)DEV9Header.SMAP_R_TXFIFO_WR_PTR, DEV9Header.dev9Ru32((int)DEV9Header.SMAP_R_TXFIFO_WR_PTR) & 16383);
                size >>= 1;
                DEV9.DEV9_LOG(" * * SMAP DMA WRITE START: wr_ptr=" + DEV9Header.dev9Ru32((int)DEV9Header.SMAP_R_TXFIFO_WR_PTR).ToString() + ", rd_ptr=" + DEV9Header.dev9.txfifo_rd_ptr.ToString());
                while (size > 0)
                {
                    pMem.Seek(pMemAddr, System.IO.SeekOrigin.Begin);
                    byte[] valueBytes = new byte[4];
                    pMem.Read(valueBytes, 0, 4);
                    int value = BitConverter.ToInt32(valueBytes, 0); //*pMem;
                    //	value=(value<<24)|(value>>24)|((value>>8)&0xFF00)|((value<<8)&0xFF0000);
                    pMemAddr += valueSize;                           //pMem++;

                    //*((u32*)(dev9.txfifo + dev9Ru32(SMAP_R_TXFIFO_WR_PTR))) = value;
                    byte[] valueBytes2 = BitConverter.GetBytes(value);
                    Utils.memcpy(ref DEV9Header.dev9.txfifo, (int)DEV9Header.dev9Ru32((int)DEV9Header.SMAP_R_TXFIFO_WR_PTR), valueBytes2, 0, 4);
                    //End
                    DEV9Header.dev9Wu32((int)DEV9Header.SMAP_R_TXFIFO_WR_PTR, (DEV9Header.dev9Ru32((int)DEV9Header.SMAP_R_TXFIFO_WR_PTR) + 4) & 16383);
                    size -= valueSize;
                }
                DEV9.DEV9_LOG(" * * SMAP DMA WRITE END:   wr_ptr=" + DEV9Header.dev9Ru32((int)DEV9Header.SMAP_R_TXFIFO_WR_PTR).ToString() + ", rd_ptr=" + DEV9Header.dev9.txfifo_rd_ptr.ToString());

                DEV9Header.dev9Wu16((int)DEV9Header.SMAP_R_TXFIFO_CTRL, (UInt16)(DEV9Header.dev9Ru16((int)DEV9Header.SMAP_R_TXFIFO_CTRL) & ~DEV9Header.SMAP_TXFIFO_DMAEN));
            }
        }
Esempio n. 2
0
        public static void smap_readDMA8Mem(System.IO.UnmanagedMemoryStream pMem, int size)
        {
            if ((DEV9Header.dev9Ru16((int)DEV9Header.SMAP_R_RXFIFO_CTRL) & DEV9Header.SMAP_RXFIFO_DMAEN) != 0)
            {
                int pMemAddr  = 0;
                int valueSize = 4;
                DEV9Header.dev9Wu32((int)DEV9Header.SMAP_R_RXFIFO_RD_PTR, DEV9Header.dev9Ru32((int)DEV9Header.SMAP_R_RXFIFO_RD_PTR) & 16383);
                size >>= 1;
                DEV9.DEV9_LOG(" * * SMAP DMA READ START: rd_ptr=" + DEV9Header.dev9Ru32((int)DEV9Header.SMAP_R_RXFIFO_RD_PTR).ToString() + ", wr_ptr=" + DEV9Header.dev9.rxfifo_wr_ptr.ToString());
                while (size > 0)
                {
                    //*pMem = *((u32*)(DEV9Header.dev9.rxfifo + DEV9Header.dev9Ru32((int)DEV9Header.SMAP_R_RXFIFO_RD_PTR)));
                    int    pMemIn      = BitConverter.ToInt32(DEV9Header.dev9.rxfifo, (int)DEV9Header.dev9Ru32((int)DEV9Header.SMAP_R_RXFIFO_RD_PTR));
                    byte[] pMemInBytes = BitConverter.GetBytes(pMemIn);
                    pMem.Seek(pMemAddr, System.IO.SeekOrigin.Begin);
                    pMem.Write(pMemInBytes, 0, 4);
                    //End write to pMem
                    pMemAddr += valueSize;//pMem++;
                    DEV9Header.dev9Wu32((int)DEV9Header.SMAP_R_RXFIFO_RD_PTR, (DEV9Header.dev9Ru32((int)DEV9Header.SMAP_R_RXFIFO_RD_PTR) + 4) & 16383);

                    size -= valueSize;
                }
                DEV9.DEV9_LOG(" * * SMAP DMA READ END:   rd_ptr=" + DEV9Header.dev9Ru32((int)DEV9Header.SMAP_R_RXFIFO_RD_PTR).ToString() + ", wr_ptr=" + DEV9Header.dev9.rxfifo_wr_ptr.ToString());

                DEV9Header.dev9Wu16((int)DEV9Header.SMAP_R_RXFIFO_CTRL, (UInt16)(DEV9Header.dev9Ru16((int)DEV9Header.SMAP_R_RXFIFO_CTRL) & ~DEV9Header.SMAP_RXFIFO_DMAEN));
            }
        }
Esempio n. 3
0
 public override int _DEV9irqHandler()
 {
     //Console.Error.WriteLine("_DEV9irqHandler");
     DEV9_LOG("_DEV9irqHandler " + DEV9Header.dev9.irqcause.ToString("X") + ", " + DEV9Header.dev9Ru16((int)DEV9Header.SPD_R_INTR_MASK).ToString("x"));
     if ((DEV9Header.dev9.irqcause & DEV9Header.dev9Ru16((int)DEV9Header.SPD_R_INTR_MASK)) != 0)
     {
         return(1);
     }
     return(0);
 }
Esempio n. 4
0
        //Static method for smap
        public static void _DEV9irq(int cause, int cycles)
        {
            //Console.Error.WriteLine("_DEV9irq");
            DEV9_LOG("_DEV9irq " + cause.ToString("X") + ", " + DEV9Header.dev9Ru16((int)DEV9Header.SPD_R_INTR_MASK).ToString("X"));

            DEV9Header.dev9.irqcause |= cause;

            if (cycles < 1)
            {
                DEV9Header.DEV9irq(1);
            }
            else
            {
                DEV9Header.DEV9irq(cycles);
            }
        }
Esempio n. 5
0
        public override void DEV9write16(uint addr, ushort value)
        {
            //Console.Error.WriteLine("DEV9write16");
            if (addr >= DEV9Header.ATA_DEV9_HDD_BASE && addr < DEV9Header.ATA_DEV9_HDD_END)
            {
                //#ifdef ENABLE_ATA
                //        ata_write<2>(addr,value);
                //#endif
                //Console.Error.WriteLine("DEV9write16 ATA");
                return;
            }
            if (addr >= DEV9Header.SMAP_REGBASE && addr < DEV9Header.FLASH_REGBASE)
            {
                //smap
                //Console.Error.WriteLine("DEV9write16 SMAP");
                smap.smap_write16(addr, value);
                return;
            }
            switch (addr)
            {
            case DEV9Header.SPD_R_INTR_MASK:
                if ((DEV9Header.dev9Ru16((int)DEV9Header.SPD_R_INTR_MASK) != value) && (((DEV9Header.dev9Ru16((int)DEV9Header.SPD_R_INTR_MASK) | value) & DEV9Header.dev9.irqcause) != 0))
                {
                    DEV9.DEV9_LOG("SPD_R_INTR_MASK16=0x" + value.ToString("X") + " , checking for masked/unmasked interrupts");
                    DEV9Header.DEV9irq(1);
                }
                break;

            default:

                if ((addr >= DEV9Header.FLASH_REGBASE) && (addr < (DEV9Header.FLASH_REGBASE + DEV9Header.FLASH_REGSIZE)))
                {
                    Console.Error.WriteLine("DEV9write16 flash");
                    flash.FLASHwrite32(addr, (UInt32)value, 2);
                    return;
                }
                DEV9Header.dev9Wu16((int)addr, value);
                DEV9.DEV9_LOG("*Unknown 16bit write at address " + addr.ToString("X8") + " value " + value.ToString("X"));
                return;
            }
            DEV9Header.dev9Wu16((int)addr, value);
            DEV9.DEV9_LOG("*Known 16bit write at address " + addr.ToString("X8") + " value " + value.ToString("X"));
        }
Esempio n. 6
0
        public override ushort DEV9read16(uint addr)
        {
            //DEV9_LOG("DEV9read16");
            UInt16 hard;

            if (addr >= DEV9Header.ATA_DEV9_HDD_BASE && addr < DEV9Header.ATA_DEV9_HDD_END)
            {
                //#ifdef ENABLE_ATA
                //        return ata_read<2>(addr);
                //#else
                return(0);
                //#endif
            }
            if (addr >= DEV9Header.SMAP_REGBASE && addr < DEV9Header.FLASH_REGBASE)
            {
                //smap
                //DEV9_LOG("DEV9read16(SMAP)");
                return(smap.smap_read16(addr));
            }

            switch (addr)
            {
            case DEV9Header.SPD_R_INTR_STAT:
                //DEV9_LOG("DEV9read16");
                DEV9_LOG("SPD_R_INTR_STAT read " + DEV9Header.dev9.irqcause.ToString("X"));
                return((UInt16)DEV9Header.dev9.irqcause);

            case DEV9Header.DEV9_R_REV:
                hard = 0x0030;     // expansion bay
                //DEV9_LOG("DEV9_R_REV 16bit read " + hard.ToString("X"));
                break;

            case DEV9Header.SPD_R_REV_1:
                hard = 0x0011;
                //DEV9_LOG("STD_R_REV_1 16bit read " + hard.ToString("X"));
                return(hard);

            case DEV9Header.SPD_R_REV_3:
                // bit 0: smap
                // bit 1: hdd
                // bit 5: flash
                hard = 0;

                /*if (config.hddEnable) {
                 *  hard|= 0x2;
                 * }*/
                if (DEV9Header.config.ethEnable != 0)
                {
                    hard |= 0x1;
                }
                hard |= 0x20;    //flash
                break;

            case DEV9Header.SPD_R_0e:
                hard = 0x0002;
                break;

            default:
                if ((addr >= DEV9Header.FLASH_REGBASE) && (addr < (DEV9Header.FLASH_REGBASE + DEV9Header.FLASH_REGSIZE)))
                {
                    //DEV9_LOG("DEV9read16(FLASH)");
                    return((UInt16)flash.FLASHread32(addr, 2));
                }
                // DEV9_LOG("DEV9read16");
                hard = DEV9Header.dev9Ru16((int)addr);
                DEV9_LOG("*Unknown 16bit read at address " + addr.ToString("x") + " value " + hard.ToString("x"));
                return(hard);
            }

            //DEV9_LOG("DEV9read16");
            DEV9_LOG("*Known 16bit read at address " + addr.ToString("x") + " value " + hard.ToString("x"));
            return(hard);
        }
Esempio n. 7
0
        public static UInt16 smap_read16(UInt32 addr)
        {
            if (addr >= DEV9Header.SMAP_BD_TX_BASE && addr < (DEV9Header.SMAP_BD_TX_BASE + DEV9Header.SMAP_BD_SIZE))
            {
                int rv = DEV9Header.dev9Ru16((int)addr);
                if (DEV9Header.dev9.bd_swap != 0)
                {
                    DEV9.DEV9_LOG("SMAP : Generic TX read " + ((rv << 8) | (rv >> 8)).ToString("X"));
                    return((UInt16)((rv << 8) | (rv >> 8)));
                }
                DEV9.DEV9_LOG("SMAP : Generic TX read " + rv.ToString("X"));
                return((UInt16)rv);
            }
            else if (addr >= DEV9Header.SMAP_BD_RX_BASE && addr < (DEV9Header.SMAP_BD_RX_BASE + DEV9Header.SMAP_BD_SIZE))
            {
                int rv = DEV9Header.dev9Ru16((int)addr);
                if (DEV9Header.dev9.bd_swap != 0)
                {
                    DEV9.DEV9_LOG("SMAP : Generic RX read " + ((rv << 8) | (rv >> 8)).ToString("X"));
                    return((UInt16)((rv << 8) | (rv >> 8)));
                }
                DEV9.DEV9_LOG("SMAP : Generic RX read " + rv.ToString("X"));
                return((UInt16)rv);
            }

            switch (addr)
            {
            case DEV9Header.SMAP_R_TXFIFO_FRAME_CNT:
                //printf("SMAP_R_TXFIFO_FRAME_CNT read 16\n");
                DEV9.DEV9_LOG("SMAP_R_TXFIFO_FRAME_CNT 16bit read " + DEV9Header.dev9Ru16((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru16((int)addr));

            case DEV9Header.SMAP_R_RXFIFO_FRAME_CNT:
                //printf("SMAP_R_RXFIFO_FRAME_CNT read 16\n");
                DEV9.DEV9_LOG("SMAP_R_RXFIFO_FRAME_CNT 16bit read " + DEV9Header.dev9Ru16((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru16((int)addr));

            case DEV9Header.SMAP_R_EMAC3_MODE0_L:
                DEV9.DEV9_LOG("SMAP_R_EMAC3_MODE0_L 16bit read " + DEV9Header.dev9Ru16((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru16((int)addr));

            case DEV9Header.SMAP_R_EMAC3_MODE0_H:
                DEV9.DEV9_LOG("SMAP_R_EMAC3_MODE0_H 16bit read " + DEV9Header.dev9Ru16((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru16((int)addr));

            case DEV9Header.SMAP_R_EMAC3_MODE1_L:
                DEV9.DEV9_LOG("SMAP_R_EMAC3_MODE1_L 16bit read " + DEV9Header.dev9Ru16((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru16((int)addr));

            case DEV9Header.SMAP_R_EMAC3_MODE1_H:
                DEV9.DEV9_LOG("SMAP_R_EMAC3_MODE1_H 16bit read " + DEV9Header.dev9Ru16((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru16((int)addr));

            case DEV9Header.SMAP_R_EMAC3_RxMODE_L:
                DEV9.DEV9_LOG("SMAP_R_EMAC3_RxMODE_L 16bit read " + DEV9Header.dev9Ru16((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru16((int)addr));

            case DEV9Header.SMAP_R_EMAC3_RxMODE_H:
                DEV9.DEV9_LOG("SMAP_R_EMAC3_RxMODE_H 16bit read " + DEV9Header.dev9Ru16((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru16((int)addr));

            case DEV9Header.SMAP_R_EMAC3_INTR_STAT_L:
                DEV9.DEV9_LOG("SMAP_R_EMAC3_INTR_STAT_L 16bit read " + DEV9Header.dev9Ru16((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru16((int)addr));

            case DEV9Header.SMAP_R_EMAC3_INTR_STAT_H:
                DEV9.DEV9_LOG("SMAP_R_EMAC3_INTR_STAT_H 16bit read " + DEV9Header.dev9Ru16((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru16((int)addr));

            case DEV9Header.SMAP_R_EMAC3_INTR_ENABLE_L:
                DEV9.DEV9_LOG("SMAP_R_EMAC3_INTR_ENABLE_L 16bit read " + DEV9Header.dev9Ru16((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru16((int)addr));

            case DEV9Header.SMAP_R_EMAC3_INTR_ENABLE_H:
                DEV9.DEV9_LOG("SMAP_R_EMAC3_INTR_ENABLE_H 16bit read " + DEV9Header.dev9Ru16((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru16((int)addr));

            case DEV9Header.SMAP_R_EMAC3_TxMODE0_L:
                DEV9.DEV9_LOG("SMAP_R_EMAC3_TxMODE0_L 16bit read " + DEV9Header.dev9Ru16((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru16((int)addr));

            case DEV9Header.SMAP_R_EMAC3_TxMODE0_H:
                DEV9.DEV9_LOG("SMAP_R_EMAC3_TxMODE0_H 16bit read " + DEV9Header.dev9Ru16((int)addr).ToString("X"));;
                return(DEV9Header.dev9Ru16((int)addr));

            case DEV9Header.SMAP_R_EMAC3_TxMODE1_L:
                DEV9.DEV9_LOG("SMAP_R_EMAC3_TxMODE1_L 16bit read " + DEV9Header.dev9Ru16((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru16((int)addr));

            case DEV9Header.SMAP_R_EMAC3_TxMODE1_H:
                DEV9.DEV9_LOG("SMAP_R_EMAC3_TxMODE1_H 16bit read " + DEV9Header.dev9Ru16((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru16((int)addr));

            case DEV9Header.SMAP_R_EMAC3_STA_CTRL_L:
                DEV9.DEV9_LOG("SMAP_R_EMAC3_STA_CTRL_L 16bit read " + DEV9Header.dev9Ru16((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru16((int)addr));

            case DEV9Header.SMAP_R_EMAC3_STA_CTRL_H:
                DEV9.DEV9_LOG("SMAP_R_EMAC3_STA_CTRL_H 16bit read " + DEV9Header.dev9Ru16((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru16((int)addr));

            default:
                DEV9.DEV9_LOG("SMAP: Unknown 16 bit read @ " + addr.ToString("X") + ", v=" + DEV9Header.dev9Ru16((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru16((int)addr));
            }

            //DEV9.DEVLOG_shared.LogWriteLine("SMAP : error , 16 bit read @ " + addr.ToString("X") + ", v=" + DEV9Header.dev9Ru16((int)addr).ToString());
            //return DEV9Header.dev9Ru16((int)addr);
        }
Esempio n. 8
0
        private static void emac3_write(UInt32 addr)
        {
            UInt32 value = wswap(DEV9Header.dev9Ru32((int)addr));

            switch (addr)
            {
            case DEV9Header.SMAP_R_EMAC3_MODE0_L:
                DEV9.DEV9_LOG("SMAP: SMAP_R_EMAC3_MODE0 write " + value.ToString("X"));
                value = (value & (~DEV9Header.SMAP_E3_SOFT_RESET)) | DEV9Header.SMAP_E3_TXMAC_IDLE | DEV9Header.SMAP_E3_RXMAC_IDLE;
                UInt16 tmp = (UInt16)(DEV9Header.dev9Ru16((int)DEV9Header.SMAP_R_EMAC3_STA_CTRL_H) | DEV9Header.SMAP_E3_PHY_OP_COMP);
                DEV9Header.dev9Wu16((int)DEV9Header.SMAP_R_EMAC3_STA_CTRL_H, tmp);
                break;

            case DEV9Header.SMAP_R_EMAC3_TxMODE0_L:
                DEV9.DEV9_LOG("SMAP: SMAP_R_EMAC3_TxMODE0_L write " + value.ToString("X"));
                //spams// emu_printf("SMAP: SMAP_R_EMAC3_TxMODE0_L write %x\n", value);
                //Process TX  here ?
                if (!(value != 0) & (DEV9Header.SMAP_E3_TX_GNP_0 != 0))
                {
                    Console.Error.WriteLine("SMAP_R_EMAC3_TxMODE0_L: SMAP_E3_TX_GNP_0 not set");
                }

                tx_process();
                value = value & ~DEV9Header.SMAP_E3_TX_GNP_0;
                if (value != 0)
                {
                    Console.Error.WriteLine("SMAP_R_EMAC3_TxMODE0_L: extra bits set !");
                }
                break;

            case DEV9Header.SMAP_R_EMAC3_TxMODE1_L:
                Console.Error.WriteLine("SMAP_R_EMAC3_TxMODE1_L 32bit write " + value.ToString("X"));
                if (value == 0x380f0000)
                {
                    Console.Error.WriteLine("Adapter Detection Hack - Resetting RX/TX");
                    DEV9._DEV9irq(DEV9Header.SMAP_INTR_RXEND | DEV9Header.SMAP_INTR_TXEND | DEV9Header.SMAP_INTR_TXDNV, 5);
                }
                break;

            case DEV9Header.SMAP_R_EMAC3_STA_CTRL_L:
                DEV9.DEV9_LOG("SMAP: SMAP_R_EMAC3_STA_CTRL write " + value.ToString("X"));
                {
                    if ((value & (DEV9Header.SMAP_E3_PHY_READ)) != 0)
                    {
                        value |= DEV9Header.SMAP_E3_PHY_OP_COMP;
                        int    reg = (int)(value & (DEV9Header.SMAP_E3_PHY_REG_ADDR_MSK));
                        UInt16 val = DEV9Header.dev9.phyregs[reg];
                        switch (reg)
                        {
                        case DEV9Header.SMAP_DsPHYTER_BMSR:
                            if (has_link)
                            {
                                val |= DEV9Header.SMAP_PHY_BMSR_LINK | DEV9Header.SMAP_PHY_BMSR_ANCP;
                            }
                            break;

                        case DEV9Header.SMAP_DsPHYTER_PHYSTS:
                            if (has_link)
                            {
                                val |= DEV9Header.SMAP_PHY_STS_LINK | DEV9Header.SMAP_PHY_STS_100M | DEV9Header.SMAP_PHY_STS_FDX | DEV9Header.SMAP_PHY_STS_ANCP;
                            }
                            break;
                        }
                        DEV9.DEV9_LOG("phy_read " + reg.ToString() + ": " + val.ToString("X"));
                        value = (uint)((value & 0xFFFFu) | (uint)((int)val << 16));
                    }
                    if ((value & (DEV9Header.SMAP_E3_PHY_WRITE)) != 0)
                    {
                        value |= DEV9Header.SMAP_E3_PHY_OP_COMP;
                        int    reg = (int)(value & (DEV9Header.SMAP_E3_PHY_REG_ADDR_MSK));
                        UInt16 val = (UInt16)(value >> 16);
                        switch (reg)
                        {
                        case DEV9Header.SMAP_DsPHYTER_BMCR:
                            unchecked
                            {
                                val &= (ushort)(~DEV9Header.SMAP_PHY_BMCR_RST);
                            }
                            val |= 0x1;
                            break;
                        }
                        DEV9.DEV9_LOG("phy_write " + reg.ToString() + ": " + val.ToString("X"));
                        DEV9Header.dev9.phyregs[reg] = val;
                    }
                }
                break;

            default:
                DEV9.DEV9_LOG("SMAP: emac3 write  " + addr.ToString("X8") + "=" + value.ToString("X"));
                break;
            }
            DEV9Header.dev9Wu32((int)addr, wswap(value));
        }