Subversion Repositories pentevo

Rev

Rev 883 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed | ?url?

  1. #ifndef VS1001_H
  2. #define VS1001_H
  3. #include "util.h"
  4.  
  5. #undef SD_SEND
  6.  
  7. // S_CTRL bits
  8. const u8 _MPNCS  = 2;
  9. const u8 _MPXRS  = 4;
  10. const u8 _MPHLF  = 8;
  11.  
  12. // S_STAT bits
  13. const u8 _MPDRQ  = 1;
  14.  
  15. const u8 S_CTRL  = 0x11; // RW
  16. const u8 S_STAT  = 0x12; // R
  17.  
  18. const u8 SD_SEND = 0x13; // W
  19. const u8 SD_READ = 0x13; // R
  20. const u8 SD_RSTR = 0x14; // R
  21.  
  22. const u8 MD_SEND = 0x14; // W same as SD_RSTR!!!
  23.  
  24. const u8 MC_SEND = 0x15; // W
  25. const u8 MC_READ = 0x15; // R
  26.  
  27. class TRingBuffer
  28. {
  29.     TCriticalSection CritSect;
  30.     TEvent NotEmpty;
  31.     const u32 Size;
  32.     u8 Buf[4*1024];
  33.     u32 WrPos;
  34.     u32 RdPos;
  35.     u32 Count;
  36.     bool Dreq;
  37.     bool Cancelled;
  38. public:
  39.     TRingBuffer() : NotEmpty(FALSE), Size(4*1024)
  40.     {
  41.         Cancelled = false;
  42.         Reset();
  43.     }
  44.     void Cancel()
  45.     {
  46.         CritSect.Lock();
  47.         Cancelled = true;
  48.         NotEmpty.Set();
  49.         CritSect.Unlock();
  50.     }
  51.     void Reset();
  52.     void Put(u8 Val);
  53.     u32 Get(void *Data, u32 ReqLen);
  54.     bool GetDreq() const { return Dreq; }
  55. };
  56.  
  57. class TVs1001
  58. {
  59.     enum TRegs
  60.     {
  61.        MODE = 0,   // RW
  62.        STATUS,     // RW
  63.        INT_FCTLH,  // NA
  64.        CLOCKF,     // RW
  65.        DECODE_TIME,// R
  66.        AUDATA,     // R
  67.        WRAM_W,     // W
  68.        WRAMADDR_W, // W
  69.        HDAT0,      // R
  70.        HDAT1,      // R
  71.        AIADDR,     // RW
  72.        VOL,        // RW
  73.        RESERVED,   // NA
  74.        AICTRL0,    // RW
  75.        AICTRL1,    // RW
  76.        REG_COUNT
  77.     };
  78.  
  79.     static const u8 SM_RESET = 4;
  80.  
  81.     enum TState { ST_IDLE, ST_RD, ST_WR, ST_RD_IDX, ST_WR_IDX, ST_RD_MSB, ST_RD_LSB, ST_WR_MSB, ST_WR_LSB };
  82.     enum TCmd { CMD_WR = 2, CMD_RD = 3 };
  83.     u16 Regs[REG_COUNT];
  84.     TState CurState;
  85.     bool nCs;
  86.     int Idx;
  87.     u8 Msb, Lsb;
  88.     TRingBuffer RingBuffer;
  89.     TEvent EventStreamClose;
  90.     HANDLE ThreadHandle;
  91.     HSTREAM Mp3Stream;
  92.     static BASS_FILEPROCS Procs;
  93. public:
  94.     TVs1001();
  95.     void Reset();
  96.     void ShutDown();
  97.     void SetNcs(bool nCs);
  98.     void Wr(u8 Val); // sdi mpeg data write
  99.     void WrCmd(u8 Val); // sci write
  100.     u8 Rd(); // sci read
  101.     void Play(); // play buffered data
  102.     bool GetDreq() const { return RingBuffer.GetDreq(); }
  103. private:
  104.     void Wr(int Idx, u16 Val); // sci write
  105.     u16 Rd(int Idx); // sci read
  106.  
  107.     void SoftReset();
  108.     void SetVol(u16 Vol);
  109.     u16 GetDecodeTime();
  110.  
  111.     void Thread();
  112.     void StreamClose();
  113.     QWORD StreamLen();
  114.     DWORD StreamRead(void *Buffer, DWORD Length);
  115.     BOOL StreamSeek(QWORD offset);
  116.  
  117.     static unsigned CALLBACK Thread(void *This)
  118.     {
  119.         ((TVs1001 *)This)->Thread();
  120.         return 0;
  121.     }
  122.  
  123.     static void CALLBACK StreamClose(void *This)
  124.     { ((TVs1001 *)This)->StreamClose(); }
  125.  
  126.     static QWORD CALLBACK StreamLen(void *This)
  127.     { return ((TVs1001 *)This)->StreamLen(); }
  128.  
  129.     static DWORD CALLBACK StreamRead(void *Buffer, DWORD Length, void *This)
  130.     { return ((TVs1001 *)This)->StreamRead(Buffer, Length); }
  131.  
  132.     static BOOL CALLBACK StreamSeek(QWORD offset, void *This)
  133.     { return ((TVs1001 *)This)->StreamSeek(offset); }
  134.  
  135.     static const char *State2Str(TState State);
  136. };
  137.  
  138. extern TVs1001 Vs1001;
  139. #endif
  140.