262 lines
6.6 KiB
C++
262 lines
6.6 KiB
C++
// $Header: G:/SwDev/WDM/Video/bt848/rcs/Riscprog.h 1.9 1998/04/29 22:43:39 tomz Exp $
|
|
|
|
#ifndef __RISCPROG_H
|
|
#define __RISCPROG_H
|
|
|
|
#ifndef __MYTYPES_H
|
|
#include "mytypes.h"
|
|
#endif
|
|
|
|
#ifndef __VIDDEFS_H
|
|
#include "viddefs.h"
|
|
#endif
|
|
|
|
#ifndef __COLSPACE_H
|
|
#include "colspace.h"
|
|
#endif
|
|
|
|
#ifndef __PSPAGEBL_H
|
|
#include "pspagebl.h"
|
|
#endif
|
|
|
|
#ifndef __COMMAND_H
|
|
#include "command.h"
|
|
#endif
|
|
const Programs = 24;
|
|
|
|
inline LONGLONG operator-( const LARGE_INTEGER &first, const LARGE_INTEGER &second )
|
|
{
|
|
return first.QuadPart - second.QuadPart;
|
|
}
|
|
|
|
inline bool operator>( const LARGE_INTEGER &first, const LARGE_INTEGER &second )
|
|
{
|
|
return bool( first.QuadPart > second.QuadPart );
|
|
}
|
|
|
|
inline bool operator>=( const LARGE_INTEGER &first, const LARGE_INTEGER &second )
|
|
{
|
|
return bool( first.QuadPart >= second.QuadPart );
|
|
}
|
|
|
|
/* Class: RISCProgram
|
|
* Purpose: Facilitates creation and maintenance of a RISC programs
|
|
* Attributes: ImageSize_: SIZE - structure containing dimentions of the image
|
|
* dwBufPitch_: DWORD - buffer pitch
|
|
* Field_: VideoField - which field the program is for
|
|
* Interrupting_: bool
|
|
* ProgramSpace_: PsPageBlock * - pointer to the class that manages the memory
|
|
* occupied by a program ( allocates, deallocates, obtains information )
|
|
* BufFormat_: ColorSpace - format of the data in the buffer
|
|
* Operations:
|
|
* void ChangeAddress( DWORD dwNewAddr )
|
|
* void SetClipping( LPRECT pRect )
|
|
* void Create( bool NeedInterrupt )
|
|
* void SetChain( DWORD dwProgAddr )
|
|
* DWORD GetProgAddress()
|
|
* bool IsInterrupting()
|
|
*/
|
|
class RISCProgram
|
|
{
|
|
public:
|
|
PDWORD pChainAddress_;
|
|
|
|
private:
|
|
MSize ImageSize_;
|
|
DWORD dwBufPitch_;
|
|
|
|
bool Interrupting_;
|
|
bool Counting_;
|
|
|
|
PsPageBlock *ProgramSpace_;
|
|
ColorSpace BufFormat_;
|
|
RISCProgram *pChild_;
|
|
RISCProgram *pParent_;
|
|
PDWORD pIRQAddress_;
|
|
DWORD dwBufAddr_;
|
|
DWORD dwLinBufAddr_;
|
|
bool Skipped_;
|
|
bool GenerateResync_;
|
|
|
|
BOOL bAlreadyDumped_;
|
|
PVOID tag_;
|
|
LARGE_INTEGER ExtraTag_;
|
|
LARGE_INTEGER ExpectedExecutionTime_;
|
|
|
|
DWORD dwPlanarAdjust_;
|
|
DWORD dwSize_;
|
|
|
|
protected:
|
|
ErrorCode AllocateStorage( bool extra = false, int cnt = 1 );
|
|
PDWORD CreatePrologEpilog( PDWORD pProgLoc, SyncCode SyncBits,
|
|
Command &CurCommand, bool Resync = false );
|
|
ErrorCode GetDataBufPhys( DataBuf &buf );
|
|
|
|
void PutInChain();
|
|
|
|
public:
|
|
|
|
PHW_STREAM_REQUEST_BLOCK pSrb_;
|
|
|
|
DWORD GetDataBuffer( );
|
|
void SetDataBuffer( DWORD addr );
|
|
|
|
void ChangeAddress( DataBuf &buf );
|
|
ErrorCode Create( SyncCode SyncBits, bool resync = false );
|
|
ErrorCode Create( bool NeedInterrupt, DataBuf buf, DWORD dwPlanAdjust,
|
|
bool resync = false, bool Loop = true );
|
|
|
|
void MakeFault() { *((PDWORD)GetProgAddress()) = (DWORD)-1; }
|
|
DWORD GetProgAddress();
|
|
void SetJump( PDWORD JumpAddr );
|
|
|
|
// chaining/unchaining group
|
|
RISCProgram *GetParent() { return pParent_; }
|
|
RISCProgram *GetChild() { return pChild_; }
|
|
void SetParent( RISCProgram *p ) { pParent_ = p; }
|
|
void SetChild ( RISCProgram *p ) { pChild_ = p; }
|
|
void CreateLoop( bool );
|
|
void SetChain( RISCProgram *ChainTo );
|
|
void Skip();
|
|
void SetSkipped( bool sk = true );
|
|
void SetToCount();
|
|
void ResetStatus();
|
|
void SetStatus( int val );
|
|
void SetResync( bool val );
|
|
|
|
bool IsSkipped();
|
|
bool IsInterrupting();
|
|
|
|
void SetTag( PVOID value );
|
|
PVOID GetTag();
|
|
|
|
void SetTagEx( LARGE_INTEGER val );
|
|
LARGE_INTEGER GetTagEx();
|
|
|
|
LARGE_INTEGER GetExecTime() { return ExpectedExecutionTime_; }
|
|
|
|
// static RISCProgram CreateStarter();
|
|
|
|
DWORD GetPhysProgAddr();
|
|
void Dump();
|
|
|
|
RISCProgram( MSize &size, DWORD pitch, ColFmt aColor );
|
|
|
|
RISCProgram();
|
|
|
|
~RISCProgram();
|
|
|
|
friend class RISCEng;
|
|
};
|
|
|
|
/* Method: RISCProgram::GetProgramAddress
|
|
* Purpose: Obtains address of this program
|
|
* Input: None
|
|
* Output: DWORD: program's address
|
|
*/
|
|
inline DWORD RISCProgram::GetProgAddress()
|
|
{
|
|
return ProgramSpace_->getLinearBase();
|
|
}
|
|
|
|
inline void RISCProgram::SetToCount()
|
|
{
|
|
Command IRQCommand;
|
|
IRQCommand.SetToCount( pIRQAddress_ );
|
|
Counting_ = true;
|
|
}
|
|
|
|
inline void RISCProgram::ResetStatus()
|
|
{
|
|
Command IRQCommand;
|
|
IRQCommand.ResetStatus( pIRQAddress_, 0xF );
|
|
Counting_ = false;
|
|
}
|
|
|
|
inline void RISCProgram::SetStatus( int val )
|
|
{
|
|
Command IRQCommand;
|
|
IRQCommand.SetStatus( pIRQAddress_, val );
|
|
}
|
|
|
|
inline void RISCProgram::SetResync( bool val )
|
|
{
|
|
Command SyncCommand;
|
|
SyncCommand.SetResync( (PVOID)GetProgAddress(), val );
|
|
}
|
|
|
|
inline void RISCProgram::SetSkipped( bool sk )
|
|
{
|
|
Skipped_ = sk;
|
|
}
|
|
|
|
inline bool RISCProgram::IsSkipped()
|
|
{
|
|
return Skipped_;
|
|
}
|
|
|
|
inline bool RISCProgram::IsInterrupting()
|
|
{
|
|
return Interrupting_;
|
|
}
|
|
|
|
inline void RISCProgram::SetTag( PVOID value )
|
|
{
|
|
tag_ = value;
|
|
}
|
|
|
|
inline PVOID RISCProgram::GetTag()
|
|
{
|
|
return tag_;
|
|
}
|
|
|
|
inline void RISCProgram::SetTagEx( LARGE_INTEGER val )
|
|
{
|
|
ExtraTag_ = val;
|
|
}
|
|
|
|
inline LARGE_INTEGER RISCProgram::GetTagEx()
|
|
{
|
|
return ExtraTag_;
|
|
}
|
|
|
|
/*
|
|
inline RISCProgram RISCProgram::CreateStarter()
|
|
{
|
|
return RISCProgram();
|
|
}
|
|
*/
|
|
inline DWORD RISCProgram::GetPhysProgAddr()
|
|
{
|
|
return ProgramSpace_->GetPhysAddr();
|
|
}
|
|
|
|
inline RISCProgram::RISCProgram( MSize &size, DWORD pitch, ColFmt aColor ) :
|
|
ImageSize_( size ), dwBufPitch_( pitch ), Interrupting_( false ),
|
|
BufFormat_( aColor ), ProgramSpace_( NULL ), tag_( NULL ),
|
|
dwPlanarAdjust_( 0 ), pChild_( NULL ), pParent_( NULL ),
|
|
pChainAddress_( NULL ), GenerateResync_( false ), Skipped_( false ),
|
|
pIRQAddress_( NULL ), dwBufAddr_( 0 ), Counting_( false )
|
|
{
|
|
ExtraTag_.QuadPart = 0;
|
|
ExpectedExecutionTime_.QuadPart = 0;
|
|
bAlreadyDumped_ = FALSE;
|
|
dwSize_ = 0xffffffff;
|
|
pSrb_ = 0;
|
|
}
|
|
|
|
inline RISCProgram::RISCProgram() :
|
|
ImageSize_( 10, 10 ), dwBufPitch_( 0 ), Interrupting_( false ),
|
|
Counting_( false ), BufFormat_( CF_RGB32 ), ProgramSpace_( NULL ),
|
|
tag_( NULL ), GenerateResync_( false ), pChild_( NULL ), pParent_( NULL ),
|
|
pChainAddress_( NULL ), Skipped_( false ),
|
|
pIRQAddress_( NULL ), dwBufAddr_( 0 ), dwLinBufAddr_( 0 )
|
|
{
|
|
ExtraTag_.QuadPart = 0;
|
|
ExpectedExecutionTime_.QuadPart = 0;
|
|
bAlreadyDumped_ = FALSE;
|
|
dwSize_ = 0xffffffff;
|
|
pSrb_ = 0;
|
|
}
|
|
#endif
|