154 lines
4.6 KiB
C
154 lines
4.6 KiB
C
|
// $Header: G:/SwDev/WDM/Video/bt848/rcs/Command.h 1.4 1998/04/29 22:43:31 tomz Exp $
|
||
|
|
||
|
#ifndef __COMMAND_H
|
||
|
#define __COMMAND_H
|
||
|
|
||
|
#ifndef __MEM_H
|
||
|
#include <memory.h>
|
||
|
#endif
|
||
|
|
||
|
#include "mytypes.h"
|
||
|
|
||
|
#define PROGRAM_TERMINATOR 0xa5a5a5a5
|
||
|
|
||
|
/* Type: Instruction
|
||
|
* Purpose: enumerates all RISC commands
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
WRIT = 0x01, SKIP = 0x02, WRITEC = 0x05,
|
||
|
JUMP = 0x07, SYNC = 0x08, WRITE123 = 0x09,
|
||
|
SKIP123 = 0x0A, WRITE1S23 = 0x0B, Reserved = 0xFF
|
||
|
} Instruction;
|
||
|
|
||
|
/* Type: SyncCode
|
||
|
* Purpose: enumerates all sync codes coming out of decoder
|
||
|
*/
|
||
|
typedef enum
|
||
|
{
|
||
|
SC_FM1 = 0x6, SC_FM3 = 0xE, SC_VRE = 0x4,
|
||
|
SC_VRO = 0xC, SC_RESYNC = 1, SC_Reserved = 0xFF
|
||
|
} SyncCode;
|
||
|
|
||
|
/* Class: Command
|
||
|
* Purpose: This class represents a RISC instruction in a more convenient form
|
||
|
* Attributes:
|
||
|
* Operations:
|
||
|
*/
|
||
|
class Command
|
||
|
{
|
||
|
public:
|
||
|
typedef union tag {
|
||
|
struct {
|
||
|
unsigned int ByteCount : 12;
|
||
|
unsigned int BE_Res : 4;
|
||
|
unsigned int StatusSet : 4;
|
||
|
unsigned int StatusReset : 4;
|
||
|
unsigned int IRQ : 1;
|
||
|
unsigned int Reserved : 1;
|
||
|
unsigned int EOL : 1;
|
||
|
unsigned int SOL : 1;
|
||
|
unsigned int OpCode : 4;
|
||
|
} Gen;
|
||
|
struct {
|
||
|
unsigned int Status : 4;
|
||
|
unsigned int Res1 : 11;
|
||
|
unsigned int Resync : 1;
|
||
|
unsigned int StatusSet : 4;
|
||
|
unsigned int StatusReset : 4;
|
||
|
unsigned int IRQ : 1;
|
||
|
unsigned int Res2 : 1;
|
||
|
unsigned int EOL : 1;
|
||
|
unsigned int SOL : 1;
|
||
|
unsigned int OpCode : 4;
|
||
|
} Sync;
|
||
|
|
||
|
struct {
|
||
|
unsigned int ByteCountCb : 12;
|
||
|
unsigned int skip : 4;
|
||
|
unsigned int ByteCountCr : 12;
|
||
|
} CRByteCounts;
|
||
|
|
||
|
DWORD Initer; // used to zero out all the fields
|
||
|
|
||
|
} FIRSTDWORD, *LPFIRSTDWORD;
|
||
|
|
||
|
private:
|
||
|
Instruction ThisInstr_;
|
||
|
|
||
|
static BYTE InstrSize_ [];
|
||
|
static BYTE InstrNumber_ [];
|
||
|
|
||
|
PDWORD pdwInstrAddr_;
|
||
|
|
||
|
public:
|
||
|
Instruction GetInstr() { return ThisInstr_; }
|
||
|
PDWORD GetInstrAddr() { return pdwInstrAddr_; }
|
||
|
|
||
|
BYTE GetInstrSize() { return InstrSize_ [InstrNumber_ [ThisInstr_] ]; }
|
||
|
|
||
|
BYTE GetInstrSize( Instruction inst )
|
||
|
{ return InstrSize_ [InstrNumber_ [inst] ]; }
|
||
|
|
||
|
LPVOID Create( LPVOID lpDst, Instruction Instr, WORD wByteCnt [],
|
||
|
DWORD dwAddress [], bool SafetyDevice = true,
|
||
|
bool SOL = true, bool EOL = true, bool Intr = false );
|
||
|
|
||
|
// start/end of line control
|
||
|
void SetSOL( PVOID lpFD ) { ((LPFIRSTDWORD)lpFD)->Gen.SOL = 1; }
|
||
|
void ResetSOL( PVOID lpFD ) { ((LPFIRSTDWORD)lpFD)->Gen.SOL = 0; }
|
||
|
|
||
|
void SetEOL( PVOID lpFD ) { ((LPFIRSTDWORD)lpFD)->Gen.EOL = 1; }
|
||
|
void ResetEOL( PVOID lpFD ) { ((LPFIRSTDWORD)lpFD)->Gen.EOL = 0; }
|
||
|
|
||
|
void SetIRQ( PVOID lpFD ) { ((LPFIRSTDWORD)lpFD)->Gen.IRQ = 1; }
|
||
|
void ResetIRQ( PVOID lpFD ) { ((LPFIRSTDWORD)lpFD)->Gen.IRQ = 0; }
|
||
|
|
||
|
void SetStatus( PVOID lpFD, int s )
|
||
|
{
|
||
|
((LPFIRSTDWORD)lpFD)->Gen.StatusSet = s;
|
||
|
((LPFIRSTDWORD)lpFD)->Gen.StatusReset = 0;
|
||
|
}
|
||
|
|
||
|
void ResetStatus( PVOID lpFD, int s )
|
||
|
{
|
||
|
((LPFIRSTDWORD)lpFD)->Gen.StatusReset = s;
|
||
|
((LPFIRSTDWORD)lpFD)->Gen.StatusSet = 0;
|
||
|
}
|
||
|
|
||
|
void SetToCount( PVOID lpFD )
|
||
|
{
|
||
|
((LPFIRSTDWORD)lpFD)->Gen.StatusReset = 0xF;
|
||
|
((LPFIRSTDWORD)lpFD)->Gen.StatusSet = 0xF;
|
||
|
}
|
||
|
|
||
|
// eol/sol query
|
||
|
bool IsEOL( PVOID lpFD ) { return bool( ((LPFIRSTDWORD)lpFD)->Gen.EOL ); }
|
||
|
bool IsSOL( PVOID lpFD ) { return bool( ((LPFIRSTDWORD)lpFD)->Gen.SOL ); }
|
||
|
bool IsIRQ( PVOID lpFD ) { return bool( ((LPFIRSTDWORD)lpFD)->Gen.IRQ ); }
|
||
|
WORD GetStatus( PVOID lpFD )
|
||
|
{
|
||
|
return WORD( ( ((LPFIRSTDWORD)lpFD)->Gen.StatusSet << 4 ) |
|
||
|
((LPFIRSTDWORD)lpFD)->Gen.StatusReset );
|
||
|
}
|
||
|
|
||
|
WORD GetSyncStatus( PVOID lpFD )
|
||
|
{ return (WORD)((LPFIRSTDWORD)lpFD)->Sync.Status; }
|
||
|
|
||
|
void SetSync( PVOID lpFD, SyncCode eACode, bool Resync = false ) {
|
||
|
((LPFIRSTDWORD)lpFD)->Sync.Status = eACode;
|
||
|
((LPFIRSTDWORD)lpFD)->Sync.Resync = Resync;
|
||
|
}
|
||
|
void SetResync( PVOID lpFD, bool val )
|
||
|
{ ((LPFIRSTDWORD)lpFD)->Sync.Resync = val; }
|
||
|
|
||
|
bool GetResync( PVOID lpFD )
|
||
|
{ return bool( ((LPFIRSTDWORD)lpFD)->Sync.Resync ); }
|
||
|
|
||
|
Command(){}// { Init(); }
|
||
|
Command( Instruction instr ) : ThisInstr_( instr ) {}
|
||
|
};
|
||
|
|
||
|
#endif __COMMAND_H
|
||
|
|