forked from dolphin-emu/dolphin
		
	
		
			
	
	
		
			216 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			216 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								#include "OpcodeReaders.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_u8 *readerMemPtr;
							 | 
						||
| 
								 | 
							
								_u8 *bufPtr;
							 | 
						||
| 
								 | 
							
								FifoData *gFifoData;
							 | 
						||
| 
								 | 
							
								_u32 gDListEnd, gDListPtr;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace OpcodeReaders
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									void SetBufPtr(_u8 *_bufptr)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										bufPtr = _bufptr;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									void SetFifoData(FifoData *_fdata)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										gFifoData = _fdata;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									void SetMemPtr(_u8 *_mptr)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										readerMemPtr = _mptr;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									void SetDListReader(_u32 _ptr, _u32 _end)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										gDListPtr = _ptr & 0x1FFFFFF;
							 | 
						||
| 
								 | 
							
										gDListEnd = _end & 0x1FFFFFF;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									void DListReaderSkip(int _skip)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										gDListPtr+=_skip;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									bool IsDListOKToRead()
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										return gDListPtr<gDListEnd;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								//FifoData *fifoData;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_u8 PeekFifo8()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									int addr = (gFifoData->readptr+1)^3;
							 | 
						||
| 
								 | 
							
									if (addr==gFifoData->gpend)
							 | 
						||
| 
								 | 
							
										addr=gFifoData->gpbegin;
							 | 
						||
| 
								 | 
							
									return readerMemPtr[addr];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								// ________________________________________________________________________________________________
							 | 
						||
| 
								 | 
							
								// ReadFifo8
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								_u8 ReadFifo8()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									while (
							 | 
						||
| 
								 | 
							
										(gFifoData->readenable == false) || 
							 | 
						||
| 
								 | 
							
										(gFifoData->readptr == gFifoData->writeptr) || 
							 | 
						||
| 
								 | 
							
										(gFifoData->bpenable && (gFifoData->readptr == gFifoData->breakpt))
							 | 
						||
| 
								 | 
							
										)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										//if (gFifoData->readptr == gFifoData->breakpt)
							 | 
						||
| 
								 | 
							
										//	MessageBox(0,"hello breakpoint",0,0);
							 | 
						||
| 
								 | 
							
										SwitchToFiber(gFifoData->cpuFiber);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									_u8 val = readerMemPtr[(gFifoData->readptr++)^3];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if (gFifoData->readptr == gFifoData->gpend)
							 | 
						||
| 
								 | 
							
										gFifoData->readptr = gFifoData->gpbegin;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return val;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ________________________________________________________________________________________________
							 | 
						||
| 
								 | 
							
								// ReadFifo16
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								_u16 ReadFifo16()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									//PowerPC byte ordering :(
							 | 
						||
| 
								 | 
							
									_u8 val1 = ReadFifo8();
							 | 
						||
| 
								 | 
							
									_u8 val2 = ReadFifo8();
							 | 
						||
| 
								 | 
							
									return (val1<<8)|(val2);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ________________________________________________________________________________________________
							 | 
						||
| 
								 | 
							
								// ReadFifo32
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								_u32 ReadFifo32()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									//PowerPC byte ordering :(
							 | 
						||
| 
								 | 
							
									_u8 val1 = ReadFifo8();
							 | 
						||
| 
								 | 
							
									_u8 val2 = ReadFifo8();
							 | 
						||
| 
								 | 
							
									_u8 val3 = ReadFifo8();
							 | 
						||
| 
								 | 
							
									_u8 val4 = ReadFifo8();
							 | 
						||
| 
								 | 
							
									return (val1<<24)|(val2<<16)|(val3<<8)|(val4);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_u32 GetPtrFifo()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return gFifoData->readptr;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_u8 PeekDList8()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									if (gDListPtr<gDListEnd-1)
							 | 
						||
| 
								 | 
							
										return readerMemPtr[(gDListPtr+1)^3];
							 | 
						||
| 
								 | 
							
									else
							 | 
						||
| 
								 | 
							
										return 0;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								// ________________________________________________________________________________________________
							 | 
						||
