add nofrendo to TEECOMPUTER

This commit is contained in:
jean-marcharvengt 2022-02-13 10:50:17 +01:00
parent c576104ae5
commit 62f7cf40b2
96 changed files with 40051 additions and 0 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -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

View file

@ -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

View file

@ -0,0 +1,150 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** bitmap.c
**
** Bitmap object manipulation routines
** $Id: bitmap.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include <stdio.h>
#include <string.h>
#include "noftypes.h"
#include "bitmap.h"
// JMH this file had to be adapted for the ESP
#include "emuapi.h"
void bmp_clear(const bitmap_t *bitmap, uint8 color)
{
memset(bitmap->data, color, bitmap->pitch * bitmap->height);
}
static bitmap_t *_make_bitmap(uint8 *data_addr, bool hw, int width,
int height, int pitch, int overdraw)
{
bitmap_t *bitmap;
int i;
/* quick safety check */
if (NULL == data_addr)
return NULL;
/* Make sure to add in space for line pointers */
bitmap = emu_Malloc(sizeof(bitmap_t) + (sizeof(uint8 *) * height));
if (NULL == bitmap)
{
return NULL;
}
bitmap->hardware = hw;
bitmap->height = height;
bitmap->width = width;
bitmap->data = data_addr;
bitmap->pitch = pitch + (overdraw * 2);
/* Set up line pointers */
/* we want to make some 32-bit aligned adjustment
** if we haven't been given a hardware bitmap
*/
//printf("setting up bitmap %d\n",(int)bitmap);
for (i = 0; i < height; i++) {
bitmap->line[i] = emu_LineBuffer(i);
}
return bitmap;
}
static char fb[1];
/* Allocate and initialize a bitmap structure */
bitmap_t *bmp_create(int width, int height, int overdraw)
{
// uint8 *addr;
// int pitch;
//
// pitch = width + (overdraw * 2); /* left and right */
// addr = malloc((pitch * height) + 3); /* add max 32-bit aligned adjustment */
// if (NULL == addr)
// return NULL;
//printf("bmp_create\n");
return _make_bitmap((uint8*)fb, false, width, height, width, overdraw);
}
/* allocate and initialize a hardware bitmap */
bitmap_t *bmp_createhw(uint8 *addr, int width, int height, int pitch)
{
return _make_bitmap(addr, true, width, height, pitch, 0); /* zero overdraw */
}
/* Deallocate space for a bitmap structure */
void bmp_destroy(bitmap_t **bitmap)
{
if (*bitmap)
{
free(*bitmap);
*bitmap = NULL;
}
}
/*
** $Log: bitmap.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.16 2000/11/05 16:37:18 matt
** rolled rgb.h into bitmap.h
**
** Revision 1.15 2000/10/10 13:58:13 matt
** stroustrup squeezing his way in the door
**
** Revision 1.14 2000/09/18 02:06:48 matt
** -pedantic is your friend
**
** Revision 1.13 2000/08/13 13:16:30 matt
** bugfix for alignment adjustment
**
** Revision 1.12 2000/07/24 04:31:43 matt
** pitch/data area on non-hw bitmaps get padded to 32-bit boundaries
**
** Revision 1.11 2000/07/17 01:52:27 matt
** made sure last line of all source files is a newline
**
** Revision 1.10 2000/07/09 14:43:01 matt
** pitch is now configurable for bmp_createhw()
**
** Revision 1.9 2000/07/06 17:55:57 matt
** two big bugs fixed
**
** Revision 1.8 2000/07/06 17:38:11 matt
** replaced missing string.h include
**
** Revision 1.7 2000/07/06 16:46:57 matt
** added bmp_clear() routine
**
** Revision 1.6 2000/06/26 04:56:24 matt
** minor cleanup
**
** Revision 1.5 2000/06/09 15:12:25 matt
** initial revision
**
*/

View file

@ -0,0 +1,93 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** bitmap.h
**
** Bitmap object defines / prototypes
** $Id: bitmap.h,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#ifndef _BITMAP_H_
#define _BITMAP_H_
#include "noftypes.h"
/* a bitmap rectangle */
typedef struct rect_s
{
int16 x, y;
uint16 w, h;
} rect_t;
typedef struct rgb_s
{
int r, g, b;
} rgb_t;
typedef struct bitmap_s
{
int width, height, pitch;
bool hardware; /* is data a hardware region? */
uint8 *data; /* protected */
uint8 *line[ZERO_LENGTH]; /* will hold line pointers */
} bitmap_t;
extern void bmp_clear(const bitmap_t *bitmap, uint8 color);
extern bitmap_t *bmp_create(int width, int height, int overdraw);
extern bitmap_t *bmp_createhw(uint8 *addr, int width, int height, int pitch);
extern void bmp_destroy(bitmap_t **bitmap);
#endif /* _BITMAP_H_ */
/*
** $Log: bitmap.h,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.12 2000/11/05 16:37:18 matt
** rolled rgb.h into bitmap.h
**
** Revision 1.11 2000/10/10 13:58:13 matt
** stroustrup squeezing his way in the door
**
** Revision 1.10 2000/09/18 02:06:48 matt
** -pedantic is your friend
**
** Revision 1.9 2000/07/31 04:28:46 matt
** one million cleanups
**
** Revision 1.8 2000/07/24 04:31:43 matt
** pitch/data area on non-hw bitmaps get padded to 32-bit boundaries
**
** Revision 1.7 2000/07/17 01:52:27 matt
** made sure last line of all source files is a newline
**
** Revision 1.6 2000/07/09 14:43:01 matt
** pitch is now configurable for bmp_createhw()
**
** Revision 1.5 2000/07/06 16:46:57 matt
** added bmp_clear() routine
**
** Revision 1.4 2000/06/09 15:12:25 matt
** initial revision
**
*/

View file

@ -0,0 +1,75 @@
/* Nofrendo Configuration Braindead Sample Implementation
**
** $Id: config.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "noftypes.h"
#include "log.h"
#include "osd.h"
#include "nofconfig.h"
#include "version.h"
/* interface */
config_t config =
{
CONFIG_FILE
};
/*
** $Log: config.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.14 2000/11/05 06:23:10 matt
** realloc was incompatible with memguard
**
** Revision 1.13 2000/10/10 13:58:13 matt
** stroustrup squeezing his way in the door
**
** Revision 1.12 2000/09/20 01:13:28 matt
** damn tabs
**
** Revision 1.11 2000/08/04 12:41:04 neil
** current not a bug
**
** Revision 1.10 2000/07/31 04:28:46 matt
** one million cleanups
**
** Revision 1.9 2000/07/24 04:30:42 matt
** slight cleanup
**
** Revision 1.8 2000/07/23 15:16:08 matt
** changed strcasecmp to stricmp
**
** Revision 1.7 2000/07/19 15:58:55 neil
** config file now configurable (ha)
**
** Revision 1.6 2000/07/18 03:28:32 matt
** help me! I'm a complete mess!
**
** Revision 1.5 2000/07/12 11:03:08 neil
** Always write a config, even if no defaults are changed
**
** Revision 1.4 2000/07/11 15:09:30 matt
** suppressed all warnings
**
** Revision 1.3 2000/07/11 14:59:27 matt
** minor cosmetics.. =)
**
** Revision 1.2 2000/07/11 13:35:38 bsittler
** Changed the config API, implemented config file "nofrendo.cfg". The
** GGI drivers use the group [GGI]. Visual= and Mode= keys are understood.
**
** Revision 1.1 2000/07/11 09:21:10 bsittler
** This is a skeletal configuration system.
**
*/

File diff suppressed because it is too large Load diff

View file

@ -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 " NES Emulator"
#define ROMSDIR "nes"
#define emu_Init(ROM) {nes_Start(ROM); nes_Init(); }
#define emu_Step(x) { nes_Step(); }
#define emu_Input(x) { nes_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',157, //lowecase
0,'a','s','d','f','g','h','j','k','l',0x0D,
0,'z','x','c','v','b','n','m',',','.',';','/',
145,157,29,17,
0,'+',' ','-'
};
#define keylables_map1_0 (char *)"QWERTYUIOP@"
#define keylables_map1_1 (char *)" ASDFGHJKL\x19"
#define keylables_map1_2 (char *)" ZXCVBNM<>:?"
#define keylables_map1_3 (char *)" =\x10_"
const unsigned short key_map1[] = {
'Q','W','E','R','T','Y','U','I','O','P','@', //shift uppercase
0,'A','S','D','F','G','H','J','K','L',0x0D,
0,'Z','X','C','V','B','N','M','<','>',':','?',
145,157,29,17,
0,'=',' ','_'
};
#define keylables_map2_0 (char *)"!\"#$%^&*()@"
#define keylables_map2_1 (char *)" |\\[]{} "
#define keylables_map2_2 (char *)" <>:?"
#define keylables_map2_3 (char *)" =\x10_"
const unsigned short key_map2[] = {
'!','"','#','$','%','^','&','*','(',')','@', // shiftothers
0, '|','\\','[',']','{','}','\'',0,0,0,
0, 0,0,0,0,0,0,0,'<','>',':','?',
0,0,0,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,
0,0,0,0,
0,0,' ',0
};
#define keylables_map4_0 (char *)"\x11\x12\x13\x14\x15\x16\x17\x18 "
#define keylables_map4_1 (char *)" "
#define keylables_map4_2 (char *)" "
#define keylables_map4_3 (char *)" "
const unsigned short key_map4[] = {
133,134,135,136,137,138,139,140,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,
0,0,0,0,
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,
0,0,0,0,
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" {
#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

View file

@ -0,0 +1,324 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** event.c
**
** OS-independent event handling
** $Id: event.c,v 1.3 2001/04/27 14:37:11 neil Exp $
*/
#include <stdlib.h>
#include "noftypes.h"
#include "event.h"
#include "nesinput.h"
/* pointer to our current system's event handler table */
static event_t *system_events = NULL;
/* standard keyboard input */
static nesinput_t kb_input = { INP_JOYPAD0, 0 };
static nesinput_t kb_alt_input = { INP_JOYPAD1, 0 };
static void func_event_joypad1_a(int code)
{
input_event(&kb_input, code, INP_PAD_A);
}
static void func_event_joypad1_b(int code)
{
input_event(&kb_input, code, INP_PAD_B);
}
static void func_event_joypad1_start(int code)
{
input_event(&kb_input, code, INP_PAD_START);
}
static void func_event_joypad1_select(int code)
{
input_event(&kb_input, code, INP_PAD_SELECT);
}
static void func_event_joypad1_up(int code)
{
input_event(&kb_input, code, INP_PAD_UP);
}
static void func_event_joypad1_down(int code)
{
input_event(&kb_input, code, INP_PAD_DOWN);
}
static void func_event_joypad1_left(int code)
{
input_event(&kb_input, code, INP_PAD_LEFT);
}
static void func_event_joypad1_right(int code)
{
input_event(&kb_input, code, INP_PAD_RIGHT);
}
static void func_event_joypad2_a(int code)
{
input_event(&kb_alt_input, code, INP_PAD_A);
}
static void func_event_joypad2_b(int code)
{
input_event(&kb_alt_input, code, INP_PAD_B);
}
static void func_event_joypad2_start(int code)
{
input_event(&kb_alt_input, code, INP_PAD_START);
}
static void func_event_joypad2_select(int code)
{
input_event(&kb_alt_input, code, INP_PAD_SELECT);
}
static void func_event_joypad2_up(int code)
{
input_event(&kb_alt_input, code, INP_PAD_UP);
}
static void func_event_joypad2_down(int code)
{
input_event(&kb_alt_input, code, INP_PAD_DOWN);
}
static void func_event_joypad2_left(int code)
{
input_event(&kb_alt_input, code, INP_PAD_LEFT);
}
static void func_event_joypad2_right(int code)
{
input_event(&kb_alt_input, code, INP_PAD_RIGHT);
}
/* NES events */
static const event_t nes_events[] =
{
NULL, /* 0 */
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
/* saves */
NULL,
NULL, /* 10 */
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL, /* 20 */
/* GUI */
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
/* sound */
NULL,
NULL, /* 30 */
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
/* picture */
NULL,
NULL,
NULL,
NULL, /* 40 */
NULL,
NULL,
NULL,
/* joypad 1 */
func_event_joypad1_a,
func_event_joypad1_b,
func_event_joypad1_start,
func_event_joypad1_select,
func_event_joypad1_up,
func_event_joypad1_down,
func_event_joypad1_left, /* 50 */
func_event_joypad1_right,
/* joypad 2 */
func_event_joypad2_a,
func_event_joypad2_b,
func_event_joypad2_start,
func_event_joypad2_select,
func_event_joypad2_up,
func_event_joypad2_down,
func_event_joypad2_left,
func_event_joypad2_right,
/* NSF control */
NULL, /* 60 */
NULL,
NULL,
/* OS-specific */
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL, /* 70 */
NULL,
/* last */
NULL
};
static event_t *event_system_table[NUM_SUPPORTED_SYSTEMS] =
{
NULL, /* unknown */
NULL, /* autodetect */
nes_events, /* nes */
};
void event_init(void)
{
input_register(&kb_input);
input_register(&kb_alt_input);
}
/* set up the event system for a certain console/system type */
void event_set_system(system_t type)
{
ASSERT(type < NUM_SUPPORTED_SYSTEMS);
system_events = event_system_table[type];
}
void event_set(int index, event_t handler)
{
/* now, event_set is used to set osd-specific events. We should assume
** (for now, at least) that these events should be used across all
** emulated systems, so let's loop through all system event handler
** tables and add this event...
*/
int i;
for (i = 0; i < NUM_SUPPORTED_SYSTEMS; i++)
{
if(event_system_table[i])
{
event_system_table[i][index] = handler;
}
}
}
event_t event_get(int index)
{
return system_events[index];
}
/*
** $Log: event.c,v $
** Revision 1.3 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.2 2001/04/27 11:10:08 neil
** compile
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.18 2000/11/25 20:26:05 matt
** removed fds "system"
**
** Revision 1.17 2000/11/09 14:05:42 matt
** state load fixed, state save mostly fixed
**
** Revision 1.16 2000/11/05 16:37:18 matt
** rolled rgb.h into bitmap.h
**
** Revision 1.15 2000/11/01 17:33:26 neil
** little crash bugs fixed
**
** Revision 1.14 2000/11/01 14:15:35 matt
** multi-system event system, or whatever
**
** Revision 1.13 2000/10/27 12:59:48 matt
** api change for ppu palette functions
**
** Revision 1.12 2000/10/26 22:48:05 matt
** no need for extern
**
** Revision 1.11 2000/10/25 00:23:16 matt
** makefiles updated for new directory structure
**
** Revision 1.10 2000/10/23 17:50:46 matt
** adding fds support
**
** Revision 1.9 2000/10/23 15:52:04 matt
** better system handling
**
** Revision 1.8 2000/10/22 15:01:51 matt
** prevented palette changing in VS unisystem games
**
** Revision 1.7 2000/10/10 13:03:54 matt
** Mr. Clean makes a guest appearance
**
** Revision 1.6 2000/08/16 02:58:34 matt
** random cleanups
**
** Revision 1.5 2000/07/27 01:15:33 matt
** name changes
**
** Revision 1.4 2000/07/26 21:36:13 neil
** Big honkin' change -- see the mailing list
**
** Revision 1.3 2000/07/23 15:17:19 matt
** non-osd calls moved from osd.c to gui.c
**
** Revision 1.2 2000/07/21 12:07:40 neil
** added room in event_array for all osd events
**
** Revision 1.1 2000/07/21 04:26:38 matt
** initial revision
**
*/

View file

@ -0,0 +1,154 @@
/* vim: set tabstop=3 expandtab:
**
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** event.h
**
** OS-independent event handling
** $Id: event.h,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#ifndef _EVENT_H_
#define _EVENT_H_
#include "nofrendo.h"
enum
{
event_none = 0,
event_quit,
event_insert,
event_eject,
event_togglepause,
event_soft_reset,
event_hard_reset,
event_snapshot,
event_toggle_frameskip,
/* saves */
event_state_save,
event_state_load,
event_state_slot_0,
event_state_slot_1,
event_state_slot_2,
event_state_slot_3,
event_state_slot_4,
event_state_slot_5,
event_state_slot_6,
event_state_slot_7,
event_state_slot_8,
event_state_slot_9,
/* GUI */
event_gui_toggle_oam,
event_gui_toggle_wave,
event_gui_toggle_pattern,
event_gui_pattern_color_up,
event_gui_pattern_color_down,
event_gui_toggle_fps,
event_gui_display_info,
event_gui_toggle,
/* sound */
event_toggle_channel_0,
event_toggle_channel_1,
event_toggle_channel_2,
event_toggle_channel_3,
event_toggle_channel_4,
event_toggle_channel_5,
event_set_filter_0,
event_set_filter_1,
event_set_filter_2,
/* picture */
event_toggle_sprites,
event_palette_hue_up,
event_palette_hue_down,
event_palette_tint_up,
event_palette_tint_down,
event_palette_set_default,
event_palette_set_shady,
/* joypad 1 */
event_joypad1_a,
event_joypad1_b,
event_joypad1_start,
event_joypad1_select,
event_joypad1_up,
event_joypad1_down,
event_joypad1_left,
event_joypad1_right,
/* joypad 2 */
event_joypad2_a,
event_joypad2_b,
event_joypad2_start,
event_joypad2_select,
event_joypad2_up,
event_joypad2_down,
event_joypad2_left,
event_joypad2_right,
/* NSF control */
event_songup,
event_songdown,
event_startsong,
/* OS specific */
event_osd_1,
event_osd_2,
event_osd_3,
event_osd_4,
event_osd_5,
event_osd_6,
event_osd_7,
event_osd_8,
event_osd_9,
/* last */
event_last
};
typedef void (*event_t)(int code);
extern void event_init(void);
extern void event_set(int index, event_t handler);
extern event_t event_get(int index);
extern void event_set_system(system_t type);
#endif /* !_EVENT_H_ */
/*
** $Log: event.h,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.6 2000/11/01 14:15:35 matt
** multi-system event system, or whatever
**
** Revision 1.5 2000/10/10 13:03:54 matt
** Mr. Clean makes a guest appearance
**
** Revision 1.4 2000/07/31 04:28:46 matt
** one million cleanups
**
** Revision 1.3 2000/07/26 21:36:13 neil
** Big honkin' change -- see the mailing list
**
** Revision 1.2 2000/07/21 04:27:40 matt
** don't mind me...
**
** Revision 1.1 2000/07/21 04:26:38 matt
** initial revision
**
*/

View file

@ -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
};

View file

@ -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

View file

@ -0,0 +1,20 @@
#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

View file

@ -0,0 +1,397 @@
/**************************************************************************/
/*
libsnss.h
(C) 2000 The SNSS Group
See README.TXT file for license and terms of use.
$Id: libsnss.h,v 1.1 2001/04/27 12:54:40 neil Exp $
*/
/**************************************************************************/
#ifndef _LIBSNSS_H_
#define _LIBSNSS_H_
#include <stdio.h>
/**************************************************************************/
/* endian customization */
/**************************************************************************/
/*
Endian-ness quick reference:
the number is:
$12345678
the little-endian representation (e.g.: 6502, Intel x86) is:
78 56 34 12
the big-endian representation (e.g.: Motorola 68000) is:
12 34 56 78
the SNSS file format uses big-endian representation
*/
/* comment/uncomment depending on your processor architecture */
/* commenting this out implies BIG ENDIAN */
#define USE_LITTLE_ENDIAN
/**************************************************************************/
/* SNSS constants */
/**************************************************************************/
typedef enum _SNSS_OPEN_MODES
{
SNSS_OPEN_READ,
SNSS_OPEN_WRITE
} SNSS_OPEN_MODE;
/* block types */
typedef enum _SNSS_BLOCK_TYPES
{
SNSS_BASR,
SNSS_VRAM,
SNSS_SRAM,
SNSS_MPRD,
SNSS_CNTR,
SNSS_SOUN,
SNSS_UNKNOWN_BLOCK
} SNSS_BLOCK_TYPE;
/* function return types */
typedef enum _SNSS_RETURN_CODES
{
SNSS_OK,
SNSS_BAD_FILE_TAG,
SNSS_OPEN_FAILED,
SNSS_CLOSE_FAILED,
SNSS_READ_FAILED,
SNSS_WRITE_FAILED,
SNSS_OUT_OF_MEMORY,
SNSS_UNSUPPORTED_BLOCK
} SNSS_RETURN_CODE;
#define TAG_LENGTH 4
#define SNSS_BLOCK_VERSION 1
/**************************************************************************/
/* SNSS data structures */
/**************************************************************************/
struct mapper1Data
{
unsigned char registers[4];
unsigned char latch;
unsigned char numberOfBits;
};
struct mapper4Data
{
unsigned char irqCounter;
unsigned char irqLatchCounter;
unsigned char irqCounterEnabled;
unsigned char last8000Write;
};
struct mapper5Data
{
unsigned char dummy; /* needed for some compilers; remove if any members are added */
};
struct mapper6Data
{
unsigned char irqCounter;
unsigned char irqLatchCounter;
unsigned char irqCounterEnabled;
unsigned char last43FEWrite;
unsigned char last4500Write;
};
struct mapper9Data
{
unsigned char latch[2];
unsigned char lastB000Write;
unsigned char lastC000Write;
unsigned char lastD000Write;
unsigned char lastE000Write;
};
struct mapper10Data
{
unsigned char latch[2];
unsigned char lastB000Write;
unsigned char lastC000Write;
unsigned char lastD000Write;
unsigned char lastE000Write;
};
struct mapper16Data
{
unsigned char irqCounterLowByte;
unsigned char irqCounterHighByte;
unsigned char irqCounterEnabled;
};
struct mapper17Data
{
unsigned char irqCounterLowByte;
unsigned char irqCounterHighByte;
unsigned char irqCounterEnabled;
};
struct mapper18Data
{
unsigned char irqCounterLowByte;
unsigned char irqCounterHighByte;
unsigned char irqCounterEnabled;
};
struct mapper19Data
{
unsigned char irqCounterLowByte;
unsigned char irqCounterHighByte;
unsigned char irqCounterEnabled;
};
struct mapper21Data
{
unsigned char irqCounter;
unsigned char irqCounterEnabled;
};
struct mapper24Data
{
unsigned char irqCounter;
unsigned char irqCounterEnabled;
};
struct mapper40Data
{
unsigned char irqCounter;
unsigned char irqCounterEnabled;
};
struct mapper69Data
{
unsigned char irqCounterLowByte;
unsigned char irqCounterHighByte;
unsigned char irqCounterEnabled;
};
struct mapper90Data
{
unsigned char irqCounter;
unsigned char irqLatchCounter;
unsigned char irqCounterEnabled;
};
struct mapper224Data
{
unsigned char chrRamWriteable;
};
struct mapper225Data
{
unsigned char prgSize;
unsigned char registers[4];
};
struct mapper226Data
{
unsigned char chrRamWriteable;
};
struct mapper228Data
{
unsigned char prgChipSelected;
};
struct mapper230Data
{
unsigned char numberOfResets;
};
typedef struct _SnssFileHeader
{
char tag[TAG_LENGTH + 1];
unsigned int numberOfBlocks;
} SnssFileHeader;
/* this block appears before every block in the SNSS file */
typedef struct _SnssBlockHeader
{
char tag[TAG_LENGTH + 1];
unsigned int blockVersion;
unsigned int blockLength;
} SnssBlockHeader;
#define BASE_BLOCK_LENGTH 0x1931
typedef struct _SnssBaseBlock
{
unsigned char regA;
unsigned char regX;
unsigned char regY;
unsigned char regFlags;
unsigned char regStack;
unsigned short regPc;
unsigned char reg2000;
unsigned char reg2001;
unsigned char cpuRam[0x800];
unsigned char spriteRam[0x100];
unsigned char ppuRam[0x1000];
unsigned char palette[0x20];
unsigned char mirrorState[4];
unsigned short vramAddress;
unsigned char spriteRamAddress;
unsigned char tileXOffset;
} SnssBaseBlock;
#define VRAM_8K 0x2000
#define VRAM_16K 0x4000
typedef struct _SnssVramBlock
{
unsigned short vramSize;
unsigned char vram[VRAM_16K];
} SnssVramBlock;
#define SRAM_1K 0x0400
#define SRAM_2K 0x0800
#define SRAM_3K 0x0C00
#define SRAM_4K 0x1000
#define SRAM_5K 0x1400
#define SRAM_6K 0x1800
#define SRAM_7K 0x1C00
#define SRAM_8K 0x2000
typedef struct _SnssSramBlock
{
unsigned short sramSize;
unsigned char sramEnabled;
unsigned char sram[SRAM_8K];
} SnssSramBlock;
#define MAPPER_BLOCK_LENGTH 0x98
typedef struct _SnssMapperBlock
{
unsigned short prgPages[4];
unsigned short chrPages[8];
union _extraData
{
unsigned char mapperData[128];
struct mapper1Data mapper1;
struct mapper4Data mapper4;
struct mapper5Data mapper5;
struct mapper6Data mapper6;
struct mapper9Data mapper9;
struct mapper10Data mapper10;
struct mapper16Data mapper16;
struct mapper17Data mapper17;
struct mapper18Data mapper18;
struct mapper19Data mapper19;
struct mapper21Data mapper21;
struct mapper24Data mapper24;
struct mapper40Data mapper40;
struct mapper69Data mapper69;
struct mapper90Data mapper90;
struct mapper224Data mapper224;
struct mapper225Data mapper225;
struct mapper226Data mapper226;
struct mapper228Data mapper228;
struct mapper230Data mapper230;
} extraData;
} SnssMapperBlock;
typedef struct _SnssControllersBlock
{
unsigned char dummy; /* needed for some compilers; remove if any members are added */
} SnssControllersBlock;
#define SOUND_BLOCK_LENGTH 0x16
typedef struct _SnssSoundBlock
{
unsigned char soundRegisters[0x16];
} SnssSoundBlock;
/**************************************************************************/
/* SNSS file manipulation functions */
/**************************************************************************/
typedef struct _SNSS_FILE
{
FILE *fp;
SNSS_OPEN_MODE mode;
SnssFileHeader headerBlock;
SnssBaseBlock baseBlock;
SnssVramBlock vramBlock;
SnssSramBlock sramBlock;
SnssMapperBlock mapperBlock;
SnssControllersBlock contBlock;
SnssSoundBlock soundBlock;
} SNSS_FILE;
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* general file manipulation routines */
SNSS_RETURN_CODE SNSS_OpenFile (SNSS_FILE **snssFile, const char *filename,
SNSS_OPEN_MODE mode);
SNSS_RETURN_CODE SNSS_CloseFile (SNSS_FILE **snssFile);
/* block traversal */
SNSS_RETURN_CODE SNSS_GetNextBlockType (SNSS_BLOCK_TYPE *blockType,
SNSS_FILE *snssFile);
SNSS_RETURN_CODE SNSS_SkipNextBlock (SNSS_FILE *snssFile);
/* functions to read/write SNSS blocks */
SNSS_RETURN_CODE SNSS_ReadBlock (SNSS_FILE *snssFile, SNSS_BLOCK_TYPE blockType);
SNSS_RETURN_CODE SNSS_WriteBlock (SNSS_FILE *snssFile, SNSS_BLOCK_TYPE blockType);
/* support functions */
const char *SNSS_GetErrorString (SNSS_RETURN_CODE code);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _LIBSNSS_H_ */
/*
** $Log: libsnss.h,v $
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.2 2000/11/09 14:07:41 matt
** minor update
**
** Revision 1.1 2000/10/24 12:19:01 matt
** changed directory structure
**
** Revision 1.9 2000/09/18 02:06:48 matt
** -pedantic is your friend
**
** Revision 1.8 2000/07/17 01:52:27 matt
** made sure last line of all source files is a newline
**
** Revision 1.7 2000/07/15 23:49:14 matt
** fixed some typos in the mapper-specific data
**
** Revision 1.6 2000/07/09 15:37:21 matt
** all block read/write calls now pass through a common handler
**
** Revision 1.5 2000/07/09 03:39:06 matt
** minor modifications
**
** Revision 1.4 2000/07/08 16:01:39 matt
** added bald's changes, made error checking more robust
**
** Revision 1.3 2000/07/05 22:46:52 matt
** cleaned up header
**
** Revision 1.2 2000/07/04 04:46:06 matt
** simplified handling of SNSS states
**
** Revision 1.1 2000/06/29 14:13:28 matt
** initial revision
**
*/

View file

@ -0,0 +1,121 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** log.c
**
** Error logging functions
** $Id: log.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include <stdlib.h>
#include <stdio.h>
#include <stdarg.h>
#include "noftypes.h"
#include "log.h"
//static FILE *errorlog = NULL;
static int (*log_func)(const char *string) = NULL;
int log_init(void)
{
return 0;
}
void log_shutdown(void)
{
}
int log_print(const char *string)
{
UNUSED(string);
return 0;
}
int log_printf(const char *format, ... )
{
UNUSED(format);
return 0; /* should be number of chars written */
}
void log_chain_logfunc(int (*func)(const char *string))
{
log_func = func;
}
void log_assert(int expr, int line, const char *file, char *msg)
{
if (expr)
return;
if (NULL != msg)
log_printf("ASSERT: line %d of %s, %s\n", line, file, msg);
else
log_printf("ASSERT: line %d of %s\n", line, file);
//asm("break.n 1");
// exit(-1);
}
/*
** $Log: log.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.14 2000/11/13 00:56:17 matt
** doesn't look as nasty now
**
** Revision 1.13 2000/11/06 02:15:07 matt
** more robust logging routines
**
** Revision 1.12 2000/10/15 13:28:12 matt
** need stdlib.h for exit()
**
** Revision 1.11 2000/10/10 13:13:13 matt
** dumb bug in log_chain_logfunc
**
** Revision 1.10 2000/10/10 13:03:54 matt
** Mr. Clean makes a guest appearance
**
** Revision 1.9 2000/08/28 01:47:10 matt
** quelled fricking compiler complaints
**
** Revision 1.8 2000/07/31 04:28:46 matt
** one million cleanups
**
** Revision 1.7 2000/07/17 01:52:27 matt
** made sure last line of all source files is a newline
**
** Revision 1.6 2000/07/06 17:20:52 matt
** block manager space itself wasn't being freed - d'oh!
**
** Revision 1.5 2000/06/26 04:55:33 matt
** minor change
**
** Revision 1.4 2000/06/09 15:12:25 matt
** initial revision
**
*/

View file

@ -0,0 +1,57 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** log.h
**
** Error logging header file
** $Id: log.h,v 1.1.1.1 2001/04/27 07:03:54 neil Exp $
*/
#ifndef _LOG_H_
#define _LOG_H_
#include <stdio.h>
extern int log_init(void);
extern void log_shutdown(void);
extern int log_print(const char *string);
extern int log_printf(const char *format, ...);
extern void log_chain_logfunc(int (*logfunc)(const char *string));
extern void log_assert(int expr, int line, const char *file, char *msg);
#endif /* _LOG_H_ */
/*
** $Log: log.h,v $
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.7 2000/11/06 02:15:07 matt
** more robust logging routines
**
** Revision 1.6 2000/10/10 13:03:54 matt
** Mr. Clean makes a guest appearance
**
** Revision 1.5 2000/07/17 01:52:27 matt
** made sure last line of all source files is a newline
**
** Revision 1.4 2000/06/09 15:12:25 matt
** initial revision
**
*/

View file

@ -0,0 +1,125 @@
const uint16_t logo[] PROGMEM = {
0x0140,0x007c,0x632c,0xbdd7,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce79,0xce59,0xa514,0x2104,
0xbdf7,0xd69a,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xdefb,0x9cd3,
0xce79,0xce59,0xce79,0xce59,0xce79,0xce79,0xce59,0xce79,0xce59,0xce59,0xce59,0xce79,0xce79,0xce59,0xce59,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce59,0xce79,0xce59,0xce59,0xce79,0xce79,0xce59,0xce79,0xce79,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xce59,0xce79,0xce79,0xce79,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce79,0xce59,0xce59,0xce59,0xce79,0xce59,0xce79,0xce59,0xce79,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce79,0xce59,0xce79,0xce59,0xce59,0xce59,0xce79,0xce79,0xce79,0xce59,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce59,0xce79,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce79,0xce59,0xce59,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce79,0xce59,0xce79,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xce59,0xce59,0xce79,0xce79,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce79,0xce79,0xce59,0xce59,0xce79,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce79,0xce59,0xce79,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xce79,0xce59,0xce59,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce79,0xce79,0xce59,0xce59,0xce79,0xce79,0xce59,0xce79,0xce59,0xce79,0xce59,0xd69a,0xbdf7,
0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xce79,0xce59,0xce79,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce79,0xce59,0xce79,0xd69a,0xad75,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x9cd3,0xb596,0xce79,0xce79,0xce79,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xce79,0xce79,0x8410,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x738e,0x8410,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x7bef,0x8410,0x6b6d,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x94b2,0xce79,0xce79,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd6ba,0xa514,0x0000,0x10a2,0x10a2,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x10a2,0x0841,0x2124,0x9492,0xa514,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0xa514,0x8c71,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x10a2,0x0000,0x18c3,0xbdd7,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd6ba,0x7bef,0x0000,0x18e3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x94b2,0x9cf3,0x8430,0x0000,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x1082,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18c3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8430,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x8c51,0x9cf3,0x94b2,0x9cd3,0x94b2,0x9cd3,0x9cd3,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x9cd3,0x94b2,0x9cd3,0x9cd3,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x9cd3,0x9cd3,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x9cd3,0x94b2,0x94b2,0x94b2,0x9cd3,0x94b2,0x94b2,0x9cd3,0x94b2,0x9cd3,0x9cd3,0x94b2,0x94b2,0x9cd3,0x94b2,0x94b2,0x9cd3,0x94b2,0x9cd3,0x94b2,0x94b2,0x9cd3,0x94b2,0x9cd3,0x9cd3,0x94b2,0x94b2,0x94b2,0x9cd3,0x9cd3,0x94b2,0x94b2,0x9cd3,0x9cd3,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x9cd3,0x94b2,0x94b2,0x9cd3,0x94b2,0x9cf3,0x8430,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0x6b4d,0xa514,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0xa514,0x630c,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x632c,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x8c51,0x630c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x1800,0x1800,0x0800,0x1000,0x1800,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x0000,0x2965,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x3186,0x2965,0x2965,0x3186,0x2945,0x0000,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0000,0x5000,0x8041,0x7061,0x0020,0x0000,0x0000,0x2800,0x7020,0x8061,0x4041,0x6820,0x8841,0x8061,0x1020,0x0000,0x0800,0x0000,0x0000,0x1000,0x1000,0x0800,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x1000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1000,0x0000,0x8020,0xa061,0x7082,0x0000,0x0800,0x0800,0x1000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2124,0x8410,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x7bef,0x18c3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x0000,0x9000,0xd000,0xd061,0x90c3,0x0000,0x0000,0x4800,0xc800,0xd861,0x7882,0x9800,0xd800,0xc082,0x2061,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,0x0000,0x1000,0x0000,0x0000,0x7020,0x8861,0x3861,0x0000,0x0800,0x1000,0x0000,0x0000,0x0000,0x0800,0x1000,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0000,0x1000,0x0000,0x0000,0x0000,0xb000,0xe000,0xa0a2,0x0000,0x2000,0x0000,0x0000,0x0000,0x0000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x7bcf,0xa514,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0xa514,0x73ae,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x0000,0x8800,0xd000,0xc000,0xc8a2,0x68a2,0x0000,0x4800,0xc000,0xd041,0x7882,0x0000,0x3000,0x2820,0x0800,0x0800,0x0820,0x0020,0x2800,0x5820,0x5841,0x2041,0x0000,0x4800,0x8020,0xc800,0xd820,0xa0a2,0x6841,0x1820,0x0000,0x0000,0x5820,0x5021,0x0020,0x0000,0x1000,0x0800,0x0020,0x0000,0x3800,0x6020,0x5041,0x0020,0x0000,0x0800,0x0000,0x3000,0x6020,0x5020,0xa800,0xd000,0x98a2,0x0000,0x0000,0x3800,0x6020,0x5820,0x0020,0x0000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x10a2,0x8c71,0x9cf3,0x94b2,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x94b2,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x0000,0x8800,0xd800,0xa882,0x7800,0xc8c3,0x1061,0x4000,0xc000,0xd041,0x7882,0x8800,0xc041,0xa882,0x3041,0xa820,0xc061,0x9881,0x8000,0xb820,0xd021,0xc0a2,0x4882,0x5800,0x9800,0xc000,0xc800,0xa841,0x8041,0x0020,0x7800,0xb820,0x8020,0x9021,0xb0a2,0x5082,0x4000,0xb820,0xb861,0x9061,0x8800,0xc020,0xd041,0xb0c3,0x2861,0x0000,0x9000,0xc020,0x9841,0x7020,0xb800,0xd000,0x98a2,0x0000,0xa000,0xc020,0x8821,0x9840,0xb882,0x70a2,0x0000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8430,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x0000,0x8800,0xd000,0xb082,0x0020,0xa800,0xb0e3,0x0841,0xc000,0xd041,0x7082,0xa800,0xe000,0xc082,0x3061,0xc000,0xd800,0xa861,0x0000,0x3800,0xb800,0xd820,0x98c3,0x0000,0x0000,0xb800,0xd820,0x7082,0x0000,0x5800,0xd000,0xc861,0x4861,0x7000,0xd800,0xc0c3,0x5861,0xc800,0xd820,0x8861,0x0000,0x5800,0xc800,0xd861,0x70a2,0x6800,0xd800,0xc861,0x0841,0x0000,0xb000,0xd800,0x90a2,0x7800,0xe000,0xa861,0x0000,0x3000,0xc800,0xc8a2,0x4082,0x0000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x0000,0x528a,0x630c,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x630c,0x4208,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x0000,0x8800,0xd000,0xb082,0x0020,0x3000,0xc061,0xa082,0xc000,0xd041,0x7882,0x9800,0xd000,0xb882,0x3061,0xb800,0xd020,0x88a2,0x0000,0x0000,0xb000,0xd000,0xa082,0x0000,0x3000,0xb800,0xd820,0x80a2,0x0000,0x8800,0xd000,0xb841,0x9841,0x9000,0x8800,0x9020,0x6041,0xc000,0xd061,0x6882,0x0000,0x4000,0xc000,0xd041,0x7082,0x9800,0xd800,0xb882,0x1041,0x0000,0xa800,0xd800,0x90a2,0x9800,0xd800,0x9882,0x0020,0x3800,0xb800,0xd040,0x78a2,0x0000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2945,0xad55,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0x9cf3,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x0000,0x8800,0xd000,0xb082,0x0020,0x0000,0x6000,0xd000,0xc800,0xd041,0x7882,0xa000,0xd800,0xc082,0x3061,0xb800,0xd020,0x90a2,0x0000,0x1800,0xb000,0xd800,0xa0a2,0x0000,0x2800,0xb800,0xd820,0x78a2,0x0000,0x7000,0xd800,0xb8a2,0x0020,0x0000,0x9820,0x9882,0x5020,0xc800,0xd061,0x7082,0x0000,0x4000,0xc000,0xd041,0x6882,0x8800,0xd800,0xc082,0x0061,0x0000,0xa800,0xd800,0x90a2,0x8000,0xe000,0xa0a2,0x0020,0x2800,0xc000,0xd041,0x5861,0x0000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x8c51,0xd69a,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xdedb,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1000,0x0000,0x8800,0xd800,0xb882,0x0040,0x1800,0x0000,0x8800,0xd000,0xd041,0x7882,0xa000,0xd800,0xc082,0x3861,0xb800,0xd820,0x90a2,0x0000,0x1000,0xb000,0xd800,0xa0a2,0x0000,0x3000,0xb800,0xd820,0x80a2,0x0000,0x0000,0x9800,0xc882,0x7082,0x8800,0xd000,0x9041,0x4800,0xc800,0xd061,0x7882,0x0000,0x4800,0xc800,0xd841,0x7882,0x0000,0xb000,0xd061,0x88a2,0x6000,0xc000,0xd800,0x98a2,0x0000,0xa800,0xc082,0x6882,0x9000,0xc800,0x8820,0x0000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce59,0xce79,0xce79,0xce59,0xce59,0xc638,0xc638,0xc638,0xc638,0xc638,0xc638,0xc638,0xc638,0xc638,0xc638,0xc638,0xc638,0xc638,0xc638,0xc638,0xc638,0xce59,0xce79,0xce59,0xce59,0xce59,0xd6ba,0xa514,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0000,0x5000,0x8000,0x6820,0x0000,0x0800,0x0000,0x1000,0x7000,0x8000,0x4820,0x5800,0x8000,0x7020,0x2000,0x6800,0x8000,0x5820,0x0000,0x0800,0x6800,0x8000,0x6020,0x0000,0x1800,0x6800,0x8000,0x4820,0x0000,0x0000,0x0000,0x5000,0x7820,0x7800,0x4800,0x0000,0x3000,0x7000,0x7800,0x4020,0x0000,0x2800,0x7000,0x8000,0x4820,0x0000,0x1000,0x6800,0x8020,0x7000,0x7000,0x7800,0x6020,0x0000,0x0000,0x5800,0x8020,0x7800,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce59,0xce79,0xce79,0xce59,0xbdd7,0xa514,0x9492,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c51,0x8c51,0x8c51,0x9cf3,0xbdd7,0xce59,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,0x0000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0000,0x0000,0x0000,0x0000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce59,0xce79,0xd69a,0xce59,0x9492,0x528a,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x2965,0x73ae,0xb596,0xce59,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1800,0x1000,0x0000,0x0000,0x0000,0x0000,0x1000,0x1800,0x0800,0x0800,0x1800,0x1000,0x0000,0x1000,0x1800,0x0800,0x0000,0x0000,0x1000,0x1800,0x1000,0x0000,0x0000,0x1000,0x1800,0x0800,0x0000,0x0000,0x0000,0x0800,0x1000,0x1000,0x0800,0x0000,0x0000,0x1000,0x1000,0x0800,0x0000,0x0000,0x1000,0x1800,0x0800,0x0000,0x0000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0800,0x0000,0x0000,0x0800,0x1000,0x1000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce59,0xce79,0xce59,0x9492,0x0000,0x0000,0x2965,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x4a49,0x8c51,0x8c71,0x2104,0x7bef,0xc618,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8430,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xce59,0x9cd3,0x0000,0x0000,0x10a2,0x2945,0x3186,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x3186,0x3186,0x31a6,0x8430,0xc638,0x8410,0x39c7,0xb5b6,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8430,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xbdd7,0x5aeb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x4a49,0xad75,0x9492,0x18e3,0xad55,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8c51,0x9cf3,0x94b2,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x94b2,0x9cf3,0x8410,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xad75,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0x5aeb,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x528a,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x4a69,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x73ae,0x4a49,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x0020,0x1082,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0861,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0861,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x2124,0x2945,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0841,0x39e7,0x39c7,0x2104,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x18c3,0x4a69,0x4228,0x3186,0x18e3,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x18e3,0x528a,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x52aa,0x528a,0x1082,0x0000,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x10a2,0x52aa,0x528a,0x4208,0x2945,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x39e7,0x9492,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x8c51,0x31a6,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x4a69,0x5aeb,0x4a49,0x31a6,0x2104,0x0020,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x8410,0xa514,0x94b2,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x94b2,0xa514,0x7bef,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x18c3,0x18e3,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x2124,0x5aeb,0x52aa,0x39e7,0x2945,0x1082,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x2124,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x18c3,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18c3,0x8c71,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9cd3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0020,0x0000,0x2965,0x4a69,0x4228,0x3186,0x18c3,0x0020,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cd3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd2,0x9cd2,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cb3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd2,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd2,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd2,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd2,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd2,0x9cf3,0x8c31,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x1082,0x738e,0x7bef,0x7bcf,0x7bef,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bef,0x73ae,0xad75,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x0020,0x0000,0x0841,0x2124,0x2104,0x1082,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd69a,0xb596,0x738e,0x7bef,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bef,0x630c,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd2,0x9cd3,0x94f3,0x94f3,0x9cf3,0x9cf3,0x94f3,0x94d3,0x94f3,0x94f3,0x9cf3,0x94f3,0x94f3,0x9cf3,0x94f3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x94f3,0x94f3,0x9cf3,0x94f3,0x94f3,0x9cd3,0x94f3,0x94f3,0x94f3,0x94f3,0x94f3,0x9cd3,0x9cf3,0x94f3,0x94f3,0x94f3,0x94f3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x94f4,0x94f3,0x9cf3,0x9cf3,0x94f3,0x9cd3,0x9cf3,0x94f3,0x94f3,0x94f3,0x94f3,0x9cf3,0x94f3,0x94f3,0x9cf3,0x94f3,0x94f3,0x9cd3,0x94f3,0x9cf3,0x9cf3,0x9cf3,0x94f3,0x9cf3,0x9cf3,0x94f3,0x94f3,0x94f3,0x94f3,0x9cd3,0x94d3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x0000,0xa534,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd69a,0xce79,0xce59,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xce59,0xd69a,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0x94b2,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x94d3,0xa430,0xb2eb,0xb2eb,0xb2eb,0xb2aa,0xa430,0xa451,0xb2eb,0xb2eb,0xb2cb,0xb28a,0xa410,0xab8e,0xa471,0x94f3,0x9cd3,0x9cd3,0x94d3,0xabcf,0xb2cb,0xb2eb,0xb2aa,0xb2cb,0x9c92,0xabcf,0xb28a,0xb2cb,0xb2aa,0xb2eb,0x9c31,0xaaeb,0xb2aa,0xbaeb,0xb2aa,0xb2cb,0xa492,0x94d3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0xabcf,0xb2cb,0xb2eb,0xb2cb,0xb2eb,0xa430,0xaaeb,0xb2aa,0xbaeb,0xb2aa,0xb2cb,0xa471,0xab8e,0xb2cb,0xb2eb,0xb2eb,0xac30,0x9c51,0xbaab,0xb2eb,0xb2eb,0xb2eb,0xac30,0xa3ef,0xb269,0xb2eb,0xbaeb,0xb28a,0xab8e,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x632c,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xd69a,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce79,0xd6ba,0x528a,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cd3,0x9cd3,0x94d3,0xb104,0xba08,0xab6d,0xab2c,0xabaf,0x9492,0xb986,0xba49,0xab6d,0xa3cf,0xa3ef,0x9c51,0xb924,0xac10,0x94f3,0x9cb2,0x9cf3,0x9471,0xc000,0xb2eb,0xa36d,0xa3ef,0xa430,0x9c30,0xc061,0xabae,0x9c10,0xa3ef,0xa3f0,0x9c71,0x9c30,0x9bae,0xc000,0xab8e,0x9c10,0x9c92,0x9cd3,0x9cd3,0x9cd3,0x9cd2,0x9cf3,0x9471,0xc000,0xb2eb,0xab4d,0xab2c,0xa3ef,0x9c92,0x9c30,0x9bae,0xc000,0xb36d,0x9c51,0xa36d,0xc061,0xab4c,0xab6d,0xaa8a,0xc208,0xab0c,0xc081,0xab4d,0xab6d,0xaaaa,0xc186,0xa451,0x9c30,0xaa49,0xc1c7,0x9c10,0xa431,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xc638,0xc618,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xc618,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8430,0x18e3,0x9cd3,0xc618,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xc618,0xce59,0xce79,0xce79,0xce79,0xce59,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9c10,0xab0c,0xab2c,0xab2c,0xbaaa,0xabf0,0xb186,0xba8a,0xab2c,0xa4b2,0x9555,0x8cf3,0xb965,0xac71,0x9534,0x94f3,0x9534,0x9451,0xc000,0xb2ec,0xab6d,0x9cf3,0x9575,0x9430,0xc124,0x9d14,0x9534,0x9534,0x9534,0x94f3,0x9d14,0x94b2,0xb945,0xa492,0x9534,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x94d3,0x9bcf,0xab0c,0xab2c,0xab0c,0xbaaa,0xa492,0x9534,0x94b2,0xb925,0xac71,0x8d55,0xa38d,0xc0a2,0xb2eb,0xb2eb,0xb269,0xc228,0xab0c,0xc124,0xb2eb,0xaacb,0xb945,0xbacb,0x9cf3,0x9554,0xa34c,0xbacb,0x9534,0x94f3,0x9cd3,0x9cd2,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xce59,0xce59,0xce59,0xbdf7,0x9cf3,0x8410,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x8410,0x8c51,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0xa514,0x94b2,0x0000,0x5aeb,0x7bef,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x7bcf,0x738e,0x73ae,0x94b2,0xbdd7,0xce59,0xce79,0xce59,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x94d3,0xa3ae,0xb2ab,0xb2ca,0xaacb,0xb800,0xabae,0xa2ca,0xb9e7,0xaacb,0xb2cb,0xb2cb,0xa410,0xb1c7,0xba69,0xb30c,0xb2eb,0xb2ec,0xa3ef,0xb1e7,0xb269,0xaacb,0xb2cb,0xb30c,0x9c50,0xb1c7,0xba8a,0xb2eb,0xb2cb,0xb2eb,0xa492,0x9cf3,0x9471,0xb882,0xa451,0x94f3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cb2,0xab4d,0xb2aa,0xb2cb,0xaa8a,0xc000,0xa451,0x94f3,0x9471,0xb861,0xac51,0x9514,0xa36d,0xb9e8,0x94d3,0x94f3,0x9451,0xb9e7,0xaaeb,0xba28,0x94d3,0x94d3,0x9bcf,0xb9a6,0x9cb2,0x9514,0xa2ec,0xba6a,0x94f3,0x9cb2,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xce79,0xd69a,0xce79,0x9cd3,0x4228,0x2965,0x3186,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2124,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8c51,0xa514,0x528a,0x31a6,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x39e7,0x4a49,0x2945,0x73ae,0xb5b6,0xce79,0xce59,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9c10,0xa3ef,0xa3ef,0xa3ef,0xa430,0x94f3,0x94b2,0x9c10,0xa3ef,0xa3ef,0xa3cf,0xa471,0x9c51,0xa3ef,0xa3ef,0xa3ef,0xa3cf,0x9c71,0x9492,0xa3ef,0xa3ef,0xa3ef,0xa3ef,0x9cb2,0x9492,0xa3ef,0xa3ef,0xa3ef,0xa3ef,0x9cb2,0x9cd3,0x9cb3,0x9c50,0x9cb2,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cb2,0xa3ef,0xa3ef,0xa3ef,0xa3ef,0x9c71,0x9cd3,0x9cd3,0x94b3,0x9c30,0x9cb2,0x9cd3,0x9c92,0x9c51,0x9cd3,0x9cd3,0x9cb2,0x9c51,0x9c71,0x9c51,0x9cd3,0x9cd3,0x9cd3,0x9c30,0x9cb3,0x94d3,0x9c71,0x9c71,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce59,0xce79,0xce59,0x94b2,0x0000,0x0000,0x2124,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x2104,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39e7,0x7bcf,0x6b6d,0x4228,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39e7,0x5aeb,0xa514,0x9492,0x0861,0x8c71,0xce59,0xce79,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cf3,0x94f3,0x94f3,0x94f3,0x9cf3,0x9cd3,0x9cd3,0x94f3,0x94f3,0x94f3,0x94f3,0x9cf3,0x9cf3,0x94f3,0x94f3,0x94f3,0x94f3,0x94f3,0x9cd3,0x94f3,0x94f3,0x94f3,0x94f3,0x9cd3,0x9cd3,0x94f3,0x94f3,0x94f3,0x94f4,0x9cd3,0x9cd2,0x9cd3,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x94f3,0x94f4,0x94f3,0x94f3,0x94f3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x9cd3,0x94f3,0x9cd3,0x9cd3,0x9cd3,0x94f3,0x9cd3,0x9cd3,0x9cf3,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8430,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xce79,0xa514,0x2104,0x0000,0x10a2,0x18e3,0x2124,0x2124,0x2124,0x2124,0x2124,0x2124,0x2124,0x2124,0x2124,0x2124,0x2124,0x2124,0x2124,0x2124,0x2104,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18e3,0x2124,0x2124,0x2124,0x2124,0x2124,0x2124,0x2124,0x2124,0x2124,0x2124,0x2124,0x2124,0x2124,0x2124,0x2945,0x31a6,0x9cd3,0xc638,0x5acb,0x630c,0xc618,0xce79,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd2,0x9cd3,0x9cd3,0x9cd3,0x9cd2,0x9cd3,0x9cd3,0x9cd2,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cb3,0x9cd3,0x9cb3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd2,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd2,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd2,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xc618,0x7bcf,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x632c,0xad75,0x738e,0x4a69,0xbdd7,0xce79,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x8430,0xa514,0x94b2,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd2,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd2,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x94b2,0xa514,0x8410,0x0000,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xbdd7,0x6b4d,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x18e3,0x10a2,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0x52aa,0x9cf3,0x6b4d,0x4a49,0xbdd7,0xce79,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x4a49,0x94b2,0xa514,0x9cf3,0x9cf3,0x9cf3,0xa514,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0xa514,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0xa4f4,0xa514,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9d14,0xa513,0x9cf4,0x9cf3,0x9cf3,0x9d14,0x9d13,0x9cf3,0x9cf3,0xa514,0x9cf3,0xa513,0x9cf3,0xa514,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0xa514,0x9cf3,0xa514,0x9492,0x4208,0x0000,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xbdd7,0x6b4d,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2945,0x2965,0x2104,0x10a2,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x528a,0x9cf3,0x632c,0x4a69,0xbdd7,0xce79,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x3186,0x5aeb,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x5aeb,0x2945,0x0000,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xbdd7,0x6b4d,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18c3,0x39e7,0x31a6,0x2945,0x2104,0x10a2,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x528a,0x9cf3,0x632c,0x4a69,0xbdd7,0xce79,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xbdd7,0x6b4d,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x18c3,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x31a6,0x4a49,0x39e7,0x31a6,0x2945,0x2104,0x10a2,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x528a,0x9cf3,0x632c,0x4a69,0xbdd7,0xce79,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x0000,0x39e7,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x39e7,0x0000,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x0000,0x3186,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xbdd7,0x6b4d,0x0000,0x0000,0x0000,0x0000,0x0000,0x2104,0x3186,0x18c3,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4a49,0x528a,0x4228,0x39e7,0x31a6,0x2945,0x18e3,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x2965,0x2124,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x528a,0x9cf3,0x632c,0x4a69,0xbdd7,0xce79,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x10a2,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0x4a49,0xb596,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xbdd7,0x52aa,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x0000,0x9cd3,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xc638,0x8c51,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xbdd7,0x6b4d,0x0000,0x0020,0x0000,0x0000,0x0000,0x39c7,0x4208,0x2945,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x10a2,0x52aa,0x5acb,0x528a,0x4a49,0x39e7,0x3186,0x2124,0x18c3,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2104,0x4228,0x31a6,0x2104,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x528a,0x9cf3,0x632c,0x4a69,0xbdd7,0xce79,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0xad55,0xd6ba,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xdedb,0xc618,0x0861,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xd69a,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xd69a,0xdedb,0x6b6d,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xbdd7,0x6b4d,0x0000,0x0020,0x0000,0x0000,0x0000,0x4a49,0x4a69,0x39c7,0x2124,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18c3,0x630c,0x5aeb,0x52aa,0x528a,0x4228,0x39e7,0x3186,0x2104,0x10a2,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x3186,0x528a,0x4208,0x3186,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x528a,0x9cf3,0x632c,0x4a69,0xbdd7,0xce79,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x39e7,0x7bcf,0x8410,0x7bef,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x7bef,0x8410,0x7bef,0x4208,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xd69a,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x94b2,0xd69a,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xd6ba,0xa514,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xbdd7,0x6b4d,0x0000,0x0020,0x0000,0x0020,0x0000,0x4a69,0x5acb,0x4228,0x31a6,0x18e3,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x10a2,0x630c,0x632c,0x5aeb,0x52aa,0x4a69,0x4228,0x39c7,0x2965,0x18e3,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2965,0x5aeb,0x4a69,0x39e7,0x2945,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x528a,0x9cf3,0x632c,0x4a69,0xbdd7,0xce79,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x4228,0xb5b6,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xdedb,0xce79,0x630c,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xd69a,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xd679,0xd679,0xce59,0xc638,0xbdf8,0xbdf7,0xbe17,0xc638,0xce79,0xd69a,0xce79,0xce79,0xce59,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce79,0xd679,0xce79,0xc638,0xbe18,0xbdf7,0xbdf7,0xc638,0xce59,0xd69a,0xd679,0xce79,0xce59,0xce79,0xce79,0xce79,0xce59,0xce79,0xce79,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xbdd7,0x6b4d,0x0000,0x0020,0x0000,0x0020,0x0000,0x39c7,0x630c,0x4a69,0x39e7,0x2945,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x5aeb,0x6b6d,0x630c,0x5aeb,0x52aa,0x4a49,0x39e7,0x3186,0x2124,0x10a2,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x5acb,0x5acb,0x4228,0x3186,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x528a,0x9cf3,0x632c,0x4a69,0xbdd7,0xce79,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0x8c51,0xc638,0xc638,0xb5b6,0xad55,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad55,0xb596,0xdedb,0xb5b6,0x0000,0x1082,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xce79,0xb5f7,0x9534,0x8430,0x7b4d,0x7acb,0x72aa,0x6aeb,0x634d,0x7410,0x9d14,0xc618,0xd69a,0xce79,0xce59,0xce79,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce79,0xce79,0xc638,0xa575,0x8c72,0x7bae,0x7b0c,0x72aa,0x6acb,0x632c,0x6bcf,0x8cb2,0xbdd7,0xce79,0xce7a,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xbdd7,0x6b4d,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x4a69,0x5acb,0x4228,0x2965,0x18c3,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x528a,0x738e,0x6b4d,0x630c,0x5acb,0x528a,0x4228,0x39c7,0x2945,0x18e3,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x3186,0x5aeb,0x4a69,0x39c7,0x2124,0x0861,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x528a,0x9cf3,0x632c,0x4a69,0xbdd7,0xce79,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xd69a,0xb5b6,0x9492,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8410,0x8c51,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xd69a,0xce59,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xce79,0xc618,0x94d3,0x8aeb,0xb8e3,0xe000,0xf020,0xf124,0xf1c7,0xf249,0xe2aa,0xbacb,0x8269,0x42cb,0x94d3,0xce38,0xd67a,0xce79,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xa575,0x83ae,0xa9a6,0xd800,0xf000,0xf0c3,0xf1a6,0xf228,0xea8a,0xcacb,0x9a8a,0x4a69,0x7410,0xbdd7,0xd679,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xbdd7,0x6b4d,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39e7,0x4228,0x31a6,0x2104,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2945,0x738e,0x6b6d,0x632c,0x5aeb,0x52aa,0x4a49,0x39e7,0x3186,0x2104,0x10a2,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x4a49,0x39e7,0x2965,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x528a,0x9cf3,0x632c,0x4a69,0xbdd7,0xce79,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xd69a,0xb5b6,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0xa514,0x94b2,0x7bcf,0x8410,0xc618,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xb596,0x7b4d,0xa800,0xe800,0xf800,0xf082,0xe8a2,0xd8a2,0xd0c3,0xd904,0xd9c7,0xf2cb,0xfbcf,0xdc10,0x728a,0x532c,0xbdb6,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xc618,0x8c51,0x9145,0xd000,0xf800,0xf061,0xe8a2,0xe0a2,0xd8c3,0xd104,0xd986,0xea69,0xfb8e,0xec30,0xa34d,0x3a28,0x9cf3,0xce79,0xce79,0xce59,0xce79,0xce79,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xbdd7,0x6b4d,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x18e3,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x52aa,0x73ae,0x632c,0x630c,0x5acb,0x4a69,0x4208,0x31a6,0x2945,0x18c3,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18c3,0x10a2,0x0841,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x528a,0x9cf3,0x632c,0x4a69,0xbdd7,0xce79,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdedb,0xd69a,0xc638,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xc618,0xad55,0x73ae,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xd69a,0xce59,0xce79,0xce79,0xce59,0xce79,0xce59,0xa534,0x71e7,0xb800,0xf020,0xf861,0xe820,0xd800,0xd000,0xc800,0xc000,0xb800,0xb000,0xa800,0xb820,0xeb0c,0xfcd3,0xb3ef,0x3208,0xb575,0xce79,0xce79,0xce59,0xce79,0xce59,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xce79,0xce59,0xce79,0xce79,0xbdd7,0x7b6d,0x9000,0xe000,0xf882,0xe841,0xd820,0xd800,0xd000,0xc000,0xb800,0xb000,0xa800,0xb000,0xda48,0xfc71,0xdcb2,0x49c7,0x8c71,0xce79,0xce79,0xce59,0xce79,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xbdd7,0x6b4d,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x632c,0x6b6d,0x630c,0x5acb,0x528a,0x4228,0x39c7,0x2965,0x2104,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x528a,0x9cd3,0x632c,0x528a,0xbdd7,0xce79,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd69a,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xad75,0x7bcf,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xd699,0xce59,0xce79,0xce59,0xce79,0xce59,0xa534,0x5145,0xb800,0xf8a2,0xf820,0xf000,0xe800,0xe800,0xe000,0xd000,0xc800,0xc000,0xb820,0xb041,0xa800,0x9800,0xc145,0xfcf3,0xc492,0x29e7,0xb5b6,0xce79,0xce59,0xce59,0xce79,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce59,0xce79,0xce79,0xce79,0xbdd7,0x630b,0x9000,0xe882,0xf861,0xf800,0xf000,0xe800,0xe000,0xd800,0xd000,0xc000,0xb820,0xb040,0xa820,0x9800,0xb000,0xfc0f,0xed55,0x5208,0x9492,0xce79,0xce59,0xce59,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xbdd7,0x6b4d,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2104,0x632c,0x6b4d,0x5aeb,0x528a,0x4a49,0x39e7,0x3186,0x2124,0x10a2,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x4a69,0x8410,0x52aa,0x630c,0xbdf7,0xce79,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd69a,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce79,0xce59,0xce79,0xce59,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce59,0xce79,0xce59,0xad75,0x73ae,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xce7a,0xce59,0xce79,0xce79,0xce79,0xad75,0x41c7,0xa800,0xf8e3,0xf841,0xf800,0xf800,0xf000,0xe800,0xe000,0xd800,0xd000,0xc800,0xc000,0xb800,0xb000,0xa882,0x9800,0xb000,0xfd34,0xb451,0x4aca,0xc638,0xce79,0xce59,0xce79,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xce59,0xce79,0xc618,0x738e,0x7000,0xe8c3,0xf881,0xf820,0xf800,0xf000,0xe800,0xe000,0xd800,0xd000,0xc800,0xc000,0xb800,0xb000,0xa861,0xa041,0xa000,0xf410,0xed75,0x31c7,0xad55,0xd69a,0xce59,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xbdd7,0x6b6d,0x10a2,0x0000,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0020,0x0000,0x0000,0x0020,0x0000,0x18c3,0x528a,0x5aeb,0x52aa,0x4a49,0x39e7,0x3186,0x2124,0x18c3,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x2104,0x31a6,0x39e7,0x8430,0xc638,0xce79,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd69a,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xd69a,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xd69a,0xce79,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce59,0xad75,0x73ae,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xce99,0xce59,0xce59,0xce79,0xc5f8,0x632c,0x7800,0xf0e3,0xf8a2,0xf881,0xf841,0xf800,0xf800,0xf000,0xe800,0xe000,0xd800,0xd000,0xc800,0xb800,0xb000,0xa800,0xa882,0x9800,0xb904,0xfd96,0x7b4d,0x8451,0xd679,0xce59,0xce59,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xce79,0xce59,0x9492,0x3800,0xd882,0xf8c3,0xf882,0xf841,0xf820,0xf800,0xf000,0xe800,0xe000,0xd800,0xd000,0xc800,0xc000,0xb000,0xa800,0xa820,0xa082,0xa000,0xfcd3,0xc4d3,0x428a,0xc638,0xce79,0xce59,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xc618,0x8430,0x39c7,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x0000,0x2965,0x4208,0x4228,0x4208,0x31a6,0x2945,0x18e3,0x1082,0x0000,0x0000,0x0000,0x0000,0x0841,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39c7,0x7bcf,0xad75,0xce59,0xce79,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd69a,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xce59,0xb596,0x9cd3,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x9492,0x94b2,0xa514,0xc618,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xce79,0xbdf7,0xa534,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x9492,0x9cd3,0xb596,0xce79,0xce79,0xce59,0xce79,0xce79,0xce79,0xce59,0xad75,0x7bcf,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xd699,0xce59,0xce59,0xce59,0x94b2,0x2800,0xd082,0xf904,0xf8c3,0xf8a2,0xf881,0xf820,0xf800,0xf800,0xe800,0xe800,0xe000,0xd800,0xd000,0xc000,0xb800,0xb000,0xa800,0xa0c3,0x9000,0xdb6d,0xe555,0x3228,0xbdd7,0xce79,0xce59,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce59,0xce79,0xb596,0x3a08,0xa000,0xf924,0xf8e3,0xf8a2,0xf882,0xf841,0xf800,0xf800,0xf000,0xe800,0xe000,0xd800,0xd000,0xc000,0xb800,0xb000,0xa800,0xa861,0x9800,0xc104,0xfd96,0x730c,0x94b2,0xd69a,0xce59,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xce59,0xb596,0x7bef,0x5acb,0x4a49,0x4228,0x4228,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x39e7,0x2965,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x18c3,0x18c3,0x1082,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x18e3,0x4a49,0x2945,0x31a6,0x4228,0x4208,0x4208,0x4208,0x4208,0x4228,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4208,0x4228,0x5acb,0x8c51,0xad55,0xb5b6,0xc638,0xce79,0xce59,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd69a,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xc618,0x8430,0x4208,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x3186,0x4a49,0x528a,0x630c,0xad55,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xad55,0x630c,0x3186,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x2965,0x39e7,0x528a,0x528a,0x8430,0xc638,0xce79,0xce59,0xce79,0xce79,0xce59,0xad75,0x7bcf,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xd67a,0xce59,0xce79,0xbdd7,0x52cb,0x8000,0xf944,0xf944,0xf904,0xf8c3,0xf8a2,0xf861,0xf820,0xf800,0xf000,0xe800,0xe800,0xe000,0xd000,0xc800,0xc000,0xb000,0xa800,0xa800,0x9841,0xa000,0xf534,0x93ae,0x8471,0xd69a,0xce59,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xce38,0x8c51,0x3800,0xe104,0xf945,0xf904,0xf8e3,0xf8a2,0xf861,0xf820,0xf800,0xf000,0xe800,0xe800,0xe000,0xd800,0xc800,0xc000,0xb800,0xb000,0xa800,0xa0a2,0x9000,0xec10,0xccf3,0x4acb,0xce39,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x7bcf,0xce79,0xce79,0xce79,0xce59,0xbdf7,0xad75,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xa534,0xad55,0x8c71,0x4a49,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x7bef,0x5aeb,0x528a,0x9cf3,0xad55,0xa534,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xbdd7,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xd69a,0x738e,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd69a,0xce79,0xce79,0xce79,0xce59,0xce79,0xbdf7,0x6b6d,0x0000,0x0000,0x18c3,0x2104,0x2104,0x2104,0x2104,0x2104,0x2104,0x2104,0x2104,0x2104,0x2104,0x2104,0x2104,0x2104,0x2104,0x2124,0x39c7,0x6b6d,0x7bcf,0x4a49,0xad75,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xce59,0x9cf3,0x2965,0x0000,0x0841,0x2104,0x2104,0x2104,0x2104,0x2104,0x2104,0x2104,0x2104,0x2104,0x2104,0x2104,0x2104,0x2104,0x2104,0x2124,0x2965,0x528a,0x7bef,0x5aeb,0x7bcf,0xc638,0xce79,0xce59,0xce79,0xce59,0xad75,0x73ae,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xce7a,0xce59,0xce59,0xa514,0x10c3,0xc061,0xf986,0xf965,0xf924,0xf903,0xf8c3,0xf882,0xf841,0xf800,0xf800,0xf000,0xf000,0xe800,0xd800,0xd000,0xc800,0xb800,0xb000,0xa800,0xa082,0x9000,0xe3cf,0xccd2,0x530c,0xce59,0xce79,0xce59,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xbdd7,0x52cb,0x8000,0xf986,0xf965,0xf924,0xf904,0xf8c3,0xf882,0xf861,0xf800,0xf800,0xf000,0xe800,0xe800,0xe000,0xd000,0xc800,0xc000,0xb000,0xa800,0xa841,0x9000,0xc1e7,0xf555,0x4a69,0xb596,0xd69a,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x73ae,0xce79,0xce59,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xad75,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x9492,0x7bef,0x3186,0xad75,0xd69a,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xd6ba,0x6b6d,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd69a,0xce79,0xce79,0xce79,0xce79,0xc618,0x7bcf,0x0000,0x1082,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x73ae,0x8430,0x630c,0xc638,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xad55,0x3186,0x0000,0x10a2,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x39e7,0x9492,0x5acb,0x9cd3,0xd69a,0xce59,0xce79,0xce59,0xad75,0x7bcf,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xce7a,0xce59,0xc638,0x8c30,0x3000,0xe144,0xf9c7,0xf986,0xf965,0xf924,0xf8e3,0xf8a2,0xf861,0xf820,0xf800,0xf800,0xf000,0xf000,0xe800,0xd800,0xd000,0xc000,0xb800,0xb000,0xa841,0x9800,0xc228,0xecf3,0x528a,0xbdd7,0xce99,0xce59,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xad55,0x2145,0xb082,0xf9c7,0xf986,0xf965,0xf924,0xf903,0xf8a3,0xf882,0xf820,0xf800,0xf800,0xf000,0xf000,0xe800,0xe000,0xd000,0xc800,0xb800,0xb000,0xa800,0x9820,0xa800,0xf4d3,0x936d,0x94b2,0xd69a,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x4a49,0xc618,0xd6ba,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa514,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xd69a,0xce79,0xd69a,0xce79,0x39e7,0x0000,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd69a,0xce79,0xce59,0xce79,0xce79,0xa534,0x2104,0x0000,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x0000,0x8c71,0x5aeb,0xa534,0xd69a,0xce59,0xce79,0xce79,0xce79,0xce59,0xce79,0xc618,0x738e,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x630c,0x8430,0x6b4d,0xce59,0xce79,0xce59,0xce59,0xad75,0x7bcf,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xd679,0xce59,0xc618,0x738e,0x5000,0xf1a6,0xf9e7,0xf9a6,0xf986,0xf945,0xf904,0xf8c3,0xf882,0xf841,0xf800,0xf800,0xf800,0xf000,0xf000,0xe000,0xd800,0xc800,0xc000,0xb800,0xa820,0xa000,0xb0c3,0xf4b2,0x62aa,0xad75,0xd69a,0xce59,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce59,0x9cd3,0x1000,0xc925,0xfa08,0xf9c6,0xf986,0xf945,0xf924,0xf8e3,0xf8a2,0xf861,0xf800,0xf800,0xf800,0xf800,0xf000,0xe000,0xd800,0xc800,0xc000,0xb800,0xb000,0xa061,0x9800,0xf410,0xbbcf,0x7410,0xd69a,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0x6b6d,0xb5b6,0xc618,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xc638,0xce79,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xce79,0xce59,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0xbdf7,0x73ae,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd69a,0xce79,0xce59,0xce79,0xce59,0x8430,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0x6b4d,0x6b6d,0x8c71,0xd69a,0xce59,0xce79,0xce79,0xce79,0xce59,0xce79,0xb596,0x4a49,0x0000,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2945,0x8410,0x5aeb,0xbdf7,0xce79,0xce59,0xce59,0xad75,0x7bcf,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xce99,0xce79,0xbdd7,0x5b0c,0x6800,0xf1e7,0xfa28,0xf9c7,0xf9a6,0xf965,0xf924,0xf8e3,0xf8a2,0xf841,0xf800,0xf800,0xf800,0xf800,0xf000,0xe800,0xd800,0xd000,0xc000,0xb800,0xb000,0xa020,0xa800,0xec71,0x72aa,0xa534,0xd69a,0xce59,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xc638,0x8c71,0x2000,0xd986,0xfa28,0xf9e7,0xf9a6,0xf965,0xf924,0xf8e3,0xf8a2,0xf861,0xf820,0xf800,0xf800,0xf800,0xf000,0xe800,0xe000,0xd000,0xc800,0xb800,0xb000,0xa861,0x9800,0xf38e,0xc3ef,0x6bcf,0xd679,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x1082,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39e7,0x18e3,0xa514,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd69a,0xa534,0x0841,0x39e7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39c7,0x39e7,0x0861,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd69a,0xce79,0xce59,0xce79,0xc638,0x7bef,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x52aa,0x5aeb,0x8c71,0xd69a,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xad75,0x39c7,0x0000,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18e3,0x6b6d,0x5aeb,0xbdf7,0xce79,0xce59,0xce59,0xad75,0x73ae,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xce79,0xce79,0xbdd7,0x5aeb,0x6800,0xf228,0xfa49,0xfa07,0xf9c7,0xf986,0xf945,0xf904,0xf8a2,0xf861,0xf820,0xf800,0xf800,0xf800,0xf000,0xe800,0xe000,0xd000,0xc800,0xc000,0xb800,0xa800,0xb000,0xec10,0x7a8a,0xa534,0xd69a,0xce59,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xc638,0x8c51,0x2000,0xd9a6,0xfa69,0xfa08,0xf9e7,0xf986,0xf945,0xf904,0xf8c3,0xf861,0xf820,0xf800,0xf800,0xf800,0xf000,0xe800,0xe000,0xd800,0xc800,0xc000,0xb800,0xb041,0xa000,0xf36d,0xc3ae,0x6bcf,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9cf3,0xd69a,0xce59,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd69a,0xce79,0xce59,0xce79,0xc638,0x8c51,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4a69,0x4a69,0xa514,0xd69a,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xb596,0x528a,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2965,0x52aa,0x6b6d,0xc638,0xce79,0xce59,0xce59,0xad75,0x73ae,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xd679,0xce79,0xbdf7,0x632c,0x5800,0xf208,0xfa69,0xfa28,0xf9e7,0xf9a6,0xf965,0xf924,0xf8c3,0xf861,0xf820,0xf800,0xf800,0xf800,0xf000,0xe800,0xe000,0xd800,0xc800,0xc000,0xb800,0xb000,0xb800,0xebcf,0x7269,0xad75,0xd69a,0xce59,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xc639,0x9471,0x1000,0xc9a6,0xfa8a,0xfa28,0xfa08,0xf9c7,0xf986,0xf924,0xf8e3,0xf882,0xf841,0xf820,0xf800,0xf800,0xf800,0xe800,0xe000,0xd800,0xd000,0xc800,0xb800,0xb041,0xa800,0xf34d,0xc32c,0x7410,0xd679,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0861,0x10a2,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x1082,0x18e3,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x18e3,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0861,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd69a,0xce79,0xce79,0xce79,0xce59,0xa534,0x39c7,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x18c3,0x3186,0x632c,0xbdf7,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xc618,0x7bcf,0x0000,0x1082,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0861,0x2945,0x39e7,0x9cd3,0xce79,0xce59,0xce79,0xce59,0xad75,0x73ae,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xce99,0xce59,0xc618,0x73ae,0x3800,0xe1e7,0xfa8a,0xfa49,0xfa28,0xf9e7,0xf986,0xf945,0xf904,0xf8a2,0xf841,0xf820,0xf820,0xf800,0xf800,0xe800,0xe000,0xd800,0xd000,0xc800,0xc020,0xb000,0xc925,0xf36d,0x628a,0xbdd7,0xd67a,0xce59,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce59,0x9cd3,0x0000,0xb945,0xfa8a,0xfa69,0xfa28,0xf9e7,0xf9a6,0xf965,0xf904,0xf8c2,0xf861,0xf841,0xf820,0xf800,0xf800,0xf000,0xe000,0xd800,0xd000,0xc800,0xc000,0xb820,0xb000,0xf34c,0xaaaa,0x8cb2,0xd69a,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x2965,0x2965,0x18c3,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd69a,0xce79,0xce79,0xce79,0xce79,0xc618,0x8430,0x0000,0x0000,0x0861,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x0000,0x0000,0x52aa,0xad55,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xad55,0x52aa,0x0000,0x0000,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x0020,0x0000,0x18c3,0x8410,0xc618,0xce79,0xce59,0xce79,0xce59,0xad75,0x73ae,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xce79,0xce59,0xc638,0x8c71,0x0000,0xc165,0xfaaa,0xfa69,0xfa49,0xfa08,0xf9c7,0xf986,0xf924,0xf8e3,0xf882,0xf861,0xf841,0xf820,0xf800,0xf000,0xe800,0xe000,0xd000,0xc800,0xc020,0xb800,0xe1e7,0xdacb,0x634d,0xc638,0xce79,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce59,0xad55,0x31e7,0x9000,0xfa8a,0xfa8a,0xfa49,0xfa28,0xf9e7,0xf986,0xf945,0xf8e3,0xf8a2,0xf861,0xf841,0xf820,0xf800,0xf000,0xe800,0xe000,0xd800,0xd000,0xc800,0xb800,0xc8a2,0xfb0c,0x7249,0xad75,0xd69a,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x10a2,0x4228,0x39e7,0x2945,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd69a,0xce79,0xce79,0xce79,0xce79,0xce59,0xbdf7,0x8c51,0x39e7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2945,0x73ae,0xad75,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xc638,0xad55,0x632c,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x528a,0x94b2,0xc618,0xce79,0xce59,0xce79,0xce79,0xce59,0xad75,0x73ae,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xce9a,0xce59,0xce59,0xa534,0x29a6,0x8800,0xfa69,0xfa8a,0xfa69,0xfa28,0xf9e7,0xf9a6,0xf965,0xf904,0xf8c3,0xf882,0xf861,0xf841,0xf800,0xf000,0xe800,0xe000,0xd800,0xd000,0xc820,0xc000,0xf269,0xaa08,0x8492,0xd679,0xce59,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xbdd7,0x6b4d,0x4000,0xea28,0xfaaa,0xfa69,0xfa49,0xfa08,0xf9c7,0xf985,0xf924,0xf8e3,0xf8a2,0xf861,0xf841,0xf800,0xf800,0xe800,0xe000,0xd800,0xd000,0xc820,0xc000,0xe9a6,0xe269,0x634c,0xc638,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x18c3,0x52aa,0x4a49,0x39c7,0x2124,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd69a,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xc638,0xad75,0x94b2,0x8430,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8430,0x94b2,0xb596,0xc638,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xbdf7,0xa514,0x8c51,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8410,0x8c51,0xa514,0xbdf7,0xce59,0xce79,0xce59,0xce79,0xce79,0xce79,0xce59,0xad75,0x73ae,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xce7a,0xce59,0xce79,0xbdd7,0x736d,0x2000,0xd9c7,0xfaaa,0xfa69,0xfa49,0xfa28,0xf9e7,0xf9a6,0xf945,0xf904,0xf8c3,0xf882,0xf841,0xf800,0xf800,0xe800,0xe000,0xd800,0xd800,0xc800,0xd8e3,0xf208,0x6a8a,0xb5d7,0xd679,0xce59,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xc638,0x94b2,0x0041,0xa924,0xfa8a,0xfa6a,0xfa49,0xfa28,0xf9e7,0xf9a6,0xf965,0xf904,0xf8c3,0xf8a2,0xf861,0xf820,0xf800,0xf000,0xe000,0xe000,0xd800,0xc800,0xd000,0xfa08,0xa1a6,0x8cd3,0xd679,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0861,0x52aa,0x52aa,0x4208,0x3186,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd69a,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce59,0xad75,0x7bcf,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xd679,0xce59,0xce79,0xce58,0x9cf3,0x2945,0x8000,0xfa49,0xfa8a,0xfa49,0xfa28,0xfa08,0xf9c7,0xf965,0xf924,0xf8e3,0xf8a2,0xf861,0xf820,0xf800,0xf000,0xe800,0xe000,0xd800,0xd000,0xf965,0xb924,0x7c92,0xce79,0xce79,0xce79,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce59,0xce59,0xb5b6,0x62eb,0x3800,0xe208,0xfaaa,0xfa49,0xfa49,0xfa08,0xf9c7,0xf986,0xf945,0xf903,0xf8c3,0xf882,0xf841,0xf800,0xf000,0xe800,0xe000,0xd800,0xd000,0xf124,0xe104,0x632c,0xbe18,0xce79,0xce59,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0020,0x0000,0x4208,0x630c,0x4a69,0x39c7,0x2104,0x0841,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd69a,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xad75,0x7bcf,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xd67a,0xce59,0xce59,0xce79,0xbdf7,0x83ef,0x0000,0xa8e4,0xfa69,0xfa89,0xfa48,0xfa08,0xf9e7,0xf9a6,0xf945,0xf904,0xf8c3,0xf882,0xf841,0xf800,0xf000,0xe800,0xe000,0xd820,0xf8c3,0xe000,0x6b6d,0xbe18,0xce79,0xce59,0xce79,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xce79,0xce39,0x9cf3,0x3165,0x7000,0xf228,0xfa8a,0xfa49,0xfa28,0xf9e7,0xf9a6,0xf965,0xf924,0xf8e3,0xf882,0xf841,0xf800,0xf800,0xf000,0xe000,0xd800,0xf0c2,0xf800,0x89e7,0xa555,0xd679,0xce79,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x4a69,0x52aa,0x4208,0x2965,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd69a,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xad75,0x7bcf,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xce9a,0xce59,0xce79,0xce79,0xce59,0xb5b6,0x6b2c,0x0000,0xb104,0xfa49,0xfa69,0xfa28,0xf9e7,0xf9a6,0xf965,0xf924,0xf8e3,0xf8a2,0xf861,0xf800,0xf800,0xf000,0xe841,0xf882,0xe800,0x82cb,0xadb6,0xd679,0xce59,0xce79,0xce79,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xce79,0xce79,0xc618,0x8c51,0x1000,0x7800,0xea08,0xfa69,0xfa28,0xfa07,0xf9c7,0xf986,0xf945,0xf903,0xf8a2,0xf861,0xf820,0xf800,0xf000,0xe820,0xf082,0xf800,0xa945,0x8cd3,0xce79,0xce79,0xce79,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x39c7,0x39e7,0x2965,0x18c3,0x0020,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd69a,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xb596,0x7bcf,0x8410,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xd69a,0xce59,0xce79,0xce79,0xce79,0xce59,0xad75,0x6b2c,0x0000,0x9000,0xe9c7,0xfa28,0xfa08,0xf9c7,0xf986,0xf945,0xf904,0xf8c3,0xf881,0xf840,0xf841,0xf882,0xe800,0xd000,0x830c,0xad96,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xce79,0xce79,0xce59,0xbdf7,0x8c30,0x18a2,0x6000,0xd1a6,0xfa28,0xfa08,0xf9e7,0xf9a6,0xf965,0xf924,0xf8c3,0xf882,0xf841,0xf820,0xf882,0xf020,0xe000,0x99e7,0x8cd3,0xce59,0xce79,0xce59,0xce79,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0020,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x94b2,0x8410,0x2104,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd6ba,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xbdf7,0x8430,0x8410,0xc638,0xc638,0x18c3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xce79,0xce59,0xce79,0xce79,0xce59,0xce59,0xce59,0xb596,0x83cf,0x1904,0x4800,0xa8a2,0xe186,0xf9c7,0xf9a6,0xf986,0xf945,0xf904,0xf8e3,0xf082,0xe000,0xc000,0x9986,0x8410,0xb5d7,0xce79,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xce59,0xce59,0xce79,0xce59,0xbdf7,0x94b2,0x4a49,0x0000,0x9000,0xd165,0xf1a7,0xf9a7,0xf986,0xf945,0xf924,0xf8e3,0xf8a2,0xe800,0xc800,0xa800,0x834d,0xa555,0xce59,0xce79,0xce59,0xce79,0xce79,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x3186,0x9492,0x7bef,0x2945,0xa534,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x9492,0xce59,0xdedb,0xdefb,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd6ba,0xd69a,0xad75,0x9492,0xc638,0xc638,0x18e3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xbdf7,0xa4f3,0x6b4d,0x10e3,0x3800,0x7000,0x9800,0xa800,0xb000,0xa800,0x9800,0x8000,0x79a6,0x83cf,0xa575,0xc638,0xce79,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xce79,0xce79,0xce59,0xce79,0xce59,0xc638,0xad75,0x83ef,0x31e7,0x1000,0x6000,0x9000,0xa800,0xb000,0xb000,0xa000,0x8800,0x7882,0x832c,0x9cf3,0xbe17,0xce79,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xad55,0x4a69,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0x73ae,0x630c,0x4228,0xad75,0xce79,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8c71,0xc638,0xd6ba,0xd6ba,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xce59,0xbdd7,0xce79,0xc618,0x18c3,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xbdf7,0xad34,0x8c51,0x6b6d,0x52cb,0x4a8a,0x4a8a,0x5b0c,0x7bcf,0x9cd3,0xb5b7,0xc659,0xce79,0xce79,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce79,0xce59,0xc618,0xb596,0x94b2,0x73ae,0x5b0c,0x4a8a,0x4a89,0x52cb,0x6b6d,0x8c71,0xad75,0xc618,0xce79,0xce79,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce59,0xad75,0x52aa,0x0861,0x0000,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0841,0x0861,0x0020,0x0861,0x31a6,0x73ae,0xbdd7,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0x738e,0xb5b6,0xce59,0xce79,0xce79,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce79,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xdedb,0xa534,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xc638,0xc5f7,0xbdf7,0xbdf7,0xc638,0xce59,0xce79,0xce79,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xc638,0xc618,0xbdf7,0xbdf7,0xc618,0xce59,0xce79,0xce79,0xce79,0xce59,0xce59,0xce59,0xce79,0xce59,0xce79,0xce79,0xce59,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce79,0xbdf7,0x7bcf,0x31a6,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x4a49,0x7bef,0xad55,0xc638,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x7bef,0xa534,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xb596,0xbdd7,0xad55,0x39c7,0x0000,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2965,0xbdf7,0xce79,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce79,0xce59,0xce59,0xd69a,0x5acb,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce79,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xd6ba,0xa514,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cf3,0xd69a,0xce59,0xce59,0xb596,0x8410,0x6b4d,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x5aeb,0x6b4d,0x9492,0xb5b6,0xbdf7,0xc638,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x0000,0x3186,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x39e7,0x0000,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0020,0x0000,0xad75,0xd6ba,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xd69a,0xce79,0x39e7,0x0000,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x8410,0xd69a,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xd6ba,0x8c51,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0x9cf3,0xd69a,0xce59,0xce79,0xce59,0xc618,0xbdd7,0xb5b6,0xb5b6,0xb5b6,0xb5b6,0xb5b6,0xb5b6,0xb5b6,0xb5b6,0xb5b6,0xb5b6,0xb5b6,0xb5b6,0xb5b6,0xb5b6,0xbdf7,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0x5acb,0xbdf7,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xd69a,0x8c71,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x2104,0xa534,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xd69a,0xb5b6,0x10a2,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0000,0x9cd3,0xd69a,0xce59,0xce59,0xce59,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xd6ba,0x9cf3,0x0000,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x39c7,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b6d,0x6b6d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b6d,0x5acb,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x1082,0x630c,0x6b6d,0x6b4d,0x6b6d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b4d,0x6b6d,0x6b4d,0x18e3,0x0000,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0x632c,0xce59,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0x632c,0x0000,0x1082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x1041,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x6b6d,0xad55,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0xad75,0x7bcf,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x18c3,0x10a2,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x18c3,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x0882,0x0082,0x0082,0x0082,0x0082,0x0082,0x00a2,0x0082,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x1082,0x0082,0x0082,0x0082,0x0082,0x0082,0x0082,0x00a2,0x0041,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x6b6d,0x8c51,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c51,0x6b4d,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0000,0x9020,0xb841,0xb841,0xb841,0xb841,0xb841,0xb861,0x90a2,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0000,0x3800,0xa000,0xb841,0xb841,0xb841,0xb841,0xb861,0x98a2,0x2841,0x0000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x1082,0x0841,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0020,0x0000,0x0841,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0x6b6d,0xa514,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0x9cf3,0xa514,0x632c,0x0000,0x0861,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0000,0xb800,0xc820,0x8800,0x8800,0x8800,0x8800,0x9800,0xd061,0x90c3,0x0000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0000,0xa800,0xd000,0x9000,0x8800,0x8800,0x8800,0x9000,0xd040,0xa8c3,0x0020,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x8c71,0x9cf3,0x94b2,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x94b2,0x9cf3,0x8430,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0000,0xb000,0xb0a2,0x0041,0x0020,0x0020,0x0020,0x2000,0xc000,0xa882,0x0020,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xa8a2,0x0041,0x0020,0x0020,0x0020,0x0020,0xb000,0xc082,0x0041,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xb000,0xd020,0xc041,0xc820,0xc841,0xc041,0xc800,0xd021,0x6862,0x0000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xb800,0xc820,0xc041,0xc040,0xc040,0xc041,0xc020,0xd000,0xb882,0x1041,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18c3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8430,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0000,0xb000,0xb841,0x6800,0x7000,0x7000,0x6800,0x7000,0xc820,0x98c3,0x0000,0x1000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xb800,0xb841,0x7000,0x7800,0x7800,0x7800,0x7000,0xb800,0xb882,0x0041,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18c3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8430,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xb800,0xb8a2,0x3061,0x4820,0x4841,0x4041,0x6000,0xd000,0xa881,0x0000,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xc000,0xb0a2,0x0020,0x0000,0x0000,0x0000,0x0000,0xb000,0xc0a2,0x0041,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0841,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce59,0xce59,0xd69a,0x7bef,0x0000,0x10a2,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0020,0x0000,0x18e3,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0800,0x0000,0xa000,0xc800,0xc820,0xc820,0xc820,0xc820,0xc800,0xb000,0x4000,0x0000,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0xb000,0xa082,0x0000,0x1800,0x1800,0x1800,0x0000,0xa800,0xb061,0x0020,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0861,0x0000,0xa534,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd6ba,0x8c51,0x0000,0x2124,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x1082,0x0020,0x2104,0x8c71,0x9cf3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cd3,0x9cf3,0x8c51,0x0861,0x0861,0x1082,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x1061,0x0062,0x3082,0x5061,0x5061,0x5061,0x5061,0x5061,0x4861,0x0061,0x0061,0x1061,0x0862,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x1061,0x0061,0x3861,0x3061,0x0062,0x1061,0x0861,0x1061,0x0061,0x3061,0x3861,0x0061,0x1062,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x0861,0x10a2,0x1082,0x0000,0xad75,0xd69a,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce59,0xd69a,0xbdf7,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x8c51,0x9cd3,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x94b2,0x9cd3,0x8410,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x73ae,0xce59,0xce79,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce79,0xce59,0xd6ba,0xbdf7,0x73ae,0x5aeb,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x5aeb,0x632c,0xa514,0xad75,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad55,0xad75,0x9cf3,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x62ec,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630b,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x5b0c,0x630c,0x62ec,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x5b0c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x630c,0x5aeb,0x632c,0x9cd3,0xce59,0xce79,0xce59,0xce59,0xd69a,0xc618,
0xce79,0xce79,0xce79,0xce79,0xce59,0xd69a,0xd6ba,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xce79,0xce59,0xce79,0xce59,0xd69a,0xc618,
0xce79,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce79,0xce79,0xce59,0xce79,0xc618,
0xce59,0xce79,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xce59,0xd6ba,0xbdd7,
0x8c71,0xce59,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xd69a,0xce79,0x738e,
0x0000,0x632c,0x8c51,0x8c71,0x8c51,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c51,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c51,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c51,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c51,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c51,0x8c71,0x8c71,0x8c51,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c51,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c51,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c51,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c51,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c51,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c51,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c71,0x8c51,0x8c71,0x8c51,0x5acb,0x0000};

View file

@ -0,0 +1,63 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map0.c
**
** mapper 0 interface
** $Id: map000.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
const mapintf_t map0_intf =
{
0, /* mapper number */
"None", /* mapper name */
NULL, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
NULL, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map000.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:32 matt
** changed directory structure
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/04 23:11:45 matt
** initial revision
**
*/

View file

@ -0,0 +1,242 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map1.c
**
** mapper 1 interface
** $Id: map001.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include <string.h>
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes_ppu.h"
/* TODO: WRAM enable ala Mark Knibbs:
==================================
The SNROM board uses 8K CHR-RAM. The CHR-RAM is paged (i.e. it can be split
into two 4Kbyte pages).
The CRA16 line of the MMC1 is connected to the /CS1 pin of the WRAM. THIS MEANS
THAT THE WRAM CAN BE ENABLED OR DISABLED ACCORDING TO THE STATE OF THE CRA16
LINE. The CRA16 line corresponds to bit 4 of MMC1 registers 1 & 2.
The WRAM is enabled when the CRA16 line is low, and disabled when CRA16 is
high. This has implications when CHR page size is 4K, if the two page numbers
set have different CRA16 states (e.g. reg 1 bit 4 = 0, reg 2 bit 4 = 1). Then
the WRAM will be enabled and disabled depending on what CHR address is being
accessed.
When CHR page size is 8K, bit 4 of MMC1 register 1 (and not register 2, because
page size is 8K) controls whether the WRAM is enabled or not. It must be low
to be enabled. When the WRAM is disabled, reading from and writing to it will
not be possible.
*/
/* TODO: roll this into something... */
static int bitcount = 0;
static uint8 latch = 0;
static uint8 regs[4];
static int bank_select;
static uint8 lastreg;
static void map1_write(uint32 address, uint8 value)
{
int regnum = (address >> 13) - 4;
if (value & 0x80)
{
regs[0] |= 0x0C;
bitcount = 0;
latch = 0;
return;
}
if (lastreg != regnum)
{
bitcount = 0;
latch = 0;
lastreg = regnum;
}
//lastreg = regnum;
latch |= ((value & 1) << bitcount++);
/* 5 bit registers */
if (5 != bitcount)
return;
regs[regnum] = latch;
value = latch;
bitcount = 0;
latch = 0;
switch (regnum)
{
case 0:
{
if (0 == (value & 2))
{
int mirror = value & 1;
ppu_mirror(mirror, mirror, mirror, mirror);
}
else
{
if (value & 1)
ppu_mirror(0, 0, 1, 1);
else
ppu_mirror(0, 1, 0, 1);
}
}
break;
case 1:
if (regs[0] & 0x10)
mmc_bankvrom(4, 0x0000, value);
else
mmc_bankvrom(8, 0x0000, value >> 1);
break;
case 2:
if (regs[0] & 0x10)
mmc_bankvrom(4, 0x1000, value);
break;
case 3:
if (mmc_getinfo()->rom_banks == 0x20)
{
bank_select = (regs[1] & 0x10) ? 0 : 0x10;
}
else if (mmc_getinfo()->rom_banks == 0x40)
{
if (regs[0] & 0x10)
bank_select = (regs[1] & 0x10) | ((regs[2] & 0x10) << 1);
else
bank_select = (regs[1] & 0x10) << 1;
}
else
{
bank_select = 0;
}
if (0 == (regs[0] & 0x08))
mmc_bankrom(32, 0x8000, ((regs[3] >> 1) + (bank_select >> 1)));
else if (regs[0] & 0x04)
mmc_bankrom(16, 0x8000, ((regs[3] & 0xF) + bank_select));
else
mmc_bankrom(16, 0xC000, ((regs[3] & 0xF) + bank_select));
default:
break;
}
}
static void map1_init(void)
{
bitcount = 0;
latch = 0;
memset(regs, 0, sizeof(regs));
if (mmc_getinfo()->rom_banks == 0x20)
mmc_bankrom(16, 0xC000, 0x0F);
map1_write(0x8000, 0x80);
}
static void map1_getstate(SnssMapperBlock *state)
{
state->extraData.mapper1.registers[0] = regs[0];
state->extraData.mapper1.registers[1] = regs[1];
state->extraData.mapper1.registers[2] = regs[2];
state->extraData.mapper1.registers[3] = regs[3];
state->extraData.mapper1.latch = latch;
state->extraData.mapper1.numberOfBits = bitcount;
}
static void map1_setstate(SnssMapperBlock *state)
{
regs[1] = state->extraData.mapper1.registers[0];
regs[1] = state->extraData.mapper1.registers[1];
regs[2] = state->extraData.mapper1.registers[2];
regs[3] = state->extraData.mapper1.registers[3];
latch = state->extraData.mapper1.latch;
bitcount = state->extraData.mapper1.numberOfBits;
}
static map_memwrite map1_memwrite[] =
{
{ 0x8000, 0xFFFF, map1_write },
{ -1, -1, NULL }
};
const mapintf_t map1_intf =
{
1, /* mapper number */
"MMC1", /* mapper name */
map1_init, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
map1_getstate, /* get state (snss) */
map1_setstate, /* set state (snss) */
NULL, /* memory read structure */
map1_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map001.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:32 matt
** changed directory structure
**
** Revision 1.8 2000/10/22 19:46:50 matt
** mirroring bugfix
**
** Revision 1.7 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.6 2000/10/22 15:03:13 matt
** simplified mirroring
**
** Revision 1.5 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.4 2000/07/15 23:52:19 matt
** rounded out a bunch more mapper interfaces
**
** Revision 1.3 2000/07/10 05:29:03 matt
** cleaned up some mirroring issues
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/04 23:11:45 matt
** initial revision
**
*/

View file

@ -0,0 +1,86 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map2.c
**
** mapper 2 interface
** $Id: map002.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
/* mapper 2: UNROM */
static void map2_write(uint32 address, uint8 value)
{
UNUSED(address);
mmc_bankrom(16, 0x8000, value);
}
static const map_memwrite map2_memwrite[] =
{
{ 0x8000, 0xFFFF, map2_write },
{ -1, -1, NULL }
};
const mapintf_t map2_intf =
{
2, /* mapper number */
"UNROM", /* mapper name */
NULL, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map2_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map002.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:32 matt
** changed directory structure
**
** Revision 1.5 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.4 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.3 2000/08/16 02:50:11 matt
** random mapper cleanups
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/04 23:11:45 matt
** initial revision
**
*/

View file

@ -0,0 +1,85 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map3.c
**
** mapper 3 interface
** $Id: map003.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
/* mapper 3: CNROM */
static void map3_write(uint32 address, uint8 value)
{
UNUSED(address);
mmc_bankvrom(8, 0x0000, value);
}
static const map_memwrite map3_memwrite[] =
{
{ 0x8000, 0xFFFF, map3_write },
{ -1, -1, NULL }
};
const mapintf_t map3_intf =
{
3, /* mapper number */
"CNROM", /* mapper name */
NULL, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map3_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map003.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:32 matt
** changed directory structure
**
** Revision 1.5 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.4 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.3 2000/08/16 02:50:11 matt
** random mapper cleanups
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/04 23:11:45 matt
** initial revision
**
*/

View file

@ -0,0 +1,269 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map4.c
**
** mapper 4 interface
** $Id: map004.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes.h"
#include "libsnss.h"
static struct
{
int counter, latch;
bool enabled, reset;
} irq;
static uint8 reg;
static uint8 command;
static uint16 vrombase;
/* mapper 4: MMC3 */
static void map4_write(uint32 address, uint8 value)
{
switch (address & 0xE001)
{
case 0x8000:
command = value;
vrombase = (command & 0x80) ? 0x1000 : 0x0000;
if (reg != (value & 0x40))
{
if (value & 0x40)
mmc_bankrom(8, 0x8000, (mmc_getinfo()->rom_banks * 2) - 2);
else
mmc_bankrom(8, 0xC000, (mmc_getinfo()->rom_banks * 2) - 2);
}
reg = value & 0x40;
break;
case 0x8001:
switch (command & 0x07)
{
case 0:
value &= 0xFE;
mmc_bankvrom(1, vrombase ^ 0x0000, value);
mmc_bankvrom(1, vrombase ^ 0x0400, value + 1);
break;
case 1:
value &= 0xFE;
mmc_bankvrom(1, vrombase ^ 0x0800, value);
mmc_bankvrom(1, vrombase ^ 0x0C00, value + 1);
break;
case 2:
mmc_bankvrom(1, vrombase ^ 0x1000, value);
break;
case 3:
mmc_bankvrom(1, vrombase ^ 0x1400, value);
break;
case 4:
mmc_bankvrom(1, vrombase ^ 0x1800, value);
break;
case 5:
mmc_bankvrom(1, vrombase ^ 0x1C00, value);
break;
case 6:
mmc_bankrom(8, (command & 0x40) ? 0xC000 : 0x8000, value);
break;
case 7:
mmc_bankrom(8, 0xA000, value);
break;
}
break;
case 0xA000:
/* four screen mirroring crap */
if (0 == (mmc_getinfo()->flags & ROM_FLAG_FOURSCREEN))
{
if (value & 1)
ppu_mirror(0, 0, 1, 1); /* horizontal */
else
ppu_mirror(0, 1, 0, 1); /* vertical */
}
break;
case 0xA001:
/* Save RAM enable / disable */
/* Messes up Startropics I/II if implemented -- bah */
break;
case 0xC000:
irq.latch = value;
// if (irq.reset)
// irq.counter = irq.latch;
break;
case 0xC001:
irq.reset = true;
irq.counter = irq.latch;
break;
case 0xE000:
irq.enabled = false;
// if (irq.reset)
// irq.counter = irq.latch;
break;
case 0xE001:
irq.enabled = true;
// if (irq.reset)
// irq.counter = irq.latch;
break;
default:
break;
}
if (true == irq.reset)
irq.counter = irq.latch;
}
static void map4_hblank(int vblank)
{
if (vblank)
return;
if (ppu_enabled())
{
if (irq.counter >= 0)
{
irq.reset = false;
irq.counter--;
if (irq.counter < 0)
{
if (irq.enabled)
{
irq.reset = true;
nes_irq();
}
}
}
}
}
static void map4_getstate(SnssMapperBlock *state)
{
state->extraData.mapper4.irqCounter = irq.counter;
state->extraData.mapper4.irqLatchCounter = irq.latch;
state->extraData.mapper4.irqCounterEnabled = irq.enabled;
state->extraData.mapper4.last8000Write = command;
}
static void map4_setstate(SnssMapperBlock *state)
{
irq.counter = state->extraData.mapper4.irqCounter;
irq.latch = state->extraData.mapper4.irqLatchCounter;
irq.enabled = state->extraData.mapper4.irqCounterEnabled;
command = state->extraData.mapper4.last8000Write;
}
static void map4_init(void)
{
irq.counter = irq.latch = 0;
irq.enabled = irq.reset = false;
reg = command = 0;
vrombase = 0x0000;
}
static const map_memwrite map4_memwrite[] =
{
{ 0x8000, 0xFFFF, map4_write },
{ -1, -1, NULL }
};
const mapintf_t map4_intf =
{
4, /* mapper number */
"MMC3", /* mapper name */
map4_init, /* init routine */
NULL, /* vblank callback */
map4_hblank, /* hblank callback */
map4_getstate, /* get state (snss) */
map4_setstate, /* set state (snss) */
NULL, /* memory read structure */
map4_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map004.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.2 2000/11/26 15:40:49 matt
** hey, it actually works now
**
** Revision 1.1 2000/10/24 12:19:32 matt
** changed directory structure
**
** Revision 1.12 2000/10/23 15:53:27 matt
** suppressed warnings
**
** Revision 1.11 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.10 2000/10/22 15:03:13 matt
** simplified mirroring
**
** Revision 1.9 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.8 2000/10/10 13:58:17 matt
** stroustrup squeezing his way in the door
**
** Revision 1.7 2000/10/08 18:05:44 matt
** kept old version around, just in case....
**
** Revision 1.6 2000/07/15 23:52:19 matt
** rounded out a bunch more mapper interfaces
**
** Revision 1.5 2000/07/10 13:51:25 matt
** using generic nes_irq() routine now
**
** Revision 1.4 2000/07/10 05:29:03 matt
** cleaned up some mirroring issues
**
** Revision 1.3 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.2 2000/07/05 05:04:39 matt
** minor modifications
**
** Revision 1.1 2000/07/04 23:11:45 matt
** initial revision
**
*/

View file

@ -0,0 +1,326 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map5.c
**
** mapper 5 interface
** $Id: map005.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes.h"
#include "log.h"
#include "mmc5_snd.h"
/* TODO: there's lots of info about this mapper now;
** let's implement it correctly/completely
*/
static struct
{
int counter, enabled;
int reset, latch;
} irq;
/* MMC5 - Castlevania III, etc */
static void map5_hblank(int vblank)
{
UNUSED(vblank);
if (irq.counter == nes_getcontextptr()->scanline)
{
if (true == irq.enabled)
{
nes_irq();
irq.reset = true;
}
//else
// irq.reset = false;
irq.counter = irq.latch;
}
}
static void map5_write(uint32 address, uint8 value)
{
static int page_size = 8;
/* ex-ram memory-- bleh! */
if (address >= 0x5C00 && address <= 0x5FFF)
return;
switch (address)
{
case 0x5100:
/* PRG page size setting */
/* 0:32k 1:16k 2,3:8k */
switch (value & 3)
{
case 0:
page_size = 32;
break;
case 1:
page_size = 16;
break;
case 2:
case 3:
page_size = 8;
break;
}
break;
case 0x5101:
/* CHR page size setting */
/* 0:8k 1:4k 2:2k 3:1k */
break;
case 0x5104:
/* GFX mode setting */
/*
00:split mode
01:split & exgraffix
10:ex-ram
11:exram + write protect
*/
break;
case 0x5105:
/* TODO: exram needs to fill in nametables 2-3 */
ppu_mirror(value & 3, (value >> 2) & 3, (value >> 4) & 3, value >> 6);
break;
case 0x5106:
case 0x5107:
/* ex-ram fill mode stuff */
break;
case 0x5113:
/* ram page for $6000-7FFF? bit 2*/
break;
case 0x5114:
mmc_bankrom(8, 0x8000, value);
//if (page_size == 8)
// mmc_bankrom(8, 0x8000, value);
break;
case 0x5115:
mmc_bankrom(8, 0x8000, value);
mmc_bankrom(8, 0xA000, value + 1);
//if (page_size == 8)
// mmc_bankrom(8, 0xA000, value);
//else if (page_size == 16)
// mmc_bankrom(16, 0x8000, value >> 1);
//mmc_bankrom(16, 0x8000, value & 0xFE);
break;
case 0x5116:
mmc_bankrom(8, 0xC000, value);
//if (page_size == 8)
// mmc_bankrom(8, 0xC000, value);
break;
case 0x5117:
//if (page_size == 8)
// mmc_bankrom(8, 0xE000, value);
//else if (page_size == 16)
// mmc_bankrom(16, 0xC000, value >> 1);
//mmc_bankrom(16, 0xC000, value & 0xFE);
//else if (page_size == 32)
// mmc_bankrom(32, 0x8000, value >> 2);
//mmc_bankrom(32, 0x8000, value & 0xFC);
break;
case 0x5120:
mmc_bankvrom(1, 0x0000, value);
break;
case 0x5121:
mmc_bankvrom(1, 0x0400, value);
break;
case 0x5122:
mmc_bankvrom(1, 0x0800, value);
break;
case 0x5123:
mmc_bankvrom(1, 0x0C00, value);
break;
case 0x5124:
case 0x5125:
case 0x5126:
case 0x5127:
/* more VROM shit? */
break;
case 0x5128:
mmc_bankvrom(1, 0x1000, value);
break;
case 0x5129:
mmc_bankvrom(1, 0x1400, value);
break;
case 0x512A:
mmc_bankvrom(1, 0x1800, value);
break;
case 0x512B:
mmc_bankvrom(1, 0x1C00, value);
break;
case 0x5203:
irq.counter = value;
irq.latch = value;
// irq.reset = false;
break;
case 0x5204:
irq.enabled = (value & 0x80) ? true : false;
// irq.reset = false;
break;
default:
#ifdef NOFRENDO_DEBUG
log_printf("unknown mmc5 write: $%02X to $%04X\n", value, address);
#endif /* NOFRENDO_DEBUG */
break;
}
}
static uint8 map5_read(uint32 address)
{
/* Castlevania 3 IRQ counter */
if (address == 0x5204)
{
/* if reset == 1, we've hit scanline */
return (irq.reset ? 0x40 : 0x00);
}
else
{
#ifdef NOFRENDO_DEBUG
log_printf("invalid MMC5 read: $%04X", address);
#endif
return 0xFF;
}
}
static void map5_init(void)
{
mmc_bankrom(8, 0x8000, MMC_LASTBANK);
mmc_bankrom(8, 0xA000, MMC_LASTBANK);
mmc_bankrom(8, 0xC000, MMC_LASTBANK);
mmc_bankrom(8, 0xE000, MMC_LASTBANK);
irq.counter = irq.enabled = 0;
irq.reset = irq.latch = 0;
}
/* incomplete SNSS definition */
static void map5_getstate(SnssMapperBlock *state)
{
state->extraData.mapper5.dummy = 0;
}
static void map5_setstate(SnssMapperBlock *state)
{
UNUSED(state);
}
static map_memwrite map5_memwrite[] =
{
/* $5000 - $5015 handled by sound */
{ 0x5016, 0x5FFF, map5_write },
{ 0x8000, 0xFFFF, map5_write },
{ -1, -1, NULL }
};
static map_memread map5_memread[] =
{
{ 0x5204, 0x5204, map5_read },
{ -1, -1, NULL }
};
mapintf_t map5_intf =
{
5, /* mapper number */
"MMC5", /* mapper name */
map5_init, /* init routine */
NULL, /* vblank callback */
map5_hblank, /* hblank callback */
map5_getstate, /* get state (snss) */
map5_setstate, /* set state (snss) */
map5_memread, /* memory read structure */
map5_memwrite, /* memory write structure */
&mmc5_ext /* external sound device */
};
/*
** $Log: map005.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.2 2000/11/25 20:32:33 matt
** scanline interface change
**
** Revision 1.1 2000/10/24 12:19:32 matt
** changed directory structure
**
** Revision 1.11 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.10 2000/10/21 19:33:37 matt
** many more cleanups
**
** Revision 1.9 2000/10/17 03:23:16 matt
** added mmc5 sound interface
**
** Revision 1.8 2000/10/10 13:58:17 matt
** stroustrup squeezing his way in the door
**
** Revision 1.7 2000/08/16 02:50:11 matt
** random mapper cleanups
**
** Revision 1.6 2000/07/15 23:52:19 matt
** rounded out a bunch more mapper interfaces
**
** Revision 1.5 2000/07/10 13:51:25 matt
** using generic nes_irq() routine now
**
** Revision 1.4 2000/07/10 05:29:03 matt
** cleaned up some mirroring issues
**
** Revision 1.3 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.2 2000/07/05 05:04:51 matt
** fixed h-blank callback
**
** Revision 1.1 2000/07/04 23:11:45 matt
** initial revision
**
*/

View file

@ -0,0 +1,99 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map7.c
**
** mapper 7 interface
** $Id: map007.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes_ppu.h"
#include "log.h"
/* mapper 7: AOROM */
static void map7_write(uint32 address, uint8 value)
{
int mirror;
UNUSED(address);
mmc_bankrom(32, 0x8000, value);
mirror = (value & 0x10) >> 4;
ppu_mirror(mirror, mirror, mirror, mirror);
}
static void map7_init(void)
{
mmc_bankrom(32, 0x8000, 0);
}
static const map_memwrite map7_memwrite[] =
{
{ 0x8000, 0xFFFF, map7_write },
{ -1, -1, NULL }
};
const mapintf_t map7_intf =
{
7, /* mapper number */
"AOROM", /* mapper name */
map7_init, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map7_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map007.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:32 matt
** changed directory structure
**
** Revision 1.6 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.5 2000/10/22 15:03:13 matt
** simplified mirroring
**
** Revision 1.4 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.3 2000/08/16 02:50:11 matt
** random mapper cleanups
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/04 23:11:45 matt
** initial revision
**
*/

View file

@ -0,0 +1,94 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map8.c
**
** mapper 8 interface
** $Id: map008.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
/* mapper 8: FFE F3xxx -- what the hell uses this? */
static void map8_write(uint32 address, uint8 value)
{
UNUSED(address);
mmc_bankrom(16, 0x8000, value >> 3);
mmc_bankvrom(8, 0x0000, value & 7);
}
static void map8_init(void)
{
mmc_bankrom(16, 0x8000, 0);
mmc_bankrom(16, 0xC000, 1);
mmc_bankvrom(8, 0x0000, 0);
}
static const map_memwrite map8_memwrite[] =
{
{ 0x8000, 0xFFFF, map8_write },
{ -1, -1, NULL }
};
const mapintf_t map8_intf =
{
8, /* mapper number */
"FFE F3xxx", /* mapper name */
map8_init, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map8_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map008.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:32 matt
** changed directory structure
**
** Revision 1.5 2000/10/22 19:17:47 matt
** mapper cleanups galore
**
** Revision 1.4 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.3 2000/08/16 02:50:11 matt
** random mapper cleanups
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/04 23:11:45 matt
** initial revision
**
*/

View file

@ -0,0 +1,199 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map9.c
**
** mapper 9 interface
** $Id: map009.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include <string.h>
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes_ppu.h"
#include "libsnss.h"
static uint8 latch[2];
static uint8 regs[4];
/* Used when tile $FD/$FE is accessed */
static void mmc9_latchfunc(uint32 address, uint8 value)
{
if (0xFD == value || 0xFE == value)
{
int reg;
if (address)
{
latch[1] = value;
reg = 2 + (value - 0xFD);
}
else
{
latch[0] = value;
reg = value - 0xFD;
}
mmc_bankvrom(4, address, regs[reg]);
}
}
/* mapper 9: MMC2 */
/* MMC2: Punch-Out! */
static void map9_write(uint32 address, uint8 value)
{
switch ((address & 0xF000) >> 12)
{
case 0xA:
mmc_bankrom(8, 0x8000, value);
break;
case 0xB:
regs[0] = value;
if (0xFD == latch[0])
mmc_bankvrom(4, 0x0000, value);
break;
case 0xC:
regs[1] = value;
if (0xFE == latch[0])
mmc_bankvrom(4, 0x0000, value);
break;
case 0xD:
regs[2] = value;
if (0xFD == latch[1])
mmc_bankvrom(4, 0x1000, value);
break;
case 0xE:
regs[3] = value;
if (0xFE == latch[1])
mmc_bankvrom(4, 0x1000, value);
break;
case 0xF:
if (value & 1)
ppu_mirror(0, 0, 1, 1); /* horizontal */
else
ppu_mirror(0, 1, 0, 1); /* vertical */
break;
default:
break;
}
}
static void map9_init(void)
{
memset(regs, 0, sizeof(regs));
mmc_bankrom(8, 0x8000, 0);
mmc_bankrom(8, 0xA000, (mmc_getinfo()->rom_banks * 2) - 3);
mmc_bankrom(8, 0xC000, (mmc_getinfo()->rom_banks * 2) - 2);
mmc_bankrom(8, 0xE000, (mmc_getinfo()->rom_banks * 2) - 1);
latch[0] = 0xFE;
latch[1] = 0xFE;
ppu_setlatchfunc(mmc9_latchfunc);
}
static void map9_getstate(SnssMapperBlock *state)
{
state->extraData.mapper9.latch[0] = latch[0];
state->extraData.mapper9.latch[1] = latch[1];
state->extraData.mapper9.lastB000Write = regs[0];
state->extraData.mapper9.lastC000Write = regs[1];
state->extraData.mapper9.lastD000Write = regs[2];
state->extraData.mapper9.lastE000Write = regs[3];
}
static void map9_setstate(SnssMapperBlock *state)
{
latch[0] = state->extraData.mapper9.latch[0];
latch[1] = state->extraData.mapper9.latch[1];
regs[0] = state->extraData.mapper9.lastB000Write;
regs[1] = state->extraData.mapper9.lastC000Write;
regs[2] = state->extraData.mapper9.lastD000Write;
regs[3] = state->extraData.mapper9.lastE000Write;
}
static map_memwrite map9_memwrite[] =
{
{ 0x8000, 0xFFFF, map9_write },
{ -1, -1, NULL }
};
const mapintf_t map9_intf =
{
9, /* mapper number */
"MMC2", /* mapper name */
map9_init, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
map9_getstate, /* get state (snss) */
map9_setstate, /* set state (snss) */
NULL, /* memory read structure */
map9_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map009.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.9 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.8 2000/10/22 15:03:14 matt
** simplified mirroring
**
** Revision 1.7 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.6 2000/07/17 05:11:35 matt
** minor update from making PPU code less filthy
**
** Revision 1.5 2000/07/15 23:52:19 matt
** rounded out a bunch more mapper interfaces
**
** Revision 1.4 2000/07/10 05:29:03 matt
** cleaned up some mirroring issues
**
** Revision 1.3 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.2 2000/07/05 22:50:33 matt
** fixed punchout -- works 100% now
**
** Revision 1.1 2000/07/05 05:05:18 matt
** initial revision
**
*/

View file

@ -0,0 +1,94 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map11.c
**
** mapper 11 interface
** $Id: map011.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
/* mapper 11: Color Dreams, Wisdom Tree */
static void map11_write(uint32 address, uint8 value)
{
UNUSED(address);
mmc_bankrom(32, 0x8000, value & 0x0F);
mmc_bankvrom(8, 0x0000, value >> 4);
}
static void map11_init(void)
{
mmc_bankrom(32, 0x8000, 0);
mmc_bankvrom(8, 0x0000, 0);
}
static const map_memwrite map11_memwrite[] =
{
{ 0x8000, 0xFFFF, map11_write },
{ -1, -1, NULL }
};
const mapintf_t map11_intf =
{
11, /* mapper number */
"Color Dreams", /* mapper name */
map11_init, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map11_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map011.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.5 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.4 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.3 2000/08/16 02:50:11 matt
** random mapper cleanups
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/04 23:11:45 matt
** initial revision
**
*/

View file

@ -0,0 +1,144 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map15.c
**
** mapper 15 interface
** $Id: map015.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes_ppu.h"
/* mapper 15: Contra 100-in-1 */
static void map15_write(uint32 address, uint8 value)
{
int bank = value & 0x3F;
uint8 swap = (value & 0x80) >> 7;
switch (address & 0x3)
{
case 0:
mmc_bankrom(8, 0x8000, (bank << 1) + swap);
mmc_bankrom(8, 0xA000, (bank << 1) + (swap ^ 1));
mmc_bankrom(8, 0xC000, ((bank + 1) << 1) + swap);
mmc_bankrom(8, 0xE000, ((bank + 1) << 1) + (swap ^ 1));
if (value & 0x40)
ppu_mirror(0, 0, 1, 1); /* horizontal */
else
ppu_mirror(0, 1, 0, 1); /* vertical */
break;
case 1:
mmc_bankrom(8, 0xC000, (bank << 1) + swap);
mmc_bankrom(8, 0xE000, (bank << 1) + (swap ^ 1));
break;
case 2:
if (swap)
{
mmc_bankrom(8, 0x8000, (bank << 1) + 1);
mmc_bankrom(8, 0xA000, (bank << 1) + 1);
mmc_bankrom(8, 0xC000, (bank << 1) + 1);
mmc_bankrom(8, 0xE000, (bank << 1) + 1);
}
else
{
mmc_bankrom(8, 0x8000, (bank << 1));
mmc_bankrom(8, 0xA000, (bank << 1));
mmc_bankrom(8, 0xC000, (bank << 1));
mmc_bankrom(8, 0xE000, (bank << 1));
}
break;
case 3:
mmc_bankrom(8, 0xC000, (bank << 1) + swap);
mmc_bankrom(8, 0xE000, (bank << 1) + (swap ^ 1));
if (value & 0x40)
ppu_mirror(0, 0, 1, 1); /* horizontal */
else
ppu_mirror(0, 1, 0, 1); /* vertical */
break;
default:
break;
}
}
static void map15_init(void)
{
mmc_bankrom(32, 0x8000, 0);
}
static const map_memwrite map15_memwrite[] =
{
{ 0x8000, 0xFFFF, map15_write },
{ -1, -1, NULL }
};
const mapintf_t map15_intf =
{
15, /* mapper number */
"Contra 100-in-1", /* mapper name */
map15_init, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map15_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map015.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.6 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.5 2000/10/22 15:03:13 matt
** simplified mirroring
**
** Revision 1.4 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.3 2000/07/10 05:29:03 matt
** cleaned up some mirroring issues
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/05 05:05:18 matt
** initial revision
**
*/

View file

@ -0,0 +1,192 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map16.c
**
** mapper 16 interface
** $Id: map016.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes_ppu.h"
#include "nes.h"
static struct
{
int counter;
bool enabled;
} irq;
/* mapper 16: Bandai */
static void map16_init(void)
{
mmc_bankrom(16, 0x8000, 0);
mmc_bankrom(16, 0xC000, MMC_LASTBANK);
irq.counter = 0;
irq.enabled = false;
}
static void map16_write(uint32 address, uint8 value)
{
int reg = address & 0xF;
if (reg < 8)
{
mmc_bankvrom(1, reg << 10, value);
}
else
{
switch (address & 0x000F)
{
case 0x8:
mmc_bankrom(16, 0x8000, value);
break;
case 0x9:
switch (value & 3)
{
case 0:
ppu_mirror(0, 0, 1, 1); /* horizontal */
break;
case 1:
ppu_mirror(0, 1, 0, 1); /* vertical */
break;
case 2:
ppu_mirror(0, 0, 0, 0);
break;
case 3:
ppu_mirror(1, 1, 1, 1);
break;
}
break;
case 0xA:
irq.enabled = (value & 1) ? true : false;
break;
case 0xB:
irq.counter = (irq.counter & 0xFF00) | value;
break;
case 0xC:
irq.counter = (value << 8) | (irq.counter & 0xFF);
break;
case 0xD:
/* eeprom I/O port? */
break;
}
}
}
static void map16_hblank(int vblank)
{
UNUSED(vblank);
if (irq.enabled)
{
if (irq.counter)
{
if (0 == --irq.counter)
nes_irq();
}
}
}
static void map16_getstate(SnssMapperBlock *state)
{
state->extraData.mapper16.irqCounterLowByte = irq.counter & 0xFF;
state->extraData.mapper16.irqCounterHighByte = irq.counter >> 8;
state->extraData.mapper16.irqCounterEnabled = irq.enabled;
}
static void map16_setstate(SnssMapperBlock *state)
{
irq.counter = (state->extraData.mapper16.irqCounterHighByte << 8)
| state->extraData.mapper16.irqCounterLowByte;
irq.enabled = state->extraData.mapper16.irqCounterEnabled;
}
static const map_memwrite map16_memwrite[] =
{
{ 0x6000, 0x600D, map16_write },
{ 0x7FF0, 0x7FFD, map16_write },
{ 0x8000, 0x800D, map16_write },
{ -1, -1, NULL }
};
const mapintf_t map16_intf =
{
16, /* mapper number */
"Bandai", /* mapper name */
map16_init, /* init routine */
NULL, /* vblank callback */
map16_hblank, /* hblank callback */
map16_getstate, /* get state (snss) */
map16_setstate, /* set state (snss) */
NULL, /* memory read structure */
map16_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map016.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.8 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.7 2000/10/22 15:03:13 matt
** simplified mirroring
**
** Revision 1.6 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.5 2000/10/10 13:58:16 matt
** stroustrup squeezing his way in the door
**
** Revision 1.4 2000/08/16 02:50:11 matt
** random mapper cleanups
**
** Revision 1.3 2000/07/15 23:52:20 matt
** rounded out a bunch more mapper interfaces
**
** Revision 1.2 2000/07/11 05:03:49 matt
** value masking isn't necessary for the banking routines
**
** Revision 1.1 2000/07/11 03:14:18 melanson
** Initial commit for mappers 16, 34, and 231
**
**
*/

View file

@ -0,0 +1,215 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map18.c
**
** mapper 18 interface
** $Id: map018.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes_ppu.h"
/* mapper 18: Jaleco SS8806 */
#define VRC_PBANK(bank, value, high) \
do { \
if ((high)) \
highprgnybbles[(bank)] = (value) & 0x0F; \
else \
lowprgnybbles[(bank)] = (value) & 0x0F; \
mmc_bankrom(8, 0x8000 + ((bank) << 13), (highprgnybbles[(bank)] << 4)+lowprgnybbles[(bank)]); \
} while (0)
#define VRC_VBANK(bank, value, high) \
{ \
if ((high)) \
highnybbles[(bank)] = (value) & 0x0F; \
else \
lownybbles[(bank)] = (value) & 0x0F; \
mmc_bankvrom(1, (bank) << 10, (highnybbles[(bank)] << 4)+lownybbles[(bank)]); \
}
static struct
{
int counter, enabled;
uint8 nybbles[4];
int clockticks;
} irq;
static void map18_init(void)
{
irq.counter = irq.enabled = 0;
}
static uint8 lownybbles[8];
static uint8 highnybbles[8];
static uint8 lowprgnybbles[3];
static uint8 highprgnybbles[3];
static void map18_write(uint32 address, uint8 value)
{
switch (address)
{
case 0x8000: VRC_PBANK(0, value, 0); break;
case 0x8001: VRC_PBANK(0, value, 1); break;
case 0x8002: VRC_PBANK(1, value, 0); break;
case 0x8003: VRC_PBANK(1, value, 1); break;
case 0x9000: VRC_PBANK(2, value, 0); break;
case 0x9001: VRC_PBANK(2, value, 1); break;
case 0xA000: VRC_VBANK(0, value, 0); break;
case 0xA001: VRC_VBANK(0, value, 1); break;
case 0xA002: VRC_VBANK(1, value, 0); break;
case 0xA003: VRC_VBANK(1, value, 1); break;
case 0xB000: VRC_VBANK(2, value, 0); break;
case 0xB001: VRC_VBANK(2, value, 1); break;
case 0xB002: VRC_VBANK(3, value, 0); break;
case 0xB003: VRC_VBANK(3, value, 1); break;
case 0xC000: VRC_VBANK(4, value, 0); break;
case 0xC001: VRC_VBANK(4, value, 1); break;
case 0xC002: VRC_VBANK(5, value, 0); break;
case 0xC003: VRC_VBANK(5, value, 1); break;
case 0xD000: VRC_VBANK(6, value, 0); break;
case 0xD001: VRC_VBANK(6, value, 1); break;
case 0xD002: VRC_VBANK(7, value, 0); break;
case 0xD003: VRC_VBANK(7, value, 1); break;
case 0xE000:
irq.nybbles[0]=value&0x0F;
irq.clockticks= (irq.nybbles[0]) | (irq.nybbles[1]<<4) |
(irq.nybbles[2]<<8) | (irq.nybbles[3]<<12);
irq.counter=(uint8)(irq.clockticks/114);
if(irq.counter>15) irq.counter-=16;
break;
case 0xE001:
irq.nybbles[1]=value&0x0F;
irq.clockticks= (irq.nybbles[0]) | (irq.nybbles[1]<<4) |
(irq.nybbles[2]<<8) | (irq.nybbles[3]<<12);
irq.counter=(uint8)(irq.clockticks/114);
if(irq.counter>15) irq.counter-=16;
break;
case 0xE002:
irq.nybbles[2]=value&0x0F;
irq.clockticks= (irq.nybbles[0]) | (irq.nybbles[1]<<4) |
(irq.nybbles[2]<<8) | (irq.nybbles[3]<<12);
irq.counter=(uint8)(irq.clockticks/114);
if(irq.counter>15) irq.counter-=16;
break;
case 0xE003:
irq.nybbles[3]=value&0x0F;
irq.clockticks= (irq.nybbles[0]) | (irq.nybbles[1]<<4) |
(irq.nybbles[2]<<8) | (irq.nybbles[3]<<12);
irq.counter=(uint8)(irq.clockticks/114);
if(irq.counter>15) irq.counter-=16;
break;
case 0xF000:
if(value&0x01) irq.enabled=true;
break;
case 0xF001:
irq.enabled=value&0x01;
break;
case 0xF002:
switch(value&0x03)
{
case 0: ppu_mirror(0, 0, 1, 1); break;
case 1: ppu_mirror(0, 1, 0, 1); break;
case 2: ppu_mirror(1,1,1,1);break;
case 3: ppu_mirror(1,1,1,1);break; // should this be zero?
default: break;
}
break;
default:
break;
}
}
static const map_memwrite map18_memwrite[] =
{
{ 0x8000, 0xFFFF, map18_write },
{ -1, -1, NULL }
};
static void map18_getstate(SnssMapperBlock *state)
{
state->extraData.mapper18.irqCounterLowByte = irq.counter & 0xFF;
state->extraData.mapper18.irqCounterHighByte = irq.counter >> 8;
state->extraData.mapper18.irqCounterEnabled = irq.enabled;
}
static void map18_setstate(SnssMapperBlock *state)
{
irq.counter = (state->extraData.mapper18.irqCounterHighByte << 8)
| state->extraData.mapper18.irqCounterLowByte;
irq.enabled = state->extraData.mapper18.irqCounterEnabled;
}
const mapintf_t map18_intf =
{
18, /* mapper number */
"Jaleco SS8806", /* mapper name */
map18_init, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
map18_getstate, /* get state (snss) */
map18_setstate, /* set state (snss) */
NULL, /* memory read structure */
map18_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map018.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.8 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.7 2000/10/22 15:03:13 matt
** simplified mirroring
**
** Revision 1.6 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.5 2000/10/10 13:58:17 matt
** stroustrup squeezing his way in the door
**
** Revision 1.4 2000/07/15 23:52:19 matt
** rounded out a bunch more mapper interfaces
**
** Revision 1.3 2000/07/10 05:29:03 matt
** cleaned up some mirroring issues
**
** Revision 1.2 2000/07/06 02:48:42 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/06 01:01:56 matt
** initial revision
**
*/

View file

@ -0,0 +1,170 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map19.c
**
** mapper 19 interface
** $Id: map019.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes_ppu.h"
/* TODO: shouldn't there be an h-blank IRQ handler??? */
/* Special mirroring macro for mapper 19 */
#define N_BANK1(table, value) \
{ \
if ((value) < 0xE0) \
ppu_setpage(1, (table) + 8, &mmc_getinfo()->vrom[((value) % (mmc_getinfo()->vrom_banks * 8)) << 10] - (0x2000 + ((table) << 10))); \
else \
ppu_setpage(1, (table) + 8, &mmc_getinfo()->vram[((value) & 7) << 10] - (0x2000 + ((table) << 10))); \
ppu_mirrorhipages(); \
}
static struct
{
int counter, enabled;
} irq;
static void map19_init(void)
{
irq.counter = irq.enabled = 0;
}
/* mapper 19: Namcot 106 */
static void map19_write(uint32 address, uint8 value)
{
int reg = address >> 11;
switch (reg)
{
case 0xA:
irq.counter &= ~0xFF;
irq.counter |= value;
break;
case 0xB:
irq.counter = ((value & 0x7F) << 8) | (irq.counter & 0xFF);
irq.enabled = (value & 0x80) ? true : false;
break;
case 0x10:
case 0x11:
case 0x12:
case 0x13:
case 0x14:
case 0x15:
case 0x16:
case 0x17:
mmc_bankvrom(1, (reg & 7) << 10, value);
break;
case 0x18:
case 0x19:
case 0x1A:
case 0x1B:
N_BANK1(reg & 3, value);
break;
case 0x1C:
mmc_bankrom(8, 0x8000, value);
break;
case 0x1D:
mmc_bankrom(8, 0xA000, value);
break;
case 0x1E:
mmc_bankrom(8, 0xC000, value);
break;
default:
break;
}
}
static void map19_getstate(SnssMapperBlock *state)
{
state->extraData.mapper19.irqCounterLowByte = irq.counter & 0xFF;
state->extraData.mapper19.irqCounterHighByte = irq.counter >> 8;
state->extraData.mapper19.irqCounterEnabled = irq.enabled;
}
static void map19_setstate(SnssMapperBlock *state)
{
irq.counter = (state->extraData.mapper19.irqCounterHighByte << 8)
| state->extraData.mapper19.irqCounterLowByte;
irq.enabled = state->extraData.mapper19.irqCounterEnabled;
}
static const map_memwrite map19_memwrite[] =
{
{ 0x5000, 0x5FFF, map19_write },
{ 0x8000, 0xFFFF, map19_write },
{ -1, -1, NULL }
};
const mapintf_t map19_intf =
{
19, /* mapper number */
"Namcot 106", /* mapper name */
map19_init, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
map19_getstate, /* get state (snss) */
map19_setstate, /* set state (snss) */
NULL, /* memory read structure */
map19_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map019.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.6 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.5 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.4 2000/10/10 13:58:17 matt
** stroustrup squeezing his way in the door
**
** Revision 1.3 2000/07/15 23:52:20 matt
** rounded out a bunch more mapper interfaces
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/06 01:01:56 matt
** initial revision
**
*/

View file

@ -0,0 +1,235 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map24.c
**
** mapper 24 interface
** $Id: map024.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes.h"
#include "log.h"
#include "vrcvisnd.h"
static struct
{
int counter, enabled;
int latch, wait_state;
} irq;
static void map24_init(void)
{
irq.counter = irq.enabled = 0;
irq.latch = irq.wait_state = 0;
}
static void map24_hblank(int vblank)
{
UNUSED(vblank);
if (irq.enabled)
{
if (256 == ++irq.counter)
{
irq.counter = irq.latch;
nes_irq();
//irq.enabled = false;
irq.enabled = irq.wait_state;
}
}
}
static void map24_write(uint32 address, uint8 value)
{
switch (address & 0xF003)
{
case 0x8000:
mmc_bankrom(16, 0x8000, value);
break;
case 0x9003:
/* ??? */
break;
case 0xB003:
switch (value & 0x0C)
{
case 0x00:
ppu_mirror(0, 1, 0, 1); /* vertical */
break;
case 0x04:
ppu_mirror(0, 0, 1, 1); /* horizontal */
break;
case 0x08:
ppu_mirror(0, 0, 0, 0);
break;
case 0x0C:
ppu_mirror(1, 1, 1, 1);
break;
default:
break;
}
break;
case 0xC000:
mmc_bankrom(8, 0xC000, value);
break;
case 0xD000:
mmc_bankvrom(1, 0x0000, value);
break;
case 0xD001:
mmc_bankvrom(1, 0x0400, value);
break;
case 0xD002:
mmc_bankvrom(1, 0x0800, value);
break;
case 0xD003:
mmc_bankvrom(1, 0x0C00, value);
break;
case 0xE000:
mmc_bankvrom(1, 0x1000, value);
break;
case 0xE001:
mmc_bankvrom(1, 0x1400, value);
break;
case 0xE002:
mmc_bankvrom(1, 0x1800, value);
break;
case 0xE003:
mmc_bankvrom(1, 0x1C00, value);
break;
case 0xF000:
irq.latch = value;
break;
case 0xF001:
irq.enabled = (value >> 1) & 0x01;
irq.wait_state = value & 0x01;
if (irq.enabled)
irq.counter = irq.latch;
break;
case 0xF002:
irq.enabled = irq.wait_state;
break;
default:
#ifdef NOFRENDO_DEBUG
log_printf("invalid VRC6 write: $%02X to $%04X", value, address);
#endif
break;
}
}
static void map24_getstate(SnssMapperBlock *state)
{
state->extraData.mapper24.irqCounter = irq.counter;
state->extraData.mapper24.irqCounterEnabled = irq.enabled;
}
static void map24_setstate(SnssMapperBlock *state)
{
irq.counter = state->extraData.mapper24.irqCounter;
irq.enabled = state->extraData.mapper24.irqCounterEnabled;
}
static const map_memwrite map24_memwrite[] =
{
{ 0x8000, 0xF002, map24_write },
{ -1, -1, NULL }
};
mapintf_t const map24_intf =
{
24, /* mapper number */
"Konami VRC6", /* mapper name */
map24_init, /* init routine */
NULL, /* vblank callback */
map24_hblank, /* hblank callback */
map24_getstate, /* get state (snss) */
map24_setstate, /* set state (snss) */
NULL, /* memory read structure */
map24_memwrite, /* memory write structure */
&vrcvi_ext /* external sound device */
};
/*
** $Log: map024.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.11 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.10 2000/10/22 15:03:13 matt
** simplified mirroring
**
** Revision 1.9 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.8 2000/10/10 13:58:17 matt
** stroustrup squeezing his way in the door
**
** Revision 1.7 2000/10/09 12:00:53 matt
** removed old code
**
** Revision 1.6 2000/08/16 02:50:11 matt
** random mapper cleanups
**
** Revision 1.5 2000/07/15 23:52:19 matt
** rounded out a bunch more mapper interfaces
**
** Revision 1.4 2000/07/10 13:51:25 matt
** using generic nes_irq() routine now
**
** Revision 1.3 2000/07/10 05:29:03 matt
** cleaned up some mirroring issues
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/04 23:11:45 matt
** initial revision
**
*/

View file

@ -0,0 +1,121 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map32.c
**
** mapper 32 interface
** $Id: map032.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes_ppu.h"
static int select_c000 = 0;
/* mapper 32: Irem G-101 */
static void map32_write(uint32 address, uint8 value)
{
switch (address >> 12)
{
case 0x08:
if (select_c000)
mmc_bankrom(8, 0xC000, value);
else
mmc_bankrom(8, 0x8000, value);
break;
case 0x09:
if (value & 1)
ppu_mirror(0, 0, 1, 1); /* horizontal */
else
ppu_mirror(0, 1, 0, 1); /* vertical */
select_c000 = (value & 0x02);
break;
case 0x0A:
mmc_bankrom(8, 0xA000, value);
break;
case 0x0B:
{
int loc = (address & 0x07) << 10;
mmc_bankvrom(1, loc, value);
}
break;
default:
break;
}
}
static const map_memwrite map32_memwrite[] =
{
{ 0x8000, 0xFFFF, map32_write },
{ -1, -1, NULL }
};
const mapintf_t map32_intf =
{
32, /* mapper number */
"Irem G-101", /* mapper name */
NULL, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map32_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map032.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.6 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.5 2000/10/22 15:03:13 matt
** simplified mirroring
**
** Revision 1.4 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.3 2000/07/10 05:29:03 matt
** cleaned up some mirroring issues
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/06 01:01:56 matt
** initial revision
**
*/

View file

@ -0,0 +1,145 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map33.c
**
** mapper 33 interface
** $Id: map033.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes_ppu.h"
/* mapper 33: Taito TC0190*/
static void map33_write(uint32 address, uint8 value)
{
int page = (address >> 13) & 3;
int reg = address & 3;
switch (page)
{
case 0: /* $800X */
switch (reg)
{
case 0:
mmc_bankrom(8, 0x8000, value);
break;
case 1:
mmc_bankrom(8, 0xA000, value);
break;
case 2:
mmc_bankvrom(2, 0x0000, value);
break;
case 3:
mmc_bankvrom(2, 0x0800, value);
break;
}
break;
case 1: /* $A00X */
{
int loc = 0x1000 + (reg << 10);
mmc_bankvrom(1, loc, value);
}
break;
case 2: /* $C00X */
case 3: /* $E00X */
switch (reg)
{
case 0:
/* irqs maybe ? */
//break;
case 1:
/* this doesn't seem to work just right */
if (value & 1)
ppu_mirror(0, 0, 1, 1); /* horizontal */
else
ppu_mirror(0, 1, 0, 1);
break;
default:
break;
}
break;
}
}
static const map_memwrite map33_memwrite[] =
{
{ 0x8000, 0xFFFF, map33_write },
{ -1, -1, NULL }
};
const mapintf_t map33_intf =
{
33, /* mapper number */
"Taito TC0190", /* mapper name */
NULL, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map33_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map033.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.7 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.6 2000/10/22 15:03:13 matt
** simplified mirroring
**
** Revision 1.5 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.4 2000/07/15 23:52:19 matt
** rounded out a bunch more mapper interfaces
**
** Revision 1.3 2000/07/10 05:29:03 matt
** cleaned up some mirroring issues
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/06 01:01:56 matt
** initial revision
**
*/

View file

@ -0,0 +1,100 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map34.c
**
** mapper 34 interface
** $Id: map034.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
static void map34_init(void)
{
mmc_bankrom(32, 0x8000, MMC_LASTBANK);
}
static void map34_write(uint32 address, uint8 value)
{
if ((address & 0x8000) || (0x7FFD == address))
{
mmc_bankrom(32, 0x8000, value);
}
else if (0x7FFE == address)
{
mmc_bankvrom(4, 0x0000, value);
}
else if (0x7FFF == address)
{
mmc_bankvrom(4, 0x1000, value);
}
}
static const map_memwrite map34_memwrite[] =
{
{ 0x7FFD, 0xFFFF, map34_write },
{ -1, -1, NULL }
};
const mapintf_t map34_intf =
{
34, /* mapper number */
"Nina-1", /* mapper name */
map34_init, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map34_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map034.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.5 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.4 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.3 2000/07/11 05:03:49 matt
** value masking isn't necessary for the banking routines
**
** Revision 1.2 2000/07/11 03:35:08 bsittler
** Fixes to make mikes new mappers compile.
**
** Revision 1.1 2000/07/11 03:14:18 melanson
** Initial commit for mappers 16, 34, and 231
**
**
*/

View file

@ -0,0 +1,163 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map40.c
**
** mapper 40 interface
** $Id: map040.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes.h"
#include "libsnss.h"
#include "log.h"
#define MAP40_IRQ_PERIOD (4096 / 113.666666)
static struct
{
int enabled, counter;
} irq;
/* mapper 40: SMB 2j (hack) */
static void map40_init(void)
{
mmc_bankrom(8, 0x6000, 6);
mmc_bankrom(8, 0x8000, 4);
mmc_bankrom(8, 0xA000, 5);
mmc_bankrom(8, 0xE000, 7);
irq.enabled = false;
irq.counter = (int) MAP40_IRQ_PERIOD;
}
static void map40_hblank(int vblank)
{
UNUSED(vblank);
if (irq.enabled && irq.counter)
{
irq.counter--;
if (0 == irq.counter)
{
nes_irq();
irq.enabled = false;
}
}
}
static void map40_write(uint32 address, uint8 value)
{
int range = (address >> 13) - 4;
switch (range)
{
case 0: /* 0x8000-0x9FFF */
irq.enabled = false;
irq.counter = (int) MAP40_IRQ_PERIOD;
break;
case 1: /* 0xA000-0xBFFF */
irq.enabled = true;
break;
case 3: /* 0xE000-0xFFFF */
mmc_bankrom(8, 0xC000, value & 7);
break;
default:
break;
}
}
static void map40_getstate(SnssMapperBlock *state)
{
state->extraData.mapper40.irqCounter = irq.counter;
state->extraData.mapper40.irqCounterEnabled = irq.enabled;
}
static void map40_setstate(SnssMapperBlock *state)
{
irq.counter = state->extraData.mapper40.irqCounter;
irq.enabled = state->extraData.mapper40.irqCounterEnabled;
}
static const map_memwrite map40_memwrite[] =
{
{ 0x8000, 0xFFFF, map40_write },
{ -1, -1, NULL }
};
const mapintf_t map40_intf =
{
40, /* mapper number */
"SMB 2j (pirate)", /* mapper name */
map40_init, /* init routine */
NULL, /* vblank callback */
map40_hblank, /* hblank callback */
map40_getstate, /* get state (snss) */
map40_setstate, /* set state (snss) */
NULL, /* memory read structure */
map40_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map040.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.9 2000/10/23 15:53:27 matt
** suppressed warnings
**
** Revision 1.8 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.7 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.6 2000/10/10 13:58:17 matt
** stroustrup squeezing his way in the door
**
** Revision 1.5 2000/08/16 02:50:11 matt
** random mapper cleanups
**
** Revision 1.4 2000/07/15 23:52:19 matt
** rounded out a bunch more mapper interfaces
**
** Revision 1.3 2000/07/10 13:51:25 matt
** using generic nes_irq() routine now
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/05 05:05:18 matt
** initial revision
**
*/

View file

@ -0,0 +1,167 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map041.c
**
** Mapper #41 (Caltron 6 in 1)
** Implementation by Firebug
** Mapper information courtesy of Kevin Horton
** $Id: map041.c,v 1.2 2001/04/27 14:37:11 neil Exp $
**
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes.h"
#include "libsnss.h"
#include "log.h"
static uint8 register_low;
static uint8 register_high;
/*****************************************************/
/* Set 8K CHR bank from the combined register values */
/*****************************************************/
static void map41_set_chr (void)
{
/* Set the CHR bank from the appropriate register bits */
mmc_bankvrom (8, 0x0000, ((register_low >> 1) & 0x0C) | (register_high));
/* Done */
return;
}
/******************************/
/* Mapper #41: Caltron 6 in 1 */
/******************************/
static void map41_init (void)
{
/* Both registers set to zero at power on */
/* TODO: Registers should also be cleared on a soft reset */
register_low = 0x00;
register_high = 0x00;
mmc_bankrom (32, 0x8000, 0x00);
map41_set_chr ();
/* Done */
return;
}
/******************************************/
/* Mapper #41 write handler ($6000-$67FF) */
/******************************************/
static void map41_low_write (uint32 address, uint8 value)
{
/* Within this range the value written is irrelevant */
UNUSED (value);
/* $6000-$67FF: A5 = mirroring (1=horizontal, 0=vertical) */
/* A4-A3 = high two bits of 8K CHR bank */
/* A2 = register 1 enable (0=disabled, 1=enabled) */
/* A2-A0 = 32K PRG bank */
register_low = (uint8) (address & 0x3F);
mmc_bankrom (32, 0x8000, register_low & 0x07);
map41_set_chr ();
if (register_low & 0x20) ppu_mirror(0, 0, 1, 1); /* horizontal */
else ppu_mirror(0, 1, 0, 1); /* vertical */
/* Done */
return;
}
/******************************************/
/* Mapper #41 write handler ($8000-$FFFF) */
/******************************************/
static void map41_high_write (uint32 address, uint8 value)
{
/* Address doesn't matter within this range */
UNUSED (address);
/* $8000-$FFFF: D1-D0 = low two bits of 8K CHR bank */
if (register_low & 0x04)
{
register_high = value & 0x03;
map41_set_chr ();
}
/* Done */
return;
}
/****************************************************/
/* Shove extra mapper information into a SNSS block */
/****************************************************/
static void map41_setstate (SnssMapperBlock *state)
{
/* TODO: Store SNSS information */
UNUSED (state);
/* Done */
return;
}
/*****************************************************/
/* Pull extra mapper information out of a SNSS block */
/*****************************************************/
static void map41_getstate (SnssMapperBlock *state)
{
/* TODO: Retrieve SNSS information */
UNUSED (state);
/* Done */
return;
}
static const map_memwrite map41_memwrite [] =
{
{ 0x6000, 0x67FF, map41_low_write },
{ 0x8000, 0xFFFF, map41_high_write },
{ -1, -1, NULL }
};
const mapintf_t map41_intf =
{
41, /* Mapper number */
"Caltron 6 in 1", /* Mapper name */
map41_init, /* Initialization routine */
NULL, /* VBlank callback */
NULL, /* HBlank callback */
map41_getstate, /* Get state (SNSS) */
map41_setstate, /* Set state (SNSS) */
NULL, /* Memory read structure */
map41_memwrite, /* Memory write structure */
NULL /* External sound device */
};
/*
** $Log: map041.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1 2001/04/27 10:57:41 neil
** wheee
**
** Revision 1.1 2000/12/30 00:33:15 firebug
** initial revision
**
**
*/

View file

@ -0,0 +1,188 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map042.c
**
** Mapper #42 (Baby Mario bootleg)
** Implementation by Firebug
** Mapper information courtesy of Kevin Horton
** $Id: map042.c,v 1.2 2001/04/27 14:37:11 neil Exp $
**
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes.h"
#include "libsnss.h"
#include "log.h"
static struct
{
bool enabled;
uint32 counter;
} irq;
/********************************/
/* Mapper #42 IRQ reset routine */
/********************************/
static void map42_irq_reset (void)
{
/* Turn off IRQs */
irq.enabled = false;
irq.counter = 0x0000;
/* Done */
return;
}
/********************************************/
/* Mapper #42: Baby Mario bootleg cartridge */
/********************************************/
static void map42_init (void)
{
/* Set the hardwired pages */
mmc_bankrom (8, 0x8000, 0x0C);
mmc_bankrom (8, 0xA000, 0x0D);
mmc_bankrom (8, 0xC000, 0x0E);
mmc_bankrom (8, 0xE000, 0x0F);
/* Reset the IRQ counter */
map42_irq_reset ();
/* Done */
return;
}
/****************************************/
/* Mapper #42 callback for IRQ handling */
/****************************************/
static void map42_hblank (int vblank)
{
/* Counter is M2 based so it doesn't matter whether */
/* the PPU is in its VBlank period or not */
UNUSED(vblank);
/* Increment the counter if it is enabled and check for strike */
if (irq.enabled)
{
/* Is there a constant for cycles per scanline? */
/* If so, someone ought to substitute it here */
irq.counter = irq.counter + 114;
/* IRQ is triggered after 24576 M2 cycles */
if (irq.counter >= 0x6000)
{
/* Trigger the IRQ */
nes_irq ();
/* Reset the counter */
map42_irq_reset ();
}
}
}
/******************************************/
/* Mapper #42 write handler ($E000-$FFFF) */
/******************************************/
static void map42_write (uint32 address, uint8 value)
{
switch (address & 0x03)
{
/* Register 0: Select ROM page at $6000-$7FFF */
case 0x00: mmc_bankrom (8, 0x6000, value & 0x0F);
break;
/* Register 1: mirroring */
case 0x01: if (value & 0x08) ppu_mirror(0, 0, 1, 1); /* horizontal */
else ppu_mirror(0, 1, 0, 1); /* vertical */
break;
/* Register 2: IRQ */
case 0x02: if (value & 0x02) irq.enabled = true;
else map42_irq_reset ();
break;
/* Register 3: unused */
default: break;
}
/* Done */
return;
}
/****************************************************/
/* Shove extra mapper information into a SNSS block */
/****************************************************/
static void map42_setstate (SnssMapperBlock *state)
{
/* TODO: Store SNSS information */
UNUSED (state);
/* Done */
return;
}
/*****************************************************/
/* Pull extra mapper information out of a SNSS block */
/*****************************************************/
static void map42_getstate (SnssMapperBlock *state)
{
/* TODO: Retrieve SNSS information */
UNUSED (state);
/* Done */
return;
}
static const map_memwrite map42_memwrite [] =
{
{ 0xE000, 0xFFFF, map42_write },
{ -1, -1, NULL }
};
const mapintf_t map42_intf =
{
42, /* Mapper number */
"Baby Mario (bootleg)", /* Mapper name */
map42_init, /* Initialization routine */
NULL, /* VBlank callback */
map42_hblank, /* HBlank callback */
map42_getstate, /* Get state (SNSS) */
map42_setstate, /* Set state (SNSS) */
NULL, /* Memory read structure */
map42_memwrite, /* Memory write structure */
NULL /* External sound device */
};
/*
** $Log: map042.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1 2001/04/27 10:57:41 neil
** wheee
**
** Revision 1.1 2000/12/27 19:23:30 firebug
** initial revision
**
**
*/

View file

@ -0,0 +1,152 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map046.c
**
** Mapper #46 (Pelican Game Station)
** Implementation by Firebug
** Mapper information courtesy of Kevin Horton
** $Id: map046.c,v 1.2 2001/04/27 14:37:11 neil Exp $
**
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes.h"
#include "libsnss.h"
#include "log.h"
static uint8 prg_low_bank;
static uint8 chr_low_bank;
static uint8 prg_high_bank;
static uint8 chr_high_bank;
/*************************************************/
/* Set banks from the combined register values */
/*************************************************/
static void map46_set_banks (void)
{
/* Set the PRG and CHR pages */
mmc_bankrom (32, 0x8000, (prg_high_bank << 1) | (prg_low_bank));
mmc_bankvrom (8, 0x0000, (chr_high_bank << 3) | (chr_low_bank));
/* Done */
return;
}
/*********************************************************/
/* Mapper #46: Pelican Game Station (aka Rumble Station) */
/*********************************************************/
static void map46_init (void)
{
/* High bank switch register is set to zero on reset */
prg_high_bank = 0x00;
chr_high_bank = 0x00;
map46_set_banks ();
/* Done */
return;
}
/******************************************/
/* Mapper #46 write handler ($6000-$FFFF) */
/******************************************/
static void map46_write (uint32 address, uint8 value)
{
/* $8000-$FFFF: D6-D4 = lower three bits of CHR bank */
/* D0 = low bit of PRG bank */
/* $6000-$7FFF: D7-D4 = high four bits of CHR bank */
/* D3-D0 = high four bits of PRG bank */
if (address & 0x8000)
{
prg_low_bank = value & 0x01;
chr_low_bank = (value >> 4) & 0x07;
map46_set_banks ();
}
else
{
prg_high_bank = value & 0x0F;
chr_high_bank = (value >> 4) & 0x0F;
map46_set_banks ();
}
/* Done */
return;
}
/****************************************************/
/* Shove extra mapper information into a SNSS block */
/****************************************************/
static void map46_setstate (SnssMapperBlock *state)
{
/* TODO: Store SNSS information */
UNUSED (state);
/* Done */
return;
}
/*****************************************************/
/* Pull extra mapper information out of a SNSS block */
/*****************************************************/
static void map46_getstate (SnssMapperBlock *state)
{
/* TODO: Retrieve SNSS information */
UNUSED (state);
/* Done */
return;
}
static const map_memwrite map46_memwrite [] =
{
{ 0x6000, 0xFFFF, map46_write },
{ -1, -1, NULL }
};
const mapintf_t map46_intf =
{
46, /* Mapper number */
"Pelican Game Station", /* Mapper name */
map46_init, /* Initialization routine */
NULL, /* VBlank callback */
NULL, /* HBlank callback */
map46_getstate, /* Get state (SNSS) */
map46_setstate, /* Set state (SNSS) */
NULL, /* Memory read structure */
map46_memwrite, /* Memory write structure */
NULL /* External sound device */
};
/*
** $Log: map046.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1 2001/04/27 10:57:41 neil
** wheee
**
** Revision 1.1 2000/12/27 19:23:05 firebug
** initial revision
**
**
*/

View file

@ -0,0 +1,192 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map050.c
**
** Mapper #50 (SMB2j - 3rd discovered variation)
** Implementation by Firebug
** Mapper information courtesy of Kevin Horton
** $Id: map050.c,v 1.2 2001/04/27 14:37:11 neil Exp $
**
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes.h"
#include "libsnss.h"
#include "log.h"
static struct
{
bool enabled;
uint32 counter;
} irq;
/********************************/
/* Mapper #50 IRQ reset routine */
/********************************/
static void map50_irq_reset (void)
{
/* Turn off IRQs */
irq.enabled = false;
irq.counter = 0x0000;
/* Done */
return;
}
/**************************************************************/
/* Mapper #50: 3rd discovered variation of SMB2j cart bootleg */
/**************************************************************/
static void map50_init (void)
{
/* Set the hardwired pages */
mmc_bankrom (8, 0x6000, 0x0F);
mmc_bankrom (8, 0x8000, 0x08);
mmc_bankrom (8, 0xA000, 0x09);
mmc_bankrom (8, 0xE000, 0x0B);
/* Reset the IRQ counter */
map50_irq_reset ();
/* Done */
return;
}
/****************************************/
/* Mapper #50 callback for IRQ handling */
/****************************************/
static void map50_hblank (int vblank)
{
/* Counter is M2 based so it doesn't matter whether */
/* the PPU is in its VBlank period or not */
UNUSED(vblank);
/* Increment the counter if it is enabled and check for strike */
if (irq.enabled)
{
/* Is there a constant for cycles per scanline? */
/* If so, someone ought to substitute it here */
irq.counter = irq.counter + 114;
/* IRQ line is hooked to Q12 of the counter */
if (irq.counter & 0x1000)
{
/* Trigger the IRQ */
nes_irq ();
/* Reset the counter */
map50_irq_reset ();
}
}
}
/******************************************/
/* Mapper #50 write handler ($4000-$5FFF) */
/******************************************/
static void map50_write (uint32 address, uint8 value)
{
uint8 selectable_bank;
/* For address to be decoded, A5 must be high and A6 low */
if ((address & 0x60) != 0x20) return;
/* A8 low = $C000-$DFFF page selection */
/* A8 high = IRQ timer toggle */
if (address & 0x100)
{
/* IRQ settings */
if (value & 0x01) irq.enabled = true;
else map50_irq_reset ();
}
else
{
/* Stupid data line swapping */
selectable_bank = 0x00;
if (value & 0x08) selectable_bank |= 0x08;
if (value & 0x04) selectable_bank |= 0x02;
if (value & 0x02) selectable_bank |= 0x01;
if (value & 0x01) selectable_bank |= 0x04;
mmc_bankrom (8, 0xC000, selectable_bank);
}
/* Done */
return;
}
/****************************************************/
/* Shove extra mapper information into a SNSS block */
/****************************************************/
static void map50_setstate (SnssMapperBlock *state)
{
/* TODO: Store SNSS information */
UNUSED (state);
/* Done */
return;
}
/*****************************************************/
/* Pull extra mapper information out of a SNSS block */
/*****************************************************/
static void map50_getstate (SnssMapperBlock *state)
{
/* TODO: Retrieve SNSS information */
UNUSED (state);
/* Done */
return;
}
static const map_memwrite map50_memwrite [] =
{
{ 0x4000, 0x5FFF, map50_write },
{ -1, -1, NULL }
};
const mapintf_t map50_intf =
{
50, /* Mapper number */
"SMB2j (3rd discovered variant)", /* Mapper name */
map50_init, /* Initialization routine */
NULL, /* VBlank callback */
map50_hblank, /* HBlank callback */
map50_getstate, /* Get state (SNSS) */
map50_setstate, /* Set state (SNSS) */
NULL, /* Memory read structure */
map50_memwrite, /* Memory write structure */
NULL /* External sound device */
};
/*
** $Log: map050.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1 2001/04/27 10:57:41 neil
** wheee
**
** Revision 1.1 2000/12/27 19:22:13 firebug
** initial revision
**
**
*/

View file

@ -0,0 +1,234 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map64.c
**
** mapper 64 interface
** $Id: map064.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes.h"
#include "log.h"
static struct
{
int counter, latch;
bool enabled, reset;
} irq;
static uint8 command = 0;
static uint16 vrombase = 0x0000;
static void map64_hblank(int vblank)
{
if (vblank)
return;
irq.reset = false;
if (ppu_enabled())
{
if (0 == irq.counter--)
{
irq.counter = irq.latch;
if (true == irq.enabled)
nes_irq();
irq.reset = true;
}
}
}
/* mapper 64: Tengen RAMBO-1 */
static void map64_write(uint32 address, uint8 value)
{
switch (address & 0xE001)
{
case 0x8000:
command = value;
vrombase = (value & 0x80) ? 0x1000 : 0x0000;
break;
case 0x8001:
switch (command & 0xF)
{
case 0:
mmc_bankvrom(1, 0x0000 ^ vrombase, value);
mmc_bankvrom(1, 0x0400 ^ vrombase, value);
break;
case 1:
mmc_bankvrom(1, 0x0800 ^ vrombase, value);
mmc_bankvrom(1, 0x0C00 ^ vrombase, value);
break;
case 2:
mmc_bankvrom(1, 0x1000 ^ vrombase, value);
break;
case 3:
mmc_bankvrom(1, 0x1400 ^ vrombase, value);
break;
case 4:
mmc_bankvrom(1, 0x1800 ^ vrombase, value);
break;
case 5:
mmc_bankvrom(1, 0x1C00 ^ vrombase, value);
break;
case 6:
mmc_bankrom(8, (command & 0x40) ? 0xA000 : 0x8000, value);
break;
case 7:
mmc_bankrom(8, (command & 0x40) ? 0xC000 : 0xA000, value);
break;
case 8:
mmc_bankvrom(1, 0x0400, value);
break;
case 9:
mmc_bankvrom(1, 0x0C00, value);
break;
case 15:
mmc_bankrom(8, (command & 0x40) ? 0x8000 : 0xC000, value);
break;
default:
#ifdef NOFRENDO_DEBUG
log_printf("mapper 64: unknown command #%d", command & 0xF);
#endif
break;
}
break;
case 0xA000:
if (value & 1)
ppu_mirror(0, 0, 1, 1);
else
ppu_mirror(0, 1, 0, 1);
break;
case 0xC000:
//irq.counter = value;
irq.latch = value;
break;
case 0xC001:
//irq.latch = value;
irq.reset = true;
break;
case 0xE000:
//irq.counter = irq.latch;
irq.enabled = false;
break;
case 0xE001:
irq.enabled = true;
break;
default:
#ifdef NOFRENDO_DEBUG
log_printf("mapper 64: Wrote $%02X to $%04X", value, address);
#endif
break;
}
if (true == irq.reset)
irq.counter = irq.latch;
}
static void map64_init(void)
{
mmc_bankrom(8, 0x8000, MMC_LASTBANK);
mmc_bankrom(8, 0xA000, MMC_LASTBANK);
mmc_bankrom(8, 0xC000, MMC_LASTBANK);
mmc_bankrom(8, 0xE000, MMC_LASTBANK);
irq.counter = irq.latch = 0;
irq.reset = irq.enabled = false;
}
static const map_memwrite map64_memwrite[] =
{
{ 0x8000, 0xFFFF, map64_write },
{ -1, -1, NULL }
};
const mapintf_t map64_intf =
{
64, /* mapper number */
"Tengen RAMBO-1", /* mapper name */
map64_init, /* init routine */
NULL, /* vblank callback */
map64_hblank, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map64_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map064.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.8 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.7 2000/10/22 15:03:13 matt
** simplified mirroring
**
** Revision 1.6 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.5 2000/10/10 13:58:17 matt
** stroustrup squeezing his way in the door
**
** Revision 1.4 2000/07/10 13:51:25 matt
** using generic nes_irq() routine now
**
** Revision 1.3 2000/07/10 05:29:03 matt
** cleaned up some mirroring issues
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/05 05:05:18 matt
** initial revision
**
*/

View file

@ -0,0 +1,144 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map65.c
**
** mapper 65 interface
** $Id: map065.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes_ppu.h"
static struct
{
int counter;
bool enabled;
int cycles;
uint8 low, high;
} irq;
static void map65_init(void)
{
irq.counter = 0;
irq.enabled = false;
irq.low = irq.high = 0;
irq.cycles = 0;
}
/* TODO: shouldn't there be some kind of HBlank callback??? */
/* mapper 65: Irem H-3001*/
static void map65_write(uint32 address, uint8 value)
{
int range = address & 0xF000;
int reg = address & 7;
switch (range)
{
case 0x8000:
case 0xA000:
case 0xC000:
mmc_bankrom(8, range, value);
break;
case 0xB000:
mmc_bankvrom(1, reg << 10, value);
break;
case 0x9000:
switch (reg)
{
case 4:
irq.enabled = (value & 0x01) ? false : true;
break;
case 5:
irq.high = value;
irq.cycles = (irq.high << 8) | irq.low;
irq.counter = (uint8)(irq.cycles / 128);
break;
case 6:
irq.low = value;
irq.cycles = (irq.high << 8) | irq.low;
irq.counter = (uint8)(irq.cycles / 128);
break;
default:
break;
}
break;
default:
break;
}
}
static const map_memwrite map65_memwrite[] =
{
{ 0x8000, 0xFFFF, map65_write },
{ -1, -1, NULL }
};
const mapintf_t map65_intf =
{
65, /* mapper number */
"Irem H-3001", /* mapper name */
map65_init, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map65_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map065.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.5 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.4 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.3 2000/10/10 13:58:17 matt
** stroustrup squeezing his way in the door
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/06 01:01:56 matt
** initial revision
**
*/

View file

@ -0,0 +1,94 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map66.c
**
** mapper 66 interface
** $Id: map066.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
/* mapper 66: GNROM */
static void map66_write(uint32 address, uint8 value)
{
UNUSED(address);
mmc_bankrom(32, 0x8000, (value >> 4) & 3);
mmc_bankvrom(8, 0x0000, value & 3);
}
static void map66_init(void)
{
mmc_bankrom(32, 0x8000, 0);
mmc_bankvrom(8, 0x0000, 0);
}
static const map_memwrite map66_memwrite[] =
{
{ 0x8000, 0xFFFF, map66_write },
{ -1, -1, NULL }
};
const mapintf_t map66_intf =
{
66, /* mapper number */
"GNROM", /* mapper name */
map66_init, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map66_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map066.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.5 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.4 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.3 2000/08/16 02:50:11 matt
** random mapper cleanups
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/05 05:05:18 matt
** initial revision
**
*/

View file

@ -0,0 +1,115 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map70.c
**
** mapper 70 interface
** $Id: map070.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes_ppu.h"
/* mapper 70: Arkanoid II, Kamen Rider Club, etc. */
/* ($8000-$FFFF) D6-D4 = switch $8000-$BFFF */
/* ($8000-$FFFF) D3-D0 = switch PPU $0000-$1FFF */
/* ($8000-$FFFF) D7 = switch mirroring */
static void map70_write(uint32 address, uint8 value)
{
UNUSED(address);
mmc_bankrom(16, 0x8000, (value >> 4) & 0x07);
mmc_bankvrom(8, 0x0000, value & 0x0F);
/* Argh! FanWen used the 4-screen bit to determine
** whether the game uses D7 to switch between
** horizontal and vertical mirroring, or between
** one-screen mirroring from $2000 or $2400.
*/
if (mmc_getinfo()->flags & ROM_FLAG_FOURSCREEN)
{
if (value & 0x80)
ppu_mirror(0, 0, 1, 1); /* horiz */
else
ppu_mirror(0, 1, 0, 1); /* vert */
}
else
{
int mirror = (value & 0x80) >> 7;
ppu_mirror(mirror, mirror, mirror, mirror);
}
}
static const map_memwrite map70_memwrite[] =
{
{ 0x8000, 0xFFFF, map70_write },
{ -1, -1, NULL }
};
const mapintf_t map70_intf =
{
70, /* mapper number */
"Mapper 70", /* mapper name */
NULL, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map70_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map070.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.7 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.6 2000/10/22 15:03:13 matt
** simplified mirroring
**
** Revision 1.5 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.4 2000/08/16 02:50:11 matt
** random mapper cleanups
**
** Revision 1.3 2000/07/10 05:29:03 matt
** cleaned up some mirroring issues
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/06 01:01:56 matt
** initial revision
**
*/

View file

@ -0,0 +1,173 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map073.c
**
** Mapper #73 (Konami VRC3)
** Implementation by Firebug
** $Id: map073.c,v 1.2 2001/04/27 14:37:11 neil Exp $
**
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes.h"
#include "libsnss.h"
#include "log.h"
static struct
{
bool enabled;
uint32 counter;
} irq;
/**************************/
/* Mapper #73: Salamander */
/**************************/
static void map73_init (void)
{
/* Turn off IRQs */
irq.enabled = false;
irq.counter = 0x0000;
/* Done */
return;
}
/****************************************/
/* Mapper #73 callback for IRQ handling */
/****************************************/
static void map73_hblank (int vblank)
{
/* Counter is M2 based so it doesn't matter whether */
/* the PPU is in its VBlank period or not */
UNUSED (vblank);
/* Increment the counter if it is enabled and check for strike */
if (irq.enabled)
{
/* Is there a constant for cycles per scanline? */
/* If so, someone ought to substitute it here */
irq.counter = irq.counter + 114;
/* Counter triggered on overflow into Q16 */
if (irq.counter & 0x10000)
{
/* Clip to sixteen-bit word */
irq.counter &= 0xFFFF;
/* Trigger the IRQ */
nes_irq ();
/* Shut off IRQ counter */
irq.enabled = false;
}
}
}
/******************************************/
/* Mapper #73 write handler ($8000-$FFFF) */
/******************************************/
static void map73_write (uint32 address, uint8 value)
{
switch (address & 0xF000)
{
case 0x8000: irq.counter &= 0xFFF0;
irq.counter |= (uint32) (value);
break;
case 0x9000: irq.counter &= 0xFF0F;
irq.counter |= (uint32) (value << 4);
break;
case 0xA000: irq.counter &= 0xF0FF;
irq.counter |= (uint32) (value << 8);
break;
case 0xB000: irq.counter &= 0x0FFF;
irq.counter |= (uint32) (value << 12);
break;
case 0xC000: if (value & 0x02) irq.enabled = true;
else irq.enabled = false;
break;
case 0xF000: mmc_bankrom (16, 0x8000, value);
default: break;
}
/* Done */
return;
}
/****************************************************/
/* Shove extra mapper information into a SNSS block */
/****************************************************/
static void map73_setstate (SnssMapperBlock *state)
{
/* TODO: Store SNSS information */
UNUSED (state);
/* Done */
return;
}
/*****************************************************/
/* Pull extra mapper information out of a SNSS block */
/*****************************************************/
static void map73_getstate (SnssMapperBlock *state)
{
/* TODO: Retrieve SNSS information */
UNUSED (state);
/* Done */
return;
}
static const map_memwrite map73_memwrite [] =
{
{ 0x8000, 0xFFFF, map73_write },
{ -1, -1, NULL }
};
const mapintf_t map73_intf =
{
73, /* Mapper number */
"Konami VRC3", /* Mapper name */
map73_init, /* Initialization routine */
NULL, /* VBlank callback */
map73_hblank, /* HBlank callback */
map73_getstate, /* Get state (SNSS) */
map73_setstate, /* Set state (SNSS) */
NULL, /* Memory read structure */
map73_memwrite, /* Memory write structure */
NULL /* External sound device */
};
/*
** $Log: map073.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1 2001/04/27 10:57:41 neil
** wheee
**
** Revision 1.1 2000/12/30 06:35:05 firebug
** Initial revision
**
**
*/

View file

@ -0,0 +1,131 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map75.c
**
** mapper 75 interface
** $Id: map075.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes_ppu.h"
static uint8 latch[2];
static uint8 hibits;
/* mapper 75: Konami VRC1 */
static void map75_write(uint32 address, uint8 value)
{
switch ((address & 0xF000) >> 12)
{
case 0x8:
mmc_bankrom(8, 0x8000, value);
break;
case 0x9:
hibits = (value & 0x06);
mmc_bankvrom(4, 0x0000, ((hibits & 0x02) << 3) | latch[0]);
mmc_bankvrom(4, 0x1000, ((hibits & 0x04) << 2) | latch[1]);
if (value & 1)
ppu_mirror(0, 1, 0, 1); /* vert */
else
ppu_mirror(0, 0, 1, 1); /* horiz */
break;
case 0xA:
mmc_bankrom(8, 0xA000, value);
break;
case 0xC:
mmc_bankrom(8, 0xC000, value);
break;
case 0xE:
latch[0] = (value & 0x0F);
mmc_bankvrom(4, 0x0000, ((hibits & 0x02) << 3) | latch[0]);
break;
case 0xF:
latch[1] = (value & 0x0F);
mmc_bankvrom(4, 0x1000, ((hibits & 0x04) << 2) | latch[1]);
break;
default:
break;
}
}
static const map_memwrite map75_memwrite[] =
{
{ 0x8000, 0xFFFF, map75_write },
{ -1, -1, NULL }
};
const mapintf_t map75_intf =
{
75, /* mapper number */
"Konami VRC1", /* mapper name */
NULL, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map75_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map075.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.6 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.5 2000/10/22 15:03:14 matt
** simplified mirroring
**
** Revision 1.4 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.3 2000/07/10 05:29:03 matt
** cleaned up some mirroring issues
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/06 01:01:56 matt
** initial revision
**
*/

View file

@ -0,0 +1,111 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map78.c
**
** mapper 78 interface
** $Id: map078.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes_ppu.h"
/* mapper 78: Holy Diver, Cosmo Carrier */
/* ($8000-$FFFF) D2-D0 = switch $8000-$BFFF */
/* ($8000-$FFFF) D7-D4 = switch PPU $0000-$1FFF */
/* ($8000-$FFFF) D3 = switch mirroring */
static void map78_write(uint32 address, uint8 value)
{
UNUSED(address);
mmc_bankrom(16, 0x8000, value & 7);
mmc_bankvrom(8, 0x0000, (value >> 4) & 0x0F);
/* Ugh! Same abuse of the 4-screen bit as with Mapper #70 */
if (mmc_getinfo()->flags & ROM_FLAG_FOURSCREEN)
{
if (value & 0x08)
ppu_mirror(0, 1, 0, 1); /* vert */
else
ppu_mirror(0, 0, 1, 1); /* horiz */
}
else
{
int mirror = (value >> 3) & 1;
ppu_mirror(mirror, mirror, mirror, mirror);
}
}
static const map_memwrite map78_memwrite[] =
{
{ 0x8000, 0xFFFF, map78_write },
{ -1, -1, NULL }
};
const mapintf_t map78_intf =
{
78, /* mapper number */
"Mapper 78", /* mapper name */
NULL, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map78_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map078.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.7 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.6 2000/10/22 15:03:14 matt
** simplified mirroring
**
** Revision 1.5 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.4 2000/08/16 02:50:11 matt
** random mapper cleanups
**
** Revision 1.3 2000/07/10 05:29:03 matt
** cleaned up some mirroring issues
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/06 01:01:56 matt
** initial revision
**
*/

View file

@ -0,0 +1,92 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map78.c
**
** mapper 78 interface
** $Id: map079.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
/* mapper 79: NINA-03/06 */
static void map79_write(uint32 address, uint8 value)
{
if ((address & 0x5100) == 0x4100)
{
mmc_bankrom(32, 0x8000, (value >> 3) & 1);
mmc_bankvrom(8, 0x0000, value & 7);
}
}
static void map79_init(void)
{
mmc_bankrom(32, 0x8000, 0);
mmc_bankvrom(8, 0x0000, 0);
}
static const map_memwrite map79_memwrite[] =
{
{ 0x4100, 0x5FFF, map79_write }, /* ????? incorrect range ??? */
{ -1, -1, NULL }
};
const mapintf_t map79_intf =
{
79, /* mapper number */
"NINA-03/06", /* mapper name */
map79_init, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map79_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map079.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.4 2000/10/22 19:17:47 matt
** mapper cleanups galore
**
** Revision 1.3 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/06 01:01:56 matt
** initial revision
**
*/

View file

@ -0,0 +1,232 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map85.c
**
** mapper 85 interface
** $Id: map085.c,v 1.3 2001/05/06 01:42:03 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes.h"
#include "log.h"
static struct
{
int counter, latch;
int wait_state;
bool enabled;
} irq;
/* mapper 85: Konami VRC7 */
static void map85_write(uint32 address, uint8 value)
{
uint8 bank = address >> 12;
uint8 reg = (address & 0x10) | ((address & 0x08) << 1);
switch (bank)
{
case 0x08:
if (0x10 == reg)
mmc_bankrom(8, 0xA000, value);
else
mmc_bankrom(8, 0x8000, value);
break;
case 0x09:
/* 0x10 & 0x30 should be trapped by sound emulation */
mmc_bankrom(8, 0xC000, value);
break;
case 0x0A:
if (0x10 == reg)
mmc_bankvrom(1, 0x0400, value);
else
mmc_bankvrom(1, 0x0000, value);
break;
case 0x0B:
if (0x10 == reg)
mmc_bankvrom(1, 0x0C00, value);
else
mmc_bankvrom(1, 0x0800, value);
break;
case 0x0C:
if (0x10 == reg)
mmc_bankvrom(1, 0x1400, value);
else
mmc_bankvrom(1, 0x1000, value);
break;
case 0x0D:
if (0x10 == reg)
mmc_bankvrom(1, 0x1C00, value);
else
mmc_bankvrom(1, 0x1800, value);
break;
case 0x0E:
if (0x10 == reg)
{
irq.latch = value;
}
else
{
switch (value & 3)
{
case 0:
ppu_mirror(0, 1, 0, 1); /* vertical */
break;
case 1:
ppu_mirror(0, 0, 1, 1); /* horizontal */
break;
case 2:
ppu_mirror(0, 0, 0, 0);
break;
case 3:
ppu_mirror(1, 1, 1, 1);
break;
}
}
break;
case 0x0F:
if (0x10 == reg)
{
irq.enabled = irq.wait_state;
}
else
{
irq.wait_state = value & 0x01;
irq.enabled = (value & 0x02) ? true : false;
if (true == irq.enabled)
irq.counter = irq.latch;
}
break;
default:
#ifdef NOFRENDO_DEBUG
log_printf("unhandled vrc7 write: $%02X to $%04X\n", value, address);
#endif /* NOFRENDO_DEBUG */
break;
}
}
static void map85_hblank(int vblank)
{
UNUSED(vblank);
if (irq.enabled)
{
if (++irq.counter > 0xFF)
{
irq.counter = irq.latch;
nes_irq();
//return;
}
//irq.counter++;
}
}
static const map_memwrite map85_memwrite[] =
{
{ 0x8000, 0xFFFF, map85_write },
{ -1, -1, NULL }
};
static void map85_init(void)
{
mmc_bankrom(16, 0x8000, 0);
mmc_bankrom(16, 0xC000, MMC_LASTBANK);
mmc_bankvrom(8, 0x0000, 0);
irq.counter = irq.latch = 0;
irq.wait_state = 0;
irq.enabled = false;
}
const mapintf_t map85_intf =
{
85, /* mapper number */
"Konami VRC7", /* mapper name */
map85_init, /* init routine */
NULL, /* vblank callback */
map85_hblank, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map85_memwrite, /* memory write structure */
NULL
};
/*
** $Log: map085.c,v $
** Revision 1.3 2001/05/06 01:42:03 neil
** boooo
**
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.10 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.9 2000/10/22 15:03:14 matt
** simplified mirroring
**
** Revision 1.8 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.7 2000/10/10 13:58:17 matt
** stroustrup squeezing his way in the door
**
** Revision 1.6 2000/08/16 02:50:11 matt
** random mapper cleanups
**
** Revision 1.5 2000/07/23 14:37:21 matt
** added a break statement
**
** Revision 1.4 2000/07/15 23:52:19 matt
** rounded out a bunch more mapper interfaces
**
** Revision 1.3 2000/07/10 13:51:25 matt
** using generic nes_irq() routine now
**
** Revision 1.2 2000/07/10 05:29:03 matt
** cleaned up some mirroring issues
**
** Revision 1.1 2000/07/06 02:47:47 matt
** initial revision
**
*/

View file

@ -0,0 +1,85 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map087.c
**
** Mapper #87 (16K VROM switch)
** Implementation by Firebug
** $Id: map087.c,v 1.2 2001/04/27 14:37:11 neil Exp $
**
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes.h"
#include "libsnss.h"
#include "log.h"
/******************************************/
/* Mapper #87 write handler ($6000-$7FFF) */
/******************************************/
static void map87_write (uint32 address, uint8 value)
{
/* Within range, address written to is irrelevant */
UNUSED (address);
/* Very simple: 8K CHR page is selected by D1 */
if (value & 0x02) mmc_bankvrom (8, 0x0000, 0x01);
else mmc_bankvrom (8, 0x0000, 0x00);
/* Done */
return;
}
static const map_memwrite map87_memwrite [] =
{
{ 0x6000, 0x7FFF, map87_write },
{ -1, -1, NULL }
};
const mapintf_t map87_intf =
{
87, /* Mapper number */
"16K VROM switch", /* Mapper name */
NULL, /* Initialization routine */
NULL, /* VBlank callback */
NULL, /* HBlank callback */
NULL, /* Get state (SNSS) */
NULL, /* Set state (SNSS) */
NULL, /* Memory read structure */
map87_memwrite, /* Memory write structure */
NULL /* External sound device */
};
/*
** $Log: map087.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1 2001/04/27 10:57:41 neil
** wheee
**
** Revision 1.1 2000/12/30 06:34:44 firebug
** Initial revision
**
**
*/

View file

@ -0,0 +1,77 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map93.c
**
** mapper 93 interface
** $Id: map093.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes_ppu.h"
static void map93_write(uint32 address, uint8 value)
{
UNUSED(address);
/* ($8000-$FFFF) D7-D4 = switch $8000-$BFFF D0: mirror */
mmc_bankrom(16, 0x8000, value >> 4);
if (value & 1)
ppu_mirror(0, 1, 0, 1); /* vert */
else
ppu_mirror(0, 0, 1, 1); /* horiz */
}
static const map_memwrite map93_memwrite[] =
{
{ 0x8000, 0xFFFF, map93_write },
{ -1, -1, NULL }
};
const mapintf_t map93_intf =
{
93, /* mapper number */
"Mapper 93", /* mapper name */
NULL, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map93_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map093.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/12/11 12:33:48 matt
** initial revision
**
*/

View file

@ -0,0 +1,87 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map94.c
**
** mapper 94 interface
** $Id: map094.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
/* mapper 94: Senjou no Ookami */
static void map94_write(uint32 address, uint8 value)
{
UNUSED(address);
/* ($8000-$FFFF) D7-D2 = switch $8000-$BFFF */
mmc_bankrom(16, 0x8000, value >> 2);
}
static const map_memwrite map94_memwrite[] =
{
{ 0x8000, 0xFFFF, map94_write },
{ -1, -1, NULL }
};
const mapintf_t map94_intf =
{
94, /* mapper number */
"Mapper 94", /* mapper name */
NULL, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map94_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map094.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.5 2000/10/22 19:17:47 matt
** mapper cleanups galore
**
** Revision 1.4 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.3 2000/08/16 02:50:11 matt
** random mapper cleanups
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/06 01:01:56 matt
** initial revision
**
*/

View file

@ -0,0 +1,90 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map99.c
**
** mapper 99 interface
** $Id: map099.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes_ppu.h"
/* Switch VROM for VS games */
static void map99_vromswitch(uint8 value)
{
int bank = (value & 0x04) >> 2;
mmc_bankvrom(8, 0x0000, bank);
}
/* mapper 99: VS. System */
static const void map99_init(void)
{
ppu_mirror(0, 1, 2, 3);
ppu_setvromswitch(map99_vromswitch);
}
const mapintf_t map99_intf =
{
99, /* mapper number */
"VS. System", /* mapper name */
map99_init, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
NULL, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map099.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.6 2000/10/22 19:17:47 matt
** mapper cleanups galore
**
** Revision 1.5 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.4 2000/10/10 13:58:17 matt
** stroustrup squeezing his way in the door
**
** Revision 1.3 2000/07/10 05:29:03 matt
** cleaned up some mirroring issues
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/05 05:05:18 matt
** initial revision
**
*/

View file

@ -0,0 +1,140 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map160.c
**
** mapper 160 interface
** $Id: map160.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes_ppu.h"
#include "nes.h"
static struct
{
bool enabled, expired;
int counter;
int latch_c005, latch_c003;
} irq;
static void map160_write(uint32 address, uint8 value)
{
if (address >= 0x8000 && address <= 0x8003)
{
mmc_bankrom(8, 0x8000 + 0x2000 * (address & 3), value);
}
else if (address >= 0x9000 && address <= 0x9007)
{
mmc_bankvrom(1, 0x400 * (address & 7), value);
}
else if (0xC002 == address)
{
irq.enabled = false;
irq.latch_c005 = irq.latch_c003;
}
else if (0xC003 == address)
{
if (false == irq.expired)
{
irq.counter = value;
}
else
{
irq.expired = false;
irq.enabled = true;
irq.counter = irq.latch_c005;
}
}
else if (0xC005 == address)
{
irq.latch_c005 = value;
irq.counter = value;
}
#ifdef NOFRENDO_DEBUG
else
{
log_printf("mapper 160: untrapped write $%02X to $%04X\n", value, address);
}
#endif /* NOFRENDO_DEBUG */
}
static void map160_hblank(int vblank)
{
if (!vblank)
{
if (ppu_enabled() && irq.enabled)
{
if (0 == irq.counter && false == irq.expired)
{
irq.expired = true;
nes_irq();
}
else
{
irq.counter--;
}
}
}
}
static void map160_init(void)
{
irq.enabled = false;
irq.expired = false;
irq.counter = 0;
irq.latch_c003 = irq.latch_c005 = 0;
}
static const map_memwrite map160_memwrite[] =
{
{ 0x8000, 0xFFFF, map160_write },
{ -1, -1, NULL }
};
const mapintf_t map160_intf =
{
160, /* mapper number */
"Aladdin (pirate)", /* mapper name */
map160_init, /* init routine */
NULL, /* vblank callback */
map160_hblank, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map160_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map160.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1 2001/04/27 10:57:41 neil
** wheee
**
** Revision 1.1 2000/12/27 04:24:46 matt
** initial revision
**
*/

View file

@ -0,0 +1,114 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map229.c
**
** Mapper #229 (31 in 1)
** Implementation by Firebug
** Mapper information courtesy of Mark Knibbs
** $Id: map229.c,v 1.2 2001/04/27 14:37:11 neil Exp $
**
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes.h"
#include "libsnss.h"
#include "log.h"
/************************/
/* Mapper #229: 31 in 1 */
/************************/
static void map229_init (void)
{
/* On reset, PRG is set to first 32K and CHR to first 8K */
mmc_bankrom (32, 0x8000, 0x00);
mmc_bankvrom (8, 0x0000, 0x00);
/* Done */
return;
}
/*******************************************/
/* Mapper #229 write handler ($8000-$FFFF) */
/*******************************************/
static void map229_write (uint32 address, uint8 value)
{
/* Value written is irrelevant */
UNUSED (value);
/* A4-A0 sets 8K CHR page */
mmc_bankvrom (8, 0x0000, (uint8) (address & 0x1F));
/* If A4-A1 are all low then select the first 32K, */
/* otherwise select a 16K bank at both $8000 and $C000 */
if ((address & 0x1E) == 0x00)
{
mmc_bankrom (32, 0x8000, 0x00);
}
else
{
mmc_bankrom (16, 0x8000, (uint8) (address & 0x1F));
mmc_bankrom (16, 0xC000, (uint8) (address & 0x1F));
}
/* A5: mirroring (low = vertical, high = horizontal) */
if (address & 0x20) ppu_mirror(0, 0, 1, 1);
else ppu_mirror(0, 1, 0, 1);
/* Done */
return;
}
static const map_memwrite map229_memwrite [] =
{
{ 0x8000, 0xFFFF, map229_write },
{ -1, -1, NULL }
};
const mapintf_t map229_intf =
{
229, /* Mapper number */
"31 in 1 (bootleg)", /* Mapper name */
map229_init, /* Initialization routine */
NULL, /* VBlank callback */
NULL, /* HBlank callback */
NULL, /* Get state (SNSS) */
NULL, /* Set state (SNSS) */
NULL, /* Memory read structure */
map229_memwrite, /* Memory write structure */
NULL /* External sound device */
};
/*
** $Log: map229.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1 2001/04/27 10:57:41 neil
** wheee
**
** Revision 1.1 2000/12/30 06:34:31 firebug
** Initial revision
**
**
*/

View file

@ -0,0 +1,95 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map231.c
**
** mapper 231 interface
** $Id: map231.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
/* mapper 231: NINA-07, used in Wally Bear and the NO! Gang */
static void map231_init(void)
{
mmc_bankrom(32, 0x8000, MMC_LASTBANK);
}
static void map231_write(uint32 address, uint8 value)
{
int bank, vbank;
UNUSED(address);
bank = ((value & 0x80) >> 5) | (value & 0x03);
vbank = (value >> 4) & 0x07;
mmc_bankrom(32, 0x8000, bank);
mmc_bankvrom(8, 0x0000, vbank);
}
static const map_memwrite map231_memwrite[] =
{
{ 0x8000, 0xFFFF, map231_write },
{ -1, -1, NULL }
};
const mapintf_t map231_intf =
{
231, /* mapper number */
"NINA-07", /* mapper name */
map231_init, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map231_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: map231.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.4 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.3 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.2 2000/08/16 02:50:11 matt
** random mapper cleanups
**
** Revision 1.1 2000/07/11 03:14:18 melanson
** Initial commit for mappers 16, 34, and 231
**
**
*/

View file

@ -0,0 +1,452 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** map_vrc.c
**
** VRC mapper interface
** $Id: mapvrc.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
#include "nes.h"
#include "log.h"
#define VRC_VBANK(bank, value, high) \
{ \
if ((high)) \
highnybbles[(bank)] = (value) & 0x0F; \
else \
lownybbles[(bank)] = (value) & 0x0F; \
mmc_bankvrom(1, (bank) << 10, (highnybbles[(bank)] << 4)+lownybbles[(bank)]); \
}
static struct
{
int counter, enabled;
int latch, wait_state;
} irq;
static int select_c000 = 0;
static uint8 lownybbles[8];
static uint8 highnybbles[8];
static void vrc_init(void)
{
irq.counter = irq.enabled = 0;
irq.latch = irq.wait_state = 0;
}
static void map21_write(uint32 address, uint8 value)
{
switch (address)
{
case 0x8000:
if (select_c000)
mmc_bankrom(8, 0xC000,value);
else
mmc_bankrom(8, 0x8000,value);
break;
case 0x9000:
switch (value & 3)
{
case 0:
ppu_mirror(0, 1, 0, 1); /* vertical */
break;
case 1:
ppu_mirror(0, 0, 1, 1); /* horizontal */
break;
case 2:
ppu_mirror(0, 0, 0, 0);
break;
case 3:
ppu_mirror(1, 1, 1, 1);
break;
default:
break;
}
break;
case 0x9002: select_c000=(value&0x02)>>1; break;
case 0xA000: mmc_bankrom(8, 0xA000,value); break;
case 0xB000: VRC_VBANK(0,value,0); break;
case 0xB002:
case 0xB040: VRC_VBANK(0,value,1); break;
case 0xB001:
case 0xB004:
case 0xB080: VRC_VBANK(1,value,0); break;
case 0xB003:
case 0xB006:
case 0xB0C0: VRC_VBANK(1,value,1); break;
case 0xC000: VRC_VBANK(2,value,0); break;
case 0xC002:
case 0xC040: VRC_VBANK(2,value,1); break;
case 0xC001:
case 0xC004:
case 0xC080: VRC_VBANK(3,value,0); break;
case 0xC003:
case 0xC006:
case 0xC0C0: VRC_VBANK(3,value,1); break;
case 0xD000: VRC_VBANK(4,value,0); break;
case 0xD002:
case 0xD040: VRC_VBANK(4,value,1); break;
case 0xD001:
case 0xD004:
case 0xD080: VRC_VBANK(5,value,0); break;
case 0xD003:
case 0xD006:
case 0xD0C0: VRC_VBANK(5,value,1); break;
case 0xE000: VRC_VBANK(6,value,0); break;
case 0xE002:
case 0xE040: VRC_VBANK(6,value,1); break;
case 0xE001:
case 0xE004:
case 0xE080: VRC_VBANK(7,value,0); break;
case 0xE003:
case 0xE006:
case 0xE0C0: VRC_VBANK(7,value,1); break;
case 0xF000:
irq.latch &= 0xF0;
irq.latch |= (value & 0x0F);
break;
case 0xF002:
case 0xF040:
irq.latch &= 0x0F;
irq.latch |= ((value & 0x0F) << 4);
break;
case 0xF004:
case 0xF001:
case 0xF080:
irq.enabled = (value >> 1) & 0x01;
irq.wait_state = value & 0x01;
irq.counter = irq.latch;
break;
case 0xF006:
case 0xF003:
case 0xF0C0:
irq.enabled = irq.wait_state;
break;
default:
#ifdef NOFRENDO_DEBUG
log_printf("wrote $%02X to $%04X", value, address);
#endif
break;
}
}
static void map22_write(uint32 address, uint8 value)
{
int reg = address >> 12;
switch (reg)
{
case 0x8:
mmc_bankrom(8, 0x8000, value);
break;
case 0xA:
mmc_bankrom(8, 0xA000, value);
break;
case 0x9:
switch (value & 3)
{
case 0:
ppu_mirror(0, 1, 0, 1); /* vertical */
break;
case 1:
ppu_mirror(0, 0, 1, 1); /* horizontal */
break;
case 2:
ppu_mirror(1, 1, 1, 1);
break;
case 3:
ppu_mirror(0, 0, 0, 0);
break;
}
break;
case 0xB:
case 0xC:
case 0xD:
case 0xE:
{
int loc = (((reg - 0xB) << 1) + (address & 1)) << 10;
mmc_bankvrom(1, loc, value >> 1);
}
break;
default:
break;
}
}
static void map23_write(uint32 address, uint8 value)
{
switch (address)
{
case 0x8000:
case 0x8FFF:
mmc_bankrom(8, 0x8000, value);
break;
case 0xA000:
case 0xAFFF:
mmc_bankrom(8, 0xA000, value);
break;
case 0x9000:
case 0x9004:
case 0x9008:
switch(value & 3)
{
case 0:
ppu_mirror(0, 1, 0, 1); /* vertical */
break;
case 1:
ppu_mirror(0, 0, 1, 1); /* horizontal */
break;
case 2:
ppu_mirror(0, 0, 0, 0);
break;
case 3:
ppu_mirror(1, 1, 1, 1);
break;
}
break;
case 0xB000: VRC_VBANK(0,value,0); break;
case 0xB001:
case 0xB004: VRC_VBANK(0,value,1); break;
case 0xB002:
case 0xB008: VRC_VBANK(1,value,0); break;
case 0xB003:
case 0xB00C: VRC_VBANK(1,value,1); break;
case 0xC000: VRC_VBANK(2,value,0); break;
case 0xC001:
case 0xC004: VRC_VBANK(2,value,1); break;
case 0xC002:
case 0xC008: VRC_VBANK(3,value,0); break;
case 0xC003:
case 0xC00C: VRC_VBANK(3,value,1); break;
case 0xD000: VRC_VBANK(4,value,0); break;
case 0xD001:
case 0xD004: VRC_VBANK(4,value,1); break;
case 0xD002:
case 0xD008: VRC_VBANK(5,value,0); break;
case 0xD003:
case 0xD00C: VRC_VBANK(5,value,1); break;
case 0xE000: VRC_VBANK(6,value,0); break;
case 0xE001:
case 0xE004: VRC_VBANK(6,value,1); break;
case 0xE002:
case 0xE008: VRC_VBANK(7,value,0); break;
case 0xE003:
case 0xE00C: VRC_VBANK(7,value,1); break;
case 0xF000:
irq.latch &= 0xF0;
irq.latch |= (value & 0x0F);
break;
case 0xF004:
irq.latch &= 0x0F;
irq.latch |= ((value & 0x0F) << 4);
break;
case 0xF008:
irq.enabled = (value >> 1) & 0x01;
irq.wait_state = value & 0x01;
irq.counter = irq.latch;
break;
case 0xF00C:
irq.enabled = irq.wait_state;
break;
default:
#ifdef NOFRENDO_DEBUG
log_printf("wrote $%02X to $%04X",value,address);
#endif
break;
}
}
static void vrc_hblank(int vblank)
{
UNUSED(vblank);
if (irq.enabled)
{
if (256 == ++irq.counter)
{
irq.counter = irq.latch;
nes_irq();
//irq.enabled = false;
irq.enabled = irq.wait_state;
}
}
}
static map_memwrite map21_memwrite[] =
{
{ 0x8000, 0xFFFF, map21_write },
{ -1, -1, NULL }
};
static map_memwrite map22_memwrite[] =
{
{ 0x8000, 0xFFFF, map22_write },
{ -1, -1, NULL }
};
static map_memwrite map23_memwrite[] =
{
{ 0x8000, 0xFFFF, map23_write },
{ -1, -1, NULL }
};
static void map21_getstate(SnssMapperBlock *state)
{
state->extraData.mapper21.irqCounter = irq.counter;
state->extraData.mapper21.irqCounterEnabled = irq.enabled;
}
static void map21_setstate(SnssMapperBlock *state)
{
irq.counter = state->extraData.mapper21.irqCounter;
irq.enabled = state->extraData.mapper21.irqCounterEnabled;
}
const mapintf_t map21_intf =
{
21, /* mapper number */
"Konami VRC4 A", /* mapper name */
vrc_init, /* init routine */
NULL, /* vblank callback */
vrc_hblank, /* hblank callback */
map21_getstate, /* get state (snss) */
map21_setstate, /* set state (snss) */
NULL, /* memory read structure */
map21_memwrite, /* memory write structure */
NULL /* external sound device */
};
const mapintf_t map22_intf =
{
22, /* mapper number */
"Konami VRC2 A", /* mapper name */
vrc_init, /* init routine */
NULL, /* vblank callback */
NULL, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map22_memwrite, /* memory write structure */
NULL /* external sound device */
};
const mapintf_t map23_intf =
{
23, /* mapper number */
"Konami VRC2 B", /* mapper name */
vrc_init, /* init routine */
NULL, /* vblank callback */
vrc_hblank, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map23_memwrite, /* memory write structure */
NULL /* external sound device */
};
const mapintf_t map25_intf =
{
25, /* mapper number */
"Konami VRC4 B", /* mapper name */
NULL, /* init routine */
NULL, /* vblank callback */
vrc_hblank, /* hblank callback */
NULL, /* get state (snss) */
NULL, /* set state (snss) */
NULL, /* memory read structure */
map21_memwrite, /* memory write structure */
NULL /* external sound device */
};
/*
** $Log: mapvrc.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:19:33 matt
** changed directory structure
**
** Revision 1.10 2000/10/22 19:17:46 matt
** mapper cleanups galore
**
** Revision 1.9 2000/10/22 15:03:14 matt
** simplified mirroring
**
** Revision 1.8 2000/10/21 19:33:38 matt
** many more cleanups
**
** Revision 1.7 2000/10/10 13:58:17 matt
** stroustrup squeezing his way in the door
**
** Revision 1.6 2000/08/16 02:50:11 matt
** random mapper cleanups
**
** Revision 1.5 2000/07/15 23:52:20 matt
** rounded out a bunch more mapper interfaces
**
** Revision 1.4 2000/07/10 13:51:25 matt
** using generic nes_irq() routine now
**
** Revision 1.3 2000/07/10 05:29:03 matt
** cleaned up some mirroring issues
**
** Revision 1.2 2000/07/06 02:48:43 matt
** clearly labelled structure members
**
** Revision 1.1 2000/07/06 01:01:56 matt
** initial revision
**
*/

View file

@ -0,0 +1,447 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** mmc5_snd.c
**
** Nintendo MMC5 sound emulation
** $Id: mmc5_snd.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include <string.h>
#include "noftypes.h"
#include "mmc5_snd.h"
#include "nes_apu.h"
/* TODO: encapsulate apu/mmc5 rectangle */
#define APU_OVERSAMPLE
#define APU_VOLUME_DECAY(x) ((x) -= ((x) >> 7))
/* look up table madness */
static int32 decay_lut[16];
static int vbl_lut[32];
/* various sound constants for sound emulation */
/* vblank length table used for rectangles, triangle, noise */
static const uint8 vbl_length[32] =
{
5, 127, 10, 1, 19, 2, 40, 3, 80, 4, 30, 5, 7, 6, 13, 7,
6, 8, 12, 9, 24, 10, 48, 11, 96, 12, 36, 13, 8, 14, 16, 15
};
/* ratios of pos/neg pulse for rectangle waves
** 2/16 = 12.5%, 4/16 = 25%, 8/16 = 50%, 12/16 = 75%
** (4-bit adder in rectangles, hence the 16)
*/
static const int duty_lut[4] =
{
2, 4, 8, 12
};
#define MMC5_WRA0 0x5000
#define MMC5_WRA1 0x5001
#define MMC5_WRA2 0x5002
#define MMC5_WRA3 0x5003
#define MMC5_WRB0 0x5004
#define MMC5_WRB1 0x5005
#define MMC5_WRB2 0x5006
#define MMC5_WRB3 0x5007
#define MMC5_SMASK 0x5015
typedef struct mmc5rectangle_s
{
uint8 regs[4];
bool enabled;
float accum;
int32 freq;
int32 output_vol;
bool fixed_envelope;
bool holdnote;
uint8 volume;
int32 env_phase;
int32 env_delay;
uint8 env_vol;
int vbl_length;
uint8 adder;
int duty_flip;
} mmc5rectangle_t;
typedef struct mmc5dac_s
{
int32 output;
bool enabled;
} mmc5dac_t;
static struct
{
float incsize;
uint8 mul[2];
mmc5rectangle_t rect[2];
mmc5dac_t dac;
} mmc5;
#define MMC5_RECTANGLE_OUTPUT chan->output_vol
static int32 mmc5_rectangle(mmc5rectangle_t *chan)
{
int32 output;
#ifdef APU_OVERSAMPLE
int num_times;
int32 total;
#endif /* APU_OVERSAMPLE */
/* reg0: 0-3=volume, 4=envelope, 5=hold, 6-7=duty cycle
** reg1: 0-2=sweep shifts, 3=sweep inc/dec, 4-6=sweep length, 7=sweep on
** reg2: 8 bits of freq
** reg3: 0-2=high freq, 7-4=vbl length counter
*/
APU_VOLUME_DECAY(chan->output_vol);
if (false == chan->enabled || 0 == chan->vbl_length)
return MMC5_RECTANGLE_OUTPUT;
/* vbl length counter */
if (false == chan->holdnote)
chan->vbl_length--;
/* envelope decay at a rate of (env_delay + 1) / 240 secs */
chan->env_phase -= 4; /* 240/60 */
while (chan->env_phase < 0)
{
chan->env_phase += chan->env_delay;
if (chan->holdnote)
chan->env_vol = (chan->env_vol + 1) & 0x0F;
else if (chan->env_vol < 0x0F)
chan->env_vol++;
}
if (chan->freq < 4)
return MMC5_RECTANGLE_OUTPUT;
chan->accum -= mmc5.incsize; /* # of cycles per sample */
if (chan->accum >= 0)
return MMC5_RECTANGLE_OUTPUT;
#ifdef APU_OVERSAMPLE
num_times = total = 0;
if (chan->fixed_envelope)
output = chan->volume << 8; /* fixed volume */
else
output = (chan->env_vol ^ 0x0F) << 8;
#endif
while (chan->accum < 0)
{
chan->accum += chan->freq;
chan->adder = (chan->adder + 1) & 0x0F;
#ifdef APU_OVERSAMPLE
if (chan->adder < chan->duty_flip)
total += output;
else
total -= output;
num_times++;
#endif
}
#ifdef APU_OVERSAMPLE
chan->output_vol = total / num_times;
#else
if (chan->fixed_envelope)
output = chan->volume << 8; /* fixed volume */
else
output = (chan->env_vol ^ 0x0F) << 8;
if (0 == chan->adder)
chan->output_vol = output;
else if (chan->adder == chan->duty_flip)
chan->output_vol = -output;
#endif
return MMC5_RECTANGLE_OUTPUT;
}
static uint8 mmc5_read(uint32 address)
{
uint32 retval;
retval = (uint32) (mmc5.mul[0] * mmc5.mul[1]);
switch (address)
{
case 0x5205:
return (uint8) retval;
case 0x5206:
return (uint8) (retval >> 8);
default:
return 0xFF;
}
}
/* mix vrcvi sound channels together */
static int32 mmc5_process(void)
{
int32 accum;
accum = mmc5_rectangle(&mmc5.rect[0]);
accum += mmc5_rectangle(&mmc5.rect[1]);
if (mmc5.dac.enabled)
accum += mmc5.dac.output;
return accum;
}
/* write to registers */
static void mmc5_write(uint32 address, uint8 value)
{
int chan;
switch (address)
{
/* rectangles */
case MMC5_WRA0:
case MMC5_WRB0:
chan = (address & 4) ? 1 : 0;
mmc5.rect[chan].regs[0] = value;
mmc5.rect[chan].volume = value & 0x0F;
mmc5.rect[chan].env_delay = decay_lut[value & 0x0F];
mmc5.rect[chan].holdnote = (value & 0x20) ? true : false;
mmc5.rect[chan].fixed_envelope = (value & 0x10) ? true : false;
mmc5.rect[chan].duty_flip = duty_lut[value >> 6];
break;
case MMC5_WRA1:
case MMC5_WRB1:
break;
case MMC5_WRA2:
case MMC5_WRB2:
chan = (address & 4) ? 1 : 0;
mmc5.rect[chan].regs[2] = value;
if (mmc5.rect[chan].enabled)
mmc5.rect[chan].freq = (((mmc5.rect[chan].regs[3] & 7) << 8) + value) + 1;
break;
case MMC5_WRA3:
case MMC5_WRB3:
chan = (address & 4) ? 1 : 0;
mmc5.rect[chan].regs[3] = value;
if (mmc5.rect[chan].enabled)
{
mmc5.rect[chan].vbl_length = vbl_lut[value >> 3];
mmc5.rect[chan].env_vol = 0;
mmc5.rect[chan].freq = (((value & 7) << 8) + mmc5.rect[chan].regs[2]) + 1;
mmc5.rect[chan].adder = 0;
}
break;
case MMC5_SMASK:
if (value & 0x01)
{
mmc5.rect[0].enabled = true;
}
else
{
mmc5.rect[0].enabled = false;
mmc5.rect[0].vbl_length = 0;
}
if (value & 0x02)
{
mmc5.rect[1].enabled = true;
}
else
{
mmc5.rect[1].enabled = false;
mmc5.rect[1].vbl_length = 0;
}
break;
case 0x5010:
if (value & 0x01)
mmc5.dac.enabled = true;
else
mmc5.dac.enabled = false;
break;
case 0x5011:
mmc5.dac.output = (value ^ 0x80) << 8;
break;
case 0x5205:
mmc5.mul[0] = value;
break;
case 0x5206:
mmc5.mul[1] = value;
break;
case 0x5114:
case 0x5115:
/* ???? */
break;
default:
break;
}
}
/* reset state of vrcvi sound channels */
static void mmc5_reset(void)
{
int i;
apu_t apu;
/* get the phase period from the apu */
apu_getcontext(&apu);
mmc5.incsize = apu.cycle_rate;
for (i = 0x5000; i < 0x5008; i++)
mmc5_write(i, 0);
mmc5_write(0x5010, 0);
mmc5_write(0x5011, 0);
}
static int mmc5_init(void)
{
int i, num_samples;
apu_t apu;
apu_getcontext(&apu);
num_samples = apu.num_samples;
/* lut used for enveloping and frequency sweeps */
for (i = 0; i < 16; i++)
decay_lut[i] = num_samples * (i + 1);
/* used for note length, based on vblanks and size of audio buffer */
for (i = 0; i < 32; i++)
vbl_lut[i] = vbl_length[i] * num_samples;
return 0;
}
static const apu_memread mmc5_memread[] =
{
{ 0x5205, 0x5206, mmc5_read },
{ -1, -1, NULL }
};
static const apu_memwrite mmc5_memwrite[] =
{
{ 0x5000, 0x5015, mmc5_write },
{ 0x5114, 0x5115, mmc5_write },
{ 0x5205, 0x5206, mmc5_write },
{ -1, -1, NULL }
};
const apuext_t mmc5_ext =
{
mmc5_init,
NULL, /* no shutdown */
mmc5_reset,
mmc5_process,
mmc5_memread,
mmc5_memwrite
};
/*
** $Log: mmc5_snd.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.2 2000/11/13 00:57:08 matt
** doesn't look as nasty now
**
** Revision 1.1 2000/10/24 12:19:59 matt
** changed directory structure
**
** Revision 1.16 2000/10/17 11:56:42 matt
** selectable apu base frequency
**
** Revision 1.15 2000/10/10 14:04:29 matt
** make way for bjarne
**
** Revision 1.14 2000/10/10 13:58:18 matt
** stroustrup squeezing his way in the door
**
** Revision 1.13 2000/10/08 17:50:18 matt
** appears $5114/$5115 do something
**
** Revision 1.12 2000/10/03 11:56:20 matt
** better support for optional sound ext routines
**
** Revision 1.11 2000/09/27 12:26:03 matt
** changed sound accumulators back to floats
**
** Revision 1.10 2000/09/15 13:38:40 matt
** changes for optimized apu core
**
** Revision 1.9 2000/09/15 04:58:07 matt
** simplifying and optimizing APU core
**
** Revision 1.8 2000/07/30 04:32:59 matt
** no more apu_getcyclerate hack
**
** Revision 1.7 2000/07/17 01:52:31 matt
** made sure last line of all source files is a newline
**
** Revision 1.6 2000/07/04 04:51:41 matt
** cleanups
**
** Revision 1.5 2000/07/03 02:18:53 matt
** much better external module exporting
**
** Revision 1.4 2000/06/28 22:03:51 matt
** fixed stupid oversight
**
** Revision 1.3 2000/06/20 20:46:58 matt
** minor cleanups
**
** Revision 1.2 2000/06/20 04:06:16 matt
** migrated external sound definition to apu module
**
** Revision 1.1 2000/06/20 00:06:47 matt
** initial revision
**
*/

View file

@ -0,0 +1,70 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** mmc5_snd.h
**
** Nintendo MMC5 sound emulation header
** $Id: mmc5_snd.h,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#ifndef _MMC5_SND_H_
#define _MMC5_SND_H_
#include "nes_apu.h"
extern const apuext_t mmc5_ext;
#endif /* !_MMC5_SND_H_ */
/*
** $Log: mmc5_snd.h,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.2 2000/11/13 00:57:08 matt
** doesn't look as nasty now
**
** Revision 1.1 2000/10/24 12:19:59 matt
** changed directory structure
**
** Revision 1.6 2000/10/10 13:58:18 matt
** stroustrup squeezing his way in the door
**
** Revision 1.5 2000/09/27 12:26:03 matt
** changed sound accumulators back to floats
**
** Revision 1.4 2000/09/15 13:38:40 matt
** changes for optimized apu core
**
** Revision 1.3 2000/07/17 01:52:31 matt
** made sure last line of all source files is a newline
**
** Revision 1.2 2000/06/20 04:06:16 matt
** migrated external sound definition to apu module
**
** Revision 1.1 2000/06/20 00:06:47 matt
** initial revision
**
*/

View file

@ -0,0 +1,122 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** mmclist.c
**
** list of all mapper interfaces
** $Id: mmclist.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nes_mmc.h"
/* mapper interfaces */
extern mapintf_t map0_intf;
extern mapintf_t map1_intf;
extern mapintf_t map2_intf;
extern mapintf_t map3_intf;
extern mapintf_t map4_intf;
extern mapintf_t map5_intf;
extern mapintf_t map7_intf;
extern mapintf_t map8_intf;
extern mapintf_t map9_intf;
extern mapintf_t map11_intf;
extern mapintf_t map15_intf;
extern mapintf_t map16_intf;
extern mapintf_t map18_intf;
extern mapintf_t map19_intf;
extern mapintf_t map21_intf;
extern mapintf_t map22_intf;
extern mapintf_t map23_intf;
extern mapintf_t map24_intf;
extern mapintf_t map25_intf;
extern mapintf_t map32_intf;
extern mapintf_t map33_intf;
extern mapintf_t map34_intf;
extern mapintf_t map40_intf;
extern mapintf_t map64_intf;
extern mapintf_t map65_intf;
extern mapintf_t map66_intf;
extern mapintf_t map70_intf;
extern mapintf_t map75_intf;
extern mapintf_t map78_intf;
extern mapintf_t map79_intf;
extern mapintf_t map85_intf;
extern mapintf_t map94_intf;
extern mapintf_t map99_intf;
extern mapintf_t map231_intf;
/* implemented mapper interfaces */
const mapintf_t *mappers[] =
{
&map0_intf,
&map1_intf,
&map2_intf,
&map3_intf,
&map4_intf,
&map5_intf,
&map7_intf,
&map8_intf,
&map9_intf,
&map11_intf,
&map15_intf,
&map16_intf,
&map18_intf,
&map19_intf,
&map21_intf,
&map22_intf,
&map23_intf,
&map24_intf,
&map25_intf,
&map32_intf,
&map33_intf,
&map34_intf,
&map40_intf,
&map64_intf,
&map65_intf,
&map66_intf,
&map70_intf,
&map75_intf,
&map78_intf,
&map79_intf,
&map85_intf,
&map94_intf,
&map99_intf,
&map231_intf,
NULL
};
/*
** $Log: mmclist.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:20:28 matt
** changed directory structure
**
** Revision 1.2 2000/10/10 13:05:30 matt
** Mr. Clean makes a guest appearance
**
** Revision 1.1 2000/07/31 04:27:39 matt
** initial revision
**
*/

View file

@ -0,0 +1,49 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** mmclist.h
**
** list of all mapper interfaces
** $Id: mmclist.h,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#ifndef _MMCLIST_H_
#define _MMCLIST_H_
#include "nes_mmc.h"
extern mapintf_t *mappers[];
#endif /* !_MMCLIST_H_ */
/*
** $Log: mmclist.h,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:20:28 matt
** changed directory structure
**
** Revision 1.1 2000/07/31 04:27:40 matt
** initial revision
**
*/

View file

@ -0,0 +1,762 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** nes.c
**
** NES hardware related routines
** $Id: nes.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "noftypes.h"
#include "nes6502.h"
#include "log.h"
#include "osd.h"
#include "nes.h"
#include "nes_apu.h"
#include "nes_ppu.h"
#include "nes_rom.h"
#include "nes_mmc.h"
#include "vid_drv.h"
#include "nofrendo.h"
#define NES_CLOCK_DIVIDER 12
//#define NES_MASTER_CLOCK 21477272.727272727272
#define NES_MASTER_CLOCK (236250000 / 11)
#define NES_SCANLINE_CYCLES (1364.0 / NES_CLOCK_DIVIDER)
#define NES_FIQ_PERIOD (NES_MASTER_CLOCK / NES_CLOCK_DIVIDER / 60)
#define NES_RAMSIZE 0x800
#define NES_SKIP_LIMIT (NES_REFRESH_RATE / 5) /* 12 or 10, depending on PAL/NTSC */
static nes_t nes;
/* find out if a file is ours */
int nes_isourfile(const char *filename)
{
return rom_checkmagic(filename);
}
/* TODO: just asking for problems -- please remove */
nes_t *nes_getcontextptr(void)
{
return &nes;
}
void nes_getcontext(nes_t *machine)
{
apu_getcontext(nes.apu);
ppu_getcontext(nes.ppu);
nes6502_getcontext(nes.cpu);
mmc_getcontext(nes.mmc);
*machine = nes;
}
void nes_setcontext(nes_t *machine)
{
ASSERT(machine);
apu_setcontext(machine->apu);
ppu_setcontext(machine->ppu);
nes6502_setcontext(machine->cpu);
mmc_setcontext(machine->mmc);
nes = *machine;
}
static uint8 ram_read(uint32 address)
{
return nes.cpu->mem_page[0][address & (NES_RAMSIZE - 1)];
}
static void ram_write(uint32 address, uint8 value)
{
nes.cpu->mem_page[0][address & (NES_RAMSIZE - 1)] = value;
}
static void write_protect(uint32 address, uint8 value)
{
/* don't allow write to go through */
UNUSED(address);
UNUSED(value);
}
static uint8 read_protect(uint32 address)
{
/* don't allow read to go through */
UNUSED(address);
return 0xFF;
}
#define LAST_MEMORY_HANDLER { -1, -1, NULL }
/* read/write handlers for standard NES */
static const nes6502_memread default_readhandler[] =
{
{ 0x0800, 0x1FFF, ram_read },
{ 0x2000, 0x3FFF, ppu_read },
{ 0x4000, 0x4015, apu_read },
{ 0x4016, 0x4017, ppu_readhigh },
LAST_MEMORY_HANDLER
};
static const nes6502_memwrite default_writehandler[] =
{
{ 0x0800, 0x1FFF, ram_write },
{ 0x2000, 0x3FFF, ppu_write },
{ 0x4000, 0x4013, apu_write },
{ 0x4015, 0x4015, apu_write },
{ 0x4014, 0x4017, ppu_writehigh },
LAST_MEMORY_HANDLER
};
/* this big nasty boy sets up the address handlers that the CPU uses */
static void build_address_handlers(nes_t *machine)
{
int count, num_handlers = 0;
mapintf_t *intf;
ASSERT(machine);
intf = machine->mmc->intf;
memset(machine->readhandler, 0, sizeof(machine->readhandler));
memset(machine->writehandler, 0, sizeof(machine->writehandler));
for (count = 0; num_handlers < MAX_MEM_HANDLERS; count++, num_handlers++)
{
if (NULL == default_readhandler[count].read_func)
break;
memcpy(&machine->readhandler[num_handlers], &default_readhandler[count],
sizeof(nes6502_memread));
}
if (intf->sound_ext)
{
if (NULL != intf->sound_ext->mem_read)
{
for (count = 0; num_handlers < MAX_MEM_HANDLERS; count++, num_handlers++)
{
if (NULL == intf->sound_ext->mem_read[count].read_func)
break;
memcpy(&machine->readhandler[num_handlers], &intf->sound_ext->mem_read[count],
sizeof(nes6502_memread));
}
}
}
if (NULL != intf->mem_read)
{
for (count = 0; num_handlers < MAX_MEM_HANDLERS; count++, num_handlers++)
{
if (NULL == intf->mem_read[count].read_func)
break;
memcpy(&machine->readhandler[num_handlers], &intf->mem_read[count],
sizeof(nes6502_memread));
}
}
/* TODO: poof! numbers */
machine->readhandler[num_handlers].min_range = 0x4018;
machine->readhandler[num_handlers].max_range = 0x5FFF;
machine->readhandler[num_handlers].read_func = read_protect;
num_handlers++;
machine->readhandler[num_handlers].min_range = -1;
machine->readhandler[num_handlers].max_range = -1;
machine->readhandler[num_handlers].read_func = NULL;
num_handlers++;
ASSERT(num_handlers <= MAX_MEM_HANDLERS);
num_handlers = 0;
for (count = 0; num_handlers < MAX_MEM_HANDLERS; count++, num_handlers++)
{
if (NULL == default_writehandler[count].write_func)
break;
memcpy(&machine->writehandler[num_handlers], &default_writehandler[count],
sizeof(nes6502_memwrite));
}
if (intf->sound_ext)
{
if (NULL != intf->sound_ext->mem_write)
{
for (count = 0; num_handlers < MAX_MEM_HANDLERS; count++, num_handlers++)
{
if (NULL == intf->sound_ext->mem_write[count].write_func)
break;
memcpy(&machine->writehandler[num_handlers], &intf->sound_ext->mem_write[count],
sizeof(nes6502_memwrite));
}
}
}
if (NULL != intf->mem_write)
{
for (count = 0; num_handlers < MAX_MEM_HANDLERS; count++, num_handlers++)
{
if (NULL == intf->mem_write[count].write_func)
break;
memcpy(&machine->writehandler[num_handlers], &intf->mem_write[count],
sizeof(nes6502_memwrite));
}
}
/* catch-all for bad writes */
/* TODO: poof! numbers */
machine->writehandler[num_handlers].min_range = 0x4018;
machine->writehandler[num_handlers].max_range = 0x5FFF;
machine->writehandler[num_handlers].write_func = write_protect;
num_handlers++;
machine->writehandler[num_handlers].min_range = 0x8000;
machine->writehandler[num_handlers].max_range = 0xFFFF;
machine->writehandler[num_handlers].write_func = write_protect;
num_handlers++;
machine->writehandler[num_handlers].min_range = -1;
machine->writehandler[num_handlers].max_range = -1;
machine->writehandler[num_handlers].write_func = NULL;
num_handlers++;
ASSERT(num_handlers <= MAX_MEM_HANDLERS);
}
/* raise an IRQ */
void nes_irq(void)
{
nes6502_irq();
}
static uint8 nes_clearfiq(void)
{
if (nes.fiq_occurred)
{
nes.fiq_occurred = false;
return 0x40;
}
return 0;
}
void nes_setfiq(uint8 value)
{
nes.fiq_state = value;
nes.fiq_cycles = (int) NES_FIQ_PERIOD;
}
static void nes_checkfiq(int cycles)
{
nes.fiq_cycles -= cycles;
if (nes.fiq_cycles <= 0)
{
nes.fiq_cycles += (int) NES_FIQ_PERIOD;
if (0 == (nes.fiq_state & 0xC0))
{
nes.fiq_occurred = true;
nes6502_irq();
}
}
}
void nes_nmi(void)
{
nes6502_nmi();
}
static void nes_renderframe(bool draw_flag)
{
int elapsed_cycles;
mapintf_t *mapintf = nes.mmc->intf;
int in_vblank = 0;
while (262 != nes.scanline)
{
// ppu_scanline(nes.vidbuf, nes.scanline, draw_flag);
ppu_scanline(vid_getbuffer(), nes.scanline, draw_flag);
if (241 == nes.scanline)
{
/* 7-9 cycle delay between when VINT flag goes up and NMI is taken */
elapsed_cycles = nes6502_execute(7);
nes.scanline_cycles -= elapsed_cycles;
nes_checkfiq(elapsed_cycles);
ppu_checknmi();
if (mapintf->vblank)
mapintf->vblank();
in_vblank = 1;
}
if (mapintf->hblank)
mapintf->hblank(in_vblank);
nes.scanline_cycles += (float) NES_SCANLINE_CYCLES;
elapsed_cycles = nes6502_execute((int) nes.scanline_cycles);
nes.scanline_cycles -= (float) elapsed_cycles;
nes_checkfiq(elapsed_cycles);
ppu_endscanline(nes.scanline);
nes.scanline++;
}
nes.scanline = 0;
}
static void system_video(bool draw)
{
#ifdef NOLOOP
#else
#endif
/* blit to screen */
vid_flush();
/* grab input */
osd_getinput();
}
/* main emulation loop */
static int last_ticks, frames_to_render;
void nes_emulate(void)
{
osd_setsound(nes.apu->process);
last_ticks = nofrendo_ticks;
frames_to_render = 0;
nes.scanline_cycles = 0;
nes.fiq_cycles = (int) NES_FIQ_PERIOD;
#ifdef NOLOOP
#else
while (false == nes.poweroff)
{
if (nofrendo_ticks != last_ticks)
{
int tick_diff = nofrendo_ticks - last_ticks;
frames_to_render += tick_diff;
last_ticks = nofrendo_ticks;
}
if (true == nes.pause)
{
/* TODO: dim the screen, and pause/silence the apu */
system_video(true);
frames_to_render = 0;
}
else if (frames_to_render > 1)
{
frames_to_render--;
nes_renderframe(false);
system_video(false);
}
else if ((1 == frames_to_render && true == nes.autoframeskip)
|| false == nes.autoframeskip)
{
frames_to_render = 0;
nes_renderframe(true);
system_video(true);
}
}
#endif
}
//ADD ON
#ifdef NOLOOP
void nes_step(int skip)
{
if (skip) {
nes_renderframe(false);
system_video(false);
}
else {
nes_renderframe(true);
system_video(true);
}
}
#endif
static void mem_trash(uint8 *buffer, int length)
{
int i;
for (i = 0; i < length; i++)
buffer[i] = (uint8) rand();
}
/* Reset NES hardware */
void nes_reset(int reset_type)
{
if (HARD_RESET == reset_type)
{
memset(nes.cpu->mem_page[0], 0, NES_RAMSIZE);
if (nes.rominfo->vram)
mem_trash(nes.rominfo->vram, 0x2000 * nes.rominfo->vram_banks);
}
apu_reset();
ppu_reset(reset_type);
mmc_reset();
nes6502_reset();
nes.scanline = 241;
}
void nes_destroy(nes_t **machine)
{
if (*machine)
{
rom_free(&(*machine)->rominfo);
mmc_destroy(&(*machine)->mmc);
ppu_destroy(&(*machine)->ppu);
apu_destroy(&(*machine)->apu);
// bmp_destroy(&(*machine)->vidbuf);
if ((*machine)->cpu)
{
if ((*machine)->cpu->mem_page[0])
free((*machine)->cpu->mem_page[0]);
free((*machine)->cpu);
}
free(*machine);
*machine = NULL;
}
}
void nes_poweroff(void)
{
nes.poweroff = true;
}
void nes_togglepause(void)
{
nes.pause ^= true;
}
/* insert a cart into the NES */
int nes_insertcart(const char *filename, nes_t *machine)
{
nes6502_setcontext(machine->cpu);
/* rom file */
machine->rominfo = rom_load(filename);
if (NULL == machine->rominfo)
goto _fail;
/* map cart's SRAM to CPU $6000-$7FFF */
if (machine->rominfo->sram)
{
machine->cpu->mem_page[6] = machine->rominfo->sram;
machine->cpu->mem_page[7] = machine->rominfo->sram + 0x1000;
}
/* mapper */
machine->mmc = mmc_create(machine->rominfo);
if (NULL == machine->mmc)
goto _fail;
/* if there's VRAM, let the PPU know */
if (NULL != machine->rominfo->vram)
machine->ppu->vram_present = true;
apu_setext(machine->apu, machine->mmc->intf->sound_ext);
build_address_handlers(machine);
nes_setcontext(machine);
nes_reset(HARD_RESET);
return 0;
_fail:
nes_destroy(&machine);
return -1;
}
/* Initialize NES CPU, hardware, etc. */
nes_t *nes_create(void)
{
nes_t *machine;
sndinfo_t osd_sound;
int i;
machine = malloc(sizeof(nes_t));
if (NULL == machine)
return NULL;
memset(machine, 0, sizeof(nes_t));
/* bitmap */
/* 8 pixel overdraw */
// machine->vidbuf = bmp_create(NES_SCREEN_WIDTH, NES_SCREEN_HEIGHT, 8);
// if (NULL == machine->vidbuf)
// goto _fail;
machine->autoframeskip = true;
/* cpu */
machine->cpu = malloc(sizeof(nes6502_context));
if (NULL == machine->cpu)
goto _fail;
memset(machine->cpu, 0, sizeof(nes6502_context));
/* allocate 2kB RAM */
machine->cpu->mem_page[0] = malloc(NES_RAMSIZE);
if (NULL == machine->cpu->mem_page[0])
goto _fail;
/* point all pages at NULL for now */
for (i = 1; i < NES6502_NUMBANKS; i++)
machine->cpu->mem_page[i] = NULL;
machine->cpu->read_handler = machine->readhandler;
machine->cpu->write_handler = machine->writehandler;
/* apu */
osd_getsoundinfo(&osd_sound);
machine->apu = apu_create(0, osd_sound.sample_rate, NES_REFRESH_RATE, osd_sound.bps);
if (NULL == machine->apu)
goto _fail;
/* set the IRQ routines */
machine->apu->irq_callback = nes_irq;
machine->apu->irqclear_callback = nes_clearfiq;
/* ppu */
machine->ppu = ppu_create();
if (NULL == machine->ppu)
goto _fail;
machine->poweroff = false;
machine->pause = false;
return machine;
_fail:
nes_destroy(&machine);
return NULL;
}
/*
** $Log: nes.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.18 2000/11/29 12:58:23 matt
** timing/fiq fixes
**
** Revision 1.17 2000/11/27 19:36:15 matt
** more timing fixes
**
** Revision 1.16 2000/11/26 16:13:13 matt
** slight fix (?) to nes_fiq
**
** Revision 1.15 2000/11/26 15:51:13 matt
** frame IRQ emulation
**
** Revision 1.14 2000/11/25 20:30:39 matt
** scanline emulation simplifications/timing fixes
**
** Revision 1.13 2000/11/25 01:53:42 matt
** bool stinks sometimes
**
** Revision 1.12 2000/11/21 13:28:40 matt
** take care to zero allocated mem
**
** Revision 1.11 2000/11/20 13:23:32 matt
** nofrendo.c now handles timer
**
** Revision 1.10 2000/11/09 14:07:27 matt
** state load fixed, state save mostly fixed
**
** Revision 1.9 2000/11/05 22:19:37 matt
** pause buglet fixed
**
** Revision 1.8 2000/11/05 06:27:09 matt
** thinlib spawns changes
**
** Revision 1.7 2000/10/29 14:36:45 matt
** nes_clearframeirq is static
**
** Revision 1.6 2000/10/28 15:20:41 matt
** irq callbacks in nes_apu
**
** Revision 1.5 2000/10/27 12:55:58 matt
** nes6502 now uses 4kB banks across the boards
**
** Revision 1.4 2000/10/25 13:44:02 matt
** no more silly define names
**
** Revision 1.3 2000/10/25 01:23:08 matt
** basic system autodetection
**
** Revision 1.2 2000/10/25 00:23:16 matt
** makefiles updated for new directory structure
**
** Revision 1.1 2000/10/24 12:20:28 matt
** changed directory structure
**
** Revision 1.50 2000/10/23 17:51:09 matt
** adding fds support
**
** Revision 1.49 2000/10/23 15:53:08 matt
** better system handling
**
** Revision 1.48 2000/10/22 20:02:29 matt
** autoframeskip bugfix
**
** Revision 1.47 2000/10/22 19:16:15 matt
** more sane timer ISR / autoframeskip
**
** Revision 1.46 2000/10/21 19:26:59 matt
** many more cleanups
**
** Revision 1.45 2000/10/17 12:00:56 matt
** selectable apu base frequency
**
** Revision 1.44 2000/10/10 13:58:14 matt
** stroustrup squeezing his way in the door
**
** Revision 1.43 2000/10/10 13:05:30 matt
** Mr. Clean makes a guest appearance
**
** Revision 1.42 2000/10/08 17:53:37 matt
** minor accuracy changes
**
** Revision 1.41 2000/09/18 02:09:12 matt
** -pedantic is your friend
**
** Revision 1.40 2000/09/15 13:38:39 matt
** changes for optimized apu core
**
** Revision 1.39 2000/09/15 04:58:07 matt
** simplifying and optimizing APU core
**
** Revision 1.38 2000/09/08 11:57:29 matt
** no more nes_fiq
**
** Revision 1.37 2000/08/31 02:39:01 matt
** moved dos stuff in here (temp)
**
** Revision 1.36 2000/08/16 02:51:55 matt
** random cleanups
**
** Revision 1.35 2000/08/11 02:43:50 matt
** moved frame irq stuff out of APU into here
**
** Revision 1.34 2000/08/11 01:42:43 matt
** change to OSD sound info interface
**
** Revision 1.33 2000/07/31 04:27:59 matt
** one million cleanups
**
** Revision 1.32 2000/07/30 04:32:32 matt
** emulation of the NES frame IRQ
**
** Revision 1.31 2000/07/27 04:07:14 matt
** cleaned up the neighborhood lawns
**
** Revision 1.30 2000/07/27 03:59:52 neil
** pausing tweaks, during fullscreen toggles
**
** Revision 1.29 2000/07/27 03:19:22 matt
** just a little cleaner, that's all
**
** Revision 1.28 2000/07/27 02:55:23 matt
** nes_emulate went through detox
**
** Revision 1.27 2000/07/27 02:49:18 matt
** cleaner flow in nes_emulate
**
** Revision 1.26 2000/07/27 01:17:09 matt
** nes_insertrom -> nes_insertcart
**
** Revision 1.25 2000/07/26 21:36:14 neil
** Big honkin' change -- see the mailing list
**
** Revision 1.24 2000/07/25 02:25:53 matt
** safer xxx_destroy calls
**
** Revision 1.23 2000/07/24 04:32:40 matt
** autoframeskip bugfix
**
** Revision 1.22 2000/07/23 15:13:48 matt
** apu API change, autoframeskip part of nes_t struct
**
** Revision 1.21 2000/07/21 02:44:41 matt
** merged osd_getinput and osd_gethostinput
**
** Revision 1.20 2000/07/17 05:12:55 matt
** nes_ppu.c is no longer a scary place to be-- cleaner & faster
**
** Revision 1.19 2000/07/17 01:52:28 matt
** made sure last line of all source files is a newline
**
** Revision 1.18 2000/07/15 23:51:23 matt
** hack for certain filthy NES titles
**
** Revision 1.17 2000/07/11 04:31:54 matt
** less magic number nastiness for screen dimensions
**
** Revision 1.16 2000/07/11 02:38:25 matt
** encapsulated memory address handlers into nes/nsf
**
** Revision 1.15 2000/07/10 13:50:49 matt
** added function nes_irq()
**
** Revision 1.14 2000/07/10 05:27:55 matt
** cleaned up mapper-specific callbacks
**
** Revision 1.13 2000/07/09 03:43:26 matt
** minor changes to gui handling
**
** Revision 1.12 2000/07/06 16:42:23 matt
** updated for new video driver
**
** Revision 1.11 2000/07/05 19:57:36 neil
** __GNUC -> __DJGPP in nes.c
**
** Revision 1.10 2000/07/05 12:23:03 matt
** removed unnecessary references
**
** Revision 1.9 2000/07/04 23:12:34 matt
** memory protection handlers
**
** Revision 1.8 2000/07/04 04:58:29 matt
** dynamic memory range handlers
**
** Revision 1.7 2000/06/26 04:58:51 matt
** minor bugfix
**
** Revision 1.6 2000/06/20 20:42:12 matt
** fixed some NULL pointer problems
**
** Revision 1.5 2000/06/09 15:12:26 matt
** initial revision
**
*/

View file

@ -0,0 +1,221 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** nes.h
**
** NES hardware related definitions / prototypes
** $Id: nes.h,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#ifndef _NES_H_
#define _NES_H_
#include "noftypes.h"
#include "nes_apu.h"
#include "nes_mmc.h"
#include "nes_ppu.h"
#include "nes_rom.h"
#include "nes6502.h"
#include "bitmap.h"
/* Visible (NTSC) screen height */
#ifndef NES_VISIBLE_HEIGHT
#define NES_VISIBLE_HEIGHT 224
#endif /* !NES_VISIBLE_HEIGHT */
#define NES_SCREEN_WIDTH 256
#define NES_SCREEN_HEIGHT 240
/* NTSC = 60Hz, PAL = 50Hz */
#ifdef PAL
#define NES_REFRESH_RATE 50
#else /* !PAL */
#define NES_REFRESH_RATE 60
#endif /* !PAL */
#define MAX_MEM_HANDLERS 32
enum
{
SOFT_RESET,
HARD_RESET
};
typedef struct nes_s
{
/* hardware things */
nes6502_context *cpu;
nes6502_memread readhandler[MAX_MEM_HANDLERS];
nes6502_memwrite writehandler[MAX_MEM_HANDLERS];
ppu_t *ppu;
apu_t *apu;
mmc_t *mmc;
rominfo_t *rominfo;
/* video buffer */
/* For the ESP32, it costs too much memory to render to a separate buffer and blit that to the main buffer.
Instead, the code has been modified to directly grab the primary buffer from the video subsystem and render
there, saving us about 64K of memory. */
// bitmap_t *vidbuf;
bool fiq_occurred;
uint8 fiq_state;
int fiq_cycles;
int scanline;
/* Timing stuff */
float scanline_cycles;
bool autoframeskip;
/* control */
bool poweroff;
bool pause;
} nes_t;
extern int nes_isourfile(const char *filename);
/* temp hack */
extern nes_t *nes_getcontextptr(void);
/* Function prototypes */
extern void nes_getcontext(nes_t *machine);
extern void nes_setcontext(nes_t *machine);
extern nes_t *nes_create(void);
extern void nes_destroy(nes_t **machine);
extern int nes_insertcart(const char *filename, nes_t *machine);
extern void nes_setfiq(uint8 state);
extern void nes_nmi(void);
extern void nes_irq(void);
extern void nes_emulate(void);
extern void nes_reset(int reset_type);
extern void nes_poweroff(void);
extern void nes_togglepause(void);
#endif /* _NES_H_ */
/*
** $Log: nes.h,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.8 2000/11/26 15:51:13 matt
** frame IRQ emulation
**
** Revision 1.7 2000/11/25 20:30:39 matt
** scanline emulation simplifications/timing fixes
**
** Revision 1.6 2000/11/25 01:52:17 matt
** bool stinks sometimes
**
** Revision 1.5 2000/11/09 14:07:28 matt
** state load fixed, state save mostly fixed
**
** Revision 1.4 2000/10/29 14:36:45 matt
** nes_clearframeirq is static
**
** Revision 1.3 2000/10/25 01:23:08 matt
** basic system autodetection
**
** Revision 1.2 2000/10/25 00:23:16 matt
** makefiles updated for new directory structure
**
** Revision 1.1 2000/10/24 12:20:28 matt
** changed directory structure
**
** Revision 1.26 2000/10/23 17:51:10 matt
** adding fds support
**
** Revision 1.25 2000/10/23 15:53:08 matt
** better system handling
**
** Revision 1.24 2000/10/22 19:16:15 matt
** more sane timer ISR / autoframeskip
**
** Revision 1.23 2000/10/21 19:26:59 matt
** many more cleanups
**
** Revision 1.22 2000/10/10 13:58:15 matt
** stroustrup squeezing his way in the door
**
** Revision 1.21 2000/10/08 17:53:36 matt
** minor accuracy changes
**
** Revision 1.20 2000/09/15 04:58:07 matt
** simplifying and optimizing APU core
**
** Revision 1.19 2000/09/08 11:57:29 matt
** no more nes_fiq
**
** Revision 1.18 2000/08/11 02:43:50 matt
** moved frame irq stuff out of APU into here
**
** Revision 1.17 2000/07/31 04:27:59 matt
** one million cleanups
**
** Revision 1.16 2000/07/30 04:32:32 matt
** emulation of the NES frame IRQ
**
** Revision 1.15 2000/07/27 01:17:09 matt
** nes_insertrom -> nes_insertcart
**
** Revision 1.14 2000/07/26 21:36:16 neil
** Big honkin' change -- see the mailing list
**
** Revision 1.13 2000/07/25 02:25:53 matt
** safer xxx_destroy calls
**
** Revision 1.12 2000/07/23 15:13:13 matt
** autoframeskip is now a member variable of nes_t
**
** Revision 1.11 2000/07/17 05:12:55 matt
** nes_ppu.c is no longer a scary place to be-- cleaner & faster
**
** Revision 1.10 2000/07/17 01:52:28 matt
** made sure last line of all source files is a newline
**
** Revision 1.9 2000/07/16 09:48:58 neil
** Make visible height compile-time configurable in the Makefile
**
** Revision 1.8 2000/07/11 04:31:55 matt
** less magic number nastiness for screen dimensions
**
** Revision 1.7 2000/07/11 02:40:36 matt
** forgot to remove framecounter
**
** Revision 1.6 2000/07/11 02:38:25 matt
** encapsulated memory address handlers into nes/nsf
**
** Revision 1.5 2000/07/10 13:50:50 matt
** added function nes_irq()
**
** Revision 1.4 2000/06/09 15:12:26 matt
** initial revision
**
*/

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,175 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** nes6502.h
**
** NES custom 6502 CPU definitions / prototypes
** $Id: nes6502.h,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
/* NOTE: 16-bit addresses avoided like the plague: use 32-bit values
** wherever humanly possible
*/
#ifndef _NES6502_H_
#define _NES6502_H_
#include "noftypes.h"
/* Define this to enable decimal mode in ADC / SBC (not needed in NES) */
/*#define NES6502_DECIMAL*/
#define NES6502_NUMBANKS 16
#define NES6502_BANKSHIFT 12
#define NES6502_BANKSIZE (0x10000 / NES6502_NUMBANKS)
#define NES6502_BANKMASK (NES6502_BANKSIZE - 1)
/* P (flag) register bitmasks */
#define N_FLAG 0x80
#define V_FLAG 0x40
#define R_FLAG 0x20 /* Reserved, always 1 */
#define B_FLAG 0x10
#define D_FLAG 0x08
#define I_FLAG 0x04
#define Z_FLAG 0x02
#define C_FLAG 0x01
/* Vector addresses */
#define NMI_VECTOR 0xFFFA
#define RESET_VECTOR 0xFFFC
#define IRQ_VECTOR 0xFFFE
/* cycle counts for interrupts */
#define INT_CYCLES 7
#define RESET_CYCLES 6
#define NMI_MASK 0x01
#define IRQ_MASK 0x02
/* Stack is located on 6502 page 1 */
#define STACK_OFFSET 0x0100
typedef struct
{
uint32 min_range, max_range;
uint8 (*read_func)(uint32 address);
} nes6502_memread;
typedef struct
{
uint32 min_range, max_range;
void (*write_func)(uint32 address, uint8 value);
} nes6502_memwrite;
typedef struct
{
uint8 *mem_page[NES6502_NUMBANKS]; /* memory page pointers */
nes6502_memread *read_handler;
nes6502_memwrite *write_handler;
uint32 pc_reg;
uint8 a_reg, p_reg;
uint8 x_reg, y_reg;
uint8 s_reg;
uint8 jammed; /* is processor jammed? */
uint8 int_pending, int_latency;
int32 total_cycles, burn_cycles;
} nes6502_context;
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* Functions which govern the 6502's execution */
extern void nes6502_reset(void);
extern int nes6502_execute(int total_cycles);
extern void nes6502_nmi(void);
extern void nes6502_irq(void);
extern uint8 nes6502_getbyte(uint32 address);
extern uint32 nes6502_getcycles(bool reset_flag);
extern void nes6502_burn(int cycles);
extern void nes6502_release(void);
/* Context get/set */
extern void nes6502_setcontext(nes6502_context *cpu);
extern void nes6502_getcontext(nes6502_context *cpu);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _NES6502_H_ */
/*
** $Log: nes6502.h,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:39 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.17 2000/11/13 00:57:39 matt
** trying to add 1-instruction interrupt latency... and failing.
**
** Revision 1.16 2000/10/27 12:53:36 matt
** banks are always 4kB now
**
** Revision 1.15 2000/10/10 13:58:14 matt
** stroustrup squeezing his way in the door
**
** Revision 1.14 2000/09/15 03:42:32 matt
** nes6502_release to release current timeslice
**
** Revision 1.13 2000/09/11 03:55:32 matt
** cosmetics
**
** Revision 1.12 2000/09/08 11:54:48 matt
** optimize
**
** Revision 1.11 2000/09/07 21:58:18 matt
** api change for nes6502_burn, optimized core
**
** Revision 1.10 2000/09/07 01:34:55 matt
** nes6502_init deprecated, moved flag regs to separate vars
**
** Revision 1.9 2000/08/28 12:53:44 matt
** fixes for disassembler
**
** Revision 1.8 2000/08/28 01:46:15 matt
** moved some of them defines around, cleaned up jamming code
**
** Revision 1.7 2000/08/16 04:56:37 matt
** accurate CPU jamming, added dead page emulation
**
** Revision 1.6 2000/07/30 04:32:00 matt
** now emulates the NES frame IRQ
**
** Revision 1.5 2000/07/17 01:52:28 matt
** made sure last line of all source files is a newline
**
** Revision 1.4 2000/06/09 15:12:25 matt
** initial revision
**
*/

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,349 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** nes_apu.h
**
** NES APU emulation header file
** $Id: nes_apu.h,v 1.1 2001/04/27 12:54:40 neil Exp $
*/
#ifndef _NES_APU_H_
#define _NES_APU_H_
/* define this for realtime generated noise */
#define REALTIME_NOISE
#define APU_WRA0 0x4000
#define APU_WRA1 0x4001
#define APU_WRA2 0x4002
#define APU_WRA3 0x4003
#define APU_WRB0 0x4004
#define APU_WRB1 0x4005
#define APU_WRB2 0x4006
#define APU_WRB3 0x4007
#define APU_WRC0 0x4008
#define APU_WRC2 0x400A
#define APU_WRC3 0x400B
#define APU_WRD0 0x400C
#define APU_WRD2 0x400E
#define APU_WRD3 0x400F
#define APU_WRE0 0x4010
#define APU_WRE1 0x4011
#define APU_WRE2 0x4012
#define APU_WRE3 0x4013
#define APU_SMASK 0x4015
/* length of generated noise */
#define APU_NOISE_32K 0x7FFF
#define APU_NOISE_93 93
#define APU_BASEFREQ 1789772.7272727272727272
/* channel structures */
/* As much data as possible is precalculated,
** to keep the sample processing as lean as possible
*/
typedef struct rectangle_s
{
uint8 regs[4];
bool enabled;
float accum;
int32 freq;
int32 output_vol;
bool fixed_envelope;
bool holdnote;
uint8 volume;
int32 sweep_phase;
int32 sweep_delay;
bool sweep_on;
uint8 sweep_shifts;
uint8 sweep_length;
bool sweep_inc;
/* this may not be necessary in the future */
int32 freq_limit;
int32 env_phase;
int32 env_delay;
uint8 env_vol;
int vbl_length;
uint8 adder;
int duty_flip;
} rectangle_t;
typedef struct triangle_s
{
uint8 regs[3];
bool enabled;
float accum;
int32 freq;
int32 output_vol;
uint8 adder;
bool holdnote;
bool counter_started;
/* quasi-hack */
int write_latency;
int vbl_length;
int linear_length;
} triangle_t;
typedef struct noise_s
{
uint8 regs[3];
bool enabled;
float accum;
int32 freq;
int32 output_vol;
int32 env_phase;
int32 env_delay;
uint8 env_vol;
bool fixed_envelope;
bool holdnote;
uint8 volume;
int vbl_length;
#ifdef REALTIME_NOISE
uint8 xor_tap;
#else
bool short_sample;
int cur_pos;
#endif /* REALTIME_NOISE */
} noise_t;
typedef struct dmc_s
{
uint8 regs[4];
/* bodge for timestamp queue */
bool enabled;
float accum;
int32 freq;
int32 output_vol;
uint32 address;
uint32 cached_addr;
int dma_length;
int cached_dmalength;
uint8 cur_byte;
bool looping;
bool irq_gen;
bool irq_occurred;
} dmc_t;
enum
{
APU_FILTER_NONE,
APU_FILTER_LOWPASS,
APU_FILTER_WEIGHTED
};
typedef struct
{
uint32 min_range, max_range;
uint8 (*read_func)(uint32 address);
} apu_memread;
typedef struct
{
uint32 min_range, max_range;
void (*write_func)(uint32 address, uint8 value);
} apu_memwrite;
/* external sound chip stuff */
typedef struct apuext_s
{
int (*init)(void);
void (*shutdown)(void);
void (*reset)(void);
int32 (*process)(void);
apu_memread *mem_read;
apu_memwrite *mem_write;
} apuext_t;
typedef struct apu_s
{
rectangle_t rectangle[2];
triangle_t triangle;
noise_t noise;
dmc_t dmc;
uint8 enable_reg;
void *buffer; /* pointer to output buffer */
int num_samples;
uint8 mix_enable;
int filter_type;
double base_freq;
float cycle_rate;
int sample_rate;
int sample_bits;
int refresh_rate;
void (*process)(void *buffer, int num_samples);
void (*irq_callback)(void);
uint8 (*irqclear_callback)(void);
/* external sound chip */
apuext_t *ext;
} apu_t;
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/* Function prototypes */
extern void apu_setcontext(apu_t *src_apu);
extern void apu_getcontext(apu_t *dest_apu);
extern void apu_setparams(double base_freq, int sample_rate, int refresh_rate, int sample_bits);
extern apu_t *apu_create(double base_freq, int sample_rate, int refresh_rate, int sample_bits);
extern void apu_destroy(apu_t **apu);
extern void apu_process(void *buffer, int num_samples);
extern void apu_reset(void);
extern void apu_setext(apu_t *apu, apuext_t *ext);
extern void apu_setfilter(int filter_type);
extern void apu_setchan(int chan, bool enabled);
extern uint8 apu_read(uint32 address);
extern void apu_write(uint32 address, uint8 value);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _NES_APU_H_ */
/*
** $Log: nes_apu.h,v $
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.3 2000/12/08 02:36:14 matt
** bye bye apu queue (for now)
**
** Revision 1.2 2000/10/28 15:20:59 matt
** irq callbacks in nes_apu
**
** Revision 1.1 2000/10/24 12:19:59 matt
** changed directory structure
**
** Revision 1.28 2000/10/17 11:56:42 matt
** selectable apu base frequency
**
** Revision 1.27 2000/10/10 13:58:18 matt
** stroustrup squeezing his way in the door
**
** Revision 1.26 2000/09/28 23:20:58 matt
** bye bye, fixed point
**
** Revision 1.25 2000/09/27 12:26:03 matt
** changed sound accumulators back to floats
**
** Revision 1.24 2000/09/18 02:12:55 matt
** more optimizations
**
** Revision 1.23 2000/09/15 13:38:40 matt
** changes for optimized apu core
**
** Revision 1.22 2000/09/15 04:58:07 matt
** simplifying and optimizing APU core
**
** Revision 1.21 2000/08/11 02:27:21 matt
** general cleanups, plus apu_setparams routine
**
** Revision 1.20 2000/07/30 04:32:59 matt
** no more apu_getcyclerate hack
**
** Revision 1.19 2000/07/27 02:49:50 matt
** eccentricity in sweeping hardware now emulated correctly
**
** Revision 1.18 2000/07/25 02:25:15 matt
** safer apu_destroy
**
** Revision 1.17 2000/07/23 15:10:54 matt
** hacks for win32
**
** Revision 1.16 2000/07/23 00:48:15 neil
** Win32 SDL
**
** Revision 1.15 2000/07/17 01:52:31 matt
** made sure last line of all source files is a newline
**
** Revision 1.14 2000/07/11 02:39:26 matt
** added setcontext() routine
**
** Revision 1.13 2000/07/10 05:29:34 matt
** moved joypad/oam dma from apu to ppu
**
** Revision 1.12 2000/07/04 04:54:48 matt
** minor changes that helped with MAME
**
** Revision 1.11 2000/07/03 02:18:53 matt
** much better external module exporting
**
** Revision 1.10 2000/06/26 05:00:37 matt
** cleanups
**
** Revision 1.9 2000/06/23 03:29:28 matt
** cleaned up external sound inteface
**
** Revision 1.8 2000/06/20 04:06:16 matt
** migrated external sound definition to apu module
**
** Revision 1.7 2000/06/20 00:07:35 matt
** added convenience members to apu_t struct
**
** Revision 1.6 2000/06/09 16:49:02 matt
** removed all floating point from sound generation
**
** Revision 1.5 2000/06/09 15:12:28 matt
** initial revision
**
*/

View file

@ -0,0 +1,302 @@
#include "emuapi.h"
#include <string.h>
#include <stdint.h>
#include <stdio.h>
//Nes stuff wants to define this as well...
//#undef false
//#undef true
//#undef bool
extern "C" {
#include "noftypes.h"
#include "nes.h"
#include "nofrendo.h"
#include "osd.h"
#include "nesinput.h"
#include "event.h"
#include "nofconfig.h"
}
#define DEFAULT_WIDTH 256
#define DEFAULT_HEIGHT NES_VISIBLE_HEIGHT
char configfilename[]="na";
char romname[64];
char* romdata=NULL;
static int ik; // joypad key
static int pik=0;
static int ihk; // I2C keyboard key
static int iusbhk;// USB keyboard key
void emu_KeyboardOnDown(int keymodifer, int key) {
}
void emu_KeyboardOnUp(int keymodifer, int key) {
}
void nes_Input(int key) {
ik = emu_GetPad();
ihk = emu_ReadI2CKeyboard();
}
void nes_Init(void)
{
#if HAS_SND
emu_sndInit();
#endif
nofrendo_main(0, NULL);
}
void nes_Step(void)
{
nes_step(emu_FrameSkip());
//delay(20);
emu_DrawVsync();
}
void nes_Start(char * filename)
{
strcpy(romname,filename);
int romsize = emu_FileSize(filename);
romdata = (char*)emu_Malloc(romsize);
if (romdata)
{
int f=emu_FileOpen(filename,"r+b");
if (f) {
if (emu_FileRead((char*)romdata, romsize, f) != romsize ) {
romdata = NULL;
}
emu_FileClose(f);
} else {
romdata = NULL;
}
}
}
/* This is os-specific part of main() */
int osd_main(int argc, char *argv[])
{
config.filename = configfilename;
return main_loop(romname, system_autodetect);
}
/* File system interface */
void osd_fullname(char *fullname, const char *shortname)
{
strncpy(fullname, shortname, 64);
}
/* This gives filenames for storage of saves */
char *osd_newextension(char *string, char *ext)
{
return string;
}
/* This gives filenames for storage of PCX snapshots */
int osd_makesnapname(char *filename, int len)
{
return -1;
}
#if HAS_SND
static void (*audio_callback)(void *buffer, int length) = NULL;
void SND_Process( void * stream, int len )
{
if (audio_callback != NULL) {
audio_callback(stream,len);
}
}
#endif
void osd_setsound(void (*playfunc)(void *buffer, int length))
{
//Indicates we should call playfunc() to get more data.
#if HAS_SND
audio_callback = playfunc;
#endif
}
static void osd_stopsound(void)
{
#if HAS_SND
audio_callback = NULL;
#endif
}
static int osd_init_sound(void)
{
#if HAS_SND
audio_callback = NULL;
#endif
return 0;
}
void osd_getsoundinfo(sndinfo_t *info)
{
info->sample_rate = (22050*20000)/16666; // fix for 60Hz
info->bps = 16;
}
void osd_getinput(void)
{
const int ev[16]={
event_joypad1_select,0,0,event_joypad1_start,event_joypad1_up,event_joypad1_right,event_joypad1_down,event_joypad1_left,
0,0,0,0,event_soft_reset,event_joypad1_a,event_joypad1_b,event_hard_reset
};
int j = ik;
int hk = ihk;
int b=0xffff;
if ( (j & MASK_KEY_USER2) || (hk == 'a') ) // A
b &= ~0x2000;
if ( (j & MASK_KEY_USER3) || (hk == 'q') ) // SELECT
b &= ~0x0001;
if ( (j & MASK_KEY_USER1) || (hk == 'w') ) // START
b &= ~0x0008;
if (j & MASK_JOY2_UP)
b &= ~0x0010;
if (j & MASK_JOY2_LEFT)
b &= ~0x0020;
if (j & MASK_JOY2_DOWN)
b &= ~0x0040;
if (j & MASK_JOY2_RIGHT)
b &= ~0x0080;
if (j & MASK_JOY2_BTN) // B
b &= ~0x4000;
static int oldb=0xffff;
int chg=b^oldb;
int x;
oldb=b;
event_t evh;
for (x=0; x<16; x++) {
if (chg&1) {
evh=event_get(ev[x]);
if (evh) evh((b&1)?INP_STATE_BREAK:INP_STATE_MAKE);
}
chg>>=1;
b>>=1;
}
}
void osd_getmouse(int *x, int *y, int *button)
{
}
/* this is at the bottom, to eliminate warnings */
void osd_shutdown()
{
}
int osd_init()
{
return 0;
}
/*
** Video
*/
static int init(int width, int height)
{
return 0;
}
static void shutdown(void)
{
}
static int set_mode(int width, int height)
{
return 0;
}
static bitmap_t *myBitmap=NULL;
static void set_palette(rgb_t *pal)
{
int i;
for (i = 0; i < PALETTE_SIZE; i++)
{
emu_SetPaletteEntry(pal[i].r, pal[i].g, pal[i].b,i);
}
}
/* clear all frames to a particular color */
static void clear(uint8 color)
{
}
/* acquire the directbuffer for writing */
static char fb[1]; //dummy
static bitmap_t *lock_write(void)
{
if (myBitmap == NULL)
myBitmap = bmp_createhw((uint8*)fb, DEFAULT_WIDTH, DEFAULT_HEIGHT, DEFAULT_WIDTH*2);
return myBitmap;
}
/* release the resource */
static void free_write(int num_dirties, rect_t *dirty_rects)
{
//bmp_destroy(&myBitmap);
}
static void custom_blit(bitmap_t *bmp, int num_dirties, rect_t *dirty_rects) {
}
static viddriver_t sdlDriver =
{
"Simple DirectMedia Layer", /* name */
init, /* init */
shutdown, /* shutdown */
set_mode, /* set_mode */
set_palette, /* set_palette */
clear, /* clear */
lock_write, /* lock_write */
free_write, /* free_write */
custom_blit, /* custom_blit */
false /* invalidate flag */
};
void osd_getvideoinfo(vidinfo_t *info)
{
info->default_width = DEFAULT_WIDTH;
info->default_height = DEFAULT_HEIGHT;
info->driver = &sdlDriver;
}
void osd_togglefullscreen(int code)
{
}
//Seemingly, this will be called only once. Should call func with a freq of frequency,
int osd_installtimer(int frequency, void *func, int funcsize, void *counter, int countersize)
{
return 0;
}
extern "C" char *osd_getromdata();
char *osd_getromdata() {
return (char*)romdata;
}

View file

@ -0,0 +1,4 @@
extern void nes_Init(void);
extern void nes_Step(void);
extern void nes_Start(char * filename);
extern void nes_Input(int key);

View file

@ -0,0 +1,353 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** nes_mmc.c
**
** NES Memory Management Controller (mapper) emulation
** $Id: nes_mmc.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include <string.h>
#include "noftypes.h"
#include "nes6502.h"
#include "nes_mmc.h"
#include "nes_ppu.h"
#include "libsnss.h"
#include "log.h"
#include "mmclist.h"
#include "nes_rom.h"
#define MMC_8KROM (mmc.cart->rom_banks * 2)
#define MMC_16KROM (mmc.cart->rom_banks)
#define MMC_32KROM (mmc.cart->rom_banks / 2)
#define MMC_8KVROM (mmc.cart->vrom_banks)
#define MMC_4KVROM (mmc.cart->vrom_banks * 2)
#define MMC_2KVROM (mmc.cart->vrom_banks * 4)
#define MMC_1KVROM (mmc.cart->vrom_banks * 8)
#define MMC_LAST8KROM (MMC_8KROM - 1)
#define MMC_LAST16KROM (MMC_16KROM - 1)
#define MMC_LAST32KROM (MMC_32KROM - 1)
#define MMC_LAST8KVROM (MMC_8KVROM - 1)
#define MMC_LAST4KVROM (MMC_4KVROM - 1)
#define MMC_LAST2KVROM (MMC_2KVROM - 1)
#define MMC_LAST1KVROM (MMC_1KVROM - 1)
static mmc_t mmc;
rominfo_t *mmc_getinfo(void)
{
return mmc.cart;
}
void mmc_setcontext(mmc_t *src_mmc)
{
ASSERT(src_mmc);
mmc = *src_mmc;
}
void mmc_getcontext(mmc_t *dest_mmc)
{
*dest_mmc = mmc;
}
/* VROM bankswitching */
void mmc_bankvrom(int size, uint32 address, int bank)
{
if (0 == mmc.cart->vrom_banks)
return;
switch (size)
{
case 1:
if (bank == MMC_LASTBANK)
bank = MMC_LAST1KVROM;
ppu_setpage(1, address >> 10, &mmc.cart->vrom[(bank % MMC_1KVROM) << 10] - address);
break;
case 2:
if (bank == MMC_LASTBANK)
bank = MMC_LAST2KVROM;
ppu_setpage(2, address >> 10, &mmc.cart->vrom[(bank % MMC_2KVROM) << 11] - address);
break;
case 4:
if (bank == MMC_LASTBANK)
bank = MMC_LAST4KVROM;
ppu_setpage(4, address >> 10, &mmc.cart->vrom[(bank % MMC_4KVROM) << 12] - address);
break;
case 8:
if (bank == MMC_LASTBANK)
bank = MMC_LAST8KVROM;
ppu_setpage(8, 0, &mmc.cart->vrom[(bank % MMC_8KVROM) << 13]);
break;
default:
log_printf("invalid VROM bank size %d\n", size);
}
}
/* ROM bankswitching */
void mmc_bankrom(int size, uint32 address, int bank)
{
nes6502_context mmc_cpu;
nes6502_getcontext(&mmc_cpu);
switch (size)
{
case 8:
if (bank == MMC_LASTBANK)
bank = MMC_LAST8KROM;
{
int page = address >> NES6502_BANKSHIFT;
mmc_cpu.mem_page[page] = &mmc.cart->rom[(bank % MMC_8KROM) << 13];
mmc_cpu.mem_page[page + 1] = mmc_cpu.mem_page[page] + 0x1000;
}
break;
case 16:
if (bank == MMC_LASTBANK)
bank = MMC_LAST16KROM;
{
int page = address >> NES6502_BANKSHIFT;
mmc_cpu.mem_page[page] = &mmc.cart->rom[(bank % MMC_16KROM) << 14];
mmc_cpu.mem_page[page + 1] = mmc_cpu.mem_page[page] + 0x1000;
mmc_cpu.mem_page[page + 2] = mmc_cpu.mem_page[page] + 0x2000;
mmc_cpu.mem_page[page + 3] = mmc_cpu.mem_page[page] + 0x3000;
}
break;
case 32:
if (bank == MMC_LASTBANK)
bank = MMC_LAST32KROM;
mmc_cpu.mem_page[8] = &mmc.cart->rom[(bank % MMC_32KROM) << 15];
mmc_cpu.mem_page[9] = mmc_cpu.mem_page[8] + 0x1000;
mmc_cpu.mem_page[10] = mmc_cpu.mem_page[8] + 0x2000;
mmc_cpu.mem_page[11] = mmc_cpu.mem_page[8] + 0x3000;
mmc_cpu.mem_page[12] = mmc_cpu.mem_page[8] + 0x4000;
mmc_cpu.mem_page[13] = mmc_cpu.mem_page[8] + 0x5000;
mmc_cpu.mem_page[14] = mmc_cpu.mem_page[8] + 0x6000;
mmc_cpu.mem_page[15] = mmc_cpu.mem_page[8] + 0x7000;
break;
default:
log_printf("invalid ROM bank size %d\n", size);
break;
}
nes6502_setcontext(&mmc_cpu);
}
/* Check to see if this mapper is supported */
bool mmc_peek(int map_num)
{
mapintf_t **map_ptr = mappers;
while (NULL != *map_ptr)
{
if ((*map_ptr)->number == map_num)
return true;
map_ptr++;
}
return false;
}
static void mmc_setpages(void)
{
log_printf("setting up mapper %d\n", mmc.intf->number);
/* Switch ROM into CPU space, set VROM/VRAM (done for ALL ROMs) */
mmc_bankrom(16, 0x8000, 0);
mmc_bankrom(16, 0xC000, MMC_LASTBANK);
mmc_bankvrom(8, 0x0000, 0);
if (mmc.cart->flags & ROM_FLAG_FOURSCREEN)
{
ppu_mirror(0, 1, 2, 3);
}
else
{
if (MIRROR_VERT == mmc.cart->mirror)
ppu_mirror(0, 1, 0, 1);
else
ppu_mirror(0, 0, 1, 1);
}
/* if we have no VROM, switch in VRAM */
/* TODO: fix this hack implementation */
if (0 == mmc.cart->vrom_banks)
{
ASSERT(mmc.cart->vram);
ppu_setpage(8, 0, mmc.cart->vram);
ppu_mirrorhipages();
}
}
/* Mapper initialization routine */
void mmc_reset(void)
{
mmc_setpages();
ppu_setlatchfunc(NULL);
ppu_setvromswitch(NULL);
if (mmc.intf->init)
mmc.intf->init();
log_printf("reset memory mapper\n");
}
void mmc_destroy(mmc_t **nes_mmc)
{
if (*nes_mmc)
free(*nes_mmc);
}
mmc_t *mmc_create(rominfo_t *rominfo)
{
mmc_t *temp;
mapintf_t **map_ptr;
for (map_ptr = mappers; (*map_ptr)->number != rominfo->mapper_number; map_ptr++)
{
if (NULL == *map_ptr)
return NULL; /* Should *never* happen */
}
temp = malloc(sizeof(mmc_t));
if (NULL == temp)
return NULL;
memset(temp, 0, sizeof(mmc_t));
temp->intf = *map_ptr;
temp->cart = rominfo;
mmc_setcontext(temp);
log_printf("created memory mapper: %s\n", (*map_ptr)->name);
return temp;
}
/*
** $Log: nes_mmc.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.4 2000/11/21 13:28:40 matt
** take care to zero allocated mem
**
** Revision 1.3 2000/10/27 12:55:58 matt
** nes6502 now uses 4kB banks across the boards
**
** Revision 1.2 2000/10/25 00:23:16 matt
** makefiles updated for new directory structure
**
** Revision 1.1 2000/10/24 12:20:28 matt
** changed directory structure
**
** Revision 1.28 2000/10/22 19:17:24 matt
** mapper cleanups galore
**
** Revision 1.27 2000/10/22 15:02:32 matt
** simplified mirroring
**
** Revision 1.26 2000/10/21 19:38:56 matt
** that two year old crap code *was* flushed
**
** Revision 1.25 2000/10/21 19:26:59 matt
** many more cleanups
**
** Revision 1.24 2000/10/17 03:22:57 matt
** cleaning up rom module
**
** Revision 1.23 2000/10/10 13:58:15 matt
** stroustrup squeezing his way in the door
**
** Revision 1.22 2000/08/16 02:51:55 matt
** random cleanups
**
** Revision 1.21 2000/07/31 04:27:59 matt
** one million cleanups
**
** Revision 1.20 2000/07/25 02:25:53 matt
** safer xxx_destroy calls
**
** Revision 1.19 2000/07/23 15:11:45 matt
** removed unused variables
**
** Revision 1.18 2000/07/15 23:50:03 matt
** migrated state get/set from nes_mmc.c to state.c
**
** Revision 1.17 2000/07/11 03:15:09 melanson
** Added support for mappers 16, 34, and 231
**
** Revision 1.16 2000/07/10 05:27:41 matt
** cleaned up mapper-specific callbacks
**
** Revision 1.15 2000/07/10 03:02:49 matt
** minor change on loading state
**
** Revision 1.14 2000/07/06 17:38:49 matt
** replaced missing string.h include
**
** Revision 1.13 2000/07/06 02:47:11 matt
** mapper addition madness
**
** Revision 1.12 2000/07/05 05:04:15 matt
** added more mappers
**
** Revision 1.11 2000/07/04 23:12:58 matt
** brand spankin' new mapper interface implemented
**
** Revision 1.10 2000/07/04 04:56:36 matt
** modifications for new SNSS
**
** Revision 1.9 2000/06/29 14:17:18 matt
** uses snsslib now
**
** Revision 1.8 2000/06/29 03:09:24 matt
** modified to support new snss code
**
** Revision 1.7 2000/06/26 04:57:54 matt
** bugfix - irqs/mmcstate not cleared on reset
**
** Revision 1.6 2000/06/23 11:01:10 matt
** updated for new external sound interface
**
** Revision 1.5 2000/06/20 04:04:57 matt
** hacked to use new external soundchip struct
**
** Revision 1.4 2000/06/09 15:12:26 matt
** initial revision
**
*/

View file

@ -0,0 +1,146 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** nes_mmc.h
**
** NES Memory Management Controller (mapper) defines / prototypes
** $Id: nes_mmc.h,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#ifndef _NES_MMC_H_
#define _NES_MMC_H_
#include "libsnss.h"
#include "nes_apu.h"
#define MMC_LASTBANK -1
typedef struct
{
uint32 min_range, max_range;
uint8 (*read_func)(uint32 address);
} map_memread;
typedef struct
{
uint32 min_range, max_range;
void (*write_func)(uint32 address, uint8 value);
} map_memwrite;
typedef struct mapintf_s
{
int number;
char *name;
void (*init)(void);
void (*vblank)(void);
void (*hblank)(int vblank);
void (*get_state)(SnssMapperBlock *state);
void (*set_state)(SnssMapperBlock *state);
map_memread *mem_read;
map_memwrite *mem_write;
apuext_t *sound_ext;
} mapintf_t;
#include "nes_rom.h"
typedef struct mmc_s
{
mapintf_t *intf;
rominfo_t *cart; /* link it back to the cart */
} mmc_t;
extern rominfo_t *mmc_getinfo(void);
extern void mmc_bankvrom(int size, uint32 address, int bank);
extern void mmc_bankrom(int size, uint32 address, int bank);
/* Prototypes */
extern mmc_t *mmc_create(rominfo_t *rominfo);
extern void mmc_destroy(mmc_t **nes_mmc);
extern void mmc_getcontext(mmc_t *dest_mmc);
extern void mmc_setcontext(mmc_t *src_mmc);
extern bool mmc_peek(int map_num);
extern void mmc_reset(void);
#endif /* _NES_MMC_H_ */
/*
** $Log: nes_mmc.h,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.2 2000/10/25 00:23:16 matt
** makefiles updated for new directory structure
**
** Revision 1.1 2000/10/24 12:20:28 matt
** changed directory structure
**
** Revision 1.18 2000/10/22 19:17:24 matt
** mapper cleanups galore
**
** Revision 1.17 2000/10/21 19:26:59 matt
** many more cleanups
**
** Revision 1.16 2000/10/17 03:22:58 matt
** cleaning up rom module
**
** Revision 1.15 2000/10/10 13:58:15 matt
** stroustrup squeezing his way in the door
**
** Revision 1.14 2000/07/31 04:27:59 matt
** one million cleanups
**
** Revision 1.13 2000/07/25 02:25:53 matt
** safer xxx_destroy calls
**
** Revision 1.12 2000/07/17 01:52:28 matt
** made sure last line of all source files is a newline
**
** Revision 1.11 2000/07/15 23:50:03 matt
** migrated state get/set from nes_mmc.c to state.c
**
** Revision 1.10 2000/07/11 02:38:01 matt
** added setcontext() routine
**
** Revision 1.9 2000/07/10 05:27:41 matt
** cleaned up mapper-specific callbacks
**
** Revision 1.8 2000/07/04 23:12:58 matt
** brand spankin' new mapper interface implemented
**
** Revision 1.7 2000/07/04 04:56:36 matt
** modifications for new SNSS
**
** Revision 1.6 2000/06/29 14:17:18 matt
** uses snsslib now
**
** Revision 1.5 2000/06/29 03:09:24 matt
** modified to support new snss code
**
** Revision 1.4 2000/06/09 15:12:26 matt
** initial revision
**
*/

View file

@ -0,0 +1,185 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** nes_pal.c
**
** NES RGB palette
** $Id: nes_pal.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include <math.h>
#include "noftypes.h"
#include "bitmap.h"
#include "nes_pal.h"
#ifndef PI
#define PI 3.1415926535897932384626433832795
#endif
/* my NES palette, converted to RGB */
const rgb_t shady_palette[] =
{
{0x80,0x80,0x80}, {0x00,0x00,0xBB}, {0x37,0x00,0xBF}, {0x84,0x00,0xA6},
{0xBB,0x00,0x6A}, {0xB7,0x00,0x1E}, {0xB3,0x00,0x00}, {0x91,0x26,0x00},
{0x7B,0x2B,0x00}, {0x00,0x3E,0x00}, {0x00,0x48,0x0D}, {0x00,0x3C,0x22},
{0x00,0x2F,0x66}, {0x00,0x00,0x00}, {0x05,0x05,0x05}, {0x05,0x05,0x05},
{0xC8,0xC8,0xC8}, {0x00,0x59,0xFF}, {0x44,0x3C,0xFF}, {0xB7,0x33,0xCC},
{0xFF,0x33,0xAA}, {0xFF,0x37,0x5E}, {0xFF,0x37,0x1A}, {0xD5,0x4B,0x00},
{0xC4,0x62,0x00}, {0x3C,0x7B,0x00}, {0x1E,0x84,0x15}, {0x00,0x95,0x66},
{0x00,0x84,0xC4}, {0x11,0x11,0x11}, {0x09,0x09,0x09}, {0x09,0x09,0x09},
{0xFF,0xFF,0xFF}, {0x00,0x95,0xFF}, {0x6F,0x84,0xFF}, {0xD5,0x6F,0xFF},
{0xFF,0x77,0xCC}, {0xFF,0x6F,0x99}, {0xFF,0x7B,0x59}, {0xFF,0x91,0x5F},
{0xFF,0xA2,0x33}, {0xA6,0xBF,0x00}, {0x51,0xD9,0x6A}, {0x4D,0xD5,0xAE},
{0x00,0xD9,0xFF}, {0x66,0x66,0x66}, {0x0D,0x0D,0x0D}, {0x0D,0x0D,0x0D},
{0xFF,0xFF,0xFF}, {0x84,0xBF,0xFF}, {0xBB,0xBB,0xFF}, {0xD0,0xBB,0xFF},
{0xFF,0xBF,0xEA}, {0xFF,0xBF,0xCC}, {0xFF,0xC4,0xB7}, {0xFF,0xCC,0xAE},
{0xFF,0xD9,0xA2}, {0xCC,0xE1,0x99}, {0xAE,0xEE,0xB7}, {0xAA,0xF7,0xEE},
{0xB3,0xEE,0xFF}, {0xDD,0xDD,0xDD}, {0x11,0x11,0x11}, {0x11,0x11,0x11}
};
/* dynamic palette building routines,
** care of Kevin Horton (khorton@iquest.net)
*/
/* our global palette */
rgb_t nes_palette[64];
static float hue = 334.0f;
static float tint = 0.4f;
static const float brightness[4][4] =
{
{ 0.50f, 0.75f, 1.00f, 1.00f },
{ 0.29f, 0.45f, 0.73f, 0.90f },
{ 0.00f, 0.24f, 0.47f, 0.77f },
{ 0.02f, 0.04f, 0.05f, 0.07f }
};
static const int col_angles[16] =
{
0, 240, 210, 180, 150, 120, 90, 60, 30, 0, 330, 300, 270, 0, 0, 0
};
void pal_generate(void)
{
int x, z;
float s, y, theta;
int r, g, b;
for (x = 0; x < 4; x++)
{
for (z = 0; z < 16; z++)
{
switch (z)
{
case 0:
/* is color $x0? If so, get luma */
s = 0;
y = brightness[0][x];
break;
case 13:
/* is color $xD? If so, get luma */
s = 0;
y = brightness[2][x];
break;
case 14:
case 15:
/* is color $xE/F? If so, set to black */
s = 0;
y = brightness[3][x];
break;
default:
s = tint; /* grab tint */
y = brightness[1][x]; /* grab default luminance */
break;
}
theta = (float) (PI * ((col_angles[z] + hue) / 180.0));
r = (int) (256.0 * (y + s * sin(theta)));
g = (int) (256.0 * (y - ((27 / 53.0) * s * sin(theta)) + ((10 / 53.0) * s * cos(theta))));
b = (int) (256.0 * (y - (s * cos(theta))));
if (r > 255)
r = 255;
else if (r < 0)
r = 0;
if (g > 255)
g = 255;
else if (g < 0)
g = 0;
if (b > 255)
b = 255;
else if (b < 0)
b = 0;
nes_palette[(x << 4) + z].r = r;
nes_palette[(x << 4) + z].g = g;
nes_palette[(x << 4) + z].b = b;
}
}
}
/*
** $Log: nes_pal.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.3 2000/11/06 02:17:18 matt
** no more double->float warnings
**
** Revision 1.2 2000/11/05 16:35:41 matt
** rolled rgb.h into bitmap.h
**
** Revision 1.1 2000/10/24 12:20:28 matt
** changed directory structure
**
** Revision 1.9 2000/07/17 01:52:28 matt
** made sure last line of all source files is a newline
**
** Revision 1.8 2000/07/10 13:49:31 matt
** renamed my palette and extern'ed it
**
** Revision 1.7 2000/06/26 04:59:13 matt
** selectable tint/hue hack (just for the time being)
**
** Revision 1.6 2000/06/21 21:48:19 matt
** changed range multiplier from 255.0 to 256.0
**
** Revision 1.5 2000/06/20 20:42:47 matt
** accuracy changes
**
** Revision 1.4 2000/06/09 15:12:26 matt
** initial revision
**
*/

View file

@ -0,0 +1,65 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** nes_pal.h
**
** NES palette definition
** $Id: nes_pal.h,v 1.1.1.1 2001/04/27 07:03:54 neil Exp $
*/
#ifndef _NESPAL_H_
#define _NESPAL_H_
extern rgb_t nes_palette[];
extern const rgb_t shady_palette[];
extern void pal_generate(void);
/* TODO: these are temporary hacks */
extern void pal_dechue(void);
extern void pal_inchue(void);
extern void pal_dectint(void);
extern void pal_inctint(void);
#endif /* _NESPAL_H_ */
/*
** $Log: nes_pal.h,v $
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:20:28 matt
** changed directory structure
**
** Revision 1.8 2000/07/31 04:27:59 matt
** one million cleanups
**
** Revision 1.7 2000/07/21 04:20:35 matt
** added some nasty externs
**
** Revision 1.6 2000/07/10 13:49:32 matt
** renamed my palette and extern'ed it
**
** Revision 1.5 2000/07/05 17:14:34 neil
** Linux: Act Two, Scene One
**
** Revision 1.4 2000/06/09 15:12:26 matt
** initial revision
**
*/

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,241 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** nes_ppu.h
**
** NES Picture Processing Unit (PPU) emulation header file
** $Id: nes_ppu.h,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#ifndef _NES_PPU_H_
#define _NES_PPU_H_
#include "bitmap.h"
/* PPU register defines */
#define PPU_CTRL0 0x2000
#define PPU_CTRL1 0x2001
#define PPU_STAT 0x2002
#define PPU_OAMADDR 0x2003
#define PPU_OAMDATA 0x2004
#define PPU_SCROLL 0x2005
#define PPU_VADDR 0x2006
#define PPU_VDATA 0x2007
#define PPU_OAMDMA 0x4014
#define PPU_JOY0 0x4016
#define PPU_JOY1 0x4017
/* $2000 */
#define PPU_CTRL0F_NMI 0x80
#define PPU_CTRL0F_OBJ16 0x20
#define PPU_CTRL0F_BGADDR 0x10
#define PPU_CTRL0F_OBJADDR 0x08
#define PPU_CTRL0F_ADDRINC 0x04
#define PPU_CTRL0F_NAMETAB 0x03
/* $2001 */
#define PPU_CTRL1F_OBJON 0x10
#define PPU_CTRL1F_BGON 0x08
#define PPU_CTRL1F_OBJMASK 0x04
#define PPU_CTRL1F_BGMASK 0x02
/* $2002 */
#define PPU_STATF_VBLANK 0x80
#define PPU_STATF_STRIKE 0x40
#define PPU_STATF_MAXSPRITE 0x20
/* Sprite attribute byte bitmasks */
#define OAMF_VFLIP 0x80
#define OAMF_HFLIP 0x40
#define OAMF_BEHIND 0x20
/* Maximum number of sprites per horizontal scanline */
#define PPU_MAXSPRITE 8
/* some mappers do *dumb* things */
typedef void (*ppulatchfunc_t)(uint32 address, uint8 value);
typedef void (*ppuvromswitch_t)(uint8 value);
typedef struct ppu_s
{
/* big nasty memory chunks */
uint8 nametab[0x1000];
uint8 oam[256];
uint8 palette[32];
uint8 *page[16];
/* hardware registers */
uint8 ctrl0, ctrl1, stat, oam_addr;
uint32 vaddr, vaddr_latch;
int tile_xofs, flipflop;
int vaddr_inc;
uint32 tile_nametab;
uint8 obj_height;
uint32 obj_base, bg_base;
bool bg_on, obj_on;
bool obj_mask, bg_mask;
uint8 latch, vdata_latch;
uint8 strobe;
bool strikeflag;
uint32 strike_cycle;
/* callbacks for naughty mappers */
ppulatchfunc_t latchfunc;
ppuvromswitch_t vromswitch;
/* copy of our current palette */
rgb_t curpal[256];
bool vram_accessible;
bool vram_present;
bool drawsprites;
} ppu_t;
/* TODO: should use this pointers */
extern void ppu_setlatchfunc(ppulatchfunc_t func);
extern void ppu_setvromswitch(ppuvromswitch_t func);
extern void ppu_getcontext(ppu_t *dest_ppu);
extern void ppu_setcontext(ppu_t *src_ppu);
/* Mirroring */
/* TODO: this is only used bloody once */
extern void ppu_mirrorhipages(void);
extern void ppu_mirror(int nt1, int nt2, int nt3, int nt4);
extern void ppu_setpage(int size, int page_num, uint8 *location);
extern uint8 *ppu_getpage(int page);
/* control */
extern void ppu_reset(int reset_type);
extern bool ppu_enabled(void);
extern void ppu_scanline(bitmap_t *bmp, int scanline, bool draw_flag);
extern void ppu_endscanline(int scanline);
extern void ppu_checknmi();
extern ppu_t *ppu_create(void);
extern void ppu_destroy(ppu_t **ppu);
/* IO */
extern uint8 ppu_read(uint32 address);
extern void ppu_write(uint32 address, uint8 value);
extern uint8 ppu_readhigh(uint32 address);
extern void ppu_writehigh(uint32 address, uint8 value);
/* rendering */
extern void ppu_setpal(ppu_t *src_ppu, rgb_t *pal);
extern void ppu_setdefaultpal(ppu_t *src_ppu);
/* bleh */
extern void ppu_dumppattern(bitmap_t *bmp, int table_num, int x_loc, int y_loc, int col);
extern void ppu_dumpoam(bitmap_t *bmp, int x_loc, int y_loc);
extern void ppu_displaysprites(bool display);
#endif /* _NES_PPU_H_ */
/*
** $Log: nes_ppu.h,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.8 2000/11/29 12:58:23 matt
** timing/fiq fixes
**
** Revision 1.7 2000/11/27 19:36:16 matt
** more timing fixes
**
** Revision 1.6 2000/11/26 15:51:13 matt
** frame IRQ emulation
**
** Revision 1.5 2000/11/25 20:30:39 matt
** scanline emulation simplifications/timing fixes
**
** Revision 1.4 2000/11/19 13:40:19 matt
** more accurate ppu behavior
**
** Revision 1.3 2000/11/05 16:35:41 matt
** rolled rgb.h into bitmap.h
**
** Revision 1.2 2000/10/27 12:55:03 matt
** palette generating functions now take *this pointers
**
** Revision 1.1 2000/10/24 12:20:28 matt
** changed directory structure
**
** Revision 1.19 2000/10/22 15:02:32 matt
** simplified mirroring
**
** Revision 1.18 2000/10/21 21:36:04 matt
** ppu cleanups / fixes
**
** Revision 1.17 2000/10/21 19:26:59 matt
** many more cleanups
**
** Revision 1.16 2000/10/10 13:58:15 matt
** stroustrup squeezing his way in the door
**
** Revision 1.15 2000/07/31 04:27:59 matt
** one million cleanups
**
** Revision 1.14 2000/07/30 04:32:33 matt
** emulation of the NES frame IRQ
**
** Revision 1.13 2000/07/25 02:25:53 matt
** safer xxx_destroy calls
**
** Revision 1.12 2000/07/17 05:12:56 matt
** nes_ppu.c is no longer a scary place to be-- cleaner & faster
**
** Revision 1.11 2000/07/17 01:52:28 matt
** made sure last line of all source files is a newline
**
** Revision 1.10 2000/07/10 05:28:30 matt
** moved joypad/oam dma from apu to ppu
**
** Revision 1.9 2000/07/10 03:03:16 matt
** added ppu_getcontext() routine
**
** Revision 1.8 2000/07/06 16:42:40 matt
** better palette setting interface
**
** Revision 1.7 2000/07/04 23:13:26 matt
** added an irq line drawing debug feature hack
**
** Revision 1.6 2000/06/26 04:58:08 matt
** accuracy changes
**
** Revision 1.5 2000/06/20 00:04:35 matt
** removed STATQUIRK macro
**
** Revision 1.4 2000/06/09 15:12:26 matt
** initial revision
**
*/

View file

@ -0,0 +1,110 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** nes_rom.h
**
** NES ROM loading/saving related defines / prototypes
** $Id: nes_rom.h,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#ifndef _NES_ROM_H_
#define _NES_ROM_H_
#include <unistd.h>
#include "osd.h"
typedef enum
{
MIRROR_HORIZ = 0,
MIRROR_VERT = 1
} mirror_t;
#define ROM_FLAG_BATTERY 0x01
#define ROM_FLAG_TRAINER 0x02
#define ROM_FLAG_FOURSCREEN 0x04
#define ROM_FLAG_VERSUS 0x08
typedef struct rominfo_s
{
/* pointers to ROM and VROM */
uint8 *rom, *vrom;
/* pointers to SRAM and VRAM */
uint8 *sram, *vram;
/* number of banks */
int rom_banks, vrom_banks;
int sram_banks, vram_banks;
int mapper_number;
mirror_t mirror;
uint8 flags;
char filename[PATH_MAX + 1];
} rominfo_t;
extern int rom_checkmagic(const char *filename);
extern rominfo_t *rom_load(const char *filename);
extern void rom_free(rominfo_t **rominfo);
extern char *rom_getinfo(rominfo_t *rominfo);
#endif /* _NES_ROM_H_ */
/*
** $Log: nes_rom.h,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.2 2000/10/25 01:23:08 matt
** basic system autodetection
**
** Revision 1.1 2000/10/24 12:20:28 matt
** changed directory structure
**
** Revision 1.11 2000/10/22 15:01:29 matt
** irrelevant mirroring modes removed
**
** Revision 1.10 2000/10/17 03:22:38 matt
** cleaning up rom module
**
** Revision 1.9 2000/10/10 13:58:13 matt
** stroustrup squeezing his way in the door
**
** Revision 1.8 2000/10/10 13:03:54 matt
** Mr. Clean makes a guest appearance
**
** Revision 1.7 2000/07/25 02:20:58 matt
** cleanups
**
** Revision 1.6 2000/07/19 15:59:39 neil
** PATH_MAX, strncpy, snprintf, and strncat are our friends
**
** Revision 1.5 2000/07/17 01:52:27 matt
** made sure last line of all source files is a newline
**
** Revision 1.4 2000/06/09 15:12:25 matt
** initial revision
**
*/

View file

@ -0,0 +1,411 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** nes_rom.c
**
** NES ROM loading/saving related functions
** $Id: nes_rom.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
/* TODO: make this a generic ROM loading routine */
#include <stdio.h>
#include <string.h>
#include "noftypes.h"
#include "nes_rom.h"
#include "nes_mmc.h"
#include "nes_ppu.h"
#include "nes.h"
#include "log.h"
#include "osd.h"
extern char *osd_getromdata();
/* Max length for displayed filename */
#define ROM_DISP_MAXLEN 20
#define ROM_FOURSCREEN 0x08
#define ROM_TRAINER 0x04
#define ROM_BATTERY 0x02
#define ROM_MIRRORTYPE 0x01
#define ROM_INES_MAGIC "NES\x1A"
//ToDo: packed - JD
typedef struct inesheader_s
{
uint8 ines_magic[4] ;
uint8 rom_banks ;
uint8 vrom_banks ;
uint8 rom_type ;
uint8 mapper_hinybble ;
uint8 reserved[8] ;
} inesheader_t;
#define TRAINER_OFFSET 0x1000
#define TRAINER_LENGTH 0x200
#define VRAM_LENGTH 0x2000
#define ROM_BANK_LENGTH 0x4000
#define VROM_BANK_LENGTH 0x2000
#define SRAM_BANK_LENGTH 0x0400
#define VRAM_BANK_LENGTH 0x2000
static int rom_loadrom(unsigned char **rom, rominfo_t *rominfo)
{
ASSERT(rom);
ASSERT(rominfo);
/* Allocate ROM space, and load it up! */
rominfo->rom=*rom;
*rom+=ROM_BANK_LENGTH*rominfo->rom_banks;
/* If there's VROM, allocate and stuff it in */
if (rominfo->vrom_banks)
{
rominfo->vrom=*rom;
*rom+=VROM_BANK_LENGTH*rominfo->vrom_banks;
}
else
{
rominfo->vram = emu_Malloc(VRAM_LENGTH);
if (NULL == rominfo->vram)
{
return -1;
}
memset(rominfo->vram, 0, VRAM_LENGTH);
}
return 0;
}
static int *rom_findrom(const char *filename, rominfo_t *rominfo)
{
int fp;
ASSERT(rominfo);
if (NULL == filename)
return NULL;
/* Make a copy of the name so we can extend it */
osd_fullname(rominfo->filename, filename);
fp = emu_FileOpen(rominfo->filename);
if (!fp)
{
/* Didn't find the file? Maybe the .NES extension was omitted */
if (NULL == strrchr(rominfo->filename, '.'))
strncat(rominfo->filename, ".nes", PATH_MAX - strlen(rominfo->filename));
/* this will either return NULL or a valid file pointer */
fp = emu_FileOpen(rominfo->filename);
}
return fp;
}
/* Add ROM name to a list with dirty headers */
static int rom_adddirty(char *filename)
{
return 0;
}
/* return 0 if this *is* an iNES file */
int rom_checkmagic(const char *filename)
{
inesheader_t head;
rominfo_t rominfo;
int fp;
fp = rom_findrom(filename, &rominfo);
if (0 == fp)
return -1;
emu_FileRead(&head, 1*sizeof(head));
emu_FileClose();
if (0 == memcmp(head.ines_magic, ROM_INES_MAGIC, 4))
/* not an iNES file */
return 0;
return -1;
}
static int rom_getheader(unsigned char **rom, rominfo_t *rominfo)
{
#define RESERVED_LENGTH 8
inesheader_t head;
uint8 reserved[RESERVED_LENGTH];
bool header_dirty;
ASSERT(rom);
ASSERT(*rom);
ASSERT(rominfo);
/* Read in the header */
// _fread(&head, 1, sizeof(head), fp);
log_printf("Head: %p (%x %x %x %x)\n", *rom, (*rom)[0], (*rom)[1], (*rom)[2], (*rom)[3]);
memcpy(&head, *rom, sizeof(head));
*rom+=sizeof(head);
if (memcmp(head.ines_magic, ROM_INES_MAGIC, 4))
{
return -1;
}
rominfo->rom_banks = head.rom_banks;
rominfo->vrom_banks = head.vrom_banks;
/* iNES assumptions */
rominfo->sram_banks = 8; /* 1kB banks, so 8KB */
rominfo->vram_banks = 1; /* 8kB banks, so 8KB */
rominfo->mirror = (head.rom_type & ROM_MIRRORTYPE) ? MIRROR_VERT : MIRROR_HORIZ;
rominfo->flags = 0;
if (head.rom_type & ROM_BATTERY)
rominfo->flags |= ROM_FLAG_BATTERY;
if (head.rom_type & ROM_TRAINER)
rominfo->flags |= ROM_FLAG_TRAINER;
if (head.rom_type & ROM_FOURSCREEN)
rominfo->flags |= ROM_FLAG_FOURSCREEN;
/* TODO: fourscreen a mirroring type? */
rominfo->mapper_number = head.rom_type >> 4;
/* Do a compare - see if we've got a clean extended header */
memset(reserved, 0, RESERVED_LENGTH);
if (0 == memcmp(head.reserved, reserved, RESERVED_LENGTH))
{
/* We were clean */
header_dirty = false;
rominfo->mapper_number |= (head.mapper_hinybble & 0xF0);
}
else
{
header_dirty = true;
/* @!?#@! DiskDude. */
if (('D' == head.mapper_hinybble) && (0 == memcmp(head.reserved, "iskDude!", 8)))
log_printf("`DiskDude!' found in ROM header, ignoring high mapper nybble\n");
else
{
log_printf("ROM header dirty, possible problem\n");
rominfo->mapper_number |= (head.mapper_hinybble & 0xF0);
}
rom_adddirty(rominfo->filename);
}
/* TODO: this is an ugly hack, but necessary, I guess */
/* Check for VS unisystem mapper */
if (99 == rominfo->mapper_number)
rominfo->flags |= ROM_FLAG_VERSUS;
return 0;
}
/* Build the info string for ROM display */
char *rom_getinfo(rominfo_t *rominfo)
{
static char info[PATH_MAX + 1];
char romname[PATH_MAX + 1], temp[PATH_MAX + 1];
/* Look to see if we were given a path along with filename */
/* TODO: strip extensions */
if (strrchr(rominfo->filename, PATH_SEP))
strncpy(romname, strrchr(rominfo->filename, PATH_SEP) + 1, PATH_MAX);
else
strncpy(romname, rominfo->filename, PATH_MAX);
/* If our filename is too long, truncate our displayed filename */
if (strlen(romname) > ROM_DISP_MAXLEN)
{
strncpy(info, romname, ROM_DISP_MAXLEN - 3);
strcpy(info + (ROM_DISP_MAXLEN - 3), "...");
}
else
{
strcpy(info, romname);
}
sprintf(temp, " [%d] %dk/%dk %c", rominfo->mapper_number,
rominfo->rom_banks * 16, rominfo->vrom_banks * 8,
(rominfo->mirror == MIRROR_VERT) ? 'V' : 'H');
/* Stick it on there! */
strncat(info, temp, PATH_MAX - strlen(info));
if (rominfo->flags & ROM_FLAG_BATTERY)
strncat(info, "B", PATH_MAX - strlen(info));
if (rominfo->flags & ROM_FLAG_TRAINER)
strncat(info, "T", PATH_MAX - strlen(info));
if (rominfo->flags & ROM_FLAG_FOURSCREEN)
strncat(info, "4", PATH_MAX - strlen(info));
return info;
}
/* Load a ROM image into memory */
rominfo_t *rom_load(const char *filename)
{
unsigned char *rom=(unsigned char*)osd_getromdata();
rominfo_t *rominfo;
rominfo = emu_Malloc(sizeof(rominfo_t));
if (NULL == rominfo)
return NULL;
memset(rominfo, 0, sizeof(rominfo_t));
/* Get the header and stick it into rominfo struct */
if (rom_getheader(&rom, rominfo))
goto _fail;
/* Make sure we really support the mapper */
if (false == mmc_peek(rominfo->mapper_number))
{
goto _fail;
}
if (rom_loadrom(&rom, rominfo))
goto _fail;
return rominfo;
_fail:
rom_free(&rominfo);
return NULL;
}
/* Free a ROM */
void rom_free(rominfo_t **rominfo)
{
if (NULL == *rominfo)
{
return;
}
/* Restore palette if we loaded in a VS jobber */
if ((*rominfo)->flags & ROM_FLAG_VERSUS)
{
/* TODO: bad idea calling nes_getcontextptr... */
ppu_setdefaultpal(nes_getcontextptr()->ppu);
log_printf("Default NES palette restored\n");
}
if ((*rominfo)->sram)
free((*rominfo)->sram);
if ((*rominfo)->rom)
free((*rominfo)->rom);
if ((*rominfo)->vrom)
free((*rominfo)->vrom);
if ((*rominfo)->vram)
free((*rominfo)->vram);
free(*rominfo);
}
/*
** $Log: nes_rom.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.8 2000/11/21 13:28:40 matt
** take care to zero allocated mem
**
** Revision 1.7 2000/11/09 14:07:28 matt
** state load fixed, state save mostly fixed
**
** Revision 1.6 2000/10/28 14:24:54 matt
** where did I put that underscore?
**
** Revision 1.5 2000/10/27 12:56:35 matt
** api change for ppu palette functions
**
** Revision 1.4 2000/10/26 22:51:44 matt
** correct NULL filename handling
**
** Revision 1.3 2000/10/25 01:23:08 matt
** basic system autodetection
**
** Revision 1.2 2000/10/25 00:23:16 matt
** makefiles updated for new directory structure
**
** Revision 1.1 2000/10/24 12:20:28 matt
** changed directory structure
**
** Revision 1.19 2000/10/21 14:35:58 matt
** typo
**
** Revision 1.18 2000/10/17 03:22:37 matt
** cleaning up rom module
**
** Revision 1.17 2000/10/10 13:58:13 matt
** stroustrup squeezing his way in the door
**
** Revision 1.16 2000/10/10 13:03:54 matt
** Mr. Clean makes a guest appearance
**
** Revision 1.15 2000/07/31 04:28:46 matt
** one million cleanups
**
** Revision 1.14 2000/07/30 04:31:26 matt
** automagic loading of the nofrendo intro
**
** Revision 1.13 2000/07/25 02:20:58 matt
** cleanups
**
** Revision 1.12 2000/07/20 01:53:27 matt
** snprintf() ain't no standard function, eh?
**
** Revision 1.11 2000/07/19 16:06:54 neil
** little error fixed (tempinfo vs rominfo->info)
**
** Revision 1.10 2000/07/19 15:59:39 neil
** PATH_MAX, strncpy, snprintf, and strncat are our friends
**
** Revision 1.9 2000/07/17 01:52:27 matt
** made sure last line of all source files is a newline
**
** Revision 1.8 2000/07/06 16:47:50 matt
** new ppu palette setting calls
**
** Revision 1.7 2000/07/05 23:21:54 neil
** fclose(fp) should not be done if fp == NULL
**
** Revision 1.6 2000/07/04 04:45:14 matt
** changed include
**
** Revision 1.5 2000/06/26 04:56:10 matt
** minor cleanup
**
** Revision 1.4 2000/06/09 15:12:25 matt
** initial revision
**
*/

View file

@ -0,0 +1,212 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** nesinput.c
**
** Event handling system routines
** $Id: nesinput.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "nesinput.h"
#include "log.h"
/* TODO: make a linked list of inputs sources, so they
** can be removed if need be
*/
static nesinput_t *nes_input[MAX_CONTROLLERS];
static int active_entries = 0;
/* read counters */
static int pad0_readcount, pad1_readcount, ppad_readcount, ark_readcount;
static int retrieve_type(int type)
{
int i, value = 0;
for (i = 0; i < active_entries; i++)
{
ASSERT(nes_input[i]);
if (type == nes_input[i]->type)
value |= nes_input[i]->data;
}
return value;
}
static uint8 get_pad0(void)
{
uint8 value;
value = (uint8) retrieve_type(INP_JOYPAD0);
/* mask out left/right simultaneous keypresses */
if ((value & INP_PAD_UP) && (value & INP_PAD_DOWN))
value &= ~(INP_PAD_UP | INP_PAD_DOWN);
if ((value & INP_PAD_LEFT) && (value & INP_PAD_RIGHT))
value &= ~(INP_PAD_LEFT | INP_PAD_RIGHT);
/* return (0x40 | value) due to bus conflicts */
return (0x40 | ((value >> pad0_readcount++) & 1));
}
static uint8 get_pad1(void)
{
uint8 value;
value = (uint8) retrieve_type(INP_JOYPAD1);
/* mask out left/right simultaneous keypresses */
if ((value & INP_PAD_UP) && (value & INP_PAD_DOWN))
value &= ~(INP_PAD_UP | INP_PAD_DOWN);
if ((value & INP_PAD_LEFT) && (value & INP_PAD_RIGHT))
value &= ~(INP_PAD_LEFT | INP_PAD_RIGHT);
/* return (0x40 | value) due to bus conflicts */
return (0x40 | ((value >> pad1_readcount++) & 1));
}
static uint8 get_zapper(void)
{
return (uint8) (retrieve_type(INP_ZAPPER));
}
static uint8 get_powerpad(void)
{
int value;
uint8 ret_val = 0;
value = retrieve_type(INP_POWERPAD);
if (((value >> 8) >> ppad_readcount) & 1)
ret_val |= 0x10;
if (((value & 0xFF) >> ppad_readcount) & 1)
ret_val |= 0x08;
ppad_readcount++;
return ret_val;
}
static uint8 get_vsdips0(void)
{
return (retrieve_type(INP_VSDIPSW0));
}
static uint8 get_vsdips1(void)
{
return (retrieve_type(INP_VSDIPSW1));
}
static uint8 get_arkanoid(void)
{
uint8 value = retrieve_type(INP_ARKANOID);
if ((value >> (7 - ark_readcount++)) & 1)
return 0x02;
else
return 0;
}
/* return input state for all types indicated (can be ORed together) */
uint8 input_get(int types)
{
uint8 value = 0;
if (types & INP_JOYPAD0)
value |= get_pad0();
if (types & INP_JOYPAD1)
value |= get_pad1();
if (types & INP_ZAPPER)
value |= get_zapper();
if (types & INP_POWERPAD)
value |= get_powerpad();
if (types & INP_VSDIPSW0)
value |= get_vsdips0();
if (types & INP_VSDIPSW1)
value |= get_vsdips1();
if (types & INP_ARKANOID)
value |= get_arkanoid();
return value;
}
/* register an input type */
void input_register(nesinput_t *input)
{
if (NULL == input)
return;
nes_input[active_entries] = input;
active_entries++;
}
void input_event(nesinput_t *input, int state, int value)
{
ASSERT(input);
if (state == INP_STATE_MAKE)
input->data |= value; /* OR it in */
else /* break state */
input->data &= ~value; /* mask it out */
}
void input_strobe(void)
{
pad0_readcount = 0;
pad1_readcount = 0;
ppad_readcount = 0;
ark_readcount = 0;
}
/*
** $Log: nesinput.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:20:28 matt
** changed directory structure
**
** Revision 1.9 2000/09/10 23:25:03 matt
** minor changes
**
** Revision 1.8 2000/07/31 04:27:59 matt
** one million cleanups
**
** Revision 1.7 2000/07/23 15:11:45 matt
** removed unused variables
**
** Revision 1.6 2000/07/17 01:52:28 matt
** made sure last line of all source files is a newline
**
** Revision 1.5 2000/07/04 04:56:50 matt
** include changes
**
** Revision 1.4 2000/06/09 15:12:26 matt
** initial revision
**
*/

View file

@ -0,0 +1,104 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** nesinput.h
**
** Platform independent input definitions
** $Id: nesinput.h,v 1.1.1.1 2001/04/27 07:03:54 neil Exp $
*/
#ifndef _NESINPUT_H_
#define _NESINPUT_H_
/* NES control pad bitmasks */
#define INP_PAD_A 0x01
#define INP_PAD_B 0x02
#define INP_PAD_SELECT 0x04
#define INP_PAD_START 0x08
#define INP_PAD_UP 0x10
#define INP_PAD_DOWN 0x20
#define INP_PAD_LEFT 0x40
#define INP_PAD_RIGHT 0x80
#define INP_ZAPPER_HIT 0x00
#define INP_ZAPPER_MISS 0x08
#define INP_ZAPPER_TRIG 0x10
#define INP_JOYPAD0 0x0001
#define INP_JOYPAD1 0x0002
#define INP_ZAPPER 0x0004
#define INP_POWERPAD 0x0008
#define INP_ARKANOID 0x0010
#define INP_VSDIPSW0 0x0020
#define INP_VSDIPSW1 0x0040
/* upper byte is what's returned in D4, lower is D3 */
#define INP_PPAD_1 0x0002
#define INP_PPAD_2 0x0001
#define INP_PPAD_3 0x0200
#define INP_PPAD_4 0x0100
#define INP_PPAD_5 0x0004
#define INP_PPAD_6 0x0010
#define INP_PPAD_7 0x0080
#define INP_PPAD_8 0x0800
#define INP_PPAD_9 0x0008
#define INP_PPAD_10 0x0020
#define INP_PPAD_11 0x0040
#define INP_PPAD_12 0x0400
enum
{
INP_STATE_BREAK,
INP_STATE_MAKE
};
typedef struct nesinput_s
{
int type;
int data;
} nesinput_t;
#define MAX_CONTROLLERS 32
extern uint8 input_get(int type);
extern void input_register(nesinput_t *input);
extern void input_event(nesinput_t *input, int state, int value);
extern void input_strobe(void);
#endif /* _NESINPUT_H_ */
/*
** $Log: nesinput.h,v $
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:20:28 matt
** changed directory structure
**
** Revision 1.6 2000/09/10 23:25:02 matt
** minor changes
**
** Revision 1.5 2000/07/17 01:52:29 matt
** made sure last line of all source files is a newline
**
** Revision 1.4 2000/06/09 15:12:26 matt
** initial revision
**
*/

View file

@ -0,0 +1,49 @@
/* Nofrendo Configuration API
**
** This file is in the public domain.
**
** $Id: nofconfig.h,v 1.1 2001/04/27 14:37:11 neil Exp $
*/
#ifndef _CONFIG_H_
#define _CONFIG_H_
#ifndef CONFIG_FILE
#define CONFIG_FILE "nofrendo.cfg"
#endif
typedef struct config_s
{
char *filename;
} config_t;
extern config_t config;
#endif /* !_CONFIG_H_ */
/*
** $Log: nofconfig.h,v $
** Revision 1.1 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.5 2000/10/10 13:58:13 matt
** stroustrup squeezing his way in the door
**
** Revision 1.4 2000/07/19 15:58:55 neil
** config file now configurable (ha)
**
** Revision 1.3 2000/07/11 14:59:27 matt
** minor cosmetics.. =)
**
** Revision 1.2 2000/07/11 13:35:38 bsittler
** Changed the config API, implemented config file "nofrendo.cfg". The
** GGI drivers use the group [GGI]. Visual= and Mode= keys are understood.
**
** Revision 1.1 2000/07/11 07:46:11 neil
** Initial commit
**
**
*/

View file

@ -0,0 +1,394 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** nofrendo.c
**
** Entry point of program
** Note: all architectures should call these functions
** $Id: nofrendo.c,v 1.3 2001/04/27 14:37:11 neil Exp $
*/
#include <stdio.h>
#include <stdlib.h>
#include "noftypes.h"
#include "nofrendo.h"
#include "event.h"
#include "nofconfig.h"
#include "log.h"
#include "osd.h"
#include "vid_drv.h"
/* emulated system includes */
#include "nes.h"
/* our global machine structure */
static struct
{
char *filename, *nextfilename;
system_t type, nexttype;
union
{
nes_t *nes;
} machine;
int refresh_rate;
bool quit;
} console;
/* our happy little timer ISR */
volatile int nofrendo_ticks = 0;
static void timer_isr(void)
{
nofrendo_ticks++;
}
static void timer_isr_end(void) {} /* code marker for djgpp */
static void shutdown_everything(void)
{
if (console.filename)
{
free(console.filename);
console.filename = NULL;
}
if (console.nextfilename)
{
free(console.nextfilename);
console.nextfilename = NULL;
}
//config.close(); JMH
osd_shutdown();
vid_shutdown();
log_shutdown();
}
/* End the current context */
void main_eject(void)
{
switch (console.type)
{
case system_nes:
nes_poweroff();
nes_destroy(&(console.machine.nes));
break;
default:
break;
}
if (NULL != console.filename)
{
free(console.filename);
console.filename = NULL;
}
console.type = system_unknown;
}
/* Act on the user's quit requests */
void main_quit(void)
{
console.quit = true;
main_eject();
/* if there's a pending filename / system, clear */
if (NULL != console.nextfilename)
{
free(console.nextfilename);
console.nextfilename = NULL;
}
console.nexttype = system_unknown;
}
/* brute force system autodetection */
static system_t detect_systemtype(const char *filename)
{
if (NULL == filename)
return system_unknown;
if (0 == nes_isourfile(filename))
return system_nes;
/* can't figure out what this thing is */
return system_unknown;
}
static int install_timer(int hertz)
{
return osd_installtimer(hertz, (void *) timer_isr,
(int) timer_isr_end - (int) timer_isr,
(void *) &nofrendo_ticks,
sizeof(nofrendo_ticks));
}
/* This assumes there is no current context */
static int internal_insert(const char *filename, system_t type)
{
/* autodetect system type? */
if (system_autodetect == type)
type = detect_systemtype(filename);
console.filename = strdup(filename);
console.type = type;
/* set up the event system for this system type */
event_set_system(type);
switch (console.type)
{
case system_nes:
console.machine.nes = nes_create();
if (NULL == console.machine.nes)
{
log_printf("Failed to create NES instance.\n");
return -1;
}
if (nes_insertcart(console.filename, console.machine.nes))
return -1;
vid_setmode(NES_SCREEN_WIDTH, NES_VISIBLE_HEIGHT);
if (install_timer(NES_REFRESH_RATE))
return -1;
nes_emulate();
break;
case system_unknown:
default:
log_printf("system type unknown, playing nofrendo NES intro.\n");
if (NULL != console.filename)
free(console.filename);
/* oooh, recursion */
return internal_insert(filename, system_nes);
}
return 0;
}
/* This tells main_loop to load this next image */
void main_insert(const char *filename, system_t type)
{
console.nextfilename = strdup(filename);
console.nexttype = type;
main_eject();
}
int nofrendo_main(int argc, char *argv[])
{
/* initialize our system structure */
console.filename = NULL;
console.nextfilename = NULL;
console.type = system_unknown;
console.nexttype = system_unknown;
console.refresh_rate = 0;
console.quit = false;
if (log_init())
return -1;
event_init();
return osd_main(argc, argv);
}
/* This is the final leg of main() */
int main_loop(const char *filename, system_t type)
{
vidinfo_t video;
/* register shutdown, in case of assertions, etc. */
// atexit(shutdown_everything);
//if (config.open()) // JMH
// return -1;
if (osd_init())
return -1;
osd_getvideoinfo(&video);
if (vid_init(video.default_width, video.default_height, video.driver))
return -1;
//log printf("vid_init done\n");
console.nextfilename = strdup(filename);
console.nexttype = type;
// while (false == console.quit)
// {
//emu_printf("internal_insert in loop\n");
if (internal_insert(console.nextfilename, console.nexttype))
return 1;
// }
return 0;
}
/*
** $Log: nofrendo.c,v $
** Revision 1.3 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.2 2001/04/27 11:10:08 neil
** compile
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.48 2000/11/27 12:47:08 matt
** free them strings
**
** Revision 1.47 2000/11/25 20:26:05 matt
** removed fds "system"
**
** Revision 1.46 2000/11/25 01:51:53 matt
** bool stinks sometimes
**
** Revision 1.45 2000/11/20 13:22:12 matt
** standardized timer ISR, added nofrendo_ticks
**
** Revision 1.44 2000/11/05 22:53:13 matt
** only one video driver per system, please
**
** Revision 1.43 2000/11/01 14:15:35 matt
** multi-system event system, or whatever
**
** Revision 1.42 2000/10/28 15:16:24 matt
** removed nsf_init
**
** Revision 1.41 2000/10/27 12:58:44 matt
** gui_init can now fail
**
** Revision 1.40 2000/10/26 22:48:57 matt
** prelim NSF support
**
** Revision 1.39 2000/10/25 13:42:02 matt
** strdup - giddyap!
**
** Revision 1.38 2000/10/25 01:23:08 matt
** basic system autodetection
**
** Revision 1.37 2000/10/23 17:50:47 matt
** adding fds support
**
** Revision 1.36 2000/10/23 15:52:04 matt
** better system handling
**
** Revision 1.35 2000/10/21 19:25:59 matt
** many more cleanups
**
** Revision 1.34 2000/10/10 13:58:13 matt
** stroustrup squeezing his way in the door
**
** Revision 1.33 2000/10/10 13:03:54 matt
** Mr. Clean makes a guest appearance
**
** Revision 1.32 2000/09/15 04:58:06 matt
** simplifying and optimizing APU core
**
** Revision 1.31 2000/09/10 23:19:14 matt
** i'm a sloppy coder
**
** Revision 1.30 2000/09/07 01:30:57 matt
** nes6502_init deprecated
**
** Revision 1.29 2000/08/16 03:17:49 matt
** bpb
**
** Revision 1.28 2000/08/16 02:58:19 matt
** changed video interface a wee bit
**
** Revision 1.27 2000/07/31 04:28:46 matt
** one million cleanups
**
** Revision 1.26 2000/07/30 04:31:26 matt
** automagic loading of the nofrendo intro
**
** Revision 1.25 2000/07/27 01:16:36 matt
** sorted out the video problems
**
** Revision 1.24 2000/07/26 21:54:53 neil
** eject has to clear the nextfilename and nextsystem
**
** Revision 1.23 2000/07/26 21:36:13 neil
** Big honkin' change -- see the mailing list
**
** Revision 1.22 2000/07/25 02:21:36 matt
** safer xxx_destroy calls
**
** Revision 1.21 2000/07/23 16:46:47 matt
** fixed crash in win32 by reodering shutdown calls
**
** Revision 1.20 2000/07/23 15:18:23 matt
** removed unistd.h from includes
**
** Revision 1.19 2000/07/23 00:48:15 neil
** Win32 SDL
**
** Revision 1.18 2000/07/21 13:42:06 neil
** get_options removed, as it should be handled by osd_main
**
** Revision 1.17 2000/07/21 04:53:48 matt
** moved palette calls out of nofrendo.c and into ppu_create
**
** Revision 1.16 2000/07/21 02:40:43 neil
** more main fixes
**
** Revision 1.15 2000/07/21 02:09:07 neil
** new main structure?
**
** Revision 1.14 2000/07/20 17:05:12 neil
** Moved osd_init before setup_video
**
** Revision 1.13 2000/07/11 15:01:05 matt
** moved config.close() into registered atexit() routine
**
** Revision 1.12 2000/07/11 13:35:38 bsittler
** Changed the config API, implemented config file "nofrendo.cfg". The
** GGI drivers use the group [GGI]. Visual= and Mode= keys are understood.
**
** Revision 1.11 2000/07/11 04:32:21 matt
** less magic number nastiness for screen dimensions
**
** Revision 1.10 2000/07/10 03:04:15 matt
** removed scanlines, backbuffer from custom blit
**
** Revision 1.9 2000/07/07 04:39:54 matt
** removed garbage dpp shite
**
** Revision 1.8 2000/07/06 16:48:25 matt
** new video driver
**
** Revision 1.7 2000/07/05 17:26:16 neil
** Moved the externs in nofrendo.c to osd.h
**
** Revision 1.6 2000/06/26 04:55:44 matt
** cleaned up main()
**
** Revision 1.5 2000/06/20 20:41:21 matt
** moved <stdlib.h> include to top (duh)
**
** Revision 1.4 2000/06/09 15:12:25 matt
** initial revision
**
*/

View file

@ -0,0 +1,98 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** nofrendo.h (c) 1998-2000 Matthew Conte (matt@conte.com)
** (c) 2000 Neil Stevens (multivac@fcmail.com)
**
** Note: all architectures should call these functions
**
** $Id: nofrendo.h,v 1.2 2001/04/27 11:10:08 neil Exp $
*/
#ifndef _NOFRENDO_H_
#define _NOFRENDO_H_
#define NOLOOP 1
typedef enum
{
system_unknown,
system_autodetect,
system_nes,
NUM_SUPPORTED_SYSTEMS
} system_t;
int nofrendo_main(int argc, char *argv[]);
extern volatile int nofrendo_ticks; /* system timer ticks */
/* osd_main should end with a call to main_loop().
** Pass filename = NULL if you want to start with the demo rom
*/
extern int main_loop(const char *filename, system_t type);
/* These should not be called directly. Use the event interface */
extern void main_insert(const char *filename, system_t type);
extern void main_eject(void);
extern void main_quit(void);
#ifdef NOLOOP
extern void nes_step(int skip);
#endif
#endif /* !_NOFRENDO_H_ */
/*
** $Log: nofrendo.h,v $
** Revision 1.2 2001/04/27 11:10:08 neil
** compile
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.9 2000/11/25 20:26:05 matt
** removed fds "system"
**
** Revision 1.8 2000/11/20 13:22:12 matt
** standardized timer ISR, added nofrendo_ticks
**
** Revision 1.7 2000/11/01 14:15:35 matt
** multi-system event system, or whatever
**
** Revision 1.6 2000/10/25 13:42:02 matt
** strdup - giddyap!
**
** Revision 1.5 2000/10/25 01:23:08 matt
** basic system autodetection
**
** Revision 1.4 2000/10/23 15:52:04 matt
** better system handling
**
** Revision 1.3 2000/07/31 04:28:46 matt
** one million cleanups
**
** Revision 1.2 2000/07/27 01:16:36 matt
** sorted out the video problems
**
** Revision 1.1 2000/07/26 21:36:13 neil
** Big honkin' change -- see the mailing list
**
**
*/

View file

@ -0,0 +1,121 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** types.h
**
** Data type definitions
** $Id: noftypes.h,v 1.1 2001/04/27 14:37:11 neil Exp $
*/
#ifndef _TYPES_H_
#define _TYPES_H_
/* Define this if running on little-endian (x86) systems */
#define HOST_LITTLE_ENDIAN
#ifdef __GNUC__
#define INLINE static inline
#define ZERO_LENGTH 0
#elif defined(WIN32)
#define INLINE static __inline
#define ZERO_LENGTH 0
#else /* crapintosh? */
#define INLINE static
#define ZERO_LENGTH 1
#endif
/* quell stupid compiler warnings */
#define UNUSED(x) ((x) = (x))
typedef signed char int8;
typedef signed short int16;
typedef signed int int32;
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned int uint32;
#ifndef __cplusplus
typedef enum
{
false = 0,
true = 1
} bool;
#ifndef NULL
#define NULL ((void *) 0)
#endif
#endif /* !__cplusplus */
#include "log.h"
#ifdef NOFRENDO_DEBUG
#define ASSERT(expr) log_assert((int) (expr), __LINE__, __FILE__, NULL)
#define ASSERT_MSG(msg) log_assert(false, __LINE__, __FILE__, (msg))
#else /* !NOFRENDO_DEBUG */
#define ASSERT(expr)
#define ASSERT_MSG(msg)
#endif /* !NOFRENDO_DEBUG */
#endif /* _TYPES_H_ */
/*
** $Log: noftypes.h,v $
** Revision 1.1 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.15 2000/11/05 16:37:18 matt
** rolled rgb.h into bitmap.h
**
** Revision 1.14 2000/10/17 03:22:16 matt
** safe UNUSED
**
** Revision 1.13 2000/10/10 13:58:14 matt
** stroustrup squeezing his way in the door
**
** Revision 1.12 2000/10/10 13:03:54 matt
** Mr. Clean makes a guest appearance
**
** Revision 1.11 2000/08/11 01:44:05 matt
** cosmeses
**
** Revision 1.10 2000/07/31 04:28:47 matt
** one million cleanups
**
** Revision 1.9 2000/07/24 04:30:17 matt
** ASSERTs should have been calling log_shutdown
**
** Revision 1.8 2000/07/17 01:52:28 matt
** made sure last line of all source files is a newline
**
** Revision 1.7 2000/07/04 04:46:44 matt
** moved INLINE define from osd.h
**
** Revision 1.6 2000/06/09 15:12:25 matt
** initial revision
**
*/

View file

@ -0,0 +1,188 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** osd.h
**
** O/S dependent routine defintions (must be customized)
** $Id: osd.h,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#ifndef _OSD_H_
#define _OSD_H_
#include <limits.h>
#ifndef PATH_MAX
#define PATH_MAX 512
#endif /* PATH_MAX */
#ifdef __GNUC__
#define __PACKED__ __attribute__ ((packed))
#ifdef __DJGPP__
#define PATH_SEP '\\'
#else /* !__DJGPP__ */
#define PATH_SEP '/'
#endif /* !__DJGPP__ */
#elif defined(WIN32)
#define __PACKED__
#define PATH_SEP '\\'
#else /* !defined(WIN32) && !__GNUC__ */
#define __PACKED__
#define PATH_SEP ':'
#endif /* !defined(WIN32) && !__GNUC__ */
#if !defined(WIN32) && !defined(__DJGPP__)
#define stricmp strcasecmp
#endif /* !WIN32 && !__DJGPP__ */
extern void osd_setsound(void (*playfunc)(void *buffer, int size));
#ifndef NSF_PLAYER
#include "noftypes.h"
#include "vid_drv.h"
typedef struct vidinfo_s
{
int default_width, default_height;
viddriver_t *driver;
} vidinfo_t;
typedef struct sndinfo_s
{
int sample_rate;
int bps;
} sndinfo_t;
/* get info */
extern void osd_getvideoinfo(vidinfo_t *info);
extern void osd_getsoundinfo(sndinfo_t *info);
/* init / shutdown */
extern int osd_init(void);
extern void osd_shutdown(void);
extern int osd_main(int argc, char *argv[]);
extern int osd_installtimer(int frequency, void *func, int funcsize,
void *counter, int countersize);
/* filename manipulation */
extern void osd_fullname(char *fullname, const char *shortname);
extern char *osd_newextension(char *string, char *ext);
/* input */
extern void osd_getinput(void);
extern void osd_getmouse(int *x, int *y, int *button);
/* build a filename for a snapshot, return -ve for error */
extern int osd_makesnapname(char *filename, int len);
#endif /* !NSF_PLAYER */
#endif /* _OSD_H_ */
/*
** $Log: osd.h,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.30 2000/11/05 22:53:13 matt
** only one video driver per system, please
**
** Revision 1.29 2000/11/05 06:23:41 matt
** thinlib spawns changes
**
** Revision 1.28 2000/10/22 19:15:39 matt
** more sane timer ISR / autoframeskip
**
** Revision 1.27 2000/10/21 19:25:59 matt
** many more cleanups
**
** Revision 1.26 2000/10/10 13:03:53 matt
** Mr. Clean makes a guest appearance
**
** Revision 1.25 2000/10/02 15:01:12 matt
** frag size has been removed
**
** Revision 1.24 2000/08/31 02:40:18 matt
** fixed some crap
**
** Revision 1.23 2000/08/16 02:57:14 matt
** changed video interface a wee bit
**
** Revision 1.22 2000/08/11 01:46:30 matt
** new OSD sound information interface
**
** Revision 1.21 2000/08/04 15:01:32 neil
** BeOS cleanups
**
** Revision 1.20 2000/08/04 14:36:14 neil
** BeOS is working.. kinda
**
** Revision 1.19 2000/07/26 21:36:13 neil
** Big honkin' change -- see the mailing list
**
** Revision 1.18 2000/07/23 16:21:35 neil
** neither stricmp nor strcasecmp works everywhere
**
** Revision 1.17 2000/07/23 15:17:40 matt
** osd_getfragsize
**
** Revision 1.16 2000/07/21 13:37:20 neil
** snap filenames are OS-dependent
**
** Revision 1.15 2000/07/21 04:58:37 matt
** new osd_main structure
**
** Revision 1.14 2000/07/21 04:26:15 matt
** added some nasty externs
**
** Revision 1.13 2000/07/21 02:42:45 matt
** merged osd_getinput and osd_gethostinput
**
** Revision 1.12 2000/07/19 13:10:35 neil
** PATH_MAX
**
** Revision 1.11 2000/07/10 03:04:15 matt
** removed scanlines, backbuffer from custom blit
**
** Revision 1.10 2000/07/06 16:48:25 matt
** new video driver
**
** Revision 1.9 2000/07/05 17:26:16 neil
** Moved the externs in nofrendo.c to osd.h
**
** Revision 1.8 2000/07/04 23:07:06 matt
** djgpp path separator bugfix
**
** Revision 1.7 2000/07/04 04:45:33 matt
** moved INLINE define into types.h
**
** Revision 1.6 2000/06/29 16:06:18 neil
** Wrapped DOS-specific headers in an ifdef
**
** Revision 1.5 2000/06/09 15:12:25 matt
** initial revision
**
*/

View file

@ -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

View file

@ -0,0 +1,205 @@
extern "C" {
#include "iopins.h"
#include "emuapi.h"
}
#include "keyboard_osd.h"
#include "nes_emu.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
}
}
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, 20000); //to run every 20ms
}
delay(20);
}
else {
uint16_t bClick = emu_DebounceLocalKeys();
emu_Input(bClick);
emu_Step();
delay(10);
//uint16_t bClick = emu_DebounceLocalKeys();
//if (bClick & MASK_KEY_USER1) {
// 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

File diff suppressed because it is too large Load diff

View file

@ -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 256
#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

View file

@ -0,0 +1,14 @@
#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

View file

@ -0,0 +1,65 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** version.h
**
** Program name / version definitions
** $Id: version.h,v 1.2 2001/05/05 16:50:49 neil Exp $
*/
#ifndef _VERSION_H_
#define _VERSION_H_
#ifdef NSF_PLAYER
#define APP_STRING "Nosefart"
#else
#define APP_STRING "Nofrendo"
#endif /* NSF_PLAYER */
#define APP_VERSION "2.0"
#endif /* _VERSION_H_ */
/*
** $Log: version.h,v $
** Revision 1.2 2001/05/05 16:50:49 neil
** preparing for distribution
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.9 2000/07/31 04:28:47 matt
** one million cleanups
**
** Revision 1.8 2000/07/17 01:52:28 matt
** made sure last line of all source files is a newline
**
** Revision 1.7 2000/07/04 04:46:55 matt
** updated version number
**
** Revision 1.6 2000/06/20 00:03:39 matt
** updated for 1.91
**
** Revision 1.5 2000/06/09 17:01:56 matt
** changed version to 1.90
**
** Revision 1.4 2000/06/09 15:12:25 matt
** initial revision
**
*/

View file

@ -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

View file

@ -0,0 +1,559 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** vid_drv.c
**
** Video driver
** $Id: vid_drv.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include <string.h>
#include "noftypes.h"
#include "log.h"
#include "bitmap.h"
#include "vid_drv.h"
#include "osd.h"
/* hardware surface */
static bitmap_t *screen = NULL;
/* primary / backbuffer surfaces */
static bitmap_t *primary_buffer = NULL; //, *back_buffer = NULL;
static viddriver_t *driver = NULL;
/* fast automagic loop unrolling */
#define DUFFS_DEVICE(transfer, count) \
{ \
register int n = (count + 7) / 8; \
switch (count % 8) \
{ \
case 0: do { { transfer; } \
case 7: { transfer; } \
case 6: { transfer; } \
case 5: { transfer; } \
case 4: { transfer; } \
case 3: { transfer; } \
case 2: { transfer; } \
case 1: { transfer; } \
} while (--n > 0); \
} \
}
/* some system dependent replacement routines (for speed) */
INLINE int vid_memcmp(const void *p1, const void *p2, int len)
{
/* check for 32-bit aligned data */
if (0 == (((uint32) p1 & 3) | ((uint32) p2 & 3)))
{
uint32 *dw1 = (uint32 *) p1;
uint32 *dw2 = (uint32 *) p2;
len >>= 2;
DUFFS_DEVICE(if (*dw1++ != *dw2++) return -1, len);
}
else
/* fall back to 8-bit compares */
{
uint8 *b1 = (uint8 *) p1;
uint8 *b2 = (uint8 *) p2;
DUFFS_DEVICE(if (*b1++ != *b2++) return -1, len);
}
return 0;
}
/* super-dooper assembly memcpy (thanks, SDL!) */
#if defined(__GNUC__) && defined(i386)
#define vid_memcpy(dest, src, len) \
{ \
int u0, u1, u2; \
__asm__ __volatile__ ( \
" cld \n" \
" rep \n" \
" movsl \n" \
" testb $2,%b4 \n" \
" je 1f \n" \
" movsw \n" \
"1: \n" \
" testb $1,%b4 \n" \
" je 2f \n" \
" movsb \n" \
"2: \n" \
: "=&c" (u0), "=&D" (u1), "=&S" (u2) \
: "0" ((len)/4), "q" (len), "1" (dest), "2" (src) \
: "memory"); \
}
#else /* !(defined(__GNUC__) && defined(i386)) */
INLINE void vid_memcpy(void *dest, const void *src, int len)
{
uint32 *s = (uint32 *) src;
uint32 *d = (uint32 *) dest;
ASSERT(0 == ((len & 3) | ((uint32) src & 3) | ((uint32) dest & 3)));
len >>= 2;
DUFFS_DEVICE(*d++ = *s++, len);
}
#endif /* !(defined(__GNUC__) && defined(i386)) */
extern bitmap_t *lock_write(void);
/* TODO: any way to remove this filth (GUI needs it)? */
bitmap_t *vid_getbuffer(void)
{
return primary_buffer;
}
void vid_setpalette(rgb_t *p)
{
ASSERT(driver);
ASSERT(p);
driver->set_palette(p);
}
/* blits a bitmap onto primary buffer */
void vid_blit(bitmap_t *bitmap, int src_x, int src_y, int dest_x, int dest_y,
int width, int height)
{
int bitmap_pitch, primary_pitch;
uint8 *dest_ptr, *src_ptr;
ASSERT(bitmap);
/* clip to source */
if (src_y >= bitmap->height)
return;
if (src_y + height > bitmap->height)
height = bitmap->height - src_y;
if (src_x >= bitmap->width)
return;
if (src_x + width > bitmap->width)
width = bitmap->width - src_x;
/* clip to dest */
if (dest_y + height <= 0)
{
return;
}
else if (dest_y < 0)
{
height += dest_y;
src_y -= dest_y;
dest_y = 0;
}
if (dest_y >= primary_buffer->height)
return;
if (dest_y + height > primary_buffer->height)
height = primary_buffer->height - dest_y;
if (dest_x + width <= 0)
{
return;
}
else if (dest_x < 0)
{
width += dest_x;
src_x -= dest_x;
dest_x = 0;
}
if (dest_x >= primary_buffer->width)
return;
if (dest_x + width > primary_buffer->width)
width = primary_buffer->width - dest_x;
src_ptr = bitmap->line[src_y] + src_x;
dest_ptr = primary_buffer->line[dest_y] + dest_x;
/* Avoid doing unnecessary indexed lookups */
bitmap_pitch = bitmap->pitch;
primary_pitch = primary_buffer->pitch;
/* do the copy */
while (height--)
{
vid_memcpy(dest_ptr, src_ptr, width);
src_ptr += bitmap_pitch;
dest_ptr += primary_pitch;
}
}
static void vid_blitscreen(int num_dirties, rect_t *dirty_rects)
{
int src_x, src_y, dest_x, dest_y;
int blit_width, blit_height;
screen = driver->lock_write();
/* center in y direction */
if (primary_buffer->height <= screen->height)
{
src_y = 0;
blit_height = primary_buffer->height;
dest_y = (screen->height - blit_height) >> 1;
}
else
{
src_y = (primary_buffer->height - screen->height) >> 1;
blit_height = screen->height;
dest_y = 0;
}
/* and in x */
if (primary_buffer->width <= screen->width)
{
src_x = 0;
blit_width = primary_buffer->width;
dest_x = (screen->width - blit_width) >> 1;
}
else
{
src_x = (primary_buffer->width - screen->width) >> 1;
blit_width = screen->width;
dest_x = 0;
}
/* should we just copy the entire screen? */
if (-1 == num_dirties)
{
uint8 *dest, *src;
src = primary_buffer->line[src_y] + src_x;
dest = screen->line[dest_y] + dest_x;
while (blit_height--)
{
vid_memcpy(dest, src, primary_buffer->width);
src += primary_buffer->pitch;
dest += screen->pitch;
}
}
else
{
/* we need to blit just a bunch of dirties */
int i, j, height;
rect_t *rects = dirty_rects;
for (i = 0; i < num_dirties && blit_height; i++)
{
height = rects->h;
if (blit_height < height)
height = blit_height;
j = 0;
DUFFS_DEVICE(
{
vid_memcpy(screen->line[dest_y + rects->y + j] + rects->x + dest_x,
primary_buffer->line[src_y + rects->y + j] + rects->x + src_x,
rects->w);
j++;
blit_height--;
}, height);
rects++;
}
}
if (driver->free_write)
driver->free_write(num_dirties, dirty_rects);
}
/* TODO: this code is sickly */
#define CHUNK_WIDTH 256
#define CHUNK_HEIGHT 16
#define MAX_DIRTIES ((256 / CHUNK_WIDTH) * (240 / CHUNK_HEIGHT))
#define DIRTY_CUTOFF ((3 * MAX_DIRTIES) / 4)
#if 0
INLINE int calc_dirties(rect_t *list)
{
bool dirty;
int num_dirties = 0;
int i = 0, j, line_offset = 0;
int iterations = primary_buffer->height / CHUNK_HEIGHT;
for (i = 0; i < iterations; i++)
{
dirty = false;
j = line_offset;
DUFFS_DEVICE(
{
if (vid_memcmp(back_buffer->line[j], primary_buffer->line[j],
CHUNK_WIDTH))
{
dirty = true;
break;
}
j++;
}, CHUNK_HEIGHT);
if (true == dirty)
{
list->h = CHUNK_HEIGHT;
list->w = CHUNK_WIDTH;
list->x = 0;
list->y = line_offset;
list++;
/* totally arbitrary at this point */
if (++num_dirties > DIRTY_CUTOFF)
return -1;
}
line_offset += CHUNK_HEIGHT;
}
return num_dirties;
}
#endif
void vid_flush(void)
{
bitmap_t *temp;
int num_dirties;
rect_t dirty_rects[MAX_DIRTIES];
ASSERT(driver);
if (true == driver->invalidate)
{
driver->invalidate = false;
num_dirties = -1;
}
else
{
//num_dirties = calc_dirties(dirty_rects);
num_dirties = -1;
}
if (driver->custom_blit)
driver->custom_blit(primary_buffer, num_dirties, dirty_rects);
else
vid_blitscreen(num_dirties, dirty_rects);
/* Swap pointers to the main/back buffers */
// temp = back_buffer;
// back_buffer = primary_buffer;
// primary_buffer = temp;
}
/* emulated machine tells us which resolution it wants */
int vid_setmode(int width, int height)
{
if (NULL != primary_buffer)
bmp_destroy(&primary_buffer);
// if (NULL != back_buffer)
// bmp_destroy(&back_buffer);
primary_buffer = bmp_create(width, height, 0); /* no overdraw */
if (NULL == primary_buffer)
return -1;
return 0;
}
static int vid_findmode(int width, int height, viddriver_t *osd_driver)
{
if (osd_driver->init(width, height))
{
driver = NULL;
return -1; /* mode not available! */
}
/* we got our driver */
driver = osd_driver;
/* re-assert dimensions, clear the surface */
screen = driver->lock_write();
/* release surface */
if (driver->free_write)
driver->free_write(-1, NULL);
log_printf("video driver: %s at %dx%d\n", driver->name,
screen->width, screen->height);
return 0;
}
/* This is the interface to the drivers, used in nofrendo.c */
int vid_init(int width, int height, viddriver_t *osd_driver)
{
if (vid_findmode(width, height, osd_driver))
{
log_printf("video initialization failed for %s at %dx%d\n",
osd_driver->name, width, height);
return -1;
}
log_printf("vid_init done\n");
return 0;
}
void vid_shutdown(void)
{
if (NULL == driver)
return;
if (NULL != primary_buffer)
bmp_destroy(&primary_buffer);
#if 0
if (NULL != back_buffer)
bmp_destroy(&back_buffer);
#endif
if (driver && driver->shutdown)
driver->shutdown();
}
/*
** $Log: vid_drv.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.40 2000/11/25 20:26:42 matt
** not much
**
** Revision 1.39 2000/11/16 14:27:27 matt
** even more crash-proofness
**
** Revision 1.38 2000/11/16 14:11:18 neil
** Better *not* to crash in case of catastrophic failure in the driver
**
** Revision 1.37 2000/11/13 00:55:16 matt
** no dirties seems to be faster (!?!?)
**
** Revision 1.36 2000/11/06 05:16:18 matt
** minor clipping bug
**
** Revision 1.35 2000/11/06 02:16:26 matt
** cleanups
**
** Revision 1.34 2000/11/05 22:53:13 matt
** only one video driver per system, please
**
** Revision 1.33 2000/11/05 16:37:18 matt
** rolled rgb.h into bitmap.h
**
** Revision 1.32 2000/11/05 06:23:41 matt
** thinlib spawns changes
**
** Revision 1.31 2000/10/10 13:58:14 matt
** stroustrup squeezing his way in the door
**
** Revision 1.30 2000/10/10 13:03:53 matt
** Mr. Clean makes a guest appearance
**
** Revision 1.29 2000/10/08 17:58:23 matt
** lock_read() should not allow us to clear the bitmap
**
** Revision 1.28 2000/09/18 02:06:48 matt
** -pedantic is your friend
**
** Revision 1.27 2000/08/16 02:53:05 matt
** changed init() interface a wee bit
**
** Revision 1.26 2000/08/14 02:45:59 matt
** fixed nasty bug in vid_blitscreen
**
** Revision 1.24 2000/08/11 01:44:37 matt
** clipping bugfix
**
** Revision 1.23 2000/07/31 04:28:47 matt
** one million cleanups
**
** Revision 1.22 2000/07/28 07:25:49 neil
** Video driver has an invalidate flag, telling vid_drv not to calculate dirties for the next frame
**
** Revision 1.21 2000/07/28 03:51:45 matt
** lock_read used instead of lock_write in some places
**
** Revision 1.20 2000/07/28 01:24:05 matt
** dirty rectangle support
**
** Revision 1.19 2000/07/27 23:49:52 matt
** no more getmode
**
** Revision 1.18 2000/07/27 04:30:37 matt
** change to get_mode api
**
** Revision 1.17 2000/07/27 04:05:58 matt
** changed place where name goes
**
** Revision 1.16 2000/07/27 01:16:22 matt
** api changes for new main and dirty rects
**
** Revision 1.15 2000/07/26 21:36:13 neil
** Big honkin' change -- see the mailing list
**
** Revision 1.14 2000/07/24 04:33:57 matt
** skeleton of dirty rectangle code in place
**
** Revision 1.13 2000/07/23 14:35:39 matt
** cleanups
**
** Revision 1.12 2000/07/18 19:41:26 neil
** use screen->pitch in blitscreen, not screen_width
**
** Revision 1.11 2000/07/11 04:30:16 matt
** overdraw unnecessary!
**
** Revision 1.10 2000/07/10 19:07:57 matt
** added custom clear() member call to video driver
**
** Revision 1.9 2000/07/10 03:06:49 matt
** my dependency file is broken... *snif*
**
** Revision 1.8 2000/07/10 03:04:15 matt
** removed scanlines, backbuffer from custom blit
**
** Revision 1.7 2000/07/10 01:03:20 neil
** New video scheme allows for custom blitters to be determined by the driver at runtime
**
** Revision 1.6 2000/07/09 03:34:46 matt
** temporary cleanup
**
** Revision 1.5 2000/07/08 23:48:29 neil
** Another assumption GGI kills: pitch == width for hardware bitmaps
**
** Revision 1.4 2000/07/07 20:18:03 matt
** added overdraw, fixed some bugs in blitters
**
** Revision 1.3 2000/07/07 18:33:55 neil
** no need to lock for reading just to get the dimensions
**
** Revision 1.2 2000/07/07 18:11:37 neil
** Generalizing the video driver
**
** Revision 1.1 2000/07/06 16:48:47 matt
** initial revision
**
*/

View file

@ -0,0 +1,145 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** vid_drv.h
**
** Video driver
** $Id: vid_drv.h,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#ifndef _VID_DRV_H_
#define _VID_DRV_H_
#include "bitmap.h"
typedef struct viddriver_s
{
/* name of driver */
const char *name;
/* init function - return 0 on success, nonzero on failure */
int (*init)(int width, int height);
/* clean up after driver (can be NULL) */
void (*shutdown)(void);
/* set a video mode - return 0 on success, nonzero on failure */
int (*set_mode)(int width, int height);
/* set up a palette */
void (*set_palette)(rgb_t *palette);
/* custom bitmap clear (can be NULL) */
void (*clear)(uint8 color);
/* lock surface for writing (required) */
bitmap_t *(*lock_write)(void);
/* free a locked surface (can be NULL) */
void (*free_write)(int num_dirties, rect_t *dirty_rects);
/* custom blitter - num_dirties == -1 if full blit required */
void (*custom_blit)(bitmap_t *primary, int num_dirties,
rect_t *dirty_rects);
/* immediately invalidate the buffer, i.e. full redraw */
bool invalidate;
} viddriver_t;
/* TODO: filth */
extern bitmap_t *vid_getbuffer(void);
extern int vid_init(int width, int height, viddriver_t *osd_driver);
extern void vid_shutdown(void);
extern int vid_setmode(int width, int height);
extern void vid_setpalette(rgb_t *pal);
extern void vid_blit(bitmap_t *bitmap, int src_x, int src_y, int dest_x,
int dest_y, int blit_width, int blit_height);
extern void vid_flush(void);
#endif /* _VID_DRV_H_ */
/*
** $Log: vid_drv.h,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.22 2000/11/05 22:53:13 matt
** only one video driver per system, please
**
** Revision 1.21 2000/11/05 16:37:18 matt
** rolled rgb.h into bitmap.h
**
** Revision 1.20 2000/11/05 06:23:41 matt
** thinlib spawns changes
**
** Revision 1.19 2000/10/10 13:58:14 matt
** stroustrup squeezing his way in the door
**
** Revision 1.18 2000/10/10 13:03:54 matt
** Mr. Clean makes a guest appearance
**
** Revision 1.17 2000/08/16 02:53:04 matt
** changed init() interface a wee bit
**
** Revision 1.16 2000/07/31 04:28:47 matt
** one million cleanups
**
** Revision 1.15 2000/07/28 07:25:49 neil
** Video driver has an invalidate flag, telling vid_drv not to calculate dirties for the next frame
**
** Revision 1.14 2000/07/27 23:49:52 matt
** no more getmode
**
** Revision 1.13 2000/07/27 04:30:37 matt
** change to get_mode api
**
** Revision 1.12 2000/07/27 04:08:04 matt
** char * -> const char *
**
** Revision 1.11 2000/07/27 04:05:58 matt
** changed place where name goes
**
** Revision 1.10 2000/07/27 01:16:22 matt
** api changes for new main and dirty rects
**
** Revision 1.9 2000/07/26 21:36:14 neil
** Big honkin' change -- see the mailing list
**
** Revision 1.8 2000/07/24 04:33:57 matt
** skeleton of dirty rectangle code in place
**
** Revision 1.7 2000/07/10 19:07:57 matt
** added custom clear() member call to video driver
**
** Revision 1.6 2000/07/10 03:04:15 matt
** removed scanlines, backbuffer from custom blit
**
** Revision 1.5 2000/07/10 01:03:20 neil
** New video scheme allows for custom blitters to be determined by the driver at runtime
**
** Revision 1.4 2000/07/09 03:34:47 matt
** temporary cleanup
**
** Revision 1.3 2000/07/07 20:17:35 matt
** better custom blitting support
**
** Revision 1.2 2000/07/07 18:11:38 neil
** Generalizing the video driver
**
** Revision 1.1 2000/07/06 16:48:47 matt
** initial revision
**
*/

View file

@ -0,0 +1,278 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** vrcvisnd.c
**
** VRCVI sound hardware emulation
** $Id: vrcvisnd.c,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#include "noftypes.h"
#include "vrcvisnd.h"
#include "nes_apu.h"
typedef struct vrcvirectangle_s
{
bool enabled;
uint8 reg[3];
float accum;
uint8 adder;
int32 freq;
int32 volume;
uint8 duty_flip;
} vrcvirectangle_t;
typedef struct vrcvisawtooth_s
{
bool enabled;
uint8 reg[3];
float accum;
uint8 adder;
uint8 output_acc;
int32 freq;
uint8 volume;
} vrcvisawtooth_t;
typedef struct vrcvisnd_s
{
vrcvirectangle_t rectangle[2];
vrcvisawtooth_t saw;
float incsize;
} vrcvisnd_t;
static vrcvisnd_t vrcvi;
/* VRCVI rectangle wave generation */
static int32 vrcvi_rectangle(vrcvirectangle_t *chan)
{
/* reg0: 0-3=volume, 4-6=duty cycle
** reg1: 8 bits of freq
** reg2: 0-3=high freq, 7=enable
*/
chan->accum -= vrcvi.incsize; /* # of clocks per wave cycle */
while (chan->accum < 0)
{
chan->accum += chan->freq;
chan->adder = (chan->adder + 1) & 0x0F;
}
/* return if not enabled */
if (false == chan->enabled)
return 0;
if (chan->adder < chan->duty_flip)
return -(chan->volume);
else
return chan->volume;
}
/* VRCVI sawtooth wave generation */
static int32 vrcvi_sawtooth(vrcvisawtooth_t *chan)
{
/* reg0: 0-5=phase accumulator bits
** reg1: 8 bits of freq
** reg2: 0-3=high freq, 7=enable
*/
chan->accum -= vrcvi.incsize; /* # of clocks per wav cycle */
while (chan->accum < 0)
{
chan->accum += chan->freq;
chan->output_acc += chan->volume;
chan->adder++;
if (7 == chan->adder)
{
chan->adder = 0;
chan->output_acc = 0;
}
}
/* return if not enabled */
if (false == chan->enabled)
return 0;
return (chan->output_acc >> 3) << 9;
}
/* mix vrcvi sound channels together */
static int32 vrcvi_process(void)
{
int32 output;
output = vrcvi_rectangle(&vrcvi.rectangle[0]);
output += vrcvi_rectangle(&vrcvi.rectangle[1]);
output += vrcvi_sawtooth(&vrcvi.saw);
return output;
}
/* write to registers */
static void vrcvi_write(uint32 address, uint8 value)
{
int chan = (address >> 12) - 9;
switch (address & 0xB003)
{
case 0x9000:
case 0xA000:
vrcvi.rectangle[chan].reg[0] = value;
vrcvi.rectangle[chan].volume = (value & 0x0F) << 8;
vrcvi.rectangle[chan].duty_flip = (value >> 4) + 1;
break;
case 0x9001:
case 0xA001:
vrcvi.rectangle[chan].reg[1] = value;
vrcvi.rectangle[chan].freq = ((vrcvi.rectangle[chan].reg[2] & 0x0F) << 8) + value + 1;
break;
case 0x9002:
case 0xA002:
vrcvi.rectangle[chan].reg[2] = value;
vrcvi.rectangle[chan].freq = ((value & 0x0F) << 8) + vrcvi.rectangle[chan].reg[1] + 1;
vrcvi.rectangle[chan].enabled = (value & 0x80) ? true : false;
break;
case 0xB000:
vrcvi.saw.reg[0] = value;
vrcvi.saw.volume = value & 0x3F;
break;
case 0xB001:
vrcvi.saw.reg[1] = value;
vrcvi.saw.freq = (((vrcvi.saw.reg[2] & 0x0F) << 8) + value + 1) << 1;
break;
case 0xB002:
vrcvi.saw.reg[2] = value;
vrcvi.saw.freq = (((value & 0x0F) << 8) + vrcvi.saw.reg[1] + 1) << 1;
vrcvi.saw.enabled = (value & 0x80) ? true : false;
break;
default:
break;
}
}
/* reset state of vrcvi sound channels */
static void vrcvi_reset(void)
{
int i;
apu_t apu;
/* get the phase period from the apu */
apu_getcontext(&apu);
vrcvi.incsize = apu.cycle_rate;
/* preload regs */
for (i = 0; i < 3; i++)
{
vrcvi_write(0x9000 + i, 0);
vrcvi_write(0xA000 + i, 0);
vrcvi_write(0xB000 + i, 0);
}
}
static apu_memwrite vrcvi_memwrite[] =
{
{ 0x9000, 0x9002, vrcvi_write }, /* vrc6 */
{ 0xA000, 0xA002, vrcvi_write },
{ 0xB000, 0xB002, vrcvi_write },
{ -1, -1, NULL }
};
apuext_t vrcvi_ext =
{
NULL, /* no init */
NULL, /* no shutdown */
vrcvi_reset,
vrcvi_process,
NULL, /* no reads */
vrcvi_memwrite
};
/*
** $Log: vrcvisnd.c,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.2 2000/11/05 22:21:00 matt
** help me!
**
** Revision 1.1 2000/10/24 12:20:00 matt
** changed directory structure
**
** Revision 1.17 2000/10/10 13:58:18 matt
** stroustrup squeezing his way in the door
**
** Revision 1.16 2000/10/03 11:56:20 matt
** better support for optional sound ext routines
**
** Revision 1.15 2000/09/27 12:26:03 matt
** changed sound accumulators back to floats
**
** Revision 1.14 2000/09/15 13:38:40 matt
** changes for optimized apu core
**
** Revision 1.13 2000/09/15 04:58:07 matt
** simplifying and optimizing APU core
**
** Revision 1.12 2000/07/30 04:32:59 matt
** no more apu_getcyclerate hack
**
** Revision 1.11 2000/07/17 01:52:31 matt
** made sure last line of all source files is a newline
**
** Revision 1.10 2000/07/06 11:42:41 matt
** forgot to remove FDS register range
**
** Revision 1.9 2000/07/04 04:51:41 matt
** cleanups
**
** Revision 1.8 2000/07/03 02:18:53 matt
** much better external module exporting
**
** Revision 1.7 2000/06/20 04:06:16 matt
** migrated external sound definition to apu module
**
** Revision 1.6 2000/06/20 00:08:58 matt
** changed to driver based API
**
** Revision 1.5 2000/06/09 16:49:02 matt
** removed all floating point from sound generation
**
** Revision 1.4 2000/06/09 15:12:28 matt
** initial revision
**
*/

View file

@ -0,0 +1,70 @@
/*
** Nofrendo (c) 1998-2000 Matthew Conte (matt@conte.com)
**
**
** This program 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 program 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., 675 Mass Ave, Cambridge, MA 02139, USA.
**
** Any permitted reproduction of these routines, in whole or in part,
** must bear this legend.
**
**
** vrcvisnd.h
**
** VRCVI (Konami MMC) sound hardware emulation header
** $Id: vrcvisnd.h,v 1.2 2001/04/27 14:37:11 neil Exp $
*/
#ifndef _VRCVISND_H_
#define _VRCVISND_H_
#include "nes_apu.h"
extern apuext_t vrcvi_ext;
#endif /* _VRCVISND_H_ */
/*
** $Log: vrcvisnd.h,v $
** Revision 1.2 2001/04/27 14:37:11 neil
** wheeee
**
** Revision 1.1 2001/04/27 12:54:40 neil
** blah
**
** Revision 1.1.1.1 2001/04/27 07:03:54 neil
** initial
**
** Revision 1.1 2000/10/24 12:20:00 matt
** changed directory structure
**
** Revision 1.10 2000/09/27 12:26:03 matt
** changed sound accumulators back to floats
**
** Revision 1.9 2000/09/15 13:38:40 matt
** changes for optimized apu core
**
** Revision 1.8 2000/07/17 01:52:31 matt
** made sure last line of all source files is a newline
**
** Revision 1.7 2000/06/20 04:06:16 matt
** migrated external sound definition to apu module
**
** Revision 1.6 2000/06/20 00:08:58 matt
** changed to driver based API
**
** Revision 1.5 2000/06/09 16:49:02 matt
** removed all floating point from sound generation
**
** Revision 1.4 2000/06/09 15:12:28 matt
** initial revision
**
*/