예제 #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));
            }
        }
예제 #2
0
        public override uint DEV9read32(uint addr)
        {
            //DEV9_LOG("DEV9read32");
            UInt32 hard;

            if (addr >= DEV9Header.ATA_DEV9_HDD_BASE && addr < DEV9Header.ATA_DEV9_HDD_END)
            {
                //#ifdef ENABLE_ATA
                //        return ata_read<4>(addr);
                //#else
                return(0);
                //#endif
            }
            if (addr >= DEV9Header.SMAP_REGBASE && addr < DEV9Header.FLASH_REGBASE)
            {
                //smap
                return(smap.smap_read32(addr));
            }
            switch (addr)
            {
            default:
                if ((addr >= DEV9Header.FLASH_REGBASE) && (addr < (DEV9Header.FLASH_REGBASE + DEV9Header.FLASH_REGSIZE)))
                {
                    return((UInt32)flash.FLASHread32(addr, 4));
                }

                hard = DEV9Header.dev9Ru32((int)addr);
                DEV9_LOG("*Unknown 32bit read at address " + addr.ToString("x") + " value " + hard.ToString("x"));
                return(hard);
            }

            //PluginLog.LogWriteLine("*Known 32bit read at address " + addr.ToString("x") + " value " + hard.ToString("x"));
            //return hard;
        }
예제 #3
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));
            }
        }
예제 #4
0
        public static void smap_write32(UInt32 addr, UInt32 value)
        {
            if (addr >= DEV9Header.SMAP_EMAC3_REGBASE && addr < DEV9Header.SMAP_EMAC3_REGEND)
            {
                smap_write16(addr, (UInt16)(value & 0xFFFF));
                smap_write16(addr + 2, (UInt16)(value >> 16));
                return;
            }
            switch (addr)
            {
            case DEV9Header.SMAP_R_TXFIFO_DATA:
                if (DEV9Header.dev9.bd_swap != 0)
                {
                    value = (value << 24) | (value >> 24) | ((value >> 8) & 0xFF00) | ((value << 8) & 0xFF0000);
                }

                DEV9.DEV9_LOG("SMAP_R_TXFIFO_DATA 32bit write " + value.ToString("X"));
                //*((u32*)(DEV9Header.dev9.txfifo + dev9Ru32(DEV9Header.SMAP_R_TXFIFO_WR_PTR))) = value; //I'm sorry but what??
                // I think this is how its supposed to work
                byte[] valuebytes = BitConverter.GetBytes(value);
                Utils.memcpy(ref DEV9Header.dev9.txfifo, (int)DEV9Header.dev9Ru32((int)DEV9Header.SMAP_R_TXFIFO_WR_PTR), valuebytes, 0, 4);
                //end of that one line
                DEV9Header.dev9Wu32((int)DEV9Header.SMAP_R_TXFIFO_WR_PTR, (DEV9Header.dev9Ru32((int)DEV9Header.SMAP_R_TXFIFO_WR_PTR) + 4) & 16383);
                return;

            default:
                DEV9.DEV9_LOG("SMAP : Unknown 32 bit write @ " + addr.ToString("X8") + ",v=" + value.ToString("X"));
                DEV9Header.dev9Wu32((int)addr, value);
                return;
            }

            //DEV9.DEV9_LOG("SMAP : error , 32 bit write @ %X,v=%X\n", addr, value);
            //DEV9Header.dev9Wu32((int)addr, value);
        }
예제 #5
0
        //this can return a false positive, but its not problem since it may say it cant recv while it can (no harm done, just delay on packets)
        public static bool rx_fifo_can_rx()
        {
            //check if RX is on & stuff like that here

            //Check if there is space on RXBD
            if (DEV9Header.dev9Ru8((int)DEV9Header.SMAP_R_RXFIFO_FRAME_CNT) == 64)
            {
                return(false);
            }

            //Check if there is space on fifo
            int rd_ptr = (int)DEV9Header.dev9Ru32((int)DEV9Header.SMAP_R_RXFIFO_RD_PTR);
            int space  = DEV9Header.dev9.rxfifo.Length -
                         ((DEV9Header.dev9.rxfifo_wr_ptr - rd_ptr) & 16383);

            if (space == 0)
            {
                space = (DEV9Header.dev9.rxfifo.Length);
            }

            if (space < 1514)
            {
                return(false);
            }

            //we can recv a packet !
            return(true);
        }
예제 #6
0
        public static UInt32 smap_read32(UInt32 addr)
        {
            if (addr >= DEV9Header.SMAP_EMAC3_REGBASE && addr < DEV9Header.SMAP_EMAC3_REGEND)
            {
                DEV9.DEV9_LOG("SMAP : 32bit read is double 16bit read");
                UInt32 hi = smap_read16(addr);
                UInt32 lo = (UInt32)((int)smap_read16(addr + 2) << 16);
                DEV9.DEV9_LOG("SMAP : Double 16bit read combined value " + (hi | lo).ToString("X"));
                return(hi | lo);
            }
            switch (addr)
            {
            case DEV9Header.SMAP_R_TXFIFO_FRAME_CNT:
                //Console.Error.WriteLine("SMAP_R_TXFIFO_FRAME_CNT read 32" + DEV9Header.dev9Ru32((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru32((int)addr));

            case DEV9Header.SMAP_R_RXFIFO_FRAME_CNT:
                //Console.Error.WriteLine("SMAP_R_RXFIFO_FRAME_CNT read 32\n" + DEV9Header.dev9Ru32((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru32((int)addr));

            case DEV9Header.SMAP_R_EMAC3_STA_CTRL_L:
                DEV9.DEV9_LOG("SMAP_R_EMAC3_STA_CTRL_L 32bit read value " + DEV9Header.dev9Ru32((int)addr).ToString("X"));
                return(DEV9Header.dev9Ru32((int)addr));

            case DEV9Header.SMAP_R_RXFIFO_DATA:
            {
                int rd_ptr = (int)DEV9Header.dev9Ru32((int)DEV9Header.SMAP_R_RXFIFO_RD_PTR) & 16383;

                //int rv = *((u32*)(dev9.rxfifo + rd_ptr));
                int rv = BitConverter.ToInt32(DEV9Header.dev9.rxfifo, rd_ptr);

                DEV9Header.dev9Wu32((int)DEV9Header.SMAP_R_RXFIFO_RD_PTR, (UInt32)((rd_ptr + 4) & 16383));

                if (DEV9Header.dev9.bd_swap != 0)
                {
                    rv = (rv << 24) | (rv >> 24) | ((rv >> 8) & 0xFF00) | ((rv << 8) & 0xFF0000);
                }

                DEV9.DEV9_LOG("SMAP_R_RXFIFO_DATA 32bit read " + rv.ToString("X"));
                return((uint)rv);
            }

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

            // DEV9_LOG("SMAP : error , 32 bit read @ %X,v=%X\n", addr, dev9Ru32(addr));
            //return DEV9Header.dev9Ru32((int)addr);
        }
예제 #7
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));
        }