⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dma.cpp

📁 著名SFC模拟器Snes9x的源代码。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		    Work = *(base + p);		    S9xSetPPU (Work, 0x2101 + d->BAddress);		    p += inc;		    CHECK_SOUND();		    count -= 2;		}		if (count == 1)		{		    Work = *(base + p);		    S9xSetPPU (Work, 0x2100 + d->BAddress);		    p += inc;		}	    }	}	else	if (d->TransferMode == 3)	{	    do	    {		Work = *(base + p);		S9xSetPPU (Work, 0x2100 + d->BAddress);		p += inc;		if (count <= 1)		    break;		Work = *(base + p);		S9xSetPPU (Work, 0x2100 + d->BAddress);		p += inc;		if (count <= 2)		    break;		Work = *(base + p);		S9xSetPPU (Work, 0x2101 + d->BAddress);		p += inc;		if (count <= 3)		    break;		Work = *(base + p);		S9xSetPPU (Work, 0x2101 + d->BAddress);		p += inc;		CHECK_SOUND();		count -= 4;	    } while (count > 0);	}	else	if (d->TransferMode == 4)	{	    do	    {		Work = *(base + p);		S9xSetPPU (Work, 0x2100 + d->BAddress);		p += inc;		if (count <= 1)		    break;		Work = *(base + p);		S9xSetPPU (Work, 0x2101 + d->BAddress);		p += inc;		if (count <= 2)		    break;		Work = *(base + p);		S9xSetPPU (Work, 0x2102 + d->BAddress);		p += inc;		if (count <= 3)		    break;		Work = *(base + p);		S9xSetPPU (Work, 0x2103 + d->BAddress);		p += inc;		CHECK_SOUND();		count -= 4;	    } while (count > 0);	}	else	{#ifdef DEBUGGER//	    if (Settings.TraceDMA)	    {		sprintf (String, "Unknown DMA transfer mode: %d on channel %d\n",			 d->TransferMode, Channel);		S9xMessage (S9X_TRACE, S9X_DMA_TRACE, String);	    }#endif	}    }    else    {	do	{	    switch (d->TransferMode)	    {	    case 0:	    case 2:#ifndef VAR_CYCLES		CPU.Cycles += 1;#endif		Work = S9xGetPPU (0x2100 + d->BAddress);		S9xSetByte (Work, (d->ABank << 16) + d->AAddress);		d->AAddress += inc;		--count;		break;	    case 1:	    case 5:#ifndef VAR_CYCLES		CPU.Cycles += 3;#endif		Work = S9xGetPPU (0x2100 + d->BAddress);		S9xSetByte (Work, (d->ABank << 16) + d->AAddress);		d->AAddress += inc;		if (!--count)		    break;		Work = S9xGetPPU (0x2101 + d->BAddress);		S9xSetByte (Work, (d->ABank << 16) + d->AAddress);		d->AAddress += inc;		count--;		break;			    case 3:#ifndef VAR_CYCLES		CPU.Cycles += 6;#endif		Work = S9xGetPPU (0x2100 + d->BAddress);		S9xSetByte (Work, (d->ABank << 16) + d->AAddress);		d->AAddress += inc;		if (!--count)		    break;		    		Work = S9xGetPPU (0x2100 + d->BAddress);		S9xSetByte (Work, (d->ABank << 16) + d->AAddress);		d->AAddress += inc;		if (!--count)		    break;		    		Work = S9xGetPPU (0x2101 + d->BAddress);		S9xSetByte (Work, (d->ABank << 16) + d->AAddress);		d->AAddress += inc;		if (!--count)		    break;		    		Work = S9xGetPPU (0x2101 + d->BAddress);		S9xSetByte (Work, (d->ABank << 16) + d->AAddress);		d->AAddress += inc;		count--;		break;	    case 4:#ifndef VAR_CYCLES		CPU.Cycles += 6;#endif		Work = S9xGetPPU (0x2100 + d->BAddress);		S9xSetByte (Work, (d->ABank << 16) + d->AAddress);		d->AAddress += inc;		if (!--count)		    break;		    		Work = S9xGetPPU (0x2101 + d->BAddress);		S9xSetByte (Work, (d->ABank << 16) + d->AAddress);		d->AAddress += inc;		if (!--count)		    break;		Work = S9xGetPPU (0x2102 + d->BAddress);		S9xSetByte (Work, (d->ABank << 16) + d->AAddress);		d->AAddress += inc;		if (!--count)		    break;		    		Work = S9xGetPPU (0x2103 + d->BAddress);		S9xSetByte (Work, (d->ABank << 16) + d->AAddress);		d->AAddress += inc;		count--;		break;	    default:#ifdef DEBUGGER		if (1) //Settings.TraceDMA)		{		    sprintf (String, "Unknown DMA transfer mode: %d on channel %d\n",			     d->TransferMode, Channel);		    S9xMessage (S9X_TRACE, S9X_DMA_TRACE, String);		}#endif		count = 0;		break;	    }	    CHECK_SOUND();	} while (count);    }    #ifdef SPC700_C    IAPU.APUExecuting = Settings.APUEnabled;    APU_EXECUTE ();#endif    while (CPU.Cycles > CPU.NextEvent)	S9xDoHBlankProcessing ();    // Super Punch-Out requires that the A-BUS address be updated after the    // DMA transfer.    Memory.FillRAM[0x4302 + (Channel << 4)] = (uint8) d->AAddress;    Memory.FillRAM[0x4303 + (Channel << 4)] = d->AAddress >> 8;    // Secret of the Mana requires that the DMA bytes transfer count be set to    // zero when DMA has completed.    Memory.FillRAM [0x4305 + (Channel << 4)] = 0;    Memory.FillRAM [0x4306 + (Channel << 4)] = 0;    DMA[Channel].IndirectAddress = 0;    d->TransferBytes = 0;        CPU.InDMA = FALSE;}void S9xStartHDMA (){    if (Settings.DisableHDMA)	IPPU.HDMA = 0;    else	missing.hdma_this_frame = IPPU.HDMA = Memory.FillRAM [0x420c];    IPPU.HDMAStarted = TRUE;    for (uint8 i = 0; i < 8; i++)    {	if (IPPU.HDMA & (1 << i))	{	    DMA [i].LineCount = 0;	    DMA [i].FirstLine = TRUE;	    DMA [i].Address = DMA [i].AAddress;	}	HDMAMemPointers [i] = NULL;    }}uint8 S9xDoHDMA (uint8 byte){    struct SDMA *p = &DMA [0];        int d = 0;    for (uint8 mask = 1; mask; mask <<= 1, p++, d++)    {	if (byte & mask)	{	    if (!p->LineCount)	    {		uint8 line = S9xGetByte ((p->ABank << 16) + p->Address);		if (line == 0x80)		{		    p->Repeat = TRUE;		    p->LineCount = 128;		}		else		{		    p->Repeat = !(line & 0x80);		    p->LineCount = line & 0x7f;		}				// Disable H-DMA'ing into V-RAM (register 2118) for Hook		if (!p->LineCount || p->BAddress == 0x18)		{		    byte &= ~mask;		    p->IndirectAddress += HDMAMemPointers [d] - HDMABasePointers [d];		    Memory.FillRAM [0x4305 + (d << 4)] = (uint8) p->IndirectAddress;		    Memory.FillRAM [0x4306 + (d << 4)] = p->IndirectAddress >> 8;		    continue;		}		p->Address++;		p->FirstLine = 1;		if (p->HDMAIndirectAddressing)		{		    p->IndirectBank = Memory.FillRAM [0x4307 + ((p - DMA) << 4)];		    p->IndirectAddress = S9xGetWord ((p->ABank << 16) + p->Address);		    p->Address += 2;		}		else		{		    p->IndirectBank = p->ABank;		    p->IndirectAddress = p->Address;		}		HDMABasePointers [d] = HDMAMemPointers [d] = 				    S9xGetMemPointer ((p->IndirectBank << 16) + p->IndirectAddress);	    }	    if (!HDMAMemPointers [d])	    {		if (!(HDMABasePointers [d] = HDMAMemPointers [d] = 			S9xGetMemPointer ((p->IndirectBank << 16) + p->IndirectAddress)))		{		    byte &= ~mask;		    continue;		}		// Uncommenting the following line breaks Punchout - it starts		// H-DMA during the frame.		//p->FirstLine = TRUE;	    }	    if (p->Repeat && !p->FirstLine)	    {		p->LineCount--;		continue;	    }// HERE//if (p->BAddress >= 0x40 && p->BAddress <= 0x43)//printf ("Spooling data!!!\n");#ifdef DEBUGGER	    if (Settings.TraceHDMA && p->FirstLine)	    {		sprintf (String, "H-DMA[%d] (%d) 0x%02X%04X->0x21%02X %s, Count: %3d, Rep: %s, V-LINE: %3ld %02X%04X",			 p-DMA, p->TransferMode, p->IndirectBank,			 p->IndirectAddress,			 p->BAddress,			 p->HDMAIndirectAddressing ? "ind" : "abs",			 p->LineCount,			 p->Repeat ? "yes" : "no ", CPU.V_Counter,			 p->ABank, p->Address);		S9xMessage (S9X_TRACE, S9X_HDMA_TRACE, String);	    }#endif	    switch (p->TransferMode)	    {	    case 0:#ifndef VAR_CYCLES		CPU.Cycles += 1;#else		CPU.Cycles += 8;#endif		S9xSetPPU (*HDMAMemPointers [d]++, 0x2100 + p->BAddress);		break;	    case 1:	    case 5:#ifndef VAR_CYCLES		CPU.Cycles += 3;#else		CPU.Cycles += 16;#endif		S9xSetPPU (*(HDMAMemPointers [d] + 0), 0x2100 + p->BAddress);		S9xSetPPU (*(HDMAMemPointers [d] + 1), 0x2101 + p->BAddress);		HDMAMemPointers [d] += 2;		break;	    case 2:	    case 6:#ifndef VAR_CYCLES		CPU.Cycles += 3;#else		CPU.Cycles += 16;#endif		S9xSetPPU (*(HDMAMemPointers [d] + 0), 0x2100 + p->BAddress);		S9xSetPPU (*(HDMAMemPointers [d] + 1), 0x2100 + p->BAddress);		HDMAMemPointers [d] += 2;		break;	    case 3:	    case 7:#ifndef VAR_CYCLES		CPU.Cycles += 6;#else		CPU.Cycles += 32;#endif		S9xSetPPU (*(HDMAMemPointers [d] + 0), 0x2100 + p->BAddress);		S9xSetPPU (*(HDMAMemPointers [d] + 1), 0x2100 + p->BAddress);		S9xSetPPU (*(HDMAMemPointers [d] + 2), 0x2101 + p->BAddress);		S9xSetPPU (*(HDMAMemPointers [d] + 3), 0x2101 + p->BAddress);		HDMAMemPointers [d] += 4;		break;	    case 4:#ifndef VAR_CYCLES		CPU.Cycles += 6;#else		CPU.Cycles += 32;#endif		S9xSetPPU (*(HDMAMemPointers [d] + 0), 0x2100 + p->BAddress);		S9xSetPPU (*(HDMAMemPointers [d] + 1), 0x2101 + p->BAddress);		S9xSetPPU (*(HDMAMemPointers [d] + 2), 0x2102 + p->BAddress);		S9xSetPPU (*(HDMAMemPointers [d] + 3), 0x2103 + p->BAddress);		HDMAMemPointers [d] += 4;		break;	    }	    if (!p->HDMAIndirectAddressing)		p->Address += HDMA_ModeByteCounts [p->TransferMode];	    p->FirstLine = FALSE;	    p->LineCount--;	}    }    return (byte);}void S9xResetDMA (){    int d;    for (d = 0; d < 8; d++)    {	DMA [d].TransferDirection = FALSE;	DMA [d].HDMAIndirectAddressing = FALSE;	DMA [d].AAddressFixed = TRUE;	DMA [d].AAddressDecrement = FALSE;	DMA [d].TransferMode = 0xff;	DMA [d].ABank = 0xff;	DMA [d].AAddress = 0xffff;	DMA [d].Address = 0xffff;	DMA [d].BAddress = 0xff;	DMA [d].TransferBytes = 0xffff;    }    for (int c = 0x4300; c < 0x4380; c += 0x10)    {	for (d = c; d < c + 12; d++)	    Memory.FillRAM [d] = 0xff;	Memory.FillRAM [c + 0xf] = 0xff;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -