mirror of
https://github.com/holub/mame
synced 2025-05-31 18:11:50 +03:00
186 lines
4.2 KiB
C++
186 lines
4.2 KiB
C++
#ifndef __SNS_SDD1_H
|
|
#define __SNS_SDD1_H
|
|
|
|
#include "machine/sns_slot.h"
|
|
|
|
// misc classes for the S-DD1
|
|
|
|
class SDD1_IM //Input Manager
|
|
{
|
|
public:
|
|
SDD1_IM() {}
|
|
|
|
UINT32 m_byte_ptr;
|
|
UINT8 m_bit_count;
|
|
|
|
void IM_prepareDecomp(UINT32 in_buf);
|
|
UINT8 IM_getCodeword(UINT8 *ROM, UINT32 *mmc, const UINT8 code_len);
|
|
};
|
|
|
|
class SDD1_GCD //Golomb-Code Decoder
|
|
{
|
|
public:
|
|
SDD1_GCD(SDD1_IM* associatedIM)
|
|
: m_IM(associatedIM) { }
|
|
|
|
SDD1_IM* m_IM;
|
|
|
|
void GCD_getRunCount(UINT8 *ROM, UINT32 *mmc, UINT8 code_num, UINT8* MPScount, UINT8* LPSind);
|
|
};
|
|
|
|
class SDD1_BG // Bits Generator
|
|
{
|
|
public:
|
|
SDD1_BG(SDD1_GCD* associatedGCD, UINT8 code)
|
|
: m_code_num(code),
|
|
m_GCD(associatedGCD) { }
|
|
|
|
UINT8 m_code_num;
|
|
UINT8 m_MPScount;
|
|
UINT8 m_LPSind;
|
|
SDD1_GCD* m_GCD;
|
|
|
|
void BG_prepareDecomp();
|
|
UINT8 BG_getBit(UINT8 *ROM, UINT32 *mmc, UINT8* endOfRun);
|
|
} ;
|
|
|
|
struct SDD1_PEM_ContextInfo
|
|
{
|
|
UINT8 status;
|
|
UINT8 MPS;
|
|
};
|
|
|
|
class SDD1_PEM //Probability Estimation Module
|
|
{
|
|
public:
|
|
SDD1_PEM(
|
|
SDD1_BG* associatedBG0, SDD1_BG* associatedBG1,
|
|
SDD1_BG* associatedBG2, SDD1_BG* associatedBG3,
|
|
SDD1_BG* associatedBG4, SDD1_BG* associatedBG5,
|
|
SDD1_BG* associatedBG6, SDD1_BG* associatedBG7)
|
|
{
|
|
m_BG[0] = associatedBG0;
|
|
m_BG[1] = associatedBG1;
|
|
m_BG[2] = associatedBG2;
|
|
m_BG[3] = associatedBG3;
|
|
m_BG[4] = associatedBG4;
|
|
m_BG[5] = associatedBG5;
|
|
m_BG[6] = associatedBG6;
|
|
m_BG[7] = associatedBG7;
|
|
}
|
|
|
|
SDD1_PEM_ContextInfo m_contextInfo[32];
|
|
SDD1_BG* m_BG[8];
|
|
|
|
void PEM_prepareDecomp();
|
|
UINT8 PEM_getBit(UINT8 *ROM, UINT32 *mmc, UINT8 context);
|
|
} ;
|
|
|
|
|
|
class SDD1_CM
|
|
{
|
|
public:
|
|
SDD1_CM(SDD1_PEM* associatedPEM)
|
|
: m_PEM(associatedPEM) { }
|
|
|
|
UINT8 m_bitplanesInfo;
|
|
UINT8 m_contextBitsInfo;
|
|
UINT8 m_bit_number;
|
|
UINT8 m_currBitplane;
|
|
UINT16 m_prevBitplaneBits[8];
|
|
SDD1_PEM* m_PEM;
|
|
|
|
void CM_prepareDecomp(UINT8 *ROM, UINT32 *mmc, UINT32 first_byte);
|
|
UINT8 CM_getBit(UINT8 *ROM, UINT32 *mmc);
|
|
} ;
|
|
|
|
|
|
class SDD1_OL
|
|
{
|
|
public:
|
|
SDD1_OL(SDD1_CM* associatedCM)
|
|
: m_CM(associatedCM) { }
|
|
|
|
UINT8 m_bitplanesInfo;
|
|
UINT16 m_length;
|
|
UINT8* m_buffer;
|
|
SDD1_CM* m_CM;
|
|
|
|
void OL_prepareDecomp(UINT8 *ROM, UINT32 *mmc, UINT32 first_byte, UINT16 out_len, UINT8 *out_buf);
|
|
void OL_launch(UINT8 *ROM, UINT32 *mmc);
|
|
} ;
|
|
|
|
class SDD1_emu
|
|
{
|
|
public:
|
|
SDD1_emu(running_machine &machine);
|
|
|
|
running_machine &machine() const { return m_machine; }
|
|
|
|
SDD1_IM* m_IM;
|
|
SDD1_GCD* m_GCD;
|
|
SDD1_BG* m_BG0; SDD1_BG* m_BG1; SDD1_BG* m_BG2; SDD1_BG* m_BG3;
|
|
SDD1_BG* m_BG4; SDD1_BG* m_BG5; SDD1_BG* m_BG6; SDD1_BG* m_BG7;
|
|
SDD1_PEM* m_PEM;
|
|
SDD1_CM* m_CM;
|
|
SDD1_OL* m_OL;
|
|
|
|
void SDD1emu_decompress(UINT8 *ROM, UINT32 *mmc, UINT32 in_buf, UINT16 out_len, UINT8 *out_buf);
|
|
|
|
private:
|
|
running_machine& m_machine;
|
|
};
|
|
|
|
|
|
|
|
// ======================> sns_rom_sdd1_device
|
|
|
|
class sns_rom_sdd1_device : public device_t,
|
|
public device_sns_cart_interface
|
|
{
|
|
public:
|
|
// construction/destruction
|
|
sns_rom_sdd1_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
|
|
sns_rom_sdd1_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
|
|
|
|
// device-level overrides
|
|
virtual void device_start();
|
|
virtual void device_reset();
|
|
|
|
// reading and writing
|
|
virtual DECLARE_READ8_MEMBER(read_l);
|
|
virtual DECLARE_READ8_MEMBER(read_h);
|
|
virtual DECLARE_READ8_MEMBER(read_ram);
|
|
virtual DECLARE_WRITE8_MEMBER(write_ram);
|
|
virtual DECLARE_READ8_MEMBER(chip_read);
|
|
virtual DECLARE_WRITE8_MEMBER(chip_write);
|
|
|
|
UINT8 read_helper(UINT32 offset);
|
|
|
|
UINT8 m_sdd1_enable; // channel bit-mask
|
|
UINT8 m_xfer_enable; // channel bit-mask
|
|
UINT32 m_mmc[4]; // memory map controller ROM indices
|
|
|
|
struct
|
|
{
|
|
UINT32 addr; // $43x2-$43x4 -- DMA transfer address
|
|
UINT16 size; // $43x5-$43x6 -- DMA transfer size
|
|
} m_dma[8];
|
|
|
|
SDD1_emu* m_sdd1emu;
|
|
|
|
struct
|
|
{
|
|
UINT8 *data; // pointer to decompressed S-DD1 data (65536 bytes)
|
|
UINT16 offset; // read index into S-DD1 decompression buffer
|
|
UINT32 size; // length of data buffer; reads decrement counter, set ready to false at 0
|
|
UINT8 ready; // 1 when data[] is valid; 0 to invoke sdd1emu.decompress()
|
|
} m_buffer;
|
|
};
|
|
|
|
|
|
// device type definition
|
|
extern const device_type SNS_LOROM_SDD1;
|
|
|
|
#endif
|