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;
|