You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.9 KiB
68 lines
1.9 KiB
3 years ago
|
/*****
|
||
|
* SPC7110 emulator - version 0.03 (2008-08-10)
|
||
|
* Copyright (c) 2008, byuu and neviksti
|
||
|
*
|
||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||
|
* purpose with or without fee is hereby granted, provided that the above
|
||
|
* copyright notice and this permission notice appear in all copies.
|
||
|
*
|
||
|
* The software is provided "as is" and the author disclaims all warranties
|
||
|
* with regard to this software including all implied warranties of
|
||
|
* merchantibility and fitness, in no event shall the author be liable for
|
||
|
* any special, direct, indirect, or consequential damages or any damages
|
||
|
* whatsoever resulting from loss of use, data or profits, whether in an
|
||
|
* action of contract, negligence or other tortious action, arising out of
|
||
|
* or in connection with the use or performance of this software.
|
||
|
*****/
|
||
|
|
||
|
|
||
|
#ifndef _SPC7110DEC_H_
|
||
|
#define _SPC7110DEC_H_
|
||
|
|
||
|
class SPC7110Decomp {
|
||
|
public:
|
||
|
uint8 read();
|
||
|
void init(unsigned mode, unsigned offset, unsigned index);
|
||
|
void reset();
|
||
|
|
||
|
SPC7110Decomp();
|
||
|
~SPC7110Decomp();
|
||
|
|
||
|
unsigned decomp_mode;
|
||
|
unsigned decomp_offset;
|
||
|
|
||
|
//read() will spool chunks half the size of decomp_buffer_size
|
||
|
enum { decomp_buffer_size = SPC7110_DECOMP_BUFFER_SIZE }; //must be >= 64, and must be a power of two
|
||
|
uint8 *decomp_buffer;
|
||
|
unsigned decomp_buffer_rdoffset;
|
||
|
unsigned decomp_buffer_wroffset;
|
||
|
unsigned decomp_buffer_length;
|
||
|
|
||
|
void write(uint8 data);
|
||
|
uint8 dataread();
|
||
|
|
||
|
void mode0(bool init);
|
||
|
void mode1(bool init);
|
||
|
void mode2(bool init);
|
||
|
|
||
|
static const uint8 evolution_table[53][4];
|
||
|
static const uint8 mode2_context_table[32][2];
|
||
|
|
||
|
struct ContextState {
|
||
|
uint8 index;
|
||
|
uint8 invert;
|
||
|
} context[32];
|
||
|
|
||
|
uint8 probability(unsigned n);
|
||
|
uint8 next_lps(unsigned n);
|
||
|
uint8 next_mps(unsigned n);
|
||
|
uint8 toggle_invert(unsigned n);
|
||
|
|
||
|
unsigned morton16[2][256];
|
||
|
unsigned morton32[4][256];
|
||
|
unsigned morton_2x8(unsigned data);
|
||
|
unsigned morton_4x8(unsigned data);
|
||
|
};
|
||
|
|
||
|
#endif
|