add atari800 emu to T-COMPUTER

pull/16/head
jean-marcharvengt 2022-03-05 11:32:46 +01:00
rodzic 3797069f3e
commit 39adf7a513
39 zmienionych plików z 19708 dodań i 21 usunięć

Wyświetl plik

@ -0,0 +1,361 @@
#include "emuapi.h"
#ifdef HAS_SND
#include "AudioPlaySystem.h"
#include <Arduino.h>
#define SAMPLERATE AUDIO_SAMPLE_RATE_EXACT
#define CLOCKFREQ 985248
#ifndef CUSTOM_SND
PROGMEM static const short square[]={
32767,32767,32767,32767,
32767,32767,32767,32767,
32767,32767,32767,32767,
32767,32767,32767,32767,
32767,32767,32767,32767,
32767,32767,32767,32767,
32767,32767,32767,32767,
32767,32767,32767,32767,
-32767,-32767,-32767,-32767,
-32767,-32767,-32767,-32767,
-32767,-32767,-32767,-32767,
-32767,-32767,-32767,-32767,
-32767,-32767,-32767,-32767,
-32767,-32767,-32767,-32767,
-32767,-32767,-32767,-32767,
-32767,-32767,-32767,-32767,
};
PROGMEM const short noise[] {
-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,
-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,-32767,32767,-32767,
-32767,-32767,32767,-32767,-32767,-32767,32767,-32767,-32767,-32767,32767,-32767,-32767,-32767,32767,-32767,
-32767,-32767,32767,-32767,-32767,-32767,32767,-32767,-32767,-32767,32767,-32767,-32767,32767,32767,-32767,
-32767,-32767,32767,-32767,-32767,32767,32767,-32767,-32767,-32767,32767,-32767,-32767,32767,32767,-32767,
-32767,-32767,32767,-32767,-32767,32767,32767,-32767,-32767,-32767,32767,-32767,32767,32767,32767,-32767,
32767,-32767,32767,-32767,-32767,32767,32767,-32767,-32767,-32767,32767,-32767,32767,32767,32767,-32767,
32767,-32767,32767,-32767,-32767,32767,32767,-32767,-32767,-32767,32767,32767,32767,32767,32767,-32767,
32767,-32767,32767,-32767,-32767,32767,32767,-32767,-32767,-32767,32767,32767,32767,32767,32767,-32767,
32767,-32767,32767,-32767,-32767,32767,32767,-32767,-32767,-32767,-32767,32767,32767,32767,-32767,-32767,
32767,-32767,-32767,-32767,-32767,32767,-32767,-32767,-32767,-32767,32767,32767,32767,32767,32767,-32767,
32767,-32767,32767,-32767,-32767,32767,32767,-32767,-32767,32767,-32767,32767,32767,32767,-32767,-32767,
32767,32767,-32767,-32767,-32767,32767,-32767,-32767,-32767,-32767,32767,32767,32767,32767,32767,-32767,
32767,-32767,32767,-32767,-32767,32767,32767,-32767,32767,32767,-32767,32767,-32767,32767,-32767,-32767,
32767,32767,-32767,-32767,-32767,32767,-32767,-32767,-32767,-32767,32767,32767,32767,32767,32767,-32767,
32767,-32767,32767,-32767,-32767,32767,32767,32767,32767,32767,-32767,32767,-32767,32767,-32767,-32767,
};
#define NOISEBSIZE 0x100
typedef struct
{
unsigned int spos;
unsigned int sinc;
unsigned int vol;
} Channel;
static Channel chan[6] = {
{0,0,0},
{0,0,0},
{0,0,0},
{0,0,0},
{0,0,0},
{0,0,0} };
#endif
volatile bool playing = false;
static void snd_Reset(void)
{
#ifndef CUSTOM_SND
chan[0].vol = 0;
chan[1].vol = 0;
chan[2].vol = 0;
chan[3].vol = 0;
chan[4].vol = 0;
chan[5].vol = 0;
chan[0].sinc = 0;
chan[1].sinc = 0;
chan[2].sinc = 0;
chan[3].sinc = 0;
chan[4].sinc = 0;
chan[5].sinc = 0;
#endif
}
#ifdef CUSTOM_SND
extern "C" {
void SND_Process(void *sndbuffer, int sndn);
}
#endif
FASTRUN void AudioPlaySystem::snd_Mixer(short * stream, int len )
{
if (playing)
{
#ifdef CUSTOM_SND
SND_Process((void*)stream, len);
#else
int i;
long s;
len = len >> 1;
short v0=chan[0].vol;
short v1=chan[1].vol;
short v2=chan[2].vol;
short v3=chan[3].vol;
short v4=chan[4].vol;
short v5=chan[5].vol;
for (i=0;i<len;i++)
{
s =((v0*square[(chan[0].spos>>8)&0x3f])>>11);
s+=((v1*square[(chan[1].spos>>8)&0x3f])>>11);
s+=((v2*square[(chan[2].spos>>8)&0x3f])>>11);
s+=((v3*noise[(chan[3].spos>>8)&(NOISEBSIZE-1)])>>11);
s+=((v4*noise[(chan[4].spos>>8)&(NOISEBSIZE-1)])>>11);
s+=((v5*noise[(chan[5].spos>>8)&(NOISEBSIZE-1)])>>11);
*stream++ = (short)(s);
*stream++ = (short)(s);
chan[0].spos += chan[0].sinc;
chan[1].spos += chan[1].sinc;
chan[2].spos += chan[2].sinc;
chan[3].spos += chan[3].sinc;
chan[4].spos += chan[4].sinc;
chan[5].spos += chan[5].sinc;
}
#endif
}
}
void AudioPlaySystem::begin(void)
{
this->reset();
}
void AudioPlaySystem::start(void)
{
playing = true;
}
void AudioPlaySystem::setSampleParameters(float clockfreq, float samplerate) {
}
void AudioPlaySystem::reset(void)
{
snd_Reset();
}
void AudioPlaySystem::stop(void)
{
//__disable_irq();
playing = false;
//__enable_irq();
}
bool AudioPlaySystem::isPlaying(void)
{
return playing;
}
void AudioPlaySystem::sound(int C, int F, int V) {
#ifndef CUSTOM_SND
if (C < 6) {
chan[C].vol = V;
chan[C].sinc = F>>1;
}
#endif
}
void AudioPlaySystem::step(void) {
}
#ifndef HAS_T4_VGA
/*******************************************************************
Experimental I2S interrupt based sound driver for PCM51xx !!!
*******************************************************************/
FLASHMEM static void set_audioClock(int nfact, int32_t nmult, uint32_t ndiv, bool force) // sets PLL4
{
if (!force && (CCM_ANALOG_PLL_AUDIO & CCM_ANALOG_PLL_AUDIO_ENABLE)) return;
CCM_ANALOG_PLL_AUDIO = CCM_ANALOG_PLL_AUDIO_BYPASS | CCM_ANALOG_PLL_AUDIO_ENABLE
| CCM_ANALOG_PLL_AUDIO_POST_DIV_SELECT(2) // 2: 1/4; 1: 1/2; 0: 1/1
| CCM_ANALOG_PLL_AUDIO_DIV_SELECT(nfact);
CCM_ANALOG_PLL_AUDIO_NUM = nmult & CCM_ANALOG_PLL_AUDIO_NUM_MASK;
CCM_ANALOG_PLL_AUDIO_DENOM = ndiv & CCM_ANALOG_PLL_AUDIO_DENOM_MASK;
CCM_ANALOG_PLL_AUDIO &= ~CCM_ANALOG_PLL_AUDIO_POWERDOWN;//Switch on PLL
while (!(CCM_ANALOG_PLL_AUDIO & CCM_ANALOG_PLL_AUDIO_LOCK)) {}; //Wait for pll-lock
const int div_post_pll = 1; // other values: 2,4
CCM_ANALOG_MISC2 &= ~(CCM_ANALOG_MISC2_DIV_MSB | CCM_ANALOG_MISC2_DIV_LSB);
if(div_post_pll>1) CCM_ANALOG_MISC2 |= CCM_ANALOG_MISC2_DIV_LSB;
if(div_post_pll>3) CCM_ANALOG_MISC2 |= CCM_ANALOG_MISC2_DIV_MSB;
CCM_ANALOG_PLL_AUDIO &= ~CCM_ANALOG_PLL_AUDIO_BYPASS;//Disable Bypass
}
#define AUDIO_SAMPLE_RATE_EXACT 11025.0 //44117.64706 //11025.0 //22050.0 //44117.64706 //31778.0
FLASHMEM static void config_sai1()
{
CCM_CCGR5 |= CCM_CCGR5_SAI1(CCM_CCGR_ON);
double fs = AUDIO_SAMPLE_RATE_EXACT;
// PLL between 27*24 = 648MHz und 54*24=1296MHz
int n1 = 4; //SAI prescaler 4 => (n1*n2) = multiple of 4
int n2 = 1 + (24000000 * 27) / (fs * 256 * n1);
double C = (fs * 256 * n1 * n2) / 24000000;
int c0 = C;
int c2 = 10000;
int c1 = C * c2 - (c0 * c2);
set_audioClock(c0, c1, c2, true);
// clear SAI1_CLK register locations
CCM_CSCMR1 = (CCM_CSCMR1 & ~(CCM_CSCMR1_SAI1_CLK_SEL_MASK))
| CCM_CSCMR1_SAI1_CLK_SEL(2); // &0x03 // (0,1,2): PLL3PFD0, PLL5, PLL4
n1 = n1 / 2; //Double Speed for TDM
CCM_CS1CDR = (CCM_CS1CDR & ~(CCM_CS1CDR_SAI1_CLK_PRED_MASK | CCM_CS1CDR_SAI1_CLK_PODF_MASK))
| CCM_CS1CDR_SAI1_CLK_PRED(n1 - 1) // &0x07
| CCM_CS1CDR_SAI1_CLK_PODF(n2 - 1); // &0x3f
IOMUXC_GPR_GPR1 = (IOMUXC_GPR_GPR1 & ~(IOMUXC_GPR_GPR1_SAI1_MCLK1_SEL_MASK))
| (IOMUXC_GPR_GPR1_SAI1_MCLK_DIR | IOMUXC_GPR_GPR1_SAI1_MCLK1_SEL(0)); //Select MCLK
// configure transmitter
int rsync = 0;
int tsync = 1;
I2S1_TMR = 0;
I2S1_TCR1 = I2S_TCR1_RFW(1);
I2S1_TCR2 = I2S_TCR2_SYNC(tsync) | I2S_TCR2_BCP // sync=0; tx is async;
| (I2S_TCR2_BCD | I2S_TCR2_DIV((1)) | I2S_TCR2_MSEL(1));
I2S1_TCR3 = I2S_TCR3_TCE;
I2S1_TCR4 = I2S_TCR4_FRSZ((2-1)) | I2S_TCR4_SYWD((32-1)) | I2S_TCR4_MF
| I2S_TCR4_FSD | I2S_TCR4_FSE | I2S_TCR4_FSP;
I2S1_TCR5 = I2S_TCR5_WNW((32-1)) | I2S_TCR5_W0W((32-1)) | I2S_TCR5_FBT((32-1));
I2S1_RMR = 0;
I2S1_RCR1 = I2S_RCR1_RFW(1);
I2S1_RCR2 = I2S_RCR2_SYNC(rsync) | I2S_RCR2_BCP // sync=0; rx is async;
| (I2S_RCR2_BCD | I2S_RCR2_DIV((1)) | I2S_RCR2_MSEL(1));
I2S1_RCR3 = I2S_RCR3_RCE;
I2S1_RCR4 = I2S_RCR4_FRSZ((2-1)) | I2S_RCR4_SYWD((32-1)) | I2S_RCR4_MF
| I2S_RCR4_FSE | I2S_RCR4_FSP | I2S_RCR4_FSD;
I2S1_RCR5 = I2S_RCR5_WNW((32-1)) | I2S_RCR5_W0W((32-1)) | I2S_RCR5_FBT((32-1));
//CORE_PIN23_CONFIG = 3; // MCLK
CORE_PIN21_CONFIG = 3; // RX_BCLK
CORE_PIN20_CONFIG = 3; // RX_SYNC
CORE_PIN7_CONFIG = 3; // TX_DATA0
I2S1_RCSR |= I2S_RCSR_RE | I2S_RCSR_BCE;
I2S1_TCSR = I2S_TCSR_TE | I2S_TCSR_BCE | I2S_TCSR_FRDE ;//<-- not using DMA */;
}
//DMAMEM __attribute__((aligned(32))) static uint32_t i2s_tx[1024];
static bool fillfirsthalf = true;
static uint16_t cnt = 0;
static uint16_t sampleBufferSize = 0;
static void (*fillsamples)(short * stream, int len) = nullptr;
static uint32_t * i2s_tx_buffer __attribute__((aligned(32)));
static uint16_t * i2s_tx_buffer16;
static uint16_t * txreg = (uint16_t *)((uint32_t)&I2S1_TDR0 + 2);
FASTRUN void AudioPlaySystem::AUDIO_isr() {
*txreg = i2s_tx_buffer16[cnt];
cnt = cnt + 1;
cnt = cnt & (sampleBufferSize*2-1);
if (cnt == 0) {
fillfirsthalf = false;
NVIC_SET_PENDING(IRQ_SOFTWARE);
}
else if (cnt == sampleBufferSize) {
fillfirsthalf = true;
NVIC_SET_PENDING(IRQ_SOFTWARE);
}
/*
I2S1_TDR0 = i2s_tx_buffer[cnt];
cnt = cnt + 1;
cnt = cnt & (sampleBufferSize-1);
if (cnt == 0) {
fillfirsthalf = false;
NVIC_SET_PENDING(IRQ_SOFTWARE);
}
else if (cnt == sampleBufferSize/2) {
fillfirsthalf = true;
NVIC_SET_PENDING(IRQ_SOFTWARE);
}
*/
}
FASTRUN void AudioPlaySystem::SOFTWARE_isr() {
//Serial.println("x");
if (fillfirsthalf) {
fillsamples((short *)i2s_tx_buffer, sampleBufferSize);
arm_dcache_flush_delete((void*)i2s_tx_buffer, (sampleBufferSize/2)*sizeof(uint32_t));
}
else {
fillsamples((short *)&i2s_tx_buffer[sampleBufferSize/2], sampleBufferSize);
arm_dcache_flush_delete((void*)&i2s_tx_buffer[sampleBufferSize/2], (sampleBufferSize/2)*sizeof(uint32_t));
}
}
// display VGA image
FLASHMEM void AudioPlaySystem::begin_audio(int samplesize, void (*callback)(short * stream, int len))
{
fillsamples = callback;
i2s_tx_buffer = (uint32_t*)malloc(samplesize*sizeof(uint32_t)); //&i2s_tx[0];
if (i2s_tx_buffer == NULL) {
Serial.println("could not allocate audio samples");
return;
}
memset((void*)i2s_tx_buffer,0, samplesize*sizeof(uint32_t));
arm_dcache_flush_delete((void*)i2s_tx_buffer, samplesize*sizeof(uint32_t));
i2s_tx_buffer16 = (uint16_t*)i2s_tx_buffer;
sampleBufferSize = samplesize;
config_sai1();
attachInterruptVector(IRQ_SAI1, AUDIO_isr);
NVIC_ENABLE_IRQ(IRQ_SAI1);
NVIC_SET_PRIORITY(IRQ_QTIMER3, 0); // 0 highest priority, 255 = lowest priority
NVIC_SET_PRIORITY(IRQ_SAI1, 127);
attachInterruptVector(IRQ_SOFTWARE, SOFTWARE_isr);
NVIC_SET_PRIORITY(IRQ_SOFTWARE, 208);
NVIC_ENABLE_IRQ(IRQ_SOFTWARE);
I2S1_TCSR |= 1<<8; // start generating TX FIFO interrupts
Serial.print("Audio sample buffer = ");
Serial.println(samplesize);
}
FLASHMEM void AudioPlaySystem::end_audio()
{
if (i2s_tx_buffer != NULL) {
free(i2s_tx_buffer);
}
}
#endif
#endif

Wyświetl plik

@ -0,0 +1,34 @@
#ifndef audioplaysystem_h_
#define audioplaysystem_h_
#ifdef HAS_SND
#include "platform_config.h"
class AudioPlaySystem
{
public:
AudioPlaySystem(void) { };
void begin(void);
void setSampleParameters(float clockfreq, float samplerate);
void reset(void);
void start(void);
void stop(void);
bool isPlaying(void);
void sound(int C, int F, int V);
void buzz(int size, int val);
void step(void);
static void snd_Mixer(short * stream, int len );
#ifndef HAS_T4_VGA
void begin_audio(int samplesize, void (*callback)(short * stream, int len));
void end_audio();
static void AUDIO_isr(void);
static void SOFTWARE_isr(void);
#endif
};
#endif
#endif

Wyświetl plik

@ -0,0 +1,239 @@
#ifndef AKEY_H_
#define AKEY_H_
/* akey.h: Atari key codes */
/* INPUT_key_code values */
#define AKEY_NONE -1
/* Special key codes. */
#define AKEY_WARMSTART -2
#define AKEY_COLDSTART -3
#define AKEY_EXIT -4
#define AKEY_BREAK -5
#define AKEY_UI -7
#define AKEY_SCREENSHOT -8
#define AKEY_SCREENSHOT_INTERLACE -9
#define AKEY_START -10
#define AKEY_SELECT -11
#define AKEY_OPTION -12
#define AKEY_PBI_BB_MENU -13
#define AKEY_CX85_1 -14
#define AKEY_CX85_2 -15
#define AKEY_CX85_3 -16
#define AKEY_CX85_4 -17
#define AKEY_CX85_5 -18
#define AKEY_CX85_6 -19
#define AKEY_CX85_7 -20
#define AKEY_CX85_8 -21
#define AKEY_CX85_9 -22
#define AKEY_CX85_0 -23
#define AKEY_CX85_PERIOD -24
#define AKEY_CX85_MINUS -25
#define AKEY_CX85_PLUS_ENTER -26
#define AKEY_CX85_ESCAPE -27
#define AKEY_CX85_NO -28
#define AKEY_CX85_DELETE -29
#define AKEY_CX85_YES -30
#define AKEY_TURBO -31
#ifdef USE_UI_BASIC_ONSCREEN_KEYBOARD
#define AKEY_KEYB -32
#endif
#ifdef DIRECTX
/* special menu directives */
#define AKEY32_MENU_SAVE_CONFIG -107
#define AKEY32_UI_MOUSE_CLICK -108
#endif
#define AKEY_SHFT 0x40
#define AKEY_CTRL 0x80
#define AKEY_SHFTCTRL 0xc0
#define AKEY_0 0x32
#define AKEY_1 0x1f
#define AKEY_2 0x1e
#define AKEY_3 0x1a
#define AKEY_4 0x18
#define AKEY_5 0x1d
#define AKEY_6 0x1b
#define AKEY_7 0x33
#define AKEY_8 0x35
#define AKEY_9 0x30
#define AKEY_CTRL_0 (AKEY_CTRL | AKEY_0)
#define AKEY_CTRL_1 (AKEY_CTRL | AKEY_1)
#define AKEY_CTRL_2 (AKEY_CTRL | AKEY_2)
#define AKEY_CTRL_3 (AKEY_CTRL | AKEY_3)
#define AKEY_CTRL_4 (AKEY_CTRL | AKEY_4)
#define AKEY_CTRL_5 (AKEY_CTRL | AKEY_5)
#define AKEY_CTRL_6 (AKEY_CTRL | AKEY_6)
#define AKEY_CTRL_7 (AKEY_CTRL | AKEY_7)
#define AKEY_CTRL_8 (AKEY_CTRL | AKEY_8)
#define AKEY_CTRL_9 (AKEY_CTRL | AKEY_9)
#define AKEY_a 0x3f
#define AKEY_b 0x15
#define AKEY_c 0x12
#define AKEY_d 0x3a
#define AKEY_e 0x2a
#define AKEY_f 0x38
#define AKEY_g 0x3d
#define AKEY_h 0x39
#define AKEY_i 0x0d
#define AKEY_j 0x01
#define AKEY_k 0x05
#define AKEY_l 0x00
#define AKEY_m 0x25
#define AKEY_n 0x23
#define AKEY_o 0x08
#define AKEY_p 0x0a
#define AKEY_q 0x2f
#define AKEY_r 0x28
#define AKEY_s 0x3e
#define AKEY_t 0x2d
#define AKEY_u 0x0b
#define AKEY_v 0x10
#define AKEY_w 0x2e
#define AKEY_x 0x16
#define AKEY_y 0x2b
#define AKEY_z 0x17
#define AKEY_A (AKEY_SHFT | AKEY_a)
#define AKEY_B (AKEY_SHFT | AKEY_b)
#define AKEY_C (AKEY_SHFT | AKEY_c)
#define AKEY_D (AKEY_SHFT | AKEY_d)
#define AKEY_E (AKEY_SHFT | AKEY_e)
#define AKEY_F (AKEY_SHFT | AKEY_f)
#define AKEY_G (AKEY_SHFT | AKEY_g)
#define AKEY_H (AKEY_SHFT | AKEY_h)
#define AKEY_I (AKEY_SHFT | AKEY_i)
#define AKEY_J (AKEY_SHFT | AKEY_j)
#define AKEY_K (AKEY_SHFT | AKEY_k)
#define AKEY_L (AKEY_SHFT | AKEY_l)
#define AKEY_M (AKEY_SHFT | AKEY_m)
#define AKEY_N (AKEY_SHFT | AKEY_n)
#define AKEY_O (AKEY_SHFT | AKEY_o)
#define AKEY_P (AKEY_SHFT | AKEY_p)
#define AKEY_Q (AKEY_SHFT | AKEY_q)
#define AKEY_R (AKEY_SHFT | AKEY_r)
#define AKEY_S (AKEY_SHFT | AKEY_s)
#define AKEY_T (AKEY_SHFT | AKEY_t)
#define AKEY_U (AKEY_SHFT | AKEY_u)
#define AKEY_V (AKEY_SHFT | AKEY_v)
#define AKEY_W (AKEY_SHFT | AKEY_w)
#define AKEY_X (AKEY_SHFT | AKEY_x)
#define AKEY_Y (AKEY_SHFT | AKEY_y)
#define AKEY_Z (AKEY_SHFT | AKEY_z)
#define AKEY_CTRL_a (AKEY_CTRL | AKEY_a)
#define AKEY_CTRL_b (AKEY_CTRL | AKEY_b)
#define AKEY_CTRL_c (AKEY_CTRL | AKEY_c)
#define AKEY_CTRL_d (AKEY_CTRL | AKEY_d)
#define AKEY_CTRL_e (AKEY_CTRL | AKEY_e)
#define AKEY_CTRL_f (AKEY_CTRL | AKEY_f)
#define AKEY_CTRL_g (AKEY_CTRL | AKEY_g)
#define AKEY_CTRL_h (AKEY_CTRL | AKEY_h)
#define AKEY_CTRL_i (AKEY_CTRL | AKEY_i)
#define AKEY_CTRL_j (AKEY_CTRL | AKEY_j)
#define AKEY_CTRL_k (AKEY_CTRL | AKEY_k)
#define AKEY_CTRL_l (AKEY_CTRL | AKEY_l)
#define AKEY_CTRL_m (AKEY_CTRL | AKEY_m)
#define AKEY_CTRL_n (AKEY_CTRL | AKEY_n)
#define AKEY_CTRL_o (AKEY_CTRL | AKEY_o)
#define AKEY_CTRL_p (AKEY_CTRL | AKEY_p)
#define AKEY_CTRL_q (AKEY_CTRL | AKEY_q)
#define AKEY_CTRL_r (AKEY_CTRL | AKEY_r)
#define AKEY_CTRL_s (AKEY_CTRL | AKEY_s)
#define AKEY_CTRL_t (AKEY_CTRL | AKEY_t)
#define AKEY_CTRL_u (AKEY_CTRL | AKEY_u)
#define AKEY_CTRL_v (AKEY_CTRL | AKEY_v)
#define AKEY_CTRL_w (AKEY_CTRL | AKEY_w)
#define AKEY_CTRL_x (AKEY_CTRL | AKEY_x)
#define AKEY_CTRL_y (AKEY_CTRL | AKEY_y)
#define AKEY_CTRL_z (AKEY_CTRL | AKEY_z)
#define AKEY_CTRL_A (AKEY_CTRL | AKEY_A)
#define AKEY_CTRL_B (AKEY_CTRL | AKEY_B)
#define AKEY_CTRL_C (AKEY_CTRL | AKEY_C)
#define AKEY_CTRL_D (AKEY_CTRL | AKEY_D)
#define AKEY_CTRL_E (AKEY_CTRL | AKEY_E)
#define AKEY_CTRL_F (AKEY_CTRL | AKEY_F)
#define AKEY_CTRL_G (AKEY_CTRL | AKEY_G)
#define AKEY_CTRL_H (AKEY_CTRL | AKEY_H)
#define AKEY_CTRL_I (AKEY_CTRL | AKEY_I)
#define AKEY_CTRL_J (AKEY_CTRL | AKEY_J)
#define AKEY_CTRL_K (AKEY_CTRL | AKEY_K)
#define AKEY_CTRL_L (AKEY_CTRL | AKEY_L)
#define AKEY_CTRL_M (AKEY_CTRL | AKEY_M)
#define AKEY_CTRL_N (AKEY_CTRL | AKEY_N)
#define AKEY_CTRL_O (AKEY_CTRL | AKEY_O)
#define AKEY_CTRL_P (AKEY_CTRL | AKEY_P)
#define AKEY_CTRL_Q (AKEY_CTRL | AKEY_Q)
#define AKEY_CTRL_R (AKEY_CTRL | AKEY_R)
#define AKEY_CTRL_S (AKEY_CTRL | AKEY_S)
#define AKEY_CTRL_T (AKEY_CTRL | AKEY_T)
#define AKEY_CTRL_U (AKEY_CTRL | AKEY_U)
#define AKEY_CTRL_V (AKEY_CTRL | AKEY_V)
#define AKEY_CTRL_W (AKEY_CTRL | AKEY_W)
#define AKEY_CTRL_X (AKEY_CTRL | AKEY_X)
#define AKEY_CTRL_Y (AKEY_CTRL | AKEY_Y)
#define AKEY_CTRL_Z (AKEY_CTRL | AKEY_Z)
#define AKEY_HELP 0x11
#define AKEY_DOWN 0x8f
#define AKEY_LEFT 0x86
#define AKEY_RIGHT 0x87
#define AKEY_UP 0x8e
#define AKEY_BACKSPACE 0x34
#define AKEY_DELETE_CHAR 0xb4
#define AKEY_DELETE_LINE 0x74
#define AKEY_INSERT_CHAR 0xb7
#define AKEY_INSERT_LINE 0x77
#define AKEY_ESCAPE 0x1c
#define AKEY_ATARI 0x27
#define AKEY_CAPSLOCK 0x7c
#define AKEY_CAPSTOGGLE 0x3c
#define AKEY_TAB 0x2c
#define AKEY_SETTAB 0x6c
#define AKEY_CLRTAB 0xac
#define AKEY_RETURN 0x0c
#define AKEY_SPACE 0x21
#define AKEY_EXCLAMATION 0x5f
#define AKEY_DBLQUOTE 0x5e
#define AKEY_HASH 0x5a
#define AKEY_DOLLAR 0x58
#define AKEY_PERCENT 0x5d
#define AKEY_AMPERSAND 0x5b
#define AKEY_QUOTE 0x73
#define AKEY_AT 0x75
#define AKEY_PARENLEFT 0x70
#define AKEY_PARENRIGHT 0x72
#define AKEY_LESS 0x36
#define AKEY_GREATER 0x37
#define AKEY_EQUAL 0x0f
#define AKEY_QUESTION 0x66
#define AKEY_MINUS 0x0e
#define AKEY_PLUS 0x06
#define AKEY_ASTERISK 0x07
#define AKEY_SLASH 0x26
#define AKEY_COLON 0x42
#define AKEY_SEMICOLON 0x02
#define AKEY_COMMA 0x20
#define AKEY_FULLSTOP 0x22
#define AKEY_UNDERSCORE 0x4e
#define AKEY_BRACKETLEFT 0x60
#define AKEY_BRACKETRIGHT 0x62
#define AKEY_CIRCUMFLEX 0x47
#define AKEY_BACKSLASH 0x46
#define AKEY_BAR 0x4f
#define AKEY_CLEAR (AKEY_SHFT | AKEY_LESS)
#define AKEY_CARET (AKEY_SHFT | AKEY_ASTERISK)
#define AKEY_F1 0x03
#define AKEY_F2 0x04
#define AKEY_F3 0x13
#define AKEY_F4 0x14
/* Following keys cannot be read with both shift and control pressed:
J K L ; + * Z X C V B F1 F2 F3 F4 HELP */
#endif /* AKEY_H_ */

Plik diff jest za duży Load Diff

Wyświetl plik

@ -0,0 +1,136 @@
#ifndef ANTIC_H_
#define ANTIC_H_
#include "atari.h"
/*
* Offset to registers in custom relative to start of antic memory addresses.
*/
#define ANTIC_OFFSET_DMACTL 0x00
#define ANTIC_OFFSET_CHACTL 0x01
#define ANTIC_OFFSET_DLISTL 0x02
#define ANTIC_OFFSET_DLISTH 0x03
#define ANTIC_OFFSET_HSCROL 0x04
#define ANTIC_OFFSET_VSCROL 0x05
#define ANTIC_OFFSET_PMBASE 0x07
#define ANTIC_OFFSET_CHBASE 0x09
#define ANTIC_OFFSET_WSYNC 0x0a
#define ANTIC_OFFSET_VCOUNT 0x0b
#define ANTIC_OFFSET_PENH 0x0c
#define ANTIC_OFFSET_PENV 0x0d
#define ANTIC_OFFSET_NMIEN 0x0e
#define ANTIC_OFFSET_NMIRES 0x0f
#define ANTIC_OFFSET_NMIST 0x0f
extern UBYTE ANTIC_CHACTL;
extern UBYTE ANTIC_CHBASE;
extern UWORD ANTIC_dlist;
extern UBYTE ANTIC_DMACTL;
extern UBYTE ANTIC_HSCROL;
extern UBYTE ANTIC_NMIEN;
extern UBYTE ANTIC_NMIST;
extern UBYTE ANTIC_PMBASE;
extern UBYTE ANTIC_VSCROL;
extern int ANTIC_break_ypos;
extern int ANTIC_ypos;
extern int ANTIC_wsync_halt;
/* Current clock cycle in a scanline.
Normally 0 <= ANTIC_xpos && ANTIC_xpos < ANTIC_LINE_C, but in some cases ANTIC_xpos >= ANTIC_LINE_C,
which means that we are already in line (ypos + 1). */
extern int ANTIC_xpos;
/* ANTIC_xpos limit for the currently running 6502 emulation. */
extern int ANTIC_xpos_limit;
/* Main clock value at the beginning of the current scanline. */
extern unsigned int ANTIC_screenline_cpu_clock;
/* Current main clock value. */
#define ANTIC_CPU_CLOCK (ANTIC_screenline_cpu_clock + ANTIC_XPOS)
#define ANTIC_NMIST_C 6
#define ANTIC_NMI_C 12
/* Number of cycles per scanline. */
#define ANTIC_LINE_C 114
/* STA WSYNC resumes here. */
#define ANTIC_WSYNC_C 106
/* Number of memory refresh cycles per scanline.
In the first scanline of a font mode there are actually less than ANTIC_DMAR
memory refresh cycles. */
#define ANTIC_DMAR 9
extern int ANTIC_artif_mode;
extern int ANTIC_artif_new;
extern UBYTE ANTIC_PENH_input;
extern UBYTE ANTIC_PENV_input;
int ANTIC_Initialise(void);
void ANTIC_Reset(void);
void ANTIC_Frame(int draw_display);
UBYTE ANTIC_GetByte(UWORD addr, int no_side_effects);
void ANTIC_PutByte(UWORD addr, UBYTE byte);
UBYTE ANTIC_GetDLByte(UWORD *paddr);
UWORD ANTIC_GetDLWord(UWORD *paddr);
/* always call ANTIC_UpdateArtifacting after changing ANTIC_artif_mode */
void ANTIC_UpdateArtifacting(void);
/* Video memory access */
void ANTIC_VideoMemset(UBYTE *ptr, UBYTE val, ULONG size);
void ANTIC_VideoPutByte(UBYTE *ptr, UBYTE val);
/* GTIA calls it on a write to PRIOR */
void ANTIC_SetPrior(UBYTE prior);
/* Saved states */
void ANTIC_StateSave(void);
void ANTIC_StateRead(void);
/* Pointer to 16 KB seen by ANTIC in 0x4000-0x7fff.
If it's the same what the CPU sees (and what's in memory[0x4000..0x7fff],
then NULL. */
extern const UBYTE *ANTIC_xe_ptr;
/* PM graphics for GTIA */
extern int ANTIC_player_dma_enabled;
extern int ANTIC_missile_dma_enabled;
extern int ANTIC_player_gra_enabled;
extern int ANTIC_missile_gra_enabled;
extern int ANTIC_player_flickering;
extern int ANTIC_missile_flickering;
/* ANTIC colour lookup tables, used by GTIA */
extern UWORD ANTIC_cl[128];
extern ULONG ANTIC_lookup_gtia9[16];
extern ULONG ANTIC_lookup_gtia11[16];
extern UWORD ANTIC_hires_lookup_l[128];
#ifdef NEW_CYCLE_EXACT
#define ANTIC_NOT_DRAWING -999
#define ANTIC_DRAWING_SCREEN (ANTIC_cur_screen_pos!=ANTIC_NOT_DRAWING)
extern int ANTIC_delayed_wsync;
extern int ANTIC_cur_screen_pos;
extern const int *ANTIC_cpu2antic_ptr;
extern const int *ANTIC_antic2cpu_ptr;
void ANTIC_UpdateScanline(void);
void ANTIC_UpdateScanlinePrior(UBYTE byte);
#define ANTIC_XPOS ( ANTIC_DRAWING_SCREEN ? ANTIC_cpu2antic_ptr[ANTIC_xpos] : ANTIC_xpos )
#else
#define ANTIC_XPOS ANTIC_xpos
#endif /* NEW_CYCLE_EXACT */
#ifndef NO_SIMPLE_PAL_BLENDING
/* Set to 1 to enable simplified emulation of PAL blending, that uses only
the standard 8-bit palette. */
extern int ANTIC_pal_blending;
#endif /* NO_SIMPLE_PAL_BLENDING */
#endif /* ANTIC_H_ */

Wyświetl plik

@ -0,0 +1,102 @@
#ifndef __ATARI__
#define __ATARI__
// define globals
#define MEMORY_SIZE 0xC000 //0x10000
#define ATARI_WIDTH 384
#define ATARI_HEIGHT 240
#define TV_PAL 312
#define TV_NTSC 262
//#define DIRTYRECT 1
//#define WORDS_UNALIGNED_OK 1
//#define ALTERNATE_LOOP_COUNTERS 1
//#define NEW_CYCLE_EXACT 1
//#define USE_CURSES 1
//#define WORDS_BIGENDIAN 1
//#define SYNCHRONIZED_SOUND 1
#define CLIP_SOUND 1
#define STEREO_SOUND 1
#define POKEYSND_SIGNED_SAMPLES 1
#define PAGED_MEM 1
#define SOUND 1
#define NO_SIMPLE_PAL_BLENDING 1
#define max_ypos tv_mode
extern int tv_mode;
extern unsigned char INPUT_key_consol;
enum ESCAPE {
ESC_SIOV,
/*
* These are special device escape codes required by the Basic version
*/
ESC_E_OPEN,
ESC_E_CLOSE,
ESC_E_READ,
ESC_E_WRITE,
ESC_E_STATUS,
ESC_E_SPECIAL,
ESC_K_OPEN,
ESC_K_CLOSE,
ESC_K_READ,
ESC_K_WRITE,
ESC_K_STATUS,
ESC_K_SPECIAL,
/*
* These are Escape codes for the normal device handlers.
* Some are never used and some are only sometimes used.
*/
ESC_PHOPEN = 0xb0,
ESC_PHCLOS = 0xb1,
ESC_PHREAD = 0xb2,
ESC_PHWRIT = 0xb3,
ESC_PHSTAT = 0xb4,
ESC_PHSPEC = 0xb5,
ESC_PHINIT = 0xb6,
ESC_HHOPEN = 0xc0,
ESC_HHCLOS = 0xc1,
ESC_HHREAD = 0xc2,
ESC_HHWRIT = 0xc3,
ESC_HHSTAT = 0xc4,
ESC_HHSPEC = 0xc5,
ESC_HHINIT = 0xc6,
ESC_BREAK = 0xff
};
#ifndef _TYPEDEF_H
#define _TYPEDEF_H
//data types
#define UBYTE unsigned char
#define UWORD unsigned short
#define ULONG unsigned int
#define SBYTE signed char
#define SWORD signed short
#define SLONG signed int
#define int8 char
#define int16 short
#define int32 int
#define uint8 unsigned int8
#define uint16 unsigned int16
#define uint32 unsigned int32
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
#endif
#endif

Wyświetl plik

@ -0,0 +1,564 @@
#include "atari800.h"
#include <string.h>
#include "memory.h"
#include "cpu.h"
#include "atari.h"
#include "akey.h"
#include "pokey.h"
#include <Arduino.h>
//#include "romatariosa.h"
#include "romatariosb.h"
//#include "romatarixl.h"
#include "antic.h"
#include "gtia.h"
#include "pia.h"
#include "colours.h"
#include "emuapi.h"
#if HAS_SND
#include "pokeysnd.h"
#endif
// Controllers
typedef struct
{
// All values are 1 or 0, or perhaps not...
int left;
int right;
int up;
int down;
int trig;
} CONTROLLER;
// global variables
EXTMEM static unsigned char MemPool[8*1024*1024];
unsigned char * memory=&MemPool[0];
int tv_mode = TV_PAL;
UBYTE INPUT_key_consol;
// local variables
static CONTROLLER cont1, cont2;
static int INPUT_key_code = AKEY_NONE;
static int INPUT_key_shift = 0;
/* MEMORY MAP INDEX (0 is invalid)
* 0-3FFF RAM (read/write)
* 4000-7FFF RAM (read/write)
* 8000-9FFF BASIC right CART 8K
* A000-BFFF BASIC left CART 8K
* D000-D0FF GTIA regs
* D200-D2FF POKEY regs
* D300-D3FF PIA regs
* D400-D4FF ANTIC regs
* D800-FFFF OS ROM (ro)
* E000 I/O expansion
*/
// memory CPU read (load) handler
uint8 Atari_GetByte(uint16 addr)
{
if (addr < MEMORY_SIZE) { // MAPPER_RAM
return(memory[addr]);
}
else if ( (addr >= 0xD000) && (addr < 0xD100) ) { // MAPPER_GTIA
return GTIA_GetByte(addr,1);
}
else if ( (addr >= 0xD200) && (addr < 0xD300) ) { // MAPPER_POKEY
return POKEY_GetByte(addr,1);
}
else if ( (addr >= 0xD300) && (addr < 0xD400) ) { // MAPPER_PIA
return PIA_GetByte(addr);
}
else if ( (addr >= 0xD400) && (addr < 0xD500) ) { // MAPPER_ANTIC
return ANTIC_GetByte(addr,1);
}
else if ((addr >= 0xD800) && (addr < 0x10000)) { // MAPPER_ROM (bios)
//return(memory[addr]);
return(romos[addr-0xD800]);
}
//case MAPPER_IOEXP: // I/O exp read
// return IOEXPread(addr);
return 0xff;
}
// memory CPU write (store) handler
void Atari_PutByte(uint16 addr, uint8 byte)
{
if (addr < 0x8000) { // MAPPER_RAM
memory[addr] = byte;
}
else if (addr < 0xC000) { // MAPPER_ROM
}
else if ( (addr >= 0xD000) && (addr < 0xD100) ) { // MAPPER_GTIA
GTIA_PutByte(addr, byte);
}
else if ( (addr >= 0xD200) && (addr < 0xD300) ) { // MAPPER_POKEY
POKEY_PutByte(addr, byte);
}
else if ( (addr >= 0xD300) && (addr < 0xD400) ) { // MAPPER_PIA
PIA_PutByte(addr, byte);
}
else if ( (addr >= 0xD400) && (addr < 0xD500) ) { // MAPPER_ANTIC
ANTIC_PutByte(addr, byte);
}
//case MAPPER_IOEXP: // I/O exp write
// IOEXPwrite(addr, byte);
}
static void INPUT_Frame(void)
{
int i;
static int last_key_code = AKEY_NONE;
static int last_key_break = 0;
if (cont1.trig) GTIA_TRIG[0]=0; else GTIA_TRIG[0]=1;
i = (INPUT_key_code == AKEY_BREAK);
if (i && !last_key_break) {
if (POKEY_IRQEN & 0x80) {
POKEY_IRQST &= ~0x80;
CPU_GenerateIRQ();
}
}
last_key_break = i;
POKEY_SKSTAT |= 0xc;
if (INPUT_key_shift)
POKEY_SKSTAT &= ~8;
if (INPUT_key_code < 0) {
//if (CASSETTE_press_space) {
// INPUT_key_code = AKEY_SPACE;
// CASSETTE_press_space = 0;
//}
//else {
last_key_code = AKEY_NONE;
//}
}
if ((INPUT_key_code&~0x17) == AKEY_SHFTCTRL) {
INPUT_key_code = AKEY_NONE;
}
if (INPUT_key_code >= 0) {
//emu_printi(INPUT_key_code);
POKEY_SKSTAT &= ~4;
if ((INPUT_key_code ^ last_key_code) & ~AKEY_SHFTCTRL) {
/* ignore if only shift or control has changed its state */
last_key_code = INPUT_key_code;
POKEY_KBCODE = (UBYTE) INPUT_key_code;
if (POKEY_IRQEN & 0x40) {
if (POKEY_IRQST & 0x40) {
POKEY_IRQST &= ~0x40;
CPU_GenerateIRQ();
}
else {
/* keyboard over-run */
POKEY_SKSTAT &= ~0x40;
/* assert(CPU_IRQ != 0); */
}
}
}
}
}
// check keyboard and set kbcode on VBI (not for A800)
void INPUT_Scanline(void)
{
// if (cont1.trig) GTIA_TRIG[0]=0; else GTIA_TRIG[0]=1;
}
static void load_CART(char * cartname)
{
int flen = emu_FileSize(cartname);
int f = emu_FileOpen(cartname, "r+b");
if (flen < 16384) {
//emu_FileRead(&memory[0xA000], flen, f);
emu_printf("8k");
for(int i=0; i<flen; i++) memory[0xA000 + i] = emu_FileGetc(f);
}
else {
emu_printf("16k");
//emu_FileRead(&memory[0x8000], flen, f);
for(int i=0; i<flen; i++) memory[0x8000 + i] = emu_FileGetc(f);
}
emu_FileClose(f);
}
void add_esc(UWORD address, UBYTE esc_code)
{
memory[address++] = 0xf2; /* ESC */
memory[address++] = esc_code; /* ESC CODE */
memory[address] = 0x60; /* RTS */
}
int Atari_PORT(int num)
{
int nibble_0 = 0xff;
int nibble_1 = 0xff;
if (num == 0)
{
if (cont1.left) nibble_0 &= ~0x04;
if (cont1.right) nibble_0 &= ~0x08;
if (cont1.up) nibble_0 &= ~0x01;
if (cont1.down) nibble_0 &= ~0x02;
if (cont2.left) nibble_1 &= ~0x04;
if (cont2.right) nibble_1 &= ~0x08;
if (cont2.up) nibble_1 &= ~0x01;
if (cont2.down) nibble_1 &= ~0x02;
}
return (nibble_1 << 4) | nibble_0;
}
static void Initialise(void)
{
int i;
emu_printf("Initialising ...");
// Set up memory area
memset(memory, 0, MEMORY_SIZE);
memset(memory+0x8000, 0xff, 0x4000);
// init controllers
memset(&cont1, 0, sizeof(CONTROLLER));
memset(&cont2, 0, sizeof(CONTROLLER));
// Load bios to address 0xF800
//for (i = 0; i < 0x2800; i++)
//{
// memory[0xD800 + i] = romos[i];
//}
//add_esc(0xe459, ESC_SIOV);
}
#define INV_KEY 0
const int16_t keyboardAsciiConv[] = // Ascii to Spectrum keys
{
/* 0x00 */ INV_KEY,
/* 0x01 */ INV_KEY,
/* 0x02 */ INV_KEY,
/* 0x03 */ INV_KEY,
/* 0x04 */ INV_KEY,
/* 0x05 */ INV_KEY,
/* 0x06 */ INV_KEY,
/* 0x07 */ INV_KEY,
/* 0x08 */ INV_KEY,
/* 0x09 */ 0x2C, // tab
/* 0x0A */ 0x0C, // enter
/* 0x0B */ INV_KEY,
/* 0x0C */ INV_KEY,
/* 0x0D */ INV_KEY,
/* 0x0E */ INV_KEY,
/* 0x0F */ INV_KEY,
/* 0x10 */ INV_KEY,
/* 0x11 */ INV_KEY,
/* 0x12 */ INV_KEY,
/* 0x13 */ INV_KEY,
/* 0x14 */ INV_KEY,
/* 0x15 */ INV_KEY,
/* 0x16 */ INV_KEY,
/* 0x17 */ INV_KEY,
/* 0x18 */ INV_KEY,
/* 0x19 */ INV_KEY,
/* 0x1A */ INV_KEY,
/* 0x1B */ INV_KEY, // esc
/* 0x1C */ INV_KEY,
/* 0x1D */ INV_KEY,
/* 0x1E */ INV_KEY,
/* 0x1F */ INV_KEY,
/* 0x20 */ 0x21, // space
/* 0x21 */ 95, // ! exclamation mark
/* 0x22 */ 94, // " double quote
/* 0x23 */ 90, // # dies
/* 0x24 */ 88, // $ dollar
/* 0x25 */ 93, // % percent
/* 0x26 */ 91, // & ampercent
/* 0x27 */ INV_KEY, // ' singlequote
/* 0x28 */ 112, // ( bracket left
/* 0x29 */ 114, // ) bracket right
/* 0x2A */ 0x0E, // * mult
/* 0x2B */ 0x06, // + plus
/* 0x2C */ 0x20, // , comma
/* 0x2D */ 0x0E, // - minus
/* 0x2E */ 0x22, // . period
/* 0x2F */ 0x26, // / slash
/* 0x30 */ 0x32, // 0
/* 0x31 */ 0x1F, // 1
/* 0x32 */ 0x1E, // 2
/* 0x33 */ 0x1A, // 3
/* 0x34 */ 0x18, // 4
/* 0x35 */ 0x1D, // 5
/* 0x36 */ 0x1B, // 6
/* 0x37 */ 0x33, // 7
/* 0x38 */ 0x35, // 8
/* 0x39 */ 0x30, // 9
/* 0x3A */ 66, // : colon
/* 0x3B */ 0x02, // ; semi colon
/* 0x3C */ 0x36, // <
/* 0x3D */ 0x0F, // = equal
/* 0x3E */ 0x37, // >
/* 0x3F */ 102, // ?
/* 0x40 */ 117, // @
/* 0x41 */ INV_KEY, // A
/* 0x42 */ INV_KEY, // B
/* 0x43 */ INV_KEY, // C
/* 0x44 */ INV_KEY, // D
/* 0x45 */ INV_KEY, // E
/* 0x46 */ INV_KEY, // F
/* 0x47 */ INV_KEY, // G
/* 0x48 */ INV_KEY, // H
/* 0x49 */ INV_KEY, // I
/* 0x4A */ INV_KEY, // J
/* 0x4B */ INV_KEY, // K
/* 0x4C */ INV_KEY, // L
/* 0x4D */ INV_KEY, // M
/* 0x4E */ INV_KEY, // N
/* 0x4F */ INV_KEY, // O
/* 0x50 */ INV_KEY, // P
/* 0x51 */ INV_KEY, // Q
/* 0x52 */ INV_KEY, // R
/* 0x53 */ INV_KEY, // S
/* 0x54 */ INV_KEY, // T
/* 0x55 */ INV_KEY, // U
/* 0x56 */ INV_KEY, // V
/* 0x57 */ INV_KEY, // W
/* 0x58 */ INV_KEY, // X
/* 0x59 */ INV_KEY, // Y
/* 0x5A */ INV_KEY, // Z
/* 0x5B */ INV_KEY, // square bracket open
/* 0x5C */ INV_KEY, // backslach
/* 0x5D */ INV_KEY, // square braquet close
/* 0x5E */ INV_KEY, // ^ circonflex
/* 0x5F */ INV_KEY, // _ undescore
/* 0x60 */ INV_KEY, // `backquote
/* 0x61 */ 0x3F, // a
/* 0x62 */ 0x15, // b
/* 0x63 */ 0x12, // c
/* 0x64 */ 0x3A, // d
/* 0x65 */ 0x2A, // e
/* 0x66 */ 0x38, // f
/* 0x67 */ 0x3D, // g
/* 0x68 */ 0x39, // h
/* 0x69 */ 0x0D, // i
/* 0x6A */ 0x01, // j
/* 0x6B */ 0x05, // k
/* 0x6C */ 0x00, // l
/* 0x6D */ 0x25, // m
/* 0x6E */ 0x23, // n
/* 0x6F */ 0x08, // o
/* 0x70 */ 0x0A, // p
/* 0x71 */ 0x2F, // q
/* 0x72 */ 0x28, // r
/* 0x73 */ 0x3E, // s
/* 0x74 */ 0x2D, // t
/* 0x75 */ 0x0B, // u
/* 0x76 */ 0x10, // v
/* 0x77 */ 0x2E, // w
/* 0x78 */ 0x15, // x
/* 0x79 */ 0x2B, // y
/* 0x7A */ 0x17, // z
/* 0x7B */ INV_KEY, // curly bracket open
/* 0x7C */ INV_KEY, // or
/* 0x7D */ INV_KEY, // curly bracket close
/* 0x7E */ INV_KEY, // tilt
/* 0x7F */ 0x34, // backspace
/* 0xC0 */ INV_KEY,
/* 0xC1 */ INV_KEY,
/* 0xC2 */ INV_KEY, // F1
/* 0xC3 */ INV_KEY, // F2
/* 0xC4 */ INV_KEY, // F3
/* 0xC5 */ INV_KEY, // F4
/* 0xC6 */ INV_KEY, // F5
/* 0xC7 */ INV_KEY, // F6
/* 0xC8 */ INV_KEY, // F7
/* 0xC9 */ INV_KEY, // F8
/* 0xCA */ INV_KEY, // F9
/* 0xCB */ INV_KEY, // F10
/* 0xCC */ INV_KEY,
/* 0xCD */ INV_KEY,
/* 0xCE */ INV_KEY,
/* 0xCF */ INV_KEY,
/* 0xD0 */ INV_KEY,
/* 0xD1 */ INV_KEY,
/* 0xD2 */ INV_KEY,
/* 0xD3 */ INV_KEY,
/* 0xD4 */ INV_KEY, // DEL
/* 0xD5 */ INV_KEY,
/* 0xD6 */ INV_KEY,
/* 0xD7 */ INV_KEY, // U
/* 0xD8 */ INV_KEY, // L
/* 0xD9 */ INV_KEY, // R
/* 0xDA */ INV_KEY, // D
/* 0xDB */ INV_KEY,
/* 0xDC */ INV_KEY,
/* 0xDD */ INV_KEY,
/* 0xDE */ INV_KEY,
/* 0xDF */ INV_KEY
};
static int ik; // joypad key
static int ihk; // I2C keyboard key
static int iusbhk; // USB keyboard key
static int prevhk; // previous keyboard key
void emu_KeyboardOnDown(int keymodifer, int key) {
int keyCode = -1; //INV_KEY;
if ((key >=0xc0) && (key <=0xdf)) {
keyCode = ((key-0xc0) & 0x1f) + 0x80;
}
else {
keyCode = key & 0x7f;
}
//emu_printh(key);
//emu_printh(keyCode);
if (keyCode != -1) {
iusbhk = keyCode;
}
}
void emu_KeyboardOnUp(int keymodifer, int key) {
iusbhk = 0;
}
void at8_Input(int click) {
ik = emu_GetPad();
ihk = emu_ReadI2CKeyboard();
}
void at8_Init(void)
{
int i;
// Palette
for (i = 0; i < PALETTE_SIZE; i++)
{
emu_SetPaletteEntry(R32(colourtable[i]), G32(colourtable[i]), B32(colourtable[i]), i);
}
#if HAS_SND
emu_sndInit();
POKEYSND_Init(POKEYSND_FREQ_17_APPROX, 44100, 1, POKEYSND_BIT16);
#endif
emu_printf("Allocating RAM");
if (memory == NULL) memory = emu_Malloc(MEMORY_SIZE);
Initialise();
}
void at8_Step(void)
{
int k = ik;
int hk = ihk;
if (iusbhk) hk = iusbhk;
CONTROLLER * which;
if (k & 0x8000) which=&cont2;
else which=&cont1;
// Start
if (k & MASK_KEY_USER1)
INPUT_key_consol &= ~0x01;
else
INPUT_key_consol |= 0x01;
// Select
if (k & MASK_KEY_USER2)
INPUT_key_consol &= ~0x02;
else
INPUT_key_consol |= 0x02;
// OPTION
if (k & MASK_KEY_USER3)
INPUT_key_consol &= ~0x04;
else
INPUT_key_consol |= 0x04;
if (hk != 0) {
int key = keyboardAsciiConv[hk];
if (key != INV_KEY) INPUT_key_code = key;
}
else {
INPUT_key_code = AKEY_NONE;
}
// Keyboard
INPUT_Frame();
// Joystick side button, trigger and directions
if (k & MASK_JOY2_BTN)
which->trig = 1;
else
which->trig = 0;
if (k & MASK_JOY2_DOWN)
which->down = 1;
else
which->down = 0;
if (k & MASK_JOY2_UP)
which->up = 1;
else
which->up = 0;
if (k & MASK_JOY2_RIGHT)
which->left = 1;
else
which->left = 0;
if (k & MASK_JOY2_LEFT)
which->right = 1;
else
which->right = 0;
GTIA_Frame();
ANTIC_Frame(1);
emu_DrawVsync();
POKEY_Frame();
}
void at8_Start(char * cartname)
{
load_CART(cartname);
emu_printf("antic");
ANTIC_Initialise();
emu_printf("gtia");
GTIA_Initialise();
emu_printf("pia");
PIA_Initialise();
emu_printf("pokey");
POKEY_Initialise();
PORTA = 0x00;
ANTIC_NMIEN = 0x00;
ANTIC_NMIST = 0x00;
memory[0x244] = 1;
GTIA_TRIG[0]=1;
GTIA_TRIG[1]=1;
GTIA_TRIG[2]=1;
GTIA_TRIG[3]=1;
emu_printf("6502 reset");
CPU_Reset();
emu_printf("init done");
}

Wyświetl plik

@ -0,0 +1,4 @@
extern void at8_Init(void);
extern void at8_Step(void);
extern void at8_Start(char * filename);
extern void at8_Input(int click);

Wyświetl plik

@ -0,0 +1,68 @@
const unsigned int colourtable[256] =
{
0x0, 0x1c1c1c, 0x393939, 0x595959,
0x797979, 0x929292, 0xababab, 0xbcbcbc,
0xcdcdcd, 0xd9d9d9, 0xe6e6e6, 0xececec,
0xf2f2f2, 0xf8f8f8, 0xffffff, 0xffffff,
0x391701, 0x5e2304, 0x833008, 0xa54716,
0xc85f24, 0xe37820, 0xff911d, 0xffab1d,
0xffc51d, 0xffce34, 0xffd84c, 0xffe651,
0xfff456, 0xfff977, 0xffff98, 0xffff98,
0x451904, 0x721e11, 0x9f241e, 0xb33a20,
0xc85122, 0xe36920, 0xff811e, 0xff8c25,
0xff982c, 0xffae38, 0xffc545, 0xffc559,
0xffc66d, 0xffd587, 0xffe4a1, 0xffe4a1,
0x4a1704, 0x7e1a0d, 0xb21d17, 0xc82119,
0xdf251c, 0xec3b38, 0xfa5255, 0xfc6161,
0xff706e, 0xff7f7e, 0xff8f8f, 0xff9d9e,
0xffabad, 0xffb9bd, 0xffc7ce, 0xffc7ce,
0x50568, 0x3b136d, 0x712272, 0x8b2a8c,
0xa532a6, 0xb938ba, 0xcd3ecf, 0xdb47dd,
0xea51eb, 0xf45ff5, 0xfe6dff, 0xfe7afd,
0xff87fb, 0xff95fd, 0xffa4ff, 0xffa4ff,
0x280479, 0x400984, 0x590f90, 0x70249d,
0x8839aa, 0xa441c3, 0xc04adc, 0xd054ed,
0xe05eff, 0xe96dff, 0xf27cff, 0xf88aff,
0xff98ff, 0xfea1ff, 0xfeabff, 0xfeabff,
0x35088a, 0x420aad, 0x500cd0, 0x6428d0,
0x7945d0, 0x8d4bd4, 0xa251d9, 0xb058ec,
0xbe60ff, 0xc56bff, 0xcc77ff, 0xd183ff,
0xd790ff, 0xdb9dff, 0xdfaaff, 0xdfaaff,
0x51e81, 0x626a5, 0x82fca, 0x263dd4,
0x444cde, 0x4f5aee, 0x5a68ff, 0x6575ff,
0x7183ff, 0x8091ff, 0x90a0ff, 0x97a9ff,
0x9fb2ff, 0xafbeff, 0xc0cbff, 0xc0cbff,
0xc048b, 0x2218a0, 0x382db5, 0x483ec7,
0x584fda, 0x6159ec, 0x6b64ff, 0x7a74ff,
0x8a84ff, 0x918eff, 0x9998ff, 0xa5a3ff,
0xb1aeff, 0xb8b8ff, 0xc0c2ff, 0xc0c2ff,
0x1d295a, 0x1d3876, 0x1d4892, 0x1c5cac,
0x1c71c6, 0x3286cf, 0x489bd9, 0x4ea8ec,
0x55b6ff, 0x70c7ff, 0x8cd8ff, 0x93dbff,
0x9bdfff, 0xafe4ff, 0xc3e9ff, 0xc3e9ff,
0x2f4302, 0x395202, 0x446103, 0x417a12,
0x3e9421, 0x4a9f2e, 0x57ab3b, 0x5cbd55,
0x61d070, 0x69e27a, 0x72f584, 0x7cfa8d,
0x87ff97, 0x9affa6, 0xadffb6, 0xadffb6,
0xa4108, 0xd540a, 0x10680d, 0x137d0f,
0x169212, 0x19a514, 0x1cb917, 0x1ec919,
0x21d91b, 0x47e42d, 0x6ef040, 0x78f74d,
0x83ff5b, 0x9aff7a, 0xb2ff9a, 0xb2ff9a,
0x4410b, 0x5530e, 0x66611, 0x77714,
0x88817, 0x99b1a, 0xbaf1d, 0x48c41f,
0x86d922, 0x8fe924, 0x99f927, 0xa8fc41,
0xb7ff5b, 0xc9ff6e, 0xdcff81, 0xdcff81,
0x2350f, 0x73f15, 0xc4a1c, 0x2d5f1e,
0x4f7420, 0x598324, 0x649228, 0x82a12e,
0xa1b034, 0xa9c13a, 0xb2d241, 0xc4d945,
0xd6e149, 0xe4f04e, 0xf2ff53, 0xf2ff53,
0x263001, 0x243803, 0x234005, 0x51541b,
0x806931, 0x978135, 0xaf993a, 0xc2a73e,
0xd5b543, 0xdbc03d, 0xe1cb38, 0xe2d836,
0xe3e534, 0xeff258, 0xfbff7d, 0xfbff7d,
0x401a02, 0x581f05, 0x702408, 0x8d3a13,
0xab511f, 0xb56427, 0xbf7730, 0xd0853a,
0xe19344, 0xeda04e, 0xf9ad58, 0xfcb75c,
0xffc160, 0xffc671, 0xffcb83, 0xffcb83,
};

Plik diff jest za duży Load Diff

Wyświetl plik

@ -0,0 +1,65 @@
#ifndef CPU_H_
#define CPU_H_
#include "atari.h"
#define CPU_N_FLAG 0x80
#define CPU_V_FLAG 0x40
#define CPU_B_FLAG 0x10
#define CPU_D_FLAG 0x08
#define CPU_I_FLAG 0x04
#define CPU_Z_FLAG 0x02
#define CPU_C_FLAG 0x01
void CPU_GetStatus(void);
void CPU_PutStatus(void);
void CPU_Reset(void);
void CPU_StateSave(UBYTE SaveVerbose);
void CPU_StateRead(UBYTE SaveVerbose, UBYTE StateVersion);
void CPU_NMI(void);
void CPU_GO(int limit);
#define CPU_GenerateIRQ() (CPU_IRQ = 1)
extern UWORD CPU_regPC;
extern UBYTE CPU_regA;
extern UBYTE CPU_regP;
extern UBYTE CPU_regS;
extern UBYTE CPU_regY;
extern UBYTE CPU_regX;
#define CPU_SetN CPU_regP |= CPU_N_FLAG
#define CPU_ClrN CPU_regP &= (~CPU_N_FLAG)
#define CPU_SetV CPU_regP |= CPU_V_FLAG
#define CPU_ClrV CPU_regP &= (~CPU_V_FLAG)
#define CPU_SetB CPU_regP |= CPU_B_FLAG
#define CPU_ClrB CPU_regP &= (~CPU_B_FLAG)
#define CPU_SetD CPU_regP |= CPU_D_FLAG
#define CPU_ClrD CPU_regP &= (~CPU_D_FLAG)
#define CPU_SetI CPU_regP |= CPU_I_FLAG
#define CPU_ClrI CPU_regP &= (~CPU_I_FLAG)
#define CPU_SetZ CPU_regP |= CPU_Z_FLAG
#define CPU_ClrZ CPU_regP &= (~CPU_Z_FLAG)
#define CPU_SetC CPU_regP |= CPU_C_FLAG
#define CPU_ClrC CPU_regP &= (~CPU_C_FLAG)
extern UBYTE CPU_IRQ;
extern void (*CPU_rts_handler)(void);
extern UBYTE CPU_cim_encountered;
#define CPU_REMEMBER_PC_STEPS 64
extern UWORD CPU_remember_PC[CPU_REMEMBER_PC_STEPS];
extern UBYTE CPU_remember_op[CPU_REMEMBER_PC_STEPS][3];
extern unsigned int CPU_remember_PC_curpos;
extern int CPU_remember_xpos[CPU_REMEMBER_PC_STEPS];
#define CPU_REMEMBER_JMP_STEPS 16
extern UWORD CPU_remember_JMP[CPU_REMEMBER_JMP_STEPS];
extern unsigned int CPU_remember_jmp_curpos;
#ifdef MONITOR_PROFILE
extern int CPU_instruction_count[256];
#endif
#endif /* CPU_H_ */

Wyświetl plik

@ -0,0 +1,86 @@
/* CRC32.C -- Calculates 32bit CRC checksum
*/
// modified main() (see crc32.orig) to get calc_crc32() function
// JH 2002
#include <stdio.h>
#include <stdlib.h>
const unsigned long crc32_table[256] = { /* lookup table */
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, 0x076DC419, 0x706AF48F,
0xE963A535, 0x9E6495A3, 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, 0x1DB71064, 0x6AB020F2,
0xF3B97148, 0x84BE41DE, 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, 0x14015C4F, 0x63066CD9,
0xFA0F3D63, 0x8D080DF5, 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, 0x35B5A8FA, 0x42B2986C,
0xDBBBC9D6, 0xACBCF940, 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, 0x21B4F4B5, 0x56B3C423,
0xCFBA9599, 0xB8BDA50F, 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, 0x76DC4190, 0x01DB7106,
0x98D220BC, 0xEFD5102A, 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, 0x7F6A0DBB, 0x086D3D2D,
0x91646C97, 0xE6635C01, 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, 0x65B0D9C6, 0x12B7E950,
0x8BBEB8EA, 0xFCB9887C, 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, 0x4ADFA541, 0x3DD895D7,
0xA4D1C46D, 0xD3D6F4FB, 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, 0x5005713C, 0x270241AA,
0xBE0B1010, 0xC90C2086, 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, 0x59B33D17, 0x2EB40D81,
0xB7BD5C3B, 0xC0BA6CAD, 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, 0xE3630B12, 0x94643B84,
0x0D6D6A3E, 0x7A6A5AA8, 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, 0xF762575D, 0x806567CB,
0x196C3671, 0x6E6B06E7, 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, 0xD6D6A3E8, 0xA1D1937E,
0x38D8C2C4, 0x4FDFF252, 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, 0xDF60EFC3, 0xA867DF55,
0x316E8EEF, 0x4669BE79, 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, 0xC5BA3BBE, 0xB2BD0B28,
0x2BB45A92, 0x5CB36A04, 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, 0x9C0906A9, 0xEB0E363F,
0x72076785, 0x05005713, 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, 0x86D3D2D4, 0xF1D4E242,
0x68DDB3F8, 0x1FDA836E, 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, 0x8F659EFF, 0xF862AE69,
0x616BFFD3, 0x166CCF45, 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, 0xAED16A4A, 0xD9D65ADC,
0x40DF0B66, 0x37D83BF0, 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, 0xBAD03605, 0xCDD70693,
0x54DE5729, 0x23D967BF, 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D};
unsigned long calc_crc32(unsigned char *buf, int buflen)
{
// buf is pointer to input buffer (data to crc)
// buflen is length of input buffer
unsigned long crc; /* CRC value */
//size_t j; /* buffer positions*/
int j; /* buffer positions*/
int k; /* generic integer */
#ifdef DEBUG
printf("32bit Cyclic Redudancy Check\n");
#endif
crc = 0xFFFFFFFF; /* preconditioning sets non zero value */
/* loop through the buffer and calculate CRC */
for(j=0; j<buflen; j++){
k=(crc ^ buf[j]) & 0x000000FFL;
crc=((crc >> 8) & 0x00FFFFFFL) ^ crc32_table[k];
}
crc=~crc; /* postconditioning */
/* print results */
#ifdef DEBUG
printf("CRC32 is %08lX\n", crc);
#endif
return crc;
}

Plik diff jest za duży Load Diff

Wyświetl plik

@ -0,0 +1,214 @@
#ifndef EMUAPI_H
#define EMUAPI_H
#include "platform_config.h"
#define CUSTOM_SND 1
//#define TIMER_REND 1
#define EXTRA_HEAP 0x10
// Title: < >
#define TITLE " Atari 800 Emulator"
#define ROMSDIR "800"
#define emu_Init(ROM) {at8_Init(); at8_Start(ROM);}
#define emu_Step(x) {at8_Step();}
#define emu_Input(x) {at8_Input(x);}
#define MAX_FILENAME_PATH 64
#define NB_FILE_HANDLER 4
#define PALETTE_SIZE 256
#define VID_FRAME_SKIP 0x0
#define TFT_VBUFFER_YCROP 0
#define SINGLELINE_RENDERING 1
#define R32(rgb) ((rgb>>16)&0xff)
#define G32(rgb) ((rgb>>8)&0xff)
#define B32(rgb) (rgb & 0xff)
#define ACTION_NONE 0
#define ACTION_MAXKBDVAL 16
#define ACTION_EXITKBD 128
#define ACTION_RUN1 129
#define ACTION_RUN2 130
#define ACTION_RUN3 131
#ifdef KEYMAP_PRESENT
#define keylables_map0_0 (char *)"qwertyuiop\x1a"
#define keylables_map0_1 (char *)" asdfghjkl\x19"
#define keylables_map0_2 (char *)" zxcvbnm,.;/"
#define keylables_map0_3 (char *)" +\x10-"
const unsigned short key_map0[] = {
'q','w','e','r','t','y','u','i','o','p',127, //lowecase
0,'a','s','d','f','g','h','j','k','l',10,
0,'z','x','c','v','b','n','m',',','.',';','/',
0,0,0,0,
0,'+',' ','-'
};
#define keylables_map1_0 (char *)" \x1a"
#define keylables_map1_1 (char *)" \x19"
#define keylables_map1_2 (char *)" <>:?"
#define keylables_map1_3 (char *)" =\x10 "
const unsigned short key_map1[] = {
'1','2','3','4','5','6','7','8','9','0',127, // digit keys
0, 0,0,0,0,0,0,0,0,0,10,
0, 0,0,0,0,0,0,0,'<','>',':','?',
154,152,151,153, //U L R D
0,'=',' ',0
};
#define keylables_map2_0 (char *)"!\"#$%^&*()@"
#define keylables_map2_1 (char *)" \x19"
#define keylables_map2_2 (char *)" <>:?"
#define keylables_map2_3 (char *)" =\x10 "
const unsigned short key_map2[] = {
'!','"','#','$','%','^','&','*','(',')','@', // shiftothers
9, 0,0,0,0,0,0,0,0,0,10,
0, 0,0,0,0,0,0,0,'<','>',':','?',
154,152,151,153, //U L R D
0,'=',' ',0
};
#define keylables_map3_0 (char *)"1234567890 "
#define keylables_map3_1 (char *)" "
#define keylables_map3_2 (char *)" "
#define keylables_map3_3 (char *)" "
const unsigned short key_map3[] = {
'1','2','3','4','5','6','7','8','9','0',0, // digit keys
0, 0,0,0,0,0,0,0,0,0,0,
0, 0,0,0,0,0,0,0,0,0,0,0,
154,152,151,153, //U L R D
0,0,' ',0
};
#define keylables_map4_0 (char *)" "
#define keylables_map4_1 (char *)" "
#define keylables_map4_2 (char *)" "
#define keylables_map4_3 (char *)" "
const unsigned short key_map4[] = {
0,0,0,0,0,0,0,0,0,0,0, // function keys
0, 0,0,0,0,0,0,0,0,0,0,
0, 0,0,0,0,0,0,0,0,0,0,0,
154,152,151,153, //U L R D
0,0,' ',0
};
#define keylables_map5_0 (char *)" "
#define keylables_map5_1 (char *)" "
#define keylables_map5_2 (char *)" "
#define keylables_map5_3 (char *)" "
const unsigned short key_map5[] = {
0,0,0,0,0,0,0,0,0,0,0, // extra keys
0, 0,0,0,0,0,0,0,0,0,0,
0, 0,0,0,0,0,0,0,0,0,0,0,
154,152,151,153, //U L R D
0,0,' ',0
};
const unsigned short matkeys[] = {
0x004,0x008,0x108,0x104,0x208,0x204,0x308,0x304,0x408,0x404,0x410, // row 1
0x502,0x002,0x020,0x102,0x120,0x202,0x220,0x302,0x320,0x402,0x420, // row 2
0x508,0x001,0x040,0x101,0x140,0x201,0x240,0x210,0x340,0x301,0x401,0x440, // row 3
0x504,0x520,0x540,0x501, // UP LEFT RIGHT DOWN
0x510,0x010,0x110,0x310, // row 4
};
#endif
#define MASK_JOY2_RIGHT 0x0001
#define MASK_JOY2_LEFT 0x0002
#define MASK_JOY2_UP 0x0004
#define MASK_JOY2_DOWN 0x0008
#define MASK_JOY2_BTN 0x0010
#define MASK_KEY_USER1 0x0020
#define MASK_KEY_USER2 0x0040
#define MASK_KEY_USER3 0x0080
#define MASK_JOY1_RIGHT 0x0100
#define MASK_JOY1_LEFT 0x0200
#define MASK_JOY1_UP 0x0400
#define MASK_JOY1_DOWN 0x0800
#define MASK_JOY1_BTN 0x1000
#define MASK_KEY_USER4 0x2000
#ifdef __cplusplus
extern "C" {
#else
#define bool unsigned char
#endif
extern void emu_init(void);
extern void emu_start(void);
extern void emu_printf(const char * text);
extern void emu_printi(int val);
extern void emu_printh(int val);
extern void * emu_Malloc(unsigned int size);
extern void * emu_MallocI(unsigned int size);
extern void emu_Free(void * pt);
extern int emu_FileOpen(const char * filepath, const char * mode);
extern int emu_FileRead(void * buf, int size, int handler);
extern int emu_FileGetc(int handler);
extern int emu_FileSeek(int handler, int seek, int origin);
extern int emu_FileTell(int handler);
extern void emu_FileClose(int handler);
extern unsigned int emu_FileSize(const char * filepath);
extern unsigned int emu_LoadFile(const char * filepath, void * buf, int size);
extern unsigned int emu_LoadFileSeek(const char * filepath, void * buf, int size, int seek);
extern void emu_SetPaletteEntry(unsigned char r, unsigned char g, unsigned char b, int index);
extern void emu_DrawScreen(unsigned char * VBuf, int width, int height, int stride);
extern void emu_DrawLine(unsigned char * VBuf, int width, int height, int line);
extern void emu_DrawLine16(unsigned short * VBuf, int width, int height, int line);
extern void emu_DrawLine8(unsigned char * VBuf, int width, int height, int line);
extern void emu_CopyLine(int width, int height, int ysrc, int ydst);
extern void emu_DrawVsync(void);
extern int emu_FrameSkip(void);
extern void * emu_LineBuffer(int line);
extern void emu_tweakVideo(int shiftdelta, int numdelta, int denomdelta);
extern bool menuActive(void);
extern char * menuSelection(void);
extern char * menuSecondSelection(void);
extern void toggleMenu(bool on);
extern int handleMenu(unsigned short bClick);
extern int handleOSKB(void);
extern void toggleOSKB(bool forceon);
extern void emu_InitJoysticks(void);
extern int emu_SwapJoysticks(int statusOnly);
extern unsigned short emu_DebounceLocalKeys(void);
extern int emu_ReadKeys(void);
extern int emu_GetPad(void);
extern int emu_GetMouse(int *x, int *y, int *buts);
extern int emu_MouseDetected(void);
extern int emu_KeyboardDetected(void);
extern int emu_ReadAnalogJoyX(int min, int max);
extern int emu_ReadAnalogJoyY(int min, int max);
extern int emu_ReadI2CKeyboard(void);
extern unsigned char emu_ReadI2CKeyboard2(int row);
extern void emu_KeyboardOnUp(int keymodifer, int key);
extern void emu_KeyboardOnDown(int keymodifer, int key);
extern void emu_MidiOnDataReceived(unsigned char data);
extern void emu_sndPlaySound(int chan, int volume, int freq);
extern void emu_sndPlayBuzz(int size, int val);
extern void emu_sndInit();
extern void emu_resetus(void);
extern int emu_us(void);
extern int emu_setKeymap(int index);
#ifdef __cplusplus
}
#endif
#endif

Wyświetl plik

@ -0,0 +1,148 @@
// Font: c64_lower.64c
PROGMEM const unsigned char font8x8[128][8] =
{
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0000 (nul)
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0001
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0002
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0003
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0004
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0005
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0006
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0007
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0008
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0009
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000A
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000B
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000C
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000D
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000E
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+000F
{ 0x7f, 0x41, 0x41, 0x41, 0x41, 0x41, 0x7f, 0x00 }, // Space // 0x10
{ 0x00, 0x27, 0x31, 0x27, 0x21, 0x71, 0x00, 0x00 }, // F1 // 0x11
{ 0x00, 0x77, 0x41, 0x77, 0x11, 0x71, 0x00, 0x00 }, // F2
{ 0x00, 0x77, 0x41, 0x77, 0x41, 0x71, 0x00, 0x00 }, // F3
{ 0x00, 0x17, 0x51, 0x77, 0x41, 0x41, 0x00, 0x00 }, // F4
{ 0x00, 0x77, 0x11, 0x77, 0x41, 0x71, 0x00, 0x00 }, // F5
{ 0x00, 0x77, 0x11, 0x77, 0x51, 0x71, 0x00, 0x00 }, // F6
{ 0x00, 0x77, 0x41, 0x47, 0x41, 0x41, 0x00, 0x00 }, // F7
{ 0x00, 0x77, 0x51, 0x77, 0x51, 0x71, 0x00, 0x00 }, // F8 // 0x18
{ 0x00, 0x00, 0x20, 0x24, 0x3e, 0x04, 0x00, 0x00 }, // Return // 0x19
{ 0x00, 0x59, 0x4b, 0x5b, 0x4b, 0xd9, 0x00, 0x00 }, // Del // 0x1A
//{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0010
//{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0011
//{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0012
//{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0013
//{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0014
//{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0015
//{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0016
//{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0017
//{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0018
//{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0019
//{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001A
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001B
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001C
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001D
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001E
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+001F
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0020 (space)
{ 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00}, // U+0021 (!)
{ 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0022 (")
{ 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00}, // U+0023 (#)
{ 0x0C, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x0C, 0x00}, // U+0024 ($)
{ 0x00, 0x63, 0x33, 0x18, 0x0C, 0x66, 0x63, 0x00}, // U+0025 (%)
{ 0x1C, 0x36, 0x1C, 0x6E, 0x3B, 0x33, 0x6E, 0x00}, // U+0026 (&)
{ 0x06, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0027 (')
{ 0x18, 0x0C, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x00}, // U+0028 (()
{ 0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x00}, // U+0029 ())
{ 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00}, // U+002A (*)
{ 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00}, // U+002B (+)
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+002C (,)
{ 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00}, // U+002D (-)
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+002E (.)
{ 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00}, // U+002F (/)
{ 0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00}, // U+0030 (0)
{ 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00}, // U+0031 (1)
{ 0x1E, 0x33, 0x30, 0x1C, 0x06, 0x33, 0x3F, 0x00}, // U+0032 (2)
{ 0x1E, 0x33, 0x30, 0x1C, 0x30, 0x33, 0x1E, 0x00}, // U+0033 (3)
{ 0x38, 0x3C, 0x36, 0x33, 0x7F, 0x30, 0x78, 0x00}, // U+0034 (4)
{ 0x3F, 0x03, 0x1F, 0x30, 0x30, 0x33, 0x1E, 0x00}, // U+0035 (5)
{ 0x1C, 0x06, 0x03, 0x1F, 0x33, 0x33, 0x1E, 0x00}, // U+0036 (6)
{ 0x3F, 0x33, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x00}, // U+0037 (7)
{ 0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00}, // U+0038 (8)
{ 0x1E, 0x33, 0x33, 0x3E, 0x30, 0x18, 0x0E, 0x00}, // U+0039 (9)
{ 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00}, // U+003A (:)
{ 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x06}, // U+003B (//)
{ 0x18, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x18, 0x00}, // U+003C (<)
{ 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00}, // U+003D (=)
{ 0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00}, // U+003E (>)
{ 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00}, // U+003F (?)
{ 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00}, // U+0040 (@)
{ 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00}, // U+0041 (A)
{ 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00}, // U+0042 (B)
{ 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00}, // U+0043 (C)
{ 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00}, // U+0044 (D)
{ 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00}, // U+0045 (E)
{ 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00}, // U+0046 (F)
{ 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00}, // U+0047 (G)
{ 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00}, // U+0048 (H)
{ 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0049 (I)
{ 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00}, // U+004A (J)
{ 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00}, // U+004B (K)
{ 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00}, // U+004C (L)
{ 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00}, // U+004D (M)
{ 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00}, // U+004E (N)
{ 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00}, // U+004F (O)
{ 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00}, // U+0050 (P)
{ 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00}, // U+0051 (Q)
{ 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00}, // U+0052 (R)
{ 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00}, // U+0053 (S)
{ 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0054 (T)
{ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00}, // U+0055 (U)
{ 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0056 (V)
{ 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00}, // U+0057 (W)
{ 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00}, // U+0058 (X)
{ 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00}, // U+0059 (Y)
{ 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00}, // U+005A (Z)
{ 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00}, // U+005B ([)
{ 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00}, // U+005C (\)
{ 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00}, // U+005D (])
{ 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00}, // U+005E (^)
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF}, // U+005F (_)
{ 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+0060 (`)
{ 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00}, // U+0061 (a)
{ 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00}, // U+0062 (b)
{ 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00}, // U+0063 (c)
{ 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00}, // U+0064 (d)
{ 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00}, // U+0065 (e)
{ 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00}, // U+0066 (f)
{ 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0067 (g)
{ 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00}, // U+0068 (h)
{ 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+0069 (i)
{ 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E}, // U+006A (j)
{ 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00}, // U+006B (k)
{ 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00}, // U+006C (l)
{ 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00}, // U+006D (m)
{ 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00}, // U+006E (n)
{ 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00}, // U+006F (o)
{ 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F}, // U+0070 (p)
{ 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78}, // U+0071 (q)
{ 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00}, // U+0072 (r)
{ 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00}, // U+0073 (s)
{ 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00}, // U+0074 (t)
{ 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00}, // U+0075 (u)
{ 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00}, // U+0076 (v)
{ 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00}, // U+0077 (w)
{ 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00}, // U+0078 (x)
{ 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F}, // U+0079 (y)
{ 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00}, // U+007A (z)
{ 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00}, // U+007B ({)
{ 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00}, // U+007C (|)
{ 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00}, // U+007D (})
{ 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // U+007E (~)
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // U+007F
};

Plik diff jest za duży Load Diff

Wyświetl plik

@ -0,0 +1,136 @@
#ifndef GTIA_H_
#define GTIA_H_
#define GTIA_OFFSET_HPOSP0 0x00
#define GTIA_OFFSET_M0PF 0x00
#define GTIA_OFFSET_HPOSP1 0x01
#define GTIA_OFFSET_M1PF 0x01
#define GTIA_OFFSET_HPOSP2 0x02
#define GTIA_OFFSET_M2PF 0x02
#define GTIA_OFFSET_HPOSP3 0x03
#define GTIA_OFFSET_M3PF 0x03
#define GTIA_OFFSET_HPOSM0 0x04
#define GTIA_OFFSET_P0PF 0x04
#define GTIA_OFFSET_HPOSM1 0x05
#define GTIA_OFFSET_P1PF 0x05
#define GTIA_OFFSET_HPOSM2 0x06
#define GTIA_OFFSET_P2PF 0x06
#define GTIA_OFFSET_HPOSM3 0x07
#define GTIA_OFFSET_P3PF 0x07
#define GTIA_OFFSET_SIZEP0 0x08
#define GTIA_OFFSET_M0PL 0x08
#define GTIA_OFFSET_SIZEP1 0x09
#define GTIA_OFFSET_M1PL 0x09
#define GTIA_OFFSET_SIZEP2 0x0a
#define GTIA_OFFSET_M2PL 0x0a
#define GTIA_OFFSET_SIZEP3 0x0b
#define GTIA_OFFSET_M3PL 0x0b
#define GTIA_OFFSET_SIZEM 0x0c
#define GTIA_OFFSET_P0PL 0x0c
#define GTIA_OFFSET_GRAFP0 0x0d
#define GTIA_OFFSET_P1PL 0x0d
#define GTIA_OFFSET_GRAFP1 0x0e
#define GTIA_OFFSET_P2PL 0x0e
#define GTIA_OFFSET_GRAFP2 0x0f
#define GTIA_OFFSET_P3PL 0x0f
#define GTIA_OFFSET_GRAFP3 0x10
#define GTIA_OFFSET_TRIG0 0x10
#define GTIA_OFFSET_GRAFM 0x11
#define GTIA_OFFSET_TRIG1 0x11
#define GTIA_OFFSET_COLPM0 0x12
#define GTIA_OFFSET_TRIG2 0x12
#define GTIA_OFFSET_COLPM1 0x13
#define GTIA_OFFSET_TRIG3 0x13
#define GTIA_OFFSET_COLPM2 0x14
#define GTIA_OFFSET_PAL 0x14
#define GTIA_OFFSET_COLPM3 0x15
#define GTIA_OFFSET_COLPF0 0x16
#define GTIA_OFFSET_COLPF1 0x17
#define GTIA_OFFSET_COLPF2 0x18
#define GTIA_OFFSET_COLPF3 0x19
#define GTIA_OFFSET_COLBK 0x1a
#define GTIA_OFFSET_PRIOR 0x1b
#define GTIA_OFFSET_VDELAY 0x1c
#define GTIA_OFFSET_GRACTL 0x1d
#define GTIA_OFFSET_HITCLR 0x1e
#define GTIA_OFFSET_CONSOL 0x1f
extern UBYTE GTIA_GRAFM;
extern UBYTE GTIA_GRAFP0;
extern UBYTE GTIA_GRAFP1;
extern UBYTE GTIA_GRAFP2;
extern UBYTE GTIA_GRAFP3;
extern UBYTE GTIA_HPOSP0;
extern UBYTE GTIA_HPOSP1;
extern UBYTE GTIA_HPOSP2;
extern UBYTE GTIA_HPOSP3;
extern UBYTE GTIA_HPOSM0;
extern UBYTE GTIA_HPOSM1;
extern UBYTE GTIA_HPOSM2;
extern UBYTE GTIA_HPOSM3;
extern UBYTE GTIA_SIZEP0;
extern UBYTE GTIA_SIZEP1;
extern UBYTE GTIA_SIZEP2;
extern UBYTE GTIA_SIZEP3;
extern UBYTE GTIA_SIZEM;
extern UBYTE GTIA_COLPM0;
extern UBYTE GTIA_COLPM1;
extern UBYTE GTIA_COLPM2;
extern UBYTE GTIA_COLPM3;
extern UBYTE GTIA_COLPF0;
extern UBYTE GTIA_COLPF1;
extern UBYTE GTIA_COLPF2;
extern UBYTE GTIA_COLPF3;
extern UBYTE GTIA_COLBK;
extern UBYTE GTIA_GRACTL;
extern UBYTE GTIA_M0PL;
extern UBYTE GTIA_M1PL;
extern UBYTE GTIA_M2PL;
extern UBYTE GTIA_M3PL;
extern UBYTE GTIA_P0PL;
extern UBYTE GTIA_P1PL;
extern UBYTE GTIA_P2PL;
extern UBYTE GTIA_P3PL;
extern UBYTE GTIA_PRIOR;
extern UBYTE GTIA_VDELAY;
#ifdef USE_COLOUR_TRANSLATION_TABLE
extern UWORD GTIA_colour_translation_table[256];
#define GTIA_COLOUR_BLACK GTIA_colour_translation_table[0]
#define GTIA_COLOUR_TO_WORD(dest,src) dest = GTIA_colour_translation_table[src];
#else
#define GTIA_COLOUR_BLACK 0
#define GTIA_COLOUR_TO_WORD(dest,src) dest = (((UWORD) (src)) << 8) | (src);
#endif /* USE_COLOUR_TRANSLATION_TABLE */
extern UBYTE GTIA_pm_scanline[ATARI_WIDTH / 2 + 8]; /* there's a byte for every *pair* of pixels */
extern int GTIA_pm_dirty;
extern UBYTE GTIA_collisions_mask_missile_playfield;
extern UBYTE GTIA_collisions_mask_player_playfield;
extern UBYTE GTIA_collisions_mask_missile_player;
extern UBYTE GTIA_collisions_mask_player_player;
extern UBYTE GTIA_TRIG[4];
extern UBYTE GTIA_TRIG_latch[4];
extern int GTIA_consol_override;
extern int GTIA_speaker;
int GTIA_Initialise(void);
void GTIA_Frame(void);
void GTIA_NewPmScanline(void);
UBYTE GTIA_GetByte(UWORD addr, int no_side_effects);
void GTIA_PutByte(UWORD addr, UBYTE byte);
void GTIA_StateSave(void);
void GTIA_StateRead(UBYTE version);
#ifdef NEW_CYCLE_EXACT
void GTIA_UpdatePmplColls(void);
#endif
#endif /* GTIA_H_ */

Wyświetl plik

@ -0,0 +1,124 @@
#ifndef IOPINS_H
#define IOPINS_H
#include "platform_config.h"
#ifdef TEECOMPUTER
// Teecomputer layout
// VGA
// R 3 2K
// R 4 1K
// R 33 500
// G 11 2K
// G 13 1K
// G 2 500
// B 10 820
// B 12 390
// HSYNC 15 82
// VSYNC 8 82
// Display
#define TFT_SCLK 27
#define TFT_MOSI 26
#define TFT_MISO 255
#define TFT_TOUCH_CS 255
#define TFT_TOUCH_INT 255
#define TFT_DC 23
#define TFT_CS 22 // 255 for LORES ST7789 (NO CS)
#define TFT_RST 255 // 255 for ILI/ST if connected to 3.3V or 24 if really needed
// SD
#define SD_CS BUILTIN_SDCARD
// Audio
#define AUDIO_I2S_DIN 7
#define AUDIO_I2S_BCK 21
#define AUDIO_I2S_LCK 20
// Keyboard matrix
#define KLED 14
//Cols (out)
//pico 1,2,3,4,5,14
//teen 16,6,24,25,28,31
#define KCOLOUT1 16
#define KCOLOUT2 6
#define KCOLOUT3 24
#define KCOLOUT4 25
#define KCOLOUT5 28
#define KCOLOUT6 31
//Rows (in)
//pico 9,8,6,15,7,22
//teen 19,18,17,5,29,30,32 //5,6,16,17,18,19
#define KROWIN1 19
#define KROWIN2 18
#define KROWIN3 17
#define KROWIN4 5
#define KROWIN5 29
#define KROWIN6 30
#define KROWIN7 32
#define PIN_KEY_USER1 41
#define PIN_KEY_USER2 40
// Second joystick (external)
#define PIN_JOY1_BTN 34
#define PIN_JOY1_1 35 // UP
#define PIN_JOY1_2 36 // DOWN
#define PIN_JOY1_3 38 // RIGHT
#define PIN_JOY1_4 37 // LEFT
#else
// Original Layout
#define TFT_SCLK 13
#define TFT_MOSI 11
#define TFT_MISO 12
#define TFT_TOUCH_CS 255
#define TFT_TOUCH_INT 255
#define TFT_DC 9
#define TFT_CS 22 // 255 for LORES ST7789 (NO CS)
#define TFT_RST 23 // 255 for ILI/ST if connected to 3.3V
// SD
#define SD_CS BUILTIN_SDCARD
// I2C keyboard
#define I2C_SCL_IO 19
#define I2C_SDA_IO 18
// Analog joystick (primary) for JOY2 and 5 extra buttons
#ifdef HAS_T4_VGA
#define PIN_JOY2_A1X A3
#define PIN_JOY2_A2Y A2
#define PIN_JOY2_BTN 14
#define PIN_KEY_USER1 22
#define PIN_KEY_USER2 23
// Second joystick
#define PIN_JOY1_BTN 34
#define PIN_JOY1_1 35 // UP
#define PIN_JOY1_2 36 // DOWN
#define PIN_JOY1_3 38 // RIGHT
#define PIN_JOY1_4 37 // LEFT
#else
#define PIN_JOY2_A1X A1
#define PIN_JOY2_A2Y A2
#define PIN_JOY2_BTN 17
#define PIN_KEY_USER1 3 //34
#define PIN_KEY_USER2 4 //35
// Second joystick
#define PIN_JOY1_BTN 2
#define PIN_JOY1_1 14 // UP
#define PIN_JOY1_2 7 // DOWN
#define PIN_JOY1_3 6 // RIGHT
#define PIN_JOY1_4 5 // LEFT
#endif
#endif
#endif

Wyświetl plik

@ -0,0 +1,18 @@
#ifndef __MEMORY__
#define __MEMORY__
extern unsigned char * memory;
#define MEMORY_GetByte(addr) (Atari_GetByte(addr))
#define MEMORY_PutByte(addr,byte) Atari_PutByte(addr,byte)
#define MEMORY_dGetByte(addr) (Atari_GetByte(addr))
#define MEMORY_dPutByte(addr,byte) Atari_PutByte(addr,byte)
#define MEMORY_dGetWord(x) (Atari_GetByte(x) | (Atari_GetByte((x) + 1) << 8))
#define MEMORY_dPutWord(x,y) (Atari_PutByte(x,(UBYTE) (y)) , Atari_PutByte(x + 1,(UBYTE) ((y) >> 8))
/* faster versions of dGetWord and dPutWord for even addresses */
/* TODO: guarantee that memory is UWORD-aligned and use UWORD access */
#define MEMORY_dGetWordAligned(x) MEMORY_dGetWord(x)
#define MEMORY_dPutWordAligned(x,y) MEMORY_dPutWord(x,y)
#endif

Plik diff jest za duży Load Diff

Wyświetl plik

@ -0,0 +1,71 @@
#include <stdio.h>
#include "atari.h"
#include "cpu.h"
#include "pia.h"
UBYTE PACTL;
UBYTE PBCTL;
UBYTE PORTA;
UBYTE PORTB;
static UBYTE PORTA_mask = 0xff;
static UBYTE PORTB_mask = 0xff;
void PIA_Initialise(void)
{
PORTA = 0xff;
PORTB = 0xff;
}
UBYTE PIA_GetByte(UWORD addr)
{
UBYTE byte;
addr &= 0x03;
switch (addr) {
case _PACTL:
byte = PACTL;
break;
case _PBCTL:
byte = PBCTL;
break;
case _PORTA:
byte = Atari_PORT(0);
byte &= PORTA_mask;
break;
case _PORTB:
byte = Atari_PORT(1);
byte &= PORTB_mask;
break;
}
return byte;
}
int PIA_PutByte(UWORD addr, UBYTE byte)
{
addr &= 0xff03;
switch (addr) {
case _PACTL:
PACTL = byte;
break;
case _PBCTL:
PBCTL = byte;
break;
case _PORTA:
if (!(PACTL & 0x04))
PORTA_mask = ~byte;
break;
case _PORTB:
// if ((byte == 0) && (machine == AtariXL || machine == AtariXE))
// break; /* special hack for old Atari800 games like is Tapper, for example */
if (!(PBCTL & 0x04))
PORTB_mask = ~byte;
break;
}
return FALSE;
}

Wyświetl plik

@ -0,0 +1,22 @@
#ifndef __PIA__
#define __PIA__
#include "atari.h"
#define _PORTA 0x00
#define _PORTB 0x01
#define _PACTL 0x02
#define _PBCTL 0x03
extern UBYTE PACTL;
extern UBYTE PBCTL;
extern UBYTE PORTA;
extern UBYTE PORTB;
extern int xe_bank;
void PIA_Initialise(void);
UBYTE PIA_GetByte(UWORD addr);
int PIA_PutByte(UWORD addr, UBYTE byte);
#endif

Wyświetl plik

@ -0,0 +1,39 @@
#ifndef _PLATFORM_CONFIG_H_
#define _PLATFORM_CONFIG_H_
#define TEECOMPUTER 1
#ifdef TEECOMPUTER
//#define ILI9341 1
//#define ST7789 1
//#define TFTSPI1 1
#define HAS_T4_VGA 1
#define HAS_SND 1
#define HAS_USBKEY 1
#define INVX 1
#else
#define HAS_T4_VGA 1
//#define INVX 1
#define INVY 1
#define HAS_SND 1
#define HAS_USBKEY 1
#endif
//#define ILI9341 1
//#define ST7789 1
//#define SWAP_JOYSTICK 1
//#define LOHRES 1
//#define ROTATE_SCREEN 1
//#define EXTERNAL_SD 1
//#define USE_SDFAT 1
//#define SD_FAT_TYPE 1
//#define USE_SDFS 1
//#define SDFSDEV "1:"
#endif

Wyświetl plik

@ -0,0 +1,699 @@
/*
* pokey.c - POKEY sound chip emulation
*
* Copyright (C) 1995-1998 David Firth
* Copyright (C) 1998-2008 Atari800 development team (see DOC/CREDITS)
*
* This file is part of the Atari800 emulator project which emulates
* the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers.
*
* Atari800 is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Atari800 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Atari800; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "cpu.h"
#include "pokey.h"
#include "gtia.h"
#include "sio.h"
#ifdef SOUND
#include "pokeysnd.h"
#endif
#include "antic.h"
#ifdef VOICEBOX
#include "voicebox.h"
#include "votraxsnd.h"
#endif
#ifdef POKEY_UPDATE
void pokey_update(void);
#endif
UBYTE POKEY_KBCODE;
UBYTE POKEY_SERIN;
UBYTE POKEY_IRQST;
UBYTE POKEY_IRQEN;
UBYTE POKEY_SKSTAT;
UBYTE POKEY_SKCTL;
int POKEY_DELAYED_SERIN_IRQ;
int POKEY_DELAYED_SEROUT_IRQ;
int POKEY_DELAYED_XMTDONE_IRQ;
/* structures to hold the 9 pokey control bytes */
UBYTE POKEY_AUDF[4 * POKEY_MAXPOKEYS]; /* AUDFx (D200, D202, D204, D206) */
UBYTE POKEY_AUDC[4 * POKEY_MAXPOKEYS]; /* AUDCx (D201, D203, D205, D207) */
UBYTE POKEY_AUDCTL[POKEY_MAXPOKEYS]; /* AUDCTL (D208) */
int POKEY_DivNIRQ[4], POKEY_DivNMax[4];
int POKEY_Base_mult[POKEY_MAXPOKEYS]; /* selects either 64Khz or 15Khz clock mult */
UBYTE POKEY_POT_input[8] = {228, 228, 228, 228, 228, 228, 228, 228};
static int pot_scanline;
#include "noise.h"
//UBYTE POKEY_poly9_lookup[POKEY_POLY9_SIZE];
//UBYTE POKEY_poly17_lookup[POKEY_POLY17_SIZE];
static ULONG random_scanline_counter;
ULONG POKEY_GetRandomCounter(void)
{
return random_scanline_counter;
}
void POKEY_SetRandomCounter(ULONG value)
{
random_scanline_counter = value;
}
UBYTE POKEY_GetByte(UWORD addr, int no_side_effects)
{
UBYTE byte = 0xff;
#ifdef STEREO_SOUND
if (addr & 0x0010 && POKEYSND_stereo_enabled)
return 0;
#endif
addr &= 0x0f;
if (addr < 8) {
byte = POKEY_POT_input[addr];
if (byte <= pot_scanline)
return byte;
return pot_scanline;
}
switch (addr) {
case POKEY_OFFSET_ALLPOT:
{
int i;
for (i = 0; i < 8; i++)
if (POKEY_POT_input[i] <= pot_scanline)
byte &= ~(1 << i); /* reset bit if pot value known */
}
break;
case POKEY_OFFSET_KBCODE:
byte = POKEY_KBCODE;
break;
case POKEY_OFFSET_RANDOM:
if ((POKEY_SKCTL & 0x03) != 0) {
int i = random_scanline_counter + ANTIC_XPOS;
if (POKEY_AUDCTL[0] & POKEY_POLY9)
byte = POKEY_poly9_lookup[i % POKEY_POLY9_SIZE];
else {
const UBYTE *ptr;
i %= POKEY_POLY17_SIZE;
ptr = POKEY_poly17_lookup + (i >> 3);
i &= 7;
byte = (UBYTE) ((ptr[0] >> i) + (ptr[1] << (8 - i)));
}
}
break;
case POKEY_OFFSET_SERIN:
byte = POKEY_SERIN;
#ifdef DEBUG3
printf("SERIO: SERIN read, bytevalue %02x\n", POKEY_SERIN);
#endif
#ifdef SERIO_SOUND
POKEYSND_UpdateSerio(0,byte);
#endif
break;
case POKEY_OFFSET_IRQST:
byte = POKEY_IRQST;
break;
case POKEY_OFFSET_SKSTAT:
#if SKIP
byte = POKEY_SKSTAT + (CASSETTE_IOLineStatus() << 4);
#else
byte = POKEY_SKSTAT;
#endif
#ifdef VOICEBOX
if (VOICEBOX_enabled) {
byte = POKEY_SKSTAT + (VOTRAXSND_busy << 4);
}
#endif
break;
}
return byte;
}
static void Update_Counter(int chan_mask);
static int POKEY_siocheck(void)
{
return (((POKEY_AUDF[POKEY_CHAN3] == 0x28 || POKEY_AUDF[POKEY_CHAN3] == 0x10
|| POKEY_AUDF[POKEY_CHAN3] == 0x08 || POKEY_AUDF[POKEY_CHAN3] == 0x0a)
&& POKEY_AUDF[POKEY_CHAN4] == 0x00) /* intelligent peripherals speeds */
|| (POKEY_SKCTL & 0x78) == 0x28) /* cassette save mode */
&& (POKEY_AUDCTL[0] & 0x28) == 0x28;
}
#ifndef SOUND_GAIN /* sound gain can be pre-defined in the configure/Makefile */
#define SOUND_GAIN 4
#endif
#ifndef SOUND
#define POKEYSND_Update(addr, val, chip, gain)
#else
//#define POKEYSND_Update(addr, val, chip, gain) if (chip == 0) emu_sndPlaySound((chip*4)+addr, gain*16, val*16)
#endif
void POKEY_PutByte(UWORD addr, UBYTE byte)
{
#ifdef STEREO_SOUND
addr &= POKEYSND_stereo_enabled ? 0x1f : 0x0f;
#else
addr &= 0x0f;
#endif
switch (addr) {
case POKEY_OFFSET_AUDC1:
POKEY_AUDC[POKEY_CHAN1] = byte;
POKEYSND_Update(POKEY_OFFSET_AUDC1, byte, 0, SOUND_GAIN);
break;
case POKEY_OFFSET_AUDC2:
POKEY_AUDC[POKEY_CHAN2] = byte;
POKEYSND_Update(POKEY_OFFSET_AUDC2, byte, 0, SOUND_GAIN);
break;
case POKEY_OFFSET_AUDC3:
POKEY_AUDC[POKEY_CHAN3] = byte;
POKEYSND_Update(POKEY_OFFSET_AUDC3, byte, 0, SOUND_GAIN);
break;
case POKEY_OFFSET_AUDC4:
POKEY_AUDC[POKEY_CHAN4] = byte;
POKEYSND_Update(POKEY_OFFSET_AUDC4, byte, 0, SOUND_GAIN);
break;
case POKEY_OFFSET_AUDCTL:
POKEY_AUDCTL[0] = byte;
/* determine the base multiplier for the 'div by n' calculations */
if (byte & POKEY_CLOCK_15)
POKEY_Base_mult[0] = POKEY_DIV_15;
else
POKEY_Base_mult[0] = POKEY_DIV_64;
Update_Counter((1 << POKEY_CHAN1) | (1 << POKEY_CHAN2) | (1 << POKEY_CHAN3) | (1 << POKEY_CHAN4));
POKEYSND_Update(POKEY_OFFSET_AUDCTL, byte, 0, SOUND_GAIN);
break;
case POKEY_OFFSET_AUDF1:
POKEY_AUDF[POKEY_CHAN1] = byte;
Update_Counter((POKEY_AUDCTL[0] & POKEY_CH1_CH2) ? ((1 << POKEY_CHAN2) | (1 << POKEY_CHAN1)) : (1 << POKEY_CHAN1));
POKEYSND_Update(POKEY_OFFSET_AUDF1, byte, 0, SOUND_GAIN);
break;
case POKEY_OFFSET_AUDF2:
POKEY_AUDF[POKEY_CHAN2] = byte;
Update_Counter(1 << POKEY_CHAN2);
POKEYSND_Update(POKEY_OFFSET_AUDF2, byte, 0, SOUND_GAIN);
break;
case POKEY_OFFSET_AUDF3:
POKEY_AUDF[POKEY_CHAN3] = byte;
Update_Counter((POKEY_AUDCTL[0] & POKEY_CH3_CH4) ? ((1 << POKEY_CHAN4) | (1 << POKEY_CHAN3)) : (1 << POKEY_CHAN3));
POKEYSND_Update(POKEY_OFFSET_AUDF3, byte, 0, SOUND_GAIN);
break;
case POKEY_OFFSET_AUDF4:
POKEY_AUDF[POKEY_CHAN4] = byte;
Update_Counter(1 << POKEY_CHAN4);
POKEYSND_Update(POKEY_OFFSET_AUDF4, byte, 0, SOUND_GAIN);
break;
case POKEY_OFFSET_IRQEN:
POKEY_IRQEN = byte;
#ifdef DEBUG1
printf("WR: IRQEN = %x, PC = %x\n", POKEY_IRQEN, PC);
#endif
POKEY_IRQST |= ~byte & 0xf7; /* Reset disabled IRQs except XMTDONE */
#if SKIP
if ((~POKEY_IRQST & POKEY_IRQEN) == 0 && PBI_IRQ == 0 && PIA_IRQ == 0)
#else
if ((~POKEY_IRQST & POKEY_IRQEN) == 0)
#endif
{
CPU_IRQ = 0;
}
else {
CPU_GenerateIRQ();
}
break;
case POKEY_OFFSET_SKRES:
POKEY_SKSTAT |= 0xe0;
break;
case POKEY_OFFSET_POTGO:
if (!(POKEY_SKCTL & 4))
pot_scanline = 0; /* slow pot mode */
break;
case POKEY_OFFSET_SEROUT:
#ifdef VOICEBOX
VOICEBOX_SEROUTPutByte(byte);
#endif
if ((POKEY_SKCTL & 0x70) == 0x20 && POKEY_siocheck())
SIO_PutByte(byte);
/* check if cassette 2-tone mode has been enabled */
if ((POKEY_SKCTL & 0x08) == 0x00) {
/* intelligent device */
POKEY_DELAYED_SEROUT_IRQ = SIO_SEROUT_INTERVAL;
POKEY_IRQST |= 0x08;
POKEY_DELAYED_XMTDONE_IRQ = SIO_XMTDONE_INTERVAL;
}
else {
/* cassette */
/* some savers patch the cassette baud rate, so we evaluate it here */
/* scanlines per second*10 bit*audiofrequency/(1.79 MHz/2) */
POKEY_DELAYED_SEROUT_IRQ = 312*50*10*(POKEY_AUDF[POKEY_CHAN3] + POKEY_AUDF[POKEY_CHAN4]*0x100)/895000;
/* safety check */
if (POKEY_DELAYED_SEROUT_IRQ >= 3) {
POKEY_IRQST |= 0x08;
POKEY_DELAYED_XMTDONE_IRQ = 2*POKEY_DELAYED_SEROUT_IRQ - 2;
}
else {
POKEY_DELAYED_SEROUT_IRQ = 0;
POKEY_DELAYED_XMTDONE_IRQ = 0;
}
};
#ifdef SERIO_SOUND
POKEYSND_UpdateSerio(1, byte);
#endif
break;
case POKEY_OFFSET_STIMER:
POKEY_DivNIRQ[POKEY_CHAN1] = POKEY_DivNMax[POKEY_CHAN1];
POKEY_DivNIRQ[POKEY_CHAN2] = POKEY_DivNMax[POKEY_CHAN2];
POKEY_DivNIRQ[POKEY_CHAN4] = POKEY_DivNMax[POKEY_CHAN4];
POKEYSND_Update(POKEY_OFFSET_STIMER, byte, 0, SOUND_GAIN);
#ifdef DEBUG1
printf("WR: STIMER = %x\n", byte);
#endif
break;
case POKEY_OFFSET_SKCTL:
#ifdef VOICEBOX
VOICEBOX_SKCTLPutByte(byte);
#endif
POKEY_SKCTL = byte;
POKEYSND_Update(POKEY_OFFSET_SKCTL, byte, 0, SOUND_GAIN);
if (byte & 4)
pot_scanline = 228; /* fast pot mode - return results immediately */
if ((byte & 0x03) == 0) {
/* POKEY reset. */
/* Stop serial IO. */
POKEY_DELAYED_SERIN_IRQ = 0;
POKEY_DELAYED_SEROUT_IRQ = 0;
POKEY_DELAYED_XMTDONE_IRQ = 0;
#if SKIP
CASSETTE_ResetPOKEY();
#endif
/* TODO other registers should also be reset. */
}
break;
#ifdef STEREO_SOUND
case POKEY_OFFSET_AUDC1 + POKEY_OFFSET_POKEY2:
POKEY_AUDC[POKEY_CHAN1 + POKEY_CHIP2] = byte;
POKEYSND_Update(POKEY_OFFSET_AUDC1, byte, 1, SOUND_GAIN);
break;
case POKEY_OFFSET_AUDC2 + POKEY_OFFSET_POKEY2:
POKEY_AUDC[POKEY_CHAN2 + POKEY_CHIP2] = byte;
POKEYSND_Update(POKEY_OFFSET_AUDC2, byte, 1, SOUND_GAIN);
break;
case POKEY_OFFSET_AUDC3 + POKEY_OFFSET_POKEY2:
POKEY_AUDC[POKEY_CHAN3 + POKEY_CHIP2] = byte;
POKEYSND_Update(POKEY_OFFSET_AUDC3, byte, 1, SOUND_GAIN);
break;
case POKEY_OFFSET_AUDC4 + POKEY_OFFSET_POKEY2:
POKEY_AUDC[POKEY_CHAN4 + POKEY_CHIP2] = byte;
POKEYSND_Update(POKEY_OFFSET_AUDC4, byte, 1, SOUND_GAIN);
break;
case POKEY_OFFSET_AUDCTL + POKEY_OFFSET_POKEY2:
POKEY_AUDCTL[1] = byte;
/* determine the base multiplier for the 'div by n' calculations */
if (byte & POKEY_CLOCK_15)
POKEY_Base_mult[1] = POKEY_DIV_15;
else
POKEY_Base_mult[1] = POKEY_DIV_64;
POKEYSND_Update(POKEY_OFFSET_AUDCTL, byte, 1, SOUND_GAIN);
break;
case POKEY_OFFSET_AUDF1 + POKEY_OFFSET_POKEY2:
POKEY_AUDF[POKEY_CHAN1 + POKEY_CHIP2] = byte;
POKEYSND_Update(POKEY_OFFSET_AUDF1, byte, 1, SOUND_GAIN);
break;
case POKEY_OFFSET_AUDF2 + POKEY_OFFSET_POKEY2:
POKEY_AUDF[POKEY_CHAN2 + POKEY_CHIP2] = byte;
POKEYSND_Update(POKEY_OFFSET_AUDF2, byte, 1, SOUND_GAIN);
break;
case POKEY_OFFSET_AUDF3 + POKEY_OFFSET_POKEY2:
POKEY_AUDF[POKEY_CHAN3 + POKEY_CHIP2] = byte;
POKEYSND_Update(POKEY_OFFSET_AUDF3, byte, 1, SOUND_GAIN);
break;
case POKEY_OFFSET_AUDF4 + POKEY_OFFSET_POKEY2:
POKEY_AUDF[POKEY_CHAN4 + POKEY_CHIP2] = byte;
POKEYSND_Update(POKEY_OFFSET_AUDF4, byte, 1, SOUND_GAIN);
break;
case POKEY_OFFSET_STIMER + POKEY_OFFSET_POKEY2:
POKEYSND_Update(POKEY_OFFSET_STIMER, byte, 1, SOUND_GAIN);
break;
case POKEY_OFFSET_SKCTL + POKEY_OFFSET_POKEY2:
POKEYSND_Update(POKEY_OFFSET_SKCTL, byte, 1, SOUND_GAIN);
break;
#endif
}
}
int POKEY_Initialise(void)
{
int i;
ULONG reg;
/* Initialise Serial Port Interrupts */
POKEY_DELAYED_SERIN_IRQ = 0;
POKEY_DELAYED_SEROUT_IRQ = 0;
POKEY_DELAYED_XMTDONE_IRQ = 0;
POKEY_KBCODE = 0xff;
POKEY_SERIN = 0x00; /* or 0xff ? */
POKEY_IRQST = 0xff;
POKEY_IRQEN = 0x00;
POKEY_SKSTAT = 0xef;
POKEY_SKCTL = 0x00;
for (i = 0; i < (POKEY_MAXPOKEYS * 4); i++) {
POKEY_AUDC[i] = 0;
POKEY_AUDF[i] = 0;
}
for (i = 0; i < POKEY_MAXPOKEYS; i++) {
POKEY_AUDCTL[i] = 0;
POKEY_Base_mult[i] = POKEY_DIV_64;
}
for (i = 0; i < 4; i++)
POKEY_DivNIRQ[i] = POKEY_DivNMax[i] = 0;
pot_scanline = 0;
#if SKIP
/* initialise poly9_lookup */
reg = 0x1ff;
for (i = 0; i < POKEY_POLY9_SIZE; i++) {
reg = ((((reg >> 5) ^ reg) & 1) << 8) + (reg >> 1);
POKEY_poly9_lookup[i] = (UBYTE) reg;
}
/* initialise poly17_lookup */
reg = 0x1ffff;
for (i = 0; i < POKEY_POLY17_SIZE; i++) {
reg = ((((reg >> 5) ^ reg) & 0xff) << 9) + (reg >> 8);
POKEY_poly17_lookup[i] = (UBYTE) (reg >> 1);
}
#endif
#ifndef BASIC
#if SKIP
if (INPUT_Playingback()) {
random_scanline_counter = INPUT_PlaybackInt();
}
else
#endif
#endif
{
random_scanline_counter =
#ifdef HAVE_WINDOWS_H
GetTickCount() % POKEY_POLY17_SIZE;
#elif defined(HAVE_TIME)
time(NULL) % POKEY_POLY17_SIZE;
#else
0;
#endif
}
#ifndef BASIC
#if SKIP
if (INPUT_Recording()) {
INPUT_RecordInt(random_scanline_counter);
}
#endif
#endif
return TRUE;
}
void POKEY_Frame(void)
{
random_scanline_counter %= (POKEY_AUDCTL[0] & POKEY_POLY9) ? POKEY_POLY9_SIZE : POKEY_POLY17_SIZE;
}
/***************************************************************************
** Generate POKEY Timer IRQs if required **
** called on a per-scanline basis, not very precise, but good enough **
** for most applications **
***************************************************************************/
void POKEY_Scanline(void)
{
#ifdef POKEY_UPDATE
pokey_update();
#endif
#ifdef VOL_ONLY_SOUND
POKEYSND_UpdateVolOnly();
#endif
#ifndef BASIC
INPUT_Scanline(); /* Handle Amiga and ST mice. */
/* It's not a part of POKEY emulation, */
/* but it looks to be the best place to put it. */
#endif
/* on nonpatched i/o-operation, enable the cassette timing */
#if SKIP
if (!ESC_enable_sio_patch) {
if (CASSETTE_AddScanLine())
POKEY_DELAYED_SERIN_IRQ = 1;
}
#endif
if ((POKEY_SKCTL & 0x03) == 0)
/* Don't process timers when POKEY is in reset mode. */
return;
if (pot_scanline < 228)
pot_scanline++;
random_scanline_counter += ANTIC_LINE_C;
if (POKEY_DELAYED_SERIN_IRQ > 0) {
if (--POKEY_DELAYED_SERIN_IRQ == 0) {
/* Load a byte to SERIN - even when the IRQ is disabled. */
POKEY_SERIN = SIO_GetByte();
if (POKEY_IRQEN & 0x20) {
if (POKEY_IRQST & 0x20) {
POKEY_IRQST &= 0xdf;
#ifdef DEBUG2
printf("SERIO: SERIN Interrupt triggered, bytevalue %02x\n", POKEY_SERIN);
#endif
}
else {
POKEY_SKSTAT &= 0xdf;
#ifdef DEBUG2
printf("SERIO: SERIN Interrupt triggered, bytevalue %02x\n", POKEY_SERIN);
#endif
}
CPU_GenerateIRQ();
}
#ifdef DEBUG2
else {
printf("SERIO: SERIN Interrupt missed, bytevalue %02x\n", POKEY_SERIN);
}
#endif
}
}
if (POKEY_DELAYED_SEROUT_IRQ > 0) {
if (--POKEY_DELAYED_SEROUT_IRQ == 0) {
if (POKEY_IRQEN & 0x10) {
#ifdef DEBUG2
printf("SERIO: SEROUT Interrupt triggered\n");
#endif
POKEY_IRQST &= 0xef;
CPU_GenerateIRQ();
}
#ifdef DEBUG2
else {
printf("SERIO: SEROUT Interrupt missed\n");
}
#endif
}
}
if (POKEY_DELAYED_XMTDONE_IRQ > 0)
if (--POKEY_DELAYED_XMTDONE_IRQ == 0) {
POKEY_IRQST &= 0xf7;
if (POKEY_IRQEN & 0x08) {
#ifdef DEBUG2
printf("SERIO: XMTDONE Interrupt triggered\n");
#endif
CPU_GenerateIRQ();
}
#ifdef DEBUG2
else
printf("SERIO: XMTDONE Interrupt missed\n");
#endif
}
if ((POKEY_DivNIRQ[POKEY_CHAN1] -= ANTIC_LINE_C) < 0 ) {
POKEY_DivNIRQ[POKEY_CHAN1] += POKEY_DivNMax[POKEY_CHAN1];
if (POKEY_IRQEN & 0x01) {
POKEY_IRQST &= 0xfe;
CPU_GenerateIRQ();
}
}
if ((POKEY_DivNIRQ[POKEY_CHAN2] -= ANTIC_LINE_C) < 0 ) {
POKEY_DivNIRQ[POKEY_CHAN2] += POKEY_DivNMax[POKEY_CHAN2];
if (POKEY_IRQEN & 0x02) {
POKEY_IRQST &= 0xfd;
CPU_GenerateIRQ();
}
}
if ((POKEY_DivNIRQ[POKEY_CHAN4] -= ANTIC_LINE_C) < 0 ) {
POKEY_DivNIRQ[POKEY_CHAN4] += POKEY_DivNMax[POKEY_CHAN4];
if (POKEY_IRQEN & 0x04) {
POKEY_IRQST &= 0xfb;
CPU_GenerateIRQ();
}
}
}
/*****************************************************************************/
/* Module: Update_Counter() */
/* Purpose: To process the latest control values stored in the AUDF, AUDC, */
/* and AUDCTL registers. It pre-calculates as much information as */
/* possible for better performance. This routine has been added */
/* here again as I need the precise frequency for the pokey timers */
/* again. The pokey emulation is therefore somewhat sub-optimal */
/* since the actual pokey emulation should grab the frequency values */
/* directly from here instead of calculating them again. */
/* */
/* Author: Ron Fries,Thomas Richter */
/* Date: March 27, 1998 */
/* */
/* Inputs: chan_mask: Channel mask, one bit per channel. */
/* The channels that need to be updated */
/* */
/* Outputs: Adjusts local globals - no return value */
/* */
/*****************************************************************************/
static void Update_Counter(int chan_mask)
{
/************************************************************/
/* As defined in the manual, the exact Div_n_cnt values are */
/* different depending on the frequency and resolution: */
/* 64 kHz or 15 kHz - AUDF + 1 */
/* 1 MHz, 8-bit - AUDF + 4 */
/* 1 MHz, 16-bit - AUDF[CHAN1]+256*AUDF[CHAN2] + 7 */
/************************************************************/
/* only reset the channels that have changed */
if (chan_mask & (1 << POKEY_CHAN1)) {
/* process channel 1 frequency */
if (POKEY_AUDCTL[0] & POKEY_CH1_179)
POKEY_DivNMax[POKEY_CHAN1] = POKEY_AUDF[POKEY_CHAN1] + 4;
else
POKEY_DivNMax[POKEY_CHAN1] = (POKEY_AUDF[POKEY_CHAN1] + 1) * POKEY_Base_mult[0];
if (POKEY_DivNMax[POKEY_CHAN1] < ANTIC_LINE_C)
POKEY_DivNMax[POKEY_CHAN1] = ANTIC_LINE_C;
}
if (chan_mask & (1 << POKEY_CHAN2)) {
/* process channel 2 frequency */
if (POKEY_AUDCTL[0] & POKEY_CH1_CH2) {
if (POKEY_AUDCTL[0] & POKEY_CH1_179)
POKEY_DivNMax[POKEY_CHAN2] = POKEY_AUDF[POKEY_CHAN2] * 256 + POKEY_AUDF[POKEY_CHAN1] + 7;
else
POKEY_DivNMax[POKEY_CHAN2] = (POKEY_AUDF[POKEY_CHAN2] * 256 + POKEY_AUDF[POKEY_CHAN1] + 1) * POKEY_Base_mult[0];
}
else
POKEY_DivNMax[POKEY_CHAN2] = (POKEY_AUDF[POKEY_CHAN2] + 1) * POKEY_Base_mult[0];
if (POKEY_DivNMax[POKEY_CHAN2] < ANTIC_LINE_C)
POKEY_DivNMax[POKEY_CHAN2] = ANTIC_LINE_C;
}
if (chan_mask & (1 << POKEY_CHAN4)) {
/* process channel 4 frequency */
if (POKEY_AUDCTL[0] & POKEY_CH3_CH4) {
if (POKEY_AUDCTL[0] & POKEY_CH3_179)
POKEY_DivNMax[POKEY_CHAN4] = POKEY_AUDF[POKEY_CHAN4] * 256 + POKEY_AUDF[POKEY_CHAN3] + 7;
else
POKEY_DivNMax[POKEY_CHAN4] = (POKEY_AUDF[POKEY_CHAN4] * 256 + POKEY_AUDF[POKEY_CHAN3] + 1) * POKEY_Base_mult[0];
}
else
POKEY_DivNMax[POKEY_CHAN4] = (POKEY_AUDF[POKEY_CHAN4] + 1) * POKEY_Base_mult[0];
if (POKEY_DivNMax[POKEY_CHAN4] < ANTIC_LINE_C)
POKEY_DivNMax[POKEY_CHAN4] = ANTIC_LINE_C;
}
}
#ifndef BASIC
void POKEY_StateSave(void)
{
int shift_key = 0;
int keypressed = 0;
StateSav_SaveUBYTE(&POKEY_KBCODE, 1);
StateSav_SaveUBYTE(&POKEY_IRQST, 1);
StateSav_SaveUBYTE(&POKEY_IRQEN, 1);
StateSav_SaveUBYTE(&POKEY_SKCTL, 1);
StateSav_SaveINT(&shift_key, 1);
StateSav_SaveINT(&keypressed, 1);
StateSav_SaveINT(&POKEY_DELAYED_SERIN_IRQ, 1);
StateSav_SaveINT(&POKEY_DELAYED_SEROUT_IRQ, 1);
StateSav_SaveINT(&POKEY_DELAYED_XMTDONE_IRQ, 1);
StateSav_SaveUBYTE(&POKEY_AUDF[0], 4);
StateSav_SaveUBYTE(&POKEY_AUDC[0], 4);
StateSav_SaveUBYTE(&POKEY_AUDCTL[0], 1);
StateSav_SaveINT(&POKEY_DivNIRQ[0], 4);
StateSav_SaveINT(&POKEY_DivNMax[0], 4);
StateSav_SaveINT(&POKEY_Base_mult[0], 1);
}
void POKEY_StateRead(void)
{
int i;
int shift_key;
int keypressed;
StateSav_ReadUBYTE(&POKEY_KBCODE, 1);
StateSav_ReadUBYTE(&POKEY_IRQST, 1);
StateSav_ReadUBYTE(&POKEY_IRQEN, 1);
StateSav_ReadUBYTE(&POKEY_SKCTL, 1);
StateSav_ReadINT(&shift_key, 1);
StateSav_ReadINT(&keypressed, 1);
StateSav_ReadINT(&POKEY_DELAYED_SERIN_IRQ, 1);
StateSav_ReadINT(&POKEY_DELAYED_SEROUT_IRQ, 1);
StateSav_ReadINT(&POKEY_DELAYED_XMTDONE_IRQ, 1);
StateSav_ReadUBYTE(&POKEY_AUDF[0], 4);
StateSav_ReadUBYTE(&POKEY_AUDC[0], 4);
StateSav_ReadUBYTE(&POKEY_AUDCTL[0], 1);
for (i = 0; i < 4; i++) {
POKEY_PutByte((UWORD) (POKEY_OFFSET_AUDF1 + i * 2), POKEY_AUDF[i]);
POKEY_PutByte((UWORD) (POKEY_OFFSET_AUDC1 + i * 2), POKEY_AUDC[i]);
}
POKEY_PutByte(POKEY_OFFSET_AUDCTL, POKEY_AUDCTL[0]);
StateSav_ReadINT(&POKEY_DivNIRQ[0], 4);
StateSav_ReadINT(&POKEY_DivNMax[0], 4);
StateSav_ReadINT(&POKEY_Base_mult[0], 1);
}
#endif

Wyświetl plik

@ -0,0 +1,120 @@
#ifndef POKEY_H_
#define POKEY_H_
#include "atari.h"
#define POKEY_OFFSET_AUDF1 0x00
#define POKEY_OFFSET_AUDC1 0x01
#define POKEY_OFFSET_AUDF2 0x02
#define POKEY_OFFSET_AUDC2 0x03
#define POKEY_OFFSET_AUDF3 0x04
#define POKEY_OFFSET_AUDC3 0x05
#define POKEY_OFFSET_AUDF4 0x06
#define POKEY_OFFSET_AUDC4 0x07
#define POKEY_OFFSET_AUDCTL 0x08
#define POKEY_OFFSET_STIMER 0x09
#define POKEY_OFFSET_SKRES 0x0a
#define POKEY_OFFSET_POTGO 0x0b
#define POKEY_OFFSET_SEROUT 0x0d
#define POKEY_OFFSET_IRQEN 0x0e
#define POKEY_OFFSET_SKCTL 0x0f
#define POKEY_OFFSET_POT0 0x00
#define POKEY_OFFSET_POT1 0x01
#define POKEY_OFFSET_POT2 0x02
#define POKEY_OFFSET_POT3 0x03
#define POKEY_OFFSET_POT4 0x04
#define POKEY_OFFSET_POT5 0x05
#define POKEY_OFFSET_POT6 0x06
#define POKEY_OFFSET_POT7 0x07
#define POKEY_OFFSET_ALLPOT 0x08
#define POKEY_OFFSET_KBCODE 0x09
#define POKEY_OFFSET_RANDOM 0x0a
#define POKEY_OFFSET_SERIN 0x0d
#define POKEY_OFFSET_IRQST 0x0e
#define POKEY_OFFSET_SKSTAT 0x0f
#define POKEY_OFFSET_POKEY2 0x10 /* offset to second pokey chip (STEREO expansion) */
#ifndef ASAP
extern UBYTE POKEY_KBCODE;
extern UBYTE POKEY_IRQST;
extern UBYTE POKEY_IRQEN;
extern UBYTE POKEY_SKSTAT;
extern UBYTE POKEY_SKCTL;
extern int POKEY_DELAYED_SERIN_IRQ;
extern int POKEY_DELAYED_SEROUT_IRQ;
extern int POKEY_DELAYED_XMTDONE_IRQ;
extern UBYTE POKEY_POT_input[8];
ULONG POKEY_GetRandomCounter(void);
void POKEY_SetRandomCounter(ULONG value);
UBYTE POKEY_GetByte(UWORD addr, int no_side_effects);
void POKEY_PutByte(UWORD addr, UBYTE byte);
int POKEY_Initialise(void);
void POKEY_Frame(void);
void POKEY_Scanline(void);
void POKEY_StateSave(void);
void POKEY_StateRead(void);
#endif
/* CONSTANT DEFINITIONS */
/* definitions for AUDCx (D201, D203, D205, D207) */
#define POKEY_NOTPOLY5 0x80 /* selects POLY5 or direct CLOCK */
#define POKEY_POLY4 0x40 /* selects POLY4 or POLY17 */
#define POKEY_PURETONE 0x20 /* selects POLY4/17 or PURE tone */
#define POKEY_VOL_ONLY 0x10 /* selects VOLUME OUTPUT ONLY */
#define POKEY_VOLUME_MASK 0x0f /* volume mask */
/* definitions for AUDCTL (D208) */
#define POKEY_POLY9 0x80 /* selects POLY9 or POLY17 */
#define POKEY_CH1_179 0x40 /* selects 1.78979 MHz for Ch 1 */
#define POKEY_CH3_179 0x20 /* selects 1.78979 MHz for Ch 3 */
#define POKEY_CH1_CH2 0x10 /* clocks channel 1 w/channel 2 */
#define POKEY_CH3_CH4 0x08 /* clocks channel 3 w/channel 4 */
#define POKEY_CH1_FILTER 0x04 /* selects channel 1 high pass filter */
#define POKEY_CH2_FILTER 0x02 /* selects channel 2 high pass filter */
#define POKEY_CLOCK_15 0x01 /* selects 15.6999kHz or 63.9210kHz */
/* for accuracy, the 64kHz and 15kHz clocks are exact divisions of
the 1.79MHz clock */
#define POKEY_DIV_64 28 /* divisor for 1.79MHz clock to 64 kHz */
#define POKEY_DIV_15 114 /* divisor for 1.79MHz clock to 15 kHz */
/* the size (in entries) of the 4 polynomial tables */
#define POKEY_POLY4_SIZE 0x000f
#define POKEY_POLY5_SIZE 0x001f
#define POKEY_POLY9_SIZE 511 //0x01ff
#define POKEY_POLY17_SIZE 16385//0x0001ffff
#define POKEY_MAXPOKEYS 2 /* max number of emulated chips */
/* channel/chip definitions */
#define POKEY_CHAN1 0
#define POKEY_CHAN2 1
#define POKEY_CHAN3 2
#define POKEY_CHAN4 3
#define POKEY_CHIP1 0
#define POKEY_CHIP2 4
#define POKEY_CHIP3 8
#define POKEY_CHIP4 12
#define POKEY_SAMPLE 127
/* structures to hold the 9 pokey control bytes */
extern UBYTE POKEY_AUDF[4 * POKEY_MAXPOKEYS]; /* AUDFx (D200, D202, D204, D206) */
extern UBYTE POKEY_AUDC[4 * POKEY_MAXPOKEYS]; /* AUDCx (D201, D203, D205, D207) */
extern UBYTE POKEY_AUDCTL[POKEY_MAXPOKEYS]; /* AUDCTL (D208) */
extern int POKEY_DivNIRQ[4], POKEY_DivNMax[4];
extern int POKEY_Base_mult[POKEY_MAXPOKEYS]; /* selects either 64Khz or 15Khz clock mult */
extern const UBYTE POKEY_poly9_lookup[POKEY_POLY9_SIZE];
extern const UBYTE POKEY_poly17_lookup[POKEY_POLY17_SIZE];
#endif /* POKEY_H_ */

Plik diff jest za duży Load Diff

Wyświetl plik

@ -0,0 +1,147 @@
/*****************************************************************************/
/* */
/* Module: POKEY Chip Simulator Includes, V2.3 */
/* Purpose: To emulate the sound generation hardware of the Atari POKEY chip. */
/* Author: Ron Fries */
/* */
/* Revision History: */
/* */
/* 09/22/96 - Ron Fries - Initial Release */
/* 04/06/97 - Brad Oliver - Some cross-platform modifications. Added */
/* big/little endian #defines, removed <dos.h>, */
/* conditional defines for TRUE/FALSE */
/* 01/19/98 - Ron Fries - Changed signed/unsigned sample support to a */
/* compile-time option. Defaults to unsigned - */
/* define SIGNED_SAMPLES to create signed. */
/* */
/*****************************************************************************/
/* */
/* License Information and Copyright Notice */
/* ======================================== */
/* */
/* PokeySound is Copyright(c) 1996-1998 by Ron Fries */
/* */
/* This library is free software; you can redistribute it and/or modify it */
/* under the terms of version 2 of the GNU Library General Public License */
/* as published by the Free Software Foundation. */
/* */
/* This library is distributed in the hope that it will be useful, but */
/* WITHOUT ANY WARRANTY; without even the implied warranty of */
/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library */
/* General Public License for more details. */
/* To obtain a copy of the GNU Library General Public License, write to the */
/* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
/* */
/* Any permitted reproduction of these routines, in whole or in part, must */
/* bear this legend. */
/* */
/*****************************************************************************/
#ifndef POKEYSND_H_
#define POKEYSND_H_
#include "atari.h"
#include "pokey.h"
/* CONSTANT DEFINITIONS */
/* As an alternative to using the exact frequencies, selecting a playback
frequency that is an exact division of the main clock provides a higher
quality output due to less aliasing. For best results, a value of
1787520 MHz is used for the main clock. With this value, both the
64 kHz and 15 kHz clocks are evenly divisible. Selecting a playback
frequency that is also a division of the clock provides the best
results. The best options are FREQ_64 divided by either 2, 3, or 4.
The best selection is based on a trade off between performance and
sound quality.
Of course, using a main clock frequency that is not exact will affect
the pitch of the output. With these numbers, the pitch will be low
by 0.127%. (More than likely, an actual unit will vary by this much!) */
#define POKEYSND_FREQ_17_EXACT 1789790 /* exact 1.79 MHz clock freq */
#define POKEYSND_FREQ_17_APPROX 1787520 /* approximate 1.79 MHz clock freq */
#ifdef __cplusplus
extern "C" {
#endif
#ifdef POKEYSND_SIGNED_SAMPLES /* if signed output selected */
#define POKEYSND_SAMP_MAX 255 /* else set unsigned 8-bit clip ranges */
#define POKEYSND_SAMP_MIN 0
#define POKEYSND_SAMP_MID 128
//#define POKEYSND_SAMP_MAX 127 /* then set signed 8-bit clipping ranges */
//#define POKEYSND_SAMP_MIN -128
//#define POKEYSND_SAMP_MID 0
#else
#define POKEYSND_SAMP_MAX 255 /* else set unsigned 8-bit clip ranges */
#define POKEYSND_SAMP_MIN 0
#define POKEYSND_SAMP_MID 128
#endif
/* init flags */
#define POKEYSND_BIT16 1
extern SLONG POKEYSND_playback_freq;
extern UBYTE POKEYSND_num_pokeys;
extern int POKEYSND_snd_flags;
extern int POKEYSND_volume;
extern int POKEYSND_enable_new_pokey;
extern int POKEYSND_stereo_enabled;
extern int POKEYSND_serio_sound_enabled;
extern int POKEYSND_console_sound_enabled;
extern int POKEYSND_bienias_fix;
extern void (*POKEYSND_Process_ptr)(void *sndbuffer, int sndn);
extern void (*POKEYSND_Update_ptr)(UWORD addr, UBYTE val, UBYTE chip, UBYTE gain);
extern void (*POKEYSND_UpdateSerio)(int out, UBYTE data);
extern void (*POKEYSND_UpdateConsol_ptr)(int set);
extern void (*POKEYSND_UpdateVolOnly)(void);
int POKEYSND_Init(ULONG freq17, int playback_freq, UBYTE num_pokeys,
int flags
#ifdef __PLUS
, int clear_regs
#endif
);
void POKEYSND_Update(UWORD addr, UBYTE val, UBYTE /*chip*/, UBYTE gain);
void POKEYSND_UpdateConsol(int set);
/* Fill sndbuffer with sndn samples of audio. Number of bytes written to
sndbuffer is sndn with 8-bit sound, and 2*sndn with 16-bit sound. sndn
must be a multiple of POKEYSND_num_pokeys. */
void POKEYSND_Process(void *sndbuffer, int sndn);
int POKEYSND_DoInit(void);
void POKEYSND_SetMzQuality(int quality);
void POKEYSND_SetVolume(int vol);
/* Volume only emulations declarations */
#ifdef VOL_ONLY_SOUND
#define POKEYSND_SAMPBUF_MAX 2000
extern int POKEYSND_sampbuf_val[POKEYSND_SAMPBUF_MAX]; /* volume values */
extern int POKEYSND_sampbuf_cnt[POKEYSND_SAMPBUF_MAX]; /* relative start time */
extern int POKEYSND_sampbuf_ptr; /* pointer to sampbuf */
extern int POKEYSND_sampbuf_rptr; /* pointer to read from sampbuf */
extern int POKEYSND_sampbuf_last; /* last absolute time */
extern int POKEYSND_sampbuf_AUDV[4 * POKEY_MAXPOKEYS]; /* prev. channel volume */
extern int POKEYSND_sampbuf_lastval; /* last volume */
extern int POKEYSND_sampout; /* last out volume */
extern int POKEYSND_samp_freq;
extern int POKEYSND_samp_consol_val; /* actual value of console sound */
#endif /* VOL_ONLY_SOUND */
#ifdef SYNCHRONIZED_SOUND
extern UBYTE *POKEYSND_process_buffer;
extern unsigned int POKEYSND_process_buffer_length;
extern unsigned int POKEYSND_process_buffer_fill;
extern void (*POKEYSND_GenerateSync)(unsigned int num_ticks);
int POKEYSND_UpdateProcessBuffer(void);
#endif /* SYNCHRONIZED_SOUND */
#ifdef __cplusplus
}
#endif
#endif /* POKEYSND_H_ */

Wyświetl plik

@ -0,0 +1,642 @@
const UBYTE PROGMEM romos[10240] = {
0x20,0xA1,0xDB,0x20,0xBB,0xDB,0xB0,0x39,0xA2,0xED,0xA0,0x04,0x20,0x48,0xDA,0xA2,
0xFF,0x86,0xF1,0x20,0x44,0xDA,0xF0,0x04,0xA9,0xFF,0x85,0xF0,0x20,0x94,0xDB,0xB0,
0x21,0x48,0xA6,0xD5,0xD0,0x11,0x20,0xEB,0xDB,0x68,0x05,0xD9,0x85,0xD9,0xA6,0xF1,
0x30,0xE6,0xE8,0x86,0xF1,0xD0,0xE1,0x68,0xA6,0xF1,0x10,0x02,0xE6,0xED,0x4C,0x18,
0xD8,0x60,0xC9,0x2E,0xF0,0x14,0xC9,0x45,0xF0,0x19,0xA6,0xF0,0xD0,0x68,0xC9,0x2B,
0xF0,0xC6,0xC9,0x2D,0xF0,0x00,0x85,0xEE,0xF0,0xBE,0xA6,0xF1,0x10,0x58,0xE8,0x86,
0xF1,0xF0,0xB5,0xA5,0xF2,0x85,0xEC,0x20,0x94,0xDB,0xB0,0x37,0xAA,0xA5,0xED,0x48,
0x86,0xED,0x20,0x94,0xDB,0xB0,0x17,0x48,0xA5,0xED,0x0A,0x85,0xED,0x0A,0x0A,0x65,
0xED,0x85,0xED,0x68,0x18,0x65,0xED,0x85,0xED,0xA4,0xF2,0x20,0x9D,0xDB,0xA5,0xEF,
0xF0,0x09,0xA5,0xED,0x49,0xFF,0x18,0x69,0x01,0x85,0xED,0x68,0x18,0x65,0xED,0x85,
0xED,0xD0,0x13,0xC9,0x2B,0xF0,0x06,0xC9,0x2D,0xD0,0x07,0x85,0xEF,0x20,0x94,0xDB,
0x90,0xBA,0xA5,0xEC,0x85,0xF2,0xC6,0xF2,0xA5,0xED,0xA6,0xF1,0x30,0x05,0xF0,0x03,
0x38,0xE5,0xF1,0x48,0x2A,0x68,0x6A,0x85,0xED,0x90,0x03,0x20,0xEB,0xDB,0xA5,0xED,
0x18,0x69,0x44,0x85,0xD4,0x20,0x00,0xDC,0xB0,0x0B,0xA6,0xEE,0xF0,0x06,0xA5,0xD4,
0x09,0x80,0x85,0xD4,0x18,0x60,0x20,0x51,0xDA,0xA9,0x30,0x8D,0x7F,0x05,0xA5,0xD4,
0xF0,0x28,0x29,0x7F,0xC9,0x3F,0x90,0x28,0xC9,0x45,0xB0,0x24,0x38,0xE9,0x3F,0x20,
0x70,0xDC,0x20,0xA4,0xDC,0x09,0x80,0x9D,0x80,0x05,0xAD,0x80,0x05,0xC9,0x2E,0xF0,
0x03,0x4C,0x88,0xD9,0x20,0xC1,0xDC,0x4C,0x9C,0xD9,0xA9,0xB0,0x8D,0x80,0x05,0x60,
0xA9,0x01,0x20,0x70,0xDC,0x20,0xA4,0xDC,0xE8,0x86,0xF2,0xA5,0xD4,0x0A,0x38,0xE9,
0x80,0xAE,0x80,0x05,0xE0,0x30,0xF0,0x17,0xAE,0x81,0x05,0xAC,0x82,0x05,0x8E,0x82,
0x05,0x8C,0x81,0x05,0xA6,0xF2,0xE0,0x02,0xD0,0x02,0xE6,0xF2,0x18,0x69,0x01,0x85,
0xED,0xA9,0x45,0xA4,0xF2,0x20,0x9F,0xDC,0x84,0xF2,0xA5,0xED,0x10,0x0B,0xA9,0x00,
0x38,0xE5,0xED,0x85,0xED,0xA9,0x2D,0xD0,0x02,0xA9,0x2B,0x20,0x9F,0xDC,0xA2,0x00,
0xA5,0xED,0x38,0xE9,0x0A,0x90,0x03,0xE8,0xD0,0xF8,0x18,0x69,0x0A,0x48,0x8A,0x20,
0x9D,0xDC,0x68,0x09,0x80,0x20,0x9D,0xDC,0xAD,0x80,0x05,0xC9,0x30,0xD0,0x0D,0x18,
0xA5,0xF3,0x69,0x01,0x85,0xF3,0xA5,0xF4,0x69,0x00,0x85,0xF4,0xA5,0xD4,0x10,0x09,
0x20,0xC1,0xDC,0xA0,0x00,0xA9,0x2D,0x91,0xF3,0x60,0xA5,0xD4,0x85,0xF8,0xA5,0xD5,
0x85,0xF7,0x20,0x44,0xDA,0xF8,0xA0,0x10,0x06,0xF8,0x26,0xF7,0xA2,0x03,0xB5,0xD4,
0x75,0xD4,0x95,0xD4,0xCA,0xD0,0xF7,0x88,0xD0,0xEE,0xD8,0xA9,0x42,0x85,0xD4,0x4C,
0x00,0xDC,0xA9,0x00,0x85,0xF7,0x85,0xF8,0xA5,0xD4,0x30,0x66,0xC9,0x43,0xB0,0x62,
0x38,0xE9,0x40,0x90,0x3F,0x69,0x00,0x0A,0x85,0xF5,0x20,0x5A,0xDA,0xB0,0x53,0xA5,
0xF7,0x85,0xF9,0xA5,0xF8,0x85,0xFA,0x20,0x5A,0xDA,0xB0,0x46,0x20,0x5A,0xDA,0xB0,
0x41,0x18,0xA5,0xF8,0x65,0xFA,0x85,0xF8,0xA5,0xF7,0x65,0xF9,0x85,0xF7,0xB0,0x32,
0x20,0xB9,0xDC,0x18,0x65,0xF8,0x85,0xF8,0xA5,0xF7,0x69,0x00,0xB0,0x24,0x85,0xF7,
0xC6,0xF5,0xD0,0xC6,0x20,0xB9,0xDC,0xC9,0x05,0x90,0x0D,0x18,0xA5,0xF8,0x69,0x01,
0x85,0xF8,0xA5,0xF7,0x69,0x00,0x85,0xF7,0xA5,0xF8,0x85,0xD4,0xA5,0xF7,0x85,0xD5,
0x18,0x60,0x38,0x60,0xA2,0xD4,0xA0,0x06,0xA9,0x00,0x95,0x00,0xE8,0x88,0xD0,0xFA,
0x60,0xA9,0x05,0x85,0xF4,0xA9,0x80,0x85,0xF3,0x60,0x18,0x26,0xF8,0x26,0xF7,0x60,
0xA5,0xE0,0x49,0x80,0x85,0xE0,0xA5,0xE0,0x29,0x7F,0x85,0xF7,0xA5,0xD4,0x29,0x7F,
0x38,0xE5,0xF7,0x10,0x10,0xA2,0x05,0xB5,0xD4,0xB4,0xE0,0x95,0xE0,0x98,0x95,0xD4,
0xCA,0x10,0xF4,0x30,0xE1,0xF0,0x07,0xC9,0x05,0xB0,0x19,0x20,0x3E,0xDC,0xF8,0xA5,
0xD4,0x45,0xE0,0x30,0x1E,0xA2,0x04,0x18,0xB5,0xD5,0x75,0xE1,0x95,0xD5,0xCA,0x10,
0xF7,0xD8,0xB0,0x03,0x4C,0x00,0xDC,0xA9,0x01,0x20,0x3A,0xDC,0xA9,0x01,0x85,0xD5,
0x4C,0x00,0xDC,0xA2,0x04,0x38,0xB5,0xD5,0xF5,0xE1,0x95,0xD5,0xCA,0x10,0xF7,0x90,
0x04,0xD8,0x4C,0x00,0xDC,0xA5,0xD4,0x49,0x80,0x85,0xD4,0x38,0xA2,0x04,0xA9,0x00,
0xF5,0xD5,0x95,0xD5,0xCA,0x10,0xF7,0xD8,0x4C,0x00,0xDC,0xA5,0xD4,0xF0,0x45,0xA5,
0xE0,0xF0,0x3E,0x20,0xCF,0xDC,0x38,0xE9,0x40,0x38,0x65,0xE0,0x30,0x38,0x20,0xE0,
0xDC,0xA5,0xDF,0x29,0x0F,0x85,0xF6,0xC6,0xF6,0x30,0x06,0x20,0x01,0xDD,0x4C,0xF7,
0xDA,0xA5,0xDF,0x4A,0x4A,0x4A,0x4A,0x85,0xF6,0xC6,0xF6,0x30,0x06,0x20,0x05,0xDD,
0x4C,0x09,0xDB,0x20,0x62,0xDC,0xC6,0xF5,0xD0,0xD7,0xA5,0xED,0x85,0xD4,0x4C,0x04,
0xDC,0x20,0x44,0xDA,0x18,0x60,0x38,0x60,0xA5,0xE0,0xF0,0xFA,0xA5,0xD4,0xF0,0xF4,
0x20,0xCF,0xDC,0x38,0xE5,0xE0,0x18,0x69,0x40,0x30,0xEB,0x20,0xE0,0xDC,0xE6,0xF5,
0x4C,0x4E,0xDB,0xA2,0x00,0xB5,0xD5,0x95,0xD4,0xE8,0xE0,0x0C,0xD0,0xF7,0xA0,0x05,
0x38,0xF8,0xB9,0xDA,0x00,0xF9,0xE6,0x00,0x99,0xDA,0x00,0x88,0x10,0xF4,0xD8,0x90,
0x04,0xE6,0xD9,0xD0,0xE9,0x20,0x0F,0xDD,0x06,0xD9,0x06,0xD9,0x06,0xD9,0x06,0xD9,
0xA0,0x05,0x38,0xF8,0xB9,0xDA,0x00,0xF9,0xE0,0x00,0x99,0xDA,0x00,0x88,0x10,0xF4,
0xD8,0x90,0x04,0xE6,0xD9,0xD0,0xE9,0x20,0x09,0xDD,0xC6,0xF5,0xD0,0xB5,0x20,0x62,
0xDC,0x4C,0x1A,0xDB,0x20,0xAF,0xDB,0xA4,0xF2,0x90,0x02,0xB1,0xF3,0xC8,0x84,0xF2,
0x60,0xA4,0xF2,0xA9,0x20,0xD1,0xF3,0xD0,0x03,0xC8,0xD0,0xF9,0x84,0xF2,0x60,0xA4,
0xF2,0xB1,0xF3,0x38,0xE9,0x30,0x90,0x18,0xC9,0x0A,0x60,0xA5,0xF2,0x48,0x20,0x94,
0xDB,0x90,0x1F,0xC9,0x2E,0xF0,0x14,0xC9,0x2B,0xF0,0x07,0xC9,0x2D,0xF0,0x03,0x68,
0x38,0x60,0x20,0x94,0xDB,0x90,0x0B,0xC9,0x2E,0xD0,0xF4,0x20,0x94,0xDB,0x90,0x02,
0xB0,0xED,0x68,0x85,0xF2,0x18,0x60,0xA2,0xE7,0xD0,0x02,0xA2,0xD5,0xA0,0x04,0x18,
0x36,0x04,0x36,0x03,0x36,0x02,0x36,0x01,0x36,0x00,0x26,0xEC,0x88,0xD0,0xF0,0x60,
0xA2,0x00,0x86,0xDA,0xA2,0x04,0xA5,0xD4,0xF0,0x2E,0xA5,0xD5,0xD0,0x1A,0xA0,0x00,
0xB9,0xD6,0x00,0x99,0xD5,0x00,0xC8,0xC0,0x05,0x90,0xF5,0xC6,0xD4,0xCA,0xD0,0xEA,
0xA5,0xD5,0xD0,0x04,0x85,0xD4,0x18,0x60,0xA5,0xD4,0x29,0x7F,0xC9,0x71,0x90,0x01,
0x60,0xC9,0x0F,0xB0,0x03,0x20,0x44,0xDA,0x18,0x60,0xA2,0xD4,0xD0,0x02,0xA2,0xE0,
0x86,0xF9,0x85,0xF7,0x85,0xF8,0xA0,0x04,0xB5,0x04,0x95,0x05,0xCA,0x88,0xD0,0xF8,
0xA9,0x00,0x95,0x05,0xA6,0xF9,0xC6,0xF7,0xD0,0xEC,0xB5,0x00,0x18,0x65,0xF8,0x95,
0x00,0x60,0xA2,0x0A,0xB5,0xD4,0x95,0xD5,0xCA,0x10,0xF9,0xA9,0x00,0x85,0xD4,0x60,
0x85,0xF7,0xA2,0x00,0xA0,0x00,0x20,0x93,0xDC,0x38,0xE9,0x01,0x85,0xF7,0xB5,0xD5,
0x4A,0x4A,0x4A,0x4A,0x20,0x9D,0xDC,0xB5,0xD5,0x29,0x0F,0x20,0x9D,0xDC,0xE8,0xE0,
0x05,0x90,0xE3,0xA5,0xF7,0xD0,0x05,0xA9,0x2E,0x20,0x9F,0xDC,0x60,0x09,0x30,0x99,
0x80,0x05,0xC8,0x60,0xA2,0x0A,0xBD,0x80,0x05,0xC9,0x2E,0xF0,0x07,0xC9,0x30,0xD0,
0x07,0xCA,0xD0,0xF2,0xCA,0xBD,0x80,0x05,0x60,0x20,0xEB,0xDB,0xA5,0xEC,0x29,0x0F,
0x60,0x38,0xA5,0xF3,0xE9,0x01,0x85,0xF3,0xA5,0xF4,0xE9,0x00,0x85,0xF4,0x60,0xA5,
0xD4,0x45,0xE0,0x29,0x80,0x85,0xEE,0x06,0xE0,0x46,0xE0,0xA5,0xD4,0x29,0x7F,0x60,
0x05,0xEE,0x85,0xED,0xA9,0x00,0x85,0xD4,0x85,0xE0,0x20,0x28,0xDD,0x20,0xE7,0xDB,
0xA5,0xEC,0x29,0x0F,0x85,0xE6,0xA9,0x05,0x85,0xF5,0x20,0x34,0xDD,0x20,0x44,0xDA,
0x60,0xA2,0xD9,0xD0,0x06,0xA2,0xD9,0xD0,0x08,0xA2,0xDF,0xA0,0xE5,0xD0,0x04,0xA2,
0xDF,0xA0,0xEB,0xA9,0x05,0x85,0xF7,0x18,0xF8,0xB5,0x00,0x79,0x00,0x00,0x95,0x00,
0xCA,0x88,0xC6,0xF7,0x10,0xF3,0xD8,0x60,0xA0,0x05,0xB9,0xE0,0x00,0x99,0xE6,0x00,
0x88,0x10,0xF7,0x60,0xA0,0x05,0xB9,0xD4,0x00,0x99,0xDA,0x00,0x88,0x10,0xF7,0x60,
0x86,0xFE,0x84,0xFF,0x85,0xEF,0xA2,0xE0,0xA0,0x05,0x20,0xA7,0xDD,0x20,0xB6,0xDD,
0xA6,0xFE,0xA4,0xFF,0x20,0x89,0xDD,0xC6,0xEF,0xF0,0x2D,0x20,0xDB,0xDA,0xB0,0x28,
0x18,0xA5,0xFE,0x69,0x06,0x85,0xFE,0x90,0x06,0xA5,0xFF,0x69,0x00,0x85,0xFF,0xA6,
0xFE,0xA4,0xFF,0x20,0x98,0xDD,0x20,0x66,0xDA,0xB0,0x0D,0xC6,0xEF,0xF0,0x09,0xA2,
0xE0,0xA0,0x05,0x20,0x98,0xDD,0x30,0xD3,0x60,0x86,0xFC,0x84,0xFD,0xA0,0x05,0xB1,
0xFC,0x99,0xD4,0x00,0x88,0x10,0xF8,0x60,0x86,0xFC,0x84,0xFD,0xA0,0x05,0xB1,0xFC,
0x99,0xE0,0x00,0x88,0x10,0xF8,0x60,0x86,0xFC,0x84,0xFD,0xA0,0x05,0xB9,0xD4,0x00,
0x91,0xFC,0x88,0x10,0xF8,0x60,0xA2,0x05,0xB5,0xD4,0x95,0xE0,0xCA,0x10,0xF9,0x60,
0xA2,0x89,0xA0,0xDE,0x20,0x98,0xDD,0x20,0xDB,0xDA,0xB0,0x7F,0xA9,0x00,0x85,0xF1,
0xA5,0xD4,0x85,0xF0,0x29,0x7F,0x85,0xD4,0x38,0xE9,0x40,0x30,0x26,0xC9,0x04,0x10,
0x6A,0xA2,0xE6,0xA0,0x05,0x20,0xA7,0xDD,0x20,0xD2,0xD9,0xA5,0xD4,0x85,0xF1,0xA5,
0xD5,0xD0,0x58,0x20,0xAA,0xD9,0x20,0xB6,0xDD,0xA2,0xE6,0xA0,0x05,0x20,0x89,0xDD,
0x20,0x60,0xDA,0xA9,0x0A,0xA2,0x4D,0xA0,0xDE,0x20,0x40,0xDD,0x20,0xB6,0xDD,0x20,
0xDB,0xDA,0xA5,0xF1,0xF0,0x23,0x18,0x6A,0x85,0xE0,0xA9,0x01,0x90,0x02,0xA9,0x10,
0x85,0xE1,0xA2,0x04,0xA9,0x00,0x95,0xE2,0xCA,0x10,0xFB,0xA5,0xE0,0x18,0x69,0x40,
0xB0,0x19,0x30,0x17,0x85,0xE0,0x20,0xDB,0xDA,0xA5,0xF0,0x10,0x0D,0x20,0xB6,0xDD,
0xA2,0x8F,0xA0,0xDE,0x20,0x89,0xDD,0x20,0x28,0xDB,0x60,0x38,0x60,0x3D,0x17,0x94,
0x19,0x00,0x00,0x3D,0x57,0x33,0x05,0x00,0x00,0x3E,0x05,0x54,0x76,0x62,0x00,0x3E,
0x32,0x19,0x62,0x27,0x00,0x3F,0x01,0x68,0x60,0x30,0x36,0x3F,0x07,0x32,0x03,0x27,
0x41,0x3F,0x25,0x43,0x34,0x56,0x75,0x3F,0x66,0x27,0x37,0x30,0x50,0x40,0x01,0x15,
0x12,0x92,0x55,0x3F,0x99,0x99,0x99,0x99,0x99,0x3F,0x43,0x42,0x94,0x48,0x19,0x40,
0x01,0x00,0x00,0x00,0x00,0x86,0xFE,0x84,0xFF,0xA2,0xE0,0xA0,0x05,0x20,0xA7,0xDD,
0xA6,0xFE,0xA4,0xFF,0x20,0x98,0xDD,0x20,0x66,0xDA,0xA2,0xE6,0xA0,0x05,0x20,0xA7,
0xDD,0xA2,0xE0,0xA0,0x05,0x20,0x89,0xDD,0xA6,0xFE,0xA4,0xFF,0x20,0x98,0xDD,0x20,
0x60,0xDA,0xA2,0xE6,0xA0,0x05,0x20,0x98,0xDD,0x20,0x28,0xDB,0x60,0xA9,0x01,0xD0,
0x02,0xA9,0x00,0x85,0xF0,0xA5,0xD4,0x10,0x02,0x38,0x60,0xA5,0xD4,0x85,0xE0,0x38,
0xE9,0x40,0x0A,0x85,0xF1,0xA5,0xD5,0x29,0xF0,0xD0,0x04,0xA9,0x01,0xD0,0x04,0xE6,
0xF1,0xA9,0x10,0x85,0xE1,0xA2,0x04,0xA9,0x00,0x95,0xE2,0xCA,0x10,0xFB,0x20,0x28,
0xDB,0xA2,0x66,0xA0,0xDF,0x20,0x95,0xDE,0xA2,0xE6,0xA0,0x05,0x20,0xA7,0xDD,0x20,
0xB6,0xDD,0x20,0xDB,0xDA,0xA9,0x0A,0xA2,0x72,0xA0,0xDF,0x20,0x40,0xDD,0xA2,0xE6,
0xA0,0x05,0x20,0x98,0xDD,0x20,0xDB,0xDA,0xA2,0x6C,0xA0,0xDF,0x20,0x98,0xDD,0x20,
0x66,0xDA,0x20,0xB6,0xDD,0xA9,0x00,0x85,0xD5,0xA5,0xF1,0x85,0xD4,0x10,0x07,0x49,
0xFF,0x18,0x69,0x01,0x85,0xD4,0x20,0xAA,0xD9,0x24,0xF1,0x10,0x06,0xA9,0x80,0x05,
0xD4,0x85,0xD4,0x20,0x66,0xDA,0xA5,0xF0,0xF0,0x0A,0xA2,0x89,0xA0,0xDE,0x20,0x98,
0xDD,0x20,0x28,0xDB,0x18,0x60,0x40,0x03,0x16,0x22,0x77,0x66,0x3F,0x50,0x00,0x00,
0x00,0x00,0x3F,0x49,0x15,0x57,0x11,0x08,0xBF,0x51,0x70,0x49,0x47,0x08,0x3F,0x39,
0x20,0x57,0x61,0x95,0xBF,0x04,0x39,0x63,0x03,0x55,0x3F,0x10,0x09,0x30,0x12,0x64,
0x3F,0x09,0x39,0x08,0x04,0x60,0x3F,0x12,0x42,0x58,0x47,0x42,0x3F,0x17,0x37,0x12,
0x06,0x08,0x3F,0x28,0x95,0x29,0x71,0x17,0x3F,0x86,0x85,0x88,0x96,0x44,0x3E,0x16,
0x05,0x44,0x49,0x00,0xBE,0x95,0x68,0x38,0x45,0x00,0x3F,0x02,0x68,0x79,0x94,0x16,
0xBF,0x04,0x92,0x78,0x90,0x80,0x3F,0x07,0x03,0x15,0x20,0x00,0xBF,0x08,0x92,0x29,
0x12,0x44,0x3F,0x11,0x08,0x40,0x09,0x11,0xBF,0x14,0x28,0x31,0x56,0x04,0x3F,0x19,
0x99,0x98,0x77,0x44,0xBF,0x33,0x33,0x33,0x31,0x13,0x3F,0x99,0x99,0x99,0x99,0x99,
0x3F,0x78,0x53,0x98,0x16,0x34,0x98,0x16,0x34,0xFC,0xE0,0x32,0x50,0xD9,0x68,0x11,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x00,
0x00,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x66,0xFF,0x66,0x66,0xFF,0x66,0x00,
0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00,0x00,0x66,0x6C,0x18,0x30,0x66,0x46,0x00,
0x1C,0x36,0x1C,0x38,0x6F,0x66,0x3B,0x00,0x00,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x0E,0x1C,0x18,0x18,0x1C,0x0E,0x00,0x00,0x70,0x38,0x18,0x18,0x38,0x70,0x00,
0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x40,0x00,
0x00,0x3C,0x66,0x6E,0x76,0x66,0x3C,0x00,0x00,0x18,0x38,0x18,0x18,0x18,0x7E,0x00,
0x00,0x3C,0x66,0x0C,0x18,0x30,0x7E,0x00,0x00,0x7E,0x0C,0x18,0x0C,0x66,0x3C,0x00,
0x00,0x0C,0x1C,0x3C,0x6C,0x7E,0x0C,0x00,0x00,0x7E,0x60,0x7C,0x06,0x66,0x3C,0x00,
0x00,0x3C,0x60,0x7C,0x66,0x66,0x3C,0x00,0x00,0x7E,0x06,0x0C,0x18,0x30,0x30,0x00,
0x00,0x3C,0x66,0x3C,0x66,0x66,0x3C,0x00,0x00,0x3C,0x66,0x3E,0x06,0x0C,0x38,0x00,
0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x30,
0x06,0x0C,0x18,0x30,0x18,0x0C,0x06,0x00,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,
0x60,0x30,0x18,0x0C,0x18,0x30,0x60,0x00,0x00,0x3C,0x66,0x0C,0x18,0x00,0x18,0x00,
0x00,0x3C,0x66,0x6E,0x6E,0x60,0x3E,0x00,0x00,0x18,0x3C,0x66,0x66,0x7E,0x66,0x00,
0x00,0x7C,0x66,0x7C,0x66,0x66,0x7C,0x00,0x00,0x3C,0x66,0x60,0x60,0x66,0x3C,0x00,
0x00,0x78,0x6C,0x66,0x66,0x6C,0x78,0x00,0x00,0x7E,0x60,0x7C,0x60,0x60,0x7E,0x00,
0x00,0x7E,0x60,0x7C,0x60,0x60,0x60,0x00,0x00,0x3E,0x60,0x60,0x6E,0x66,0x3E,0x00,
0x00,0x66,0x66,0x7E,0x66,0x66,0x66,0x00,0x00,0x7E,0x18,0x18,0x18,0x18,0x7E,0x00,
0x00,0x06,0x06,0x06,0x06,0x66,0x3C,0x00,0x00,0x66,0x6C,0x78,0x78,0x6C,0x66,0x00,
0x00,0x60,0x60,0x60,0x60,0x60,0x7E,0x00,0x00,0x63,0x77,0x7F,0x6B,0x63,0x63,0x00,
0x00,0x66,0x76,0x7E,0x7E,0x6E,0x66,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x3C,0x00,
0x00,0x7C,0x66,0x66,0x7C,0x60,0x60,0x00,0x00,0x3C,0x66,0x66,0x66,0x6C,0x36,0x00,
0x00,0x7C,0x66,0x66,0x7C,0x6C,0x66,0x00,0x00,0x3C,0x60,0x3C,0x06,0x06,0x3C,0x00,
0x00,0x7E,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x7E,0x00,
0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00,
0x00,0x66,0x66,0x3C,0x3C,0x66,0x66,0x00,0x00,0x66,0x66,0x3C,0x18,0x18,0x18,0x00,
0x00,0x7E,0x0C,0x18,0x30,0x60,0x7E,0x00,0x00,0x1E,0x18,0x18,0x18,0x18,0x1E,0x00,
0x00,0x40,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x78,0x00,
0x00,0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,
0x00,0x36,0x7F,0x7F,0x3E,0x1C,0x08,0x00,0x18,0x18,0x18,0x1F,0x1F,0x18,0x18,0x18,
0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x18,0x18,0x18,0xF8,0xF8,0x00,0x00,0x00,
0x18,0x18,0x18,0xF8,0xF8,0x18,0x18,0x18,0x00,0x00,0x00,0xF8,0xF8,0x18,0x18,0x18,
0x03,0x07,0x0E,0x1C,0x38,0x70,0xE0,0xC0,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x07,0x03,
0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,0x00,0x00,0x00,0x00,0x0F,0x0F,0x0F,0x0F,
0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF,0x0F,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x00,
0xF0,0xF0,0xF0,0xF0,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,
0x00,0x1C,0x1C,0x77,0x77,0x08,0x1C,0x00,0x00,0x00,0x00,0x1F,0x1F,0x18,0x18,0x18,
0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x18,0x18,0x18,0xFF,0xFF,0x18,0x18,0x18,
0x00,0x00,0x3C,0x7E,0x7E,0x7E,0x3C,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0xFF,0xFF,0x18,0x18,0x18,
0x18,0x18,0x18,0xFF,0xFF,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,
0x18,0x18,0x18,0x1F,0x1F,0x00,0x00,0x00,0x78,0x60,0x78,0x60,0x7E,0x18,0x1E,0x00,
0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x00,0x00,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00,
0x00,0x18,0x30,0x7E,0x30,0x18,0x00,0x00,0x00,0x18,0x0C,0x7E,0x0C,0x18,0x00,0x00,
0x00,0x18,0x3C,0x7E,0x7E,0x3C,0x18,0x00,0x00,0x00,0x3C,0x06,0x3E,0x66,0x3E,0x00,
0x00,0x60,0x60,0x7C,0x66,0x66,0x7C,0x00,0x00,0x00,0x3C,0x60,0x60,0x60,0x3C,0x00,
0x00,0x06,0x06,0x3E,0x66,0x66,0x3E,0x00,0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00,
0x00,0x0E,0x18,0x3E,0x18,0x18,0x18,0x00,0x00,0x00,0x3E,0x66,0x66,0x3E,0x06,0x7C,
0x00,0x60,0x60,0x7C,0x66,0x66,0x66,0x00,0x00,0x18,0x00,0x38,0x18,0x18,0x3C,0x00,
0x00,0x06,0x00,0x06,0x06,0x06,0x06,0x3C,0x00,0x60,0x60,0x6C,0x78,0x6C,0x66,0x00,
0x00,0x38,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00,
0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00,
0x00,0x00,0x7C,0x66,0x66,0x7C,0x60,0x60,0x00,0x00,0x3E,0x66,0x66,0x3E,0x06,0x06,
0x00,0x00,0x7C,0x66,0x60,0x60,0x60,0x00,0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00,
0x00,0x18,0x7E,0x18,0x18,0x18,0x0E,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x3E,0x00,
0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0x00,0x63,0x6B,0x7F,0x3E,0x36,0x00,
0x00,0x00,0x66,0x3C,0x18,0x3C,0x66,0x00,0x00,0x00,0x66,0x66,0x66,0x3E,0x0C,0x78,
0x00,0x00,0x7E,0x0C,0x18,0x30,0x7E,0x00,0x00,0x18,0x3C,0x7E,0x7E,0x18,0x3C,0x00,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x7E,0x78,0x7C,0x6E,0x66,0x06,0x00,
0x08,0x18,0x38,0x78,0x38,0x18,0x08,0x00,0x10,0x18,0x1C,0x1E,0x1C,0x18,0x10,0x00,
0xFB,0xF3,0x33,0xF6,0x3D,0xF6,0xA3,0xF6,0x33,0xF6,0x3C,0xF6,0x4C,0xE4,0xF3,0xF9,
0xF5,0xF3,0x33,0xF6,0x92,0xF5,0xB6,0xF5,0x33,0xF6,0xFB,0xFC,0x4C,0xE4,0xF3,0xF6,
0x33,0xF6,0x33,0xF6,0xE1,0xF6,0x3C,0xF6,0x33,0xF6,0x3C,0xF6,0x4C,0xE4,0xF3,0x00,
0x9E,0xEE,0xDB,0xEE,0x9D,0xEE,0xA6,0xEE,0x80,0xEE,0x9D,0xEE,0x4C,0x78,0xEE,0x00,
0x4B,0xEF,0x2A,0xF0,0xD5,0xEF,0x0F,0xF0,0x27,0xF0,0x4A,0xEF,0x4C,0x41,0xEF,0x00,
0x4C,0xEA,0xED,0x4C,0xF0,0xED,0x4C,0xC4,0xE4,0x4C,0x59,0xE9,0x4C,0x12,0xE9,0x4C,
0xD1,0xE7,0x4C,0x3E,0xE9,0x4C,0x44,0xE9,0x4C,0xF6,0xEB,0x4C,0xD5,0xE6,0x4C,0xA6,
0xE4,0x4C,0x23,0xF2,0x4C,0x1B,0xF1,0x4C,0x25,0xF1,0x4C,0xE9,0xEF,0x4C,0x5D,0xEF,
0xB3,0xE7,0xB2,0xE7,0xB2,0xE7,0xB2,0xE7,0xBE,0xFF,0x11,0xEB,0x90,0xEA,0xD1,0xEA,
0xB2,0xE7,0xB2,0xE7,0xB2,0xE7,0xF6,0xE6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xD1,0xE7,0x3E,0xE9,0xA2,0x00,0xA9,0xFF,0x9D,0x40,0x03,0xA9,0xC0,0x9D,
0x46,0x03,0xA9,0xE4,0x9D,0x47,0x03,0x8A,0x18,0x69,0x10,0xAA,0xC9,0x80,0x90,0xE8,
0x60,0xA0,0x85,0x60,0x85,0x2F,0x86,0x2E,0x8A,0x29,0x0F,0xD0,0x04,0xE0,0x80,0x90,
0x05,0xA0,0x86,0x4C,0x1B,0xE6,0xA0,0x00,0xBD,0x40,0x03,0x99,0x20,0x00,0xE8,0xC8,
0xC0,0x0C,0x90,0xF4,0xA0,0x84,0xA5,0x22,0xC9,0x03,0x90,0x25,0xA8,0xC0,0x0E,0x90,
0x02,0xA0,0x0E,0x84,0x17,0xB9,0xC6,0xE6,0xF0,0x0F,0xC9,0x02,0xF0,0x35,0xC9,0x08,
0xB0,0x4C,0xC9,0x04,0xF0,0x63,0x4C,0xC9,0xE5,0xA5,0x20,0xC9,0xFF,0xF0,0x05,0xA0,
0x81,0x4C,0x1B,0xE6,0x20,0x9E,0xE6,0xB0,0xF8,0x20,0x3D,0xE6,0xB0,0xF3,0x20,0x89,
0xE6,0xA9,0x0B,0x85,0x17,0x20,0x3D,0xE6,0xA5,0x2C,0x85,0x26,0xA5,0x2D,0x85,0x27,
0x4C,0x1D,0xE6,0xA0,0x01,0x84,0x23,0x20,0x3D,0xE6,0xB0,0x03,0x20,0x89,0xE6,0xA9,
0xFF,0x85,0x20,0xA9,0xE4,0x85,0x27,0xA9,0xC0,0x85,0x26,0x4C,0x1D,0xE6,0xA5,0x20,
0xC9,0xFF,0xD0,0x05,0x20,0x9E,0xE6,0xB0,0xB8,0x20,0x3D,0xE6,0x20,0x89,0xE6,0xA6,
0x2E,0xBD,0x40,0x03,0x85,0x20,0x4C,0x1D,0xE6,0xA5,0x22,0x25,0x2A,0xD0,0x05,0xA0,
0x83,0x4C,0x1B,0xE6,0x20,0x3D,0xE6,0xB0,0xF8,0xA5,0x28,0x05,0x29,0xD0,0x08,0x20,
0x89,0xE6,0x85,0x2F,0x4C,0x1D,0xE6,0x20,0x89,0xE6,0x85,0x2F,0x30,0x35,0xA0,0x00,
0x91,0x24,0x20,0x70,0xE6,0xA5,0x22,0x29,0x02,0xD0,0x0C,0xA5,0x2F,0xC9,0x9B,0xD0,
0x06,0x20,0x63,0xE6,0x4C,0xC3,0xE5,0x20,0x63,0xE6,0xD0,0xDB,0xA5,0x22,0x29,0x02,
0xD0,0x11,0x20,0x89,0xE6,0x85,0x2F,0x30,0x0A,0xA5,0x2F,0xC9,0x9B,0xD0,0xF3,0xA9,
0x89,0x85,0x23,0x20,0x77,0xE6,0x4C,0x1D,0xE6,0xA5,0x22,0x25,0x2A,0xD0,0x05,0xA0,
0x87,0x4C,0x1B,0xE6,0x20,0x3D,0xE6,0xB0,0xF8,0xA5,0x28,0x05,0x29,0xD0,0x06,0xA5,
0x2F,0xE6,0x28,0xD0,0x06,0xA0,0x00,0xB1,0x24,0x85,0x2F,0x20,0x89,0xE6,0x30,0x25,
0x20,0x70,0xE6,0xA5,0x22,0x29,0x02,0xD0,0x0C,0xA5,0x2F,0xC9,0x9B,0xD0,0x06,0x20,
0x63,0xE6,0x4C,0x15,0xE6,0x20,0x63,0xE6,0xD0,0xDB,0xA5,0x22,0x29,0x02,0xD0,0x05,
0xA9,0x9B,0x20,0x89,0xE6,0x20,0x77,0xE6,0x4C,0x1D,0xE6,0x84,0x23,0xA4,0x2E,0xB9,
0x44,0x03,0x85,0x24,0xB9,0x45,0x03,0x85,0x25,0xA2,0x00,0xB5,0x20,0x99,0x40,0x03,
0xE8,0xC8,0xE0,0x0C,0x90,0xF5,0xA5,0x2F,0xA6,0x2E,0xA4,0x23,0x60,0xA4,0x20,0xC0,
0x22,0x90,0x04,0xA0,0x85,0xB0,0x1B,0xB9,0x1B,0x03,0x85,0x2C,0xB9,0x1C,0x03,0x85,
0x2D,0xA4,0x17,0xB9,0xC6,0xE6,0xA8,0xB1,0x2C,0xAA,0xC8,0xB1,0x2C,0x85,0x2D,0x86,
0x2C,0x18,0x60,0xC6,0x28,0xA5,0x28,0xC9,0xFF,0xD0,0x02,0xC6,0x29,0x05,0x29,0x60,
0xE6,0x24,0xD0,0x02,0xE6,0x25,0x60,0xA6,0x2E,0x38,0xBD,0x48,0x03,0xE5,0x28,0x85,
0x28,0xBD,0x49,0x03,0xE5,0x29,0x85,0x29,0x60,0xA0,0x92,0x20,0x93,0xE6,0x84,0x23,
0xC0,0x00,0x60,0xAA,0xA5,0x2D,0x48,0xA5,0x2C,0x48,0x8A,0xA6,0x2E,0x60,0xA0,0x00,
0xB1,0x24,0xF0,0x0C,0xA0,0x21,0xD9,0x1A,0x03,0xF0,0x0A,0x88,0x88,0x88,0x10,0xF6,
0xA0,0x82,0x38,0xB0,0x13,0x98,0x85,0x20,0x38,0xA0,0x01,0xB1,0x24,0xE9,0x30,0xC9,
0x0A,0x90,0x02,0xA9,0x01,0x85,0x21,0x18,0x60,0x00,0x04,0x04,0x04,0x04,0x06,0x06,
0x06,0x06,0x02,0x08,0x0A,0xA9,0x40,0x8D,0x0E,0xD4,0xA9,0x38,0x8D,0x02,0xD3,0x8D,
0x03,0xD3,0xA9,0x00,0x8D,0x00,0xD3,0x8D,0x01,0xD3,0xA9,0x3C,0x8D,0x02,0xD3,0x8D,
0x03,0xD3,0x60,0x6C,0x16,0x02,0x48,0xA9,0x10,0x2C,0x0E,0xD2,0xD0,0x0D,0xA9,0xEF,
0x8D,0x0E,0xD2,0xA5,0x10,0x8D,0x0E,0xD2,0x6C,0x0C,0x02,0xA9,0x20,0x2C,0x0E,0xD2,
0xD0,0x0D,0xA9,0xDF,0x8D,0x0E,0xD2,0xA5,0x10,0x8D,0x0E,0xD2,0x6C,0x0A,0x02,0xA9,
0x08,0x24,0x10,0xF0,0x12,0x2C,0x0E,0xD2,0xD0,0x0D,0xA9,0xF7,0x8D,0x0E,0xD2,0xA5,
0x10,0x8D,0x0E,0xD2,0x6C,0x0E,0x02,0xAD,0x0E,0xD2,0x6A,0xB0,0x0D,0xA9,0xFE,0x8D,
0x0E,0xD2,0xA5,0x10,0x8D,0x0E,0xD2,0x6C,0x10,0x02,0x6A,0xB0,0x0D,0xA9,0xFD,0x8D,
0x0E,0xD2,0xA5,0x10,0x8D,0x0E,0xD2,0x6C,0x12,0x02,0x6A,0xB0,0x0A,0xA9,0xFB,0x8D,
0x0E,0xD2,0xA5,0x10,0x8D,0x0E,0xD2,0x2C,0x0E,0xD2,0x70,0x0D,0xA9,0xBF,0x8D,0x0E,
0xD2,0xA5,0x10,0x8D,0x0E,0xD2,0x6C,0x08,0x02,0x30,0x18,0xA9,0x7F,0x8D,0x0E,0xD2,
0xA5,0x10,0x8D,0x0E,0xD2,0xA9,0x00,0x85,0x11,0x8D,0xFF,0x02,0x8D,0xF0,0x02,0x85,
0x4D,0x68,0x40,0x2C,0x02,0xD3,0x10,0x06,0xAD,0x00,0xD3,0x6C,0x02,0x02,0x2C,0x03,
0xD3,0x10,0x06,0xAD,0x01,0xD3,0x6C,0x04,0x02,0x08,0x68,0x29,0x10,0xF0,0x03,0x6C,
0x06,0x02,0x68,0x40,0x2C,0x0F,0xD4,0x10,0x03,0x6C,0x00,0x02,0x48,0xAD,0x0F,0xD4,
0x29,0x20,0xF0,0x03,0x4C,0x74,0xE4,0x8A,0x48,0x98,0x48,0x8D,0x0F,0xD4,0x6C,0x22,
0x02,0xE6,0x14,0xD0,0x08,0xE6,0x4D,0xE6,0x13,0xD0,0x02,0xE6,0x12,0xA9,0xFE,0xA2,
0x00,0xA4,0x4D,0x10,0x06,0x85,0x4D,0xA6,0x13,0xA9,0xF6,0x85,0x4E,0x86,0x4F,0xA2,
0x00,0x20,0xF5,0xE8,0xD0,0x03,0x20,0xEF,0xE8,0xA5,0x42,0xD0,0x08,0xBA,0xBD,0x04,
0x01,0x29,0x04,0xF0,0x03,0x4C,0x3E,0xE9,0x58,0xAD,0x0D,0xD4,0x8D,0x35,0x02,0xAD,
0x0C,0xD4,0x8D,0x34,0x02,0xAD,0x31,0x02,0x8D,0x03,0xD4,0xAD,0x30,0x02,0x8D,0x02,
0xD4,0xAD,0x2F,0x02,0x8D,0x00,0xD4,0xAD,0x6F,0x02,0x8D,0x1B,0xD0,0xA9,0x08,0x8D,
0x1F,0xD0,0xA2,0x08,0xBD,0xC0,0x02,0x45,0x4F,0x25,0x4E,0x9D,0x12,0xD0,0xCA,0x10,
0xF3,0xAD,0xF4,0x02,0x8D,0x09,0xD4,0xAD,0xF3,0x02,0x8D,0x01,0xD4,0xA2,0x02,0x20,
0xF5,0xE8,0xD0,0x03,0x20,0xF2,0xE8,0xA2,0x02,0xE8,0xE8,0xBD,0x18,0x02,0x1D,0x19,
0x02,0xF0,0x06,0x20,0xF5,0xE8,0x9D,0x26,0x02,0xE0,0x08,0xD0,0xEC,0xAD,0x0F,0xD2,
0x29,0x04,0xF0,0x08,0xAD,0xF1,0x02,0xF0,0x03,0xCE,0xF1,0x02,0xAD,0x2B,0x02,0xF0,
0x17,0xAD,0x0F,0xD2,0x29,0x04,0xD0,0x60,0xCE,0x2B,0x02,0xD0,0x0B,0xA9,0x06,0x8D,
0x2B,0x02,0xAD,0x09,0xD2,0x8D,0xFC,0x02,0xA0,0x01,0xA2,0x03,0xB9,0x00,0xD3,0x4A,
0x4A,0x4A,0x4A,0x9D,0x78,0x02,0xCA,0xB9,0x00,0xD3,0x29,0x0F,0x9D,0x78,0x02,0xCA,
0x88,0x10,0xE9,0xA2,0x03,0xBD,0x10,0xD0,0x9D,0x84,0x02,0xBD,0x00,0xD2,0x9D,0x70,
0x02,0xBD,0x04,0xD2,0x9D,0x74,0x02,0xCA,0x10,0xEB,0x8D,0x0B,0xD2,0xA2,0x06,0xA0,
0x03,0xB9,0x78,0x02,0x4A,0x4A,0x4A,0x9D,0x7D,0x02,0xA9,0x00,0x2A,0x9D,0x7C,0x02,
0xCA,0xCA,0x88,0x10,0xEC,0x6C,0x24,0x02,0xA9,0x00,0x8D,0x2B,0x02,0xF0,0xA9,0x6C,
0x26,0x02,0x6C,0x28,0x02,0xBC,0x18,0x02,0xD0,0x08,0xBC,0x19,0x02,0xF0,0x10,0xDE,
0x19,0x02,0xDE,0x18,0x02,0xD0,0x08,0xBC,0x19,0x02,0xD0,0x03,0xA9,0x00,0x60,0xA9,
0xFF,0x60,0x0A,0x8D,0x2D,0x02,0xA9,0x00,0x8D,0x0E,0xD4,0x8A,0xAE,0x2D,0x02,0x9D,
0x17,0x02,0x98,0x9D,0x16,0x02,0xA9,0x40,0x8D,0x0E,0xD4,0x2C,0x0F,0xD4,0x50,0x0D,
0xA9,0xE9,0x48,0xA9,0x3D,0x48,0x08,0x48,0x48,0x48,0x6C,0x22,0x02,0x60,0x68,0xA8,
0x68,0xAA,0x68,0x40,0xA9,0x3C,0x8D,0x02,0xD3,0xA9,0x3C,0x8D,0x03,0xD3,0xA9,0x03,
0x8D,0x32,0x02,0x85,0x41,0x8D,0x0F,0xD2,0x60,0xBA,0x8E,0x18,0x03,0xA9,0x01,0x85,
0x42,0xAD,0x00,0x03,0xC9,0x60,0xD0,0x03,0x4C,0x84,0xEB,0xA9,0x00,0x8D,0x0F,0x03,
0xA9,0x01,0x85,0x37,0xA9,0x0D,0x85,0x36,0xA9,0x28,0x8D,0x04,0xD2,0xA9,0x00,0x8D,
0x06,0xD2,0x18,0xAD,0x00,0x03,0x6D,0x01,0x03,0x69,0xFF,0x8D,0x3A,0x02,0xAD,0x02,
0x03,0x8D,0x3B,0x02,0xAD,0x0A,0x03,0x8D,0x3C,0x02,0xAD,0x0B,0x03,0x8D,0x3D,0x02,
0x18,0xA9,0x3A,0x85,0x32,0x69,0x04,0x85,0x34,0xA9,0x02,0x85,0x33,0x85,0x35,0xA9,
0x34,0x8D,0x03,0xD3,0x20,0x8E,0xEC,0xAD,0x3F,0x02,0xD0,0x03,0x98,0xD0,0x07,0xC6,
0x36,0x10,0xB5,0x4C,0x06,0xEA,0xAD,0x03,0x03,0x10,0x0C,0xA9,0x0D,0x85,0x36,0x20,
0x6E,0xEB,0x20,0x8E,0xEC,0xF0,0xE8,0x20,0x79,0xEC,0xA9,0x00,0x8D,0x3F,0x02,0x20,
0x9F,0xEC,0xF0,0x12,0x2C,0x03,0x03,0x70,0x07,0xAD,0x3F,0x02,0xD0,0x18,0xF0,0x1D,
0x20,0x6E,0xEB,0x20,0xE2,0xEA,0xAD,0x3F,0x02,0xF0,0x05,0xAD,0x19,0x03,0x85,0x30,
0xA5,0x30,0xC9,0x01,0xF0,0x07,0xC6,0x37,0x30,0x03,0x4C,0x74,0xE9,0x20,0x63,0xEC,
0xA9,0x00,0x85,0x42,0xA4,0x30,0x8C,0x03,0x03,0x60,0xA9,0x00,0x8D,0x3F,0x02,0x18,
0xA9,0x3E,0x85,0x32,0x69,0x01,0x85,0x34,0xA9,0x02,0x85,0x33,0x85,0x35,0xA9,0xFF,
0x85,0x3C,0x20,0xE2,0xEA,0xA0,0xFF,0xA5,0x30,0xC9,0x01,0xD0,0x19,0xAD,0x3E,0x02,
0xC9,0x41,0xF0,0x21,0xC9,0x43,0xF0,0x1D,0xC9,0x45,0xD0,0x06,0xA9,0x90,0x85,0x30,
0xD0,0x04,0xA9,0x8B,0x85,0x30,0xA5,0x30,0xC9,0x8A,0xF0,0x07,0xA9,0xFF,0x8D,0x3F,
0x02,0xD0,0x02,0xA0,0x00,0xA5,0x30,0x8D,0x19,0x03,0x60,0xA9,0x01,0x85,0x30,0x20,
0xF6,0xEB,0xA0,0x00,0x84,0x31,0x84,0x3B,0x84,0x3A,0xB1,0x32,0x8D,0x0D,0xD2,0x85,
0x31,0xA5,0x11,0xD0,0x03,0x4C,0xA4,0xED,0xA5,0x3A,0xF0,0xF5,0x20,0x63,0xEC,0x60,
0x98,0x48,0xE6,0x32,0xD0,0x02,0xE6,0x33,0xA5,0x33,0xC5,0x35,0x90,0x22,0xA5,0x32,
0xC5,0x34,0x90,0x1C,0xA5,0x3B,0xD0,0x0B,0xA5,0x31,0x8D,0x0D,0xD2,0xA9,0xFF,0x85,
0x3B,0xD0,0x09,0xA5,0x10,0x09,0x08,0x85,0x10,0x8D,0x0E,0xD2,0x68,0xA8,0x68,0x40,
0xA0,0x00,0xB1,0x32,0x8D,0x0D,0xD2,0x18,0x65,0x31,0x69,0x00,0x85,0x31,0x4C,0xBC,
0xEA,0xA5,0x3B,0xF0,0x0B,0x85,0x3A,0xA5,0x10,0x29,0xF7,0x85,0x10,0x8D,0x0E,0xD2,
0x68,0x40,0xA9,0x00,0xAC,0x0F,0x03,0xD0,0x02,0x85,0x31,0x85,0x38,0x85,0x39,0xA9,
0x01,0x85,0x30,0x20,0x1F,0xEC,0xA9,0x3C,0x8D,0x03,0xD3,0xA5,0x11,0xD0,0x03,0x4C,
0xA4,0xED,0xAD,0x17,0x03,0xF0,0x05,0xA5,0x39,0xF0,0xF0,0x60,0xA9,0x8A,0x85,0x30,
0x60,0x98,0x48,0xAD,0x0F,0xD2,0x8D,0x0A,0xD2,0x30,0x04,0xA0,0x8C,0x84,0x30,0x29,
0x20,0xD0,0x04,0xA0,0x8E,0x84,0x30,0xA5,0x38,0xF0,0x13,0xAD,0x0D,0xD2,0xC5,0x31,
0xF0,0x04,0xA0,0x8F,0x84,0x30,0xA9,0xFF,0x85,0x39,0x68,0xA8,0x68,0x40,0xAD,0x0D,
0xD2,0xA0,0x00,0x91,0x32,0x18,0x65,0x31,0x69,0x00,0x85,0x31,0xE6,0x32,0xD0,0x02,
0xE6,0x33,0xA5,0x33,0xC5,0x35,0x90,0xE2,0xA5,0x32,0xC5,0x34,0x90,0xDC,0xA5,0x3C,
0xF0,0x06,0xA9,0x00,0x85,0x3C,0xF0,0xCE,0xA9,0xFF,0x85,0x38,0xD0,0xCC,0x18,0xAD,
0x04,0x03,0x85,0x32,0x6D,0x08,0x03,0x85,0x34,0xAD,0x05,0x03,0x85,0x33,0x6D,0x09,
0x03,0x85,0x35,0x60,0xAD,0x03,0x03,0x10,0x2E,0xA9,0xCC,0x8D,0x04,0xD2,0xA9,0x05,
0x8D,0x06,0xD2,0x20,0xF6,0xEB,0xA0,0x0D,0xAD,0x0B,0x03,0x30,0x02,0xA0,0x96,0xA2,
0x00,0x20,0xBD,0xED,0xA9,0x34,0x8D,0x02,0xD3,0xAD,0x17,0x03,0xD0,0xFB,0x20,0x6E,
0xEB,0x20,0x6B,0xEA,0x4C,0xE3,0xEB,0xA9,0xFF,0x8D,0x0F,0x03,0xA0,0x08,0xAD,0x0B,
0x03,0x30,0x02,0xA0,0x64,0xA2,0x00,0x20,0xBD,0xED,0xA9,0x34,0x8D,0x02,0xD3,0xAD,
0x17,0x03,0xD0,0xFB,0x20,0x6E,0xEB,0x20,0x79,0xEC,0x20,0xBD,0xED,0x20,0x14,0xED,
0x20,0xE2,0xEA,0xAD,0x0B,0x03,0x30,0x05,0xA9,0x3C,0x8D,0x02,0xD3,0x4C,0x0D,0xEA,
0xA9,0x00,0x8D,0x17,0x03,0x60,0xA9,0x07,0x2D,0x32,0x02,0x09,0x20,0xAC,0x00,0x03,
0xC0,0x60,0xD0,0x0C,0x09,0x08,0xA0,0x07,0x8C,0x02,0xD2,0xA0,0x05,0x8C,0x00,0xD2,
0x8D,0x32,0x02,0x8D,0x0F,0xD2,0xA9,0xC7,0x25,0x10,0x09,0x10,0x4C,0x35,0xEC,0xA9,
0x07,0x2D,0x32,0x02,0x09,0x10,0x8D,0x32,0x02,0x8D,0x0F,0xD2,0x8D,0x0A,0xD2,0xA9,
0xC7,0x25,0x10,0x09,0x20,0x85,0x10,0x8D,0x0E,0xD2,0xA9,0x28,0x8D,0x08,0xD2,0xA2,
0x06,0xA9,0xA8,0xA4,0x41,0xD0,0x02,0xA9,0xA0,0x9D,0x01,0xD2,0xCA,0xCA,0x10,0xF9,
0xA9,0xA0,0x8D,0x05,0xD2,0xAC,0x00,0x03,0xC0,0x60,0xF0,0x06,0x8D,0x01,0xD2,0x8D,
0x03,0xD2,0x60,0xEA,0xA9,0xC7,0x25,0x10,0x85,0x10,0x8D,0x0E,0xD2,0xA2,0x06,0xA9,
0x00,0x9D,0x01,0xD2,0xCA,0xCA,0x10,0xF9,0x60,0xAD,0x06,0x03,0x6A,0x6A,0xA8,0x29,
0x3F,0xAA,0x98,0x6A,0x29,0xC0,0xA8,0x60,0x11,0xEB,0x90,0xEA,0xD1,0xEA,0xA2,0x01,
0xA0,0xFF,0x88,0xD0,0xFD,0xCA,0xD0,0xF8,0x20,0x6B,0xEA,0xA0,0x02,0xA2,0x00,0x20,
0xBD,0xED,0x20,0x1A,0xEA,0x98,0x60,0x8D,0x10,0x03,0x8C,0x11,0x03,0x20,0x08,0xED,
0x8D,0x10,0x03,0xAD,0x0C,0x03,0x20,0x08,0xED,0x8D,0x0C,0x03,0xAD,0x10,0x03,0x38,
0xED,0x0C,0x03,0x8D,0x12,0x03,0xAD,0x11,0x03,0x38,0xED,0x0D,0x03,0xA8,0xA9,0x64,
0x18,0x69,0x9C,0x88,0x10,0xFA,0x18,0x6D,0x12,0x03,0xA8,0x4A,0x4A,0x4A,0x0A,0x38,
0xE9,0x16,0xAA,0x98,0x29,0x07,0xA8,0xA9,0xF5,0x18,0x69,0x0B,0x88,0x10,0xFA,0xA0,
0x00,0x8C,0x0E,0x03,0x38,0xE9,0x07,0x10,0x03,0xCE,0x0E,0x03,0x18,0x7D,0xD2,0xED,
0xA8,0xAD,0x0E,0x03,0x7D,0xD3,0xED,0x60,0xC9,0x7C,0x30,0x04,0x38,0xE9,0x7C,0x60,
0x18,0x69,0x20,0x60,0xA5,0x11,0xD0,0x03,0x4C,0xA4,0xED,0x78,0xAD,0x17,0x03,0xD0,
0x02,0xF0,0x25,0xAD,0x0F,0xD2,0x29,0x10,0xD0,0xEA,0x8D,0x16,0x03,0xAE,0x0B,0xD4,
0xA4,0x14,0x8E,0x0C,0x03,0x8C,0x0D,0x03,0xA2,0x01,0x8E,0x15,0x03,0xA0,0x0A,0xA5,
0x11,0xF0,0x61,0xAD,0x17,0x03,0xD0,0x04,0x58,0x4C,0x0C,0xEB,0xAD,0x0F,0xD2,0x29,
0x10,0xCD,0x16,0x03,0xF0,0xE9,0x8D,0x16,0x03,0x88,0xD0,0xE3,0xCE,0x15,0x03,0x30,
0x12,0xAD,0x0B,0xD4,0xA4,0x14,0x20,0xA7,0xEC,0x8C,0xEE,0x02,0x8D,0xEF,0x02,0xA0,
0x09,0xD0,0xCC,0xAD,0xEE,0x02,0x8D,0x04,0xD2,0xAD,0xEF,0x02,0x8D,0x06,0xD2,0xA9,
0x00,0x8D,0x0F,0xD2,0xAD,0x32,0x02,0x8D,0x0F,0xD2,0xA9,0x55,0x91,0x32,0xC8,0x91,
0x32,0xA9,0xAA,0x85,0x31,0x18,0xA5,0x32,0x69,0x02,0x85,0x32,0xA5,0x33,0x69,0x00,
0x85,0x33,0x58,0x60,0x20,0x63,0xEC,0xA9,0x3C,0x8D,0x02,0xD3,0x8D,0x03,0xD3,0xA9,
0x80,0x85,0x30,0xAE,0x18,0x03,0x9A,0xC6,0x11,0x58,0x4C,0x0D,0xEA,0xA9,0xF0,0x8D,
0x26,0x02,0xA9,0xEB,0x8D,0x27,0x02,0xA9,0x01,0x8D,0x17,0x03,0x78,0x20,0x5C,0xE4,
0x58,0x60,0xE8,0x03,0x43,0x04,0x9E,0x04,0xF9,0x04,0x54,0x05,0xAF,0x05,0x0A,0x06,
0x65,0x06,0xC0,0x06,0x1A,0x07,0x75,0x07,0xD0,0x07,0xA9,0xA0,0x8D,0x46,0x02,0x60,
0xA9,0x31,0x8D,0x00,0x03,0xAD,0x46,0x02,0xAE,0x02,0x03,0xE0,0x21,0xF0,0x02,0xA9,
0x07,0x8D,0x06,0x03,0xA2,0x40,0xA0,0x80,0xAD,0x02,0x03,0xC9,0x57,0xD0,0x02,0xA2,
0x80,0xC9,0x53,0xD0,0x0C,0xA9,0xEA,0x8D,0x04,0x03,0xA9,0x02,0x8D,0x05,0x03,0xA0,
0x04,0x8E,0x03,0x03,0x8C,0x08,0x03,0xA9,0x00,0x8D,0x09,0x03,0x20,0x59,0xE4,0x10,
0x01,0x60,0xAD,0x02,0x03,0xC9,0x53,0xD0,0x0A,0x20,0x6D,0xEE,0xA0,0x02,0xB1,0x15,
0x8D,0x46,0x02,0xAD,0x02,0x03,0xC9,0x21,0xD0,0x1F,0x20,0x6D,0xEE,0xA0,0xFE,0xC8,
0xC8,0xB1,0x15,0xC9,0xFF,0xD0,0xF8,0xC8,0xB1,0x15,0xC8,0xC9,0xFF,0xD0,0xF2,0x88,
0x88,0x8C,0x08,0x03,0xA9,0x00,0x8D,0x09,0x03,0xAC,0x03,0x03,0x60,0xAD,0x04,0x03,
0x85,0x15,0xAD,0x05,0x03,0x85,0x16,0x60,0xA9,0x1E,0x85,0x1C,0x60,0xEA,0x02,0xC0,
0x03,0xA9,0x04,0x85,0x1E,0xAE,0x7D,0xEE,0xAC,0x7E,0xEE,0xA9,0x53,0x8D,0x02,0x03,
0x8D,0x0A,0x03,0x20,0xE6,0xEE,0x20,0x59,0xE4,0x30,0x03,0x20,0x14,0xEF,0x60,0x20,
0x81,0xEE,0xA9,0x00,0x85,0x1D,0x60,0x85,0x1F,0x20,0x1A,0xEF,0xA6,0x1D,0xA5,0x1F,
0x9D,0xC0,0x03,0xE8,0xE4,0x1E,0xF0,0x13,0x86,0x1D,0xC9,0x9B,0xF0,0x03,0xA0,0x01,
0x60,0xA9,0x20,0x9D,0xC0,0x03,0xE8,0xE4,0x1E,0xD0,0xF8,0xA9,0x00,0x85,0x1D,0xAE,
0x7F,0xEE,0xAC,0x80,0xEE,0x20,0xE6,0xEE,0x20,0x59,0xE4,0x60,0x20,0x1A,0xEF,0xA6,
0x1D,0xD0,0xDE,0xA0,0x01,0x60,0x8E,0x04,0x03,0x8C,0x05,0x03,0xA9,0x40,0x8D,0x00,
0x03,0xA9,0x01,0x8D,0x01,0x03,0xA9,0x80,0xAE,0x02,0x03,0xE0,0x53,0xD0,0x02,0xA9,
0x40,0x8D,0x03,0x03,0xA5,0x1E,0x8D,0x08,0x03,0xA9,0x00,0x8D,0x09,0x03,0xA5,0x1C,
0x8D,0x06,0x03,0x60,0xAD,0xEC,0x02,0x85,0x1C,0x60,0xA0,0x57,0xA5,0x2B,0xC9,0x4E,
0xD0,0x04,0xA2,0x28,0xD0,0x0E,0xC9,0x44,0xD0,0x04,0xA2,0x14,0xD0,0x06,0xC9,0x53,
0xD0,0x0B,0xA2,0x1D,0x86,0x1E,0x8C,0x02,0x03,0x8D,0x0A,0x03,0x60,0xA9,0x4E,0xD0,
0xDD,0xA9,0xCC,0x8D,0xEE,0x02,0xA9,0x05,0x8D,0xEF,0x02,0x60,0xA5,0x2B,0x85,0x3E,
0xA5,0x2A,0x29,0x0C,0xC9,0x04,0xF0,0x05,0xC9,0x08,0xF0,0x39,0x60,0xA9,0x00,0x8D,
0x89,0x02,0x85,0x3F,0xA9,0x01,0x20,0x58,0xF0,0x30,0x24,0xA9,0x34,0x8D,0x02,0xD3,
0xA0,0xE0,0xA2,0x01,0xA9,0x03,0x8D,0x2A,0x02,0x20,0x5C,0xE4,0xAD,0x2A,0x02,0xD0,
0xFB,0xA9,0x80,0x85,0x3D,0x8D,0x8A,0x02,0x4C,0xD3,0xEF,0xA0,0x80,0xC6,0x11,0xA9,
0x00,0x8D,0x89,0x02,0x60,0xA9,0x80,0x8D,0x89,0x02,0xA9,0x02,0x20,0x58,0xF0,0x30,
0xEE,0xA9,0xCC,0x8D,0x04,0xD2,0xA9,0x05,0x8D,0x06,0xD2,0xA9,0x60,0x8D,0x00,0x03,
0x20,0x68,0xE4,0xA9,0x34,0x8D,0x02,0xD3,0xA9,0x03,0xA2,0x03,0xA0,0xC0,0x20,0x5C,
0xE4,0xA9,0xFF,0x8D,0x2A,0x02,0xA5,0x11,0xF0,0xC1,0xAD,0x2A,0x02,0xD0,0xF7,0xA9,
0x00,0x85,0x3D,0xA0,0x01,0x60,0xA5,0x3F,0x30,0x33,0xA6,0x3D,0xEC,0x8A,0x02,0xF0,
0x08,0xBD,0x00,0x04,0xE6,0x3D,0xA0,0x01,0x60,0xA9,0x52,0x20,0x95,0xF0,0x98,0x30,
0xF7,0xA9,0x00,0x85,0x3D,0xA2,0x80,0xAD,0xFF,0x03,0xC9,0xFE,0xF0,0x0D,0xC9,0xFA,
0xD0,0x03,0xAE,0x7F,0x04,0x8E,0x8A,0x02,0x4C,0xD6,0xEF,0xC6,0x3F,0xA0,0x88,0x60,
0xA6,0x3D,0x9D,0x00,0x04,0xE6,0x3D,0xA0,0x01,0xE0,0x7F,0xF0,0x01,0x60,0xA9,0xFC,
0x20,0xD2,0xF0,0xA9,0x00,0x85,0x3D,0x60,0xA0,0x01,0x60,0xAD,0x89,0x02,0x30,0x08,
0xA0,0x01,0xA9,0x3C,0x8D,0x02,0xD3,0x60,0xA6,0x3D,0xF0,0x0A,0x8E,0x7F,0x04,0xA9,
0xFA,0x20,0xD2,0xF0,0x30,0xEC,0xA2,0x7F,0xA9,0x00,0x9D,0x00,0x04,0xCA,0x10,0xFA,
0xA9,0xFE,0x20,0xD2,0xF0,0x4C,0x32,0xF0,0x85,0x40,0xA5,0x14,0x18,0x69,0x19,0xAA,
0xA9,0xFF,0x8D,0x1F,0xD0,0xA9,0x00,0xA0,0xF0,0x88,0xD0,0xFD,0x8D,0x1F,0xD0,0xA0,
0xF0,0x88,0xD0,0xFD,0xE4,0x14,0xD0,0xE8,0xC6,0x40,0xF0,0x0B,0x8A,0x18,0x69,0x08,
0xAA,0xE4,0x14,0xD0,0xFC,0xF0,0xD3,0x20,0x8C,0xF0,0x98,0x60,0xAD,0x25,0xE4,0x48,
0xAD,0x24,0xE4,0x48,0x60,0x8D,0x02,0x03,0xA9,0x00,0x8D,0x09,0x03,0xA9,0x83,0x8D,
0x08,0x03,0xA9,0x03,0x8D,0x05,0x03,0xA9,0xFD,0x8D,0x04,0x03,0xA9,0x60,0x8D,0x00,
0x03,0xA9,0x00,0x8D,0x01,0x03,0xA9,0x23,0x8D,0x06,0x03,0xAD,0x02,0x03,0xA0,0x40,
0xC9,0x52,0xF0,0x02,0xA0,0x80,0x8C,0x03,0x03,0xA5,0x3E,0x8D,0x0B,0x03,0x20,0x59,
0xE4,0x60,0x8D,0xFF,0x03,0xA9,0x55,0x8D,0xFD,0x03,0x8D,0xFE,0x03,0xA9,0x57,0x20,
0x95,0xF0,0x60,0x50,0x30,0xE4,0x43,0x40,0xE4,0x45,0x00,0xE4,0x53,0x10,0xE4,0x4B,
0x20,0xE4,0x7D,0x41,0x54,0x41,0x52,0x49,0x20,0x43,0x4F,0x4D,0x50,0x55,0x54,0x45,
0x52,0x20,0x2D,0x20,0x4D,0x45,0x4D,0x4F,0x20,0x50,0x41,0x44,0x9B,0x42,0x4F,0x4F,
0x54,0x20,0x45,0x52,0x52,0x4F,0x52,0x9B,0x45,0x3A,0x9B,0x78,0xAD,0x44,0x02,0xD0,
0x04,0xA9,0xFF,0xD0,0x03,0x78,0xA9,0x00,0x85,0x08,0xD8,0xA2,0xFF,0x9A,0x20,0x3F,
0xF2,0x20,0x81,0xF2,0xA5,0x08,0xD0,0x28,0xA9,0x00,0xA0,0x08,0x85,0x04,0x85,0x05,
0x91,0x04,0xC8,0xC0,0x00,0xD0,0xF9,0xE6,0x05,0xA6,0x05,0xE4,0x06,0xD0,0xF1,0xAD,
0x72,0xE4,0x85,0x0A,0xAD,0x73,0xE4,0x85,0x0B,0xA9,0xFF,0x8D,0x44,0x02,0xD0,0x13,
0xA2,0x00,0x8A,0x9D,0x00,0x02,0x9D,0x00,0x03,0xCA,0xD0,0xF7,0xA2,0x10,0x95,0x00,
0xE8,0x10,0xFB,0xA9,0x02,0x85,0x52,0xA9,0x27,0x85,0x53,0xA2,0x25,0xBD,0x80,0xE4,
0x9D,0x00,0x02,0xCA,0x10,0xF7,0x20,0x94,0xF2,0x58,0xA2,0x0E,0xBD,0xE3,0xF0,0x9D,
0x1A,0x03,0xCA,0x10,0xF7,0xA2,0x00,0x86,0x07,0x86,0x06,0xAE,0xE4,0x02,0xE0,0x90,
0xB0,0x0A,0xAD,0xFC,0x9F,0xD0,0x05,0xE6,0x07,0x20,0x3C,0xF2,0xAE,0xE4,0x02,0xE0,
0xB0,0xB0,0x0A,0xAE,0xFC,0xBF,0xD0,0x05,0xE6,0x06,0x20,0x39,0xF2,0xA9,0x03,0xA2,
0x00,0x9D,0x42,0x03,0xA9,0x18,0x9D,0x44,0x03,0xA9,0xF1,0x9D,0x45,0x03,0xA9,0x0C,
0x9D,0x4A,0x03,0x20,0x56,0xE4,0x10,0x03,0x4C,0x25,0xF1,0xE8,0xD0,0xFD,0xC8,0x10,
0xFA,0x20,0xB2,0xF3,0xA5,0x06,0x05,0x07,0xF0,0x12,0xA5,0x06,0xF0,0x03,0xAD,0xFD,
0xBF,0xA6,0x07,0xF0,0x03,0x0D,0xFD,0x9F,0x29,0x01,0xF0,0x03,0x20,0xCF,0xF2,0xA9,
0x00,0x8D,0x44,0x02,0xA5,0x06,0xF0,0x0A,0xAD,0xFD,0xBF,0x29,0x04,0xF0,0x03,0x6C,
0xFA,0xBF,0xA5,0x07,0xF0,0x0A,0xAD,0xFD,0x9F,0x29,0x04,0xF0,0xDF,0x6C,0xFA,0x9F,
0x6C,0x0A,0x00,0xA2,0xF2,0xA0,0xF0,0x20,0x85,0xF3,0x20,0x30,0xF2,0x4C,0x2A,0xF2,
0xAD,0x05,0xE4,0x48,0xAD,0x04,0xE4,0x48,0x60,0x6C,0xFE,0xBF,0x6C,0xFE,0x9F,0xAD,
0xFC,0xBF,0xD0,0x12,0xEE,0xFC,0xBF,0xAD,0xFC,0xBF,0xD0,0x0A,0xAD,0xFD,0xBF,0x29,
0x80,0xF0,0x03,0x6C,0xFE,0xBF,0xCE,0xFC,0xBF,0xA9,0x00,0x85,0x05,0xA9,0x10,0x85,
0x06,0xA0,0x00,0xB1,0x05,0x85,0x07,0x49,0xFF,0x85,0x04,0x91,0x05,0xB1,0x05,0xC5,
0x04,0xD0,0x0D,0xA5,0x07,0x91,0x05,0xA5,0x06,0x18,0x69,0x10,0x85,0x06,0xD0,0xE3,
0x60,0xA9,0x00,0xAA,0x9D,0x00,0xD0,0x9D,0x00,0xD4,0x9D,0x00,0xD2,0x9D,0x00,0xD3,
0xE8,0xD0,0xF1,0x60,0xC6,0x11,0xA5,0x06,0x8D,0xE4,0x02,0x8D,0xE6,0x02,0xA9,0x00,
0x8D,0xE5,0x02,0xA9,0x00,0x8D,0xE7,0x02,0xA9,0x07,0x8D,0xE8,0x02,0x20,0x0C,0xE4,
0x20,0x1C,0xE4,0x20,0x2C,0xE4,0x20,0x3C,0xE4,0x20,0x4C,0xE4,0x20,0x6E,0xE4,0x20,
0x65,0xE4,0x20,0x6B,0xE4,0xAD,0x1F,0xD0,0x29,0x01,0xD0,0x02,0xE6,0x4A,0x60,0xA5,
0x08,0xF0,0x0A,0xA5,0x09,0x29,0x01,0xF0,0x03,0x20,0x7E,0xF3,0x60,0xA9,0x01,0x8D,
0x01,0x03,0xA9,0x53,0x8D,0x02,0x03,0x20,0x53,0xE4,0x10,0x01,0x60,0xA9,0x00,0x8D,
0x0B,0x03,0xA9,0x01,0x8D,0x0A,0x03,0xA9,0x00,0x8D,0x04,0x03,0xA9,0x04,0x8D,0x05,
0x03,0x20,0x9D,0xF3,0x10,0x08,0x20,0x81,0xF3,0xA5,0x4B,0xF0,0xE0,0x60,0xA2,0x03,
0xBD,0x00,0x04,0x9D,0x40,0x02,0xCA,0x10,0xF7,0xAD,0x42,0x02,0x85,0x04,0xAD,0x43,
0x02,0x85,0x05,0xAD,0x04,0x04,0x85,0x0C,0xAD,0x05,0x04,0x85,0x0D,0xA0,0x7F,0xB9,
0x00,0x04,0x91,0x04,0x88,0x10,0xF8,0x18,0xA5,0x04,0x69,0x80,0x85,0x04,0xA5,0x05,
0x69,0x00,0x85,0x05,0xCE,0x41,0x02,0xF0,0x11,0xEE,0x0A,0x03,0x20,0x9D,0xF3,0x10,
0xDC,0x20,0x81,0xF3,0xA5,0x4B,0xD0,0xAE,0xF0,0xF2,0xA5,0x4B,0xF0,0x03,0x20,0x9D,
0xF3,0x20,0x6C,0xF3,0xB0,0xA0,0x20,0x7E,0xF3,0xE6,0x09,0x60,0x18,0xAD,0x42,0x02,
0x69,0x06,0x85,0x04,0xAD,0x43,0x02,0x69,0x00,0x85,0x05,0x6C,0x04,0x00,0x6C,0x0C,
0x00,0xA2,0x0D,0xA0,0xF1,0x8A,0xA2,0x00,0x9D,0x44,0x03,0x98,0x9D,0x45,0x03,0xA9,
0x09,0x9D,0x42,0x03,0xA9,0xFF,0x9D,0x48,0x03,0x20,0x56,0xE4,0x60,0xA5,0x4B,0xF0,
0x03,0x4C,0x7A,0xE4,0xA9,0x52,0x8D,0x02,0x03,0xA9,0x01,0x8D,0x01,0x03,0x20,0x53,
0xE4,0x60,0xA5,0x08,0xF0,0x0A,0xA5,0x09,0x29,0x02,0xF0,0x03,0x20,0xE1,0xF3,0x60,
0xA5,0x4A,0xF0,0x1C,0xA9,0x80,0x85,0x3E,0xE6,0x4B,0x20,0x7D,0xE4,0x20,0x01,0xF3,
0xA9,0x00,0x85,0x4B,0x85,0x4A,0x06,0x09,0xA5,0x0C,0x85,0x02,0xA5,0x0D,0x85,0x03,
0x60,0x6C,0x02,0x00,0xA9,0xFF,0x8D,0xFC,0x02,0xAD,0xE6,0x02,0x29,0xF0,0x85,0x6A,
0xA9,0x40,0x8D,0xBE,0x02,0x60,0xA5,0x2B,0x29,0x0F,0xD0,0x08,0xA5,0x2A,0x29,0x0F,
0x85,0x2A,0xA9,0x00,0x85,0x57,0xA9,0xE0,0x8D,0xF4,0x02,0xA9,0x02,0x8D,0xF3,0x02,
0x8D,0x2F,0x02,0xA9,0x01,0x85,0x4C,0xA9,0xC0,0x05,0x10,0x85,0x10,0x8D,0x0E,0xD2,
0xA9,0x00,0x8D,0x93,0x02,0x85,0x64,0x85,0x7B,0x8D,0xF0,0x02,0xA0,0x0E,0xA9,0x01,
0x99,0xA3,0x02,0x88,0x10,0xFA,0xA2,0x04,0xBD,0xC1,0xFE,0x9D,0xC4,0x02,0xCA,0x10,
0xF7,0xA4,0x6A,0x88,0x8C,0x95,0x02,0xA9,0x60,0x8D,0x94,0x02,0xA6,0x57,0xBD,0x69,
0xFE,0xD0,0x04,0xA9,0x91,0x85,0x4C,0x85,0x51,0xA5,0x6A,0x85,0x65,0xBC,0x45,0xFE,
0xA9,0x28,0x20,0x21,0xF9,0x88,0xD0,0xF8,0xAD,0x6F,0x02,0x29,0x3F,0x85,0x67,0xA8,
0xE0,0x08,0x90,0x17,0x8A,0x6A,0x6A,0x6A,0x29,0xC0,0x05,0x67,0xA8,0xA9,0x10,0x20,
0x21,0xF9,0xE0,0x0B,0xD0,0x05,0xA9,0x06,0x8D,0xC8,0x02,0x8C,0x6F,0x02,0xA5,0x64,
0x85,0x58,0xA5,0x65,0x85,0x59,0xAD,0x0B,0xD4,0xC9,0x7A,0xD0,0xF9,0x20,0x1F,0xF9,
0xBD,0x75,0xFE,0xF0,0x06,0xA9,0xFF,0x85,0x64,0xC6,0x65,0xA5,0x64,0x85,0x68,0xA5,
0x65,0x85,0x69,0x20,0x13,0xF9,0xA9,0x41,0x20,0x17,0xF9,0x86,0x66,0xA9,0x18,0x8D,
0xBF,0x02,0xA5,0x57,0xC9,0x09,0xB0,0x2D,0xA5,0x2A,0x29,0x10,0xF0,0x27,0xA9,0x04,
0x8D,0xBF,0x02,0xA2,0x02,0xA9,0x02,0x20,0x17,0xF9,0xCA,0x10,0xF8,0xA4,0x6A,0x88,
0x98,0x20,0x17,0xF9,0xA9,0x60,0x20,0x17,0xF9,0xA9,0x42,0x20,0x17,0xF9,0x18,0xA9,
0x0C,0x65,0x66,0x85,0x66,0xA4,0x66,0xBE,0x51,0xFE,0xA5,0x51,0x20,0x17,0xF9,0xCA,
0xD0,0xF8,0xA5,0x57,0xC9,0x08,0x90,0x1C,0xA2,0x5D,0xA5,0x6A,0x38,0xE9,0x10,0x20,
0x17,0xF9,0xA9,0x00,0x20,0x17,0xF9,0xA9,0x4F,0x20,0x17,0xF9,0xA5,0x51,0x20,0x17,
0xF9,0xCA,0xD0,0xF8,0xA5,0x59,0x20,0x17,0xF9,0xA5,0x58,0x20,0x17,0xF9,0xA5,0x51,
0x09,0x40,0x20,0x17,0xF9,0xA9,0x70,0x20,0x17,0xF9,0xA9,0x70,0x20,0x17,0xF9,0xA5,
0x64,0x8D,0x30,0x02,0xA5,0x65,0x8D,0x31,0x02,0xA9,0x70,0x20,0x17,0xF9,0xA5,0x64,
0x8D,0xE5,0x02,0xA5,0x65,0x8D,0xE6,0x02,0xA5,0x68,0x85,0x64,0xA5,0x69,0x85,0x65,
0xAD,0x31,0x02,0x20,0x17,0xF9,0xAD,0x30,0x02,0x20,0x17,0xF9,0xA5,0x4C,0x10,0x07,
0x48,0x20,0xFC,0xF3,0x68,0xA8,0x60,0xA5,0x2A,0x29,0x20,0xD0,0x0B,0x20,0xB9,0xF7,
0x8D,0x90,0x02,0xA5,0x52,0x8D,0x91,0x02,0xA9,0x22,0x0D,0x2F,0x02,0x8D,0x2F,0x02,
0x4C,0x21,0xF6,0x20,0x96,0xFA,0x20,0xA2,0xF5,0x20,0x32,0xFB,0x20,0xD4,0xF9,0x4C,
0x34,0xF6,0x20,0x47,0xF9,0xB1,0x64,0x2D,0xA0,0x02,0x46,0x6F,0xB0,0x03,0x4A,0x10,
0xF9,0x8D,0xFA,0x02,0xC9,0x00,0x60,0x8D,0xFB,0x02,0x20,0x96,0xFA,0xAD,0xFB,0x02,
0xC9,0x7D,0xD0,0x06,0x20,0xB9,0xF7,0x4C,0x21,0xF6,0xAD,0xFB,0x02,0xC9,0x9B,0xD0,
0x06,0x20,0x30,0xFA,0x4C,0x21,0xF6,0x20,0xE0,0xF5,0x20,0xD8,0xF9,0x4C,0x21,0xF6,
0xAD,0xFF,0x02,0xD0,0xFB,0xA2,0x02,0xB5,0x54,0x95,0x5A,0xCA,0x10,0xF9,0xAD,0xFB,
0x02,0xA8,0x2A,0x2A,0x2A,0x2A,0x29,0x03,0xAA,0x98,0x29,0x9F,0x1D,0xF6,0xFE,0x8D,
0xFA,0x02,0x20,0x47,0xF9,0xAD,0xFA,0x02,0x46,0x6F,0xB0,0x04,0x0A,0x4C,0x08,0xF6,
0x2D,0xA0,0x02,0x85,0x50,0xAD,0xA0,0x02,0x49,0xFF,0x31,0x64,0x05,0x50,0x91,0x64,
0x60,0x20,0xA2,0xF5,0x85,0x5D,0xA6,0x57,0xD0,0x0A,0xAE,0xF0,0x02,0xD0,0x05,0x49,
0x80,0x20,0xFF,0xF5,0xA4,0x4C,0xA9,0x01,0x85,0x4C,0xAD,0xFB,0x02,0x60,0x20,0xB3,
0xFC,0x20,0x88,0xFA,0xA5,0x6B,0xD0,0x34,0xA5,0x54,0x85,0x6C,0xA5,0x55,0x85,0x6D,
0x20,0xE2,0xF6,0x84,0x4C,0xAD,0xFB,0x02,0xC9,0x9B,0xF0,0x12,0x20,0xAD,0xF6,0x20,
0xB3,0xFC,0xA5,0x63,0xC9,0x71,0xD0,0x03,0x20,0x0A,0xF9,0x4C,0x50,0xF6,0x20,0xE4,
0xFA,0x20,0x00,0xFC,0xA5,0x6C,0x85,0x54,0xA5,0x6D,0x85,0x55,0xA5,0x6B,0xF0,0x11,
0xC6,0x6B,0xF0,0x0D,0xA5,0x4C,0x30,0xF8,0x20,0x93,0xF5,0x8D,0xFB,0x02,0x4C,0xB3,
0xFC,0x20,0x30,0xFA,0xA9,0x9B,0x8D,0xFB,0x02,0x20,0x21,0xF6,0x84,0x4C,0x4C,0xB3,
0xFC,0x6C,0x64,0x00,0x8D,0xFB,0x02,0x20,0xB3,0xFC,0x20,0x88,0xFA,0x20,0xE4,0xFA,
0x20,0x8D,0xFC,0xF0,0x09,0x0E,0xA2,0x02,0x20,0xCA,0xF5,0x4C,0xB3,0xFC,0xAD,0xFE,
0x02,0x0D,0xA2,0x02,0xD0,0xEF,0x0E,0xA2,0x02,0xE8,0xBD,0xC6,0xFE,0x85,0x64,0xBD,
0xC7,0xFE,0x85,0x65,0x20,0xA1,0xF6,0x20,0x21,0xF6,0x4C,0xB3,0xFC,0xA9,0xFF,0x8D,
0xFC,0x02,0xA5,0x2A,0x4A,0xB0,0x62,0xA9,0x80,0xA6,0x11,0xF0,0x58,0xAD,0xFC,0x02,
0xC9,0xFF,0xF0,0xEE,0x85,0x7C,0xA2,0xFF,0x8E,0xFC,0x02,0x20,0xD8,0xFC,0xAA,0xE0,
0xC0,0x90,0x02,0xA2,0x03,0xBD,0xFE,0xFE,0x8D,0xFB,0x02,0xC9,0x80,0xF0,0xCE,0xC9,
0x81,0xD0,0x0B,0xAD,0xB6,0x02,0x49,0x80,0x8D,0xB6,0x02,0x4C,0xDD,0xF6,0xC9,0x82,
0xD0,0x07,0xA9,0x00,0x8D,0xBE,0x02,0xF0,0xB4,0xC9,0x83,0xD0,0x07,0xA9,0x40,0x8D,
0xBE,0x02,0xD0,0xA9,0xC9,0x84,0xD0,0x07,0xA9,0x80,0x8D,0xBE,0x02,0xD0,0x9E,0xC9,
0x85,0xD0,0x0A,0xA9,0x88,0x85,0x4C,0x85,0x11,0xA9,0x9B,0xD0,0x26,0xA5,0x7C,0xC9,
0x40,0xB0,0x15,0xAD,0xFB,0x02,0xC9,0x61,0x90,0x0E,0xC9,0x7B,0xB0,0x0A,0xAD,0xBE,
0x02,0xF0,0x05,0x05,0x7C,0x4C,0xFE,0xF6,0x20,0x8D,0xFC,0xF0,0x09,0xAD,0xFB,0x02,
0x4D,0xB6,0x02,0x8D,0xFB,0x02,0x4C,0x34,0xF6,0xA9,0x80,0x8D,0xA2,0x02,0x60,0xC6,
0x54,0x10,0x06,0xAE,0xBF,0x02,0xCA,0x86,0x54,0x4C,0x5C,0xFC,0xE6,0x54,0xA5,0x54,
0xCD,0xBF,0x02,0x90,0xF4,0xA2,0x00,0xF0,0xEE,0xC6,0x55,0xA5,0x55,0x30,0x04,0xC5,
0x52,0xB0,0x04,0xA5,0x53,0x85,0x55,0x4C,0xDD,0xFB,0xE6,0x55,0xA5,0x55,0xC5,0x53,
0x90,0xF5,0xF0,0xF3,0xA5,0x52,0x4C,0xA5,0xF7,0x20,0xF3,0xFC,0xA0,0x00,0x98,0x91,
0x64,0xC8,0xD0,0xFB,0xE6,0x65,0xA6,0x65,0xE4,0x6A,0x90,0xF3,0xA9,0xFF,0x99,0xB2,
0x02,0xC8,0xC0,0x04,0x90,0xF8,0x20,0xE4,0xFC,0x85,0x63,0x85,0x6D,0xA9,0x00,0x85,
0x54,0x85,0x56,0x85,0x6C,0x60,0xA5,0x63,0xC5,0x52,0xF0,0x21,0xA5,0x55,0xC5,0x52,
0xD0,0x03,0x20,0x73,0xFC,0x20,0x99,0xF7,0xA5,0x55,0xC5,0x53,0xD0,0x07,0xA5,0x54,
0xF0,0x03,0x20,0x7F,0xF7,0xA9,0x20,0x8D,0xFB,0x02,0x20,0xE0,0xF5,0x4C,0xDD,0xFB,
0x20,0xAA,0xF7,0xA5,0x55,0xC5,0x52,0xD0,0x0A,0x20,0x34,0xFA,0x20,0x20,0xFB,0x90,
0x02,0xB0,0x07,0xA5,0x63,0x20,0x25,0xFB,0x90,0xE6,0x4C,0xDD,0xFB,0xA5,0x63,0x4C,
0x06,0xFB,0xA5,0x63,0x4C,0x12,0xFB,0x20,0x9D,0xFC,0x20,0xA2,0xF5,0x85,0x7D,0xA9,
0x00,0x8D,0xBB,0x02,0x20,0xFF,0xF5,0xA5,0x63,0x48,0x20,0xDC,0xF9,0x68,0xC5,0x63,
0xB0,0x0C,0xA5,0x7D,0x48,0x20,0xA2,0xF5,0x85,0x7D,0x68,0x4C,0x44,0xF8,0x20,0xA8,
0xFC,0xCE,0xBB,0x02,0x30,0x04,0xC6,0x54,0xD0,0xF7,0x4C,0xDD,0xFB,0x20,0x9D,0xFC,
0x20,0x47,0xF9,0xA5,0x64,0x85,0x68,0xA5,0x65,0x85,0x69,0xA5,0x63,0x48,0x20,0xD4,
0xF9,0x68,0xC5,0x63,0xB0,0x10,0xA5,0x54,0xCD,0xBF,0x02,0xB0,0x09,0x20,0xA2,0xF5,
0xA0,0x00,0x91,0x68,0xF0,0xDA,0xA0,0x00,0x98,0x91,0x68,0x20,0x68,0xFC,0x20,0xA8,
0xFC,0x4C,0xDD,0xFB,0x38,0x20,0x7B,0xFB,0xA5,0x52,0x85,0x55,0x20,0x47,0xF9,0xA5,
0x64,0x85,0x68,0x18,0x69,0x28,0x85,0x66,0xA5,0x65,0x85,0x69,0x69,0x00,0x85,0x67,
0xA6,0x54,0xE0,0x17,0xF0,0x08,0x20,0x4E,0xFB,0xE8,0xE0,0x17,0xD0,0xF8,0x20,0x9B,
0xFB,0x4C,0xDD,0xFB,0x20,0xDD,0xFB,0xA4,0x51,0x84,0x54,0xA4,0x54,0x98,0x38,0x20,
0x23,0xFB,0x08,0x98,0x18,0x69,0x78,0x28,0x20,0x04,0xFB,0xC8,0xC0,0x18,0xD0,0xED,
0xAD,0xB4,0x02,0x09,0x01,0x8D,0xB4,0x02,0xA5,0x52,0x85,0x55,0x20,0x47,0xF9,0x20,
0xB7,0xFB,0x20,0x20,0xFB,0x90,0xD4,0x4C,0xDD,0xFB,0xA0,0x20,0x20,0xD8,0xFC,0x88,
0x10,0xFA,0x60,0xA9,0x02,0xD0,0x0A,0xA4,0x4C,0x30,0x2B,0xA0,0x00,0x91,0x64,0xA9,
0x01,0x8D,0x9E,0x02,0xA5,0x4C,0x30,0x1E,0xA5,0x64,0x38,0xED,0x9E,0x02,0x85,0x64,
0xB0,0x02,0xC6,0x65,0xA5,0x0F,0xC5,0x65,0x90,0x0C,0xD0,0x06,0xA5,0x0E,0xC5,0x64,
0x90,0x04,0xA9,0x93,0x85,0x4C,0x60,0xA5,0x54,0x48,0xA5,0x55,0x48,0xA5,0x56,0x48,
0x20,0xF3,0xFC,0xA5,0x54,0x85,0x66,0xA9,0x00,0x85,0x67,0xA5,0x66,0x0A,0x26,0x67,
0x85,0x51,0xA4,0x67,0x8C,0x9F,0x02,0x0A,0x26,0x67,0x0A,0x26,0x67,0x18,0x65,0x51,
0x85,0x66,0xA5,0x67,0x6D,0x9F,0x02,0x85,0x67,0xA6,0x57,0xBC,0x81,0xFE,0x88,0x30,
0x07,0x06,0x66,0x26,0x67,0x4C,0x7E,0xF9,0xBC,0xA5,0xFE,0xA5,0x55,0xA2,0x07,0x88,
0x30,0x0A,0xCA,0x46,0x56,0x6A,0x6E,0xA1,0x02,0x4C,0x8F,0xF9,0xC8,0x18,0x65,0x66,
0x85,0x66,0x90,0x02,0xE6,0x67,0x38,0x6E,0xA1,0x02,0x18,0xCA,0x10,0xF9,0xAE,0xA1,
0x02,0xA5,0x66,0x18,0x65,0x64,0x85,0x64,0x85,0x5E,0xA5,0x67,0x65,0x65,0x85,0x65,
0x85,0x5F,0xBD,0xB1,0xFE,0x8D,0xA0,0x02,0x85,0x6F,0x68,0x85,0x56,0x68,0x85,0x55,
0x68,0x85,0x54,0x60,0xA9,0x00,0xF0,0x02,0xA9,0x9B,0x85,0x7D,0xE6,0x63,0xE6,0x55,
0xD0,0x02,0xE6,0x56,0xA5,0x55,0xA6,0x57,0xDD,0x8D,0xFE,0xF0,0x0B,0xE0,0x00,0xD0,
0x06,0xC5,0x53,0xF0,0x02,0xB0,0x01,0x60,0xE0,0x08,0x90,0x04,0xA5,0x56,0xF0,0xF7,
0xA5,0x57,0xD0,0x30,0xA5,0x63,0xC9,0x51,0x90,0x0A,0xA5,0x7D,0xF0,0x26,0x20,0x30,
0xFA,0x4C,0x77,0xFA,0x20,0x34,0xFA,0xA5,0x54,0x18,0x69,0x78,0x20,0x25,0xFB,0x90,
0x08,0xA5,0x7D,0xF0,0x04,0x18,0x20,0xA5,0xF8,0x4C,0xDD,0xFB,0xA9,0x00,0xF0,0x02,
0xA9,0x9B,0x85,0x7D,0x20,0xE4,0xFC,0xA9,0x00,0x85,0x56,0xE6,0x54,0xA6,0x57,0xA0,
0x18,0x24,0x7B,0x10,0x05,0xA0,0x04,0x98,0xD0,0x03,0xBD,0x99,0xFE,0xC5,0x54,0xD0,
0x26,0x8C,0x9D,0x02,0x8A,0xD0,0x20,0xA5,0x7D,0xF0,0x1C,0xC9,0x9B,0x38,0xF0,0x01,
0x18,0x20,0xAC,0xFB,0xEE,0xBB,0x02,0xC6,0x6C,0xCE,0x9D,0x02,0xAD,0xB2,0x02,0x38,
0x10,0xEF,0xAD,0x9D,0x02,0x85,0x54,0x4C,0xDD,0xFB,0x38,0xB5,0x70,0xE5,0x74,0x95,
0x70,0xB5,0x71,0xE5,0x75,0x95,0x71,0x60,0xAD,0xBF,0x02,0xC9,0x04,0xF0,0x07,0xA5,
0x57,0xF0,0x03,0x20,0xFC,0xF3,0xA9,0x27,0xC5,0x53,0xB0,0x02,0x85,0x53,0xA6,0x57,
0xBD,0x99,0xFE,0xC5,0x54,0x90,0x2A,0xF0,0x28,0xE0,0x08,0xD0,0x0A,0xA5,0x56,0xF0,
0x13,0xC9,0x01,0xD0,0x1C,0xF0,0x04,0xA5,0x56,0xD0,0x16,0xBD,0x8D,0xFE,0xC5,0x55,
0x90,0x0F,0xF0,0x0D,0xA9,0x01,0x85,0x4C,0xA9,0x80,0xA6,0x11,0x85,0x11,0xF0,0x06,
0x60,0x20,0xD6,0xF7,0xA9,0x8D,0x85,0x4C,0x68,0x68,0xA5,0x7B,0x10,0x03,0x20,0xB9,
0xFC,0x4C,0x34,0xF6,0xA0,0x00,0xA5,0x5D,0x91,0x5E,0x60,0x48,0x29,0x07,0xAA,0xBD,
0xB9,0xFE,0x85,0x6E,0x68,0x4A,0x4A,0x4A,0xAA,0x60,0x2E,0xB4,0x02,0x2E,0xB3,0x02,
0x2E,0xB2,0x02,0x60,0x90,0x0C,0x20,0xEB,0xFA,0xBD,0xA3,0x02,0x05,0x6E,0x9D,0xA3,
0x02,0x60,0x20,0xEB,0xFA,0xA5,0x6E,0x49,0xFF,0x3D,0xA3,0x02,0x9D,0xA3,0x02,0x60,
0xA5,0x54,0x18,0x69,0x78,0x20,0xEB,0xFA,0x18,0xBD,0xA3,0x02,0x25,0x6E,0xF0,0x01,
0x38,0x60,0xAD,0xFA,0x02,0xA4,0x57,0xC0,0x03,0xB0,0x0F,0x2A,0x2A,0x2A,0x2A,0x29,
0x03,0xAA,0xAD,0xFA,0x02,0x29,0x9F,0x1D,0xFA,0xFE,0x8D,0xFB,0x02,0x60,0xA9,0x02,
0x85,0x65,0xA9,0x47,0x85,0x64,0xA0,0x27,0xB1,0x66,0x85,0x50,0xB1,0x68,0x91,0x66,
0xA5,0x50,0x91,0x64,0x88,0x10,0xF1,0xA5,0x65,0x85,0x69,0xA5,0x64,0x85,0x68,0x18,
0xA5,0x66,0x69,0x28,0x85,0x66,0x90,0x02,0xE6,0x67,0x60,0x08,0xA0,0x17,0x98,0x20,
0x22,0xFB,0x08,0x98,0x18,0x69,0x79,0x28,0x20,0x04,0xFB,0x88,0x30,0x04,0xC4,0x54,
0xB0,0xEC,0xA5,0x54,0x18,0x69,0x78,0x28,0x4C,0x04,0xFB,0xA5,0x52,0x85,0x55,0x20,
0x47,0xF9,0xA0,0x27,0xA9,0x00,0x91,0x64,0x88,0x10,0xFB,0x60,0x20,0xFA,0xFA,0xA5,
0x58,0x85,0x64,0xA5,0x59,0x85,0x65,0xA0,0x28,0xB1,0x64,0xA6,0x6A,0xCA,0xE4,0x65,
0xD0,0x08,0xA2,0xD7,0xE4,0x64,0xB0,0x02,0xA9,0x00,0xA0,0x00,0x91,0x64,0xE6,0x64,
0xD0,0xE5,0xE6,0x65,0xA5,0x65,0xC5,0x6A,0xD0,0xDD,0x4C,0xDD,0xFB,0xA9,0x00,0x85,
0x63,0xA5,0x54,0x85,0x51,0xA5,0x51,0x20,0x22,0xFB,0xB0,0x0C,0xA5,0x63,0x18,0x69,
0x28,0x85,0x63,0xC6,0x51,0x4C,0xE5,0xFB,0x18,0xA5,0x63,0x65,0x55,0x85,0x63,0x60,
0x20,0x9D,0xFC,0xA5,0x63,0x48,0xA5,0x6C,0x85,0x54,0xA5,0x6D,0x85,0x55,0xA9,0x01,
0x85,0x6B,0xA2,0x17,0xA5,0x7B,0x10,0x02,0xA2,0x03,0xE4,0x54,0xD0,0x0B,0xA5,0x55,
0xC5,0x53,0xD0,0x05,0xE6,0x6B,0x4C,0x39,0xFC,0x20,0xD4,0xF9,0xE6,0x6B,0xA5,0x63,
0xC5,0x52,0xD0,0xDE,0xC6,0x54,0x20,0x99,0xF7,0x20,0xA2,0xF5,0xD0,0x17,0xC6,0x6B,
0xA5,0x63,0xC5,0x52,0xF0,0x0F,0x20,0x99,0xF7,0xA5,0x55,0xC5,0x53,0xD0,0x02,0xC6,
0x54,0xA5,0x6B,0xD0,0xE4,0x68,0x85,0x63,0x20,0xA8,0xFC,0x60,0x20,0xDD,0xFB,0xA5,
0x51,0x85,0x6C,0xA5,0x52,0x85,0x6D,0x60,0xA5,0x63,0xC5,0x52,0xD0,0x02,0xC6,0x54,
0x20,0xDD,0xFB,0xA5,0x63,0xC5,0x52,0xF0,0x13,0x20,0x47,0xF9,0xA5,0x53,0x38,0xE5,
0x52,0xA8,0xB1,0x64,0xD0,0x06,0x88,0x10,0xF9,0x4C,0xDB,0xF8,0x60,0xA2,0x2D,0xBD,
0xC6,0xFE,0xCD,0xFB,0x02,0xF0,0x05,0xCA,0xCA,0xCA,0x10,0xF3,0x60,0xA2,0x02,0xB5,
0x54,0x9D,0xB8,0x02,0xCA,0x10,0xF8,0x60,0xA2,0x02,0xBD,0xB8,0x02,0x95,0x54,0xCA,
0x10,0xF8,0x60,0x20,0xB9,0xFC,0x4C,0x34,0xF6,0xAD,0xBF,0x02,0xC9,0x18,0xF0,0x17,
0xA2,0x0B,0xB5,0x54,0x48,0xBD,0x90,0x02,0x95,0x54,0x68,0x9D,0x90,0x02,0xCA,0x10,
0xF1,0xA5,0x7B,0x49,0xFF,0x85,0x7B,0x60,0xA2,0x7F,0x8E,0x1F,0xD0,0x8E,0x0A,0xD4,
0xCA,0x10,0xF7,0x60,0xA9,0x00,0xA6,0x7B,0xD0,0x04,0xA6,0x57,0xD0,0x02,0xA5,0x52,
0x85,0x55,0x60,0xA5,0x58,0x85,0x64,0xA5,0x59,0x85,0x65,0x60,0xA2,0x00,0xA5,0x22,
0xC9,0x11,0xF0,0x08,0xC9,0x12,0xF0,0x03,0xA0,0x84,0x60,0xE8,0x8E,0xB7,0x02,0xA5,
0x54,0x85,0x60,0xA5,0x55,0x85,0x61,0xA5,0x56,0x85,0x62,0xA9,0x01,0x85,0x79,0x85,
0x7A,0x38,0xA5,0x60,0xE5,0x5A,0x85,0x76,0xB0,0x0D,0xA9,0xFF,0x85,0x79,0xA5,0x76,
0x49,0xFF,0x18,0x69,0x01,0x85,0x76,0x38,0xA5,0x61,0xE5,0x5B,0x85,0x77,0xA5,0x62,
0xE5,0x5C,0x85,0x78,0xB0,0x16,0xA9,0xFF,0x85,0x7A,0xA5,0x77,0x49,0xFF,0x85,0x77,
0xA5,0x78,0x49,0xFF,0x85,0x78,0xE6,0x77,0xD0,0x02,0xE6,0x78,0xA2,0x02,0xA0,0x00,
0x84,0x73,0x98,0x95,0x70,0xB5,0x5A,0x95,0x54,0xCA,0x10,0xF6,0xA5,0x77,0xE8,0xA8,
0xA5,0x78,0x85,0x7F,0x85,0x75,0xD0,0x0B,0xA5,0x77,0xC5,0x76,0xB0,0x05,0xA5,0x76,
0xA2,0x02,0xA8,0x98,0x85,0x7E,0x85,0x74,0x48,0xA5,0x75,0x4A,0x68,0x6A,0x95,0x70,
0xA5,0x7E,0x05,0x7F,0xD0,0x03,0x4C,0x42,0xFE,0x18,0xA5,0x70,0x65,0x76,0x85,0x70,
0x90,0x02,0xE6,0x71,0xA5,0x71,0xC5,0x75,0x90,0x14,0xD0,0x06,0xA5,0x70,0xC5,0x74,
0x90,0x0C,0x18,0xA5,0x54,0x65,0x79,0x85,0x54,0xA2,0x00,0x20,0x7A,0xFA,0x18,0xA5,
0x72,0x65,0x77,0x85,0x72,0xA5,0x73,0x65,0x78,0x85,0x73,0xC5,0x75,0x90,0x27,0xD0,
0x06,0xA5,0x72,0xC5,0x74,0x90,0x1F,0x24,0x7A,0x10,0x10,0xC6,0x55,0xA5,0x55,0xC9,
0xFF,0xD0,0x0E,0xA5,0x56,0xF0,0x0A,0xC6,0x56,0x10,0x06,0xE6,0x55,0xD0,0x02,0xE6,
0x56,0xA2,0x02,0x20,0x7A,0xFA,0x20,0x96,0xFA,0x20,0xE0,0xF5,0xAD,0xB7,0x02,0xF0,
0x2F,0x20,0x9D,0xFC,0xAD,0xFB,0x02,0x8D,0xBC,0x02,0xA5,0x54,0x48,0x20,0xDC,0xF9,
0x68,0x85,0x54,0x20,0x96,0xFA,0x20,0xA2,0xF5,0xD0,0x0C,0xAD,0xFD,0x02,0x8D,0xFB,
0x02,0x20,0xE0,0xF5,0x4C,0x0A,0xFE,0xAD,0xBC,0x02,0x8D,0xFB,0x02,0x20,0xA8,0xFC,
0x38,0xA5,0x7E,0xE9,0x01,0x85,0x7E,0xA5,0x7F,0xE9,0x00,0x85,0x7F,0x30,0x03,0x4C,
0x90,0xFD,0x4C,0x34,0xF6,0x18,0x10,0x0A,0x0A,0x10,0x1C,0x34,0x64,0xC4,0xC4,0xC4,
0xC4,0x17,0x17,0x0B,0x17,0x2F,0x2F,0x5F,0x5F,0x61,0x61,0x61,0x61,0x13,0x13,0x09,
0x13,0x27,0x27,0x4F,0x4F,0x41,0x41,0x41,0x41,0x02,0x06,0x07,0x08,0x09,0x0A,0x0B,
0x0D,0x0F,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,
0x01,0x02,0x01,0x01,0x00,0x00,0x01,0x01,0x02,0x02,0x02,0x02,0x02,0x28,0x14,0x14,
0x28,0x50,0x50,0xA0,0xA0,0x40,0x50,0x50,0x50,0x18,0x18,0x0C,0x18,0x30,0x30,0x60,
0x60,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x02,0x03,0x02,0x03,0x02,0x03,0x01,0x01,
0x01,0x00,0xFF,0xF0,0x0F,0xC0,0x30,0x0C,0x03,0x80,0x40,0x20,0x10,0x08,0x04,0x02,
0x01,0x28,0xCA,0x94,0x46,0x00,0x1B,0x79,0xF7,0x1C,0x7F,0xF7,0x1D,0x8C,0xF7,0x1E,
0x99,0xF7,0x1F,0xAA,0xF7,0x7D,0xB9,0xF7,0x7E,0xE6,0xF7,0x7F,0x10,0xF8,0x9B,0x30,
0xFA,0x9C,0xD4,0xF8,0x9D,0xA4,0xF8,0x9E,0x32,0xF8,0x9F,0x2D,0xF8,0xFD,0x0A,0xF9,
0xFE,0x6D,0xF8,0xFF,0x37,0xF8,0x40,0x00,0x20,0x60,0x20,0x40,0x00,0x60,0x6C,0x6A,
0x3B,0x80,0x80,0x6B,0x2B,0x2A,0x6F,0x80,0x70,0x75,0x9B,0x69,0x2D,0x3D,0x76,0x80,
0x63,0x80,0x80,0x62,0x78,0x7A,0x34,0x80,0x33,0x36,0x1B,0x35,0x32,0x31,0x2C,0x20,
0x2E,0x6E,0x80,0x6D,0x2F,0x81,0x72,0x80,0x65,0x79,0x7F,0x74,0x77,0x71,0x39,0x80,
0x30,0x37,0x7E,0x38,0x3C,0x3E,0x66,0x68,0x64,0x80,0x82,0x67,0x73,0x61,0x4C,0x4A,
0x3A,0x80,0x80,0x4B,0x5C,0x5E,0x4F,0x80,0x50,0x55,0x9B,0x49,0x5F,0x7C,0x56,0x80,
0x43,0x80,0x80,0x42,0x58,0x5A,0x24,0x80,0x23,0x26,0x1B,0x25,0x22,0x21,0x5B,0x20,
0x5D,0x4E,0x80,0x4D,0x3F,0x81,0x52,0x80,0x45,0x59,0x9F,0x54,0x57,0x51,0x28,0x80,
0x29,0x27,0x9C,0x40,0x7D,0x9D,0x46,0x48,0x44,0x80,0x83,0x47,0x53,0x41,0x0C,0x0A,
0x7B,0x80,0x80,0x0B,0x1E,0x1F,0x0F,0x80,0x10,0x15,0x9B,0x09,0x1C,0x1D,0x16,0x80,
0x03,0x80,0x80,0x02,0x18,0x1A,0x80,0x80,0x85,0x80,0x1B,0x80,0xFD,0x80,0x00,0x20,
0x60,0x0E,0x80,0x0D,0x80,0x81,0x12,0x80,0x05,0x19,0x9E,0x14,0x17,0x11,0x80,0x80,
0x80,0x80,0xFE,0x80,0x7D,0xFF,0x06,0x08,0x04,0x80,0x84,0x07,0x13,0x01,0xAD,0x09,
0xD2,0xCD,0xF2,0x02,0xD0,0x05,0xAD,0xF1,0x02,0xD0,0x20,0xAD,0x09,0xD2,0xC9,0x9F,
0xD0,0x0A,0xAD,0xFF,0x02,0x49,0xFF,0x8D,0xFF,0x02,0xB0,0x0F,0x8D,0xFC,0x02,0x8D,
0xF2,0x02,0xA9,0x03,0x8D,0xF1,0x02,0xA9,0x00,0x85,0x4D,0xA9,0x30,0x8D,0x2B,0x02,
0x68,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xD6,0x57,0xB4,0xE7,0x77,0xE4,0xF3,0xE6,
};

Wyświetl plik

@ -0,0 +1,642 @@
const UBYTE PROGMEM romos[10240] = {
0x20,0xA1,0xDB,0x20,0xBB,0xDB,0xB0,0x39,0xA2,0xED,0xA0,0x04,0x20,0x48,0xDA,0xA2,
0xFF,0x86,0xF1,0x20,0x44,0xDA,0xF0,0x04,0xA9,0xFF,0x85,0xF0,0x20,0x94,0xDB,0xB0,
0x21,0x48,0xA6,0xD5,0xD0,0x11,0x20,0xEB,0xDB,0x68,0x05,0xD9,0x85,0xD9,0xA6,0xF1,
0x30,0xE6,0xE8,0x86,0xF1,0xD0,0xE1,0x68,0xA6,0xF1,0x10,0x02,0xE6,0xED,0x4C,0x18,
0xD8,0x60,0xC9,0x2E,0xF0,0x14,0xC9,0x45,0xF0,0x19,0xA6,0xF0,0xD0,0x68,0xC9,0x2B,
0xF0,0xC6,0xC9,0x2D,0xF0,0x00,0x85,0xEE,0xF0,0xBE,0xA6,0xF1,0x10,0x58,0xE8,0x86,
0xF1,0xF0,0xB5,0xA5,0xF2,0x85,0xEC,0x20,0x94,0xDB,0xB0,0x37,0xAA,0xA5,0xED,0x48,
0x86,0xED,0x20,0x94,0xDB,0xB0,0x17,0x48,0xA5,0xED,0x0A,0x85,0xED,0x0A,0x0A,0x65,
0xED,0x85,0xED,0x68,0x18,0x65,0xED,0x85,0xED,0xA4,0xF2,0x20,0x9D,0xDB,0xA5,0xEF,
0xF0,0x09,0xA5,0xED,0x49,0xFF,0x18,0x69,0x01,0x85,0xED,0x68,0x18,0x65,0xED,0x85,
0xED,0xD0,0x13,0xC9,0x2B,0xF0,0x06,0xC9,0x2D,0xD0,0x07,0x85,0xEF,0x20,0x94,0xDB,
0x90,0xBA,0xA5,0xEC,0x85,0xF2,0xC6,0xF2,0xA5,0xED,0xA6,0xF1,0x30,0x05,0xF0,0x03,
0x38,0xE5,0xF1,0x48,0x2A,0x68,0x6A,0x85,0xED,0x90,0x03,0x20,0xEB,0xDB,0xA5,0xED,
0x18,0x69,0x44,0x85,0xD4,0x20,0x00,0xDC,0xB0,0x0B,0xA6,0xEE,0xF0,0x06,0xA5,0xD4,
0x09,0x80,0x85,0xD4,0x18,0x60,0x20,0x51,0xDA,0xA9,0x30,0x8D,0x7F,0x05,0xA5,0xD4,
0xF0,0x28,0x29,0x7F,0xC9,0x3F,0x90,0x28,0xC9,0x45,0xB0,0x24,0x38,0xE9,0x3F,0x20,
0x70,0xDC,0x20,0xA4,0xDC,0x09,0x80,0x9D,0x80,0x05,0xAD,0x80,0x05,0xC9,0x2E,0xF0,
0x03,0x4C,0x88,0xD9,0x20,0xC1,0xDC,0x4C,0x9C,0xD9,0xA9,0xB0,0x8D,0x80,0x05,0x60,
0xA9,0x01,0x20,0x70,0xDC,0x20,0xA4,0xDC,0xE8,0x86,0xF2,0xA5,0xD4,0x0A,0x38,0xE9,
0x80,0xAE,0x80,0x05,0xE0,0x30,0xF0,0x17,0xAE,0x81,0x05,0xAC,0x82,0x05,0x8E,0x82,
0x05,0x8C,0x81,0x05,0xA6,0xF2,0xE0,0x02,0xD0,0x02,0xE6,0xF2,0x18,0x69,0x01,0x85,
0xED,0xA9,0x45,0xA4,0xF2,0x20,0x9F,0xDC,0x84,0xF2,0xA5,0xED,0x10,0x0B,0xA9,0x00,
0x38,0xE5,0xED,0x85,0xED,0xA9,0x2D,0xD0,0x02,0xA9,0x2B,0x20,0x9F,0xDC,0xA2,0x00,
0xA5,0xED,0x38,0xE9,0x0A,0x90,0x03,0xE8,0xD0,0xF8,0x18,0x69,0x0A,0x48,0x8A,0x20,
0x9D,0xDC,0x68,0x09,0x80,0x20,0x9D,0xDC,0xAD,0x80,0x05,0xC9,0x30,0xD0,0x0D,0x18,
0xA5,0xF3,0x69,0x01,0x85,0xF3,0xA5,0xF4,0x69,0x00,0x85,0xF4,0xA5,0xD4,0x10,0x09,
0x20,0xC1,0xDC,0xA0,0x00,0xA9,0x2D,0x91,0xF3,0x60,0xA5,0xD4,0x85,0xF8,0xA5,0xD5,
0x85,0xF7,0x20,0x44,0xDA,0xF8,0xA0,0x10,0x06,0xF8,0x26,0xF7,0xA2,0x03,0xB5,0xD4,
0x75,0xD4,0x95,0xD4,0xCA,0xD0,0xF7,0x88,0xD0,0xEE,0xD8,0xA9,0x42,0x85,0xD4,0x4C,
0x00,0xDC,0xA9,0x00,0x85,0xF7,0x85,0xF8,0xA5,0xD4,0x30,0x66,0xC9,0x43,0xB0,0x62,
0x38,0xE9,0x40,0x90,0x3F,0x69,0x00,0x0A,0x85,0xF5,0x20,0x5A,0xDA,0xB0,0x53,0xA5,
0xF7,0x85,0xF9,0xA5,0xF8,0x85,0xFA,0x20,0x5A,0xDA,0xB0,0x46,0x20,0x5A,0xDA,0xB0,
0x41,0x18,0xA5,0xF8,0x65,0xFA,0x85,0xF8,0xA5,0xF7,0x65,0xF9,0x85,0xF7,0xB0,0x32,
0x20,0xB9,0xDC,0x18,0x65,0xF8,0x85,0xF8,0xA5,0xF7,0x69,0x00,0xB0,0x24,0x85,0xF7,
0xC6,0xF5,0xD0,0xC6,0x20,0xB9,0xDC,0xC9,0x05,0x90,0x0D,0x18,0xA5,0xF8,0x69,0x01,
0x85,0xF8,0xA5,0xF7,0x69,0x00,0x85,0xF7,0xA5,0xF8,0x85,0xD4,0xA5,0xF7,0x85,0xD5,
0x18,0x60,0x38,0x60,0xA2,0xD4,0xA0,0x06,0xA9,0x00,0x95,0x00,0xE8,0x88,0xD0,0xFA,
0x60,0xA9,0x05,0x85,0xF4,0xA9,0x80,0x85,0xF3,0x60,0x18,0x26,0xF8,0x26,0xF7,0x60,
0xA5,0xE0,0x49,0x80,0x85,0xE0,0xA5,0xE0,0x29,0x7F,0x85,0xF7,0xA5,0xD4,0x29,0x7F,
0x38,0xE5,0xF7,0x10,0x10,0xA2,0x05,0xB5,0xD4,0xB4,0xE0,0x95,0xE0,0x98,0x95,0xD4,
0xCA,0x10,0xF4,0x30,0xE1,0xF0,0x07,0xC9,0x05,0xB0,0x19,0x20,0x3E,0xDC,0xF8,0xA5,
0xD4,0x45,0xE0,0x30,0x1E,0xA2,0x04,0x18,0xB5,0xD5,0x75,0xE1,0x95,0xD5,0xCA,0x10,
0xF7,0xD8,0xB0,0x03,0x4C,0x00,0xDC,0xA9,0x01,0x20,0x3A,0xDC,0xA9,0x01,0x85,0xD5,
0x4C,0x00,0xDC,0xA2,0x04,0x38,0xB5,0xD5,0xF5,0xE1,0x95,0xD5,0xCA,0x10,0xF7,0x90,
0x04,0xD8,0x4C,0x00,0xDC,0xA5,0xD4,0x49,0x80,0x85,0xD4,0x38,0xA2,0x04,0xA9,0x00,
0xF5,0xD5,0x95,0xD5,0xCA,0x10,0xF7,0xD8,0x4C,0x00,0xDC,0xA5,0xD4,0xF0,0x45,0xA5,
0xE0,0xF0,0x3E,0x20,0xCF,0xDC,0x38,0xE9,0x40,0x38,0x65,0xE0,0x30,0x38,0x20,0xE0,
0xDC,0xA5,0xDF,0x29,0x0F,0x85,0xF6,0xC6,0xF6,0x30,0x06,0x20,0x01,0xDD,0x4C,0xF7,
0xDA,0xA5,0xDF,0x4A,0x4A,0x4A,0x4A,0x85,0xF6,0xC6,0xF6,0x30,0x06,0x20,0x05,0xDD,
0x4C,0x09,0xDB,0x20,0x62,0xDC,0xC6,0xF5,0xD0,0xD7,0xA5,0xED,0x85,0xD4,0x4C,0x04,
0xDC,0x20,0x44,0xDA,0x18,0x60,0x38,0x60,0xA5,0xE0,0xF0,0xFA,0xA5,0xD4,0xF0,0xF4,
0x20,0xCF,0xDC,0x38,0xE5,0xE0,0x18,0x69,0x40,0x30,0xEB,0x20,0xE0,0xDC,0xE6,0xF5,
0x4C,0x4E,0xDB,0xA2,0x00,0xB5,0xD5,0x95,0xD4,0xE8,0xE0,0x0C,0xD0,0xF7,0xA0,0x05,
0x38,0xF8,0xB9,0xDA,0x00,0xF9,0xE6,0x00,0x99,0xDA,0x00,0x88,0x10,0xF4,0xD8,0x90,
0x04,0xE6,0xD9,0xD0,0xE9,0x20,0x0F,0xDD,0x06,0xD9,0x06,0xD9,0x06,0xD9,0x06,0xD9,
0xA0,0x05,0x38,0xF8,0xB9,0xDA,0x00,0xF9,0xE0,0x00,0x99,0xDA,0x00,0x88,0x10,0xF4,
0xD8,0x90,0x04,0xE6,0xD9,0xD0,0xE9,0x20,0x09,0xDD,0xC6,0xF5,0xD0,0xB5,0x20,0x62,
0xDC,0x4C,0x1A,0xDB,0x20,0xAF,0xDB,0xA4,0xF2,0x90,0x02,0xB1,0xF3,0xC8,0x84,0xF2,
0x60,0xA4,0xF2,0xA9,0x20,0xD1,0xF3,0xD0,0x03,0xC8,0xD0,0xF9,0x84,0xF2,0x60,0xA4,
0xF2,0xB1,0xF3,0x38,0xE9,0x30,0x90,0x18,0xC9,0x0A,0x60,0xA5,0xF2,0x48,0x20,0x94,
0xDB,0x90,0x1F,0xC9,0x2E,0xF0,0x14,0xC9,0x2B,0xF0,0x07,0xC9,0x2D,0xF0,0x03,0x68,
0x38,0x60,0x20,0x94,0xDB,0x90,0x0B,0xC9,0x2E,0xD0,0xF4,0x20,0x94,0xDB,0x90,0x02,
0xB0,0xED,0x68,0x85,0xF2,0x18,0x60,0xA2,0xE7,0xD0,0x02,0xA2,0xD5,0xA0,0x04,0x18,
0x36,0x04,0x36,0x03,0x36,0x02,0x36,0x01,0x36,0x00,0x26,0xEC,0x88,0xD0,0xF0,0x60,
0xA2,0x00,0x86,0xDA,0xA2,0x04,0xA5,0xD4,0xF0,0x2E,0xA5,0xD5,0xD0,0x1A,0xA0,0x00,
0xB9,0xD6,0x00,0x99,0xD5,0x00,0xC8,0xC0,0x05,0x90,0xF5,0xC6,0xD4,0xCA,0xD0,0xEA,
0xA5,0xD5,0xD0,0x04,0x85,0xD4,0x18,0x60,0xA5,0xD4,0x29,0x7F,0xC9,0x71,0x90,0x01,
0x60,0xC9,0x0F,0xB0,0x03,0x20,0x44,0xDA,0x18,0x60,0xA2,0xD4,0xD0,0x02,0xA2,0xE0,
0x86,0xF9,0x85,0xF7,0x85,0xF8,0xA0,0x04,0xB5,0x04,0x95,0x05,0xCA,0x88,0xD0,0xF8,
0xA9,0x00,0x95,0x05,0xA6,0xF9,0xC6,0xF7,0xD0,0xEC,0xB5,0x00,0x18,0x65,0xF8,0x95,
0x00,0x60,0xA2,0x0A,0xB5,0xD4,0x95,0xD5,0xCA,0x10,0xF9,0xA9,0x00,0x85,0xD4,0x60,
0x85,0xF7,0xA2,0x00,0xA0,0x00,0x20,0x93,0xDC,0x38,0xE9,0x01,0x85,0xF7,0xB5,0xD5,
0x4A,0x4A,0x4A,0x4A,0x20,0x9D,0xDC,0xB5,0xD5,0x29,0x0F,0x20,0x9D,0xDC,0xE8,0xE0,
0x05,0x90,0xE3,0xA5,0xF7,0xD0,0x05,0xA9,0x2E,0x20,0x9F,0xDC,0x60,0x09,0x30,0x99,
0x80,0x05,0xC8,0x60,0xA2,0x0A,0xBD,0x80,0x05,0xC9,0x2E,0xF0,0x07,0xC9,0x30,0xD0,
0x07,0xCA,0xD0,0xF2,0xCA,0xBD,0x80,0x05,0x60,0x20,0xEB,0xDB,0xA5,0xEC,0x29,0x0F,
0x60,0x38,0xA5,0xF3,0xE9,0x01,0x85,0xF3,0xA5,0xF4,0xE9,0x00,0x85,0xF4,0x60,0xA5,
0xD4,0x45,0xE0,0x29,0x80,0x85,0xEE,0x06,0xE0,0x46,0xE0,0xA5,0xD4,0x29,0x7F,0x60,
0x05,0xEE,0x85,0xED,0xA9,0x00,0x85,0xD4,0x85,0xE0,0x20,0x28,0xDD,0x20,0xE7,0xDB,
0xA5,0xEC,0x29,0x0F,0x85,0xE6,0xA9,0x05,0x85,0xF5,0x20,0x34,0xDD,0x20,0x44,0xDA,
0x60,0xA2,0xD9,0xD0,0x06,0xA2,0xD9,0xD0,0x08,0xA2,0xDF,0xA0,0xE5,0xD0,0x04,0xA2,
0xDF,0xA0,0xEB,0xA9,0x05,0x85,0xF7,0x18,0xF8,0xB5,0x00,0x79,0x00,0x00,0x95,0x00,
0xCA,0x88,0xC6,0xF7,0x10,0xF3,0xD8,0x60,0xA0,0x05,0xB9,0xE0,0x00,0x99,0xE6,0x00,
0x88,0x10,0xF7,0x60,0xA0,0x05,0xB9,0xD4,0x00,0x99,0xDA,0x00,0x88,0x10,0xF7,0x60,
0x86,0xFE,0x84,0xFF,0x85,0xEF,0xA2,0xE0,0xA0,0x05,0x20,0xA7,0xDD,0x20,0xB6,0xDD,
0xA6,0xFE,0xA4,0xFF,0x20,0x89,0xDD,0xC6,0xEF,0xF0,0x2D,0x20,0xDB,0xDA,0xB0,0x28,
0x18,0xA5,0xFE,0x69,0x06,0x85,0xFE,0x90,0x06,0xA5,0xFF,0x69,0x00,0x85,0xFF,0xA6,
0xFE,0xA4,0xFF,0x20,0x98,0xDD,0x20,0x66,0xDA,0xB0,0x0D,0xC6,0xEF,0xF0,0x09,0xA2,
0xE0,0xA0,0x05,0x20,0x98,0xDD,0x30,0xD3,0x60,0x86,0xFC,0x84,0xFD,0xA0,0x05,0xB1,
0xFC,0x99,0xD4,0x00,0x88,0x10,0xF8,0x60,0x86,0xFC,0x84,0xFD,0xA0,0x05,0xB1,0xFC,
0x99,0xE0,0x00,0x88,0x10,0xF8,0x60,0x86,0xFC,0x84,0xFD,0xA0,0x05,0xB9,0xD4,0x00,
0x91,0xFC,0x88,0x10,0xF8,0x60,0xA2,0x05,0xB5,0xD4,0x95,0xE0,0xCA,0x10,0xF9,0x60,
0xA2,0x89,0xA0,0xDE,0x20,0x98,0xDD,0x20,0xDB,0xDA,0xB0,0x7F,0xA9,0x00,0x85,0xF1,
0xA5,0xD4,0x85,0xF0,0x29,0x7F,0x85,0xD4,0x38,0xE9,0x40,0x30,0x26,0xC9,0x04,0x10,
0x6A,0xA2,0xE6,0xA0,0x05,0x20,0xA7,0xDD,0x20,0xD2,0xD9,0xA5,0xD4,0x85,0xF1,0xA5,
0xD5,0xD0,0x58,0x20,0xAA,0xD9,0x20,0xB6,0xDD,0xA2,0xE6,0xA0,0x05,0x20,0x89,0xDD,
0x20,0x60,0xDA,0xA9,0x0A,0xA2,0x4D,0xA0,0xDE,0x20,0x40,0xDD,0x20,0xB6,0xDD,0x20,
0xDB,0xDA,0xA5,0xF1,0xF0,0x23,0x18,0x6A,0x85,0xE0,0xA9,0x01,0x90,0x02,0xA9,0x10,
0x85,0xE1,0xA2,0x04,0xA9,0x00,0x95,0xE2,0xCA,0x10,0xFB,0xA5,0xE0,0x18,0x69,0x40,
0xB0,0x19,0x30,0x17,0x85,0xE0,0x20,0xDB,0xDA,0xA5,0xF0,0x10,0x0D,0x20,0xB6,0xDD,
0xA2,0x8F,0xA0,0xDE,0x20,0x89,0xDD,0x20,0x28,0xDB,0x60,0x38,0x60,0x3D,0x17,0x94,
0x19,0x00,0x00,0x3D,0x57,0x33,0x05,0x00,0x00,0x3E,0x05,0x54,0x76,0x62,0x00,0x3E,
0x32,0x19,0x62,0x27,0x00,0x3F,0x01,0x68,0x60,0x30,0x36,0x3F,0x07,0x32,0x03,0x27,
0x41,0x3F,0x25,0x43,0x34,0x56,0x75,0x3F,0x66,0x27,0x37,0x30,0x50,0x40,0x01,0x15,
0x12,0x92,0x55,0x3F,0x99,0x99,0x99,0x99,0x99,0x3F,0x43,0x42,0x94,0x48,0x19,0x40,
0x01,0x00,0x00,0x00,0x00,0x86,0xFE,0x84,0xFF,0xA2,0xE0,0xA0,0x05,0x20,0xA7,0xDD,
0xA6,0xFE,0xA4,0xFF,0x20,0x98,0xDD,0x20,0x66,0xDA,0xA2,0xE6,0xA0,0x05,0x20,0xA7,
0xDD,0xA2,0xE0,0xA0,0x05,0x20,0x89,0xDD,0xA6,0xFE,0xA4,0xFF,0x20,0x98,0xDD,0x20,
0x60,0xDA,0xA2,0xE6,0xA0,0x05,0x20,0x98,0xDD,0x20,0x28,0xDB,0x60,0xA9,0x01,0xD0,
0x02,0xA9,0x00,0x85,0xF0,0xA5,0xD4,0x10,0x02,0x38,0x60,0xA5,0xD4,0x85,0xE0,0x38,
0xE9,0x40,0x0A,0x85,0xF1,0xA5,0xD5,0x29,0xF0,0xD0,0x04,0xA9,0x01,0xD0,0x04,0xE6,
0xF1,0xA9,0x10,0x85,0xE1,0xA2,0x04,0xA9,0x00,0x95,0xE2,0xCA,0x10,0xFB,0x20,0x28,
0xDB,0xA2,0x66,0xA0,0xDF,0x20,0x95,0xDE,0xA2,0xE6,0xA0,0x05,0x20,0xA7,0xDD,0x20,
0xB6,0xDD,0x20,0xDB,0xDA,0xA9,0x0A,0xA2,0x72,0xA0,0xDF,0x20,0x40,0xDD,0xA2,0xE6,
0xA0,0x05,0x20,0x98,0xDD,0x20,0xDB,0xDA,0xA2,0x6C,0xA0,0xDF,0x20,0x98,0xDD,0x20,
0x66,0xDA,0x20,0xB6,0xDD,0xA9,0x00,0x85,0xD5,0xA5,0xF1,0x85,0xD4,0x10,0x07,0x49,
0xFF,0x18,0x69,0x01,0x85,0xD4,0x20,0xAA,0xD9,0x24,0xF1,0x10,0x06,0xA9,0x80,0x05,
0xD4,0x85,0xD4,0x20,0x66,0xDA,0xA5,0xF0,0xF0,0x0A,0xA2,0x89,0xA0,0xDE,0x20,0x98,
0xDD,0x20,0x28,0xDB,0x18,0x60,0x40,0x03,0x16,0x22,0x77,0x66,0x3F,0x50,0x00,0x00,
0x00,0x00,0x3F,0x49,0x15,0x57,0x11,0x08,0xBF,0x51,0x70,0x49,0x47,0x08,0x3F,0x39,
0x20,0x57,0x61,0x95,0xBF,0x04,0x39,0x63,0x03,0x55,0x3F,0x10,0x09,0x30,0x12,0x64,
0x3F,0x09,0x39,0x08,0x04,0x60,0x3F,0x12,0x42,0x58,0x47,0x42,0x3F,0x17,0x37,0x12,
0x06,0x08,0x3F,0x28,0x95,0x29,0x71,0x17,0x3F,0x86,0x85,0x88,0x96,0x44,0x3E,0x16,
0x05,0x44,0x49,0x00,0xBE,0x95,0x68,0x38,0x45,0x00,0x3F,0x02,0x68,0x79,0x94,0x16,
0xBF,0x04,0x92,0x78,0x90,0x80,0x3F,0x07,0x03,0x15,0x20,0x00,0xBF,0x08,0x92,0x29,
0x12,0x44,0x3F,0x11,0x08,0x40,0x09,0x11,0xBF,0x14,0x28,0x31,0x56,0x04,0x3F,0x19,
0x99,0x98,0x77,0x44,0xBF,0x33,0x33,0x33,0x31,0x13,0x3F,0x99,0x99,0x99,0x99,0x99,
0x3F,0x78,0x53,0x98,0x16,0x34,0x98,0x16,0x34,0xFC,0xE0,0x32,0x50,0xD9,0x68,0x11,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x00,
0x00,0x66,0x66,0x66,0x00,0x00,0x00,0x00,0x00,0x66,0xFF,0x66,0x66,0xFF,0x66,0x00,
0x18,0x3E,0x60,0x3C,0x06,0x7C,0x18,0x00,0x00,0x66,0x6C,0x18,0x30,0x66,0x46,0x00,
0x1C,0x36,0x1C,0x38,0x6F,0x66,0x3B,0x00,0x00,0x18,0x18,0x18,0x00,0x00,0x00,0x00,
0x00,0x0E,0x1C,0x18,0x18,0x1C,0x0E,0x00,0x00,0x70,0x38,0x18,0x18,0x38,0x70,0x00,
0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x40,0x00,
0x00,0x3C,0x66,0x6E,0x76,0x66,0x3C,0x00,0x00,0x18,0x38,0x18,0x18,0x18,0x7E,0x00,
0x00,0x3C,0x66,0x0C,0x18,0x30,0x7E,0x00,0x00,0x7E,0x0C,0x18,0x0C,0x66,0x3C,0x00,
0x00,0x0C,0x1C,0x3C,0x6C,0x7E,0x0C,0x00,0x00,0x7E,0x60,0x7C,0x06,0x66,0x3C,0x00,
0x00,0x3C,0x60,0x7C,0x66,0x66,0x3C,0x00,0x00,0x7E,0x06,0x0C,0x18,0x30,0x30,0x00,
0x00,0x3C,0x66,0x3C,0x66,0x66,0x3C,0x00,0x00,0x3C,0x66,0x3E,0x06,0x0C,0x38,0x00,
0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x18,0x18,0x30,
0x06,0x0C,0x18,0x30,0x18,0x0C,0x06,0x00,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,
0x60,0x30,0x18,0x0C,0x18,0x30,0x60,0x00,0x00,0x3C,0x66,0x0C,0x18,0x00,0x18,0x00,
0x00,0x3C,0x66,0x6E,0x6E,0x60,0x3E,0x00,0x00,0x18,0x3C,0x66,0x66,0x7E,0x66,0x00,
0x00,0x7C,0x66,0x7C,0x66,0x66,0x7C,0x00,0x00,0x3C,0x66,0x60,0x60,0x66,0x3C,0x00,
0x00,0x78,0x6C,0x66,0x66,0x6C,0x78,0x00,0x00,0x7E,0x60,0x7C,0x60,0x60,0x7E,0x00,
0x00,0x7E,0x60,0x7C,0x60,0x60,0x60,0x00,0x00,0x3E,0x60,0x60,0x6E,0x66,0x3E,0x00,
0x00,0x66,0x66,0x7E,0x66,0x66,0x66,0x00,0x00,0x7E,0x18,0x18,0x18,0x18,0x7E,0x00,
0x00,0x06,0x06,0x06,0x06,0x66,0x3C,0x00,0x00,0x66,0x6C,0x78,0x78,0x6C,0x66,0x00,
0x00,0x60,0x60,0x60,0x60,0x60,0x7E,0x00,0x00,0x63,0x77,0x7F,0x6B,0x63,0x63,0x00,
0x00,0x66,0x76,0x7E,0x7E,0x6E,0x66,0x00,0x00,0x3C,0x66,0x66,0x66,0x66,0x3C,0x00,
0x00,0x7C,0x66,0x66,0x7C,0x60,0x60,0x00,0x00,0x3C,0x66,0x66,0x66,0x6C,0x36,0x00,
0x00,0x7C,0x66,0x66,0x7C,0x6C,0x66,0x00,0x00,0x3C,0x60,0x3C,0x06,0x06,0x3C,0x00,
0x00,0x7E,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x7E,0x00,
0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0x63,0x63,0x6B,0x7F,0x77,0x63,0x00,
0x00,0x66,0x66,0x3C,0x3C,0x66,0x66,0x00,0x00,0x66,0x66,0x3C,0x18,0x18,0x18,0x00,
0x00,0x7E,0x0C,0x18,0x30,0x60,0x7E,0x00,0x00,0x1E,0x18,0x18,0x18,0x18,0x1E,0x00,
0x00,0x40,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,0x78,0x18,0x18,0x18,0x18,0x78,0x00,
0x00,0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,
0x00,0x36,0x7F,0x7F,0x3E,0x1C,0x08,0x00,0x18,0x18,0x18,0x1F,0x1F,0x18,0x18,0x18,
0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x18,0x18,0x18,0xF8,0xF8,0x00,0x00,0x00,
0x18,0x18,0x18,0xF8,0xF8,0x18,0x18,0x18,0x00,0x00,0x00,0xF8,0xF8,0x18,0x18,0x18,
0x03,0x07,0x0E,0x1C,0x38,0x70,0xE0,0xC0,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x07,0x03,
0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,0x00,0x00,0x00,0x00,0x0F,0x0F,0x0F,0x0F,
0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE,0xFF,0x0F,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x00,
0xF0,0xF0,0xF0,0xF0,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,
0x00,0x1C,0x1C,0x77,0x77,0x08,0x1C,0x00,0x00,0x00,0x00,0x1F,0x1F,0x18,0x18,0x18,
0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x18,0x18,0x18,0xFF,0xFF,0x18,0x18,0x18,
0x00,0x00,0x3C,0x7E,0x7E,0x7E,0x3C,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,
0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0xFF,0xFF,0x18,0x18,0x18,
0x18,0x18,0x18,0xFF,0xFF,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,
0x18,0x18,0x18,0x1F,0x1F,0x00,0x00,0x00,0x78,0x60,0x78,0x60,0x7E,0x18,0x1E,0x00,
0x00,0x18,0x3C,0x7E,0x18,0x18,0x18,0x00,0x00,0x18,0x18,0x18,0x7E,0x3C,0x18,0x00,
0x00,0x18,0x30,0x7E,0x30,0x18,0x00,0x00,0x00,0x18,0x0C,0x7E,0x0C,0x18,0x00,0x00,
0x00,0x18,0x3C,0x7E,0x7E,0x3C,0x18,0x00,0x00,0x00,0x3C,0x06,0x3E,0x66,0x3E,0x00,
0x00,0x60,0x60,0x7C,0x66,0x66,0x7C,0x00,0x00,0x00,0x3C,0x60,0x60,0x60,0x3C,0x00,
0x00,0x06,0x06,0x3E,0x66,0x66,0x3E,0x00,0x00,0x00,0x3C,0x66,0x7E,0x60,0x3C,0x00,
0x00,0x0E,0x18,0x3E,0x18,0x18,0x18,0x00,0x00,0x00,0x3E,0x66,0x66,0x3E,0x06,0x7C,
0x00,0x60,0x60,0x7C,0x66,0x66,0x66,0x00,0x00,0x18,0x00,0x38,0x18,0x18,0x3C,0x00,
0x00,0x06,0x00,0x06,0x06,0x06,0x06,0x3C,0x00,0x60,0x60,0x6C,0x78,0x6C,0x66,0x00,
0x00,0x38,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x66,0x7F,0x7F,0x6B,0x63,0x00,
0x00,0x00,0x7C,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x3C,0x66,0x66,0x66,0x3C,0x00,
0x00,0x00,0x7C,0x66,0x66,0x7C,0x60,0x60,0x00,0x00,0x3E,0x66,0x66,0x3E,0x06,0x06,
0x00,0x00,0x7C,0x66,0x60,0x60,0x60,0x00,0x00,0x00,0x3E,0x60,0x3C,0x06,0x7C,0x00,
0x00,0x18,0x7E,0x18,0x18,0x18,0x0E,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x3E,0x00,
0x00,0x00,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0x00,0x63,0x6B,0x7F,0x3E,0x36,0x00,
0x00,0x00,0x66,0x3C,0x18,0x3C,0x66,0x00,0x00,0x00,0x66,0x66,0x66,0x3E,0x0C,0x78,
0x00,0x00,0x7E,0x0C,0x18,0x30,0x7E,0x00,0x00,0x18,0x3C,0x7E,0x7E,0x18,0x3C,0x00,
0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x7E,0x78,0x7C,0x6E,0x66,0x06,0x00,
0x08,0x18,0x38,0x78,0x38,0x18,0x08,0x00,0x10,0x18,0x1C,0x1E,0x1C,0x18,0x10,0x00,
0xFB,0xF3,0x33,0xF6,0x3D,0xF6,0xA3,0xF6,0x33,0xF6,0x3C,0xF6,0x4C,0xE4,0xF3,0x00,
0xF5,0xF3,0x33,0xF6,0x92,0xF5,0xB6,0xF5,0x33,0xF6,0xFB,0xFC,0x4C,0xE4,0xF3,0x00,
0x33,0xF6,0x33,0xF6,0xE1,0xF6,0x3C,0xF6,0x33,0xF6,0x3C,0xF6,0x4C,0xE4,0xF3,0x00,
0x9E,0xEE,0xDB,0xEE,0x9D,0xEE,0xA6,0xEE,0x80,0xEE,0x9D,0xEE,0x4C,0x78,0xEE,0x00,
0x4B,0xEF,0x2A,0xF0,0xD5,0xEF,0x0F,0xF0,0x27,0xF0,0x4A,0xEF,0x4C,0x41,0xEF,0x00,
0x4C,0xEA,0xED,0x4C,0xF0,0xED,0x4C,0xC4,0xE4,0x4C,0x59,0xE9,0x4C,0xED,0xE8,0x4C,
0xAE,0xE7,0x4C,0x05,0xE9,0x4C,0x44,0xE9,0x4C,0xF2,0xEB,0x4C,0xD5,0xE6,0x4C,0xA6,
0xE4,0x4C,0x23,0xF2,0x4C,0x1B,0xF1,0x4C,0x25,0xF1,0x4C,0xE9,0xEF,0x4C,0x5D,0xEF,
0x90,0xE7,0x8F,0xE7,0x8F,0xE7,0x8F,0xE7,0xBE,0xFF,0x0F,0xEB,0x90,0xEA,0xCF,0xEA,
0x8F,0xE7,0x8F,0xE7,0x8F,0xE7,0x06,0xE7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xAE,0xE7,0x05,0xE9,0xA2,0x00,0xA9,0xFF,0x9D,0x40,0x03,0xA9,0xC0,0x9D,
0x46,0x03,0xA9,0xE4,0x9D,0x47,0x03,0x8A,0x18,0x69,0x10,0xAA,0xC9,0x80,0x90,0xE8,
0x60,0xA0,0x85,0x60,0x85,0x2F,0x86,0x2E,0x8A,0x29,0x0F,0xD0,0x04,0xE0,0x80,0x90,
0x05,0xA0,0x86,0x4C,0x1B,0xE6,0xA0,0x00,0xBD,0x40,0x03,0x99,0x20,0x00,0xE8,0xC8,
0xC0,0x0C,0x90,0xF4,0xA0,0x84,0xA5,0x22,0xC9,0x03,0x90,0x25,0xA8,0xC0,0x0E,0x90,
0x02,0xA0,0x0E,0x84,0x17,0xB9,0xC6,0xE6,0xF0,0x0F,0xC9,0x02,0xF0,0x35,0xC9,0x08,
0xB0,0x4C,0xC9,0x04,0xF0,0x63,0x4C,0xC9,0xE5,0xA5,0x20,0xC9,0xFF,0xF0,0x05,0xA0,
0x81,0x4C,0x1B,0xE6,0x20,0x9E,0xE6,0xB0,0xF8,0x20,0x3D,0xE6,0xB0,0xF3,0x20,0x89,
0xE6,0xA9,0x0B,0x85,0x17,0x20,0x3D,0xE6,0xA5,0x2C,0x85,0x26,0xA5,0x2D,0x85,0x27,
0x4C,0x1D,0xE6,0xA0,0x01,0x84,0x23,0x20,0x3D,0xE6,0xB0,0x03,0x20,0x89,0xE6,0xA9,
0xFF,0x85,0x20,0xA9,0xE4,0x85,0x27,0xA9,0xC0,0x85,0x26,0x4C,0x1D,0xE6,0xA5,0x20,
0xC9,0xFF,0xD0,0x05,0x20,0x9E,0xE6,0xB0,0xB8,0x20,0x3D,0xE6,0x20,0x89,0xE6,0xA6,
0x2E,0xBD,0x40,0x03,0x85,0x20,0x4C,0x1D,0xE6,0xA5,0x22,0x25,0x2A,0xD0,0x05,0xA0,
0x83,0x4C,0x1B,0xE6,0x20,0x3D,0xE6,0xB0,0xF8,0xA5,0x28,0x05,0x29,0xD0,0x08,0x20,
0x89,0xE6,0x85,0x2F,0x4C,0x1D,0xE6,0x20,0x89,0xE6,0x85,0x2F,0x30,0x35,0xA0,0x00,
0x91,0x24,0x20,0x70,0xE6,0xA5,0x22,0x29,0x02,0xD0,0x0C,0xA5,0x2F,0xC9,0x9B,0xD0,
0x06,0x20,0x63,0xE6,0x4C,0xC3,0xE5,0x20,0x63,0xE6,0xD0,0xDB,0xA5,0x22,0x29,0x02,
0xD0,0x11,0x20,0x89,0xE6,0x85,0x2F,0x30,0x0A,0xA5,0x2F,0xC9,0x9B,0xD0,0xF3,0xA9,
0x89,0x85,0x23,0x20,0x77,0xE6,0x4C,0x1D,0xE6,0xA5,0x22,0x25,0x2A,0xD0,0x05,0xA0,
0x87,0x4C,0x1B,0xE6,0x20,0x3D,0xE6,0xB0,0xF8,0xA5,0x28,0x05,0x29,0xD0,0x06,0xA5,
0x2F,0xE6,0x28,0xD0,0x06,0xA0,0x00,0xB1,0x24,0x85,0x2F,0x20,0x89,0xE6,0x30,0x25,
0x20,0x70,0xE6,0xA5,0x22,0x29,0x02,0xD0,0x0C,0xA5,0x2F,0xC9,0x9B,0xD0,0x06,0x20,
0x63,0xE6,0x4C,0x15,0xE6,0x20,0x63,0xE6,0xD0,0xDB,0xA5,0x22,0x29,0x02,0xD0,0x05,
0xA9,0x9B,0x20,0x89,0xE6,0x20,0x77,0xE6,0x4C,0x1D,0xE6,0x84,0x23,0xA4,0x2E,0xB9,
0x44,0x03,0x85,0x24,0xB9,0x45,0x03,0x85,0x25,0xA2,0x00,0xB5,0x20,0x99,0x40,0x03,
0xE8,0xC8,0xE0,0x0C,0x90,0xF5,0xA5,0x2F,0xA6,0x2E,0xA4,0x23,0x60,0xA4,0x20,0xC0,
0x22,0x90,0x04,0xA0,0x85,0xB0,0x1B,0xB9,0x1B,0x03,0x85,0x2C,0xB9,0x1C,0x03,0x85,
0x2D,0xA4,0x17,0xB9,0xC6,0xE6,0xA8,0xB1,0x2C,0xAA,0xC8,0xB1,0x2C,0x85,0x2D,0x86,
0x2C,0x18,0x60,0xC6,0x28,0xA5,0x28,0xC9,0xFF,0xD0,0x02,0xC6,0x29,0x05,0x29,0x60,
0xE6,0x24,0xD0,0x02,0xE6,0x25,0x60,0xA6,0x2E,0x38,0xBD,0x48,0x03,0xE5,0x28,0x85,
0x28,0xBD,0x49,0x03,0xE5,0x29,0x85,0x29,0x60,0xA0,0x92,0x20,0x93,0xE6,0x84,0x23,
0xC0,0x00,0x60,0xAA,0xA5,0x2D,0x48,0xA5,0x2C,0x48,0x8A,0xA6,0x2E,0x60,0xA0,0x00,
0xB1,0x24,0xF0,0x0C,0xA0,0x21,0xD9,0x1A,0x03,0xF0,0x0A,0x88,0x88,0x88,0x10,0xF6,
0xA0,0x82,0x38,0xB0,0x13,0x98,0x85,0x20,0x38,0xA0,0x01,0xB1,0x24,0xE9,0x30,0xC9,
0x0A,0x90,0x02,0xA9,0x01,0x85,0x21,0x18,0x60,0x00,0x04,0x04,0x04,0x04,0x06,0x06,
0x06,0x06,0x02,0x08,0x0A,0xA9,0x40,0x8D,0x0E,0xD4,0xA9,0x38,0x8D,0x02,0xD3,0x8D,
0x03,0xD3,0xA9,0x00,0x8D,0x00,0xD3,0xEA,0xEA,0xEA,0xA9,0x3C,0x8D,0x02,0xD3,0x8D,
0x03,0xD3,0x60,0x6C,0x16,0x02,0x80,0x40,0x04,0x02,0x01,0x08,0x10,0x20,0x36,0x08,
0x14,0x12,0x10,0x0E,0x0C,0x0A,0x48,0xAD,0x0E,0xD2,0x29,0x20,0xD0,0x0D,0xA9,0xDF,
0x8D,0x0E,0xD2,0xA5,0x10,0x8D,0x0E,0xD2,0x6C,0x0A,0x02,0x8A,0x48,0xA2,0x06,0xBD,
0xF6,0xE6,0xE0,0x05,0xD0,0x04,0x25,0x10,0xF0,0x05,0x2C,0x0E,0xD2,0xF0,0x06,0xCA,
0x10,0xED,0x4C,0x62,0xE7,0x49,0xFF,0x8D,0x0E,0xD2,0xA5,0x10,0x8D,0x0E,0xD2,0xBD,
0xFE,0xE6,0xAA,0xBD,0x00,0x02,0x8D,0x8C,0x02,0xBD,0x01,0x02,0x8D,0x8D,0x02,0x68,
0xAA,0x6C,0x8C,0x02,0xA9,0x00,0x85,0x11,0x8D,0xFF,0x02,0x8D,0xF0,0x02,0x85,0x4D,
0x68,0x40,0x68,0xAA,0x2C,0x02,0xD3,0x10,0x06,0xAD,0x00,0xD3,0x6C,0x02,0x02,0x2C,
0x03,0xD3,0x10,0x06,0xAD,0x01,0xD3,0x6C,0x04,0x02,0x68,0x8D,0x8C,0x02,0x68,0x48,
0x29,0x10,0xF0,0x07,0xAD,0x8C,0x02,0x48,0x6C,0x06,0x02,0xAD,0x8C,0x02,0x48,0x68,
0x40,0x2C,0x0F,0xD4,0x10,0x03,0x6C,0x00,0x02,0x48,0xAD,0x0F,0xD4,0x29,0x20,0xF0,
0x03,0x4C,0x74,0xE4,0x8A,0x48,0x98,0x48,0x8D,0x0F,0xD4,0x6C,0x22,0x02,0xE6,0x14,
0xD0,0x08,0xE6,0x4D,0xE6,0x13,0xD0,0x02,0xE6,0x12,0xA9,0xFE,0xA2,0x00,0xA4,0x4D,
0x10,0x06,0x85,0x4D,0xA6,0x13,0xA9,0xF6,0x85,0x4E,0x86,0x4F,0xA2,0x00,0x20,0xD0,
0xE8,0xD0,0x03,0x20,0xCA,0xE8,0xA5,0x42,0xD0,0x08,0xBA,0xBD,0x04,0x01,0x29,0x04,
0xF0,0x03,0x4C,0x05,0xE9,0xAD,0x0D,0xD4,0x8D,0x35,0x02,0xAD,0x0C,0xD4,0x8D,0x34,
0x02,0xAD,0x31,0x02,0x8D,0x03,0xD4,0xAD,0x30,0x02,0x8D,0x02,0xD4,0xAD,0x2F,0x02,
0x8D,0x00,0xD4,0xAD,0x6F,0x02,0x8D,0x1B,0xD0,0xA2,0x08,0x8E,0x1F,0xD0,0x58,0xBD,
0xC0,0x02,0x45,0x4F,0x25,0x4E,0x9D,0x12,0xD0,0xCA,0x10,0xF2,0xAD,0xF4,0x02,0x8D,
0x09,0xD4,0xAD,0xF3,0x02,0x8D,0x01,0xD4,0xA2,0x02,0x20,0xD0,0xE8,0xD0,0x03,0x20,
0xCD,0xE8,0xA2,0x02,0xE8,0xE8,0xBD,0x18,0x02,0x1D,0x19,0x02,0xF0,0x06,0x20,0xD0,
0xE8,0x9D,0x26,0x02,0xE0,0x08,0xD0,0xEC,0xAD,0x0F,0xD2,0x29,0x04,0xF0,0x08,0xAD,
0xF1,0x02,0xF0,0x03,0xCE,0xF1,0x02,0xAD,0x2B,0x02,0xF0,0x17,0xAD,0x0F,0xD2,0x29,
0x04,0xD0,0x60,0xCE,0x2B,0x02,0xD0,0x0B,0xA9,0x06,0x8D,0x2B,0x02,0xAD,0x09,0xD2,
0x8D,0xFC,0x02,0xA0,0x01,0xA2,0x03,0xB9,0x00,0xD3,0x4A,0x4A,0x4A,0x4A,0x9D,0x78,
0x02,0xCA,0xB9,0x00,0xD3,0x29,0x0F,0x9D,0x78,0x02,0xCA,0x88,0x10,0xE9,0xA2,0x03,
0xBD,0x10,0xD0,0x9D,0x84,0x02,0xBD,0x00,0xD2,0x9D,0x70,0x02,0xBD,0x04,0xD2,0x9D,
0x74,0x02,0xCA,0x10,0xEB,0x8D,0x0B,0xD2,0xA2,0x06,0xA0,0x03,0xB9,0x78,0x02,0x4A,
0x4A,0x4A,0x9D,0x7D,0x02,0xA9,0x00,0x2A,0x9D,0x7C,0x02,0xCA,0xCA,0x88,0x10,0xEC,
0x6C,0x24,0x02,0xA9,0x00,0x8D,0x2B,0x02,0xF0,0xA9,0x6C,0x26,0x02,0x6C,0x28,0x02,
0xBC,0x18,0x02,0xD0,0x08,0xBC,0x19,0x02,0xF0,0x10,0xDE,0x19,0x02,0xDE,0x18,0x02,
0xD0,0x08,0xBC,0x19,0x02,0xD0,0x03,0xA9,0x00,0x60,0xA9,0xFF,0x60,0x0A,0x8D,0x2D,
0x02,0x8A,0xA2,0x05,0x8D,0x0A,0xD4,0xCA,0xD0,0xFD,0xAE,0x2D,0x02,0x9D,0x17,0x02,
0x98,0x9D,0x16,0x02,0x60,0x68,0xA8,0x68,0xAA,0x68,0x40,0x66,0x66,0x7E,0x66,0x00,
0x00,0x7C,0x4C,0xED,0xE8,0x66,0x7C,0x00,0x00,0x3C,0x66,0x60,0x60,0x66,0x3C,0x00,
0x00,0x78,0x6C,0x66,0x66,0x6C,0x78,0x00,0x00,0x7E,0x60,0x7C,0x60,0x60,0x7E,0x00,
0x00,0x7E,0x60,0x7C,0x60,0x60,0x60,0x00,0x00,0x3E,0x60,0x60,0x6E,0x66,0x3E,0x00,
0x00,0x66,0x66,0x7E,0xA9,0x3C,0x8D,0x02,0xD3,0xA9,0x3C,0x8D,0x03,0xD3,0xA9,0x03,
0x8D,0x32,0x02,0x85,0x41,0x8D,0x0F,0xD2,0x60,0xBA,0x8E,0x18,0x03,0xA9,0x01,0x85,
0x42,0xAD,0x00,0x03,0xC9,0x60,0xD0,0x03,0x4C,0x80,0xEB,0xA9,0x00,0x8D,0x0F,0x03,
0xA9,0x01,0x85,0x37,0xA9,0x0D,0x85,0x36,0xA9,0x28,0x8D,0x04,0xD2,0xA9,0x00,0x8D,
0x06,0xD2,0x18,0xAD,0x00,0x03,0x6D,0x01,0x03,0x69,0xFF,0x8D,0x3A,0x02,0xAD,0x02,
0x03,0x8D,0x3B,0x02,0xAD,0x0A,0x03,0x8D,0x3C,0x02,0xAD,0x0B,0x03,0x8D,0x3D,0x02,
0x18,0xA9,0x3A,0x85,0x32,0x69,0x04,0x85,0x34,0xA9,0x02,0x85,0x33,0x85,0x35,0xA9,
0x34,0x8D,0x03,0xD3,0x20,0x8A,0xEC,0xAD,0x3F,0x02,0xD0,0x03,0x98,0xD0,0x07,0xC6,
0x36,0x10,0xB5,0x4C,0x06,0xEA,0xAD,0x03,0x03,0x10,0x0C,0xA9,0x0D,0x85,0x36,0x20,
0x6A,0xEB,0x20,0x8A,0xEC,0xF0,0xE8,0x20,0x75,0xEC,0xA9,0x00,0x8D,0x3F,0x02,0x20,
0x9B,0xEC,0xF0,0x12,0x2C,0x03,0x03,0x70,0x07,0xAD,0x3F,0x02,0xD0,0x18,0xF0,0x1D,
0x20,0x6A,0xEB,0x20,0xE0,0xEA,0xAD,0x3F,0x02,0xF0,0x05,0xAD,0x19,0x03,0x85,0x30,
0xA5,0x30,0xC9,0x01,0xF0,0x07,0xC6,0x37,0x30,0x03,0x4C,0x74,0xE9,0x20,0x5F,0xEC,
0xA9,0x00,0x85,0x42,0xA4,0x30,0x8C,0x03,0x03,0x60,0xA9,0x00,0x8D,0x3F,0x02,0x18,
0xA9,0x3E,0x85,0x32,0x69,0x01,0x85,0x34,0xA9,0x02,0x85,0x33,0x85,0x35,0xA9,0xFF,
0x85,0x3C,0x20,0xE0,0xEA,0xA0,0xFF,0xA5,0x30,0xC9,0x01,0xD0,0x19,0xAD,0x3E,0x02,
0xC9,0x41,0xF0,0x21,0xC9,0x43,0xF0,0x1D,0xC9,0x45,0xD0,0x06,0xA9,0x90,0x85,0x30,
0xD0,0x04,0xA9,0x8B,0x85,0x30,0xA5,0x30,0xC9,0x8A,0xF0,0x07,0xA9,0xFF,0x8D,0x3F,
0x02,0xD0,0x02,0xA0,0x00,0xA5,0x30,0x8D,0x19,0x03,0x60,0xA9,0x01,0x85,0x30,0x20,
0xF2,0xEB,0xA0,0x00,0x84,0x31,0x84,0x3B,0x84,0x3A,0xB1,0x32,0x8D,0x0D,0xD2,0x85,
0x31,0xA5,0x11,0xD0,0x03,0x4C,0xA0,0xED,0xA5,0x3A,0xF0,0xF5,0x20,0x5F,0xEC,0x60,
0x98,0x48,0xE6,0x32,0xD0,0x02,0xE6,0x33,0xA5,0x32,0xC5,0x34,0xA5,0x33,0xE5,0x35,
0x90,0x1C,0xA5,0x3B,0xD0,0x0B,0xA5,0x31,0x8D,0x0D,0xD2,0xA9,0xFF,0x85,0x3B,0xD0,
0x09,0xA5,0x10,0x09,0x08,0x85,0x10,0x8D,0x0E,0xD2,0x68,0xA8,0x68,0x40,0xA0,0x00,
0xB1,0x32,0x8D,0x0D,0xD2,0x18,0x65,0x31,0x69,0x00,0x85,0x31,0x4C,0xBA,0xEA,0xA5,
0x3B,0xF0,0x0B,0x85,0x3A,0xA5,0x10,0x29,0xF7,0x85,0x10,0x8D,0x0E,0xD2,0x68,0x40,
0xA9,0x00,0xAC,0x0F,0x03,0xD0,0x02,0x85,0x31,0x85,0x38,0x85,0x39,0xA9,0x01,0x85,
0x30,0x20,0x1B,0xEC,0xA9,0x3C,0x8D,0x03,0xD3,0xA5,0x11,0xD0,0x03,0x4C,0xA0,0xED,
0xAD,0x17,0x03,0xF0,0x05,0xA5,0x39,0xF0,0xF0,0x60,0xA9,0x8A,0x85,0x30,0x60,0x98,
0x48,0xAD,0x0F,0xD2,0x8D,0x0A,0xD2,0x30,0x04,0xA0,0x8C,0x84,0x30,0x29,0x20,0xD0,
0x04,0xA0,0x8E,0x84,0x30,0xA5,0x38,0xF0,0x13,0xAD,0x0D,0xD2,0xC5,0x31,0xF0,0x04,
0xA0,0x8F,0x84,0x30,0xA9,0xFF,0x85,0x39,0x68,0xA8,0x68,0x40,0xAD,0x0D,0xD2,0xA0,
0x00,0x91,0x32,0x18,0x65,0x31,0x69,0x00,0x85,0x31,0xE6,0x32,0xD0,0x02,0xE6,0x33,
0xA5,0x32,0xC5,0x34,0xA5,0x33,0xE5,0x35,0x90,0xDE,0xA5,0x3C,0xF0,0x06,0xA9,0x00,
0x85,0x3C,0xF0,0xD0,0xA9,0xFF,0x85,0x38,0xD0,0xCE,0x18,0xAD,0x04,0x03,0x85,0x32,
0x6D,0x08,0x03,0x85,0x34,0xAD,0x05,0x03,0x85,0x33,0x6D,0x09,0x03,0x85,0x35,0x60,
0xAD,0x03,0x03,0x10,0x2E,0xA9,0xCC,0x8D,0x04,0xD2,0xA9,0x05,0x8D,0x06,0xD2,0x20,
0xF2,0xEB,0xA0,0x0F,0xAD,0x0B,0x03,0x30,0x02,0xA0,0xB4,0xA2,0x00,0x20,0xB9,0xED,
0xA9,0x34,0x8D,0x02,0xD3,0xAD,0x17,0x03,0xD0,0xFB,0x20,0x6A,0xEB,0x20,0x6B,0xEA,
0x4C,0xDF,0xEB,0xA9,0xFF,0x8D,0x0F,0x03,0xA0,0x0A,0xAD,0x0B,0x03,0x30,0x02,0xA0,
0x78,0xA2,0x00,0x20,0xB9,0xED,0xA9,0x34,0x8D,0x02,0xD3,0xAD,0x17,0x03,0xD0,0xFB,
0x20,0x6A,0xEB,0x20,0x75,0xEC,0x20,0xB9,0xED,0x20,0x10,0xED,0x20,0xE0,0xEA,0xAD,
0x0B,0x03,0x30,0x05,0xA9,0x3C,0x8D,0x02,0xD3,0x4C,0x0D,0xEA,0xA9,0x00,0x8D,0x17,
0x03,0x60,0xA9,0x07,0x2D,0x32,0x02,0x09,0x20,0xAC,0x00,0x03,0xC0,0x60,0xD0,0x0C,
0x09,0x08,0xA0,0x07,0x8C,0x02,0xD2,0xA0,0x05,0x8C,0x00,0xD2,0x8D,0x32,0x02,0x8D,
0x0F,0xD2,0xA9,0xC7,0x25,0x10,0x09,0x10,0x4C,0x31,0xEC,0xA9,0x07,0x2D,0x32,0x02,
0x09,0x10,0x8D,0x32,0x02,0x8D,0x0F,0xD2,0x8D,0x0A,0xD2,0xA9,0xC7,0x25,0x10,0x09,
0x20,0x85,0x10,0x8D,0x0E,0xD2,0xA9,0x28,0x8D,0x08,0xD2,0xA2,0x06,0xA9,0xA8,0xA4,
0x41,0xD0,0x02,0xA9,0xA0,0x9D,0x01,0xD2,0xCA,0xCA,0x10,0xF9,0xA9,0xA0,0x8D,0x05,
0xD2,0xAC,0x00,0x03,0xC0,0x60,0xF0,0x06,0x8D,0x01,0xD2,0x8D,0x03,0xD2,0x60,0xEA,
0xA9,0xC7,0x25,0x10,0x85,0x10,0x8D,0x0E,0xD2,0xA2,0x06,0xA9,0x00,0x9D,0x01,0xD2,
0xCA,0xCA,0x10,0xF9,0x60,0xAD,0x06,0x03,0x6A,0x6A,0xA8,0x29,0x3F,0xAA,0x98,0x6A,
0x29,0xC0,0xA8,0x60,0x0F,0xEB,0x90,0xEA,0xCF,0xEA,0xA2,0x01,0xA0,0xFF,0x88,0xD0,
0xFD,0xCA,0xD0,0xF8,0x20,0x6B,0xEA,0xA0,0x02,0xA2,0x00,0x20,0xB9,0xED,0x20,0x1A,
0xEA,0x98,0x60,0x8D,0x10,0x03,0x8C,0x11,0x03,0x20,0x04,0xED,0x8D,0x10,0x03,0xAD,
0x0C,0x03,0x20,0x04,0xED,0x8D,0x0C,0x03,0xAD,0x10,0x03,0x38,0xED,0x0C,0x03,0x8D,
0x12,0x03,0xAD,0x11,0x03,0x38,0xED,0x0D,0x03,0xA8,0xA9,0x7D,0x18,0x69,0x83,0x88,
0x10,0xFA,0x18,0x6D,0x12,0x03,0xA8,0x4A,0x4A,0x4A,0x0A,0x38,0xE9,0x16,0xAA,0x98,
0x29,0x07,0xA8,0xA9,0xF5,0x18,0x69,0x0B,0x88,0x10,0xFA,0xA0,0x00,0x8C,0x0E,0x03,
0x38,0xE9,0x07,0x10,0x03,0xCE,0x0E,0x03,0x18,0x7D,0xD0,0xED,0xA8,0xAD,0x0E,0x03,
0x7D,0xD1,0xED,0x60,0xC9,0x7C,0x30,0x04,0x38,0xE9,0x7C,0x60,0x18,0x69,0x07,0x60,
0xA5,0x11,0xD0,0x03,0x4C,0xA0,0xED,0x78,0xAD,0x17,0x03,0xD0,0x02,0xF0,0x25,0xAD,
0x0F,0xD2,0x29,0x10,0xD0,0xEA,0x8D,0x16,0x03,0xAE,0x0B,0xD4,0xA4,0x14,0x8E,0x0C,
0x03,0x8C,0x0D,0x03,0xA2,0x01,0x8E,0x15,0x03,0xA0,0x0A,0xA5,0x11,0xF0,0x61,0xAD,
0x17,0x03,0xD0,0x04,0x58,0x4C,0x0A,0xEB,0xAD,0x0F,0xD2,0x29,0x10,0xCD,0x16,0x03,
0xF0,0xE9,0x8D,0x16,0x03,0x88,0xD0,0xE3,0xCE,0x15,0x03,0x30,0x12,0xAD,0x0B,0xD4,
0xA4,0x14,0x20,0xA3,0xEC,0x8C,0xEE,0x02,0x8D,0xEF,0x02,0xA0,0x09,0xD0,0xCC,0xAD,
0xEE,0x02,0x8D,0x04,0xD2,0xAD,0xEF,0x02,0x8D,0x06,0xD2,0xA9,0x00,0x8D,0x0F,0xD2,
0xAD,0x32,0x02,0x8D,0x0F,0xD2,0xA9,0x55,0x91,0x32,0xC8,0x91,0x32,0xA9,0xAA,0x85,
0x31,0x18,0xA5,0x32,0x69,0x02,0x85,0x32,0xA5,0x33,0x69,0x00,0x85,0x33,0x58,0x60,
0x20,0x5F,0xEC,0xA9,0x3C,0x8D,0x02,0xD3,0x8D,0x03,0xD3,0xA9,0x80,0x85,0x30,0xAE,
0x18,0x03,0x9A,0xC6,0x11,0x58,0x4C,0x0D,0xEA,0xA9,0xEC,0x8D,0x26,0x02,0xA9,0xEB,
0x8D,0x27,0x02,0xA9,0x01,0x78,0x20,0x5C,0xE4,0xA9,0x01,0x8D,0x17,0x03,0x58,0x60,
0xE8,0x03,0x43,0x04,0x9E,0x04,0xF9,0x04,0x54,0x05,0xAF,0x05,0x0A,0x06,0x65,0x06,
0xC0,0x06,0x1A,0x07,0x75,0x07,0xD0,0x07,0x24,0x85,0xA9,0xA0,0x8D,0x46,0x02,0x60,
0xA9,0x31,0x8D,0x00,0x03,0xAD,0x46,0x02,0xAE,0x02,0x03,0xE0,0x21,0xF0,0x02,0xA9,
0x07,0x8D,0x06,0x03,0xA2,0x40,0xA0,0x80,0xAD,0x02,0x03,0xC9,0x57,0xD0,0x02,0xA2,
0x80,0xC9,0x53,0xD0,0x0C,0xA9,0xEA,0x8D,0x04,0x03,0xA9,0x02,0x8D,0x05,0x03,0xA0,
0x04,0x8E,0x03,0x03,0x8C,0x08,0x03,0xA9,0x00,0x8D,0x09,0x03,0x20,0x59,0xE4,0x10,
0x01,0x60,0xAD,0x02,0x03,0xC9,0x53,0xD0,0x0A,0x20,0x6D,0xEE,0xA0,0x02,0xB1,0x15,
0x8D,0x46,0x02,0xAD,0x02,0x03,0xC9,0x21,0xD0,0x1F,0x20,0x6D,0xEE,0xA0,0xFE,0xC8,
0xC8,0xB1,0x15,0xC9,0xFF,0xD0,0xF8,0xC8,0xB1,0x15,0xC8,0xC9,0xFF,0xD0,0xF2,0x88,
0x88,0x8C,0x08,0x03,0xA9,0x00,0x8D,0x09,0x03,0xAC,0x03,0x03,0x60,0xAD,0x04,0x03,
0x85,0x15,0xAD,0x05,0x03,0x85,0x16,0x60,0xA9,0x1E,0x85,0x1C,0x60,0xEA,0x02,0xC0,
0x03,0xA9,0x04,0x85,0x1E,0xAE,0x7D,0xEE,0xAC,0x7E,0xEE,0xA9,0x53,0x8D,0x02,0x03,
0x8D,0x0A,0x03,0x20,0xE6,0xEE,0x20,0x59,0xE4,0x30,0x03,0x20,0x14,0xEF,0x60,0x20,
0x81,0xEE,0xA9,0x00,0x85,0x1D,0x60,0x85,0x1F,0x20,0x1A,0xEF,0xA6,0x1D,0xA5,0x1F,
0x9D,0xC0,0x03,0xE8,0xE4,0x1E,0xF0,0x13,0x86,0x1D,0xC9,0x9B,0xF0,0x03,0xA0,0x01,
0x60,0xA9,0x20,0x9D,0xC0,0x03,0xE8,0xE4,0x1E,0xD0,0xF8,0xA9,0x00,0x85,0x1D,0xAE,
0x7F,0xEE,0xAC,0x80,0xEE,0x20,0xE6,0xEE,0x20,0x59,0xE4,0x60,0x20,0x1A,0xEF,0xA6,
0x1D,0xD0,0xDE,0xA0,0x01,0x60,0x8E,0x04,0x03,0x8C,0x05,0x03,0xA9,0x40,0x8D,0x00,
0x03,0xA9,0x01,0x8D,0x01,0x03,0xA9,0x80,0xAE,0x02,0x03,0xE0,0x53,0xD0,0x02,0xA9,
0x40,0x8D,0x03,0x03,0xA5,0x1E,0x8D,0x08,0x03,0xA9,0x00,0x8D,0x09,0x03,0xA5,0x1C,
0x8D,0x06,0x03,0x60,0xAD,0xEC,0x02,0x85,0x1C,0x60,0xA0,0x57,0xA5,0x2B,0xC9,0x4E,
0xD0,0x04,0xA2,0x28,0xD0,0x0E,0xC9,0x44,0xD0,0x04,0xA2,0x14,0xD0,0x06,0xC9,0x53,
0xD0,0x0B,0xA2,0x1D,0x86,0x1E,0x8C,0x02,0x03,0x8D,0x0A,0x03,0x60,0xA9,0x4E,0xD0,
0xDD,0xA9,0xCC,0x8D,0xEE,0x02,0xA9,0x05,0x8D,0xEF,0x02,0x60,0xA5,0x2B,0x85,0x3E,
0xA5,0x2A,0x29,0x0C,0xC9,0x04,0xF0,0x05,0xC9,0x08,0xF0,0x39,0x60,0xA9,0x00,0x8D,
0x89,0x02,0x85,0x3F,0xA9,0x01,0x20,0x58,0xF0,0x30,0x24,0xA9,0x34,0x8D,0x02,0xD3,
0xA0,0x40,0xA2,0x02,0xA9,0x03,0x8D,0x2A,0x02,0x20,0x5C,0xE4,0xAD,0x2A,0x02,0xD0,
0xFB,0xA9,0x80,0x85,0x3D,0x8D,0x8A,0x02,0x4C,0xD3,0xEF,0xA0,0x80,0xC6,0x11,0xA9,
0x00,0x8D,0x89,0x02,0x60,0xA9,0x80,0x8D,0x89,0x02,0xA9,0x02,0x20,0x58,0xF0,0x30,
0xEE,0xA9,0xCC,0x8D,0x04,0xD2,0xA9,0x05,0x8D,0x06,0xD2,0xA9,0x60,0x8D,0x00,0x03,
0x20,0x68,0xE4,0xA9,0x34,0x8D,0x02,0xD3,0xA9,0x03,0xA2,0x04,0xA0,0x80,0x20,0x5C,
0xE4,0xA9,0xFF,0x8D,0x2A,0x02,0xA5,0x11,0xF0,0xC1,0xAD,0x2A,0x02,0xD0,0xF7,0xA9,
0x00,0x85,0x3D,0xA0,0x01,0x60,0xA5,0x3F,0x30,0x33,0xA6,0x3D,0xEC,0x8A,0x02,0xF0,
0x08,0xBD,0x00,0x04,0xE6,0x3D,0xA0,0x01,0x60,0xA9,0x52,0x20,0x95,0xF0,0x98,0x30,
0xF7,0xA9,0x00,0x85,0x3D,0xA2,0x80,0xAD,0xFF,0x03,0xC9,0xFE,0xF0,0x0D,0xC9,0xFA,
0xD0,0x03,0xAE,0x7F,0x04,0x8E,0x8A,0x02,0x4C,0xD6,0xEF,0xC6,0x3F,0xA0,0x88,0x60,
0xA6,0x3D,0x9D,0x00,0x04,0xE6,0x3D,0xA0,0x01,0xE0,0x7F,0xF0,0x01,0x60,0xA9,0xFC,
0x20,0xD2,0xF0,0xA9,0x00,0x85,0x3D,0x60,0xA0,0x01,0x60,0xAD,0x89,0x02,0x30,0x08,
0xA0,0x01,0xA9,0x3C,0x8D,0x02,0xD3,0x60,0xA6,0x3D,0xF0,0x0A,0x8E,0x7F,0x04,0xA9,
0xFA,0x20,0xD2,0xF0,0x30,0xEC,0xA2,0x7F,0xA9,0x00,0x9D,0x00,0x04,0xCA,0x10,0xFA,
0xA9,0xFE,0x20,0xD2,0xF0,0x4C,0x32,0xF0,0x85,0x40,0xA5,0x14,0x18,0x69,0x1E,0xAA,
0xA9,0xFF,0x8D,0x1F,0xD0,0xA9,0x00,0xA0,0xF0,0x88,0xD0,0xFD,0x8D,0x1F,0xD0,0xA0,
0xF0,0x88,0xD0,0xFD,0xE4,0x14,0xD0,0xE8,0xC6,0x40,0xF0,0x0B,0x8A,0x18,0x69,0x0A,
0xAA,0xE4,0x14,0xD0,0xFC,0xF0,0xD3,0x20,0x8C,0xF0,0x98,0x60,0xAD,0x25,0xE4,0x48,
0xAD,0x24,0xE4,0x48,0x60,0x8D,0x02,0x03,0xA9,0x00,0x8D,0x09,0x03,0xA9,0x83,0x8D,
0x08,0x03,0xA9,0x03,0x8D,0x05,0x03,0xA9,0xFD,0x8D,0x04,0x03,0xA9,0x60,0x8D,0x00,
0x03,0xA9,0x00,0x8D,0x01,0x03,0xA9,0x23,0x8D,0x06,0x03,0xAD,0x02,0x03,0xA0,0x40,
0xC9,0x52,0xF0,0x02,0xA0,0x80,0x8C,0x03,0x03,0xA5,0x3E,0x8D,0x0B,0x03,0x20,0x59,
0xE4,0x60,0x8D,0xFF,0x03,0xA9,0x55,0x8D,0xFD,0x03,0x8D,0xFE,0x03,0xA9,0x57,0x20,
0x95,0xF0,0x60,0x50,0x30,0xE4,0x43,0x40,0xE4,0x45,0x00,0xE4,0x53,0x10,0xE4,0x4B,
0x20,0xE4,0x7D,0x41,0x54,0x41,0x52,0x49,0x20,0x43,0x4F,0x4D,0x50,0x55,0x54,0x45,
0x52,0x20,0x2D,0x20,0x4D,0x45,0x4D,0x4F,0x20,0x50,0x41,0x44,0x9B,0x42,0x4F,0x4F,
0x54,0x20,0x45,0x52,0x52,0x4F,0x52,0x9B,0x45,0x3A,0x9B,0x78,0xAD,0x44,0x02,0xD0,
0x04,0xA9,0xFF,0xD0,0x03,0x78,0xA9,0x00,0x85,0x08,0xD8,0xA2,0xFF,0x9A,0x20,0x44,
0xF2,0x20,0x77,0xF2,0xA5,0x08,0xD0,0x28,0xA9,0x00,0xA0,0x08,0x85,0x04,0x85,0x05,
0x91,0x04,0xC8,0xC0,0x00,0xD0,0xF9,0xE6,0x05,0xA6,0x05,0xE4,0x06,0xD0,0xF1,0xAD,
0x72,0xE4,0x85,0x0A,0xAD,0x73,0xE4,0x85,0x0B,0xA9,0xFF,0x8D,0x44,0x02,0xD0,0x13,
0xA2,0x00,0x8A,0x9D,0x00,0x02,0x9D,0x00,0x03,0xCA,0xD0,0xF7,0xA2,0x10,0x95,0x00,
0xE8,0x10,0xFB,0xA9,0x02,0x85,0x52,0xA9,0x27,0x85,0x53,0xA2,0x25,0xBD,0x80,0xE4,
0x9D,0x00,0x02,0xCA,0x10,0xF7,0x20,0x8A,0xF2,0x58,0xA2,0x0E,0xBD,0xE3,0xF0,0x9D,
0x1A,0x03,0xCA,0x10,0xF7,0xA2,0x00,0x86,0x07,0x86,0x06,0xAE,0xE4,0x02,0xE0,0x90,
0xB0,0x0A,0xAD,0xFC,0x9F,0xD0,0x05,0xE6,0x07,0x20,0x3C,0xF2,0xAE,0xE4,0x02,0xE0,
0xB0,0xB0,0x0A,0xAE,0xFC,0xBF,0xD0,0x05,0xE6,0x06,0x20,0x39,0xF2,0xA9,0x03,0xA2,
0x00,0x9D,0x42,0x03,0xA9,0x18,0x9D,0x44,0x03,0xA9,0xF1,0x9D,0x45,0x03,0xA9,0x0C,
0x9D,0x4A,0x03,0x20,0x56,0xE4,0x10,0x03,0x4C,0x25,0xF1,0xE8,0xD0,0xFD,0xC8,0x10,
0xFA,0x20,0xB2,0xF3,0xA5,0x06,0x05,0x07,0xF0,0x12,0xA5,0x06,0xF0,0x03,0xAD,0xFD,
0xBF,0xA6,0x07,0xF0,0x03,0x0D,0xFD,0x9F,0x29,0x01,0xF0,0x03,0x20,0xCF,0xF2,0xA9,
0x00,0x8D,0x44,0x02,0xA5,0x06,0xF0,0x0A,0xAD,0xFD,0xBF,0x29,0x04,0xF0,0x03,0x6C,
0xFA,0xBF,0xA5,0x07,0xF0,0x0A,0xAD,0xFD,0x9F,0x29,0x04,0xF0,0xDF,0x6C,0xFA,0x9F,
0x6C,0x0A,0x00,0xA2,0xF2,0xA0,0xF0,0x20,0x85,0xF3,0x20,0x30,0xF2,0x4C,0x2A,0xF2,
0xAD,0x05,0xE4,0x48,0xAD,0x04,0xE4,0x48,0x60,0x6C,0xFE,0xBF,0x6C,0xFE,0x9F,0xC9,
0xD0,0xD0,0x1C,0x60,0xEE,0xFC,0xBF,0xAD,0xFC,0xBF,0xD0,0x08,0xAD,0xFD,0xBF,0x10,
0x03,0x6C,0xFE,0xBF,0xCE,0xFC,0xBF,0xA0,0x00,0x84,0x05,0xA9,0x10,0x85,0x06,0xB1,
0x05,0x49,0xFF,0x91,0x05,0xD1,0x05,0xD0,0xDA,0x49,0xFF,0x91,0x05,0xA5,0x06,0x18,
0x69,0x10,0x85,0x06,0x4C,0x3F,0xF2,0xA9,0x00,0xAA,0x9D,0x00,0xD0,0x9D,0x00,0xD4,
0x9D,0x00,0xD2,0xEA,0xEA,0xEA,0xE8,0xD0,0xF1,0x60,0xC6,0x11,0xA9,0x54,0x8D,0x36,
0x02,0xA9,0xE7,0x8D,0x37,0x02,0xA5,0x06,0x8D,0xE4,0x02,0x8D,0xE6,0x02,0xA9,0x00,
0x8D,0xE5,0x02,0xA9,0x00,0x8D,0xE7,0x02,0xA9,0x07,0x8D,0xE8,0x02,0x20,0x0C,0xE4,
0x20,0x1C,0xE4,0x20,0x2C,0xE4,0x20,0x3C,0xE4,0x20,0x4C,0xE4,0x20,0x6E,0xE4,0x20,
0x65,0xE4,0x20,0x6B,0xE4,0xAD,0x1F,0xD0,0x29,0x01,0xD0,0x02,0xE6,0x4A,0x60,0xA5,
0x08,0xF0,0x0A,0xA5,0x09,0x29,0x01,0xF0,0x03,0x20,0x7E,0xF3,0x60,0xA9,0x01,0x8D,
0x01,0x03,0xA9,0x53,0x8D,0x02,0x03,0x20,0x53,0xE4,0x10,0x01,0x60,0xA9,0x00,0x8D,
0x0B,0x03,0xA9,0x01,0x8D,0x0A,0x03,0xA9,0x00,0x8D,0x04,0x03,0xA9,0x04,0x8D,0x05,
0x03,0x20,0x9D,0xF3,0x10,0x08,0x20,0x81,0xF3,0xA5,0x4B,0xF0,0xE0,0x60,0xA2,0x03,
0xBD,0x00,0x04,0x9D,0x40,0x02,0xCA,0x10,0xF7,0xAD,0x42,0x02,0x85,0x04,0xAD,0x43,
0x02,0x85,0x05,0xAD,0x04,0x04,0x85,0x0C,0xAD,0x05,0x04,0x85,0x0D,0xA0,0x7F,0xB9,
0x00,0x04,0x91,0x04,0x88,0x10,0xF8,0x18,0xA5,0x04,0x69,0x80,0x85,0x04,0xA5,0x05,
0x69,0x00,0x85,0x05,0xCE,0x41,0x02,0xF0,0x11,0xEE,0x0A,0x03,0x20,0x9D,0xF3,0x10,
0xDC,0x20,0x81,0xF3,0xA5,0x4B,0xD0,0xAE,0xF0,0xF2,0xA5,0x4B,0xF0,0x03,0x20,0x9D,
0xF3,0x20,0x6C,0xF3,0xB0,0xA0,0x20,0x7E,0xF3,0xE6,0x09,0x60,0x18,0xAD,0x42,0x02,
0x69,0x06,0x85,0x04,0xAD,0x43,0x02,0x69,0x00,0x85,0x05,0x6C,0x04,0x00,0x6C,0x0C,
0x00,0xA2,0x0D,0xA0,0xF1,0x8A,0xA2,0x00,0x9D,0x44,0x03,0x98,0x9D,0x45,0x03,0xA9,
0x09,0x9D,0x42,0x03,0xA9,0xFF,0x9D,0x48,0x03,0x20,0x56,0xE4,0x60,0xA5,0x4B,0xF0,
0x03,0x4C,0x7A,0xE4,0xA9,0x52,0x8D,0x02,0x03,0xA9,0x01,0x8D,0x01,0x03,0x20,0x53,
0xE4,0x60,0xA5,0x08,0xF0,0x0A,0xA5,0x09,0x29,0x02,0xF0,0x03,0x20,0xE1,0xF3,0x60,
0xA5,0x4A,0xF0,0x1C,0xA9,0x80,0x85,0x3E,0xE6,0x4B,0x20,0x7D,0xE4,0x20,0x01,0xF3,
0xA9,0x00,0x85,0x4B,0x85,0x4A,0x06,0x09,0xA5,0x0C,0x85,0x02,0xA5,0x0D,0x85,0x03,
0x60,0x6C,0x02,0x00,0xA9,0xFF,0x8D,0xFC,0x02,0xAD,0xE6,0x02,0x29,0xF0,0x85,0x6A,
0xA9,0x40,0x8D,0xBE,0x02,0x60,0xA5,0x2B,0x29,0x0F,0xD0,0x08,0xA5,0x2A,0x29,0x0F,
0x85,0x2A,0xA9,0x00,0x85,0x57,0xA9,0xE0,0x8D,0xF4,0x02,0xA9,0x02,0x8D,0xF3,0x02,
0x8D,0x2F,0x02,0xA9,0x01,0x85,0x4C,0xA9,0xC0,0x05,0x10,0x85,0x10,0x8D,0x0E,0xD2,
0xA9,0x00,0x8D,0x93,0x02,0x85,0x64,0x85,0x7B,0x8D,0xF0,0x02,0xA0,0x0E,0xA9,0x01,
0x99,0xA3,0x02,0x88,0x10,0xFA,0xA2,0x04,0xBD,0xC1,0xFE,0x9D,0xC4,0x02,0xCA,0x10,
0xF7,0xA4,0x6A,0x88,0x8C,0x95,0x02,0xA9,0x60,0x8D,0x94,0x02,0xA6,0x57,0xBD,0x69,
0xFE,0xD0,0x04,0xA9,0x91,0x85,0x4C,0x85,0x51,0xA5,0x6A,0x85,0x65,0xBC,0x45,0xFE,
0xA9,0x28,0x20,0x21,0xF9,0x88,0xD0,0xF8,0xAD,0x6F,0x02,0x29,0x3F,0x85,0x67,0xA8,
0xE0,0x08,0x90,0x17,0x8A,0x6A,0x6A,0x6A,0x29,0xC0,0x05,0x67,0xA8,0xA9,0x10,0x20,
0x21,0xF9,0xE0,0x0B,0xD0,0x05,0xA9,0x06,0x8D,0xC8,0x02,0x8C,0x6F,0x02,0xA5,0x64,
0x85,0x58,0xA5,0x65,0x85,0x59,0xAD,0x0B,0xD4,0xC9,0x7A,0xD0,0xF9,0x20,0x1F,0xF9,
0xBD,0x75,0xFE,0xF0,0x06,0xA9,0xFF,0x85,0x64,0xC6,0x65,0xA5,0x64,0x85,0x68,0xA5,
0x65,0x85,0x69,0x20,0x13,0xF9,0xA9,0x41,0x20,0x17,0xF9,0x86,0x66,0xA9,0x18,0x8D,
0xBF,0x02,0xA5,0x57,0xC9,0x09,0xB0,0x2D,0xA5,0x2A,0x29,0x10,0xF0,0x27,0xA9,0x04,
0x8D,0xBF,0x02,0xA2,0x02,0xA9,0x02,0x20,0x17,0xF9,0xCA,0x10,0xF8,0xA4,0x6A,0x88,
0x98,0x20,0x17,0xF9,0xA9,0x60,0x20,0x17,0xF9,0xA9,0x42,0x20,0x17,0xF9,0x18,0xA9,
0x0C,0x65,0x66,0x85,0x66,0xA4,0x66,0xBE,0x51,0xFE,0xA5,0x51,0x20,0x17,0xF9,0xCA,
0xD0,0xF8,0xA5,0x57,0xC9,0x08,0x90,0x1C,0xA2,0x5D,0xA5,0x6A,0x38,0xE9,0x10,0x20,
0x17,0xF9,0xA9,0x00,0x20,0x17,0xF9,0xA9,0x4F,0x20,0x17,0xF9,0xA5,0x51,0x20,0x17,
0xF9,0xCA,0xD0,0xF8,0xA5,0x59,0x20,0x17,0xF9,0xA5,0x58,0x20,0x17,0xF9,0xA5,0x51,
0x09,0x40,0x20,0x17,0xF9,0xA9,0x70,0x20,0x17,0xF9,0xA9,0x70,0x20,0x17,0xF9,0xA5,
0x64,0x8D,0x30,0x02,0xA5,0x65,0x8D,0x31,0x02,0xA9,0x70,0x20,0x17,0xF9,0xA5,0x64,
0x8D,0xE5,0x02,0xA5,0x65,0x8D,0xE6,0x02,0xA5,0x68,0x85,0x64,0xA5,0x69,0x85,0x65,
0xAD,0x31,0x02,0x20,0x17,0xF9,0xAD,0x30,0x02,0x20,0x17,0xF9,0xA5,0x4C,0x10,0x07,
0x48,0x20,0xFC,0xF3,0x68,0xA8,0x60,0xA5,0x2A,0x29,0x20,0xD0,0x0B,0x20,0xB9,0xF7,
0x8D,0x90,0x02,0xA5,0x52,0x8D,0x91,0x02,0xA9,0x22,0x0D,0x2F,0x02,0x8D,0x2F,0x02,
0x4C,0x21,0xF6,0x20,0x96,0xFA,0x20,0xA2,0xF5,0x20,0x32,0xFB,0x20,0xD4,0xF9,0x4C,
0x34,0xF6,0x20,0x47,0xF9,0xB1,0x64,0x2D,0xA0,0x02,0x46,0x6F,0xB0,0x03,0x4A,0x10,
0xF9,0x8D,0xFA,0x02,0xC9,0x00,0x60,0x8D,0xFB,0x02,0x20,0x96,0xFA,0xAD,0xFB,0x02,
0xC9,0x7D,0xD0,0x06,0x20,0xB9,0xF7,0x4C,0x21,0xF6,0xAD,0xFB,0x02,0xC9,0x9B,0xD0,
0x06,0x20,0x30,0xFA,0x4C,0x21,0xF6,0x20,0xE0,0xF5,0x20,0xD8,0xF9,0x4C,0x21,0xF6,
0xAD,0xFF,0x02,0xD0,0xFB,0xA2,0x02,0xB5,0x54,0x95,0x5A,0xCA,0x10,0xF9,0xAD,0xFB,
0x02,0xA8,0x2A,0x2A,0x2A,0x2A,0x29,0x03,0xAA,0x98,0x29,0x9F,0x1D,0xF6,0xFE,0x8D,
0xFA,0x02,0x20,0x47,0xF9,0xAD,0xFA,0x02,0x46,0x6F,0xB0,0x04,0x0A,0x4C,0x08,0xF6,
0x2D,0xA0,0x02,0x85,0x50,0xAD,0xA0,0x02,0x49,0xFF,0x31,0x64,0x05,0x50,0x91,0x64,
0x60,0x20,0xA2,0xF5,0x85,0x5D,0xA6,0x57,0xD0,0x0A,0xAE,0xF0,0x02,0xD0,0x05,0x49,
0x80,0x20,0xFF,0xF5,0xA4,0x4C,0xA9,0x01,0x85,0x4C,0xAD,0xFB,0x02,0x60,0x20,0xB3,
0xFC,0x20,0x88,0xFA,0xA5,0x6B,0xD0,0x34,0xA5,0x54,0x85,0x6C,0xA5,0x55,0x85,0x6D,
0x20,0xE2,0xF6,0x84,0x4C,0xAD,0xFB,0x02,0xC9,0x9B,0xF0,0x12,0x20,0xAD,0xF6,0x20,
0xB3,0xFC,0xA5,0x63,0xC9,0x71,0xD0,0x03,0x20,0x0A,0xF9,0x4C,0x50,0xF6,0x20,0xE4,
0xFA,0x20,0x00,0xFC,0xA5,0x6C,0x85,0x54,0xA5,0x6D,0x85,0x55,0xA5,0x6B,0xF0,0x11,
0xC6,0x6B,0xF0,0x0D,0xA5,0x4C,0x30,0xF8,0x20,0x93,0xF5,0x8D,0xFB,0x02,0x4C,0xB3,
0xFC,0x20,0x30,0xFA,0xA9,0x9B,0x8D,0xFB,0x02,0x20,0x21,0xF6,0x84,0x4C,0x4C,0xB3,
0xFC,0x6C,0x64,0x00,0x8D,0xFB,0x02,0x20,0xB3,0xFC,0x20,0x88,0xFA,0x20,0xE4,0xFA,
0x20,0x8D,0xFC,0xF0,0x09,0x0E,0xA2,0x02,0x20,0xCA,0xF5,0x4C,0xB3,0xFC,0xAD,0xFE,
0x02,0x0D,0xA2,0x02,0xD0,0xEF,0x0E,0xA2,0x02,0xE8,0xBD,0xC6,0xFE,0x85,0x64,0xBD,
0xC7,0xFE,0x85,0x65,0x20,0xA1,0xF6,0x20,0x21,0xF6,0x4C,0xB3,0xFC,0xA9,0xFF,0x8D,
0xFC,0x02,0xA5,0x2A,0x4A,0xB0,0x62,0xA9,0x80,0xA6,0x11,0xF0,0x58,0xAD,0xFC,0x02,
0xC9,0xFF,0xF0,0xEE,0x85,0x7C,0xA2,0xFF,0x8E,0xFC,0x02,0x20,0xD8,0xFC,0xAA,0xE0,
0xC0,0x90,0x02,0xA2,0x03,0xBD,0xFE,0xFE,0x8D,0xFB,0x02,0xC9,0x80,0xF0,0xCE,0xC9,
0x81,0xD0,0x0B,0xAD,0xB6,0x02,0x49,0x80,0x8D,0xB6,0x02,0x4C,0xDD,0xF6,0xC9,0x82,
0xD0,0x07,0xA9,0x00,0x8D,0xBE,0x02,0xF0,0xB4,0xC9,0x83,0xD0,0x07,0xA9,0x40,0x8D,
0xBE,0x02,0xD0,0xA9,0xC9,0x84,0xD0,0x07,0xA9,0x80,0x8D,0xBE,0x02,0xD0,0x9E,0xC9,
0x85,0xD0,0x0A,0xA9,0x88,0x85,0x4C,0x85,0x11,0xA9,0x9B,0xD0,0x26,0xA5,0x7C,0xC9,
0x40,0xB0,0x15,0xAD,0xFB,0x02,0xC9,0x61,0x90,0x0E,0xC9,0x7B,0xB0,0x0A,0xAD,0xBE,
0x02,0xF0,0x05,0x05,0x7C,0x4C,0xFE,0xF6,0x20,0x8D,0xFC,0xF0,0x09,0xAD,0xFB,0x02,
0x4D,0xB6,0x02,0x8D,0xFB,0x02,0x4C,0x34,0xF6,0xA9,0x80,0x8D,0xA2,0x02,0x60,0xC6,
0x54,0x10,0x06,0xAE,0xBF,0x02,0xCA,0x86,0x54,0x4C,0x5C,0xFC,0xE6,0x54,0xA5,0x54,
0xCD,0xBF,0x02,0x90,0xF4,0xA2,0x00,0xF0,0xEE,0xC6,0x55,0xA5,0x55,0x30,0x04,0xC5,
0x52,0xB0,0x04,0xA5,0x53,0x85,0x55,0x4C,0xDD,0xFB,0xE6,0x55,0xA5,0x55,0xC5,0x53,
0x90,0xF5,0xF0,0xF3,0xA5,0x52,0x4C,0xA5,0xF7,0x20,0xF3,0xFC,0xA0,0x00,0x98,0x91,
0x64,0xC8,0xD0,0xFB,0xE6,0x65,0xA6,0x65,0xE4,0x6A,0x90,0xF3,0xA9,0xFF,0x99,0xB2,
0x02,0xC8,0xC0,0x04,0x90,0xF8,0x20,0xE4,0xFC,0x85,0x63,0x85,0x6D,0xA9,0x00,0x85,
0x54,0x85,0x56,0x85,0x6C,0x60,0xA5,0x63,0xC5,0x52,0xF0,0x21,0xA5,0x55,0xC5,0x52,
0xD0,0x03,0x20,0x73,0xFC,0x20,0x99,0xF7,0xA5,0x55,0xC5,0x53,0xD0,0x07,0xA5,0x54,
0xF0,0x03,0x20,0x7F,0xF7,0xA9,0x20,0x8D,0xFB,0x02,0x20,0xE0,0xF5,0x4C,0xDD,0xFB,
0x20,0xAA,0xF7,0xA5,0x55,0xC5,0x52,0xD0,0x0A,0x20,0x34,0xFA,0x20,0x20,0xFB,0x90,
0x02,0xB0,0x07,0xA5,0x63,0x20,0x25,0xFB,0x90,0xE6,0x4C,0xDD,0xFB,0xA5,0x63,0x4C,
0x06,0xFB,0xA5,0x63,0x4C,0x12,0xFB,0x20,0x9D,0xFC,0x20,0xA2,0xF5,0x85,0x7D,0xA9,
0x00,0x8D,0xBB,0x02,0x20,0xFF,0xF5,0xA5,0x63,0x48,0x20,0xDC,0xF9,0x68,0xC5,0x63,
0xB0,0x0C,0xA5,0x7D,0x48,0x20,0xA2,0xF5,0x85,0x7D,0x68,0x4C,0x44,0xF8,0x20,0xA8,
0xFC,0xCE,0xBB,0x02,0x30,0x04,0xC6,0x54,0xD0,0xF7,0x4C,0xDD,0xFB,0x20,0x9D,0xFC,
0x20,0x47,0xF9,0xA5,0x64,0x85,0x68,0xA5,0x65,0x85,0x69,0xA5,0x63,0x48,0x20,0xD4,
0xF9,0x68,0xC5,0x63,0xB0,0x10,0xA5,0x54,0xCD,0xBF,0x02,0xB0,0x09,0x20,0xA2,0xF5,
0xA0,0x00,0x91,0x68,0xF0,0xDA,0xA0,0x00,0x98,0x91,0x68,0x20,0x68,0xFC,0x20,0xA8,
0xFC,0x4C,0xDD,0xFB,0x38,0x20,0x7B,0xFB,0xA5,0x52,0x85,0x55,0x20,0x47,0xF9,0xA5,
0x64,0x85,0x68,0x18,0x69,0x28,0x85,0x66,0xA5,0x65,0x85,0x69,0x69,0x00,0x85,0x67,
0xA6,0x54,0xE0,0x17,0xF0,0x08,0x20,0x4E,0xFB,0xE8,0xE0,0x17,0xD0,0xF8,0x20,0x9B,
0xFB,0x4C,0xDD,0xFB,0x20,0xDD,0xFB,0xA4,0x51,0x84,0x54,0xA4,0x54,0x98,0x38,0x20,
0x23,0xFB,0x08,0x98,0x18,0x69,0x78,0x28,0x20,0x04,0xFB,0xC8,0xC0,0x18,0xD0,0xED,
0xAD,0xB4,0x02,0x09,0x01,0x8D,0xB4,0x02,0xA5,0x52,0x85,0x55,0x20,0x47,0xF9,0x20,
0xB7,0xFB,0x20,0x20,0xFB,0x90,0xD4,0x4C,0xDD,0xFB,0x60,0x20,0x20,0xD8,0xFC,0x88,
0x10,0xFA,0x60,0xA9,0x02,0xD0,0x0A,0xA4,0x4C,0x30,0x2B,0xA0,0x00,0x91,0x64,0xA9,
0x01,0x8D,0x9E,0x02,0xA5,0x4C,0x30,0x1E,0xA5,0x64,0x38,0xED,0x9E,0x02,0x85,0x64,
0xB0,0x02,0xC6,0x65,0xA5,0x0F,0xC5,0x65,0x90,0x0C,0xD0,0x06,0xA5,0x0E,0xC5,0x64,
0x90,0x04,0xA9,0x93,0x85,0x4C,0x60,0xA5,0x54,0x48,0xA5,0x55,0x48,0xA5,0x56,0x48,
0x20,0xF3,0xFC,0xA5,0x54,0x85,0x66,0xA9,0x00,0x85,0x67,0xA5,0x66,0x0A,0x26,0x67,
0x85,0x51,0xA4,0x67,0x8C,0x9F,0x02,0x0A,0x26,0x67,0x0A,0x26,0x67,0x18,0x65,0x51,
0x85,0x66,0xA5,0x67,0x6D,0x9F,0x02,0x85,0x67,0xA6,0x57,0xBC,0x81,0xFE,0x88,0x30,
0x07,0x06,0x66,0x26,0x67,0x4C,0x7E,0xF9,0xBC,0xA5,0xFE,0xA5,0x55,0xA2,0x07,0x88,
0x30,0x0A,0xCA,0x46,0x56,0x6A,0x6E,0xA1,0x02,0x4C,0x8F,0xF9,0xC8,0x18,0x65,0x66,
0x85,0x66,0x90,0x02,0xE6,0x67,0x38,0x6E,0xA1,0x02,0x18,0xCA,0x10,0xF9,0xAE,0xA1,
0x02,0xA5,0x66,0x18,0x65,0x64,0x85,0x64,0x85,0x5E,0xA5,0x67,0x65,0x65,0x85,0x65,
0x85,0x5F,0xBD,0xB1,0xFE,0x8D,0xA0,0x02,0x85,0x6F,0x68,0x85,0x56,0x68,0x85,0x55,
0x68,0x85,0x54,0x60,0xA9,0x00,0xF0,0x02,0xA9,0x9B,0x85,0x7D,0xE6,0x63,0xE6,0x55,
0xD0,0x02,0xE6,0x56,0xA5,0x55,0xA6,0x57,0xDD,0x8D,0xFE,0xF0,0x0B,0xE0,0x00,0xD0,
0x06,0xC5,0x53,0xF0,0x02,0xB0,0x01,0x60,0xE0,0x08,0x90,0x04,0xA5,0x56,0xF0,0xF7,
0xA5,0x57,0xD0,0x30,0xA5,0x63,0xC9,0x51,0x90,0x0A,0xA5,0x7D,0xF0,0x26,0x20,0x30,
0xFA,0x4C,0x77,0xFA,0x20,0x34,0xFA,0xA5,0x54,0x18,0x69,0x78,0x20,0x25,0xFB,0x90,
0x08,0xA5,0x7D,0xF0,0x04,0x18,0x20,0xA5,0xF8,0x4C,0xDD,0xFB,0xA9,0x00,0xF0,0x02,
0xA9,0x9B,0x85,0x7D,0x20,0xE4,0xFC,0xA9,0x00,0x85,0x56,0xE6,0x54,0xA6,0x57,0xA0,
0x18,0x24,0x7B,0x10,0x05,0xA0,0x04,0x98,0xD0,0x03,0xBD,0x99,0xFE,0xC5,0x54,0xD0,
0x26,0x8C,0x9D,0x02,0x8A,0xD0,0x20,0xA5,0x7D,0xF0,0x1C,0xC9,0x9B,0x38,0xF0,0x01,
0x18,0x20,0xAC,0xFB,0xEE,0xBB,0x02,0xC6,0x6C,0xCE,0x9D,0x02,0xAD,0xB2,0x02,0x38,
0x10,0xEF,0xAD,0x9D,0x02,0x85,0x54,0x4C,0xDD,0xFB,0x38,0xB5,0x70,0xE5,0x74,0x95,
0x70,0xB5,0x71,0xE5,0x75,0x95,0x71,0x60,0xAD,0xBF,0x02,0xC9,0x04,0xF0,0x07,0xA5,
0x57,0xF0,0x03,0x20,0xFC,0xF3,0xA9,0x27,0xC5,0x53,0xB0,0x02,0x85,0x53,0xA6,0x57,
0xBD,0x99,0xFE,0xC5,0x54,0x90,0x2A,0xF0,0x28,0xE0,0x08,0xD0,0x0A,0xA5,0x56,0xF0,
0x13,0xC9,0x01,0xD0,0x1C,0xF0,0x04,0xA5,0x56,0xD0,0x16,0xBD,0x8D,0xFE,0xC5,0x55,
0x90,0x0F,0xF0,0x0D,0xA9,0x01,0x85,0x4C,0xA9,0x80,0xA6,0x11,0x85,0x11,0xF0,0x06,
0x60,0x20,0xD6,0xF7,0xA9,0x8D,0x85,0x4C,0x68,0x68,0xA5,0x7B,0x10,0x03,0x20,0xB9,
0xFC,0x4C,0x34,0xF6,0xA0,0x00,0xA5,0x5D,0x91,0x5E,0x60,0x48,0x29,0x07,0xAA,0xBD,
0xB9,0xFE,0x85,0x6E,0x68,0x4A,0x4A,0x4A,0xAA,0x60,0x2E,0xB4,0x02,0x2E,0xB3,0x02,
0x2E,0xB2,0x02,0x60,0x90,0x0C,0x20,0xEB,0xFA,0xBD,0xA3,0x02,0x05,0x6E,0x9D,0xA3,
0x02,0x60,0x20,0xEB,0xFA,0xA5,0x6E,0x49,0xFF,0x3D,0xA3,0x02,0x9D,0xA3,0x02,0x60,
0xA5,0x54,0x18,0x69,0x78,0x20,0xEB,0xFA,0x18,0xBD,0xA3,0x02,0x25,0x6E,0xF0,0x01,
0x38,0x60,0xAD,0xFA,0x02,0xA4,0x57,0xC0,0x03,0xB0,0x0F,0x2A,0x2A,0x2A,0x2A,0x29,
0x03,0xAA,0xAD,0xFA,0x02,0x29,0x9F,0x1D,0xFA,0xFE,0x8D,0xFB,0x02,0x60,0xA9,0x02,
0x85,0x65,0xA9,0x47,0x85,0x64,0xA0,0x27,0xB1,0x66,0x85,0x50,0xB1,0x68,0x91,0x66,
0xA5,0x50,0x91,0x64,0x88,0x10,0xF1,0xA5,0x65,0x85,0x69,0xA5,0x64,0x85,0x68,0x18,
0xA5,0x66,0x69,0x28,0x85,0x66,0x90,0x02,0xE6,0x67,0x60,0x08,0xA0,0x17,0x98,0x20,
0x22,0xFB,0x08,0x98,0x18,0x69,0x79,0x28,0x20,0x04,0xFB,0x88,0x30,0x04,0xC4,0x54,
0xB0,0xEC,0xA5,0x54,0x18,0x69,0x78,0x28,0x4C,0x04,0xFB,0xA5,0x52,0x85,0x55,0x20,
0x47,0xF9,0xA0,0x27,0xA9,0x00,0x91,0x64,0x88,0x10,0xFB,0x60,0x20,0xFA,0xFA,0xA5,
0x58,0x85,0x64,0xA5,0x59,0x85,0x65,0xA0,0x28,0xB1,0x64,0xA6,0x6A,0xCA,0xE4,0x65,
0xD0,0x08,0xA2,0xD7,0xE4,0x64,0xB0,0x02,0xA9,0x00,0xA0,0x00,0x91,0x64,0xE6,0x64,
0xD0,0xE5,0xE6,0x65,0xA5,0x65,0xC5,0x6A,0xD0,0xDD,0x4C,0xDD,0xFB,0xA9,0x00,0x85,
0x63,0xA5,0x54,0x85,0x51,0xA5,0x51,0x20,0x22,0xFB,0xB0,0x0C,0xA5,0x63,0x18,0x69,
0x28,0x85,0x63,0xC6,0x51,0x4C,0xE5,0xFB,0x18,0xA5,0x63,0x65,0x55,0x85,0x63,0x60,
0x20,0x9D,0xFC,0xA5,0x63,0x48,0xA5,0x6C,0x85,0x54,0xA5,0x6D,0x85,0x55,0xA9,0x01,
0x85,0x6B,0xA2,0x17,0xA5,0x7B,0x10,0x02,0xA2,0x03,0xE4,0x54,0xD0,0x0B,0xA5,0x55,
0xC5,0x53,0xD0,0x05,0xE6,0x6B,0x4C,0x39,0xFC,0x20,0xD4,0xF9,0xE6,0x6B,0xA5,0x63,
0xC5,0x52,0xD0,0xDE,0xC6,0x54,0x20,0x99,0xF7,0x20,0xA2,0xF5,0xD0,0x17,0xC6,0x6B,
0xA5,0x63,0xC5,0x52,0xF0,0x0F,0x20,0x99,0xF7,0xA5,0x55,0xC5,0x53,0xD0,0x02,0xC6,
0x54,0xA5,0x6B,0xD0,0xE4,0x68,0x85,0x63,0x20,0xA8,0xFC,0x60,0x20,0xDD,0xFB,0xA5,
0x51,0x85,0x6C,0xA5,0x52,0x85,0x6D,0x60,0xA5,0x63,0xC5,0x52,0xD0,0x02,0xC6,0x54,
0x20,0xDD,0xFB,0xA5,0x63,0xC5,0x52,0xF0,0x13,0x20,0x47,0xF9,0xA5,0x53,0x38,0xE5,
0x52,0xA8,0xB1,0x64,0xD0,0x06,0x88,0x10,0xF9,0x4C,0xDB,0xF8,0x60,0xA2,0x2D,0xBD,
0xC6,0xFE,0xCD,0xFB,0x02,0xF0,0x05,0xCA,0xCA,0xCA,0x10,0xF3,0x60,0xA2,0x02,0xB5,
0x54,0x9D,0xB8,0x02,0xCA,0x10,0xF8,0x60,0xA2,0x02,0xBD,0xB8,0x02,0x95,0x54,0xCA,
0x10,0xF8,0x60,0x20,0xB9,0xFC,0x4C,0x34,0xF6,0xAD,0xBF,0x02,0xC9,0x18,0xF0,0x17,
0xA2,0x0B,0xB5,0x54,0x48,0xBD,0x90,0x02,0x95,0x54,0x68,0x9D,0x90,0x02,0xCA,0x10,
0xF1,0xA5,0x7B,0x49,0xFF,0x85,0x7B,0x60,0xA2,0x7F,0x8E,0x1F,0xD0,0x8E,0x0A,0xD4,
0xCA,0x10,0xF7,0x60,0xA9,0x00,0xA6,0x7B,0xD0,0x04,0xA6,0x57,0xD0,0x02,0xA5,0x52,
0x85,0x55,0x60,0xA5,0x58,0x85,0x64,0xA5,0x59,0x85,0x65,0x60,0xA2,0x00,0xA5,0x22,
0xC9,0x11,0xF0,0x08,0xC9,0x12,0xF0,0x03,0xA0,0x84,0x60,0xE8,0x8E,0xB7,0x02,0xA5,
0x54,0x85,0x60,0xA5,0x55,0x85,0x61,0xA5,0x56,0x85,0x62,0xA9,0x01,0x85,0x79,0x85,
0x7A,0x38,0xA5,0x60,0xE5,0x5A,0x85,0x76,0xB0,0x0D,0xA9,0xFF,0x85,0x79,0xA5,0x76,
0x49,0xFF,0x18,0x69,0x01,0x85,0x76,0x38,0xA5,0x61,0xE5,0x5B,0x85,0x77,0xA5,0x62,
0xE5,0x5C,0x85,0x78,0xB0,0x16,0xA9,0xFF,0x85,0x7A,0xA5,0x77,0x49,0xFF,0x85,0x77,
0xA5,0x78,0x49,0xFF,0x85,0x78,0xE6,0x77,0xD0,0x02,0xE6,0x78,0xA2,0x02,0xA0,0x00,
0x84,0x73,0x98,0x95,0x70,0xB5,0x5A,0x95,0x54,0xCA,0x10,0xF6,0xA5,0x77,0xE8,0xA8,
0xA5,0x78,0x85,0x7F,0x85,0x75,0xD0,0x0B,0xA5,0x77,0xC5,0x76,0xB0,0x05,0xA5,0x76,
0xA2,0x02,0xA8,0x98,0x85,0x7E,0x85,0x74,0x48,0xA5,0x75,0x4A,0x68,0x6A,0x95,0x70,
0xA5,0x7E,0x05,0x7F,0xD0,0x03,0x4C,0x42,0xFE,0x18,0xA5,0x70,0x65,0x76,0x85,0x70,
0x90,0x02,0xE6,0x71,0xA5,0x71,0xC5,0x75,0x90,0x14,0xD0,0x06,0xA5,0x70,0xC5,0x74,
0x90,0x0C,0x18,0xA5,0x54,0x65,0x79,0x85,0x54,0xA2,0x00,0x20,0x7A,0xFA,0x18,0xA5,
0x72,0x65,0x77,0x85,0x72,0xA5,0x73,0x65,0x78,0x85,0x73,0xC5,0x75,0x90,0x27,0xD0,
0x06,0xA5,0x72,0xC5,0x74,0x90,0x1F,0x24,0x7A,0x10,0x10,0xC6,0x55,0xA5,0x55,0xC9,
0xFF,0xD0,0x0E,0xA5,0x56,0xF0,0x0A,0xC6,0x56,0x10,0x06,0xE6,0x55,0xD0,0x02,0xE6,
0x56,0xA2,0x02,0x20,0x7A,0xFA,0x20,0x96,0xFA,0x20,0xE0,0xF5,0xAD,0xB7,0x02,0xF0,
0x2F,0x20,0x9D,0xFC,0xAD,0xFB,0x02,0x8D,0xBC,0x02,0xA5,0x54,0x48,0x20,0xDC,0xF9,
0x68,0x85,0x54,0x20,0x96,0xFA,0x20,0xA2,0xF5,0xD0,0x0C,0xAD,0xFD,0x02,0x8D,0xFB,
0x02,0x20,0xE0,0xF5,0x4C,0x0A,0xFE,0xAD,0xBC,0x02,0x8D,0xFB,0x02,0x20,0xA8,0xFC,
0x38,0xA5,0x7E,0xE9,0x01,0x85,0x7E,0xA5,0x7F,0xE9,0x00,0x85,0x7F,0x30,0x03,0x4C,
0x90,0xFD,0x4C,0x34,0xF6,0x18,0x10,0x0A,0x0A,0x10,0x1C,0x34,0x64,0xC4,0xC4,0xC4,
0xC4,0x17,0x17,0x0B,0x17,0x2F,0x2F,0x5F,0x5F,0x61,0x61,0x61,0x61,0x13,0x13,0x09,
0x13,0x27,0x27,0x4F,0x4F,0x41,0x41,0x41,0x41,0x02,0x06,0x07,0x08,0x09,0x0A,0x0B,
0x0D,0x0F,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,
0x01,0x02,0x01,0x01,0x00,0x00,0x01,0x01,0x02,0x02,0x02,0x02,0x02,0x28,0x14,0x14,
0x28,0x50,0x50,0xA0,0xA0,0x40,0x50,0x50,0x50,0x18,0x18,0x0C,0x18,0x30,0x30,0x60,
0x60,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x02,0x03,0x02,0x03,0x02,0x03,0x01,0x01,
0x01,0x00,0xFF,0xF0,0x0F,0xC0,0x30,0x0C,0x03,0x80,0x40,0x20,0x10,0x08,0x04,0x02,
0x01,0x28,0xCA,0x94,0x46,0x00,0x1B,0x79,0xF7,0x1C,0x7F,0xF7,0x1D,0x8C,0xF7,0x1E,
0x99,0xF7,0x1F,0xAA,0xF7,0x7D,0xB9,0xF7,0x7E,0xE6,0xF7,0x7F,0x10,0xF8,0x9B,0x30,
0xFA,0x9C,0xD4,0xF8,0x9D,0xA4,0xF8,0x9E,0x32,0xF8,0x9F,0x2D,0xF8,0xFD,0x0A,0xF9,
0xFE,0x6D,0xF8,0xFF,0x37,0xF8,0x40,0x00,0x20,0x60,0x20,0x40,0x00,0x60,0x6C,0x6A,
0x3B,0x80,0x80,0x6B,0x2B,0x2A,0x6F,0x80,0x70,0x75,0x9B,0x69,0x2D,0x3D,0x76,0x80,
0x63,0x80,0x80,0x62,0x78,0x7A,0x34,0x80,0x33,0x36,0x1B,0x35,0x32,0x31,0x2C,0x20,
0x2E,0x6E,0x80,0x6D,0x2F,0x81,0x72,0x80,0x65,0x79,0x7F,0x74,0x77,0x71,0x39,0x80,
0x30,0x37,0x7E,0x38,0x3C,0x3E,0x66,0x68,0x64,0x80,0x82,0x67,0x73,0x61,0x4C,0x4A,
0x3A,0x80,0x80,0x4B,0x5C,0x5E,0x4F,0x80,0x50,0x55,0x9B,0x49,0x5F,0x7C,0x56,0x80,
0x43,0x80,0x80,0x42,0x58,0x5A,0x24,0x80,0x23,0x26,0x1B,0x25,0x22,0x21,0x5B,0x20,
0x5D,0x4E,0x80,0x4D,0x3F,0x81,0x52,0x80,0x45,0x59,0x9F,0x54,0x57,0x51,0x28,0x80,
0x29,0x27,0x9C,0x40,0x7D,0x9D,0x46,0x48,0x44,0x80,0x83,0x47,0x53,0x41,0x0C,0x0A,
0x7B,0x80,0x80,0x0B,0x1E,0x1F,0x0F,0x80,0x10,0x15,0x9B,0x09,0x1C,0x1D,0x16,0x80,
0x03,0x80,0x80,0x02,0x18,0x1A,0x80,0x80,0x85,0x80,0x1B,0x80,0xFD,0x80,0x00,0x20,
0x60,0x0E,0x80,0x0D,0x80,0x81,0x12,0x80,0x05,0x19,0x9E,0x14,0x17,0x11,0x80,0x80,
0x80,0x80,0xFE,0x80,0x7D,0xFF,0x06,0x08,0x04,0x80,0x84,0x07,0x13,0x01,0xAD,0x09,
0xD2,0xCD,0xF2,0x02,0xD0,0x05,0xAD,0xF1,0x02,0xD0,0x20,0xAD,0x09,0xD2,0xC9,0x9F,
0xD0,0x0A,0xAD,0xFF,0x02,0x49,0xFF,0x8D,0xFF,0x02,0xB0,0x0F,0x8D,0xFC,0x02,0x8D,
0xF2,0x02,0xA9,0x03,0x8D,0xF1,0x02,0xA9,0x00,0x85,0x4D,0xA9,0x30,0x8D,0x2B,0x02,
0x68,0x40,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF3,0xE6,0x91,0xE7,0x25,0xF1,0xF3,0xE6,
};

Plik diff jest za duży Load Diff

Wyświetl plik

@ -0,0 +1,55 @@
/*
* sio.c - Serial I/O emulation
*
* Copyright (C) 1995-1998 David Firth
* Copyright (C) 1998-2010 Atari800 development team (see DOC/CREDITS)
*
* This file is part of the Atari800 emulator project which emulates
* the Atari 400, 800, 800XL, 130XE, and 5200 8-bit computers.
*
* Atari800 is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Atari800 is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Atari800; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#define _POSIX_C_SOURCE 200112L /* for snprintf */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "antic.h" /* ANTIC_ypos */
#include "atari.h"
#include "cpu.h"
#include "memory.h"
#include "pokey.h"
#include "pokeysnd.h"
#include "sio.h"
/* Put a byte that comes out of POKEY. So get it here... */
void SIO_PutByte(int byte)
{
}
/* Get a byte from the floppy to the pokey. */
int SIO_GetByte(void)
{
int byte = 0;
return byte;
}

Wyświetl plik

@ -0,0 +1,61 @@
#ifndef SIO_H_
#define SIO_H_
#include <stdio.h> /* FILENAME_MAX */
#include "atari.h"
#define SIO_MAX_DRIVES 8
typedef enum SIO_tagUnitStatus {
SIO_OFF,
SIO_NO_DISK,
SIO_READ_ONLY,
SIO_READ_WRITE
} SIO_UnitStatus;
extern char SIO_status[256];
extern SIO_UnitStatus SIO_drive_status[SIO_MAX_DRIVES];
extern char SIO_filename[SIO_MAX_DRIVES][FILENAME_MAX];
#define SIO_LAST_READ 0
#define SIO_LAST_WRITE 1
extern int SIO_last_op;
extern int SIO_last_op_time;
extern int SIO_last_drive; /* 1 .. 8 */
extern int SIO_last_sector;
int SIO_Mount(int diskno, const char *filename, int b_open_readonly);
void SIO_Dismount(int diskno);
void SIO_DisableDrive(int diskno);
int SIO_RotateDisks(void);
void SIO_Handler(void);
UBYTE SIO_ChkSum(const UBYTE *buffer, int length);
void SIO_SwitchCommandFrame(int onoff);
void SIO_PutByte(int byte);
int SIO_GetByte(void);
int SIO_Initialise(int *argc, char *argv[]);
void SIO_Exit(void);
/* Some defines about the serial I/O timing. Currently fixed! */
#define SIO_XMTDONE_INTERVAL 15
#define SIO_SERIN_INTERVAL 8
#define SIO_SEROUT_INTERVAL 8
#define SIO_ACK_INTERVAL 36
/* These functions are also used by the 1450XLD Parallel disk device */
extern int SIO_format_sectorcount[SIO_MAX_DRIVES];
extern int SIO_format_sectorsize[SIO_MAX_DRIVES];
int SIO_ReadStatusBlock(int unit, UBYTE *buffer);
int SIO_FormatDisk(int unit, UBYTE *buffer, int sectsize, int sectcount);
void SIO_SizeOfSector(UBYTE unit, int sector, int *sz, ULONG *ofs);
int SIO_ReadSector(int unit, int sector, UBYTE *buffer);
int SIO_DriveStatus(int unit, UBYTE *buffer);
int SIO_WriteStatusBlock(int unit, const UBYTE *buffer);
int SIO_WriteSector(int unit, int sector, const UBYTE *buffer);
void SIO_StateSave(void);
void SIO_StateRead(void);
#endif /* SIO_H_ */

Wyświetl plik

@ -0,0 +1,202 @@
extern "C" {
#include "iopins.h"
#include "emuapi.h"
}
extern "C" {
#include "atari800.h"
}
#ifdef HAS_T4_VGA
#include "vga_t_dma.h"
TFT_T_DMA tft;
#else
#include "tft_t_dma.h"
TFT_T_DMA tft = TFT_T_DMA(TFT_CS, TFT_DC, TFT_RST, TFT_MOSI, TFT_SCLK, TFT_MISO, TFT_TOUCH_CS, TFT_TOUCH_INT);
#endif
bool vgaMode = false;
static unsigned char palette8[PALETTE_SIZE];
static unsigned short palette16[PALETTE_SIZE];
static IntervalTimer myTimer;
volatile boolean vbl=true;
static int skip=0;
static elapsedMicros tius;
static void vblCount() {
if (vbl) {
vbl = false;
} else {
vbl = true;
}
}
void emu_SetPaletteEntry(unsigned char r, unsigned char g, unsigned char b, int index)
{
if (index<PALETTE_SIZE) {
//Serial.println("%d: %d %d %d\n", index, r,g,b);
palette8[index] = RGBVAL8(r,g,b);
palette16[index] = RGBVAL16(r,g,b);
}
}
void emu_DrawVsync(void)
{
volatile boolean vb=vbl;
skip += 1;
skip &= VID_FRAME_SKIP;
if (!vgaMode) {
#ifdef HAS_T4_VGA
// tft.waitSync();
#else
// while (vbl==vb) {};
#endif
while (vbl==vb) {};
}
}
void emu_DrawLine(unsigned char * VBuf, int width, int height, int line)
{
if (!vgaMode) {
#ifdef HAS_T4_VGA
tft.writeLine(width,1,line, VBuf, palette8);
#else
tft.writeLine(width,1,line, VBuf, palette16);
#endif
}
}
void emu_DrawLine8(unsigned char * VBuf, int width, int height, int line)
{
if (!vgaMode) {
if (skip==0) {
#ifdef HAS_T4_VGA
tft.writeLine(width,height,line, VBuf);
#endif
}
}
}
void emu_DrawLine16(unsigned short * VBuf, int width, int height, int line)
{
if (!vgaMode) {
if (skip==0) {
#ifdef HAS_T4_VGA
tft.writeLine16(width,height,line, VBuf);
#else
tft.writeLine(width,height,line, VBuf);
#endif
}
}
}
void emu_DrawScreen(unsigned char * VBuf, int width, int height, int stride)
{
if (!vgaMode) {
if (skip==0) {
#ifdef HAS_T4_VGA
tft.writeScreen(width,height-TFT_VBUFFER_YCROP,stride, VBuf+(TFT_VBUFFER_YCROP/2)*stride, palette8);
#else
tft.writeScreen(width,height-TFT_VBUFFER_YCROP,stride, VBuf+(TFT_VBUFFER_YCROP/2)*stride, palette16);
#endif
}
}
}
int emu_FrameSkip(void)
{
return skip;
}
void * emu_LineBuffer(int line)
{
if (!vgaMode) {
return (void*)tft.getLineBuffer(line);
}
}
// ****************************************************
// the setup() method runs once, when the sketch starts
// ****************************************************
void setup() {
#ifdef HAS_T4_VGA
tft.begin(VGA_MODE_320x240);
// NVIC_SET_PRIORITY(IRQ_QTIMER3, 0);
#else
tft.begin();
#endif
emu_init();
}
// ****************************************************
// the loop() method runs continuously
// ****************************************************
void loop(void)
{
if (menuActive()) {
uint16_t bClick = emu_DebounceLocalKeys();
int action = handleMenu(bClick);
char * filename = menuSelection();
if (action == ACTION_RUN1) {
toggleMenu(false);
vgaMode = false;
emu_start();
emu_Init(filename);
tft.fillScreenNoDma( RGBVAL16(0x00,0x00,0x00) );
tft.startDMA();
myTimer.begin(vblCount, 10000/*16666*/); //to run every 16.666ms
}
delay(20);
}
else {
emu_Step();
uint16_t bClick = emu_DebounceLocalKeys();
emu_Input(bClick);
}
}
#ifdef HAS_SND
#include "AudioPlaySystem.h"
AudioPlaySystem mymixer;
void emu_sndInit() {
Serial.println("sound init");
#ifdef HAS_T4_VGA
tft.begin_audio(256, mymixer.snd_Mixer);
#else
mymixer.begin_audio(256, mymixer.snd_Mixer);
#endif
// sgtl5000_1.enable();
// sgtl5000_1.volume(0.6);
mymixer.start();
}
void emu_sndPlaySound(int chan, int volume, int freq)
{
if (chan < 6) {
mymixer.sound(chan, freq, volume);
}
/*
Serial.print(chan);
Serial.print(":" );
Serial.print(volume);
Serial.print(":" );
Serial.println(freq);
*/
}
void emu_sndPlayBuzz(int size, int val) {
//mymixer.buzz(size,val);
//Serial.print((val==1)?1:0);
//Serial.print(":");
//Serial.println(size);
}
#endif

Wyświetl plik

@ -0,0 +1,232 @@
/*
Based on C64 ILI9341 dma driver from Frank Bösing, 2017
*/
#ifndef _TFT_T_DMAH_
#define _TFT_T_DMAH_
#ifdef __cplusplus
#include <Arduino.h>
#include <SPI.h>
#include <DMAChannel.h>
#endif
#include "tft_t_dma_config.h"
#define RGBVAL32(r,g,b) ( (r<<16) | (g<<8) | b )
#define RGBVAL16(r,g,b) ( (((r>>3)&0x1f)<<11) | (((g>>2)&0x3f)<<5) | (((b>>3)&0x1f)<<0) )
#define RGBVAL8(r,g,b) ( (((r>>5)&0x07)<<5) | (((g>>5)&0x07)<<2) | (((b>>6)&0x3)<<0) )
#define R16(rgb) ((rgb>>8)&0xf8)
#define G16(rgb) ((rgb>>3)&0xfc)
#define B16(rgb) ((rgb<<3)&0xf8)
#define PAL_COLOR_MASK 0xff
#ifdef LOHRES
#define TFT_WIDTH 240
#define TFT_REALWIDTH 240
#else
#define TFT_WIDTH 320
#define TFT_REALWIDTH 320
#endif
#define TFT_HEIGHT 240
#define TFT_REALHEIGHT 240
//#define WIDTH 272
//#define HEIGHT 228
#define LINES_PER_BLOCK 64
#define NR_OF_BLOCK 4
#define SCREEN_DMA_NUM_SETTINGS NR_OF_BLOCK
#ifdef ILI9341
#define ILI9341_NOP 0x00
#define ILI9341_SWRESET 0x01
#define ILI9341_RDDID 0x04
#define ILI9341_RDDST 0x09
#define ILI9341_SLPIN 0x10
#define ILI9341_SLPOUT 0x11
#define ILI9341_PTLON 0x12
#define ILI9341_NORON 0x13
#define ILI9341_RDMODE 0x0A
#define ILI9341_RDMADCTL 0x0B
#define ILI9341_RDPIXFMT 0x0C
#define ILI9341_RDIMGFMT 0x0D
#define ILI9341_RDSELFDIAG 0x0F
#define ILI9341_INVOFF 0x20
#define ILI9341_INVON 0x21
#define ILI9341_GAMMASET 0x26
#define ILI9341_DISPOFF 0x28
#define ILI9341_DISPON 0x29
#define ILI9341_CASET 0x2A
#define ILI9341_PASET 0x2B
#define ILI9341_RAMWR 0x2C
#define ILI9341_RAMRD 0x2E
#define ILI9341_PTLAR 0x30
#define ILI9341_MADCTL 0x36
#define ILI9341_VSCRSADD 0x37
#define ILI9341_PIXFMT 0x3A
#define ILI9341_FRMCTR1 0xB1
#define ILI9341_FRMCTR2 0xB2
#define ILI9341_FRMCTR3 0xB3
#define ILI9341_INVCTR 0xB4
#define ILI9341_DFUNCTR 0xB6
#define ILI9341_PWCTR1 0xC0
#define ILI9341_PWCTR2 0xC1
#define ILI9341_PWCTR3 0xC2
#define ILI9341_PWCTR4 0xC3
#define ILI9341_PWCTR5 0xC4
#define ILI9341_VMCTR1 0xC5
#define ILI9341_VMCTR2 0xC7
#define ILI9341_RDID1 0xDA
#define ILI9341_RDID2 0xDB
#define ILI9341_RDID3 0xDC
#define ILI9341_RDID4 0xDD
#define ILI9341_GMCTRP1 0xE0
#define ILI9341_GMCTRN1 0xE1
#define ILI9341_MADCTL_MY 0x80
#define ILI9341_MADCTL_MX 0x40
#define ILI9341_MADCTL_MV 0x20
#define ILI9341_MADCTL_ML 0x10
#define ILI9341_MADCTL_RGB 0x00
#define ILI9341_MADCTL_BGR 0x08
#define ILI9341_MADCTL_MH 0x04
#define TFT_CASET ILI9341_CASET
#define TFT_PASET ILI9341_PASET
#define TFT_RAMWR ILI9341_RAMWR
#define TFT_MADCTL ILI9341_MADCTL
#endif
#ifdef ST7789
#define ST7735_NOP 0x00
#define ST7735_SWRESET 0x01
#define ST7735_RDDID 0x04
#define ST7735_RDDST 0x09
#define ST7735_SLPIN 0x10
#define ST7735_SLPOUT 0x11
#define ST7735_PTLON 0x12
#define ST7735_NORON 0x13
#define ST7735_INVOFF 0x20
#define ST7735_INVON 0x21
#define ST7735_DISPOFF 0x28
#define ST7735_DISPON 0x29
#define ST7735_CASET 0x2A
#define ST7735_RASET 0x2B
#define ST7735_RAMWR 0x2C
#define ST7735_RAMRD 0x2E
#define ST7735_PTLAR 0x30
#define ST7735_COLMOD 0x3A
#define ST7735_MADCTL 0x36
#define ST7735_FRMCTR1 0xB1
#define ST7735_FRMCTR2 0xB2
#define ST7735_FRMCTR3 0xB3
#define ST7735_INVCTR 0xB4
#define ST7735_DISSET5 0xB6
#define ST7735_PWCTR1 0xC0
#define ST7735_PWCTR2 0xC1
#define ST7735_PWCTR3 0xC2
#define ST7735_PWCTR4 0xC3
#define ST7735_PWCTR5 0xC4
#define ST7735_VMCTR1 0xC5
#define ST7735_RDID1 0xDA
#define ST7735_RDID2 0xDB
#define ST7735_RDID3 0xDC
#define ST7735_RDID4 0xDD
#define ST7735_PWCTR6 0xFC
#define ST7735_GMCTRP1 0xE0
#define ST7735_GMCTRN1 0xE1
#define ST77XX_MADCTL_MY 0x80
#define ST77XX_MADCTL_MX 0x40
#define ST77XX_MADCTL_MV 0x20
#define ST77XX_MADCTL_ML 0x10
#define ST77XX_MADCTL_RGB 0x00
#define ST77XX_MADCTL_BGR 0x08
#define ST77XX_MADCTL_MH 0x04
#define TFT_CASET ST7735_CASET
#define TFT_PASET ST7735_RASET
#define TFT_RAMWR ST7735_RAMWR
#define TFT_MADCTL ST7735_MADCTL
#endif
#ifdef __cplusplus
class TFT_T_DMA
{
public:
TFT_T_DMA(uint8_t _CS, uint8_t _DC, uint8_t _RST = 255, uint8_t _MOSI=11, uint8_t _SCLK=13, uint8_t _MISO=12, uint8_t touch_cs=38, uint8_t touch_irq=37);
void setArea(uint16_t x1,uint16_t y1,uint16_t x2,uint16_t y2);
void begin(void);
void flipscreen(bool flip);
boolean isflipped(void);
void startDMA(void);
void stopDMA();
int get_frame_buffer_size(int *width, int *height);
// Touch screen functions
#define TOUCH_ENABLED() ((_touch_cs != 255) && (_touch_irq != 255))
bool isTouching(void) { return ((!TOUCH_ENABLED())?false:(digitalRead(_touch_irq) == LOW)); }
void readRaw(uint16_t * oX, uint16_t * oY, uint16_t * oZ);
void readCal(uint16_t * oX, uint16_t * oY, uint16_t * oZ);
void callibrateTouch(uint16_t xMin,uint16_t yMin,uint16_t xMax,uint16_t yMax);
// NoDMA functions
void writeScreenNoDma(const uint16_t *pcolors);
void fillScreenNoDma(uint16_t color);
void drawTextNoDma(int16_t x, int16_t y, const char * text, uint16_t fgcolor, uint16_t bgcolor, bool doublesize);
void drawRectNoDma(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
void drawSpriteNoDma(int16_t x, int16_t y, const uint16_t *bitmap);
void drawSpriteNoDma(int16_t x, int16_t y, const uint16_t *bitmap, uint16_t croparx, uint16_t cropary, uint16_t croparw, uint16_t croparh);
// DMA functions
uint16_t * getLineBuffer(int j);
void writeScreen(int width, int height, int stride, uint8_t *buffer, uint16_t *palette16);
void writeLine(int width, int height, int stride, uint8_t *buffer, uint16_t *palette16);
void writeLine(int width, int height, int y, uint16_t *buf);
void fillScreen(uint16_t color);
void drawText(int16_t x, int16_t y, const char * text, uint16_t fgcolor, uint16_t bgcolor, bool doublesize);
void drawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color);
void drawSprite(int16_t x, int16_t y, const uint16_t *bitmap);
void drawSprite(int16_t x, int16_t y, const uint16_t *bitmap, uint16_t croparx, uint16_t cropary, uint16_t croparw, uint16_t croparh);
protected:
uint8_t _rst, _cs, _dc;
uint8_t _miso, _mosi, _sclk;
uint8_t _touch_irq=255, _touch_cs=255;
bool flipped=false;
void wait(void);
void enableTouchIrq();
};
#endif
#endif

Wyświetl plik

@ -0,0 +1,13 @@
#include "platform_config.h"
//#define ST7789 1
//#define ILI9341 1
#define TFT_LINEARINT 1
#define LINEARINT_HACK 1
//#define FLIP_SCREEN 1
//#define TFT_DEBUG 1
#if defined(__IMXRT1052__) || defined(__IMXRT1062__)
//#define TFT_STATICFB 1
#endif

Wyświetl plik

@ -0,0 +1,53 @@
/*
Wrapping class to extend VGA_T4 to TFT_T_DMA
*/
#ifndef _VGA_T_DMAH_
#define _VGA_T_DMAH_
#ifdef __cplusplus
#include <VGA_t4.h>
#endif
#define RGBVAL16(r,g,b) ( (((r>>5)&0x07)<<5) | (((g>>5)&0x07)<<2) | (((b>>6)&0x3)<<0) )
#define RGBVAL8(r,g,b) ( (((r>>5)&0x07)<<5) | (((g>>5)&0x07)<<2) | (((b>>6)&0x3)<<0) )
#define TFT_WIDTH 320
#define TFT_REALWIDTH 320
#define TFT_HEIGHT 240
#define TFT_REALHEIGHT 240
#ifdef __cplusplus
class TFT_T_DMA: public VGA_T4
{
public:
// Fake touch screen functions
bool isTouching(void) { return false; }
void readRaw(uint16_t * oX, uint16_t * oY, uint16_t * oZ) { }
void readCal(uint16_t * oX, uint16_t * oY, uint16_t * oZ) { };
void callibrateTouch(uint16_t xMin,uint16_t yMin,uint16_t xMax,uint16_t yMax) { }
// fake DMA functions
void startDMA(void) { };
void stopDMA(void) { };
// fake no DMA functions
void writeScreenNoDma(const vga_pixel *pcolors) { writeScreen(pcolors); }
void fillScreenNoDma(vga_pixel color) { clear(color); }
void drawTextNoDma(int16_t x, int16_t y, const char * text, vga_pixel fgcolor, vga_pixel bgcolor, bool doublesize) { drawText(x,y,text,fgcolor,bgcolor,doublesize); }
void drawRectNoDma(int16_t x, int16_t y, int16_t w, int16_t h, vga_pixel color) { drawRect(x, y, w, h, color); }
void drawSpriteNoDma(int16_t x, int16_t y, const uint16_t *bitmap) { drawSprite(x, y, bitmap); }
void drawSpriteNoDma(int16_t x, int16_t y, const uint16_t *bitmap, uint16_t croparx, uint16_t cropary, uint16_t croparw, uint16_t croparh) { drawSprite(x, y, bitmap, croparx, cropary, croparw, croparh); }
};
#endif
#endif

Wyświetl plik

@ -1,20 +0,0 @@
#ifndef keyboard_osd_h_
#define keyboard_osd_h_
extern bool virtualkeyboardIsActive(void);
extern void drawVirtualkeyboard(void);
extern void toggleVirtualkeyboard(bool keepOn);
extern void handleVirtualkeyboard(void);
extern bool callibrationActive(void);
extern int handleCallibration(uint16_t bClick);
extern bool menuActive(void);
extern char * menuSelection(void);
extern void toggleMenu(bool on);
extern int handleMenu(uint16_t bClick);
#endif

Wyświetl plik

@ -2,7 +2,6 @@ extern "C" {
#include "iopins.h"
#include "emuapi.h"
}
#include "keyboard_osd.h"
#include "nes_emu.h"