| 
								 | 
							
								// ReadFifo8
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								_u8 ReadDList8()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return readerMemPtr[(gDListPtr++)^3];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ________________________________________________________________________________________________
							 | 
						||
| 
								 | 
							
								// ReadFifo16
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								_u16 ReadDList16()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									//PowerPC byte ordering :(
							 | 
						||
| 
								 | 
							
									_u8 val1 = readerMemPtr[(gDListPtr++)^3];
							 | 
						||
| 
								 | 
							
									_u8 val2 = readerMemPtr[(gDListPtr++)^3];
							 | 
						||
| 
								 | 
							
									return (val1<<8)|(val2);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ________________________________________________________________________________________________
							 | 
						||
| 
								 | 
							
								// ReadFifo32
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								_u32 ReadDList32()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									//PowerPC byte ordering :(
							 | 
						||
| 
								 | 
							
									_u8 val1 = readerMemPtr[(gDListPtr++)^3];
							 | 
						||
| 
								 | 
							
									_u8 val2 = readerMemPtr[(gDListPtr++)^3];
							 | 
						||
| 
								 | 
							
									_u8 val3 = readerMemPtr[(gDListPtr++)^3];
							 | 
						||
| 
								 | 
							
									_u8 val4 = readerMemPtr[(gDListPtr++)^3];
							 | 
						||
| 
								 | 
							
									return (val1<<24)|(val2<<16)|(val3<<8)|(val4);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_u32 GetPtrDList()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return gDListPtr;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								_u8 PeekBuf8()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return bufPtr[0];
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ________________________________________________________________________________________________
							 | 
						||
| 
								 | 
							
								// ReadFifo8
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								_u8 ReadBuf8()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									return *bufPtr++;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ________________________________________________________________________________________________
							 | 
						||
| 
								 | 
							
								// ReadFifo16
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								_u16 ReadBuf16()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									_u16 val = *(_u16*)bufPtr;
							 | 
						||
| 
								 | 
							
									bufPtr+=2;
							 | 
						||
| 
								 | 
							
									return (val<<8)|(val>>8);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// ________________________________________________________________________________________________
							 | 
						||
| 
								 | 
							
								// ReadFifo32
							 | 
						||
| 
								 | 
							
								//
							 | 
						||
| 
								 | 
							
								_u32 ReadBuf32()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								//	_u32 val = *(_u32*)bufPtr;
							 | 
						||
| 
								 | 
							
									//__asm
							 | 
						||
| 
								 | 
							
								//	{
							 | 
						||
| 
								 | 
							
								//		mov ebx,bufPtr
							 | 
						||
| 
								 | 
							
								//		mov eax,[ebx]
							 | 
						||
| 
								 | 
							
								//		add ebx,4
							 | 
						||
| 
								 | 
							
								//		mov bufPtr,ebx
							 | 
						||
| 
								 | 
							
								//		bswap eax
							 | 
						||
| 
								 | 
							
								//	}
							 | 
						||
| 
								 | 
							
									_u32 high = ReadBuf16();
							 | 
						||
| 
								 | 
							
									return (high<<16) | ReadBuf16();
							 | 
						||
| 
								 | 
							
								//	return swap32(val);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ReaderInterface fifoReader =
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									ReadFifo8,
							 | 
						||
| 
								 | 
							
									PeekFifo8,
							 | 
						||
| 
								 | 
							
									ReadFifo16,
							 | 
						||
| 
								 | 
							
									ReadFifo32,
							 | 
						||
| 
								 | 
							
									GetPtrFifo
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ReaderInterface dlistReader = 
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									ReadDList8,
							 | 
						||
| 
								 | 
							
									PeekDList8,
							 | 
						||
| 
								 | 
							
									ReadDList16,
							 | 
						||
| 
								 | 
							
									ReadDList32,
							 | 
						||
| 
								 | 
							
									GetPtrDList
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ReaderInterface bufReader = 
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									ReadBuf8,
							 | 
						||
| 
								 | 
							
									PeekBuf8,
							 | 
						||
| 
								 | 
							
									ReadBuf16,
							 | 
						||
| 
								 | 
							
									ReadBuf32,
							 | 
						||
| 
								 | 
							
									0
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								ReaderInterface *reader;
							 |