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)); } }
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)); } }
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); }
//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); } }
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")); }
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); }
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); }
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)); }