diff --git a/MCUME_pico/CMakeLists.txt b/MCUME_pico/CMakeLists.txt index 6c5ed42..cee186c 100644 --- a/MCUME_pico/CMakeLists.txt +++ b/MCUME_pico/CMakeLists.txt @@ -69,6 +69,22 @@ set(PICO5200_SOURCES pico5200/pico5200.cpp ) +set(PICO20_SOURCES + pico20/IC.cpp +# pico20/MOS6502.cpp +# pico20/Register8.cpp +# pico20/Register16.cpp +# pico20/cpu.cpp +# pico20/cpu.c + pico20/mos6502.cpp + pico20/MOS6522.cpp + pico20/MOS6561.cpp + pico20/v20.cpp + pico20/emuapi.cpp + pico20/AudioPlaySystem.cpp + pico20/pico20.cpp + ) + set(PICO64_SOURCES pico64/c64.cpp pico64/cia1.cpp @@ -268,7 +284,8 @@ set(TESTPSRAM_SOURCES #add_compile_definitions(OVERRULE_WIDTH=320 OVERRULE_HEIGHT=192) add_executable(mcume # ${GFXENGINE_SOURCES} - ${PICO64_SOURCES} + ${PICO20_SOURCES} +# ${PICO64_SOURCES} # ${PICO81_SOURCES} # ${PICO800_SOURCES} # ${PICO5200_SOURCES} diff --git a/MCUME_pico/bin/MCUME_REV2/DUALSCREEN/mcume_pico20.uf2 b/MCUME_pico/bin/MCUME_REV2/DUALSCREEN/mcume_pico20.uf2 new file mode 100644 index 0000000..6400fdd Binary files /dev/null and b/MCUME_pico/bin/MCUME_REV2/DUALSCREEN/mcume_pico20.uf2 differ diff --git a/MCUME_pico/bin/MCUME_REV2/VGA/mcume_pico20.uf2 b/MCUME_pico/bin/MCUME_REV2/VGA/mcume_pico20.uf2 new file mode 100644 index 0000000..17d2f43 Binary files /dev/null and b/MCUME_pico/bin/MCUME_REV2/VGA/mcume_pico20.uf2 differ diff --git a/MCUME_pico/bin/PICOMPUTERMAX/mcume_pico20.uf2 b/MCUME_pico/bin/PICOMPUTERMAX/mcume_pico20.uf2 index c2d23c2..337a964 100644 Binary files a/MCUME_pico/bin/PICOMPUTERMAX/mcume_pico20.uf2 and b/MCUME_pico/bin/PICOMPUTERMAX/mcume_pico20.uf2 differ diff --git a/MCUME_pico/pico20/.DS_Store b/MCUME_pico/pico20/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/MCUME_pico/pico20/.DS_Store differ diff --git a/MCUME_pico/pico20/AudioPlaySystem.cpp b/MCUME_pico/pico20/AudioPlaySystem.cpp new file mode 100644 index 0000000..639ad5f --- /dev/null +++ b/MCUME_pico/pico20/AudioPlaySystem.cpp @@ -0,0 +1,176 @@ +#include "emuapi.h" + +#ifdef HAS_SND + +#include "AudioPlaySystem.h" + +#define SAMPLERATE AUDIO_SAMPLE_RATE_EXACT +#define CLOCKFREQ 985248 + +#ifndef CUSTOM_SND +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, +}; + +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 + +#include +void AudioPlaySystem::snd_Mixer(short * stream, int len ) +{ + if (playing) + { +#ifdef CUSTOM_SND + //printf("s\n"); + 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>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) +{ + playing = false; +} + +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) { +} +#endif diff --git a/MCUME_pico/pico20/AudioPlaySystem.h b/MCUME_pico/pico20/AudioPlaySystem.h new file mode 100644 index 0000000..5d2efc0 --- /dev/null +++ b/MCUME_pico/pico20/AudioPlaySystem.h @@ -0,0 +1,26 @@ +#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 ); +}; + +#endif + +#endif diff --git a/MCUME_pico/pico20/IC.cpp b/MCUME_pico/pico20/IC.cpp new file mode 100644 index 0000000..3687bef --- /dev/null +++ b/MCUME_pico/pico20/IC.cpp @@ -0,0 +1,21 @@ +#include "IC.h" + +IC::IC() : cycles(0) { + +} + +IC::~IC() { + +} + +uint32_t IC::getCycles() { + return this->cycles; +} + +uint32_t IC::getClockSpeed() { + return this->clockSpeed; +} + +void IC::setClockSpeed(uint32_t clock) { + this->clockSpeed = clock; +} \ No newline at end of file diff --git a/MCUME_pico/pico20/IC.h b/MCUME_pico/pico20/IC.h new file mode 100644 index 0000000..9bc0766 --- /dev/null +++ b/MCUME_pico/pico20/IC.h @@ -0,0 +1,28 @@ +#ifndef _H_IC +#define _H_IC + +#include + +/* +Simple base class for integrated circuits. +*/ +class IC { +public: + IC(); + ~IC(); + + // Getters + uint32_t getCycles(); + uint32_t getClockSpeed(); + + // Setters + void setClockSpeed(uint32_t clock); +protected: + // Derived classes handle incrementing this counter + uint32_t cycles; + + // Determines the maximum frequenzy an IC can operate in hertz + uint32_t clockSpeed; +}; + +#endif \ No newline at end of file diff --git a/MCUME_pico/pico20/MOS6502Memory.h b/MCUME_pico/pico20/MOS6502Memory.h new file mode 100644 index 0000000..71a274e --- /dev/null +++ b/MCUME_pico/pico20/MOS6502Memory.h @@ -0,0 +1,20 @@ +#ifndef _H_MOS6502MEMORY +#define _H_MOS6502MEMORY + +#include + +extern uint8_t vicmemory[]; + + +#define readWord(location) (vicmemory[location]) +#define writeWord(location,value) {vicmemory[location]=value;} +//extern uint8_t readWord( uint16_t location); +//extern void writeWord( uint16_t location, uint8_t value); + +#define silentReadWord(location) (vicmemory[location]) +#define silentWriteWord(location,value) {vicmemory[location]=value;} +#define silentReadDWord(location) (vicmemory[location] | vicmemory[location + 1] << 8) +#define silentWriteDWord(location,value) {vicmemory[location]=uint8_t(value & 0xFF); vicmemory[location + 1]=(uint8_t)((value >> 8) & 0xFF);} + + +#endif \ No newline at end of file diff --git a/MCUME_pico/pico20/MOS6522.cpp b/MCUME_pico/pico20/MOS6522.cpp new file mode 100644 index 0000000..39510d0 --- /dev/null +++ b/MCUME_pico/pico20/MOS6522.cpp @@ -0,0 +1,183 @@ +#include "MOS6522.h" +#include "MOS6502Memory.h" + +MOS6522::MOS6522() : IC() + , keyPressed(0) + , shiftPressed(false) + , cbmPressed(false) { + // Set clock speed + this->setClockSpeed(2000000); +} + +MOS6522::~MOS6522() { + +} + + +void MOS6522::setCpu(mos6502 *omos6502) { + this->omos6502 = omos6502; +} + +void MOS6522::setKeyPressed(uint16_t key) { + /* Store high byte first + = 0x9120 << 8 | 0x9121 + */ + keyPressed = key; +} + +void MOS6522::setShiftPressed(bool state) { + this->shiftPressed = state; +} + +void MOS6522::setCbmPressed(bool state) { + this->cbmPressed = state; +} + +void MOS6522::setJoyStickPressed(Vic20JoyStickButton button, bool state) { + this->joyStick[button] = state; +} + +void MOS6522::initialize() { + // Clear joystick memory + writeWord(0x9111, 0xFF); +} + +void MOS6522::tick() { + // Tick timer cycle + this->tickTimers(); + + // Handle input in this cycle + this->joy1Input(); + this->joy2Input(); + this->keyboardInput(); + + // Increment cycles counter + this->cycles += 1; +} + + +void MOS6522::joy1Input() { + // Handle joystick input on VIA1 + uint8_t via1PortAValue = silentReadWord(via1PORTA); + via1PortAValue |= 0x3c; + if (joyStick[Vic20JoyStickButton::Fire]) { + via1PortAValue &= ~0x20; + } + + if (joyStick[Vic20JoyStickButton::Up]) { + via1PortAValue &= ~0x04; + } + + if (joyStick[Vic20JoyStickButton::Down]) { + via1PortAValue &= ~0x08; + } + + if (joyStick[Vic20JoyStickButton::Left]) { + via1PortAValue &= ~0x10; + } + silentWriteWord(via1PORTA, via1PortAValue); + silentWriteWord(via1PORTAMIRROR, via1PortAValue); +} + +void MOS6522::joy2Input() { + uint8_t via2PortBValue = silentReadWord(this->via2PORTB); + // If this bit is input, set it to default value, else leave it as it is so it won't mess up keyboard input + if (!(silentReadWord(via2PortBDDR) & 0x80)) { + via2PortBValue |= 0x80; + } + // Joystick RIGHT ison VIA 2 + if (joyStick[Vic20JoyStickButton::Right]) { + via2PortBValue &= ~0x80; + } + silentWriteWord(via2PORTB, via2PortBValue); +} + +void MOS6522::keyboardInput() { + uint8_t via2PortAValue = silentReadWord(this->via2PORTA); + uint8_t via2PortBValue = silentReadWord(this->via2PORTB); + + // Get row and column of key press + uint8_t column = (keyPressed >> 8) & 0xFF; // output + uint8_t row = keyPressed & 0xFF; //input + + // Check whether keyboard should be scanned + if (via2PortBValue == 0) { + // If port b is 0 then the vic is asking whether any keys are pressed on the keyboard + via2PortAValue = keyPressed == 0 ? 0xFF : row; + } + else { + // Return keyboard row depending on column state + via2PortAValue = (via2PortBValue == column ? (row == 0 ? 0xFF : row) : 0xFF); + } + + if ((via2PortBValue == 0xF7) && shiftPressed) { + // Return row of shift key + via2PortAValue = 0xFD & (keyPressed == 0 ? 0xFF : (column == 0xF7 ? row : 0xFF)); + } else if (via2PortBValue == 0xDF && cbmPressed) { + // Return row of cbm key + via2PortAValue = 0xFE & (keyPressed == 0 ? 0xFF : (column == 0xDF ? row : 0xFF)); + } + + silentWriteWord(this->via2PORTA, via2PortAValue); + silentWriteWord(this->via2PORTAMIRROR, via2PortAValue); +} + +void MOS6522::tickTimers() { + // Grab values of timer related registers + uint8_t interruptEnable = readWord(this->irqEnableAddress); + uint8_t interruptFlags = readWord(this->irqFlagsAddress); + + // Get timer values + uint16_t timer1 = silentReadDWord(this->via2timer1DAddress); + uint16_t timer2 = silentReadDWord(this->via1timer2DAddress); + // If timer1 is active, decrement it + if (timer1 > 0) { + silentWriteDWord(this->via2timer1DAddress, --timer1); + } + if (timer1 == 0) { + // Set interrupt flag + interruptFlags |= 0x40; + silentWriteWord(this->irqFlagsAddress, interruptFlags); + } + + // If timer2 is active and no latch, decrement it + if (silentReadWord(this->via2timer2HighByteLatch) != 0) { + if (timer2 > 0) { + silentWriteDWord(this->via1timer2DAddress, --timer2); + } + if (timer2 == 0) { + // Reset high byte latch + silentWriteDWord(this->via1timer2DAddress, silentReadDWord(this->via2timer2LowByteLatch)); + silentWriteDWord(this->via2timer2HighByteLatch, 0); + // Set interrupt flag + interruptFlags |= 0x20; + silentWriteWord(this->irqFlagsAddress, interruptFlags); + } + } + + // Check if an interrupt request exists in the system + if (interruptFlags & interruptEnable & 0x7F) { + // Send an interrupt request to the cpu + //if (omos6502->interrupt()) { + if (omos6502->IRQ()) { + uint8_t auxControl = readWord(this->auxControlAddress); + // Post interrupt operation + if (interruptFlags & 0x40) { + // Determine what to do with timer based on auxiliary control register + if (auxControl & 0x40) { + // Continuous interrupt + silentWriteDWord(this->via2timer1DAddress, silentReadDWord(this->via2timer1LowByteLatch)); + } + // Reset interrupt flag + interruptFlags &= ~0x40; + silentWriteWord(irqFlagsAddress, interruptFlags); + } + + if (interruptFlags & 0x20) { + // Reset interrupt flag + interruptFlags &= ~0x20; + silentWriteWord(irqFlagsAddress, interruptFlags); + } + } + } +} diff --git a/MCUME_pico/pico20/MOS6522.h b/MCUME_pico/pico20/MOS6522.h new file mode 100644 index 0000000..4d0437f --- /dev/null +++ b/MCUME_pico/pico20/MOS6522.h @@ -0,0 +1,101 @@ +#ifndef _H_MOS6522 +#define _H_MOS6522 + +#include "IC.h" +#include "mos6502.h" + +/* +Notes, +This single object will serve as emulation +for both VIA chips in the VIC-20. + +References, +http://vic-20.appspot.com/docs/viausage.txt +http://vic-20.appspot.com/docs/vickey.txt +*/ +class MOS6522 : public IC { +public: + MOS6522(); + ~MOS6522(); + + // Joystick + enum Vic20JoyStickButton { Fire = 0, Up = 1, Down = 2, Left = 3, Right = 4 }; + + // Via joystick interface + void setJoyStickPressed(Vic20JoyStickButton button, bool state); + + // Via 2 Keyboard interface + void setKeyPressed(uint16_t key); + void setShiftPressed(bool state); + void setCbmPressed(bool state); + + // Interface + void tick(); + // Organize operations into separate methods for cleaner code + void tickTimers(); + void joy1Input(); + void joy2Input(); + void keyboardInput(); + void setCpu(mos6502 *omos6502); + void initialize(); + +private: + + // Cpu reference + mos6502 *omos6502; + + // Via 1 & 2 Joystick + bool joyStick[5]; + + // Via 2 Keyboard + uint16_t keyPressed; + bool shiftPressed; + bool cbmPressed; + + // VIA 1 Joystick addresses + static const uint16_t via1PORTB = 0x9110; + static const uint16_t via1PORTA = 0x9111; + static const uint16_t via1PORTAMIRROR = 0x911F; + + // Port A + static const uint8_t joyStickUpBit = 0x2; + static const uint8_t joyStickDownBit = 0x4; + static const uint8_t joyStickLeftBit = 0x8; + static const uint8_t joyStickFireBit = 0x10; + + // VIA 1 ddrs + static const uint16_t via1PortBDDR = 0x9112; + static const uint16_t via1PortADDR = 0x9113; + + // VIA 1 Timer + static const uint16_t via1timer2DAddress = 0x9118; //and 0x9119 + + + // Via 2 Keyboard addresses + joystick right + static const uint16_t via2PORTB = 0x9120; + static const uint16_t via2PORTA = 0x9121; + static const uint16_t via2PORTAMIRROR = 0x912F; + + // Port B + static const uint8_t joyStickRightBit = 0x80; + + // VIA 2 ddrs + static const uint16_t via2PortBDDR = 0x9122; + static const uint16_t via2PortADDR = 0x9123; + + // VIA 2 Timer + static const uint16_t via2timer1LowByteLatch = 0x9124; + static const uint16_t via2timer1HighByteLatch = 0x9125; + static const uint16_t via2timer1DAddress = 0x9126; //and 0x9127 + static const uint16_t via2timer2LowByteLatch = 0x9128; + static const uint16_t via2timer2HighByteLatch = 0x9129; + + + + // Via 2 Registers + static const uint16_t auxControlAddress = 0x912B; + static const uint16_t irqFlagsAddress = 0x912D; + static const uint16_t irqEnableAddress = 0x912E; +}; + +#endif diff --git a/MCUME_pico/pico20/MOS6561.cpp b/MCUME_pico/pico20/MOS6561.cpp new file mode 100644 index 0000000..36f3d7d --- /dev/null +++ b/MCUME_pico/pico20/MOS6561.cpp @@ -0,0 +1,323 @@ +#include "MOS6561.h" + +extern "C" { +#include "emuapi.h" +#include "platform_config.h" +} + +#ifdef USE_VGA +#include "vga_t_dma.h" +typedef uint8_t Pixel; +#else +#include "tft_t_dma.h" +typedef uint16_t Pixel; +#endif + +#define WIN_W TFT_WIDTH +#define WIN_H TFT_HEIGHT + +//#include + + +// definitions for easy access to registers +#define REG_COLPAGE_BASE (0x9400) // 0x9400+0x200 = 0x9600 unexpanded + +#define REG_SCRPAGE_LO ((readWord(0x9002) & 0x80)<< 2) // 0x0200 +#define REG_COLPAGE_LO ((readWord(0x9002) & 0x80)<< 2) // 0x0200 +#define REG_NB_COLUMNS (readWord(0x9002) & 0x7F) + +#define REG_RASTER_LO_RD (0x9003) // 0x80 >> 7 +#define REG_DOUBLE_HEIGHT (readWord(0x9003) & 0x01) +#define REG_NB_ROWS ((readWord(0x9003) & 0x7E) >> 1) //x2 => 46 + +#define REG_RASTER_HI_RD (0x9004) // << 1 // 1E00 unexpanded? + +#define REG_CHRMAP_PT (readWord(0x9005) & 0x0F) +#define REG_SCRPAGE_HIGH ((readWord(0x9005) & 0xF0) << 6) // 0x2C00 + +#define REG_AUXILIARY_COLOUR ((readWord(0x900E) & 0xF0) >> 4) +#define REG_BORDER_COLOUR (readWord(0x900F) & 0x7) +#define REG_BACKGROUND_COLOUR ((readWord(0x900F) & 0xF0) >> 4) + +#define REG_HORI_OFFSET ((readWord(0x9000) & 0x7F) +#define REG_VERT_OFFSET ((readWord(0x9001) & 0xFF) + +// C R H V +// 16 16 +6 +16 +// 22 23 0 0 +// 24 28 -3 -9 +// 25 30 -3 -12 +// 27 33 -5 -19 + + +static Pixel vicPalette[15]; +static uint16_t remap[16] = { + 0x8000, + 0x8400, + 0x8800, + 0x8c00, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x0000, + 0x1000, + 0x1400, + 0x1800, + 0x1c00 +}; + +MOS6561::MOS6561() : IC(), curRow(0), frameReady(true) { + // Set clock speed + this->setClockSpeed(1108000); +} + +MOS6561::~MOS6561() { +} + +void MOS6561::initialize() { + // Initialize VIC palette + vicPalette[0] = RGBVAL16(0, 0, 0); + vicPalette[1] = RGBVAL16(255, 255, 255); + vicPalette[2] = RGBVAL16((182), (31), (33)); + vicPalette[3] = RGBVAL16((77), (240), (255)); + vicPalette[4] = RGBVAL16((180), (63), (255)); + vicPalette[5] = RGBVAL16((68), (226), (55)); + vicPalette[6] = RGBVAL16((15), (87), (247)); + vicPalette[7] = RGBVAL16((220), (215), (27)); + vicPalette[8] = RGBVAL16((202), (84), (0)); + vicPalette[9] = RGBVAL16((233), (176), (114)); + vicPalette[10] = RGBVAL16((231), (146), (147)); + vicPalette[11] = RGBVAL16((154), (247), (253)); + vicPalette[12] = RGBVAL16((224), (159), (255)); + vicPalette[13] = RGBVAL16((143), (228), (147)); + vicPalette[14] = RGBVAL16((130), (144), (255)); + vicPalette[15] = RGBVAL16((229), (222), (133)); +} + + +void MOS6561::renderBorder(uint16_t raster){ + if (raster < WIN_H) { + Pixel bcol = vicPalette[REG_BORDER_COLOUR]; + Pixel * dst = (Pixel *)emu_LineBuffer(raster); + for (int x=0; x < WIN_W; x++) { + *dst++ = bcol; + } + } +} + + +void MOS6561::renderLine(uint16_t raster, uint16_t row, uint8_t rowHeight, uint8_t chrLine) { + int curRow = row; + int nbRow = REG_NB_ROWS; + + if ( (rowHeight == 16) && (nbRow >= 23) ) { + curRow = curRow/2; + nbRow = nbRow/2; + } + + if (raster < WIN_H) + { + int nbCol = REG_NB_COLUMNS; + int bWidth = (WIN_W - nbCol*8)/2; + #define bakcol 0 + #define borcol 1 + #define forcol 2 + #define auxcol 3 + Pixel cols[4]; + uint16_t screenPage = (REG_SCRPAGE_HIGH & ~0x2000) + REG_SCRPAGE_LO; + uint8_t * charPointer = &vicmemory[screenPage + (curRow * nbCol)]; + uint16_t colourPage = REG_COLPAGE_BASE + REG_COLPAGE_LO; + uint8_t * colPointer = &vicmemory[colourPage + (curRow * nbCol)]; + + cols[borcol] = vicPalette[REG_BORDER_COLOUR]; + cols[bakcol] = vicPalette[REG_BACKGROUND_COLOUR]; + + // Border Left + Pixel * dst = (Pixel *)emu_LineBuffer(raster); + for (int x=0; x < bWidth; x++) { + *dst++ = cols[borcol]; + } + + uint16_t chardefbase = remap[REG_CHRMAP_PT]; + for (int x = 0; x < nbCol; x +=1) + { + uint16_t charpt = chardefbase + charPointer[x]*rowHeight + chrLine; + if ( (charpt > 0x2000) && (charpt < 0x3000) ) + charpt += 0x6000; + uint8_t characterByte = vicmemory[charpt]; + uint8_t colour = colPointer[x] & 0x7; + uint8_t multiColour = colPointer[x] & 0x8; + cols[forcol] = vicPalette[colour]; + if (!multiColour) { + Pixel * dest = dst; + for (int a = 0; a < 8; a++) { + if ((characterByte << a) & 0x80) { + *dest++ = cols[forcol]; + } + else { + *dest++ = cols[bakcol]; + } + } + } + else { + Pixel * dest = dst; + cols[auxcol] = vicPalette[REG_AUXILIARY_COLOUR]; + for (int a = 0; a < 8; a += 2) { + // Set colour + Pixel col = cols[((characterByte << a) & 0xC0) >> 6]; + *dest++ = col; + *dest++ = col; + } + } + dst +=8; + } + + // Border Right + for (int x=0; x < bWidth; x++) { + *dst++ = cols[borcol]; + } + } +} + +void MOS6561::renderRow(uint16_t raster, uint16_t row, uint8_t rowHeight) +{ + int curRow = row; + int nbRow = REG_NB_ROWS; + + //printf("rows %d of %d, cols=%d, rowHeight:%d\n", curRow, nbRow, nbCol, rowHeight); + + if ( (rowHeight == 16) && (nbRow >= 23) ) { + curRow = curRow/2; + nbRow = nbRow/2; + } + + if ((raster+curRow*rowHeight) < WIN_H) + { + int nbCol = REG_NB_COLUMNS; + int bWidth = (WIN_W - nbCol*8)/2; + #define bakcol 0 + #define borcol 1 + #define forcol 2 + #define auxcol 3 + Pixel cols[4]; + uint16_t screenPage = (REG_SCRPAGE_HIGH & ~0x2000) + REG_SCRPAGE_LO; + uint8_t * charPointer = &vicmemory[screenPage + (curRow * nbCol)]; + uint16_t colourPage = REG_COLPAGE_BASE + REG_COLPAGE_LO; + uint8_t * colPointer = &vicmemory[colourPage + (curRow * nbCol)]; + + cols[borcol] = vicPalette[REG_BORDER_COLOUR]; + cols[bakcol] = vicPalette[REG_BACKGROUND_COLOUR]; + + for (int line=0; line < rowHeight; line++) { + // Border Left + Pixel * dst = (Pixel *)emu_LineBuffer(curRow*rowHeight+line+raster); + for (int x=0; x < bWidth; x++) { + *dst++ = cols[borcol]; + } + + uint16_t chardefbase = remap[REG_CHRMAP_PT]; + for (int x = 0; x < nbCol; x +=1) + { + uint16_t charpt = chardefbase + charPointer[x]*rowHeight + line; + if ( (charpt > 0x2000) && (charpt < 0x3000) ) + charpt += 0x6000; + uint8_t characterByte = vicmemory[charpt]; + uint8_t colour = colPointer[x] & 0x7; + uint8_t multiColour = colPointer[x] & 0x8; + cols[forcol] = vicPalette[colour]; + if (!multiColour) { + Pixel * dest = dst; + for (int a = 0; a < 8; a++) { + if ((characterByte << a) & 0x80) { + *dest++ = cols[forcol]; + } + else { + *dest++ = cols[bakcol]; + } + } + } + else { + Pixel * dest = dst; + cols[auxcol] = vicPalette[REG_AUXILIARY_COLOUR]; + for (int a = 0; a < 8; a += 2) { + // Set colour + Pixel col = cols[((characterByte << a) & 0xC0) >> 6]; + *dest++ = col; + *dest++ = col; + } + } + dst +=8; + } + + // Border Right + for (int x=0; x < bWidth; x++) { + *dst++ = cols[borcol]; + } + } + } +} + + +void MOS6561::renderFrame() { + this->frameReady = false; +} + +bool MOS6561::isFrameReady() { + return this->frameReady; +} + + +void MOS6561::tick(int nbcycles) { + // Increment raster counter + uint16_t raster = readWord(REG_RASTER_HI_RD) << 1 | readWord(REG_RASTER_LO_RD) >> 7; + if (cycles % cyclesPerScanline == 0) { + uint8_t rowHeight = (REG_DOUBLE_HEIGHT?16:8); + if (raster <= lastScanline) { + raster += 1; + } + else { + raster = 0; + visScanlines = REG_NB_ROWS * rowHeight; + if ( (rowHeight == 16) && (REG_NB_ROWS >= 23) ) { + visScanlines = REG_NB_ROWS * 8; + } + firstVisibleScanline = (WIN_H-visScanlines)/2; + } + writeWord(REG_RASTER_LO_RD, (raster & 0x1) << 7 | (readWord(REG_RASTER_LO_RD) & 0x7F)); + writeWord(REG_RASTER_HI_RD, raster >> 1); + + if (visScanlines) { + if (raster < firstVisibleScanline) { + renderBorder(raster); + } + // If not blanking, update screen + else if (raster >= firstVisibleScanline && raster < (firstVisibleScanline+visScanlines)) { + // Update video + uint8_t chrLine = (raster-firstVisibleScanline) % rowHeight; + //renderLine(raster, this->curRow, rowHeight, chrLine); + if (chrLine == rowHeight-1) { + renderRow(firstVisibleScanline, this->curRow, rowHeight); + this->curRow++; + // End of screen reached + if (this->curRow >= REG_NB_ROWS) { + this->curRow = 0; + frameReady = true; + } + } + } + else { + renderBorder(raster); + } + } + } + + // Increment cycle counter + this->cycles += nbcycles; +} + + + diff --git a/MCUME_pico/pico20/MOS6561.h b/MCUME_pico/pico20/MOS6561.h new file mode 100644 index 0000000..03bb781 --- /dev/null +++ b/MCUME_pico/pico20/MOS6561.h @@ -0,0 +1,51 @@ +#ifndef _H_MOS6561 +#define _H_MOS6561 + +#include + +#include "IC.h" +#include "MOS6502Memory.h" + +/* +References, +http://vic-20.appspot.com/docs/6561.txt +http://vic-20.appspot.com/docs/vicregs.txt +http://vic-20.appspot.com/docs/6561help.txt +*/ + +class MOS6561 : public IC { +public: + MOS6561(); + ~MOS6561(); + + // Interface + void tick(int cycles); + void initialize(); + + // Getters, mostly depend on memory + bool isFrameReady(); + void renderFrame(); + void renderBorder(uint16_t raster); + void renderRow(uint16_t raster, uint16_t row, uint8_t rowHeight); + void renderLine(uint16_t raster, uint16_t row, uint8_t rowHeight, uint8_t chrLine); +private: + // Used as counters + uint8_t curRow; + uint16_t firstVisibleScanline; + uint16_t visScanlines; + + // Determines if a full frame has been drawn + bool frameReady; + + static const uint16_t lastScanline = 312; +public: + static const int cyclesPerScanline = 71; + + static const uint16_t Audio1Register = 0x900A; + static const uint16_t Audio2Register = 0x900B; + static const uint16_t Audio3Register = 0x900C; + static const uint16_t Audio4Register = 0x900D; + static const uint16_t AudioVolRegister = 0x900E; +}; + +#endif \ No newline at end of file diff --git a/MCUME_pico/pico20/basicrom.h b/MCUME_pico/pico20/basicrom.h new file mode 100755 index 0000000..10ac1d2 --- /dev/null +++ b/MCUME_pico/pico20/basicrom.h @@ -0,0 +1,514 @@ +const unsigned char basicrom[8192] = { +0x78,0xE3,0x67,0xE4,0x43,0x42,0x4D,0x42,0x41,0x53,0x49,0x43,0x30,0xC8,0x41,0xC7, +0x1D,0xCD,0xF7,0xC8,0xA4,0xCB,0xBE,0xCB,0x80,0xD0,0x05,0xCC,0xA4,0xC9,0x9F,0xC8, +0x70,0xC8,0x27,0xC9,0x1C,0xC8,0x82,0xC8,0xD1,0xC8,0x3A,0xC9,0x2E,0xC8,0x4A,0xC9, +0x2C,0xD8,0x64,0xE1,0x52,0xE1,0x61,0xE1,0xB2,0xD3,0x23,0xD8,0x7F,0xCA,0x9F,0xCA, +0x56,0xC8,0x9B,0xC6,0x5D,0xC6,0x85,0xCA,0x26,0xE1,0xBA,0xE1,0xC3,0xE1,0x7A,0xCB, +0x41,0xC6,0x39,0xDC,0xCC,0xDC,0x58,0xDC,0x00,0x00,0x7D,0xD3,0x9E,0xD3,0x71,0xDF, +0x94,0xE0,0xEA,0xD9,0xED,0xDF,0x61,0xE2,0x68,0xE2,0xB1,0xE2,0x0B,0xE3,0x0D,0xD8, +0x7C,0xD7,0x65,0xD4,0xAD,0xD7,0x8B,0xD7,0xEC,0xD6,0x00,0xD7,0x2C,0xD7,0x37,0xD7, +0x79,0x69,0xD8,0x79,0x52,0xD8,0x7B,0x2A,0xDA,0x7B,0x11,0xDB,0x7F,0x7A,0xDF,0x50, +0xE8,0xCF,0x46,0xE5,0xCF,0x7D,0xB3,0xDF,0x5A,0xD3,0xCE,0x64,0x15,0xD0,0x45,0x4E, +0xC4,0x46,0x4F,0xD2,0x4E,0x45,0x58,0xD4,0x44,0x41,0x54,0xC1,0x49,0x4E,0x50,0x55, +0x54,0xA3,0x49,0x4E,0x50,0x55,0xD4,0x44,0x49,0xCD,0x52,0x45,0x41,0xC4,0x4C,0x45, +0xD4,0x47,0x4F,0x54,0xCF,0x52,0x55,0xCE,0x49,0xC6,0x52,0x45,0x53,0x54,0x4F,0x52, +0xC5,0x47,0x4F,0x53,0x55,0xC2,0x52,0x45,0x54,0x55,0x52,0xCE,0x52,0x45,0xCD,0x53, +0x54,0x4F,0xD0,0x4F,0xCE,0x57,0x41,0x49,0xD4,0x4C,0x4F,0x41,0xC4,0x53,0x41,0x56, +0xC5,0x56,0x45,0x52,0x49,0x46,0xD9,0x44,0x45,0xC6,0x50,0x4F,0x4B,0xC5,0x50,0x52, +0x49,0x4E,0x54,0xA3,0x50,0x52,0x49,0x4E,0xD4,0x43,0x4F,0x4E,0xD4,0x4C,0x49,0x53, +0xD4,0x43,0x4C,0xD2,0x43,0x4D,0xC4,0x53,0x59,0xD3,0x4F,0x50,0x45,0xCE,0x43,0x4C, +0x4F,0x53,0xC5,0x47,0x45,0xD4,0x4E,0x45,0xD7,0x54,0x41,0x42,0xA8,0x54,0xCF,0x46, +0xCE,0x53,0x50,0x43,0xA8,0x54,0x48,0x45,0xCE,0x4E,0x4F,0xD4,0x53,0x54,0x45,0xD0, +0xAB,0xAD,0xAA,0xAF,0xDE,0x41,0x4E,0xC4,0x4F,0xD2,0xBE,0xBD,0xBC,0x53,0x47,0xCE, +0x49,0x4E,0xD4,0x41,0x42,0xD3,0x55,0x53,0xD2,0x46,0x52,0xC5,0x50,0x4F,0xD3,0x53, +0x51,0xD2,0x52,0x4E,0xC4,0x4C,0x4F,0xC7,0x45,0x58,0xD0,0x43,0x4F,0xD3,0x53,0x49, +0xCE,0x54,0x41,0xCE,0x41,0x54,0xCE,0x50,0x45,0x45,0xCB,0x4C,0x45,0xCE,0x53,0x54, +0x52,0xA4,0x56,0x41,0xCC,0x41,0x53,0xC3,0x43,0x48,0x52,0xA4,0x4C,0x45,0x46,0x54, +0xA4,0x52,0x49,0x47,0x48,0x54,0xA4,0x4D,0x49,0x44,0xA4,0x47,0xCF,0x00,0x54,0x4F, +0x4F,0x20,0x4D,0x41,0x4E,0x59,0x20,0x46,0x49,0x4C,0x45,0xD3,0x46,0x49,0x4C,0x45, +0x20,0x4F,0x50,0x45,0xCE,0x46,0x49,0x4C,0x45,0x20,0x4E,0x4F,0x54,0x20,0x4F,0x50, +0x45,0xCE,0x46,0x49,0x4C,0x45,0x20,0x4E,0x4F,0x54,0x20,0x46,0x4F,0x55,0x4E,0xC4, +0x44,0x45,0x56,0x49,0x43,0x45,0x20,0x4E,0x4F,0x54,0x20,0x50,0x52,0x45,0x53,0x45, +0x4E,0xD4,0x4E,0x4F,0x54,0x20,0x49,0x4E,0x50,0x55,0x54,0x20,0x46,0x49,0x4C,0xC5, +0x4E,0x4F,0x54,0x20,0x4F,0x55,0x54,0x50,0x55,0x54,0x20,0x46,0x49,0x4C,0xC5,0x4D, +0x49,0x53,0x53,0x49,0x4E,0x47,0x20,0x46,0x49,0x4C,0x45,0x20,0x4E,0x41,0x4D,0xC5, +0x49,0x4C,0x4C,0x45,0x47,0x41,0x4C,0x20,0x44,0x45,0x56,0x49,0x43,0x45,0x20,0x4E, +0x55,0x4D,0x42,0x45,0xD2,0x4E,0x45,0x58,0x54,0x20,0x57,0x49,0x54,0x48,0x4F,0x55, +0x54,0x20,0x46,0x4F,0xD2,0x53,0x59,0x4E,0x54,0x41,0xD8,0x52,0x45,0x54,0x55,0x52, +0x4E,0x20,0x57,0x49,0x54,0x48,0x4F,0x55,0x54,0x20,0x47,0x4F,0x53,0x55,0xC2,0x4F, +0x55,0x54,0x20,0x4F,0x46,0x20,0x44,0x41,0x54,0xC1,0x49,0x4C,0x4C,0x45,0x47,0x41, +0x4C,0x20,0x51,0x55,0x41,0x4E,0x54,0x49,0x54,0xD9,0x4F,0x56,0x45,0x52,0x46,0x4C, +0x4F,0xD7,0x4F,0x55,0x54,0x20,0x4F,0x46,0x20,0x4D,0x45,0x4D,0x4F,0x52,0xD9,0x55, +0x4E,0x44,0x45,0x46,0x27,0x44,0x20,0x53,0x54,0x41,0x54,0x45,0x4D,0x45,0x4E,0xD4, +0x42,0x41,0x44,0x20,0x53,0x55,0x42,0x53,0x43,0x52,0x49,0x50,0xD4,0x52,0x45,0x44, +0x49,0x4D,0x27,0x44,0x20,0x41,0x52,0x52,0x41,0xD9,0x44,0x49,0x56,0x49,0x53,0x49, +0x4F,0x4E,0x20,0x42,0x59,0x20,0x5A,0x45,0x52,0xCF,0x49,0x4C,0x4C,0x45,0x47,0x41, +0x4C,0x20,0x44,0x49,0x52,0x45,0x43,0xD4,0x54,0x59,0x50,0x45,0x20,0x4D,0x49,0x53, +0x4D,0x41,0x54,0x43,0xC8,0x53,0x54,0x52,0x49,0x4E,0x47,0x20,0x54,0x4F,0x4F,0x20, +0x4C,0x4F,0x4E,0xC7,0x46,0x49,0x4C,0x45,0x20,0x44,0x41,0x54,0xC1,0x46,0x4F,0x52, +0x4D,0x55,0x4C,0x41,0x20,0x54,0x4F,0x4F,0x20,0x43,0x4F,0x4D,0x50,0x4C,0x45,0xD8, +0x43,0x41,0x4E,0x27,0x54,0x20,0x43,0x4F,0x4E,0x54,0x49,0x4E,0x55,0xC5,0x55,0x4E, +0x44,0x45,0x46,0x27,0x44,0x20,0x46,0x55,0x4E,0x43,0x54,0x49,0x4F,0xCE,0x56,0x45, +0x52,0x49,0x46,0xD9,0x4C,0x4F,0x41,0xC4,0x9E,0xC1,0xAC,0xC1,0xB5,0xC1,0xC2,0xC1, +0xD0,0xC1,0xE2,0xC1,0xF0,0xC1,0xFF,0xC1,0x10,0xC2,0x25,0xC2,0x35,0xC2,0x3B,0xC2, +0x4F,0xC2,0x5A,0xC2,0x6A,0xC2,0x72,0xC2,0x7F,0xC2,0x90,0xC2,0x9D,0xC2,0xAA,0xC2, +0xBA,0xC2,0xC8,0xC2,0xD5,0xC2,0xE4,0xC2,0xED,0xC2,0x00,0xC3,0x0E,0xC3,0x1E,0xC3, +0x24,0xC3,0x83,0xC3,0x0D,0x4F,0x4B,0x0D,0x00,0x0D,0x20,0x45,0x52,0x52,0x4F,0x52, +0x00,0x20,0x49,0x4E,0x20,0x00,0x0D,0x0A,0x52,0x45,0x41,0x44,0x59,0x2E,0x0D,0x0A, +0x00,0x0D,0x0A,0x42,0x52,0x45,0x41,0x4B,0x00,0xA0,0xBA,0xE8,0xE8,0xE8,0xE8,0xBD, +0x01,0x01,0xC9,0x81,0xD0,0x21,0xA5,0x4A,0xD0,0x0A,0xBD,0x02,0x01,0x85,0x49,0xBD, +0x03,0x01,0x85,0x4A,0xDD,0x03,0x01,0xD0,0x07,0xA5,0x49,0xDD,0x02,0x01,0xF0,0x07, +0x8A,0x18,0x69,0x12,0xAA,0xD0,0xD8,0x60,0x20,0x08,0xC4,0x85,0x31,0x84,0x32,0x38, +0xA5,0x5A,0xE5,0x5F,0x85,0x22,0xA8,0xA5,0x5B,0xE5,0x60,0xAA,0xE8,0x98,0xF0,0x23, +0xA5,0x5A,0x38,0xE5,0x22,0x85,0x5A,0xB0,0x03,0xC6,0x5B,0x38,0xA5,0x58,0xE5,0x22, +0x85,0x58,0xB0,0x08,0xC6,0x59,0x90,0x04,0xB1,0x5A,0x91,0x58,0x88,0xD0,0xF9,0xB1, +0x5A,0x91,0x58,0xC6,0x5B,0xC6,0x59,0xCA,0xD0,0xF2,0x60,0x0A,0x69,0x3E,0xB0,0x35, +0x85,0x22,0xBA,0xE4,0x22,0x90,0x2E,0x60,0xC4,0x34,0x90,0x28,0xD0,0x04,0xC5,0x33, +0x90,0x22,0x48,0xA2,0x09,0x98,0x48,0xB5,0x57,0xCA,0x10,0xFA,0x20,0x26,0xD5,0xA2, +0xF7,0x68,0x95,0x61,0xE8,0x30,0xFA,0x68,0xA8,0x68,0xC4,0x34,0x90,0x06,0xD0,0x05, +0xC5,0x33,0xB0,0x01,0x60,0xA2,0x10,0x6C,0x00,0x03,0x8A,0x0A,0xAA,0xBD,0x26,0xC3, +0x85,0x22,0xBD,0x27,0xC3,0x85,0x23,0x20,0xCC,0xFF,0xA9,0x00,0x85,0x13,0x20,0xD7, +0xCA,0x20,0x45,0xCB,0xA0,0x00,0xB1,0x22,0x48,0x29,0x7F,0x20,0x47,0xCB,0xC8,0x68, +0x10,0xF4,0x20,0x7A,0xC6,0xA9,0x69,0xA0,0xC3,0x20,0x1E,0xCB,0xA4,0x3A,0xC8,0xF0, +0x03,0x20,0xC2,0xDD,0xA9,0x76,0xA0,0xC3,0x20,0x1E,0xCB,0xA9,0x80,0x20,0x90,0xFF, +0x6C,0x02,0x03,0x20,0x60,0xC5,0x86,0x7A,0x84,0x7B,0x20,0x73,0x00,0xAA,0xF0,0xF0, +0xA2,0xFF,0x86,0x3A,0x90,0x06,0x20,0x79,0xC5,0x4C,0xE1,0xC7,0x20,0x6B,0xC9,0x20, +0x79,0xC5,0x84,0x0B,0x20,0x13,0xC6,0x90,0x44,0xA0,0x01,0xB1,0x5F,0x85,0x23,0xA5, +0x2D,0x85,0x22,0xA5,0x60,0x85,0x25,0xA5,0x5F,0x88,0xF1,0x5F,0x18,0x65,0x2D,0x85, +0x2D,0x85,0x24,0xA5,0x2E,0x69,0xFF,0x85,0x2E,0xE5,0x60,0xAA,0x38,0xA5,0x5F,0xE5, +0x2D,0xA8,0xB0,0x03,0xE8,0xC6,0x25,0x18,0x65,0x22,0x90,0x03,0xC6,0x23,0x18,0xB1, +0x22,0x91,0x24,0xC8,0xD0,0xF9,0xE6,0x23,0xE6,0x25,0xCA,0xD0,0xF2,0x20,0x59,0xC6, +0x20,0x33,0xC5,0xAD,0x00,0x02,0xF0,0x88,0x18,0xA5,0x2D,0x85,0x5A,0x65,0x0B,0x85, +0x58,0xA4,0x2E,0x84,0x5B,0x90,0x01,0xC8,0x84,0x59,0x20,0xB8,0xC3,0xA5,0x14,0xA4, +0x15,0x8D,0xFE,0x01,0x8C,0xFF,0x01,0xA5,0x31,0xA4,0x32,0x85,0x2D,0x84,0x2E,0xA4, +0x0B,0x88,0xB9,0xFC,0x01,0x91,0x5F,0x88,0x10,0xF8,0x20,0x59,0xC6,0x20,0x33,0xC5, +0x4C,0x80,0xC4,0xA5,0x2B,0xA4,0x2C,0x85,0x22,0x84,0x23,0x18,0xA0,0x01,0xB1,0x22, +0xF0,0x1D,0xA0,0x04,0xC8,0xB1,0x22,0xD0,0xFB,0xC8,0x98,0x65,0x22,0xAA,0xA0,0x00, +0x91,0x22,0xA5,0x23,0x69,0x00,0xC8,0x91,0x22,0x86,0x22,0x85,0x23,0x90,0xDD,0x60, +0xA2,0x00,0x20,0x0F,0xE1,0xC9,0x0D,0xF0,0x0D,0x9D,0x00,0x02,0xE8,0xE0,0x59,0x90, +0xF1,0xA2,0x17,0x4C,0x37,0xC4,0x4C,0xCA,0xCA,0x6C,0x04,0x03,0xA6,0x7A,0xA0,0x04, +0x84,0x0F,0xBD,0x00,0x02,0x10,0x07,0xC9,0xFF,0xF0,0x3E,0xE8,0xD0,0xF4,0xC9,0x20, +0xF0,0x37,0x85,0x08,0xC9,0x22,0xF0,0x56,0x24,0x0F,0x70,0x2D,0xC9,0x3F,0xD0,0x04, +0xA9,0x99,0xD0,0x25,0xC9,0x30,0x90,0x04,0xC9,0x3C,0x90,0x1D,0x84,0x71,0xA0,0x00, +0x84,0x0B,0x88,0x86,0x7A,0xCA,0xC8,0xE8,0xBD,0x00,0x02,0x38,0xF9,0x9E,0xC0,0xF0, +0xF5,0xC9,0x80,0xD0,0x30,0x05,0x0B,0xA4,0x71,0xE8,0xC8,0x99,0xFB,0x01,0xB9,0xFB, +0x01,0xF0,0x36,0x38,0xE9,0x3A,0xF0,0x04,0xC9,0x49,0xD0,0x02,0x85,0x0F,0x38,0xE9, +0x55,0xD0,0x9F,0x85,0x08,0xBD,0x00,0x02,0xF0,0xDF,0xC5,0x08,0xF0,0xDB,0xC8,0x99, +0xFB,0x01,0xE8,0xD0,0xF0,0xA6,0x7A,0xE6,0x0B,0xC8,0xB9,0x9D,0xC0,0x10,0xFA,0xB9, +0x9E,0xC0,0xD0,0xB4,0xBD,0x00,0x02,0x10,0xBE,0x99,0xFD,0x01,0xC6,0x7B,0xA9,0xFF, +0x85,0x7A,0x60,0xA5,0x2B,0xA6,0x2C,0xA0,0x01,0x85,0x5F,0x86,0x60,0xB1,0x5F,0xF0, +0x1F,0xC8,0xC8,0xA5,0x15,0xD1,0x5F,0x90,0x18,0xF0,0x03,0x88,0xD0,0x09,0xA5,0x14, +0x88,0xD1,0x5F,0x90,0x0C,0xF0,0x0A,0x88,0xB1,0x5F,0xAA,0x88,0xB1,0x5F,0xB0,0xD7, +0x18,0x60,0xD0,0xFD,0xA9,0x00,0xA8,0x91,0x2B,0xC8,0x91,0x2B,0xA5,0x2B,0x18,0x69, +0x02,0x85,0x2D,0xA5,0x2C,0x69,0x00,0x85,0x2E,0x20,0x8E,0xC6,0xA9,0x00,0xD0,0x2D, +0x20,0xE7,0xFF,0xA5,0x37,0xA4,0x38,0x85,0x33,0x84,0x34,0xA5,0x2D,0xA4,0x2E,0x85, +0x2F,0x84,0x30,0x85,0x31,0x84,0x32,0x20,0x1D,0xC8,0xA2,0x19,0x86,0x16,0x68,0xA8, +0x68,0xA2,0xFA,0x9A,0x48,0x98,0x48,0xA9,0x00,0x85,0x3E,0x85,0x10,0x60,0x18,0xA5, +0x2B,0x69,0xFF,0x85,0x7A,0xA5,0x2C,0x69,0xFF,0x85,0x7B,0x60,0x90,0x06,0xF0,0x04, +0xC9,0xAB,0xD0,0xE9,0x20,0x6B,0xC9,0x20,0x13,0xC6,0x20,0x79,0x00,0xF0,0x0C,0xC9, +0xAB,0xD0,0x8E,0x20,0x73,0x00,0x20,0x6B,0xC9,0xD0,0x86,0x68,0x68,0xA5,0x14,0x05, +0x15,0xD0,0x06,0xA9,0xFF,0x85,0x14,0x85,0x15,0xA0,0x01,0x84,0x0F,0xB1,0x5F,0xF0, +0x43,0x20,0x2C,0xC8,0x20,0xD7,0xCA,0xC8,0xB1,0x5F,0xAA,0xC8,0xB1,0x5F,0xC5,0x15, +0xD0,0x04,0xE4,0x14,0xF0,0x02,0xB0,0x2C,0x84,0x49,0x20,0xCD,0xDD,0xA9,0x20,0xA4, +0x49,0x29,0x7F,0x20,0x47,0xCB,0xC9,0x22,0xD0,0x06,0xA5,0x0F,0x49,0xFF,0x85,0x0F, +0xC8,0xF0,0x11,0xB1,0x5F,0xD0,0x10,0xA8,0xB1,0x5F,0xAA,0xC8,0xB1,0x5F,0x86,0x5F, +0x85,0x60,0xD0,0xB5,0x4C,0x74,0xC4,0x6C,0x06,0x03,0x10,0xD7,0xC9,0xFF,0xF0,0xD3, +0x24,0x0F,0x30,0xCF,0x38,0xE9,0x7F,0xAA,0x84,0x49,0xA0,0xFF,0xCA,0xF0,0x08,0xC8, +0xB9,0x9E,0xC0,0x10,0xFA,0x30,0xF5,0xC8,0xB9,0x9E,0xC0,0x30,0xB2,0x20,0x47,0xCB, +0xD0,0xF5,0xA9,0x80,0x85,0x10,0x20,0xA5,0xC9,0x20,0x8A,0xC3,0xD0,0x05,0x8A,0x69, +0x0F,0xAA,0x9A,0x68,0x68,0xA9,0x09,0x20,0xFB,0xC3,0x20,0x06,0xC9,0x18,0x98,0x65, +0x7A,0x48,0xA5,0x7B,0x69,0x00,0x48,0xA5,0x3A,0x48,0xA5,0x39,0x48,0xA9,0xA4,0x20, +0xFF,0xCE,0x20,0x8D,0xCD,0x20,0x8A,0xCD,0xA5,0x66,0x09,0x7F,0x25,0x62,0x85,0x62, +0xA9,0x8B,0xA0,0xC7,0x85,0x22,0x84,0x23,0x4C,0x43,0xCE,0xA9,0xBC,0xA0,0xD9,0x20, +0xA2,0xDB,0x20,0x79,0x00,0xC9,0xA9,0xD0,0x06,0x20,0x73,0x00,0x20,0x8A,0xCD,0x20, +0x2B,0xDC,0x20,0x38,0xCE,0xA5,0x4A,0x48,0xA5,0x49,0x48,0xA9,0x81,0x48,0x20,0x2C, +0xC8,0xA5,0x7A,0xA4,0x7B,0xC0,0x02,0xEA,0xF0,0x04,0x85,0x3D,0x84,0x3E,0xA0,0x00, +0xB1,0x7A,0xD0,0x43,0xA0,0x02,0xB1,0x7A,0x18,0xD0,0x03,0x4C,0x4B,0xC8,0xC8,0xB1, +0x7A,0x85,0x39,0xC8,0xB1,0x7A,0x85,0x3A,0x98,0x65,0x7A,0x85,0x7A,0x90,0x02,0xE6, +0x7B,0x6C,0x08,0x03,0x20,0x73,0x00,0x20,0xED,0xC7,0x4C,0xAE,0xC7,0xF0,0x3C,0xE9, +0x80,0x90,0x11,0xC9,0x23,0xB0,0x17,0x0A,0xA8,0xB9,0x0D,0xC0,0x48,0xB9,0x0C,0xC0, +0x48,0x4C,0x73,0x00,0x4C,0xA5,0xC9,0xC9,0x3A,0xF0,0xD6,0x4C,0x08,0xCF,0xC9,0x4B, +0xD0,0xF9,0x20,0x73,0x00,0xA9,0xA4,0x20,0xFF,0xCE,0x4C,0xA0,0xC8,0x38,0xA5,0x2B, +0xE9,0x01,0xA4,0x2C,0xB0,0x01,0x88,0x85,0x41,0x84,0x42,0x60,0x20,0xE1,0xFF,0xB0, +0x01,0x18,0xD0,0x3C,0xA5,0x7A,0xA4,0x7B,0xA6,0x3A,0xE8,0xF0,0x0C,0x85,0x3D,0x84, +0x3E,0xA5,0x39,0xA4,0x3A,0x85,0x3B,0x84,0x3C,0x68,0x68,0xA9,0x81,0xA0,0xC3,0x90, +0x03,0x4C,0x69,0xC4,0x4C,0x74,0xC4,0xD0,0x17,0xA2,0x1A,0xA4,0x3E,0xD0,0x03,0x4C, +0x37,0xC4,0xA5,0x3D,0x85,0x7A,0x84,0x7B,0xA5,0x3B,0xA4,0x3C,0x85,0x39,0x84,0x3A, +0x60,0x08,0xA9,0x00,0x20,0x90,0xFF,0x28,0xD0,0x03,0x4C,0x59,0xC6,0x20,0x60,0xC6, +0x4C,0x97,0xC8,0xA9,0x03,0x20,0xFB,0xC3,0xA5,0x7B,0x48,0xA5,0x7A,0x48,0xA5,0x3A, +0x48,0xA5,0x39,0x48,0xA9,0x8D,0x48,0x20,0x79,0x00,0x20,0xA0,0xC8,0x4C,0xAE,0xC7, +0x20,0x6B,0xC9,0x20,0x09,0xC9,0x38,0xA5,0x39,0xE5,0x14,0xA5,0x3A,0xE5,0x15,0xB0, +0x0B,0x98,0x38,0x65,0x7A,0xA6,0x7B,0x90,0x07,0xE8,0xB0,0x04,0xA5,0x2B,0xA6,0x2C, +0x20,0x17,0xC6,0x90,0x1E,0xA5,0x5F,0xE9,0x01,0x85,0x7A,0xA5,0x60,0xE9,0x00,0x85, +0x7B,0x60,0xD0,0xFD,0xA9,0xFF,0x85,0x4A,0x20,0x8A,0xC3,0x9A,0xC9,0x8D,0xF0,0x0B, +0xA2,0x0C,0x2C,0xA2,0x11,0x4C,0x37,0xC4,0x4C,0x08,0xCF,0x68,0x68,0x85,0x39,0x68, +0x85,0x3A,0x68,0x85,0x7A,0x68,0x85,0x7B,0x20,0x06,0xC9,0x98,0x18,0x65,0x7A,0x85, +0x7A,0x90,0x02,0xE6,0x7B,0x60,0xA2,0x3A,0x2C,0xA2,0x00,0x86,0x07,0xA0,0x00,0x84, +0x08,0xA5,0x08,0xA6,0x07,0x85,0x07,0x86,0x08,0xB1,0x7A,0xF0,0xE8,0xC5,0x08,0xF0, +0xE4,0xC8,0xC9,0x22,0xD0,0xF3,0xF0,0xE9,0x20,0x9E,0xCD,0x20,0x79,0x00,0xC9,0x89, +0xF0,0x05,0xA9,0xA7,0x20,0xFF,0xCE,0xA5,0x61,0xD0,0x05,0x20,0x09,0xC9,0xF0,0xBB, +0x20,0x79,0x00,0xB0,0x03,0x4C,0xA0,0xC8,0x4C,0xED,0xC7,0x20,0x9E,0xD7,0x48,0xC9, +0x8D,0xF0,0x04,0xC9,0x89,0xD0,0x91,0xC6,0x65,0xD0,0x04,0x68,0x4C,0xEF,0xC7,0x20, +0x73,0x00,0x20,0x6B,0xC9,0xC9,0x2C,0xF0,0xEE,0x68,0x60,0xA2,0x00,0x86,0x14,0x86, +0x15,0xB0,0xF7,0xE9,0x2F,0x85,0x07,0xA5,0x15,0x85,0x22,0xC9,0x19,0xB0,0xD4,0xA5, +0x14,0x0A,0x26,0x22,0x0A,0x26,0x22,0x65,0x14,0x85,0x14,0xA5,0x22,0x65,0x15,0x85, +0x15,0x06,0x14,0x26,0x15,0xA5,0x14,0x65,0x07,0x85,0x14,0x90,0x02,0xE6,0x15,0x20, +0x73,0x00,0x4C,0x71,0xC9,0x20,0x8B,0xD0,0x85,0x49,0x84,0x4A,0xA9,0xB2,0x20,0xFF, +0xCE,0xA5,0x0E,0x48,0xA5,0x0D,0x48,0x20,0x9E,0xCD,0x68,0x2A,0x20,0x90,0xCD,0xD0, +0x18,0x68,0x10,0x12,0x20,0x1B,0xDC,0x20,0xBF,0xD1,0xA0,0x00,0xA5,0x64,0x91,0x49, +0xC8,0xA5,0x65,0x91,0x49,0x60,0x4C,0xD0,0xDB,0x68,0xA4,0x4A,0xC0,0xDF,0xD0,0x4C, +0x20,0xA6,0xD6,0xC9,0x06,0xD0,0x3D,0xA0,0x00,0x84,0x61,0x84,0x66,0x84,0x71,0x20, +0x1D,0xCA,0x20,0xE2,0xDA,0xE6,0x71,0xA4,0x71,0x20,0x1D,0xCA,0x20,0x0C,0xDC,0xAA, +0xF0,0x05,0xE8,0x8A,0x20,0xED,0xDA,0xA4,0x71,0xC8,0xC0,0x06,0xD0,0xDF,0x20,0xE2, +0xDA,0x20,0x9B,0xDC,0xA6,0x64,0xA4,0x63,0xA5,0x65,0x4C,0xDB,0xFF,0xB1,0x22,0x20, +0x80,0x00,0x90,0x03,0x4C,0x48,0xD2,0xE9,0x2F,0x4C,0x7E,0xDD,0xA0,0x02,0xB1,0x64, +0xC5,0x34,0x90,0x17,0xD0,0x07,0x88,0xB1,0x64,0xC5,0x33,0x90,0x0E,0xA4,0x65,0xC4, +0x2E,0x90,0x08,0xD0,0x0D,0xA5,0x64,0xC5,0x2D,0xB0,0x07,0xA5,0x64,0xA4,0x65,0x4C, +0x68,0xCA,0xA0,0x00,0xB1,0x64,0x20,0x75,0xD4,0xA5,0x50,0xA4,0x51,0x85,0x6F,0x84, +0x70,0x20,0x7A,0xD6,0xA9,0x61,0xA0,0x00,0x85,0x50,0x84,0x51,0x20,0xDB,0xD6,0xA0, +0x00,0xB1,0x50,0x91,0x49,0xC8,0xB1,0x50,0x91,0x49,0xC8,0xB1,0x50,0x91,0x49,0x60, +0x20,0x86,0xCA,0x4C,0xB5,0xCB,0x20,0x9E,0xD7,0xF0,0x05,0xA9,0x2C,0x20,0xFF,0xCE, +0x08,0x86,0x13,0x20,0x15,0xE1,0x28,0x4C,0xA0,0xCA,0x20,0x21,0xCB,0x20,0x79,0x00, +0xF0,0x35,0xF0,0x43,0xC9,0xA3,0xF0,0x50,0xC9,0xA6,0x18,0xF0,0x4B,0xC9,0x2C,0xF0, +0x37,0xC9,0x3B,0xF0,0x5E,0x20,0x9E,0xCD,0x24,0x0D,0x30,0xDE,0x20,0xDD,0xDD,0x20, +0x87,0xD4,0x20,0x21,0xCB,0x20,0x3B,0xCB,0xD0,0xD3,0xA9,0x00,0x9D,0x00,0x02,0xA2, +0xFF,0xA0,0x01,0xA5,0x13,0xD0,0x10,0xA9,0x0D,0x20,0x47,0xCB,0x24,0x13,0x10,0x05, +0xA9,0x0A,0x20,0x47,0xCB,0x49,0xFF,0x60,0x38,0x20,0xF0,0xFF,0x98,0x38,0xE9,0x0B, +0xB0,0xFC,0x49,0xFF,0x69,0x01,0xD0,0x16,0x08,0x38,0x20,0xF0,0xFF,0x84,0x09,0x20, +0x9B,0xD7,0xC9,0x29,0xD0,0x59,0x28,0x90,0x06,0x8A,0xE5,0x09,0x90,0x05,0xAA,0xE8, +0xCA,0xD0,0x06,0x20,0x73,0x00,0x4C,0xA2,0xCA,0x20,0x3B,0xCB,0xD0,0xF2,0x20,0x87, +0xD4,0x20,0xA6,0xD6,0xAA,0xA0,0x00,0xE8,0xCA,0xF0,0xBC,0xB1,0x22,0x20,0x47,0xCB, +0xC8,0xC9,0x0D,0xD0,0xF3,0x20,0xE5,0xCA,0x4C,0x28,0xCB,0xA5,0x13,0xF0,0x03,0xA9, +0x20,0x2C,0xA9,0x1D,0x2C,0xA9,0x3F,0x20,0x09,0xE1,0x29,0xFF,0x60,0xA5,0x11,0xF0, +0x11,0x30,0x04,0xA0,0xFF,0xD0,0x04,0xA5,0x3F,0xA4,0x40,0x85,0x39,0x84,0x3A,0x4C, +0x08,0xCF,0xA5,0x13,0xF0,0x05,0xA2,0x18,0x4C,0x37,0xC4,0xA9,0x0C,0xA0,0xCD,0x20, +0x1E,0xCB,0xA5,0x3D,0xA4,0x3E,0x85,0x7A,0x84,0x7B,0x60,0x20,0xA6,0xD3,0xC9,0x23, +0xD0,0x10,0x20,0x73,0x00,0x20,0x9E,0xD7,0xA9,0x2C,0x20,0xFF,0xCE,0x86,0x13,0x20, +0x1B,0xE1,0xA2,0x01,0xA0,0x02,0xA9,0x00,0x8D,0x01,0x02,0xA9,0x40,0x20,0x0F,0xCC, +0xA6,0x13,0xD0,0x13,0x60,0x20,0x9E,0xD7,0xA9,0x2C,0x20,0xFF,0xCE,0x86,0x13,0x20, +0x1B,0xE1,0x20,0xCE,0xCB,0xA5,0x13,0x20,0xCC,0xFF,0xA2,0x00,0x86,0x13,0x60,0xC9, +0x22,0xD0,0x0B,0x20,0xBD,0xCE,0xA9,0x3B,0x20,0xFF,0xCE,0x20,0x21,0xCB,0x20,0xA6, +0xD3,0xA9,0x2C,0x8D,0xFF,0x01,0x20,0xF9,0xCB,0xA5,0x13,0xF0,0x0D,0x20,0xB7,0xFF, +0x29,0x02,0xF0,0x06,0x20,0xB5,0xCB,0x4C,0xF8,0xC8,0xAD,0x00,0x02,0xD0,0x1E,0xA5, +0x13,0xD0,0xE3,0x20,0x06,0xC9,0x4C,0xFB,0xC8,0xA5,0x13,0xD0,0x06,0x20,0x45,0xCB, +0x20,0x3B,0xCB,0x4C,0x60,0xC5,0xA6,0x41,0xA4,0x42,0xA9,0x98,0x2C,0xA9,0x00,0x85, +0x11,0x86,0x43,0x84,0x44,0x20,0x8B,0xD0,0x85,0x49,0x84,0x4A,0xA5,0x7A,0xA4,0x7B, +0x85,0x4B,0x84,0x4C,0xA6,0x43,0xA4,0x44,0x86,0x7A,0x84,0x7B,0x20,0x79,0x00,0xD0, +0x20,0x24,0x11,0x50,0x0C,0x20,0x21,0xE1,0x8D,0x00,0x02,0xA2,0xFF,0xA0,0x01,0xD0, +0x0C,0x30,0x75,0xA5,0x13,0xD0,0x03,0x20,0x45,0xCB,0x20,0xF9,0xCB,0x86,0x7A,0x84, +0x7B,0x20,0x73,0x00,0x24,0x0D,0x10,0x31,0x24,0x11,0x50,0x09,0xE8,0x86,0x7A,0xA9, +0x00,0x85,0x07,0xF0,0x0C,0x85,0x07,0xC9,0x22,0xF0,0x07,0xA9,0x3A,0x85,0x07,0xA9, +0x2C,0x18,0x85,0x08,0xA5,0x7A,0xA4,0x7B,0x69,0x00,0x90,0x01,0xC8,0x20,0x8D,0xD4, +0x20,0xE2,0xD7,0x20,0xDA,0xC9,0x4C,0x91,0xCC,0x20,0xF3,0xDC,0xA5,0x0E,0x20,0xC2, +0xC9,0x20,0x79,0x00,0xF0,0x07,0xC9,0x2C,0xF0,0x03,0x4C,0x4D,0xCB,0xA5,0x7A,0xA4, +0x7B,0x85,0x43,0x84,0x44,0xA5,0x4B,0xA4,0x4C,0x85,0x7A,0x84,0x7B,0x20,0x79,0x00, +0xF0,0x2D,0x20,0xFD,0xCE,0x4C,0x15,0xCC,0x20,0x06,0xC9,0xC8,0xAA,0xD0,0x12,0xA2, +0x0D,0xC8,0xB1,0x7A,0xF0,0x6C,0xC8,0xB1,0x7A,0x85,0x3F,0xC8,0xB1,0x7A,0xC8,0x85, +0x40,0x20,0xFB,0xC8,0x20,0x79,0x00,0xAA,0xE0,0x83,0xD0,0xDC,0x4C,0x51,0xCC,0xA5, +0x43,0xA4,0x44,0xA6,0x11,0x10,0x03,0x4C,0x27,0xC8,0xA0,0x00,0xB1,0x43,0xF0,0x0B, +0xA5,0x13,0xD0,0x07,0xA9,0xFC,0xA0,0xCC,0x4C,0x1E,0xCB,0x60,0x3F,0x45,0x58,0x54, +0x52,0x41,0x20,0x49,0x47,0x4E,0x4F,0x52,0x45,0x44,0x0D,0x00,0x3F,0x52,0x45,0x44, +0x4F,0x20,0x46,0x52,0x4F,0x4D,0x20,0x53,0x54,0x41,0x52,0x54,0x0D,0x00,0xD0,0x04, +0xA0,0x00,0xF0,0x03,0x20,0x8B,0xD0,0x85,0x49,0x84,0x4A,0x20,0x8A,0xC3,0xF0,0x05, +0xA2,0x0A,0x4C,0x37,0xC4,0x9A,0x8A,0x18,0x69,0x04,0x48,0x69,0x06,0x85,0x24,0x68, +0xA0,0x01,0x20,0xA2,0xDB,0xBA,0xBD,0x09,0x01,0x85,0x66,0xA5,0x49,0xA4,0x4A,0x20, +0x67,0xD8,0x20,0xD0,0xDB,0xA0,0x01,0x20,0x5D,0xDC,0xBA,0x38,0xFD,0x09,0x01,0xF0, +0x17,0xBD,0x0F,0x01,0x85,0x39,0xBD,0x10,0x01,0x85,0x3A,0xBD,0x12,0x01,0x85,0x7A, +0xBD,0x11,0x01,0x85,0x7B,0x4C,0xAE,0xC7,0x8A,0x69,0x11,0xAA,0x9A,0x20,0x79,0x00, +0xC9,0x2C,0xD0,0xF1,0x20,0x73,0x00,0x20,0x24,0xCD,0x20,0x9E,0xCD,0x18,0x24,0x38, +0x24,0x0D,0x30,0x03,0xB0,0x03,0x60,0xB0,0xFD,0xA2,0x16,0x4C,0x37,0xC4,0xA6,0x7A, +0xD0,0x02,0xC6,0x7B,0xC6,0x7A,0xA2,0x00,0x24,0x48,0x8A,0x48,0xA9,0x01,0x20,0xFB, +0xC3,0x20,0x83,0xCE,0xA9,0x00,0x85,0x4D,0x20,0x79,0x00,0x38,0xE9,0xB1,0x90,0x17, +0xC9,0x03,0xB0,0x13,0xC9,0x01,0x2A,0x49,0x01,0x45,0x4D,0xC5,0x4D,0x90,0x61,0x85, +0x4D,0x20,0x73,0x00,0x4C,0xBB,0xCD,0xA6,0x4D,0xD0,0x2C,0xB0,0x7B,0x69,0x07,0x90, +0x77,0x65,0x0D,0xD0,0x03,0x4C,0x3D,0xD6,0x69,0xFF,0x85,0x22,0x0A,0x65,0x22,0xA8, +0x68,0xD9,0x80,0xC0,0xB0,0x67,0x20,0x8D,0xCD,0x48,0x20,0x20,0xCE,0x68,0xA4,0x4B, +0x10,0x17,0xAA,0xF0,0x56,0xD0,0x5F,0x46,0x0D,0x8A,0x2A,0xA6,0x7A,0xD0,0x02,0xC6, +0x7B,0xC6,0x7A,0xA0,0x1B,0x85,0x4D,0xD0,0xD7,0xD9,0x80,0xC0,0xB0,0x48,0x90,0xD9, +0xB9,0x82,0xC0,0x48,0xB9,0x81,0xC0,0x48,0x20,0x33,0xCE,0xA5,0x4D,0x4C,0xA9,0xCD, +0x4C,0x08,0xCF,0xA5,0x66,0xBE,0x80,0xC0,0xA8,0x68,0x85,0x22,0xE6,0x22,0x68,0x85, +0x23,0x98,0x48,0x20,0x1B,0xDC,0xA5,0x65,0x48,0xA5,0x64,0x48,0xA5,0x63,0x48,0xA5, +0x62,0x48,0xA5,0x61,0x48,0x6C,0x22,0x00,0xA0,0xFF,0x68,0xF0,0x23,0xC9,0x64,0xF0, +0x03,0x20,0x8D,0xCD,0x84,0x4B,0x68,0x4A,0x85,0x12,0x68,0x85,0x69,0x68,0x85,0x6A, +0x68,0x85,0x6B,0x68,0x85,0x6C,0x68,0x85,0x6D,0x68,0x85,0x6E,0x45,0x66,0x85,0x6F, +0xA5,0x61,0x60,0x6C,0x0A,0x03,0xA9,0x00,0x85,0x0D,0x20,0x73,0x00,0xB0,0x03,0x4C, +0xF3,0xDC,0x20,0x13,0xD1,0x90,0x03,0x4C,0x28,0xCF,0xC9,0xFF,0xD0,0x0F,0xA9,0xA8, +0xA0,0xCE,0x20,0xA2,0xDB,0x4C,0x73,0x00,0x82,0x49,0x0F,0xDA,0xA1,0xC9,0x2E,0xF0, +0xDE,0xC9,0xAB,0xF0,0x58,0xC9,0xAA,0xF0,0xD1,0xC9,0x22,0xD0,0x0F,0xA5,0x7A,0xA4, +0x7B,0x69,0x00,0x90,0x01,0xC8,0x20,0x87,0xD4,0x4C,0xE2,0xD7,0xC9,0xA8,0xD0,0x13, +0xA0,0x18,0xD0,0x3B,0x20,0xBF,0xD1,0xA5,0x65,0x49,0xFF,0xA8,0xA5,0x64,0x49,0xFF, +0x4C,0x91,0xD3,0xC9,0xA5,0xD0,0x03,0x4C,0xF4,0xD3,0xC9,0xB4,0x90,0x03,0x4C,0xA7, +0xCF,0x20,0xFA,0xCE,0x20,0x9E,0xCD,0xA9,0x29,0x2C,0xA9,0x28,0x2C,0xA9,0x2C,0xA0, +0x00,0xD1,0x7A,0xD0,0x03,0x4C,0x73,0x00,0xA2,0x0B,0x4C,0x37,0xC4,0xA0,0x15,0x68, +0x68,0x4C,0xFA,0xCD,0x38,0xA5,0x64,0xE9,0x00,0xA5,0x65,0xE9,0xC0,0x90,0x08,0xA9, +0x87,0xE5,0x64,0xA9,0xE3,0xE5,0x65,0x60,0x20,0x8B,0xD0,0x85,0x64,0x84,0x65,0xA6, +0x45,0xA4,0x46,0xA5,0x0D,0xF0,0x26,0xA9,0x00,0x85,0x70,0x20,0x14,0xCF,0x90,0x1C, +0xE0,0x54,0xD0,0x18,0xC0,0xC9,0xD0,0x14,0x20,0x84,0xCF,0x84,0x5E,0x88,0x84,0x71, +0xA0,0x06,0x84,0x5D,0xA0,0x24,0x20,0x68,0xDE,0x4C,0x6F,0xD4,0x60,0x24,0x0E,0x10, +0x0D,0xA0,0x00,0xB1,0x64,0xAA,0xC8,0xB1,0x64,0xA8,0x8A,0x4C,0x91,0xD3,0x20,0x14, +0xCF,0x90,0x2D,0xE0,0x54,0xD0,0x1B,0xC0,0x49,0xD0,0x25,0x20,0x84,0xCF,0x98,0xA2, +0xA0,0x4C,0x4F,0xDC,0x20,0xDE,0xFF,0x86,0x64,0x84,0x63,0x85,0x65,0xA0,0x00,0x84, +0x62,0x60,0xE0,0x53,0xD0,0x0A,0xC0,0x54,0xD0,0x06,0x20,0xB7,0xFF,0x4C,0x3C,0xDC, +0xA5,0x64,0xA4,0x65,0x4C,0xA2,0xDB,0x0A,0x48,0xAA,0x20,0x73,0x00,0xE0,0x8F,0x90, +0x20,0x20,0xFA,0xCE,0x20,0x9E,0xCD,0x20,0xFD,0xCE,0x20,0x8F,0xCD,0x68,0xAA,0xA5, +0x65,0x48,0xA5,0x64,0x48,0x8A,0x48,0x20,0x9E,0xD7,0x68,0xA8,0x8A,0x48,0x4C,0xD6, +0xCF,0x20,0xF1,0xCE,0x68,0xA8,0xB9,0xEA,0xBF,0x85,0x55,0xB9,0xEB,0xBF,0x85,0x56, +0x20,0x54,0x00,0x4C,0x8D,0xCD,0xA0,0xFF,0x2C,0xA0,0x00,0x84,0x0B,0x20,0xBF,0xD1, +0xA5,0x64,0x45,0x0B,0x85,0x07,0xA5,0x65,0x45,0x0B,0x85,0x08,0x20,0xFC,0xDB,0x20, +0xBF,0xD1,0xA5,0x65,0x45,0x0B,0x25,0x08,0x45,0x0B,0xA8,0xA5,0x64,0x45,0x0B,0x25, +0x07,0x45,0x0B,0x4C,0x91,0xD3,0x20,0x90,0xCD,0xB0,0x13,0xA5,0x6E,0x09,0x7F,0x25, +0x6A,0x85,0x6A,0xA9,0x69,0xA0,0x00,0x20,0x5B,0xDC,0xAA,0x4C,0x61,0xD0,0xA9,0x00, +0x85,0x0D,0xC6,0x4D,0x20,0xA6,0xD6,0x85,0x61,0x86,0x62,0x84,0x63,0xA5,0x6C,0xA4, +0x6D,0x20,0xAA,0xD6,0x86,0x6C,0x84,0x6D,0xAA,0x38,0xE5,0x61,0xF0,0x08,0xA9,0x01, +0x90,0x04,0xA6,0x61,0xA9,0xFF,0x85,0x66,0xA0,0xFF,0xE8,0xC8,0xCA,0xD0,0x07,0xA6, +0x66,0x30,0x0F,0x18,0x90,0x0C,0xB1,0x6C,0xD1,0x62,0xF0,0xEF,0xA2,0xFF,0xB0,0x02, +0xA2,0x01,0xE8,0x8A,0x2A,0x25,0x12,0xF0,0x02,0xA9,0xFF,0x4C,0x3C,0xDC,0x20,0xFD, +0xCE,0xAA,0x20,0x90,0xD0,0x20,0x79,0x00,0xD0,0xF4,0x60,0xA2,0x00,0x20,0x79,0x00, +0x86,0x0C,0x85,0x45,0x20,0x79,0x00,0x20,0x13,0xD1,0xB0,0x03,0x4C,0x08,0xCF,0xA2, +0x00,0x86,0x0D,0x86,0x0E,0x20,0x73,0x00,0x90,0x05,0x20,0x13,0xD1,0x90,0x0B,0xAA, +0x20,0x73,0x00,0x90,0xFB,0x20,0x13,0xD1,0xB0,0xF6,0xC9,0x24,0xD0,0x06,0xA9,0xFF, +0x85,0x0D,0xD0,0x10,0xC9,0x25,0xD0,0x13,0xA5,0x10,0xD0,0xD0,0xA9,0x80,0x85,0x0E, +0x05,0x45,0x85,0x45,0x8A,0x09,0x80,0xAA,0x20,0x73,0x00,0x86,0x46,0x38,0x05,0x10, +0xE9,0x28,0xD0,0x03,0x4C,0xD1,0xD1,0xA0,0x00,0x84,0x10,0xA5,0x2D,0xA6,0x2E,0x86, +0x60,0x85,0x5F,0xE4,0x30,0xD0,0x04,0xC5,0x2F,0xF0,0x22,0xA5,0x45,0xD1,0x5F,0xD0, +0x08,0xA5,0x46,0xC8,0xD1,0x5F,0xF0,0x7D,0x88,0x18,0xA5,0x5F,0x69,0x07,0x90,0xE1, +0xE8,0xD0,0xDC,0xC9,0x41,0x90,0x05,0xE9,0x5B,0x38,0xE9,0xA5,0x60,0x68,0x48,0xC9, +0x2A,0xD0,0x05,0xA9,0x13,0xA0,0xDF,0x60,0xA5,0x45,0xA4,0x46,0xC9,0x54,0xD0,0x0B, +0xC0,0xC9,0xF0,0xEF,0xC0,0x49,0xD0,0x03,0x4C,0x08,0xCF,0xC9,0x53,0xD0,0x04,0xC0, +0x54,0xF0,0xF5,0xA5,0x2F,0xA4,0x30,0x85,0x5F,0x84,0x60,0xA5,0x31,0xA4,0x32,0x85, +0x5A,0x84,0x5B,0x18,0x69,0x07,0x90,0x01,0xC8,0x85,0x58,0x84,0x59,0x20,0xB8,0xC3, +0xA5,0x58,0xA4,0x59,0xC8,0x85,0x2F,0x84,0x30,0xA0,0x00,0xA5,0x45,0x91,0x5F,0xC8, +0xA5,0x46,0x91,0x5F,0xA9,0x00,0xC8,0x91,0x5F,0xC8,0x91,0x5F,0xC8,0x91,0x5F,0xC8, +0x91,0x5F,0xC8,0x91,0x5F,0xA5,0x5F,0x18,0x69,0x02,0xA4,0x60,0x90,0x01,0xC8,0x85, +0x47,0x84,0x48,0x60,0xA5,0x0B,0x0A,0x69,0x05,0x65,0x5F,0xA4,0x60,0x90,0x01,0xC8, +0x85,0x58,0x84,0x59,0x60,0x90,0x80,0x00,0x00,0x00,0x20,0xBF,0xD1,0xA5,0x64,0xA4, +0x65,0x60,0x20,0x73,0x00,0x20,0x9E,0xCD,0x20,0x8D,0xCD,0xA5,0x66,0x30,0x0D,0xA5, +0x61,0xC9,0x90,0x90,0x09,0xA9,0xA5,0xA0,0xD1,0x20,0x5B,0xDC,0xD0,0x7A,0x4C,0x9B, +0xDC,0xA5,0x0C,0x05,0x0E,0x48,0xA5,0x0D,0x48,0xA0,0x00,0x98,0x48,0xA5,0x46,0x48, +0xA5,0x45,0x48,0x20,0xB2,0xD1,0x68,0x85,0x45,0x68,0x85,0x46,0x68,0xA8,0xBA,0xBD, +0x02,0x01,0x48,0xBD,0x01,0x01,0x48,0xA5,0x64,0x9D,0x02,0x01,0xA5,0x65,0x9D,0x01, +0x01,0xC8,0x20,0x79,0x00,0xC9,0x2C,0xF0,0xD2,0x84,0x0B,0x20,0xF7,0xCE,0x68,0x85, +0x0D,0x68,0x85,0x0E,0x29,0x7F,0x85,0x0C,0xA6,0x2F,0xA5,0x30,0x86,0x5F,0x85,0x60, +0xC5,0x32,0xD0,0x04,0xE4,0x31,0xF0,0x39,0xA0,0x00,0xB1,0x5F,0xC8,0xC5,0x45,0xD0, +0x06,0xA5,0x46,0xD1,0x5F,0xF0,0x16,0xC8,0xB1,0x5F,0x18,0x65,0x5F,0xAA,0xC8,0xB1, +0x5F,0x65,0x60,0x90,0xD7,0xA2,0x12,0x2C,0xA2,0x0E,0x4C,0x37,0xC4,0xA2,0x13,0xA5, +0x0C,0xD0,0xF7,0x20,0x94,0xD1,0xA5,0x0B,0xA0,0x04,0xD1,0x5F,0xD0,0xE7,0x4C,0xEA, +0xD2,0x20,0x94,0xD1,0x20,0x08,0xC4,0xA0,0x00,0x84,0x72,0xA2,0x05,0xA5,0x45,0x91, +0x5F,0x10,0x01,0xCA,0xC8,0xA5,0x46,0x91,0x5F,0x10,0x02,0xCA,0xCA,0x86,0x71,0xA5, +0x0B,0xC8,0xC8,0xC8,0x91,0x5F,0xA2,0x0B,0xA9,0x00,0x24,0x0C,0x50,0x08,0x68,0x18, +0x69,0x01,0xAA,0x68,0x69,0x00,0xC8,0x91,0x5F,0xC8,0x8A,0x91,0x5F,0x20,0x4C,0xD3, +0x86,0x71,0x85,0x72,0xA4,0x22,0xC6,0x0B,0xD0,0xDC,0x65,0x59,0xB0,0x5D,0x85,0x59, +0xA8,0x8A,0x65,0x58,0x90,0x03,0xC8,0xF0,0x52,0x20,0x08,0xC4,0x85,0x31,0x84,0x32, +0xA9,0x00,0xE6,0x72,0xA4,0x71,0xF0,0x05,0x88,0x91,0x58,0xD0,0xFB,0xC6,0x59,0xC6, +0x72,0xD0,0xF5,0xE6,0x59,0x38,0xA5,0x31,0xE5,0x5F,0xA0,0x02,0x91,0x5F,0xA5,0x32, +0xC8,0xE5,0x60,0x91,0x5F,0xA5,0x0C,0xD0,0x62,0xC8,0xB1,0x5F,0x85,0x0B,0xA9,0x00, +0x85,0x71,0x85,0x72,0xC8,0x68,0xAA,0x85,0x64,0x68,0x85,0x65,0xD1,0x5F,0x90,0x0E, +0xD0,0x06,0xC8,0x8A,0xD1,0x5F,0x90,0x07,0x4C,0x45,0xD2,0x4C,0x35,0xC4,0xC8,0xA5, +0x72,0x05,0x71,0x18,0xF0,0x0A,0x20,0x4C,0xD3,0x8A,0x65,0x64,0xAA,0x98,0xA4,0x22, +0x65,0x65,0x86,0x71,0xC6,0x0B,0xD0,0xCA,0x85,0x72,0xA2,0x05,0xA5,0x45,0x10,0x01, +0xCA,0xA5,0x46,0x10,0x02,0xCA,0xCA,0x86,0x28,0xA9,0x00,0x20,0x55,0xD3,0x8A,0x65, +0x58,0x85,0x47,0x98,0x65,0x59,0x85,0x48,0xA8,0xA5,0x47,0x60,0x84,0x22,0xB1,0x5F, +0x85,0x28,0x88,0xB1,0x5F,0x85,0x29,0xA9,0x10,0x85,0x5D,0xA2,0x00,0xA0,0x00,0x8A, +0x0A,0xAA,0x98,0x2A,0xA8,0xB0,0xA4,0x06,0x71,0x26,0x72,0x90,0x0B,0x18,0x8A,0x65, +0x28,0xAA,0x98,0x65,0x29,0xA8,0xB0,0x93,0xC6,0x5D,0xD0,0xE3,0x60,0xA5,0x0D,0xF0, +0x03,0x20,0xA6,0xD6,0x20,0x26,0xD5,0x38,0xA5,0x33,0xE5,0x31,0xA8,0xA5,0x34,0xE5, +0x32,0xA2,0x00,0x86,0x0D,0x85,0x62,0x84,0x63,0xA2,0x90,0x4C,0x44,0xDC,0x38,0x20, +0xF0,0xFF,0xA9,0x00,0xF0,0xEB,0xA6,0x3A,0xE8,0xD0,0xA0,0xA2,0x15,0x2C,0xA2,0x1B, +0x4C,0x37,0xC4,0x20,0xE1,0xD3,0x20,0xA6,0xD3,0x20,0xFA,0xCE,0xA9,0x80,0x85,0x10, +0x20,0x8B,0xD0,0x20,0x8D,0xCD,0x20,0xF7,0xCE,0xA9,0xB2,0x20,0xFF,0xCE,0x48,0xA5, +0x48,0x48,0xA5,0x47,0x48,0xA5,0x7B,0x48,0xA5,0x7A,0x48,0x20,0xF8,0xC8,0x4C,0x4F, +0xD4,0xA9,0xA5,0x20,0xFF,0xCE,0x09,0x80,0x85,0x10,0x20,0x92,0xD0,0x85,0x4E,0x84, +0x4F,0x4C,0x8D,0xCD,0x20,0xE1,0xD3,0xA5,0x4F,0x48,0xA5,0x4E,0x48,0x20,0xF1,0xCE, +0x20,0x8D,0xCD,0x68,0x85,0x4E,0x68,0x85,0x4F,0xA0,0x02,0xB1,0x4E,0x85,0x47,0xAA, +0xC8,0xB1,0x4E,0xF0,0x99,0x85,0x48,0xC8,0xB1,0x47,0x48,0x88,0x10,0xFA,0xA4,0x48, +0x20,0xD4,0xDB,0xA5,0x7B,0x48,0xA5,0x7A,0x48,0xB1,0x4E,0x85,0x7A,0xC8,0xB1,0x4E, +0x85,0x7B,0xA5,0x48,0x48,0xA5,0x47,0x48,0x20,0x8A,0xCD,0x68,0x85,0x4E,0x68,0x85, +0x4F,0x20,0x79,0x00,0xF0,0x03,0x4C,0x08,0xCF,0x68,0x85,0x7A,0x68,0x85,0x7B,0xA0, +0x00,0x68,0x91,0x4E,0x68,0xC8,0x91,0x4E,0x68,0xC8,0x91,0x4E,0x68,0xC8,0x91,0x4E, +0x68,0xC8,0x91,0x4E,0x60,0x20,0x8D,0xCD,0xA0,0x00,0x20,0xDF,0xDD,0x68,0x68,0xA9, +0xFF,0xA0,0x00,0xF0,0x12,0xA6,0x64,0xA4,0x65,0x86,0x50,0x84,0x51,0x20,0xF4,0xD4, +0x86,0x62,0x84,0x63,0x85,0x61,0x60,0xA2,0x22,0x86,0x07,0x86,0x08,0x85,0x6F,0x84, +0x70,0x85,0x62,0x84,0x63,0xA0,0xFF,0xC8,0xB1,0x6F,0xF0,0x0C,0xC5,0x07,0xF0,0x04, +0xC5,0x08,0xD0,0xF3,0xC9,0x22,0xF0,0x01,0x18,0x84,0x61,0x98,0x65,0x6F,0x85,0x71, +0xA6,0x70,0x90,0x01,0xE8,0x86,0x72,0xA5,0x70,0xF0,0x04,0xC9,0x02,0xD0,0x0B,0x98, +0x20,0x75,0xD4,0xA6,0x6F,0xA4,0x70,0x20,0x88,0xD6,0xA6,0x16,0xE0,0x22,0xD0,0x05, +0xA2,0x19,0x4C,0x37,0xC4,0xA5,0x61,0x95,0x00,0xA5,0x62,0x95,0x01,0xA5,0x63,0x95, +0x02,0xA0,0x00,0x86,0x64,0x84,0x65,0x84,0x70,0x88,0x84,0x0D,0x86,0x17,0xE8,0xE8, +0xE8,0x86,0x16,0x60,0x46,0x0F,0x48,0x49,0xFF,0x38,0x65,0x33,0xA4,0x34,0xB0,0x01, +0x88,0xC4,0x32,0x90,0x11,0xD0,0x04,0xC5,0x31,0x90,0x0B,0x85,0x33,0x84,0x34,0x85, +0x35,0x84,0x36,0xAA,0x68,0x60,0xA2,0x10,0xA5,0x0F,0x30,0xB6,0x20,0x26,0xD5,0xA9, +0x80,0x85,0x0F,0x68,0xD0,0xD0,0xA6,0x37,0xA5,0x38,0x86,0x33,0x85,0x34,0xA0,0x00, +0x84,0x4F,0x84,0x4E,0xA5,0x31,0xA6,0x32,0x85,0x5F,0x86,0x60,0xA9,0x19,0xA2,0x00, +0x85,0x22,0x86,0x23,0xC5,0x16,0xF0,0x05,0x20,0xC7,0xD5,0xF0,0xF7,0xA9,0x07,0x85, +0x53,0xA5,0x2D,0xA6,0x2E,0x85,0x22,0x86,0x23,0xE4,0x30,0xD0,0x04,0xC5,0x2F,0xF0, +0x05,0x20,0xBD,0xD5,0xF0,0xF3,0x85,0x58,0x86,0x59,0xA9,0x03,0x85,0x53,0xA5,0x58, +0xA6,0x59,0xE4,0x32,0xD0,0x07,0xC5,0x31,0xD0,0x03,0x4C,0x06,0xD6,0x85,0x22,0x86, +0x23,0xA0,0x00,0xB1,0x22,0xAA,0xC8,0xB1,0x22,0x08,0xC8,0xB1,0x22,0x65,0x58,0x85, +0x58,0xC8,0xB1,0x22,0x65,0x59,0x85,0x59,0x28,0x10,0xD3,0x8A,0x30,0xD0,0xC8,0xB1, +0x22,0xA0,0x00,0x0A,0x69,0x05,0x65,0x22,0x85,0x22,0x90,0x02,0xE6,0x23,0xA6,0x23, +0xE4,0x59,0xD0,0x04,0xC5,0x58,0xF0,0xBA,0x20,0xC7,0xD5,0xF0,0xF3,0xB1,0x22,0x30, +0x35,0xC8,0xB1,0x22,0x10,0x30,0xC8,0xB1,0x22,0xF0,0x2B,0xC8,0xB1,0x22,0xAA,0xC8, +0xB1,0x22,0xC5,0x34,0x90,0x06,0xD0,0x1E,0xE4,0x33,0xB0,0x1A,0xC5,0x60,0x90,0x16, +0xD0,0x04,0xE4,0x5F,0x90,0x10,0x86,0x5F,0x85,0x60,0xA5,0x22,0xA6,0x23,0x85,0x4E, +0x86,0x4F,0xA5,0x53,0x85,0x55,0xA5,0x53,0x18,0x65,0x22,0x85,0x22,0x90,0x02,0xE6, +0x23,0xA6,0x23,0xA0,0x00,0x60,0xA5,0x4F,0x05,0x4E,0xF0,0xF5,0xA5,0x55,0x29,0x04, +0x4A,0xA8,0x85,0x55,0xB1,0x4E,0x65,0x5F,0x85,0x5A,0xA5,0x60,0x69,0x00,0x85,0x5B, +0xA5,0x33,0xA6,0x34,0x85,0x58,0x86,0x59,0x20,0xBF,0xC3,0xA4,0x55,0xC8,0xA5,0x58, +0x91,0x4E,0xAA,0xE6,0x59,0xA5,0x59,0xC8,0x91,0x4E,0x4C,0x2A,0xD5,0xA5,0x65,0x48, +0xA5,0x64,0x48,0x20,0x83,0xCE,0x20,0x8F,0xCD,0x68,0x85,0x6F,0x68,0x85,0x70,0xA0, +0x00,0xB1,0x6F,0x18,0x71,0x64,0x90,0x05,0xA2,0x17,0x4C,0x37,0xC4,0x20,0x75,0xD4, +0x20,0x7A,0xD6,0xA5,0x50,0xA4,0x51,0x20,0xAA,0xD6,0x20,0x8C,0xD6,0xA5,0x6F,0xA4, +0x70,0x20,0xAA,0xD6,0x20,0xCA,0xD4,0x4C,0xB8,0xCD,0xA0,0x00,0xB1,0x6F,0x48,0xC8, +0xB1,0x6F,0xAA,0xC8,0xB1,0x6F,0xA8,0x68,0x86,0x22,0x84,0x23,0xA8,0xF0,0x0A,0x48, +0x88,0xB1,0x22,0x91,0x35,0x98,0xD0,0xF8,0x68,0x18,0x65,0x35,0x85,0x35,0x90,0x02, +0xE6,0x36,0x60,0x20,0x8F,0xCD,0xA5,0x64,0xA4,0x65,0x85,0x22,0x84,0x23,0x20,0xDB, +0xD6,0x08,0xA0,0x00,0xB1,0x22,0x48,0xC8,0xB1,0x22,0xAA,0xC8,0xB1,0x22,0xA8,0x68, +0x28,0xD0,0x13,0xC4,0x34,0xD0,0x0F,0xE4,0x33,0xD0,0x0B,0x48,0x18,0x65,0x33,0x85, +0x33,0x90,0x02,0xE6,0x34,0x68,0x86,0x22,0x84,0x23,0x60,0xC4,0x18,0xD0,0x0C,0xC5, +0x17,0xD0,0x08,0x85,0x16,0xE9,0x03,0x85,0x17,0xA0,0x00,0x60,0x20,0xA1,0xD7,0x8A, +0x48,0xA9,0x01,0x20,0x7D,0xD4,0x68,0xA0,0x00,0x91,0x62,0x68,0x68,0x4C,0xCA,0xD4, +0x20,0x61,0xD7,0xD1,0x50,0x98,0x90,0x04,0xB1,0x50,0xAA,0x98,0x48,0x8A,0x48,0x20, +0x7D,0xD4,0xA5,0x50,0xA4,0x51,0x20,0xAA,0xD6,0x68,0xA8,0x68,0x18,0x65,0x22,0x85, +0x22,0x90,0x02,0xE6,0x23,0x98,0x20,0x8C,0xD6,0x4C,0xCA,0xD4,0x20,0x61,0xD7,0x18, +0xF1,0x50,0x49,0xFF,0x4C,0x06,0xD7,0xA9,0xFF,0x85,0x65,0x20,0x79,0x00,0xC9,0x29, +0xF0,0x06,0x20,0xFD,0xCE,0x20,0x9E,0xD7,0x20,0x61,0xD7,0xF0,0x4B,0xCA,0x8A,0x48, +0x18,0xA2,0x00,0xF1,0x50,0xB0,0xB6,0x49,0xFF,0xC5,0x65,0x90,0xB1,0xA5,0x65,0xB0, +0xAD,0x20,0xF7,0xCE,0x68,0xA8,0x68,0x85,0x55,0x68,0x68,0x68,0xAA,0x68,0x85,0x50, +0x68,0x85,0x51,0xA5,0x55,0x48,0x98,0x48,0xA0,0x00,0x8A,0x60,0x20,0x82,0xD7,0x4C, +0xA2,0xD3,0x20,0xA3,0xD6,0xA2,0x00,0x86,0x0D,0xA8,0x60,0x20,0x82,0xD7,0xF0,0x08, +0xA0,0x00,0xB1,0x22,0xA8,0x4C,0xA2,0xD3,0x4C,0x48,0xD2,0x20,0x73,0x00,0x20,0x8A, +0xCD,0x20,0xB8,0xD1,0xA6,0x64,0xD0,0xF0,0xA6,0x65,0x4C,0x79,0x00,0x20,0x82,0xD7, +0xD0,0x03,0x4C,0xF7,0xD8,0xA6,0x7A,0xA4,0x7B,0x86,0x71,0x84,0x72,0xA6,0x22,0x86, +0x7A,0x18,0x65,0x22,0x85,0x24,0xA6,0x23,0x86,0x7B,0x90,0x01,0xE8,0x86,0x25,0xA0, +0x00,0xB1,0x24,0x48,0x98,0x91,0x24,0x20,0x79,0x00,0x20,0xF3,0xDC,0x68,0xA0,0x00, +0x91,0x24,0xA6,0x71,0xA4,0x72,0x86,0x7A,0x84,0x7B,0x60,0x20,0x8A,0xCD,0x20,0xF7, +0xD7,0x20,0xFD,0xCE,0x4C,0x9E,0xD7,0xA5,0x66,0x30,0x9D,0xA5,0x61,0xC9,0x91,0xB0, +0x97,0x20,0x9B,0xDC,0xA5,0x64,0xA4,0x65,0x84,0x14,0x85,0x15,0x60,0xA5,0x15,0x48, +0xA5,0x14,0x48,0x20,0xF7,0xD7,0xA0,0x00,0xB1,0x14,0xA8,0x68,0x85,0x14,0x68,0x85, +0x15,0x4C,0xA2,0xD3,0x20,0xEB,0xD7,0x8A,0xA0,0x00,0x91,0x14,0x60,0x20,0xEB,0xD7, +0x86,0x49,0xA2,0x00,0x20,0x79,0x00,0xF0,0x03,0x20,0xF1,0xD7,0x86,0x4A,0xA0,0x00, +0xB1,0x14,0x45,0x4A,0x25,0x49,0xF0,0xF8,0x60,0xA9,0x11,0xA0,0xDF,0x4C,0x67,0xD8, +0x20,0x8C,0xDA,0xA5,0x66,0x49,0xFF,0x85,0x66,0x45,0x6E,0x85,0x6F,0xA5,0x61,0x4C, +0x6A,0xD8,0x20,0x99,0xD9,0x90,0x3C,0x20,0x8C,0xDA,0xD0,0x03,0x4C,0xFC,0xDB,0xA6, +0x70,0x86,0x56,0xA2,0x69,0xA5,0x69,0xA8,0xF0,0xCE,0x38,0xE5,0x61,0xF0,0x24,0x90, +0x12,0x84,0x61,0xA4,0x6E,0x84,0x66,0x49,0xFF,0x69,0x00,0xA0,0x00,0x84,0x56,0xA2, +0x61,0xD0,0x04,0xA0,0x00,0x84,0x70,0xC9,0xF9,0x30,0xC7,0xA8,0xA5,0x70,0x56,0x01, +0x20,0xB0,0xD9,0x24,0x6F,0x10,0x57,0xA0,0x61,0xE0,0x69,0xF0,0x02,0xA0,0x69,0x38, +0x49,0xFF,0x65,0x56,0x85,0x70,0xB9,0x04,0x00,0xF5,0x04,0x85,0x65,0xB9,0x03,0x00, +0xF5,0x03,0x85,0x64,0xB9,0x02,0x00,0xF5,0x02,0x85,0x63,0xB9,0x01,0x00,0xF5,0x01, +0x85,0x62,0xB0,0x03,0x20,0x47,0xD9,0xA0,0x00,0x98,0x18,0xA6,0x62,0xD0,0x4A,0xA6, +0x63,0x86,0x62,0xA6,0x64,0x86,0x63,0xA6,0x65,0x86,0x64,0xA6,0x70,0x86,0x65,0x84, +0x70,0x69,0x08,0xC9,0x20,0xD0,0xE4,0xA9,0x00,0x85,0x61,0x85,0x66,0x60,0x65,0x56, +0x85,0x70,0xA5,0x65,0x65,0x6D,0x85,0x65,0xA5,0x64,0x65,0x6C,0x85,0x64,0xA5,0x63, +0x65,0x6B,0x85,0x63,0xA5,0x62,0x65,0x6A,0x85,0x62,0x4C,0x36,0xD9,0x69,0x01,0x06, +0x70,0x26,0x65,0x26,0x64,0x26,0x63,0x26,0x62,0x10,0xF2,0x38,0xE5,0x61,0xB0,0xC7, +0x49,0xFF,0x69,0x01,0x85,0x61,0x90,0x0E,0xE6,0x61,0xF0,0x42,0x66,0x62,0x66,0x63, +0x66,0x64,0x66,0x65,0x66,0x70,0x60,0xA5,0x66,0x49,0xFF,0x85,0x66,0xA5,0x62,0x49, +0xFF,0x85,0x62,0xA5,0x63,0x49,0xFF,0x85,0x63,0xA5,0x64,0x49,0xFF,0x85,0x64,0xA5, +0x65,0x49,0xFF,0x85,0x65,0xA5,0x70,0x49,0xFF,0x85,0x70,0xE6,0x70,0xD0,0x0E,0xE6, +0x65,0xD0,0x0A,0xE6,0x64,0xD0,0x06,0xE6,0x63,0xD0,0x02,0xE6,0x62,0x60,0xA2,0x0F, +0x4C,0x37,0xC4,0xA2,0x25,0xB4,0x04,0x84,0x70,0xB4,0x03,0x94,0x04,0xB4,0x02,0x94, +0x03,0xB4,0x01,0x94,0x02,0xA4,0x68,0x94,0x01,0x69,0x08,0x30,0xE8,0xF0,0xE6,0xE9, +0x08,0xA8,0xA5,0x70,0xB0,0x14,0x16,0x01,0x90,0x02,0xF6,0x01,0x76,0x01,0x76,0x01, +0x76,0x02,0x76,0x03,0x76,0x04,0x6A,0xC8,0xD0,0xEC,0x18,0x60,0x81,0x00,0x00,0x00, +0x00,0x03,0x7F,0x5E,0x56,0xCB,0x79,0x80,0x13,0x9B,0x0B,0x64,0x80,0x76,0x38,0x93, +0x16,0x82,0x38,0xAA,0x3B,0x20,0x80,0x35,0x04,0xF3,0x34,0x81,0x35,0x04,0xF3,0x34, +0x80,0x80,0x00,0x00,0x00,0x80,0x31,0x72,0x17,0xF8,0x20,0x2B,0xDC,0xF0,0x02,0x10, +0x03,0x4C,0x48,0xD2,0xA5,0x61,0xE9,0x7F,0x48,0xA9,0x80,0x85,0x61,0xA9,0xD6,0xA0, +0xD9,0x20,0x67,0xD8,0xA9,0xDB,0xA0,0xD9,0x20,0x0F,0xDB,0xA9,0xBC,0xA0,0xD9,0x20, +0x50,0xD8,0xA9,0xC1,0xA0,0xD9,0x20,0x40,0xE0,0xA9,0xE0,0xA0,0xD9,0x20,0x67,0xD8, +0x68,0x20,0x7E,0xDD,0xA9,0xE5,0xA0,0xD9,0x20,0x8C,0xDA,0xD0,0x03,0x4C,0x8B,0xDA, +0x20,0xB7,0xDA,0xA9,0x00,0x85,0x26,0x85,0x27,0x85,0x28,0x85,0x29,0xA5,0x70,0x20, +0x59,0xDA,0xA5,0x65,0x20,0x59,0xDA,0xA5,0x64,0x20,0x59,0xDA,0xA5,0x63,0x20,0x59, +0xDA,0xA5,0x62,0x20,0x5E,0xDA,0x4C,0x8F,0xDB,0xD0,0x03,0x4C,0x83,0xD9,0x4A,0x09, +0x80,0xA8,0x90,0x19,0x18,0xA5,0x29,0x65,0x6D,0x85,0x29,0xA5,0x28,0x65,0x6C,0x85, +0x28,0xA5,0x27,0x65,0x6B,0x85,0x27,0xA5,0x26,0x65,0x6A,0x85,0x26,0x66,0x26,0x66, +0x27,0x66,0x28,0x66,0x29,0x66,0x70,0x98,0x4A,0xD0,0xD6,0x60,0x85,0x22,0x84,0x23, +0xA0,0x04,0xB1,0x22,0x85,0x6D,0x88,0xB1,0x22,0x85,0x6C,0x88,0xB1,0x22,0x85,0x6B, +0x88,0xB1,0x22,0x85,0x6E,0x45,0x66,0x85,0x6F,0xA5,0x6E,0x09,0x80,0x85,0x6A,0x88, +0xB1,0x22,0x85,0x69,0xA5,0x61,0x60,0xA5,0x69,0xF0,0x1F,0x18,0x65,0x61,0x90,0x04, +0x30,0x1D,0x18,0x2C,0x10,0x14,0x69,0x80,0x85,0x61,0xD0,0x03,0x4C,0xFB,0xD8,0xA5, +0x6F,0x85,0x66,0x60,0xA5,0x66,0x49,0xFF,0x30,0x05,0x68,0x68,0x4C,0xF7,0xD8,0x4C, +0x7E,0xD9,0x20,0x0C,0xDC,0xAA,0xF0,0x10,0x18,0x69,0x02,0xB0,0xF2,0xA2,0x00,0x86, +0x6F,0x20,0x77,0xD8,0xE6,0x61,0xF0,0xE7,0x60,0x84,0x20,0x00,0x00,0x00,0x20,0x0C, +0xDC,0xA9,0xF9,0xA0,0xDA,0xA2,0x00,0x86,0x6F,0x20,0xA2,0xDB,0x4C,0x12,0xDB,0x20, +0x8C,0xDA,0xF0,0x76,0x20,0x1B,0xDC,0xA9,0x00,0x38,0xE5,0x61,0x85,0x61,0x20,0xB7, +0xDA,0xE6,0x61,0xF0,0xBA,0xA2,0xFC,0xA9,0x01,0xA4,0x6A,0xC4,0x62,0xD0,0x10,0xA4, +0x6B,0xC4,0x63,0xD0,0x0A,0xA4,0x6C,0xC4,0x64,0xD0,0x04,0xA4,0x6D,0xC4,0x65,0x08, +0x2A,0x90,0x09,0xE8,0x95,0x29,0xF0,0x32,0x10,0x34,0xA9,0x01,0x28,0xB0,0x0E,0x06, +0x6D,0x26,0x6C,0x26,0x6B,0x26,0x6A,0xB0,0xE6,0x30,0xCE,0x10,0xE2,0xA8,0xA5,0x6D, +0xE5,0x65,0x85,0x6D,0xA5,0x6C,0xE5,0x64,0x85,0x6C,0xA5,0x6B,0xE5,0x63,0x85,0x6B, +0xA5,0x6A,0xE5,0x62,0x85,0x6A,0x98,0x4C,0x4F,0xDB,0xA9,0x40,0xD0,0xCE,0x0A,0x0A, +0x0A,0x0A,0x0A,0x0A,0x85,0x70,0x28,0x4C,0x8F,0xDB,0xA2,0x14,0x4C,0x37,0xC4,0xA5, +0x26,0x85,0x62,0xA5,0x27,0x85,0x63,0xA5,0x28,0x85,0x64,0xA5,0x29,0x85,0x65,0x4C, +0xD7,0xD8,0x85,0x22,0x84,0x23,0xA0,0x04,0xB1,0x22,0x85,0x65,0x88,0xB1,0x22,0x85, +0x64,0x88,0xB1,0x22,0x85,0x63,0x88,0xB1,0x22,0x85,0x66,0x09,0x80,0x85,0x62,0x88, +0xB1,0x22,0x85,0x61,0x84,0x70,0x60,0xA2,0x5C,0x2C,0xA2,0x57,0xA0,0x00,0xF0,0x04, +0xA6,0x49,0xA4,0x4A,0x20,0x1B,0xDC,0x86,0x22,0x84,0x23,0xA0,0x04,0xA5,0x65,0x91, +0x22,0x88,0xA5,0x64,0x91,0x22,0x88,0xA5,0x63,0x91,0x22,0x88,0xA5,0x66,0x09,0x7F, +0x25,0x62,0x91,0x22,0x88,0xA5,0x61,0x91,0x22,0x84,0x70,0x60,0xA5,0x6E,0x85,0x66, +0xA2,0x05,0xB5,0x68,0x95,0x60,0xCA,0xD0,0xF9,0x86,0x70,0x60,0x20,0x1B,0xDC,0xA2, +0x06,0xB5,0x60,0x95,0x68,0xCA,0xD0,0xF9,0x86,0x70,0x60,0xA5,0x61,0xF0,0xFB,0x06, +0x70,0x90,0xF7,0x20,0x6F,0xD9,0xD0,0xF2,0x4C,0x38,0xD9,0xA5,0x61,0xF0,0x09,0xA5, +0x66,0x2A,0xA9,0xFF,0xB0,0x02,0xA9,0x01,0x60,0x20,0x2B,0xDC,0x85,0x62,0xA9,0x00, +0x85,0x63,0xA2,0x88,0xA5,0x62,0x49,0xFF,0x2A,0xA9,0x00,0x85,0x65,0x85,0x64,0x86, +0x61,0x85,0x70,0x85,0x66,0x4C,0xD2,0xD8,0x46,0x66,0x60,0x85,0x24,0x84,0x25,0xA0, +0x00,0xB1,0x24,0xC8,0xAA,0xF0,0xC4,0xB1,0x24,0x45,0x66,0x30,0xC2,0xE4,0x61,0xD0, +0x21,0xB1,0x24,0x09,0x80,0xC5,0x62,0xD0,0x19,0xC8,0xB1,0x24,0xC5,0x63,0xD0,0x12, +0xC8,0xB1,0x24,0xC5,0x64,0xD0,0x0B,0xC8,0xA9,0x7F,0xC5,0x70,0xB1,0x24,0xE5,0x65, +0xF0,0x28,0xA5,0x66,0x90,0x02,0x49,0xFF,0x4C,0x31,0xDC,0xA5,0x61,0xF0,0x4A,0x38, +0xE9,0xA0,0x24,0x66,0x10,0x09,0xAA,0xA9,0xFF,0x85,0x68,0x20,0x4D,0xD9,0x8A,0xA2, +0x61,0xC9,0xF9,0x10,0x06,0x20,0x99,0xD9,0x84,0x68,0x60,0xA8,0xA5,0x66,0x29,0x80, +0x46,0x62,0x05,0x62,0x85,0x62,0x20,0xB0,0xD9,0x84,0x68,0x60,0xA5,0x61,0xC9,0xA0, +0xB0,0x20,0x20,0x9B,0xDC,0x84,0x70,0xA5,0x66,0x84,0x66,0x49,0x80,0x2A,0xA9,0xA0, +0x85,0x61,0xA5,0x65,0x85,0x07,0x4C,0xD2,0xD8,0x85,0x62,0x85,0x63,0x85,0x64,0x85, +0x65,0xA8,0x60,0xA0,0x00,0xA2,0x0A,0x94,0x5D,0xCA,0x10,0xFB,0x90,0x0F,0xC9,0x2D, +0xD0,0x04,0x86,0x67,0xF0,0x04,0xC9,0x2B,0xD0,0x05,0x20,0x73,0x00,0x90,0x5B,0xC9, +0x2E,0xF0,0x2E,0xC9,0x45,0xD0,0x30,0x20,0x73,0x00,0x90,0x17,0xC9,0xAB,0xF0,0x0E, +0xC9,0x2D,0xF0,0x0A,0xC9,0xAA,0xF0,0x08,0xC9,0x2B,0xF0,0x04,0xD0,0x07,0x66,0x60, +0x20,0x73,0x00,0x90,0x5C,0x24,0x60,0x10,0x0E,0xA9,0x00,0x38,0xE5,0x5E,0x4C,0x49, +0xDD,0x66,0x5F,0x24,0x5F,0x50,0xC3,0xA5,0x5E,0x38,0xE5,0x5D,0x85,0x5E,0xF0,0x12, +0x10,0x09,0x20,0xFE,0xDA,0xE6,0x5E,0xD0,0xF9,0xF0,0x07,0x20,0xE2,0xDA,0xC6,0x5E, +0xD0,0xF9,0xA5,0x67,0x30,0x01,0x60,0x4C,0xB4,0xDF,0x48,0x24,0x5F,0x10,0x02,0xE6, +0x5D,0x20,0xE2,0xDA,0x68,0x38,0xE9,0x30,0x20,0x7E,0xDD,0x4C,0x0A,0xDD,0x48,0x20, +0x0C,0xDC,0x68,0x20,0x3C,0xDC,0xA5,0x6E,0x45,0x66,0x85,0x6F,0xA6,0x61,0x4C,0x6A, +0xD8,0xA5,0x5E,0xC9,0x0A,0x90,0x09,0xA9,0x64,0x24,0x60,0x30,0x11,0x4C,0x7E,0xD9, +0x0A,0x0A,0x18,0x65,0x5E,0x0A,0x18,0xA0,0x00,0x71,0x7A,0x38,0xE9,0x30,0x85,0x5E, +0x4C,0x30,0xDD,0x9B,0x3E,0xBC,0x1F,0xFD,0x9E,0x6E,0x6B,0x27,0xFD,0x9E,0x6E,0x6B, +0x28,0x00,0xA9,0x71,0xA0,0xC3,0x20,0xDA,0xDD,0xA5,0x3A,0xA6,0x39,0x85,0x62,0x86, +0x63,0xA2,0x90,0x38,0x20,0x49,0xDC,0x20,0xDF,0xDD,0x4C,0x1E,0xCB,0xA0,0x01,0xA9, +0x20,0x24,0x66,0x10,0x02,0xA9,0x2D,0x99,0xFF,0x00,0x85,0x66,0x84,0x71,0xC8,0xA9, +0x30,0xA6,0x61,0xD0,0x03,0x4C,0x04,0xDF,0xA9,0x00,0xE0,0x80,0xF0,0x02,0xB0,0x09, +0xA9,0xBD,0xA0,0xDD,0x20,0x28,0xDA,0xA9,0xF7,0x85,0x5D,0xA9,0xB8,0xA0,0xDD,0x20, +0x5B,0xDC,0xF0,0x1E,0x10,0x12,0xA9,0xB3,0xA0,0xDD,0x20,0x5B,0xDC,0xF0,0x02,0x10, +0x0E,0x20,0xE2,0xDA,0xC6,0x5D,0xD0,0xEE,0x20,0xFE,0xDA,0xE6,0x5D,0xD0,0xDC,0x20, +0x49,0xD8,0x20,0x9B,0xDC,0xA2,0x01,0xA5,0x5D,0x18,0x69,0x0A,0x30,0x09,0xC9,0x0B, +0xB0,0x06,0x69,0xFF,0xAA,0xA9,0x02,0x38,0xE9,0x02,0x85,0x5E,0x86,0x5D,0x8A,0xF0, +0x02,0x10,0x13,0xA4,0x71,0xA9,0x2E,0xC8,0x99,0xFF,0x00,0x8A,0xF0,0x06,0xA9,0x30, +0xC8,0x99,0xFF,0x00,0x84,0x71,0xA0,0x00,0xA2,0x80,0xA5,0x65,0x18,0x79,0x19,0xDF, +0x85,0x65,0xA5,0x64,0x79,0x18,0xDF,0x85,0x64,0xA5,0x63,0x79,0x17,0xDF,0x85,0x63, +0xA5,0x62,0x79,0x16,0xDF,0x85,0x62,0xE8,0xB0,0x04,0x10,0xDE,0x30,0x02,0x30,0xDA, +0x8A,0x90,0x04,0x49,0xFF,0x69,0x0A,0x69,0x2F,0xC8,0xC8,0xC8,0xC8,0x84,0x47,0xA4, +0x71,0xC8,0xAA,0x29,0x7F,0x99,0xFF,0x00,0xC6,0x5D,0xD0,0x06,0xA9,0x2E,0xC8,0x99, +0xFF,0x00,0x84,0x71,0xA4,0x47,0x8A,0x49,0xFF,0x29,0x80,0xAA,0xC0,0x24,0xF0,0x04, +0xC0,0x3C,0xD0,0xA6,0xA4,0x71,0xB9,0xFF,0x00,0x88,0xC9,0x30,0xF0,0xF8,0xC9,0x2E, +0xF0,0x01,0xC8,0xA9,0x2B,0xA6,0x5E,0xF0,0x2E,0x10,0x08,0xA9,0x00,0x38,0xE5,0x5E, +0xAA,0xA9,0x2D,0x99,0x01,0x01,0xA9,0x45,0x99,0x00,0x01,0x8A,0xA2,0x2F,0x38,0xE8, +0xE9,0x0A,0xB0,0xFB,0x69,0x3A,0x99,0x03,0x01,0x8A,0x99,0x02,0x01,0xA9,0x00,0x99, +0x04,0x01,0xF0,0x08,0x99,0xFF,0x00,0xA9,0x00,0x99,0x00,0x01,0xA9,0x00,0xA0,0x01, +0x60,0x80,0x00,0x00,0x00,0x00,0xFA,0x0A,0x1F,0x00,0x00,0x98,0x96,0x80,0xFF,0xF0, +0xBD,0xC0,0x00,0x01,0x86,0xA0,0xFF,0xFF,0xD8,0xF0,0x00,0x00,0x03,0xE8,0xFF,0xFF, +0xFF,0x9C,0x00,0x00,0x00,0x0A,0xFF,0xFF,0xFF,0xFF,0xFF,0xDF,0x0A,0x80,0x00,0x03, +0x4B,0xC0,0xFF,0xFF,0x73,0x60,0x00,0x00,0x0E,0x10,0xFF,0xFF,0xFD,0xA8,0x00,0x00, +0x00,0x3C,0xBF,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, +0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA, +0xAA,0x20,0x0C,0xDC,0xA9,0x11,0xA0,0xDF,0x20,0xA2,0xDB,0xF0,0x70,0xA5,0x69,0xD0, +0x03,0x4C,0xF9,0xD8,0xA2,0x4E,0xA0,0x00,0x20,0xD4,0xDB,0xA5,0x6E,0x10,0x0F,0x20, +0xCC,0xDC,0xA9,0x4E,0xA0,0x00,0x20,0x5B,0xDC,0xD0,0x03,0x98,0xA4,0x07,0x20,0xFE, +0xDB,0x98,0x48,0x20,0xEA,0xD9,0xA9,0x4E,0xA0,0x00,0x20,0x28,0xDA,0x20,0xED,0xDF, +0x68,0x4A,0x90,0x0A,0xA5,0x61,0xF0,0x06,0xA5,0x66,0x49,0xFF,0x85,0x66,0x60,0x81, +0x38,0xAA,0x3B,0x29,0x07,0x71,0x34,0x58,0x3E,0x56,0x74,0x16,0x7E,0xB3,0x1B,0x77, +0x2F,0xEE,0xE3,0x85,0x7A,0x1D,0x84,0x1C,0x2A,0x7C,0x63,0x59,0x58,0x0A,0x7E,0x75, +0xFD,0xE7,0xC6,0x80,0x31,0x72,0x18,0x10,0x81,0x00,0x00,0x00,0x00,0xA9,0xBF,0xA0, +0xDF,0x20,0x28,0xDA,0xA5,0x70,0x69,0x50,0x90,0x03,0x20,0x23,0xDC,0x85,0x56,0x20, +}; diff --git a/MCUME_pico/pico20/charrom.h b/MCUME_pico/pico20/charrom.h new file mode 100755 index 0000000..f34c540 --- /dev/null +++ b/MCUME_pico/pico20/charrom.h @@ -0,0 +1,258 @@ +const unsigned char charrom[4096] = { +0x1C,0x22,0x4A,0x56,0x4C,0x20,0x1E,0x00,0x18,0x24,0x42,0x7E,0x42,0x42,0x42,0x00, +0x7C,0x22,0x22,0x3C,0x22,0x22,0x7C,0x00,0x1C,0x22,0x40,0x40,0x40,0x22,0x1C,0x00, +0x78,0x24,0x22,0x22,0x22,0x24,0x78,0x00,0x7E,0x40,0x40,0x78,0x40,0x40,0x7E,0x00, +0x7E,0x40,0x40,0x78,0x40,0x40,0x40,0x00,0x1C,0x22,0x40,0x4E,0x42,0x22,0x1C,0x00, +0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x1C,0x00, +0x0E,0x04,0x04,0x04,0x04,0x44,0x38,0x00,0x42,0x44,0x48,0x70,0x48,0x44,0x42,0x00, +0x40,0x40,0x40,0x40,0x40,0x40,0x7E,0x00,0x42,0x66,0x5A,0x5A,0x42,0x42,0x42,0x00, +0x42,0x62,0x52,0x4A,0x46,0x42,0x42,0x00,0x18,0x24,0x42,0x42,0x42,0x24,0x18,0x00, +0x7C,0x42,0x42,0x7C,0x40,0x40,0x40,0x00,0x18,0x24,0x42,0x42,0x4A,0x24,0x1A,0x00, +0x7C,0x42,0x42,0x7C,0x48,0x44,0x42,0x00,0x3C,0x42,0x40,0x3C,0x02,0x42,0x3C,0x00, +0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00, +0x42,0x42,0x42,0x24,0x24,0x18,0x18,0x00,0x42,0x42,0x42,0x5A,0x5A,0x66,0x42,0x00, +0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x00,0x22,0x22,0x22,0x1C,0x08,0x08,0x08,0x00, +0x7E,0x02,0x04,0x18,0x20,0x40,0x7E,0x00,0x3C,0x20,0x20,0x20,0x20,0x20,0x3C,0x00, +0x0C,0x10,0x10,0x3C,0x10,0x70,0x6E,0x00,0x3C,0x04,0x04,0x04,0x04,0x04,0x3C,0x00, +0x00,0x08,0x1C,0x2A,0x08,0x08,0x08,0x08,0x00,0x00,0x10,0x20,0x7F,0x20,0x10,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x00,0x00,0x08,0x00, +0x24,0x24,0x24,0x00,0x00,0x00,0x00,0x00,0x24,0x24,0x7E,0x24,0x7E,0x24,0x24,0x00, +0x08,0x1E,0x28,0x1C,0x0A,0x3C,0x08,0x00,0x00,0x62,0x64,0x08,0x10,0x26,0x46,0x00, +0x30,0x48,0x48,0x30,0x4A,0x44,0x3A,0x00,0x04,0x08,0x10,0x00,0x00,0x00,0x00,0x00, +0x04,0x08,0x10,0x10,0x10,0x08,0x04,0x00,0x20,0x10,0x08,0x08,0x08,0x10,0x20,0x00, +0x08,0x2A,0x1C,0x3E,0x1C,0x2A,0x08,0x00,0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x10,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x40,0x00, +0x3C,0x42,0x46,0x5A,0x62,0x42,0x3C,0x00,0x08,0x18,0x28,0x08,0x08,0x08,0x3E,0x00, +0x3C,0x42,0x02,0x0C,0x30,0x40,0x7E,0x00,0x3C,0x42,0x02,0x1C,0x02,0x42,0x3C,0x00, +0x04,0x0C,0x14,0x24,0x7E,0x04,0x04,0x00,0x7E,0x40,0x78,0x04,0x02,0x44,0x38,0x00, +0x1C,0x20,0x40,0x7C,0x42,0x42,0x3C,0x00,0x7E,0x42,0x04,0x08,0x10,0x10,0x10,0x00, +0x3C,0x42,0x42,0x3C,0x42,0x42,0x3C,0x00,0x3C,0x42,0x42,0x3E,0x02,0x04,0x38,0x00, +0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x08,0x08,0x10, +0x0E,0x18,0x30,0x60,0x30,0x18,0x0E,0x00,0x00,0x00,0x7E,0x00,0x7E,0x00,0x00,0x00, +0x70,0x18,0x0C,0x06,0x0C,0x18,0x70,0x00,0x3C,0x42,0x02,0x0C,0x10,0x00,0x10,0x00, +0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x08,0x1C,0x3E,0x7F,0x7F,0x1C,0x3E,0x00, +0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00, +0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, +0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0xE0,0x10,0x08,0x08, +0x08,0x08,0x08,0x04,0x03,0x00,0x00,0x00,0x08,0x08,0x08,0x10,0xE0,0x00,0x00,0x00, +0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFF,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01, +0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80, +0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x3C,0x7E,0x7E,0x7E,0x7E,0x3C,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x36,0x7F,0x7F,0x7F,0x3E,0x1C,0x08,0x00, +0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0x03,0x04,0x08,0x08, +0x81,0x42,0x24,0x18,0x18,0x24,0x42,0x81,0x00,0x3C,0x42,0x42,0x42,0x42,0x3C,0x00, +0x08,0x1C,0x2A,0x77,0x2A,0x08,0x08,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02, +0x08,0x1C,0x3E,0x7F,0x3E,0x1C,0x08,0x00,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08, +0xA0,0x50,0xA0,0x50,0xA0,0x50,0xA0,0x50,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, +0x00,0x00,0x01,0x3E,0x54,0x14,0x14,0x00,0xFF,0x7F,0x3F,0x1F,0x0F,0x07,0x03,0x01, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0, +0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, +0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x00,0x00,0x00,0x00,0xAA,0x55,0xAA,0x55,0xFF,0xFE,0xFC,0xF8,0xF0,0xE0,0xC0,0x80, +0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x08,0x08,0x08,0x08,0x0F,0x08,0x08,0x08, +0x00,0x00,0x00,0x00,0x0F,0x0F,0x0F,0x0F,0x08,0x08,0x08,0x08,0x0F,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0xF8,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF, +0x00,0x00,0x00,0x00,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xFF,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0xFF,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x08,0x08,0x08, +0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0, +0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, +0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF, +0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF,0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0, +0x0F,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x00, +0xF0,0xF0,0xF0,0xF0,0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0x0F,0x0F,0x0F,0x0F, +0xE3,0xDD,0xB5,0xA9,0xB3,0xDF,0xE1,0xFF,0xE7,0xDB,0xBD,0x81,0xBD,0xBD,0xBD,0xFF, +0x83,0xDD,0xDD,0xC3,0xDD,0xDD,0x83,0xFF,0xE3,0xDD,0xBF,0xBF,0xBF,0xDD,0xE3,0xFF, +0x87,0xDB,0xDD,0xDD,0xDD,0xDB,0x87,0xFF,0x81,0xBF,0xBF,0x87,0xBF,0xBF,0x81,0xFF, +0x81,0xBF,0xBF,0x87,0xBF,0xBF,0xBF,0xFF,0xE3,0xDD,0xBF,0xB1,0xBD,0xDD,0xE3,0xFF, +0xBD,0xBD,0xBD,0x81,0xBD,0xBD,0xBD,0xFF,0xE3,0xF7,0xF7,0xF7,0xF7,0xF7,0xE3,0xFF, +0xF1,0xFB,0xFB,0xFB,0xFB,0xBB,0xC7,0xFF,0xBD,0xBB,0xB7,0x8F,0xB7,0xBB,0xBD,0xFF, +0xBF,0xBF,0xBF,0xBF,0xBF,0xBF,0x81,0xFF,0xBD,0x99,0xA5,0xA5,0xBD,0xBD,0xBD,0xFF, +0xBD,0x9D,0xAD,0xB5,0xB9,0xBD,0xBD,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF, +0x83,0xBD,0xBD,0x83,0xBF,0xBF,0xBF,0xFF,0xE7,0xDB,0xBD,0xBD,0xB5,0xDB,0xE5,0xFF, +0x83,0xBD,0xBD,0x83,0xB7,0xBB,0xBD,0xFF,0xC3,0xBD,0xBF,0xC3,0xFD,0xBD,0xC3,0xFF, +0xC1,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFF,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xC3,0xFF, +0xBD,0xBD,0xBD,0xDB,0xDB,0xE7,0xE7,0xFF,0xBD,0xBD,0xBD,0xA5,0xA5,0x99,0xBD,0xFF, +0xBD,0xBD,0xDB,0xE7,0xDB,0xBD,0xBD,0xFF,0xDD,0xDD,0xDD,0xE3,0xF7,0xF7,0xF7,0xFF, +0x81,0xFD,0xFB,0xE7,0xDF,0xBF,0x81,0xFF,0xC3,0xDF,0xDF,0xDF,0xDF,0xDF,0xC3,0xFF, +0xF3,0xEF,0xEF,0xC3,0xEF,0x8F,0x91,0xFF,0xC3,0xFB,0xFB,0xFB,0xFB,0xFB,0xC3,0xFF, +0xFF,0xF7,0xE3,0xD5,0xF7,0xF7,0xF7,0xF7,0xFF,0xFF,0xEF,0xDF,0x80,0xDF,0xEF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xF7,0xF7,0xF7,0xFF,0xFF,0xF7,0xFF, +0xDB,0xDB,0xDB,0xFF,0xFF,0xFF,0xFF,0xFF,0xDB,0xDB,0x81,0xDB,0x81,0xDB,0xDB,0xFF, +0xF7,0xE1,0xD7,0xE3,0xF5,0xC3,0xF7,0xFF,0xFF,0x9D,0x9B,0xF7,0xEF,0xD9,0xB9,0xFF, +0xCF,0xB7,0xB7,0xCF,0xB5,0xBB,0xC5,0xFF,0xFB,0xF7,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFB,0xF7,0xEF,0xEF,0xEF,0xF7,0xFB,0xFF,0xDF,0xEF,0xF7,0xF7,0xF7,0xEF,0xDF,0xFF, +0xF7,0xD5,0xE3,0xC1,0xE3,0xD5,0xF7,0xFF,0xFF,0xF7,0xF7,0xC1,0xF7,0xF7,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xF7,0xEF,0xFF,0xFF,0xFF,0x81,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xE7,0xFF,0xFF,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0xFF, +0xC3,0xBD,0xB9,0xA5,0x9D,0xBD,0xC3,0xFF,0xF7,0xE7,0xD7,0xF7,0xF7,0xF7,0xC1,0xFF, +0xC3,0xBD,0xFD,0xF3,0xCF,0xBF,0x81,0xFF,0xC3,0xBD,0xFD,0xE3,0xFD,0xBD,0xC3,0xFF, +0xFB,0xF3,0xEB,0xDB,0x81,0xFB,0xFB,0xFF,0x81,0xBF,0x87,0xFB,0xFD,0xBB,0xC7,0xFF, +0xE3,0xDF,0xBF,0x83,0xBD,0xBD,0xC3,0xFF,0x81,0xBD,0xFB,0xF7,0xEF,0xEF,0xEF,0xFF, +0xC3,0xBD,0xBD,0xC3,0xBD,0xBD,0xC3,0xFF,0xC3,0xBD,0xBD,0xC1,0xFD,0xFB,0xC7,0xFF, +0xFF,0xFF,0xF7,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xF7,0xF7,0xEF, +0xF1,0xE7,0xCF,0x9F,0xCF,0xE7,0xF1,0xFF,0xFF,0xFF,0x81,0xFF,0x81,0xFF,0xFF,0xFF, +0x8F,0xE7,0xF3,0xF9,0xF3,0xE7,0x8F,0xFF,0xC3,0xBD,0xFD,0xF3,0xEF,0xFF,0xEF,0xFF, +0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xF7,0xE3,0xC1,0x80,0x80,0xE3,0xC1,0xFF, +0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF,0xDF, +0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFB,0xFF,0xFF,0xFF,0xFF,0x1F,0xEF,0xF7,0xF7, +0xF7,0xF7,0xF7,0xFB,0xFC,0xFF,0xFF,0xFF,0xF7,0xF7,0xF7,0xEF,0x1F,0xFF,0xFF,0xFF, +0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x00,0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE, +0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,0x00,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F, +0x00,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,0xC3,0x81,0x81,0x81,0x81,0xC3,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0xC9,0x80,0x80,0x80,0xC1,0xE3,0xF7,0xFF, +0xBF,0xBF,0xBF,0xBF,0xBF,0xBF,0xBF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFC,0xFB,0xF7,0xF7, +0x7E,0xBD,0xDB,0xE7,0xE7,0xDB,0xBD,0x7E,0xFF,0xC3,0xBD,0xBD,0xBD,0xBD,0xC3,0xFF, +0xF7,0xE3,0xD5,0x88,0xD5,0xF7,0xF7,0xFF,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD,0xFD, +0xF7,0xE3,0xC1,0x80,0xC1,0xE3,0xF7,0xFF,0xF7,0xF7,0xF7,0xF7,0x00,0xF7,0xF7,0xF7, +0x5F,0xAF,0x5F,0xAF,0x5F,0xAF,0x5F,0xAF,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7, +0xFF,0xFF,0xFE,0xC1,0xAB,0xEB,0xEB,0xFF,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0xFE, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, +0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F, +0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, +0xFF,0xFF,0xFF,0xFF,0x55,0xAA,0x55,0xAA,0x00,0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F, +0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xF7,0xF7,0xF7,0xF7,0xF0,0xF7,0xF7,0xF7, +0xFF,0xFF,0xFF,0xFF,0xF0,0xF0,0xF0,0xF0,0xF7,0xF7,0xF7,0xF7,0xF0,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0x07,0xF7,0xF7,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, +0xFF,0xFF,0xFF,0xFF,0xF0,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0x00,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0x00,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0x07,0xF7,0xF7,0xF7, +0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F, +0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00, +0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0x00,0xFF,0xFF,0xFF,0xFF,0x0F,0x0F,0x0F,0x0F, +0xF0,0xF0,0xF0,0xF0,0xFF,0xFF,0xFF,0xFF,0xF7,0xF7,0xF7,0xF7,0x07,0xFF,0xFF,0xFF, +0x0F,0x0F,0x0F,0x0F,0xFF,0xFF,0xFF,0xFF,0x0F,0x0F,0x0F,0x0F,0xF0,0xF0,0xF0,0xF0, +0x1C,0x22,0x4A,0x56,0x4C,0x20,0x1E,0x00,0x00,0x00,0x38,0x04,0x3C,0x44,0x3A,0x00, +0x40,0x40,0x5C,0x62,0x42,0x62,0x5C,0x00,0x00,0x00,0x3C,0x42,0x40,0x42,0x3C,0x00, +0x02,0x02,0x3A,0x46,0x42,0x46,0x3A,0x00,0x00,0x00,0x3C,0x42,0x7E,0x40,0x3C,0x00, +0x0C,0x12,0x10,0x7C,0x10,0x10,0x10,0x00,0x00,0x00,0x3A,0x46,0x46,0x3A,0x02,0x3C, +0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x00,0x08,0x00,0x18,0x08,0x08,0x08,0x1C,0x00, +0x04,0x00,0x0C,0x04,0x04,0x04,0x44,0x38,0x40,0x40,0x44,0x48,0x50,0x68,0x44,0x00, +0x18,0x08,0x08,0x08,0x08,0x08,0x1C,0x00,0x00,0x00,0x76,0x49,0x49,0x49,0x49,0x00, +0x00,0x00,0x5C,0x62,0x42,0x42,0x42,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x3C,0x00, +0x00,0x00,0x5C,0x62,0x62,0x5C,0x40,0x40,0x00,0x00,0x3A,0x46,0x46,0x3A,0x02,0x02, +0x00,0x00,0x5C,0x62,0x40,0x40,0x40,0x00,0x00,0x00,0x3E,0x40,0x3C,0x02,0x7C,0x00, +0x10,0x10,0x7C,0x10,0x10,0x12,0x0C,0x00,0x00,0x00,0x42,0x42,0x42,0x46,0x3A,0x00, +0x00,0x00,0x42,0x42,0x42,0x24,0x18,0x00,0x00,0x00,0x41,0x49,0x49,0x49,0x36,0x00, +0x00,0x00,0x42,0x24,0x18,0x24,0x42,0x00,0x00,0x00,0x42,0x42,0x46,0x3A,0x02,0x3C, +0x00,0x00,0x7E,0x04,0x18,0x20,0x7E,0x00,0x3C,0x20,0x20,0x20,0x20,0x20,0x3C,0x00, +0x0C,0x10,0x10,0x3C,0x10,0x70,0x6E,0x00,0x3C,0x04,0x04,0x04,0x04,0x04,0x3C,0x00, +0x00,0x08,0x1C,0x2A,0x08,0x08,0x08,0x08,0x00,0x00,0x10,0x20,0x7F,0x20,0x10,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x00,0x00,0x08,0x00, +0x24,0x24,0x24,0x00,0x00,0x00,0x00,0x00,0x24,0x24,0x7E,0x24,0x7E,0x24,0x24,0x00, +0x08,0x1E,0x28,0x1C,0x0A,0x3C,0x08,0x00,0x00,0x62,0x64,0x08,0x10,0x26,0x46,0x00, +0x30,0x48,0x48,0x30,0x4A,0x44,0x3A,0x00,0x04,0x08,0x10,0x00,0x00,0x00,0x00,0x00, +0x04,0x08,0x10,0x10,0x10,0x08,0x04,0x00,0x20,0x10,0x08,0x08,0x08,0x10,0x20,0x00, +0x08,0x2A,0x1C,0x3E,0x1C,0x2A,0x08,0x00,0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x10,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x40,0x00, +0x3C,0x42,0x46,0x5A,0x62,0x42,0x3C,0x00,0x08,0x18,0x28,0x08,0x08,0x08,0x3E,0x00, +0x3C,0x42,0x02,0x0C,0x30,0x40,0x7E,0x00,0x3C,0x42,0x02,0x1C,0x02,0x42,0x3C,0x00, +0x04,0x0C,0x14,0x24,0x7E,0x04,0x04,0x00,0x7E,0x40,0x78,0x04,0x02,0x44,0x38,0x00, +0x1C,0x20,0x40,0x7C,0x42,0x42,0x3C,0x00,0x7E,0x42,0x04,0x08,0x10,0x10,0x10,0x00, +0x3C,0x42,0x42,0x3C,0x42,0x42,0x3C,0x00,0x3C,0x42,0x42,0x3E,0x02,0x04,0x38,0x00, +0x00,0x00,0x08,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x08,0x08,0x10, +0x0E,0x18,0x30,0x60,0x30,0x18,0x0E,0x00,0x00,0x00,0x7E,0x00,0x7E,0x00,0x00,0x00, +0x70,0x18,0x0C,0x06,0x0C,0x18,0x70,0x00,0x3C,0x42,0x02,0x0C,0x10,0x00,0x10,0x00, +0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x18,0x24,0x42,0x7E,0x42,0x42,0x42,0x00, +0x7C,0x22,0x22,0x3C,0x22,0x22,0x7C,0x00,0x1C,0x22,0x40,0x40,0x40,0x22,0x1C,0x00, +0x78,0x24,0x22,0x22,0x22,0x24,0x78,0x00,0x7E,0x40,0x40,0x78,0x40,0x40,0x7E,0x00, +0x7E,0x40,0x40,0x78,0x40,0x40,0x40,0x00,0x1C,0x22,0x40,0x4E,0x42,0x22,0x1C,0x00, +0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x00,0x1C,0x08,0x08,0x08,0x08,0x08,0x1C,0x00, +0x0E,0x04,0x04,0x04,0x04,0x44,0x38,0x00,0x42,0x44,0x48,0x70,0x48,0x44,0x42,0x00, +0x40,0x40,0x40,0x40,0x40,0x40,0x7E,0x00,0x42,0x66,0x5A,0x5A,0x42,0x42,0x42,0x00, +0x42,0x62,0x52,0x4A,0x46,0x42,0x42,0x00,0x18,0x24,0x42,0x42,0x42,0x24,0x18,0x00, +0x7C,0x42,0x42,0x7C,0x40,0x40,0x40,0x00,0x18,0x24,0x42,0x42,0x4A,0x24,0x1A,0x00, +0x7C,0x42,0x42,0x7C,0x48,0x44,0x42,0x00,0x3C,0x42,0x40,0x3C,0x02,0x42,0x3C,0x00, +0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00, +0x42,0x42,0x42,0x24,0x24,0x18,0x18,0x00,0x42,0x42,0x42,0x5A,0x5A,0x66,0x42,0x00, +0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x00,0x22,0x22,0x22,0x1C,0x08,0x08,0x08,0x00, +0x7E,0x02,0x04,0x18,0x20,0x40,0x7E,0x00,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08, +0xA0,0x50,0xA0,0x50,0xA0,0x50,0xA0,0x50,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08, +0xCC,0xCC,0x33,0x33,0xCC,0xCC,0x33,0x33,0xCC,0x66,0x33,0x99,0xCC,0x66,0x33,0x99, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0, +0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, +0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01, +0x00,0x00,0x00,0x00,0xAA,0x55,0xAA,0x55,0x99,0x33,0x66,0xCC,0x99,0x33,0x66,0xCC, +0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x08,0x08,0x08,0x08,0x0F,0x08,0x08,0x08, +0x00,0x00,0x00,0x00,0x0F,0x0F,0x0F,0x0F,0x08,0x08,0x08,0x08,0x0F,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0xF8,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF, +0x00,0x00,0x00,0x00,0x0F,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xFF,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0xFF,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x08,0x08,0x08, +0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0,0xE0, +0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, +0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF, +0x01,0x02,0x44,0x48,0x50,0x60,0x40,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0, +0x0F,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,0x00, +0xF0,0xF0,0xF0,0xF0,0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0x0F,0x0F,0x0F,0x0F, +0xE3,0xDD,0xB5,0xA9,0xB3,0xDF,0xE1,0xFF,0xFF,0xFF,0xC7,0xFB,0xC3,0xBB,0xC5,0xFF, +0xBF,0xBF,0xA3,0x9D,0xBD,0x9D,0xA3,0xFF,0xFF,0xFF,0xC3,0xBD,0xBF,0xBD,0xC3,0xFF, +0xFD,0xFD,0xC5,0xB9,0xBD,0xB9,0xC5,0xFF,0xFF,0xFF,0xC3,0xBD,0x81,0xBF,0xC3,0xFF, +0xF3,0xED,0xEF,0x83,0xEF,0xEF,0xEF,0xFF,0xFF,0xFF,0xC5,0xB9,0xB9,0xC5,0xFD,0xC3, +0xBF,0xBF,0xA3,0x9D,0xBD,0xBD,0xBD,0xFF,0xF7,0xFF,0xE7,0xF7,0xF7,0xF7,0xE3,0xFF, +0xFB,0xFF,0xF3,0xFB,0xFB,0xFB,0xBB,0xC7,0xBF,0xBF,0xBB,0xB7,0xAF,0x97,0xBB,0xFF, +0xE7,0xF7,0xF7,0xF7,0xF7,0xF7,0xE3,0xFF,0xFF,0xFF,0x89,0xB6,0xB6,0xB6,0xB6,0xFF, +0xFF,0xFF,0xA3,0x9D,0xBD,0xBD,0xBD,0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xC3,0xFF, +0xFF,0xFF,0xA3,0x9D,0x9D,0xA3,0xBF,0xBF,0xFF,0xFF,0xC5,0xB9,0xB9,0xC5,0xFD,0xFD, +0xFF,0xFF,0xA3,0x9D,0xBF,0xBF,0xBF,0xFF,0xFF,0xFF,0xC1,0xBF,0xC3,0xFD,0x83,0xFF, +0xEF,0xEF,0x83,0xEF,0xEF,0xED,0xF3,0xFF,0xFF,0xFF,0xBD,0xBD,0xBD,0xB9,0xC5,0xFF, +0xFF,0xFF,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,0xFF,0xBE,0xB6,0xB6,0xB6,0xC9,0xFF, +0xFF,0xFF,0xBD,0xDB,0xE7,0xDB,0xBD,0xFF,0xFF,0xFF,0xBD,0xBD,0xB9,0xC5,0xFD,0xC3, +0xFF,0xFF,0x81,0xFB,0xE7,0xDF,0x81,0xFF,0xC3,0xDF,0xDF,0xDF,0xDF,0xDF,0xC3,0xFF, +0xF3,0xEF,0xEF,0xC3,0xEF,0x8F,0x91,0xFF,0xC3,0xFB,0xFB,0xFB,0xFB,0xFB,0xC3,0xFF, +0xFF,0xF7,0xE3,0xD5,0xF7,0xF7,0xF7,0xF7,0xFF,0xFF,0xEF,0xDF,0x80,0xDF,0xEF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xF7,0xF7,0xF7,0xFF,0xFF,0xF7,0xFF, +0xDB,0xDB,0xDB,0xFF,0xFF,0xFF,0xFF,0xFF,0xDB,0xDB,0x81,0xDB,0x81,0xDB,0xDB,0xFF, +0xF7,0xE1,0xD7,0xE3,0xF5,0xC3,0xF7,0xFF,0xFF,0x9D,0x9B,0xF7,0xEF,0xD9,0xB9,0xFF, +0xCF,0xB7,0xB7,0xCF,0xB5,0xBB,0xC5,0xFF,0xFB,0xF7,0xEF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFB,0xF7,0xEF,0xEF,0xEF,0xF7,0xFB,0xFF,0xDF,0xEF,0xF7,0xF7,0xF7,0xEF,0xDF,0xFF, +0xF7,0xD5,0xE3,0xC1,0xE3,0xD5,0xF7,0xFF,0xFF,0xF7,0xF7,0xC1,0xF7,0xF7,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xF7,0xF7,0xEF,0xFF,0xFF,0xFF,0x81,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xE7,0xE7,0xFF,0xFF,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0xFF, +0xC3,0xBD,0xB9,0xA5,0x9D,0xBD,0xC3,0xFF,0xF7,0xE7,0xD7,0xF7,0xF7,0xF7,0xC1,0xFF, +0xC3,0xBD,0xFD,0xF3,0xCF,0xBF,0x81,0xFF,0xC3,0xBD,0xFD,0xE3,0xFD,0xBD,0xC3,0xFF, +0xFB,0xF3,0xEB,0xDB,0x81,0xFB,0xFB,0xFF,0x81,0xBF,0x87,0xFB,0xFD,0xBB,0xC7,0xFF, +0xE3,0xDF,0xBF,0x83,0xBD,0xBD,0xC3,0xFF,0x81,0xBD,0xFB,0xF7,0xEF,0xEF,0xEF,0xFF, +0xC3,0xBD,0xBD,0xC3,0xBD,0xBD,0xC3,0xFF,0xC3,0xBD,0xBD,0xC1,0xFD,0xFB,0xC7,0xFF, +0xFF,0xFF,0xF7,0xFF,0xFF,0xF7,0xFF,0xFF,0xFF,0xFF,0xF7,0xFF,0xFF,0xF7,0xF7,0xEF, +0xF1,0xE7,0xCF,0x9F,0xCF,0xE7,0xF1,0xFF,0xFF,0xFF,0x81,0xFF,0x81,0xFF,0xFF,0xFF, +0x8F,0xE7,0xF3,0xF9,0xF3,0xE7,0x8F,0xFF,0xC3,0xBD,0xFD,0xF3,0xEF,0xFF,0xEF,0xFF, +0xFF,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0x81,0xBD,0xBD,0xBD,0xFF, +0x83,0xDD,0xDD,0xC3,0xDD,0xDD,0x83,0xFF,0xE3,0xDD,0xBF,0xBF,0xBF,0xDD,0xE3,0xFF, +0x87,0xDB,0xDD,0xDD,0xDD,0xDB,0x87,0xFF,0x81,0xBF,0xBF,0x87,0xBF,0xBF,0x81,0xFF, +0x81,0xBF,0xBF,0x87,0xBF,0xBF,0xBF,0xFF,0xE3,0xDD,0xBF,0xB1,0xBD,0xDD,0xE3,0xFF, +0xBD,0xBD,0xBD,0x81,0xBD,0xBD,0xBD,0xFF,0xE3,0xF7,0xF7,0xF7,0xF7,0xF7,0xE3,0xFF, +0xF1,0xFB,0xFB,0xFB,0xFB,0xBB,0xC7,0xFF,0xBD,0xBB,0xB7,0x8F,0xB7,0xBB,0xBD,0xFF, +0xBF,0xBF,0xBF,0xBF,0xBF,0xBF,0x81,0xFF,0xBD,0x99,0xA5,0xA5,0xBD,0xBD,0xBD,0xFF, +0xBD,0x9D,0xAD,0xB5,0xB9,0xBD,0xBD,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF, +0x83,0xBD,0xBD,0x83,0xBF,0xBF,0xBF,0xFF,0xE7,0xDB,0xBD,0xBD,0xB5,0xDB,0xE5,0xFF, +0x83,0xBD,0xBD,0x83,0xB7,0xBB,0xBD,0xFF,0xC3,0xBD,0xBF,0xC3,0xFD,0xBD,0xC3,0xFF, +0xC1,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xFF,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xC3,0xFF, +0xBD,0xBD,0xBD,0xDB,0xDB,0xE7,0xE7,0xFF,0xBD,0xBD,0xBD,0xA5,0xA5,0x99,0xBD,0xFF, +0xBD,0xBD,0xDB,0xE7,0xDB,0xBD,0xBD,0xFF,0xDD,0xDD,0xDD,0xE3,0xF7,0xF7,0xF7,0xFF, +0x81,0xFD,0xFB,0xE7,0xDF,0xBF,0x81,0xFF,0xF7,0xF7,0xF7,0xF7,0x00,0xF7,0xF7,0xF7, +0x5F,0xAF,0x5F,0xAF,0x5F,0xAF,0x5F,0xAF,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7, +0x33,0x33,0xCC,0xCC,0x33,0x33,0xCC,0xCC,0x33,0x99,0xCC,0x66,0x33,0x99,0xCC,0x66, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F, +0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F, +0x55,0xAA,0x55,0xAA,0x55,0xAA,0x55,0xAA,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE, +0xFF,0xFF,0xFF,0xFF,0x55,0xAA,0x55,0xAA,0x66,0xCC,0x99,0x33,0x66,0xCC,0x99,0x33, +0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xFC,0xF7,0xF7,0xF7,0xF7,0xF0,0xF7,0xF7,0xF7, +0xFF,0xFF,0xFF,0xFF,0xF0,0xF0,0xF0,0xF0,0xF7,0xF7,0xF7,0xF7,0xF0,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0x07,0xF7,0xF7,0xF7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, +0xFF,0xFF,0xFF,0xFF,0xF0,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0x00,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0x00,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0x07,0xF7,0xF7,0xF7, +0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x3F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F,0x1F, +0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0xF8,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00, +0xFE,0xFD,0xBB,0xB7,0xAF,0x9F,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x0F,0x0F,0x0F, +0xF0,0xF0,0xF0,0xF0,0xFF,0xFF,0xFF,0xFF,0xF7,0xF7,0xF7,0xF7,0x07,0xFF,0xFF,0xFF, +0x0F,0x0F,0x0F,0x0F,0xFF,0xFF,0xFF,0xFF,0x0F,0x0F,0x0F,0x0F,0xF0,0xF0,0xF0,0xF0, +}; diff --git a/MCUME_pico/pico20/emuapi.cpp b/MCUME_pico/pico20/emuapi.cpp new file mode 100644 index 0000000..bcf2fac --- /dev/null +++ b/MCUME_pico/pico20/emuapi.cpp @@ -0,0 +1,1274 @@ +#define KEYMAP_PRESENT 1 + +#define PROGMEM + +#include "pico.h" +#include "pico/stdlib.h" +#include "hardware/adc.h" +#include +#include + +extern "C" { + #include "emuapi.h" + #include "iopins.h" +} + +#if (defined(ILI9341) || defined(ST7789)) && defined(USE_VGA) +// Dual display config, initialize TFT +#include "tft_t_dma.h" +static TFT_T_DMA tft; +#else +// Non Dual display config +#ifdef USE_VGA +#include "vga_t_dma.h" +#else +#include "tft_t_dma.h" +#endif +extern TFT_T_DMA tft; +#endif + + +#define MAX_FILES 64 +#define MAX_FILENAME_SIZE 24 +#define MAX_MENULINES 9 +#define TEXT_HEIGHT 16 +#define TEXT_WIDTH 8 +#define MENU_FILE_XOFFSET (6*TEXT_WIDTH) +#define MENU_FILE_YOFFSET (2*TEXT_HEIGHT) +#define MENU_FILE_W (MAX_FILENAME_SIZE*TEXT_WIDTH) +#define MENU_FILE_H (MAX_MENULINES*TEXT_HEIGHT) +#define MENU_FILE_BGCOLOR RGBVAL16(0x00,0x00,0x40) +#define MENU_JOYS_YOFFSET (12*TEXT_HEIGHT) +#define MENU_VBAR_XOFFSET (0*TEXT_WIDTH) +#define MENU_VBAR_YOFFSET (MENU_FILE_YOFFSET) + +#define MENU_TFT_XOFFSET (MENU_FILE_XOFFSET+MENU_FILE_W+8) +#define MENU_TFT_YOFFSET (MENU_VBAR_YOFFSET+32) +#define MENU_VGA_XOFFSET (MENU_FILE_XOFFSET+MENU_FILE_W+8) +#define MENU_VGA_YOFFSET (MENU_VBAR_YOFFSET+MENU_FILE_H-32-37) + + + +static char romspath[64]; +static int nbFiles=0; +static int curFile=0; +static int topFile=0; +static char selection[MAX_FILENAME_SIZE+1]=""; +static char files[MAX_FILES][MAX_FILENAME_SIZE]; +static bool menuRedraw=true; + +#ifdef PICOMPUTER +static const unsigned short * keys; +static unsigned char keymatrix[6]; +static int keymatrix_hitrow=-1; +static bool key_fn=false; +static bool key_alt=false; +static uint32_t keypress_t_ms=0; +static uint32_t last_t_ms=0; +static uint32_t hundred_ms_cnt=0; +static bool ledflash_toggle=false; +#endif +static int keyMap; + +static bool joySwapped = false; +static uint16_t bLastState; +static int xRef; +static int yRef; +static uint8_t usbnavpad=0; + +static bool menuOn=true; + + + +/******************************** + * Generic output and malloc +********************************/ +void emu_printf(char * text) +{ + printf("%s\n",text); +} + +void emu_printf(int val) +{ + printf("%d\n",val); +} + +void emu_printi(int val) +{ + printf("%d\n",val); +} + +void emu_printh(int val) +{ + printf("0x%.8\n",val); +} + +static int malbufpt = 0; +static char malbuf[EXTRA_HEAP]; + +void * emu_Malloc(int size) +{ + void * retval = malloc(size); + if (!retval) { + emu_printf("failled to allocate"); + emu_printf(size); + emu_printf("fallback"); + if ( (malbufpt+size) < sizeof(malbuf) ) { + retval = (void *)&malbuf[malbufpt]; + malbufpt += size; + } + else { + emu_printf("failure to allocate"); + } + } + else { + emu_printf("could allocate dynamic "); + emu_printf(size); + } + + return retval; +} + +void * emu_MallocI(int size) +{ + void * retval = NULL; + + if ( (malbufpt+size) < sizeof(malbuf) ) { + retval = (void *)&malbuf[malbufpt]; + malbufpt += size; + emu_printf("could allocate static "); + emu_printf(size); + } + else { + emu_printf("failure to allocate"); + } + + return retval; +} +void emu_Free(void * pt) +{ + free(pt); +} + +void emu_drawText(unsigned short x, unsigned short y, const char * text, unsigned short fgcolor, unsigned short bgcolor, int doublesize) +{ + tft.drawText(x, y, text, fgcolor, bgcolor, doublesize?true:false); +} + + +/******************************** + * OSKB handling +********************************/ +#if (defined(ILI9341) || defined(ST7789)) && defined(USE_VGA) +// On screen keyboard position +#define KXOFF 28 //64 +#define KYOFF 96 +#define KWIDTH 11 //22 +#define KHEIGHT 3 + +static bool oskbOn = false; +static int cxpos = 0; +static int cypos = 0; +static int oskbMap = 0; +static uint16_t oskbBLastState = 0; + +static void lineOSKB2(int kxoff, int kyoff, char * str, int row) +{ + char c[2] = {'A',0}; + const char * cpt = str; + for (int i=0; i.,SP ", 2); + if (oskbMap == 0) { + lineOSKB(KXOFF,KYOFF, keylables_map1_0, 0); + lineOSKB(KXOFF,KYOFF, keylables_map1_1, 1); + lineOSKB(KXOFF,KYOFF, keylables_map1_2, 2); + } + else if (oskbMap == 1) { + lineOSKB(KXOFF,KYOFF, keylables_map2_0, 0); + lineOSKB(KXOFF,KYOFF, keylables_map2_1, 1); + lineOSKB(KXOFF,KYOFF, keylables_map2_2, 2); + } + else { + lineOSKB(KXOFF,KYOFF, keylables_map3_0, 0); + lineOSKB(KXOFF,KYOFF, keylables_map3_1, 1); + lineOSKB(KXOFF,KYOFF, keylables_map3_2, 2); + } +} + +void toggleOskb(bool forceoff) { + if (forceoff) oskbOn=true; + if (oskbOn) { + oskbOn = false; + tft.fillScreenNoDma(RGBVAL16(0x00,0x00,0x00)); + tft.drawTextNoDma(0,32, "Press USER2 to toggle onscreen keyboard.", RGBVAL16(0xff,0xff,0xff), RGBVAL16(0x00,0x00,0x00), true); + } else { + oskbOn = true; + tft.fillScreenNoDma(RGBVAL16(0x00,0x00,0x00)); + tft.drawTextNoDma(0,32, " Press USER2 to exit onscreen keyboard. ", RGBVAL16(0xff,0xff,0xff), RGBVAL16(0x00,0x00,0x00), true); + tft.drawTextNoDma(0,64, " (USER1 to toggle between keymaps) ", RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), true); + tft.drawRectNoDma(KXOFF,KYOFF, 22*8, 3*16, RGBVAL16(0x00,0x00,0xFF)); + drawOskb(); + } +} + +static int handleOskb(void) +{ + int retval = 0; + + uint16_t bClick = bLastState & ~oskbBLastState; + oskbBLastState = bLastState; + /* + static const char * digits = "0123456789ABCDEF"; + char buf[5] = {0,0,0,0,0}; + int val = bClick; + buf[0] = digits[(val>>12)&0xf]; + buf[1] = digits[(val>>8)&0xf]; + buf[2] = digits[(val>>4)&0xf]; + buf[3] = digits[val&0xf]; + tft.drawTextNoDma(0,KYOFF+ 64,buf,RGBVAL16(0x00,0x00,0x00),RGBVAL16(0xFF,0xFF,0xFF),1); + */ + if (bClick & MASK_KEY_USER2) + { + toggleOskb(false); + } + if (oskbOn) + { + bool updated = true; + if (bClick & MASK_KEY_USER1) + { + oskbMap += 1; + if (oskbMap == 3) oskbMap = 0; + } + else if (bClick & MASK_JOY2_LEFT) + { + cxpos++; + if (cxpos >= KWIDTH) cxpos = 0; + } + else if (bClick & MASK_JOY2_RIGHT) + { + cxpos--; + if (cxpos < 0) cxpos = KWIDTH-1; + } + else if (bClick & MASK_JOY2_DOWN) + { + cypos++; + if (cypos >= KHEIGHT) cypos = 0; + } + else if (bClick & MASK_JOY2_UP) + { + cypos--; + if (cypos < 0) cypos = KHEIGHT-1; + } + else if (oskbBLastState & MASK_JOY2_BTN) + { + retval = cypos*KWIDTH+cxpos+1; + if (retval) { + retval--; + //if (retval & 1) retval = key_map2[retval>>1]; + //else retval = key_map1[retval>>1]; + if (oskbMap == 0) { + retval = key_map1[retval]; + } + else if (oskbMap == 1) { + retval = key_map2[retval]; + } + else { + retval = key_map3[retval]; + } + //if (retval) { toggleOskb(true); updated=false; }; + } + } + else { + updated=false; + } + if (updated) drawOskb(); + } + + return retval; +} +#endif + +/******************************** + * Input and keyboard +********************************/ +int emu_ReadAnalogJoyX(int min, int max) +{ + adc_select_input(0); + int val = adc_read(); +#if INVX + val = 4095 - val; +#endif + val = val-xRef; + val = ((val*140)/100); + if ( (val > -512) && (val < 512) ) val = 0; + val = val+2048; + return (val*(max-min))/4096; +} + +int emu_ReadAnalogJoyY(int min, int max) +{ + adc_select_input(1); + int val = adc_read(); +#if INVY + val = 4095 - val; +#endif + val = val-yRef; + val = ((val*120)/100); + if ( (val > -512) && (val < 512) ) val = 0; + //val = (val*(max-min))/4096; + val = val+2048; + //return val+(max-min)/2; + return (val*(max-min))/4096; +} + + +static uint16_t readAnalogJoystick(void) +{ + uint16_t joysval = 0; +#ifdef PIN_JOY2_A1X + int xReading = emu_ReadAnalogJoyX(0,256); + if (xReading > 128) joysval |= MASK_JOY2_LEFT; + else if (xReading < 128) joysval |= MASK_JOY2_RIGHT; + + int yReading = emu_ReadAnalogJoyY(0,256); + if (yReading < 128) joysval |= MASK_JOY2_UP; + else if (yReading > 128) joysval |= MASK_JOY2_DOWN; +#endif + // First joystick +#if INVY +#ifdef PIN_JOY2_1 + if ( !gpio_get(PIN_JOY2_1) ) joysval |= MASK_JOY2_DOWN; +#endif +#ifdef PIN_JOY2_2 + if ( !gpio_get(PIN_JOY2_2) ) joysval |= MASK_JOY2_UP; +#endif +#else +#ifdef PIN_JOY2_1 + if ( !gpio_get(PIN_JOY2_1) ) joysval |= MASK_JOY2_UP; +#endif +#ifdef PIN_JOY2_2 + if ( !gpio_get(PIN_JOY2_2) ) joysval |= MASK_JOY2_DOWN; +#endif +#endif +#if INVX +#ifdef PIN_JOY2_3 + if ( !gpio_get(PIN_JOY2_3) ) joysval |= MASK_JOY2_LEFT; +#endif +#ifdef PIN_JOY2_4 + if ( !gpio_get(PIN_JOY2_4) ) joysval |= MASK_JOY2_RIGHT; +#endif +#else +#ifdef PIN_JOY2_3 + if ( !gpio_get(PIN_JOY2_3) ) joysval |= MASK_JOY2_RIGHT; +#endif +#ifdef PIN_JOY2_4 + if ( !gpio_get(PIN_JOY2_4) ) joysval |= MASK_JOY2_LEFT; +#endif +#endif +#ifdef PIN_JOY2_BTN + joysval |= (gpio_get(PIN_JOY2_BTN) ? 0 : MASK_JOY2_BTN); +#endif + + return (joysval); +} + + +int emu_SwapJoysticks(int statusOnly) { + if (!statusOnly) { + if (joySwapped) { + joySwapped = false; + } + else { + joySwapped = true; + } + } + return(joySwapped?1:0); +} + +int emu_GetPad(void) +{ + return(bLastState/*|((joySwapped?1:0)<<7)*/); +} + +int emu_ReadKeys(void) +{ + uint16_t retval; + uint16_t j1 = readAnalogJoystick(); + uint16_t j2 = 0; + + // Second joystick +#if INVY +#ifdef PIN_JOY1_1 + if ( !gpio_get(PIN_JOY1_1) ) j2 |= MASK_JOY2_DOWN; +#endif +#ifdef PIN_JOY1_2 + if ( !gpio_get(PIN_JOY1_2) ) j2 |= MASK_JOY2_UP; +#endif +#else +#ifdef PIN_JOY1_1 + if ( !gpio_get(PIN_JOY1_1) ) j2 |= MASK_JOY2_UP; +#endif +#ifdef PIN_JOY1_2 + if ( !gpio_get(PIN_JOY1_2) ) j2 |= MASK_JOY2_DOWN; +#endif +#endif +#if INVX +#ifdef PIN_JOY1_3 + if ( !gpio_get(PIN_JOY1_3) ) j2 |= MASK_JOY2_LEFT; +#endif +#ifdef PIN_JOY1_4 + if ( !gpio_get(PIN_JOY1_4) ) j2 |= MASK_JOY2_RIGHT; +#endif +#else +#ifdef PIN_JOY1_3 + if ( !gpio_get(PIN_JOY1_3) ) j2 |= MASK_JOY2_RIGHT; +#endif +#ifdef PIN_JOY1_4 + if ( !gpio_get(PIN_JOY1_4) ) j2 |= MASK_JOY2_LEFT; +#endif +#endif +#ifdef PIN_JOY1_BTN + if ( !gpio_get(PIN_JOY1_BTN) ) j2 |= MASK_JOY2_BTN; +#endif + + + if (joySwapped) { + retval = ((j1 << 8) | j2); + } + else { + retval = ((j2 << 8) | j1); + } + + if (usbnavpad & MASK_JOY2_UP) retval |= MASK_JOY2_UP; + if (usbnavpad & MASK_JOY2_DOWN) retval |= MASK_JOY2_DOWN; + if (usbnavpad & MASK_JOY2_LEFT) retval |= MASK_JOY2_LEFT; + if (usbnavpad & MASK_JOY2_RIGHT) retval |= MASK_JOY2_RIGHT; + if (usbnavpad & MASK_JOY2_BTN) retval |= MASK_JOY2_BTN; + +#ifdef PIN_KEY_USER1 + if ( !gpio_get(PIN_KEY_USER1) ) retval |= MASK_KEY_USER1; +#endif +#ifdef PIN_KEY_USER2 + if ( !gpio_get(PIN_KEY_USER2) ) retval |= MASK_KEY_USER2; +#endif +#ifdef PIN_KEY_USER3 + if ( !gpio_get(PIN_KEY_USER3) ) retval |= MASK_KEY_USER3; +#endif +#ifdef PIN_KEY_USER4 + if ( !gpio_get(PIN_KEY_USER4) ) retval |= MASK_KEY_USER4; +#endif + +#ifdef PICOMPUTER + keymatrix_hitrow = -1; + unsigned char row; + unsigned short cols[6]={1,2,3,4,5,14}; + unsigned char keymatrixtmp[6]; + + for (int i=0;i<6;i++){ + gpio_set_dir(cols[i], GPIO_OUT); + gpio_put(cols[i], 0); +#ifdef SWAP_ALT_DEL + sleep_us(1); + //__asm volatile ("nop\n"); // 4-8ns +#endif + row=0; + row |= (gpio_get(9) ? 0 : 0x01); + row |= (gpio_get(9) ? 0 : 0x01); + row |= (gpio_get(9) ? 0 : 0x01); + row |= (gpio_get(9) ? 0 : 0x01); + row |= (gpio_get(8) ? 0 : 0x02); + row |= (gpio_get(6) ? 0 : 0x04); + row |= (gpio_get(15) ? 0 : 0x08); + row |= (gpio_get(7) ? 0 : 0x10); + row |= (gpio_get(22) ? 0 : 0x20); + //gpio_set_dir(cols[i], GPIO_OUT); + gpio_put(cols[i], 1); + gpio_set_dir(cols[i], GPIO_IN); + gpio_disable_pulls(cols[i]); + keymatrixtmp[i] = row; + } + +#ifdef MULTI_DEBOUNCE + for (int i=0;i<6;i++){ + gpio_set_dir(cols[i], GPIO_OUT); + gpio_put(cols[i], 0); +#ifdef SWAP_ALT_DEL + sleep_us(1); + //__asm volatile ("nop\n"); // 4-8ns +#endif + row=0; + row |= (gpio_get(9) ? 0 : 0x01); + row |= (gpio_get(9) ? 0 : 0x01); + row |= (gpio_get(9) ? 0 : 0x01); + row |= (gpio_get(9) ? 0 : 0x01); + row |= (gpio_get(8) ? 0 : 0x02); + row |= (gpio_get(6) ? 0 : 0x04); + row |= (gpio_get(15) ? 0 : 0x08); + row |= (gpio_get(7) ? 0 : 0x10); + row |= (gpio_get(22) ? 0 : 0x20); + //gpio_set_dir(cols[i], GPIO_OUT); + gpio_put(cols[i], 1); + gpio_set_dir(cols[i], GPIO_IN); + gpio_disable_pulls(cols[i]); + keymatrixtmp[i] |= row; + } + + for (int i=0;i<6;i++){ + gpio_set_dir(cols[i], GPIO_OUT); + gpio_put(cols[i], 0); +#ifdef SWAP_ALT_DEL + sleep_us(1); + //__asm volatile ("nop\n"); // 4-8ns +#endif + row=0; + row |= (gpio_get(9) ? 0 : 0x01); + row |= (gpio_get(9) ? 0 : 0x01); + row |= (gpio_get(9) ? 0 : 0x01); + row |= (gpio_get(9) ? 0 : 0x01); + row |= (gpio_get(8) ? 0 : 0x02); + row |= (gpio_get(6) ? 0 : 0x04); + row |= (gpio_get(15) ? 0 : 0x08); + row |= (gpio_get(7) ? 0 : 0x10); + row |= (gpio_get(22) ? 0 : 0x20); + //gpio_set_dir(cols[i], GPIO_OUT); + gpio_put(cols[i], 1); + gpio_set_dir(cols[i], GPIO_IN); + gpio_disable_pulls(cols[i]); + keymatrixtmp[i] |= row; + } +#endif + +#ifdef SWAP_ALT_DEL + // Swap ALT and DEL + unsigned char alt = keymatrixtmp[0] & 0x02; + unsigned char del = keymatrixtmp[5] & 0x20; + keymatrixtmp[0] &= ~0x02; + keymatrixtmp[5] &= ~0x20; + if (alt) keymatrixtmp[5] |= 0x20; + if (del) keymatrixtmp[0] |= 0x02; +#endif + + bool alt_pressed=false; + if ( keymatrixtmp[5] & 0x20 ) {alt_pressed=true; keymatrixtmp[5] &= ~0x20;}; + + for (int i=0;i<6;i++){ + row = keymatrixtmp[i]; + if (row) keymatrix_hitrow=i; + keymatrix[i] = row; + } + + //6,9,15,8,7,22 +#if INVX + if ( row & 0x2 ) retval |= MASK_JOY2_LEFT; + if ( row & 0x1 ) retval |= MASK_JOY2_RIGHT; +#else + if ( row & 0x1 ) retval |= MASK_JOY2_LEFT; + if ( row & 0x2 ) retval |= MASK_JOY2_RIGHT; +#endif +#if INVY + if ( row & 0x8 ) retval |= MASK_JOY2_DOWN; + if ( row & 0x4 ) retval |= MASK_JOY2_UP; +#else + if ( row & 0x4 ) retval |= MASK_JOY2_DOWN; + if ( row & 0x8 ) retval |= MASK_JOY2_UP; +#endif + if ( row & 0x10 ) retval |= MASK_JOY2_BTN; + + // Handle LED flash + uint32_t time_ms=to_ms_since_boot (get_absolute_time()); + if ((time_ms-last_t_ms) > 100) { + last_t_ms = time_ms; + if (ledflash_toggle == false) { + ledflash_toggle = true; + } + else { + ledflash_toggle = false; + } + } + + if ( alt_pressed ) { + if (key_fn == false) + { + // Release to Press transition + if (hundred_ms_cnt == 0) { + keypress_t_ms=time_ms; + hundred_ms_cnt += 1; // 1 + } + else { + hundred_ms_cnt += 1; // 2 + if (hundred_ms_cnt >= 2) + { + hundred_ms_cnt = 0; + /* + if ( (time_ms-keypress_t_ms) < 500) + { + if (key_alt == false) + { + key_alt = true; + } + else + { + key_alt = false; + } + } + */ + } + } + } + else { + // Keep press + if (hundred_ms_cnt == 1) { + if ((to_ms_since_boot (get_absolute_time())-keypress_t_ms) > 2000) + { + if (key_alt == false) + { + key_alt = true; + } + else + { + key_alt = false; + } + hundred_ms_cnt = 0; + } + } + } + key_fn = true; + } + else { + key_fn = false; + } + + // Handle LED + if (key_alt == true) { + gpio_put(KLED, (ledflash_toggle?1:0)); + } + else { + if (key_fn == true) { + gpio_put(KLED, 1); + } + else { + gpio_put(KLED, 0); + } + } + + if ( key_fn ) retval |= MASK_KEY_USER2; + if ( ( key_fn ) && (keymatrix[0] == 0x02 )) retval |= MASK_KEY_USER1; +#endif + + //Serial.println(retval,HEX); + + if ( ((retval & (MASK_KEY_USER1+MASK_KEY_USER2)) == (MASK_KEY_USER1+MASK_KEY_USER2)) + || (retval & MASK_KEY_USER4 ) ) + { + } + +#if (defined(ILI9341) || defined(ST7789)) && defined(USE_VGA) + if (oskbOn) { + retval |= MASK_OSKB; + } +#endif + + return (retval); +} + +unsigned short emu_DebounceLocalKeys(void) +{ + uint16_t bCurState = emu_ReadKeys(); + uint16_t bClick = bCurState & ~bLastState; + bLastState = bCurState; + + return (bClick); +} + +int emu_ReadI2CKeyboard(void) { + int retval=0; +#ifdef PICOMPUTER + if (key_alt) { + keys = (const unsigned short *)key_map3; + } + else if (key_fn) { + keys = (const unsigned short *)key_map2; + } + else { + keys = (const unsigned short *)key_map1; + } + if (keymatrix_hitrow >=0 ) { + unsigned short match = ((unsigned short)keymatrix_hitrow<<8) | keymatrix[keymatrix_hitrow]; + for (int i=0; i=0) { + menuRedraw=true; + curFile -= 9; + } else if (curFile!=0) { + menuRedraw=true; + curFile--; + } + } + else if ( (bClick & MASK_JOY2_DOWN) || (bClick & MASK_JOY1_DOWN) ) { + if ((curFile<(nbFiles-1)) && (nbFiles)) { + curFile++; + menuRedraw=true; + } + } + else if ( (bClick & MASK_JOY2_LEFT) || (bClick & MASK_JOY1_LEFT) ) { + if ((curFile<(nbFiles-9)) && (nbFiles)) { + curFile += 9; + menuRedraw=true; + } + else if ((curFile<(nbFiles-1)) && (nbFiles)) { + curFile++; + menuRedraw=true; + } + } + else if ( (bClick & MASK_KEY_USER2) ) { + emu_SwapJoysticks(0); + menuRedraw=true; + } + + if (menuRedraw && nbFiles) { + int fileIndex = 0; + tft.drawRectNoDma(MENU_FILE_XOFFSET,MENU_FILE_YOFFSET, MENU_FILE_W, MENU_FILE_H, MENU_FILE_BGCOLOR); +// if (curFile <= (MAX_MENULINES/2-1)) topFile=0; +// else topFile=curFile-(MAX_MENULINES/2); + if (curFile <= (MAX_MENULINES-1)) topFile=0; + else topFile=curFile-(MAX_MENULINES/2); + + //Serial.print("curfile: "); + //Serial.println(curFile); + //Serial.print("topFile: "); + //Serial.println(topFile); + + int i=0; + while (i=nbFiles) { + // no more files + break; + } + char * filename = &files[fileIndex][0]; + if (fileIndex >= topFile) { + if ((i+topFile) < nbFiles ) { + if ((i+topFile)==curFile) { + tft.drawTextNoDma(MENU_FILE_XOFFSET,i*TEXT_HEIGHT+MENU_FILE_YOFFSET, filename, RGBVAL16(0xff,0xff,0x00), RGBVAL16(0xff,0x00,0x00), true); + strcpy(selection,filename); + } + else { + tft.drawTextNoDma(MENU_FILE_XOFFSET,i*TEXT_HEIGHT+MENU_FILE_YOFFSET, filename, RGBVAL16(0xff,0xff,0xff), MENU_FILE_BGCOLOR, true); + } + } + i++; + } + fileIndex++; + } + + + tft.drawTextNoDma(48,MENU_JOYS_YOFFSET+8, (emu_SwapJoysticks(1)?(char*)"SWAP=1":(char*)"SWAP=0"), RGBVAL16(0x00,0xff,0xff), RGBVAL16(0x00,0x00,0xff), false); + menuRedraw=false; + } + + return (action); +} + +bool menuActive(void) +{ + return (menuOn); +} + +void toggleMenu(bool on) { + if (on) { + menuOn = true; + backgroundMenu(); + } else { + menuOn = false; + } +} + +char * menuSelection(void) +{ + return (selection); +} + + +/******************************** + * File IO +********************************/ +int emu_FileOpen(char * filename) +{ + int retval = 0; + + char filepath[80]; + strcpy(filepath, romspath); + strcat(filepath, "/"); + strcat(filepath, filename); + emu_printf("FileOpen..."); + emu_printf(filepath); + if( !(f_open(&file, filepath, FA_READ)) ) { + retval = 1; + } + else { + emu_printf("FileOpen failed"); + } + return (retval); +} + +int emu_FileRead(char * buf, int size) +{ + unsigned char buffer[256]; + int remaining = size; + int byteread = 0; + unsigned int retval=0; + if (size < 256) { + if( !(f_read (&file, buffer, size, &retval)) ) + if (retval>0) { + memcpy(buf,buffer,retval); + byteread += retval; + } + } + else { + while (remaining>0) { + if( !(f_read (&file, buffer, 256, &retval)) ) + //f_read (&file, buffer, 256, &retval); + if (retval>0) { + //emu_printi(retval); + memcpy(buf,buffer,retval); + buf += retval; + byteread += retval; + remaining -= retval; + } + else { + break; + } + } + } + return byteread; +} + +unsigned char emu_FileGetc(void) { + unsigned char c; + unsigned int retval=0; + if( !(f_read (&file, &c, 1, &retval)) ) + if (retval != 1) { + emu_printf("emu_FileGetc failed"); + } + return c; +} + +void emu_FileClose(void) +{ + f_close(&file); +} + +int emu_FileSize(char * filename) +{ + int filesize=0; + char filepath[80]; + strcpy(filepath, romspath); + strcat(filepath, "/"); + strcat(filepath, filename); + emu_printf("FileSize..."); + emu_printf(filepath); + FILINFO entry; + f_stat(filepath, &entry); + filesize = entry.fsize; + return(filesize); +} + +int emu_FileSeek(int seek) +{ + f_lseek(&file, seek); + return (seek); +} + +int emu_FileTell(void) +{ + return (f_tell(&file)); +} + +int emu_LoadFile(char * filename, char * buf, int size) +{ + int filesize = 0; + + char filepath[80]; + strcpy(filepath, romspath); + strcat(filepath, "/"); + strcat(filepath, filename); + emu_printf("LoadFile..."); + emu_printf(filepath); + if( !(f_open(&file, filepath, FA_READ)) ) { + filesize = f_size(&file); + emu_printf(filesize); + if (size >= filesize) + { + unsigned int retval=0; + if( (f_read (&file, buf, filesize, &retval)) ) { + emu_printf("File read failed"); + } + } + f_close(&file); + } + + return(filesize); +} + + + + +/******************************** + * Initialization +********************************/ +void emu_init(void) +{ + // Dual display config, initialize TFT +#if (defined(ILI9341) || defined(ST7789)) && defined(USE_VGA) + tft.begin(); +#endif + + sd_init_driver(); + FRESULT fr = f_mount(&fatfs, "0:", 1); + + strcpy(romspath,ROMSDIR); + nbFiles = readNbFiles(romspath); + + emu_printf("SD initialized, files found: "); + emu_printi(nbFiles); + + emu_InitJoysticks(); +#ifdef SWAP_JOYSTICK + joySwapped = true; +#else + joySwapped = false; +#endif + +#ifdef PICOMPUTER + // Flip screen if UP pressed + if (emu_ReadKeys() & MASK_JOY2_UP) + { +#ifdef PICOMPUTERMAX + tft.flipscreen(true); +#else + tft.flipscreen(true); +#endif + } + else + { +#ifdef PICOMPUTERMAX + tft.flipscreen(false); +#else + tft.flipscreen(false); +#endif + } +#endif + + toggleMenu(true); +} + + +void emu_start(void) +{ + usbnavpad = 0; + + keyMap = 0; +} diff --git a/MCUME_pico/pico20/emuapi.h b/MCUME_pico/pico20/emuapi.h new file mode 100644 index 0000000..9bb1163 --- /dev/null +++ b/MCUME_pico/pico20/emuapi.h @@ -0,0 +1,147 @@ +#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 " V20 Emulator " +#define ROMSDIR "v20" + +#define emu_Init(ROM) {v20_Init(); v20_Start(ROM);} +#define emu_Step(x) { v20_Step(); } +#define emu_Input(x) { v20_Input(x); } + +#define PALETTE_SIZE 256 +#define VID_FRAME_SKIP 0x0 +#define TFT_VBUFFER_YCROP 0 +#define SINGLELINE_RENDERING 1 + +#define ACTION_NONE 0 +#define ACTION_MAXKBDVAL 12 +#define ACTION_EXITKBD 128 +#define ACTION_RUNTFT 129 +#define ACTION_RUNVGA 130 + +#ifdef KEYMAP_PRESENT + +#define keylables_map1_0 (char *)"qwertyuiop\x1a" +#define keylables_map1_1 (char *)" asdfghjkl\x19" +#define keylables_map1_2 (char *)" zxcvbnm.\x10 " +const unsigned short key_map1[] = { + 'Q','W','E','R','T','Y','U','I','O','P',157, + 0,'A','S','D','F','G','H','J','K','L',0x0D, + 0,'Z','X','C','V','B','N','M','.',' ', + 0,0,0,0 + }; + +#define keylables_map2_0 (char *)"1234567890 " +#define keylables_map2_1 (char *)" !@#$%+&*- " +#define keylables_map2_2 (char *)" ()?/\"<>,: " +const unsigned short key_map2[] = { + '1','2','3','4','5','6','7','8','9','0',0, + 31, '!','@','#','$','%','+','&','*','-','\/', + 0, '(',')','?','\/','"','<','>',',',':', + 145,157,29,17 + }; + +#define keylables_map3_0 (char *)"\x11\x12\x13\x14\x15\x16\x17\x18 " +#define keylables_map3_1 (char *)" " +#define keylables_map3_2 (char *)" ;= " +const unsigned short key_map3[] = { + 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 + }; + +const unsigned short matkeys[] = { + 0x020,0x120,0x220,0x320,0x420,0x408,0x308,0x208,0x108,0x008,0x002, // row 1 + 0x510,0x010,0x110,0x210,0x310,0x410,0x401,0x301,0x201,0x101,0x001, // row 2 + 0x520,0x102,0x202,0x302,0x402,0x404,0x304,0x204,0x104,0x004, // row 3 + 0x508,0x501,0x502,0x504 }; // cursor keys + +#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 +#define MASK_OSKB 0x8000 + + + +extern void emu_init(void); +extern void emu_start(void); +extern void emu_resetSD(void); + +extern void emu_printf(char * text); +extern void emu_printi(int val); +extern void * emu_Malloc(int size); +extern void emu_Free(void * pt); + + +extern int emu_FileOpen(char * filename); +extern int emu_FileRead(char * buf, int size); +extern unsigned char emu_FileGetc(void); +extern int emu_FileSeek(int seek); +extern void emu_FileClose(void); +extern int emu_FileSize(char * filename); +extern int emu_LoadFile(char * filename, char * buf, int size); +extern int emu_LoadFileSeek(char * filename, char * buf, int size, int seek); +extern void emu_FileTempInit(void); +extern void emu_FileTempRead(int addr, unsigned char * val, int n); +extern void emu_FileTempWrite(int addr, unsigned char val); + +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_DrawLine8(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_DrawVsync(void); +extern int emu_FrameSkip(void); +extern void * emu_LineBuffer(int line); + +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_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 int emu_oskbActive(void); + +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); + +extern void emu_FileTempInit(void); +extern void emu_FileTempRead(int addr, unsigned char * val, int n); +extern void emu_FileTempWrite(int addr, unsigned char val); +extern void emu_printh(int val); + + +#endif diff --git a/MCUME_pico/pico20/kernalromn.h b/MCUME_pico/pico20/kernalromn.h new file mode 100644 index 0000000..fc6b7b9 --- /dev/null +++ b/MCUME_pico/pico20/kernalromn.h @@ -0,0 +1,514 @@ +const unsigned char kernalrom[8192] = { +0x0F,0xDC,0xA5,0x61,0xC9,0x88,0x90,0x03,0x20,0xD4,0xDA,0x20,0xCC,0xDC,0xA5,0x07, +0x18,0x69,0x81,0xF0,0xF3,0x38,0xE9,0x01,0x48,0xA2,0x05,0xB5,0x69,0xB4,0x61,0x95, +0x61,0x94,0x69,0xCA,0x10,0xF5,0xA5,0x56,0x85,0x70,0x20,0x53,0xD8,0x20,0xB4,0xDF, +0xA9,0xC4,0xA0,0xDF,0x20,0x56,0xE0,0xA9,0x00,0x85,0x6F,0x68,0x20,0xB9,0xDA,0x60, +0x85,0x71,0x84,0x72,0x20,0xCA,0xDB,0xA9,0x57,0x20,0x28,0xDA,0x20,0x5A,0xE0,0xA9, +0x57,0xA0,0x00,0x4C,0x28,0xDA,0x85,0x71,0x84,0x72,0x20,0xC7,0xDB,0xB1,0x71,0x85, +0x67,0xA4,0x71,0xC8,0x98,0xD0,0x02,0xE6,0x72,0x85,0x71,0xA4,0x72,0x20,0x28,0xDA, +0xA5,0x71,0xA4,0x72,0x18,0x69,0x05,0x90,0x01,0xC8,0x85,0x71,0x84,0x72,0x20,0x67, +0xD8,0xA9,0x5C,0xA0,0x00,0xC6,0x67,0xD0,0xE4,0x60,0x98,0x35,0x44,0x7A,0x00,0x68, +0x28,0xB1,0x46,0x00,0x20,0x2B,0xDC,0x30,0x37,0xD0,0x20,0x20,0xF3,0xFF,0x86,0x22, +0x84,0x23,0xA0,0x04,0xB1,0x22,0x85,0x62,0xC8,0xB1,0x22,0x85,0x64,0xA0,0x08,0xB1, +0x22,0x85,0x63,0xC8,0xB1,0x22,0x85,0x65,0x4C,0xE0,0xE0,0xA9,0x8B,0xA0,0x00,0x20, +0xA2,0xDB,0xA9,0x8A,0xA0,0xE0,0x20,0x28,0xDA,0xA9,0x8F,0xA0,0xE0,0x20,0x67,0xD8, +0xA6,0x65,0xA5,0x62,0x85,0x65,0x86,0x62,0xA6,0x63,0xA5,0x64,0x85,0x63,0x86,0x64, +0xA9,0x00,0x85,0x66,0xA5,0x61,0x85,0x70,0xA9,0x80,0x85,0x61,0x20,0xD7,0xD8,0xA2, +0x8B,0xA0,0x00,0x4C,0xD4,0xDB,0xC9,0xF0,0xD0,0x07,0x84,0x38,0x86,0x37,0x4C,0x63, +0xC6,0xAA,0xD0,0x02,0xA2,0x1E,0x4C,0x37,0xC4,0x20,0xD2,0xFF,0xB0,0xE8,0x60,0x20, +0xCF,0xFF,0xB0,0xE2,0x60,0x20,0xC9,0xFF,0xB0,0xDC,0x60,0x20,0xC6,0xFF,0xB0,0xD6, +0x60,0x20,0xE4,0xFF,0xB0,0xD0,0x60,0x20,0x8A,0xCD,0x20,0xF7,0xD7,0xA9,0xE1,0x48, +0xA9,0x43,0x48,0xAD,0x0F,0x03,0x48,0xAD,0x0C,0x03,0xAE,0x0D,0x03,0xAC,0x0E,0x03, +0x28,0x6C,0x14,0x00,0x08,0x8D,0x0C,0x03,0x8E,0x0D,0x03,0x8C,0x0E,0x03,0x68,0x8D, +0x0F,0x03,0x60,0x20,0xD1,0xE1,0xA6,0x2D,0xA4,0x2E,0xA9,0x2B,0x20,0xD8,0xFF,0xB0, +0x95,0x60,0xA9,0x01,0x2C,0xA9,0x00,0x85,0x0A,0x20,0xD1,0xE1,0xA5,0x0A,0xA6,0x2B, +0xA4,0x2C,0x20,0xD5,0xFF,0xB0,0x57,0xA5,0x0A,0xF0,0x1A,0xA2,0x1C,0x20,0xB7,0xFF, +0x29,0x10,0xF0,0x03,0x4C,0x37,0xC4,0xA5,0x7A,0xC9,0x02,0xF0,0x07,0xA9,0x64,0xA0, +0xC3,0x4C,0x1E,0xCB,0x60,0x20,0xB7,0xFF,0x29,0xBF,0xF0,0x05,0xA2,0x1D,0x4C,0x37, +0xC4,0xA5,0x7B,0xC9,0x02,0xD0,0x0E,0x86,0x2D,0x84,0x2E,0xA9,0x76,0xA0,0xC3,0x20, +0x1E,0xCB,0x4C,0x2A,0xC5,0x20,0x8E,0xC6,0x4C,0x76,0xE4,0x20,0x16,0xE2,0x20,0xC0, +0xFF,0xB0,0x0B,0x60,0x20,0x16,0xE2,0xA5,0x49,0x20,0xC3,0xFF,0x90,0xC6,0x4C,0xF6, +0xE0,0xA9,0x00,0x20,0xBD,0xFF,0xA2,0x01,0xA0,0x00,0x20,0xBA,0xFF,0x20,0x03,0xE2, +0x20,0x54,0xE2,0x20,0x03,0xE2,0x20,0xFD,0xE1,0xA0,0x00,0x86,0x49,0x20,0xBA,0xFF, +0x20,0x03,0xE2,0x20,0xFD,0xE1,0x8A,0xA8,0xA6,0x49,0x4C,0xBA,0xFF,0x20,0x0B,0xE2, +0x4C,0x9E,0xD7,0x20,0x79,0x00,0xD0,0x02,0x68,0x68,0x60,0x20,0xFD,0xCE,0x20,0x79, +0x00,0xD0,0xF7,0x4C,0x08,0xCF,0xA9,0x00,0x20,0xBD,0xFF,0x20,0x0E,0xE2,0x20,0x9E, +0xD7,0x86,0x49,0x8A,0xA2,0x01,0xA0,0x00,0x20,0xBA,0xFF,0x20,0x03,0xE2,0x20,0xFD, +0xE1,0x86,0x4A,0xA0,0x00,0xA5,0x49,0xE0,0x03,0x90,0x01,0x88,0x20,0xBA,0xFF,0x20, +0x03,0xE2,0x20,0xFD,0xE1,0x8A,0xA8,0xA6,0x4A,0xA5,0x49,0x20,0xBA,0xFF,0x20,0x03, +0xE2,0x20,0x0B,0xE2,0x20,0x9E,0xCD,0x20,0xA3,0xD6,0xA6,0x22,0xA4,0x23,0x4C,0xBD, +0xFF,0xA9,0xDD,0xA0,0xE2,0x20,0x67,0xD8,0x20,0x0C,0xDC,0xA9,0xE2,0xA0,0xE2,0xA6, +0x6E,0x20,0x07,0xDB,0x20,0x0C,0xDC,0x20,0xCC,0xDC,0xA9,0x00,0x85,0x6F,0x20,0x53, +0xD8,0xA9,0xE7,0xA0,0xE2,0x20,0x50,0xD8,0xA5,0x66,0x48,0x10,0x0D,0x20,0x49,0xD8, +0xA5,0x66,0x30,0x09,0xA5,0x12,0x49,0xFF,0x85,0x12,0x20,0xB4,0xDF,0xA9,0xE7,0xA0, +0xE2,0x20,0x67,0xD8,0x68,0x10,0x03,0x20,0xB4,0xDF,0xA9,0xEC,0xA0,0xE2,0x4C,0x40, +0xE0,0x20,0xCA,0xDB,0xA9,0x00,0x85,0x12,0x20,0x68,0xE2,0xA2,0x4E,0xA0,0x00,0x20, +0xF3,0xE0,0xA9,0x57,0xA0,0x00,0x20,0xA2,0xDB,0xA9,0x00,0x85,0x66,0xA5,0x12,0x20, +0xD9,0xE2,0xA9,0x4E,0xA0,0x00,0x4C,0x0F,0xDB,0x48,0x4C,0x9A,0xE2,0x81,0x49,0x0F, +0xDA,0xA2,0x83,0x49,0x0F,0xDA,0xA2,0x7F,0x00,0x00,0x00,0x00,0x05,0x84,0xE6,0x1A, +0x2D,0x1B,0x86,0x28,0x07,0xFB,0xF8,0x87,0x99,0x68,0x89,0x01,0x87,0x23,0x35,0xDF, +0xE1,0x86,0xA5,0x5D,0xE7,0x28,0x83,0x49,0x0F,0xDA,0xA2,0xA5,0x66,0x48,0x10,0x03, +0x20,0xB4,0xDF,0xA5,0x61,0x48,0xC9,0x81,0x90,0x07,0xA9,0xBC,0xA0,0xD9,0x20,0x0F, +0xDB,0xA9,0x3B,0xA0,0xE3,0x20,0x40,0xE0,0x68,0xC9,0x81,0x90,0x07,0xA9,0xDD,0xA0, +0xE2,0x20,0x50,0xD8,0x68,0x10,0x03,0x4C,0xB4,0xDF,0x60,0x0B,0x76,0xB3,0x83,0xBD, +0xD3,0x79,0x1E,0xF4,0xA6,0xF5,0x7B,0x83,0xFC,0xB0,0x10,0x7C,0x0C,0x1F,0x67,0xCA, +0x7C,0xDE,0x53,0xCB,0xC1,0x7D,0x14,0x64,0x70,0x4C,0x7D,0xB7,0xEA,0x51,0x7A,0x7D, +0x63,0x30,0x88,0x7E,0x7E,0x92,0x44,0x99,0x3A,0x7E,0x4C,0xCC,0x91,0xC7,0x7F,0xAA, +0xAA,0xAA,0x13,0x81,0x00,0x00,0x00,0x00,0x20,0x5B,0xE4,0x20,0xA4,0xE3,0x20,0x04, +0xE4,0xA2,0xFB,0x9A,0x4C,0x74,0xC4,0xE6,0x7A,0xD0,0x02,0xE6,0x7B,0xAD,0x60,0xEA, +0xC9,0x3A,0xB0,0x0A,0xC9,0x20,0xF0,0xEF,0x38,0xE9,0x30,0x38,0xE9,0xD0,0x60,0x80, +0x4F,0xC7,0x52,0x58,0xA9,0x4C,0x85,0x54,0x85,0x00,0xA9,0x48,0xA0,0xD2,0x85,0x01, +0x84,0x02,0xA9,0x91,0xA0,0xD3,0x85,0x05,0x84,0x06,0xA9,0xAA,0xA0,0xD1,0x85,0x03, +0x84,0x04,0xA2,0x1C,0xBD,0x87,0xE3,0x95,0x73,0xCA,0x10,0xF8,0xA9,0x03,0x85,0x53, +0xA9,0x00,0x85,0x68,0x85,0x13,0x85,0x18,0xA2,0x01,0x8E,0xFD,0x01,0x8E,0xFC,0x01, +0xA2,0x19,0x86,0x16,0x38,0x20,0x9C,0xFF,0x86,0x2B,0x84,0x2C,0x38,0x20,0x99,0xFF, +0x86,0x37,0x84,0x38,0x86,0x33,0x84,0x34,0xA0,0x00,0x98,0x91,0x2B,0xE6,0x2B,0xD0, +0x02,0xE6,0x2C,0x60,0xA5,0x2B,0xA4,0x2C,0x20,0x08,0xC4,0xA9,0x36,0xA0,0xE4,0x20, +0x1E,0xCB,0xA5,0x37,0x38,0xE5,0x2B,0xAA,0xA5,0x38,0xE5,0x2C,0x20,0xCD,0xDD,0xA9, +0x29,0xA0,0xE4,0x20,0x1E,0xCB,0x4C,0x44,0xC6,0x20,0x42,0x59,0x54,0x45,0x53,0x20, +0x46,0x52,0x45,0x45,0x0D,0x00,0x93,0x2A,0x2A,0x2A,0x2A,0x20,0x43,0x42,0x4D,0x20, +0x42,0x41,0x53,0x49,0x43,0x20,0x56,0x32,0x20,0x2A,0x2A,0x2A,0x2A,0x0D,0x00,0x3A, +0xC4,0x83,0xC4,0x7C,0xC5,0x1A,0xC7,0xE4,0xC7,0x86,0xCE,0xA2,0x0B,0xBD,0x4F,0xE4, +0x9D,0x00,0x03,0xCA,0x10,0xF7,0x60,0x20,0xCC,0xFF,0xA9,0x00,0x85,0x13,0x20,0x7A, +0xC6,0x58,0x4C,0x74,0xC4,0x41,0x20,0x33,0xC5,0x4C,0x77,0xC6,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xAD,0x2C,0x91,0x29,0xDF,0x8D,0x2C,0x91,0x60,0xAD,0x2C,0x91,0x09,0x20,0x8D,0x2C, +0x91,0x60,0xAD,0x1F,0x91,0xCD,0x1F,0x91,0xD0,0xF8,0x4A,0x60,0xA6,0xB9,0x4C,0x47, +0xF6,0x8A,0xD0,0x08,0xA5,0xC3,0x85,0xAE,0xA5,0xC4,0x85,0xAF,0x4C,0x6A,0xF6,0x20, +0xE3,0xF8,0x90,0x03,0x68,0xA9,0x00,0x4C,0x9E,0xF3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xA2,0x10,0xA0,0x91,0x60,0xA2,0x16,0xA0,0x17,0x60,0xB0,0x07,0x86,0xD6,0x84,0xD3, +0x20,0x87,0xE5,0xA6,0xD6,0xA4,0xD3,0x60,0x20,0xBB,0xE5,0xAD,0x88,0x02,0x29,0xFD, +0x0A,0x0A,0x09,0x80,0x8D,0x05,0x90,0xAD,0x88,0x02,0x29,0x02,0xF0,0x08,0xA9,0x80, +0x0D,0x02,0x90,0x8D,0x02,0x90,0xA9,0x00,0x8D,0x91,0x02,0x85,0xCF,0xA9,0xDC,0x8D, +0x8F,0x02,0xA9,0xEB,0x8D,0x90,0x02,0xA9,0x0A,0x8D,0x89,0x02,0x8D,0x8C,0x02,0xA9, +0x06,0x8D,0x86,0x02,0xA9,0x04,0x8D,0x8B,0x02,0xA9,0x0C,0x85,0xCD,0x85,0xCC,0xAD, +0x88,0x02,0x09,0x80,0xA8,0xA9,0x00,0xAA,0x94,0xD9,0x18,0x69,0x16,0x90,0x01,0xC8, +0xE8,0xE0,0x18,0xD0,0xF3,0xA9,0xFF,0x95,0xD9,0xA2,0x16,0x20,0x8D,0xEA,0xCA,0x10, +0xFA,0xA0,0x00,0x84,0xD3,0x84,0xD6,0xA6,0xD6,0xA5,0xD3,0xB4,0xD9,0x30,0x08,0x18, +0x69,0x16,0x85,0xD3,0xCA,0x10,0xF4,0xB5,0xD9,0x29,0x03,0x0D,0x88,0x02,0x85,0xD2, +0xBD,0xFD,0xED,0x85,0xD1,0xA9,0x15,0xE8,0xB4,0xD9,0x30,0x06,0x18,0x69,0x16,0xE8, +0x10,0xF6,0x85,0xD5,0x60,0x20,0xBB,0xE5,0x4C,0x81,0xE5,0xA9,0x03,0x85,0x9A,0xA9, +0x00,0x85,0x99,0xA2,0x10,0xBD,0xE3,0xED,0x9D,0xFF,0x8F,0xCA,0xD0,0xF7,0x60,0xAC, +0x77,0x02,0xA2,0x00,0xBD,0x78,0x02,0x9D,0x77,0x02,0xE8,0xE4,0xC6,0xD0,0xF5,0xC6, +0xC6,0x98,0x58,0x18,0x60,0x20,0x42,0xE7,0xA5,0xC6,0x85,0xCC,0x8D,0x92,0x02,0xF0, +0xF7,0x78,0xA5,0xCF,0xF0,0x0C,0xA5,0xCE,0xAE,0x87,0x02,0xA0,0x00,0x84,0xCF,0x20, +0xA1,0xEA,0x20,0xCF,0xE5,0xC9,0x83,0xD0,0x10,0xA2,0x09,0x78,0x86,0xC6,0xBD,0xF3, +0xED,0x9D,0x76,0x02,0xCA,0xD0,0xF7,0xF0,0xCF,0xC9,0x0D,0xD0,0xC8,0xA4,0xD5,0x84, +0xD0,0xB1,0xD1,0xC9,0x20,0xD0,0x03,0x88,0xD0,0xF7,0xC8,0x84,0xC8,0xA0,0x00,0x8C, +0x92,0x02,0x84,0xD3,0x84,0xD4,0xA5,0xC9,0x30,0x1D,0xA6,0xD6,0x20,0x19,0xE7,0xE4, +0xC9,0xD0,0x14,0xD0,0x12,0xA5,0xCA,0x85,0xD3,0xC5,0xC8,0x90,0x0A,0xB0,0x42,0x98, +0x48,0x8A,0x48,0xA5,0xD0,0xF0,0x91,0xA4,0xD3,0xB1,0xD1,0xEA,0xEA,0xEA,0xEA,0xEA, +0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA, +0xEA,0xEA,0x85,0xD7,0x29,0x3F,0x06,0xD7,0x24,0xD7,0x10,0x02,0x09,0x80,0x90,0x04, +0xA6,0xD4,0xD0,0x04,0x70,0x02,0x09,0x40,0xE6,0xD3,0x20,0xB8,0xE6,0xC4,0xC8,0xD0, +0x17,0xA9,0x00,0x85,0xD0,0xA9,0x0D,0xA6,0x99,0xE0,0x03,0xF0,0x06,0xA6,0x9A,0xE0, +0x03,0xF0,0x03,0x20,0x42,0xE7,0xA9,0x0D,0x85,0xD7,0x68,0xAA,0x68,0xA8,0xA5,0xD7, +0xC9,0xDE,0xD0,0x02,0xA9,0xFF,0x18,0x60,0xC9,0x22,0xD0,0x08,0xA5,0xD4,0x49,0x01, +0x85,0xD4,0xA9,0x22,0x60,0x09,0x40,0xA6,0xC7,0xF0,0x02,0x09,0x80,0xA6,0xD8,0xF0, +0x02,0xC6,0xD8,0xAE,0x86,0x02,0x20,0xA1,0xEA,0x20,0xEA,0xE6,0x68,0xA8,0xA5,0xD8, +0xF0,0x02,0x46,0xD4,0x68,0xAA,0x68,0x18,0x58,0x60,0x20,0xFA,0xE8,0xE6,0xD3,0xA5, +0xD5,0xC5,0xD3,0xB0,0x37,0xC9,0x57,0xF0,0x2A,0xAD,0x92,0x02,0xF0,0x03,0x4C,0xF0, +0xE9,0xA6,0xD6,0xE0,0x17,0x90,0x07,0x20,0x75,0xE9,0xC6,0xD6,0xA6,0xD6,0x16,0xD9, +0x56,0xD9,0x4C,0x5B,0xED,0x69,0x16,0x85,0xD5,0xB5,0xD9,0x30,0x03,0xCA,0xD0,0xF9, +0x4C,0x7E,0xEA,0xC6,0xD6,0x20,0xC3,0xE8,0xA9,0x00,0x85,0xD3,0x60,0xA6,0xD6,0xD0, +0x06,0x86,0xD3,0x68,0x68,0xD0,0xA5,0xCA,0x86,0xD6,0x20,0x87,0xE5,0xA4,0xD5,0x84, +0xD3,0x60,0x48,0x85,0xD7,0x8A,0x48,0x98,0x48,0xA9,0x00,0x85,0xD0,0xA4,0xD3,0xA5, +0xD7,0x10,0x03,0x4C,0x00,0xE8,0xC9,0x0D,0xD0,0x03,0x4C,0xD8,0xE8,0xC9,0x20,0x90, +0x10,0xC9,0x60,0x90,0x04,0x29,0xDF,0xD0,0x02,0x29,0x3F,0x20,0xB8,0xE6,0x4C,0xC7, +0xE6,0xA6,0xD8,0xF0,0x03,0x4C,0xCB,0xE6,0xC9,0x14,0xD0,0x2E,0x98,0xD0,0x06,0x20, +0x2D,0xE7,0x4C,0x9F,0xE7,0x20,0xE8,0xE8,0x88,0x84,0xD3,0x20,0xB2,0xEA,0xC8,0xB1, +0xD1,0x88,0x91,0xD1,0xC8,0xB1,0xF3,0x88,0x91,0xF3,0xC8,0xC4,0xD5,0xD0,0xEF,0xA9, +0x20,0x91,0xD1,0xAD,0x86,0x02,0x91,0xF3,0x10,0x4D,0xA6,0xD4,0xF0,0x03,0x4C,0xCB, +0xE6,0xC9,0x12,0xD0,0x02,0x85,0xC7,0xC9,0x13,0xD0,0x03,0x20,0x81,0xE5,0xC9,0x1D, +0xD0,0x17,0xC8,0x20,0xFA,0xE8,0x84,0xD3,0x88,0xC4,0xD5,0x90,0x09,0xC6,0xD6,0x20, +0xC3,0xE8,0xA0,0x00,0x84,0xD3,0x4C,0xDC,0xE6,0xC9,0x11,0xD0,0x1D,0x18,0x98,0x69, +0x16,0xA8,0xE6,0xD6,0xC5,0xD5,0x90,0xEC,0xF0,0xEA,0xC6,0xD6,0xE9,0x16,0x90,0x04, +0x85,0xD3,0xD0,0xF8,0x20,0xC3,0xE8,0x4C,0xDC,0xE6,0x20,0x12,0xE9,0x4C,0x21,0xED, +0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA, +0xEA,0xEA,0xEA,0xEA,0xEA,0x29,0x7F,0xC9,0x7F,0xD0,0x02,0xA9,0x5E,0xEA,0xEA,0xEA, +0xEA,0xEA,0xEA,0xC9,0x20,0x90,0x03,0x4C,0xC5,0xE6,0xC9,0x0D,0xD0,0x03,0x4C,0xD8, +0xE8,0xA6,0xD4,0xD0,0x3F,0xC9,0x14,0xD0,0x37,0xA4,0xD5,0xB1,0xD1,0xC9,0x20,0xD0, +0x04,0xC4,0xD3,0xD0,0x07,0xC0,0x57,0xF0,0x24,0x20,0xEE,0xE9,0xA4,0xD5,0x20,0xB2, +0xEA,0x88,0xB1,0xD1,0xC8,0x91,0xD1,0x88,0xB1,0xF3,0xC8,0x91,0xF3,0x88,0xC4,0xD3, +0xD0,0xEF,0xA9,0x20,0x91,0xD1,0xAD,0x86,0x02,0x91,0xF3,0xE6,0xD8,0x4C,0xDC,0xE6, +0xA6,0xD8,0xF0,0x05,0x09,0x40,0x4C,0xCB,0xE6,0xC9,0x11,0xD0,0x16,0xA6,0xD6,0xF0, +0x37,0xC6,0xD6,0xA5,0xD3,0x38,0xE9,0x16,0x90,0x04,0x85,0xD3,0x10,0x2A,0x20,0x87, +0xE5,0xD0,0x25,0xC9,0x12,0xD0,0x04,0xA9,0x00,0x85,0xC7,0xC9,0x1D,0xD0,0x12,0x98, +0xF0,0x09,0x20,0xE8,0xE8,0x88,0x84,0xD3,0x4C,0xDC,0xE6,0x20,0x2D,0xE7,0x4C,0xDC, +0xE6,0xC9,0x13,0xD0,0x06,0x20,0x5F,0xE5,0x4C,0xDC,0xE6,0x09,0x80,0x20,0x12,0xE9, +0x4C,0x30,0xED,0x46,0xC9,0xA6,0xD6,0xE8,0xE0,0x17,0xD0,0x03,0x20,0x75,0xE9,0xB5, +0xD9,0x10,0xF4,0x86,0xD6,0x4C,0x87,0xE5,0xA2,0x00,0x86,0xD8,0x86,0xC7,0x86,0xD4, +0x86,0xD3,0x20,0xC3,0xE8,0x4C,0xDC,0xE6,0xA2,0x04,0xA9,0x00,0xC5,0xD3,0xF0,0x07, +0x18,0x69,0x16,0xCA,0xD0,0xF6,0x60,0xC6,0xD6,0x60,0xA2,0x04,0xA9,0x15,0xC5,0xD3, +0xF0,0x07,0x18,0x69,0x16,0xCA,0xD0,0xF6,0x60,0xA6,0xD6,0xE0,0x17,0xF0,0x02,0xE6, +0xD6,0x60,0xA2,0x07,0xDD,0x21,0xE9,0xF0,0x04,0xCA,0x10,0xF8,0x60,0x8E,0x86,0x02, +0x60,0x90,0x05,0x1C,0x9F,0x9C,0x1E,0x1F,0x9E,0xEF,0xA1,0xDF,0xA6,0xE1,0xB1,0xE2, +0xB2,0xE3,0xB3,0xE4,0xB4,0xE5,0xB5,0xE6,0xB6,0xE7,0xB7,0xE8,0xB8,0xE9,0xB9,0xFA, +0xBA,0xFB,0xBB,0xFC,0xBC,0xEC,0xBD,0xFE,0xBE,0x84,0xBF,0xF7,0xC0,0xF8,0xDB,0xF9, +0xDD,0xEA,0xDE,0x5E,0xE0,0x5B,0xE1,0x5D,0xE2,0x40,0xB0,0x61,0xB1,0x78,0xDB,0x79, +0xDD,0x66,0xB6,0x77,0xC0,0x70,0xF0,0x71,0xF1,0x72,0xF2,0x73,0xF3,0x74,0xF4,0x75, +0xF5,0x76,0xF6,0x7D,0xFD,0xA5,0xAC,0x48,0xA5,0xAD,0x48,0xA5,0xAE,0x48,0xA5,0xAF, +0x48,0xA2,0xFF,0xC6,0xD6,0xC6,0xC9,0xC6,0xF2,0xE8,0x20,0x7E,0xEA,0xE0,0x16,0xB0, +0x0C,0xBD,0xFE,0xED,0x85,0xAC,0xB5,0xDA,0x20,0x56,0xEA,0x30,0xEC,0x20,0x8D,0xEA, +0xA2,0x00,0xB5,0xD9,0x29,0x7F,0xB4,0xDA,0x10,0x02,0x09,0x80,0x95,0xD9,0xE8,0xE0, +0x16,0xD0,0xEF,0xA5,0xEF,0x09,0x80,0x85,0xEF,0xA5,0xD9,0x10,0xC4,0xE6,0xD6,0xE6, +0xF2,0xA9,0xFB,0x8D,0x20,0x91,0xAD,0x21,0x91,0xC9,0xFE,0x08,0xA9,0xF7,0x8D,0x20, +0x91,0x28,0xD0,0x0B,0xA0,0x00,0xEA,0xCA,0xD0,0xFC,0x88,0xD0,0xF9,0x84,0xC6,0xA6, +0xD6,0x68,0x85,0xAF,0x68,0x85,0xAE,0x68,0x85,0xAD,0x68,0x85,0xAC,0x60,0xA6,0xD6, +0xE8,0xB5,0xD9,0x10,0xFB,0x86,0xF2,0xE0,0x16,0xF0,0x0D,0x90,0x0B,0x20,0x75,0xE9, +0xA6,0xF2,0xCA,0xC6,0xD6,0x4C,0x0E,0xE7,0xA5,0xAC,0x48,0xA5,0xAD,0x48,0xA5,0xAE, +0x48,0xA5,0xAF,0x48,0xA2,0x17,0xCA,0x20,0x7E,0xEA,0xE4,0xF2,0x90,0x0E,0xF0,0x0C, +0xBD,0xFC,0xED,0x85,0xAC,0xB5,0xD8,0x20,0x56,0xEA,0x30,0xEA,0x20,0x8D,0xEA,0xA2, +0x15,0xE4,0xF2,0x90,0x0F,0xB5,0xDA,0x29,0x7F,0xB4,0xD9,0x10,0x02,0x09,0x80,0x95, +0xDA,0xCA,0xD0,0xED,0xA6,0xF2,0x20,0x0E,0xE7,0x68,0x85,0xAF,0x68,0x85,0xAE,0x68, +0x85,0xAD,0x68,0x85,0xAC,0x60,0x29,0x03,0x0D,0x88,0x02,0x85,0xAD,0x20,0x6E,0xEA, +0xA0,0x15,0xB1,0xAC,0x91,0xD1,0xB1,0xAE,0x91,0xF3,0x88,0x10,0xF5,0x60,0x20,0xB2, +0xEA,0xA5,0xAC,0x85,0xAE,0xA5,0xAD,0x29,0x03,0x09,0x94,0x85,0xAF,0x60,0xBD,0xFD, +0xED,0x85,0xD1,0xB5,0xD9,0x29,0x03,0x0D,0x88,0x02,0x85,0xD2,0x60,0xA0,0x15,0x20, +0x7E,0xEA,0x20,0xB2,0xEA,0xA9,0x20,0x91,0xD1,0xA9,0x01,0x91,0xF3,0x88,0x10,0xF5, +0x60,0xA8,0xA9,0x02,0x85,0xCD,0x20,0xB2,0xEA,0x98,0xA4,0xD3,0x91,0xD1,0x8A,0x91, +0xF3,0x60,0xA5,0xD1,0x85,0xF3,0xA5,0xD2,0x29,0x03,0x09,0x94,0x85,0xF4,0x60,0x20, +0xEA,0xFF,0xA5,0xCC,0xD0,0x29,0xC6,0xCD,0xD0,0x25,0xA9,0x14,0x85,0xCD,0xA4,0xD3, +0x46,0xCF,0xAE,0x87,0x02,0xB1,0xD1,0xB0,0x11,0xE6,0xCF,0x85,0xCE,0x20,0xB2,0xEA, +0xB1,0xF3,0x8D,0x87,0x02,0xAE,0x86,0x02,0xA5,0xCE,0x49,0x80,0x20,0xAA,0xEA,0xAD, +0x1F,0x91,0x29,0x40,0xF0,0x0B,0xA0,0x00,0x84,0xC0,0xAD,0x1C,0x91,0x09,0x02,0xD0, +0x09,0xA5,0xC0,0xD0,0x0D,0xAD,0x1C,0x91,0x29,0xFD,0x2C,0x1E,0x91,0x70,0x03,0x8D, +0x1C,0x91,0x20,0x1E,0xEB,0x2C,0x24,0x91,0x68,0xA8,0x68,0xAA,0x68,0x40,0xA9,0x00, +0x8D,0x8D,0x02,0xA0,0x40,0x84,0xCB,0x8D,0x20,0x91,0xAE,0x21,0x91,0xE0,0xFF,0xF0, +0x5E,0xA9,0xFE,0x8D,0x20,0x91,0xA0,0x00,0xA9,0x5E,0x85,0xF5,0xA9,0xEC,0x85,0xF6, +0xA2,0x08,0xAD,0x21,0x91,0xCD,0x21,0x91,0xD0,0xF6,0x4A,0xB0,0x16,0x48,0xB1,0xF5, +0xC9,0x05,0xB0,0x0C,0xC9,0x03,0xF0,0x08,0x0D,0x8D,0x02,0x8D,0x8D,0x02,0x10,0x02, +0x84,0xCB,0x68,0xC8,0xC0,0x41,0xB0,0x09,0xCA,0xD0,0xDF,0x38,0x2E,0x20,0x91,0xD0, +0xCF,0x6C,0x8F,0x02,0xA4,0xCB,0xB1,0xF5,0xAA,0xC4,0xC5,0xF0,0x07,0xA0,0x10,0x8C, +0x8C,0x02,0xD0,0x36,0x29,0x7F,0x2C,0x8A,0x02,0x30,0x16,0x70,0x49,0xC9,0x7F,0xF0, +0x29,0xC9,0x14,0xF0,0x0C,0xC9,0x20,0xF0,0x08,0xC9,0x1D,0xF0,0x04,0xC9,0x11,0xD0, +0x35,0xAC,0x8C,0x02,0xF0,0x05,0xCE,0x8C,0x02,0xD0,0x2B,0xCE,0x8B,0x02,0xD0,0x26, +0xA0,0x04,0x8C,0x8B,0x02,0xA4,0xC6,0x88,0x10,0x1C,0xA4,0xCB,0x84,0xC5,0xAC,0x8D, +0x02,0x8C,0x8E,0x02,0xE0,0xFF,0xF0,0x0E,0x8A,0xA6,0xC6,0xEC,0x89,0x02,0xB0,0x06, +0x9D,0x77,0x02,0xE8,0x86,0xC6,0xA9,0xF7,0x8D,0x20,0x91,0x60,0xAD,0x8D,0x02,0xC9, +0x03,0xD0,0x2C,0xCD,0x8E,0x02,0xF0,0xEE,0xAD,0x91,0x02,0x30,0x56,0xEA,0xEA,0xEA, +0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA, +0xAD,0x05,0x90,0x49,0x02,0x8D,0x05,0x90,0xEA,0xEA,0xEA,0xEA,0x4C,0x43,0xEC,0x0A, +0xC9,0x08,0x90,0x04,0xA9,0x06,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA, +0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA, +0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xAA,0xBD,0x46,0xEC,0x85,0xF5,0xBD,0x47, +0xEC,0x85,0xF6,0x4C,0x74,0xEB,0x5E,0xEC,0x9F,0xEC,0xE0,0xEC,0xA3,0xED,0x5E,0xEC, +0x9F,0xEC,0x69,0xED,0xA3,0xED,0x21,0xED,0x69,0xED,0x69,0xED,0xA3,0xED,0x31,0x33, +0x35,0x37,0x39,0x2B,0x5C,0x14,0x5F,0x57,0x52,0x59,0x49,0x50,0x2A,0x0D,0x04,0x41, +0x44,0x47,0x4A,0x4C,0x3B,0x1D,0x03,0x01,0x58,0x56,0x4E,0x2C,0x2F,0x11,0x20,0x5A, +0x43,0x42,0x4D,0x2E,0x01,0x85,0x02,0x53,0x46,0x48,0x4B,0x3A,0x3D,0x86,0x51,0x45, +0x54,0x55,0x4F,0x40,0x5E,0x87,0x32,0x34,0x36,0x38,0x30,0x2D,0x13,0x88,0xFF,0x21, +0x23,0x25,0x27,0x29,0xDB,0xA9,0x94,0x5F,0xD7,0xD2,0xD9,0xC9,0xD0,0xC0,0x8D,0x04, +0xC1,0xC4,0xC7,0xCA,0xCC,0x5D,0x9D,0x83,0x01,0xD8,0xD6,0xCE,0x3C,0x3F,0x91,0xA0, +0xDA,0xC3,0xC2,0xCD,0x3E,0x01,0x89,0x02,0xD3,0xC6,0xC8,0xCB,0x5B,0x3D,0x8A,0xD1, +0xC5,0xD4,0xD5,0xCF,0xBA,0xDE,0x8B,0x22,0x24,0x26,0x28,0x30,0xDD,0x93,0x8C,0xFF, +0x21,0x23,0x25,0x27,0x29,0xA6,0xA8,0x94,0x5F,0xB3,0xB2,0xB7,0xA2,0xAF,0xDF,0x8D, +0x04,0xB0,0xAC,0xA5,0xB5,0xB6,0x5D,0x9D,0x83,0x01,0xBD,0xBE,0xAA,0x3C,0x3F,0x91, +0xA0,0xAD,0xBC,0xBF,0xA7,0x3E,0x01,0x89,0x02,0xAE,0xBB,0xB4,0xA1,0x5B,0x3D,0x8A, +0xAB,0xB1,0xA3,0xB8,0xB9,0xA4,0xDE,0x8B,0x22,0x24,0x26,0x28,0x30,0xDC,0x93,0x8C, +0xFF,0xC9,0x0E,0xD0,0x0B,0xA9,0x02,0x0D,0x05,0x90,0x8D,0x05,0x90,0x4C,0xDC,0xE6, +0xC9,0x8E,0xD0,0x0B,0xA9,0xFD,0x2D,0x05,0x90,0x8D,0x05,0x90,0x4C,0xDC,0xE6,0xC9, +0x08,0xD0,0x0A,0xA9,0x80,0x0D,0x91,0x02,0x8D,0x91,0x02,0x30,0xEF,0xC9,0x09,0xD0, +0xEB,0xA9,0x7F,0x2D,0x91,0x02,0x8D,0x91,0x02,0x10,0xE1,0xE8,0xB5,0xD9,0x09,0x80, +0x95,0xD9,0xCA,0xA5,0xD5,0x18,0x4C,0x15,0xE7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0x04,0xFF,0xFF,0xFF,0xFF,0xFF,0xE2,0x9D,0x83,0x01,0xFF,0xFF,0xFF,0xFF, +0xFF,0x91,0xA0,0xFF,0xFF,0xFF,0xFF,0xEE,0x01,0x89,0x02,0xFF,0xFF,0xFF,0xFF,0xE1, +0xFD,0x8A,0xFF,0xFF,0xFF,0xFF,0xFF,0xB0,0xE0,0x8B,0xF2,0xF4,0xF6,0xFF,0xF0,0xED, +0x93,0x8C,0xFF,0x90,0x1C,0x9C,0x1F,0x12,0xFF,0xFF,0xFF,0x06,0xFF,0x12,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x05,0x9F,0x1E,0x9E,0x92, +0xFF,0xFF,0xFF,0xFF,0x05,0x19,0x16,0x2E,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x1B,0x4C,0x4F,0x41,0x44,0x0D,0x52,0x55,0x4E,0x0D,0x00,0x16,0x2C, +0x42,0x58,0x6E,0x84,0x9A,0xB0,0xC6,0xDC,0xF2,0x08,0x1E,0x34,0x4A,0x60,0x76,0x8C, +0xA2,0xB8,0xCE,0xE4,0x09,0x40,0x2C,0x09,0x20,0x20,0x60,0xF1,0x48,0x24,0x94,0x10, +0x0A,0x38,0x66,0xA3,0x20,0x49,0xEE,0x46,0x94,0x46,0xA3,0x68,0x85,0x95,0x20,0xA0, +0xE4,0xC9,0x3F,0xD0,0x03,0x20,0x84,0xEF,0xAD,0x1F,0x91,0x09,0x80,0x8D,0x1F,0x91, +0x20,0x8D,0xEF,0x20,0xA0,0xE4,0x20,0x96,0xEF,0x78,0x20,0xA0,0xE4,0x20,0xB2,0xE4, +0x4A,0xB0,0x61,0x20,0x84,0xEF,0x24,0xA3,0x10,0x0C,0x20,0xB2,0xE4,0x4A,0x90,0xFA, +0x20,0xB2,0xE4,0x4A,0xB0,0xFA,0x20,0xB2,0xE4,0x4A,0x90,0xFA,0x20,0x8D,0xEF,0xA9, +0x08,0x85,0xA5,0xAD,0x1F,0x91,0xCD,0x1F,0x91,0xD0,0xF8,0x4A,0x4A,0x90,0x38,0x66, +0x95,0xB0,0x05,0x20,0xA9,0xE4,0xD0,0x03,0x20,0xA0,0xE4,0x20,0x84,0xEF,0xEA,0xEA, +0xEA,0xEA,0xAD,0x2C,0x91,0x29,0xDF,0x09,0x02,0x8D,0x2C,0x91,0xC6,0xA5,0xD0,0xD3, +0xA9,0x04,0x8D,0x29,0x91,0xAD,0x2D,0x91,0x29,0x20,0xD0,0x0B,0x20,0xB2,0xE4,0x4A, +0xB0,0xF3,0x58,0x60,0xA9,0x80,0x2C,0xA9,0x03,0x20,0x6A,0xFE,0x58,0x18,0x90,0x49, +0x85,0x95,0x20,0x40,0xEE,0xAD,0x1F,0x91,0x29,0x7F,0x8D,0x1F,0x91,0x60,0x85,0x95, +0x20,0x40,0xEE,0x78,0x20,0xA9,0xE4,0x20,0xC5,0xEE,0x20,0x84,0xEF,0x20,0xB2,0xE4, +0xB0,0xFB,0x58,0x60,0x24,0x94,0x30,0x05,0x38,0x66,0x94,0xD0,0x05,0x48,0x20,0x49, +0xEE,0x68,0x85,0x95,0x18,0x60,0x20,0x8D,0xEF,0xAD,0x1F,0x91,0x09,0x80,0x8D,0x1F, +0x91,0xA9,0x5F,0x2C,0xA9,0x3F,0x20,0x1C,0xEE,0x20,0xC5,0xEE,0x8A,0xA2,0x0B,0xCA, +0xD0,0xFD,0xAA,0x20,0x84,0xEF,0x4C,0xA0,0xE4,0x78,0xA9,0x00,0x85,0xA5,0x20,0x84, +0xEF,0x20,0xB2,0xE4,0x90,0xFB,0x20,0xA0,0xE4,0xA9,0x01,0x8D,0x29,0x91,0xAD,0x2D, +0x91,0x29,0x20,0xD0,0x07,0x20,0xB2,0xE4,0xB0,0xF4,0x90,0x18,0xA5,0xA5,0xF0,0x05, +0xA9,0x02,0x4C,0xB9,0xEE,0x20,0xA9,0xE4,0x20,0x0C,0xEF,0xA9,0x40,0x20,0x6A,0xFE, +0xE6,0xA5,0xD0,0xD5,0xA9,0x08,0x85,0xA5,0xAD,0x1F,0x91,0xCD,0x1F,0x91,0xD0,0xF8, +0x4A,0x90,0xF5,0x4A,0x66,0xA4,0xAD,0x1F,0x91,0xCD,0x1F,0x91,0xD0,0xF8,0x4A,0xB0, +0xF5,0xC6,0xA5,0xD0,0xE3,0x20,0xA9,0xE4,0xA5,0x90,0xF0,0x03,0x20,0x0C,0xEF,0xA5, +0xA4,0x58,0x18,0x60,0xAD,0x2C,0x91,0x29,0xFD,0x8D,0x2C,0x91,0x60,0xAD,0x2C,0x91, +0x09,0x02,0x8D,0x2C,0x91,0x60,0xA9,0x04,0x8D,0x29,0x91,0xAD,0x2D,0x91,0x29,0x20, +0xF0,0xF9,0x60,0xA5,0xB4,0xF0,0x47,0x30,0x3F,0x46,0xB6,0xA2,0x00,0x90,0x01,0xCA, +0x8A,0x45,0xBD,0x85,0xBD,0xC6,0xB4,0xF0,0x06,0x8A,0x29,0x20,0x85,0xB5,0x60,0xA9, +0x20,0x2C,0x94,0x02,0xF0,0x14,0x30,0x1C,0x70,0x14,0xA5,0xBD,0xD0,0x01,0xCA,0xC6, +0xB4,0xAD,0x93,0x02,0x10,0xE3,0xC6,0xB4,0xD0,0xDF,0xE6,0xB4,0xD0,0xF0,0xA5,0xBD, +0xF0,0xED,0xD0,0xEA,0x70,0xE9,0x50,0xE6,0xE6,0xB4,0xA2,0xFF,0xD0,0xCB,0xAD,0x94, +0x02,0x4A,0x90,0x07,0x2C,0x20,0x91,0x10,0x1D,0x50,0x1E,0xA9,0x00,0x85,0xBD,0x85, +0xB5,0xAE,0x98,0x02,0x86,0xB4,0xAC,0x9D,0x02,0xCC,0x9E,0x02,0xF0,0x13,0xB1,0xF9, +0x85,0xB6,0xEE,0x9D,0x02,0x60,0xA9,0x40,0x2C,0xA9,0x10,0x0D,0x97,0x02,0x8D,0x97, +0x02,0xA9,0x40,0x8D,0x1E,0x91,0x60,0xA2,0x09,0xA9,0x20,0x2C,0x93,0x02,0xF0,0x01, +0xCA,0x50,0x02,0xCA,0xCA,0x60,0xA6,0xA9,0xD0,0x2E,0xC6,0xA8,0xF0,0x31,0x30,0x0D, +0xA5,0xA7,0x45,0xAB,0x85,0xAB,0x46,0xA7,0x66,0xAA,0x60,0xC6,0xA8,0xA5,0xA7,0xF0, +0x62,0xAD,0x93,0x02,0x0A,0xA9,0x01,0x65,0xA8,0xD0,0xEF,0xA9,0x90,0x8D,0x1E,0x91, +0x85,0xA9,0xA9,0x20,0x8D,0x1E,0x91,0x60,0xA5,0xA7,0xD0,0xEF,0x85,0xA9,0x60,0xAC, +0x9B,0x02,0xC8,0xCC,0x9C,0x02,0xF0,0x2A,0x8C,0x9B,0x02,0x88,0xA5,0xAA,0xAE,0x98, +0x02,0xE0,0x09,0xF0,0x04,0x4A,0xE8,0xD0,0xF8,0x91,0xF7,0xA9,0x20,0x2C,0x94,0x02, +0xF0,0xB9,0x30,0xB6,0xA5,0xA7,0x45,0xAB,0xF0,0x03,0x70,0xAE,0x2C,0x50,0xAB,0xA9, +0x01,0x2C,0xA9,0x04,0x2C,0xA9,0x80,0x2C,0xA9,0x02,0x0D,0x97,0x02,0x8D,0x97,0x02, +0x4C,0x5B,0xF0,0xA5,0xAA,0xD0,0xF1,0xF0,0xEC,0x4C,0x96,0xF7,0x85,0x9A,0xAD,0x94, +0x02,0x4A,0x90,0x27,0xA9,0x02,0x2C,0x10,0x91,0x10,0x1D,0xD0,0x1E,0xAD,0x1E,0x91, +0x29,0x30,0xD0,0xF9,0x2C,0x10,0x91,0x70,0xFB,0xAD,0x10,0x91,0x09,0x02,0x8D,0x10, +0x91,0x2C,0x10,0x91,0x70,0x05,0x30,0xF9,0x20,0x16,0xF0,0x18,0x60,0xAC,0x9E,0x02, +0xC8,0xCC,0x9D,0x02,0xF0,0xF7,0x8C,0x9E,0x02,0x88,0x91,0xF9,0x2C,0x1E,0x91,0x50, +0x01,0x60,0xAD,0x99,0x02,0x8D,0x14,0x91,0xAD,0x9A,0x02,0x8D,0x15,0x91,0xA9,0xC0, +0x8D,0x1E,0x91,0x4C,0xEE,0xEF,0x85,0x99,0xAD,0x94,0x02,0x4A,0x90,0x28,0x29,0x08, +0xF0,0x24,0xA9,0x02,0x2C,0x10,0x91,0x10,0xBF,0xF0,0x19,0x2C,0x1E,0x91,0x70,0xFB, +0xAD,0x10,0x91,0x29,0xFD,0x8D,0x10,0x91,0xAD,0x10,0x91,0x29,0x04,0xF0,0xF9,0xA9, +0x90,0x8D,0x1E,0x91,0x18,0x60,0xAD,0x1E,0x91,0x29,0x30,0xF0,0xF2,0x18,0x60,0xAC, +0x9C,0x02,0xCC,0x9B,0x02,0xF0,0x06,0xB1,0xF7,0xEE,0x9C,0x02,0x60,0xA9,0x00,0x60, +0x48,0xAD,0x1E,0x91,0xF0,0x0C,0xAD,0x1E,0x91,0x29,0x60,0xD0,0xF9,0xA9,0x10,0x8D, +0x1E,0x91,0x68,0x60,0x0D,0x49,0x2F,0x4F,0x20,0x45,0x52,0x52,0x4F,0x52,0x20,0xA3, +0x0D,0x53,0x45,0x41,0x52,0x43,0x48,0x49,0x4E,0x47,0xA0,0x46,0x4F,0x52,0xA0,0x0D, +0x50,0x52,0x45,0x53,0x53,0x20,0x50,0x4C,0x41,0x59,0x20,0x4F,0x4E,0x20,0x54,0x41, +0x50,0xC5,0x50,0x52,0x45,0x53,0x53,0x20,0x52,0x45,0x43,0x4F,0x52,0x44,0x20,0x26, +0x20,0x50,0x4C,0x41,0x59,0x20,0x4F,0x4E,0x20,0x54,0x41,0x50,0xC5,0x0D,0x4C,0x4F, +0x41,0x44,0x49,0x4E,0xC7,0x0D,0x53,0x41,0x56,0x49,0x4E,0x47,0xA0,0x0D,0x56,0x45, +0x52,0x49,0x46,0x59,0x49,0x4E,0xC7,0x0D,0x46,0x4F,0x55,0x4E,0x44,0xA0,0x0D,0x4F, +0x4B,0x8D,0x24,0x9D,0x10,0x0D,0xB9,0x74,0xF1,0x08,0x29,0x7F,0x20,0xD2,0xFF,0xC8, +0x28,0x10,0xF3,0x18,0x60,0xA5,0x99,0xD0,0x08,0xA5,0xC6,0xF0,0x6D,0x78,0x4C,0xCF, +0xE5,0xC9,0x02,0xD0,0x18,0x84,0x97,0x20,0x4F,0xF1,0xA4,0x97,0x18,0x60,0xA5,0x99, +0xD0,0x0B,0xA5,0xD3,0x85,0xCA,0xA5,0xD6,0x85,0xC9,0x4C,0x4F,0xE6,0xC9,0x03,0xD0, +0x09,0x85,0xD0,0xA5,0xD5,0x85,0xC8,0x4C,0x4F,0xE6,0xB0,0x38,0xC9,0x02,0xF0,0x3F, +0x86,0x97,0x20,0x50,0xF2,0xB0,0x16,0x48,0x20,0x50,0xF2,0xB0,0x0D,0xD0,0x05,0xA9, +0x40,0x20,0x6A,0xFE,0xC6,0xA6,0xA6,0x97,0x68,0x60,0xAA,0x68,0x8A,0xA6,0x97,0x60, +0x20,0x8A,0xF8,0xD0,0x0B,0x20,0xC0,0xF8,0xB0,0x11,0xA9,0x00,0x85,0xA6,0xF0,0xF0, +0xB1,0xB2,0x18,0x60,0xA5,0x90,0xF0,0x04,0xA9,0x0D,0x18,0x60,0x4C,0x19,0xEF,0x20, +0x05,0xF2,0xB0,0x05,0xC9,0x00,0xF0,0xF7,0x18,0x60,0x48,0xA5,0x9A,0xC9,0x03,0xD0, +0x04,0x68,0x4C,0x42,0xE7,0x90,0x04,0x68,0x4C,0xE4,0xEE,0xC9,0x02,0xF0,0x2A,0x68, +0x85,0x9E,0x48,0x8A,0x48,0x98,0x48,0x20,0x8A,0xF8,0xD0,0x0E,0x20,0xE3,0xF8,0xB0, +0x0E,0xA9,0x02,0xA0,0x00,0x91,0xB2,0xC8,0x84,0xA6,0xA5,0x9E,0x91,0xB2,0x18,0x68, +0xA8,0x68,0xAA,0x68,0x90,0x02,0xA9,0x00,0x60,0x68,0x86,0x97,0x84,0x9E,0x20,0xED, +0xF0,0xA6,0x97,0xA4,0x9E,0x18,0x60,0x20,0xCF,0xF3,0xF0,0x03,0x4C,0x84,0xF7,0x20, +0xDF,0xF3,0xA5,0xBA,0xF0,0x16,0xC9,0x03,0xF0,0x12,0xB0,0x14,0xC9,0x02,0xD0,0x03, +0x4C,0x16,0xF1,0xA6,0xB9,0xE0,0x60,0xF0,0x03,0x4C,0x8D,0xF7,0x85,0x99,0x18,0x60, +0xAA,0x20,0x14,0xEE,0xA5,0xB9,0x10,0x06,0x20,0xD3,0xEE,0x4C,0x01,0xF3,0x20,0xCE, +0xEE,0x8A,0x24,0x90,0x10,0xE6,0x4C,0x8A,0xF7,0x20,0xCF,0xF3,0xF0,0x03,0x4C,0x84, +0xF7,0x20,0xDF,0xF3,0xA5,0xBA,0xD0,0x03,0x4C,0x90,0xF7,0xC9,0x03,0xF0,0x0F,0xB0, +0x11,0xC9,0x02,0xD0,0x03,0x4C,0xBC,0xF0,0xA6,0xB9,0xE0,0x60,0xF0,0xEA,0x85,0x9A, +0x18,0x60,0xAA,0x20,0x17,0xEE,0xA5,0xB9,0x10,0x05,0x20,0xC5,0xEE,0xD0,0x03,0x20, +0xC0,0xEE,0x8A,0x24,0x90,0x10,0xE7,0x4C,0x8A,0xF7,0x20,0xD4,0xF3,0xF0,0x02,0x18, +0x60,0x20,0xDF,0xF3,0x8A,0x48,0xA5,0xBA,0xF0,0x57,0xC9,0x03,0xF0,0x53,0xB0,0x4E, +0xC9,0x02,0xD0,0x29,0x68,0x20,0xB2,0xF3,0xA9,0x7D,0x8D,0x1E,0x91,0xA9,0x06,0x8D, +0x10,0x91,0xA9,0xEE,0x8D,0x1C,0x91,0x20,0x75,0xFE,0xA5,0xF8,0xF0,0x01,0xC8,0xA5, +0xFA,0xF0,0x01,0xC8,0xA9,0x00,0x85,0xF8,0x85,0xFA,0x4C,0x3C,0xF5,0xA5,0xB9,0x29, +0x0F,0xF0,0x1E,0x20,0x4D,0xF8,0xA9,0x00,0x20,0x90,0xF2,0x4C,0xCF,0xE4,0xB0,0x2E, +0xA5,0xB9,0xC9,0x62,0xD0,0x0B,0xA9,0x05,0x20,0xE7,0xF7,0x4C,0xB1,0xF3,0x20,0xDA, +0xF6,0x68,0xAA,0xC6,0x98,0xE4,0x98,0xF0,0x14,0xA4,0x98,0xB9,0x59,0x02,0x9D,0x59, +0x02,0xB9,0x63,0x02,0x9D,0x63,0x02,0xB9,0x6D,0x02,0x9D,0x6D,0x02,0x18,0x60,0xA9, +0x00,0x85,0x90,0x8A,0xA6,0x98,0xCA,0x30,0x15,0xDD,0x59,0x02,0xD0,0xF8,0x60,0xBD, +0x59,0x02,0x85,0xB8,0xBD,0x63,0x02,0x85,0xBA,0xBD,0x6D,0x02,0x85,0xB9,0x60,0xA9, +0x00,0x85,0x98,0xA2,0x03,0xE4,0x9A,0xB0,0x03,0x20,0x04,0xEF,0xE4,0x99,0xB0,0x03, +0x20,0xF6,0xEE,0x86,0x9A,0xA9,0x00,0x85,0x99,0x60,0xA6,0xB8,0xD0,0x03,0x4C,0x8D, +0xF7,0x20,0xCF,0xF3,0xD0,0x03,0x4C,0x81,0xF7,0xA6,0x98,0xE0,0x0A,0x90,0x03,0x4C, +0x7E,0xF7,0xE6,0x98,0xA5,0xB8,0x9D,0x59,0x02,0xA5,0xB9,0x09,0x60,0x85,0xB9,0x9D, +0x6D,0x02,0xA5,0xBA,0x9D,0x63,0x02,0xF0,0x5A,0xC9,0x03,0xF0,0x56,0x90,0x05,0x20, +0x95,0xF4,0x90,0x4F,0xC9,0x02,0xD0,0x03,0x4C,0xC7,0xF4,0x20,0x4D,0xF8,0xB0,0x03, +0x4C,0x96,0xF7,0xA5,0xB9,0x29,0x0F,0xD0,0x1F,0x20,0x94,0xF8,0xB0,0x36,0x20,0x47, +0xF6,0xA5,0xB7,0xF0,0x0A,0x20,0x67,0xF8,0x90,0x18,0xF0,0x28,0x4C,0x87,0xF7,0x20, +0xAF,0xF7,0xF0,0x20,0x90,0x0C,0xB0,0xF4,0x20,0xB7,0xF8,0xB0,0x17,0xA9,0x04,0x20, +0xE7,0xF7,0xA9,0xBF,0xA4,0xB9,0xC0,0x60,0xF0,0x07,0xA0,0x00,0xA9,0x02,0x91,0xB2, +0x98,0x85,0xA6,0x18,0x60,0xA5,0xB9,0x30,0x2C,0xA4,0xB7,0xF0,0x28,0xA5,0xBA,0x20, +0x17,0xEE,0xA5,0xB9,0x09,0xF0,0x20,0xC0,0xEE,0xA5,0x90,0x10,0x05,0x68,0x68,0x4C, +0x8A,0xF7,0xA5,0xB7,0xF0,0x0C,0xA0,0x00,0xB1,0xBB,0x20,0xE4,0xEE,0xC8,0xC4,0xB7, +0xD0,0xF6,0x20,0x04,0xEF,0x18,0x60,0xA9,0x06,0x8D,0x12,0x91,0x8D,0x10,0x91,0xA9, +0xEE,0x8D,0x1C,0x91,0xA0,0x00,0x8C,0x97,0x02,0xC4,0xB7,0xF0,0x0A,0xB1,0xBB,0x99, +0x93,0x02,0xC8,0xC0,0x04,0xD0,0xF2,0x20,0x27,0xF0,0x8E,0x98,0x02,0xAD,0x93,0x02, +0x29,0x0F,0xD0,0x00,0x0A,0xAA,0xBD,0x5A,0xFF,0x0A,0xA8,0xBD,0x5B,0xFF,0x2A,0x48, +0x98,0x69,0xC8,0x8D,0x99,0x02,0x68,0x69,0x00,0x8D,0x9A,0x02,0xAD,0x94,0x02,0x4A, +0x90,0x09,0xAD,0x20,0x91,0x0A,0xB0,0x03,0x4C,0x16,0xF0,0xAD,0x9B,0x02,0x8D,0x9C, +0x02,0xAD,0x9E,0x02,0x8D,0x9D,0x02,0x20,0x75,0xFE,0xA5,0xF8,0xD0,0x05,0x88,0x84, +0xF8,0x86,0xF7,0xA5,0xFA,0xD0,0x05,0x88,0x84,0xFA,0x86,0xF9,0x38,0xA9,0xF0,0x4C, +0x7B,0xFE,0x86,0xC3,0x84,0xC4,0x6C,0x30,0x03,0x85,0x93,0xA9,0x00,0x85,0x90,0xA5, +0xBA,0xD0,0x03,0x4C,0x96,0xF7,0xC9,0x03,0xF0,0xF9,0x90,0x6E,0xA4,0xB7,0xD0,0x03, +0x4C,0x93,0xF7,0x20,0xBC,0xE4,0xA9,0x60,0x85,0xB9,0x20,0x95,0xF4,0xA5,0xBA,0x20, +0x14,0xEE,0xA5,0xB9,0x20,0xCE,0xEE,0x20,0x19,0xEF,0x85,0xAE,0xA5,0x90,0x4A,0x4A, +0xB0,0x45,0x20,0x19,0xEF,0x85,0xAF,0x20,0xC1,0xE4,0xA9,0xFD,0x25,0x90,0x85,0x90, +0x20,0xE1,0xFF,0xD0,0x03,0x4C,0xCB,0xF6,0x20,0x19,0xEF,0xAA,0xA5,0x90,0x4A,0x4A, +0xB0,0xE8,0x8A,0xA4,0x93,0xF0,0x0C,0xA0,0x00,0xD1,0xAE,0xF0,0x08,0xA9,0x10,0x20, +0x6A,0xFE,0x2C,0x91,0xAE,0xE6,0xAE,0xD0,0x02,0xE6,0xAF,0x24,0x90,0x50,0xCB,0x20, +0xF6,0xEE,0x20,0xDA,0xF6,0x90,0x7A,0x4C,0x87,0xF7,0xC9,0x02,0xD0,0x03,0x4C,0xB9, +0xF0,0x20,0x4D,0xF8,0xB0,0x03,0x4C,0x96,0xF7,0x20,0x94,0xF8,0xB0,0x68,0x20,0x47, +0xF6,0xA5,0xB7,0xF0,0x09,0x20,0x67,0xF8,0x90,0x0B,0xF0,0x5A,0xB0,0xD9,0x20,0xAF, +0xF7,0xF0,0x53,0xB0,0xD2,0xA5,0x90,0x29,0x10,0x38,0xD0,0x4A,0xE0,0x01,0xF0,0x11, +0xE0,0x03,0xD0,0xDD,0xA0,0x01,0xB1,0xB2,0x85,0xC3,0xC8,0xB1,0xB2,0x85,0xC4,0xB0, +0x04,0xA5,0xB9,0xD0,0xEF,0xA0,0x03,0xB1,0xB2,0xA0,0x01,0xF1,0xB2,0xAA,0xA0,0x04, +0xB1,0xB2,0xA0,0x02,0xF1,0xB2,0xA8,0x18,0x8A,0x65,0xC3,0x85,0xAE,0x98,0x65,0xC4, +0x85,0xAF,0xA5,0xC3,0x85,0xC1,0xA5,0xC4,0x85,0xC2,0x20,0x6A,0xF6,0x20,0xC9,0xF8, +0x24,0x18,0xA6,0xAE,0xA4,0xAF,0x60,0xA5,0x9D,0x10,0x1E,0xA0,0x0C,0x20,0xE6,0xF1, +0xA5,0xB7,0xF0,0x15,0xA0,0x17,0x20,0xE6,0xF1,0xA4,0xB7,0xF0,0x0C,0xA0,0x00,0xB1, +0xBB,0x20,0xD2,0xFF,0xC8,0xC4,0xB7,0xD0,0xF6,0x60,0xA0,0x49,0xA5,0x93,0xF0,0x02, +0xA0,0x59,0x4C,0xE2,0xF1,0x86,0xAE,0x84,0xAF,0xAA,0xB5,0x00,0x85,0xC1,0xB5,0x01, +0x85,0xC2,0x6C,0x32,0x03,0xA5,0xBA,0xD0,0x03,0x4C,0x96,0xF7,0xC9,0x03,0xF0,0xF9, +0x90,0x5F,0xA9,0x61,0x85,0xB9,0xA4,0xB7,0xD0,0x03,0x4C,0x93,0xF7,0x20,0x95,0xF4, +0x20,0x28,0xF7,0xA5,0xBA,0x20,0x17,0xEE,0xA5,0xB9,0x20,0xC0,0xEE,0xA0,0x00,0x20, +0xD2,0xFB,0xA5,0xAC,0x20,0xE4,0xEE,0xA5,0xAD,0x20,0xE4,0xEE,0x20,0x11,0xFD,0xB0, +0x16,0xB1,0xAC,0x20,0xE4,0xEE,0x20,0xE1,0xFF,0xD0,0x07,0x20,0xDA,0xF6,0xA9,0x00, +0x38,0x60,0x20,0x1B,0xFD,0xD0,0xE5,0x20,0x04,0xEF,0x24,0xB9,0x30,0x11,0xA5,0xBA, +0x20,0x17,0xEE,0xA5,0xB9,0x29,0xEF,0x09,0xE0,0x20,0xC0,0xEE,0x20,0x04,0xEF,0x18, +0x60,0xC9,0x02,0xD0,0x03,0x4C,0xB9,0xF0,0x20,0x4D,0xF8,0x90,0x8C,0x20,0xB7,0xF8, +0xB0,0x25,0x20,0x28,0xF7,0xA2,0x03,0xA5,0xB9,0x29,0x01,0xD0,0x02,0xA2,0x01,0x8A, +0x20,0xE7,0xF7,0xB0,0x12,0x20,0xE6,0xF8,0xB0,0x0D,0xA5,0xB9,0x29,0x02,0xF0,0x06, +0xA9,0x05,0x20,0xE7,0xF7,0x24,0x18,0x60,0xA5,0x9D,0x10,0xFB,0xA0,0x51,0x20,0xE6, +0xF1,0x4C,0x59,0xF6,0xA2,0x00,0xE6,0xA2,0xD0,0x06,0xE6,0xA1,0xD0,0x02,0xE6,0xA0, +0x38,0xA5,0xA2,0xE9,0x01,0xA5,0xA1,0xE9,0x1A,0xA5,0xA0,0xE9,0x4F,0x90,0x06,0x86, +0xA0,0x86,0xA1,0x86,0xA2,0xAD,0x2F,0x91,0xCD,0x2F,0x91,0xD0,0xF8,0x85,0x91,0x60, +0x78,0xA5,0xA2,0xA6,0xA1,0xA4,0xA0,0x78,0x85,0xA2,0x86,0xA1,0x84,0xA0,0x58,0x60, +0xA5,0x91,0xC9,0xFE,0xD0,0x07,0x08,0x20,0xCC,0xFF,0x85,0xC6,0x28,0x60,0xA9,0x01, +0x2C,0xA9,0x02,0x2C,0xA9,0x03,0x2C,0xA9,0x04,0x2C,0xA9,0x05,0x2C,0xA9,0x06,0x2C, +0xA9,0x07,0x2C,0xA9,0x08,0x2C,0xA9,0x09,0x48,0x20,0xCC,0xFF,0xA0,0x00,0x24,0x9D, +0x50,0x0A,0x20,0xE6,0xF1,0x68,0x48,0x09,0x30,0x20,0xD2,0xFF,0x68,0x38,0x60,0xA5, +0x93,0x48,0x20,0xC0,0xF8,0x68,0x85,0x93,0xB0,0x2C,0xA0,0x00,0xB1,0xB2,0xC9,0x05, +0xF0,0x24,0xC9,0x01,0xF0,0x08,0xC9,0x03,0xF0,0x04,0xC9,0x04,0xD0,0xE1,0xAA,0x24, +0x9D,0x10,0x11,0xA0,0x63,0x20,0xE6,0xF1,0xA0,0x05,0xB1,0xB2,0x20,0xD2,0xFF,0xC8, +0xC0,0x15,0xD0,0xF6,0x18,0x88,0x60,0x85,0x9E,0x20,0x4D,0xF8,0x90,0x5E,0xA5,0xC2, +0x48,0xA5,0xC1,0x48,0xA5,0xAF,0x48,0xA5,0xAE,0x48,0xA0,0xBF,0xA9,0x20,0x91,0xB2, +0x88,0xD0,0xFB,0xA5,0x9E,0x91,0xB2,0xC8,0xA5,0xC1,0x91,0xB2,0xC8,0xA5,0xC2,0x91, +0xB2,0xC8,0xA5,0xAE,0x91,0xB2,0xC8,0xA5,0xAF,0x91,0xB2,0xC8,0x84,0x9F,0xA0,0x00, +0x84,0x9E,0xA4,0x9E,0xC4,0xB7,0xF0,0x0C,0xB1,0xBB,0xA4,0x9F,0x91,0xB2,0xE6,0x9E, +0xE6,0x9F,0xD0,0xEE,0x20,0x54,0xF8,0xA9,0x69,0x85,0xAB,0x20,0xEA,0xF8,0xA8,0x68, +0x85,0xAE,0x68,0x85,0xAF,0x68,0x85,0xC1,0x68,0x85,0xC2,0x98,0x60,0xA6,0xB2,0xA4, +0xB3,0xC0,0x02,0x60,0x20,0x4D,0xF8,0x8A,0x85,0xC1,0x18,0x69,0xC0,0x85,0xAE,0x98, +0x85,0xC2,0x69,0x00,0x85,0xAF,0x60,0x20,0xAF,0xF7,0xB0,0x1D,0xA0,0x05,0x84,0x9F, +0xA0,0x00,0x84,0x9E,0xC4,0xB7,0xF0,0x10,0xB1,0xBB,0xA4,0x9F,0xD1,0xB2,0xD0,0xE7, +0xE6,0x9E,0xE6,0x9F,0xA4,0x9E,0xD0,0xEC,0x18,0x60,0x20,0x4D,0xF8,0xE6,0xA6,0xA4, +0xA6,0xC0,0xC0,0x60,0x20,0xAB,0xF8,0xF0,0x1C,0xA0,0x1B,0x20,0xE6,0xF1,0x20,0x4B, +0xF9,0x20,0xAB,0xF8,0xD0,0xF8,0xA0,0x6A,0x4C,0xE6,0xF1,0xA9,0x40,0x2C,0x1F,0x91, +0xD0,0x03,0x2C,0x1F,0x91,0x18,0x60,0x20,0xAB,0xF8,0xF0,0xF9,0xA0,0x2E,0xD0,0xDB, +0xA9,0x00,0x85,0x90,0x85,0x93,0x20,0x54,0xF8,0x20,0x94,0xF8,0xB0,0x1F,0x78,0xA9, +0x00,0x85,0xAA,0x85,0xB4,0x85,0xB0,0x85,0x9E,0x85,0x9F,0x85,0x9C,0xA9,0x82,0xA2, +0x0E,0xD0,0x11,0x20,0x54,0xF8,0xA9,0x14,0x85,0xAB,0x20,0xB7,0xF8,0xB0,0x68,0x78, +0xA9,0xA0,0xA2,0x08,0xA0,0x7F,0x8C,0x2E,0x91,0x8D,0x2E,0x91,0x20,0x60,0xF1,0xAD, +0x14,0x03,0x8D,0x9F,0x02,0xAD,0x15,0x03,0x8D,0xA0,0x02,0x20,0xFB,0xFC,0xA9,0x02, +0x85,0xBE,0x20,0xDB,0xFB,0xAD,0x1C,0x91,0x29,0xFD,0x09,0x0C,0x8D,0x1C,0x91,0x85, +0xC0,0xA2,0xFF,0xA0,0xFF,0x88,0xD0,0xFD,0xCA,0xD0,0xF8,0x8D,0x29,0x91,0x58,0xAD, +0xA0,0x02,0xCD,0x15,0x03,0x18,0xF0,0x1F,0x20,0x4B,0xF9,0xAD,0x2D,0x91,0x29,0x40, +0xF0,0xED,0xAD,0x14,0x91,0x20,0x34,0xF7,0x4C,0x2F,0xF9,0x20,0xE1,0xFF,0x18,0xD0, +0x0B,0x20,0xCF,0xFC,0x38,0x68,0x68,0xA9,0x00,0x8D,0xA0,0x02,0x60,0x86,0xB1,0xA5, +0xB0,0x0A,0x0A,0x18,0x65,0xB0,0x18,0x65,0xB1,0x85,0xB1,0xA9,0x00,0x24,0xB0,0x30, +0x01,0x2A,0x06,0xB1,0x2A,0x06,0xB1,0x2A,0xAA,0xAD,0x28,0x91,0xC9,0x15,0x90,0xF9, +0x65,0xB1,0x8D,0x24,0x91,0x8A,0x6D,0x29,0x91,0x8D,0x25,0x91,0x58,0x60,0xAE,0x29, +0x91,0xA0,0xFF,0x98,0xED,0x28,0x91,0xEC,0x29,0x91,0xD0,0xF2,0x86,0xB1,0xAA,0x8C, +0x28,0x91,0x8C,0x29,0x91,0x98,0xE5,0xB1,0x86,0xB1,0x4A,0x66,0xB1,0x4A,0x66,0xB1, +0xA5,0xB0,0x18,0x69,0x3C,0x2C,0x21,0x91,0xC5,0xB1,0xB0,0x4A,0xA6,0x9C,0xF0,0x03, +0x4C,0xAD,0xFA,0xA6,0xA3,0x30,0x1B,0xA2,0x00,0x69,0x30,0x65,0xB0,0xC5,0xB1,0xB0, +0x1C,0xE8,0x69,0x26,0x65,0xB0,0xC5,0xB1,0xB0,0x17,0x69,0x2C,0x65,0xB0,0xC5,0xB1, +0x90,0x03,0x4C,0x60,0xFA,0xA5,0xB4,0xF0,0x1D,0x85,0xA8,0xD0,0x19,0xE6,0xA9,0xB0, +0x02,0xC6,0xA9,0x38,0xE9,0x13,0xE5,0xB1,0x65,0x92,0x85,0x92,0xA5,0xA4,0x49,0x01, +0x85,0xA4,0xF0,0x21,0x86,0xD7,0xA5,0xB4,0xF0,0x18,0x2C,0x2D,0x91,0x50,0x13,0xA9, +0x00,0x85,0xA4,0xA5,0xA3,0x10,0x30,0x30,0xC9,0xA2,0xA6,0x20,0x5D,0xF9,0xA5,0x9B, +0xD0,0xC3,0x4C,0x56,0xFF,0xA5,0x92,0xF0,0x07,0x30,0x03,0xC6,0xB0,0x2C,0xE6,0xB0, +0xA9,0x00,0x85,0x92,0xE4,0xD7,0xD0,0x0F,0x8A,0xD0,0xAA,0xA5,0xA9,0x30,0xC7,0xC9, +0x10,0x90,0xC3,0x85,0x96,0xB0,0xBF,0x8A,0x45,0x9B,0x85,0x9B,0xA5,0xB4,0xF0,0xD2, +0xC6,0xA3,0x30,0xC5,0x46,0xD7,0x66,0xBF,0xA2,0xDA,0x20,0x5D,0xF9,0x4C,0x56,0xFF, +0xA5,0x96,0xF0,0x04,0xA5,0xB4,0xF0,0x04,0xA5,0xA3,0x10,0x85,0x46,0xB1,0xA9,0x93, +0x38,0xE5,0xB1,0x65,0xB0,0x0A,0xAA,0x20,0x5D,0xF9,0xE6,0x9C,0xA5,0xB4,0xD0,0x11, +0xA5,0x96,0xF0,0x26,0x85,0xA8,0xA9,0x00,0x85,0x96,0xA9,0xC0,0x8D,0x2E,0x91,0x85, +0xB4,0xA5,0x96,0x85,0xB5,0xF0,0x09,0xA9,0x00,0x85,0xB4,0xA9,0x40,0x8D,0x2E,0x91, +0xA5,0xBF,0x85,0xBD,0xA5,0xA8,0x05,0xA9,0x85,0xB6,0x4C,0x56,0xFF,0x20,0xDB,0xFB, +0x85,0x9C,0xA2,0xDA,0x20,0x5D,0xF9,0xA5,0xBE,0xF0,0x02,0x85,0xA7,0xA9,0x0F,0x24, +0xAA,0x10,0x17,0xA5,0xB5,0xD0,0x0C,0xA6,0xBE,0xCA,0xD0,0x0B,0xA9,0x08,0x20,0x6A, +0xFE,0xD0,0x04,0xA9,0x00,0x85,0xAA,0x4C,0x56,0xFF,0x70,0x31,0xD0,0x18,0xA5,0xB5, +0xD0,0xF5,0xA5,0xB6,0xD0,0xF1,0xA5,0xA7,0x4A,0xA5,0xBD,0x30,0x03,0x90,0x18,0x18, +0xB0,0x15,0x29,0x0F,0x85,0xAA,0xC6,0xAA,0xD0,0xDD,0xA9,0x40,0x85,0xAA,0x20,0xD2, +0xFB,0xA9,0x00,0x85,0xAB,0xF0,0xD0,0xA9,0x80,0x85,0xAA,0xD0,0xCA,0xA5,0xB5,0xF0, +0x0A,0xA9,0x04,0x20,0x6A,0xFE,0xA9,0x00,0x4C,0x97,0xFB,0x20,0x11,0xFD,0x90,0x03, +0x4C,0x95,0xFB,0xA6,0xA7,0xCA,0xF0,0x2D,0xA5,0x93,0xF0,0x0C,0xA0,0x00,0xA5,0xBD, +0xD1,0xAC,0xF0,0x04,0xA9,0x01,0x85,0xB6,0xA5,0xB6,0xF0,0x4B,0xA2,0x3D,0xE4,0x9E, +0x90,0x3E,0xA6,0x9E,0xA5,0xAD,0x9D,0x01,0x01,0xA5,0xAC,0x9D,0x00,0x01,0xE8,0xE8, +0x86,0x9E,0x4C,0x87,0xFB,0xA6,0x9F,0xE4,0x9E,0xF0,0x35,0xA5,0xAC,0xDD,0x00,0x01, +0xD0,0x2E,0xA5,0xAD,0xDD,0x01,0x01,0xD0,0x27,0xE6,0x9F,0xE6,0x9F,0xA5,0x93,0xF0, +0x0B,0xA5,0xBD,0xA0,0x00,0xD1,0xAC,0xF0,0x17,0xC8,0x84,0xB6,0xA5,0xB6,0xF0,0x07, +0xA9,0x10,0x20,0x6A,0xFE,0xD0,0x09,0xA5,0x93,0xD0,0x05,0xA8,0xA5,0xBD,0x91,0xAC, +0x20,0x1B,0xFD,0xD0,0x3A,0xA9,0x80,0x85,0xAA,0xA6,0xBE,0xCA,0x30,0x02,0x86,0xBE, +0xC6,0xA7,0xF0,0x08,0xA5,0x9E,0xD0,0x27,0x85,0xBE,0xF0,0x23,0x20,0xCF,0xFC,0x20, +0xD2,0xFB,0xA0,0x00,0x84,0xAB,0xB1,0xAC,0x45,0xAB,0x85,0xAB,0x20,0x1B,0xFD,0x20, +0x11,0xFD,0x90,0xF2,0xA5,0xAB,0x45,0xBD,0xF0,0x05,0xA9,0x20,0x20,0x6A,0xFE,0x4C, +0x56,0xFF,0xA5,0xC2,0x85,0xAD,0xA5,0xC1,0x85,0xAC,0x60,0xA9,0x08,0x85,0xA3,0xA9, +0x00,0x85,0xA4,0x85,0xA8,0x85,0x9B,0x85,0xA9,0x60,0xA5,0xBD,0x4A,0xA9,0x60,0x90, +0x02,0xA9,0xB0,0xA2,0x00,0x8D,0x28,0x91,0x8E,0x29,0x91,0xAD,0x20,0x91,0x49,0x08, +0x8D,0x20,0x91,0x29,0x08,0x60,0x38,0x66,0xAD,0x30,0x3C,0xA5,0xA8,0xD0,0x12,0xA9, +0x10,0xA2,0x01,0x20,0xF5,0xFB,0xD0,0x2F,0xE6,0xA8,0xA5,0xAD,0x10,0x29,0x4C,0x95, +0xFC,0xA5,0xA9,0xD0,0x09,0x20,0xF1,0xFB,0xD0,0x1D,0xE6,0xA9,0xD0,0x19,0x20,0xEA, +0xFB,0xD0,0x14,0xA5,0xA4,0x49,0x01,0x85,0xA4,0xF0,0x0F,0xA5,0xBD,0x49,0x01,0x85, +0xBD,0x29,0x01,0x45,0x9B,0x85,0x9B,0x4C,0x56,0xFF,0x46,0xBD,0xC6,0xA3,0xA5,0xA3, +0xF0,0x3A,0x10,0xF3,0x20,0xDB,0xFB,0x58,0xA5,0xA5,0xF0,0x12,0xA2,0x00,0x86,0xD7, +0xC6,0xA5,0xA6,0xBE,0xE0,0x02,0xD0,0x02,0x09,0x80,0x85,0xBD,0xD0,0xD9,0x20,0x11, +0xFD,0x90,0x0A,0xD0,0x91,0xE6,0xAD,0xA5,0xD7,0x85,0xBD,0xB0,0xCA,0xA0,0x00,0xB1, +0xAC,0x85,0xBD,0x45,0xD7,0x85,0xD7,0x20,0x1B,0xFD,0xD0,0xBB,0xA5,0x9B,0x49,0x01, +0x85,0xBD,0x4C,0x56,0xFF,0xC6,0xBE,0xD0,0x03,0x20,0x08,0xFD,0xA9,0x50,0x85,0xA7, +0xA2,0x08,0x78,0x20,0xFB,0xFC,0xD0,0xEA,0xA9,0x78,0x20,0xF3,0xFB,0xD0,0xE3,0xC6, +0xA7,0xD0,0xDF,0x20,0xDB,0xFB,0xC6,0xAB,0x10,0xD8,0xA2,0x0A,0x20,0xFB,0xFC,0x58, +0xE6,0xAB,0xA5,0xBE,0xF0,0x30,0x20,0xD2,0xFB,0xA2,0x09,0x86,0xA5,0xD0,0x85,0x08, +0x78,0x20,0x08,0xFD,0xA9,0x7F,0x8D,0x2E,0x91,0xA9,0xF7,0x8D,0x20,0x91,0xA9,0x40, +0x8D,0x2B,0x91,0x20,0x39,0xFE,0xAD,0xA0,0x02,0xF0,0x09,0x8D,0x15,0x03,0xAD,0x9F, +0x02,0x8D,0x14,0x03,0x28,0x60,0x20,0xCF,0xFC,0xF0,0x97,0xBD,0xE9,0xFD,0x8D,0x14, +0x03,0xBD,0xEA,0xFD,0x8D,0x15,0x03,0x60,0xAD,0x1C,0x91,0x09,0x0E,0x8D,0x1C,0x91, +0x60,0x38,0xA5,0xAC,0xE5,0xAE,0xA5,0xAD,0xE5,0xAF,0x60,0xE6,0xAC,0xD0,0x02,0xE6, +0xAD,0x60,0xA2,0xFF,0x78,0x9A,0xD8,0x20,0x3F,0xFD,0xD0,0x03,0x6C,0x00,0xA0,0x20, +0x8D,0xFD,0x20,0x52,0xFD,0x20,0xF9,0xFD,0x20,0x18,0xE5,0x58,0x6C,0x00,0xC0,0xA2, +0x05,0xBD,0x4C,0xFD,0xDD,0x03,0xA0,0xD0,0x03,0xCA,0xD0,0xF5,0x60,0x41,0x30,0xC3, +0xC2,0xCD,0xA2,0x6D,0xA0,0xFD,0x18,0x86,0xC3,0x84,0xC4,0xA0,0x1F,0xB9,0x14,0x03, +0xB0,0x02,0xB1,0xC3,0x91,0xC3,0x99,0x14,0x03,0x88,0x10,0xF1,0x60,0xBF,0xEA,0xD2, +0xFE,0xAD,0xFE,0x0A,0xF4,0x4A,0xF3,0xC7,0xF2,0x09,0xF3,0xF3,0xF3,0x0E,0xF2,0x7A, +0xF2,0x70,0xF7,0xF5,0xF1,0xEF,0xF3,0xD2,0xFE,0x49,0xF5,0x85,0xF6,0xA9,0x00,0xAA, +0x95,0x00,0x9D,0x00,0x02,0x9D,0x00,0x03,0xE8,0xD0,0xF5,0xA2,0x3C,0xA0,0x03,0x86, +0xB2,0x84,0xB3,0x85,0xC1,0x85,0x97,0x8D,0x81,0x02,0xA8,0xA9,0x04,0x85,0xC2,0xE6, +0xC1,0xD0,0x02,0xE6,0xC2,0x20,0x91,0xFE,0xA5,0x97,0xF0,0x22,0xB0,0xF1,0xA4,0xC2, +0xA6,0xC1,0xC0,0x20,0x90,0x25,0xC0,0x21,0xB0,0x08,0xA0,0x1E,0x8C,0x88,0x02,0x4C, +0x7B,0xFE,0xA9,0x12,0x8D,0x82,0x02,0xA9,0x10,0x8D,0x88,0x02,0xD0,0xF1,0x90,0xCF, +0xA5,0xC2,0x8D,0x82,0x02,0x85,0x97,0xC9,0x11,0x90,0xC4,0x20,0xC3,0xE5,0x4C,0xEB, +0xFD,0xA8,0xFC,0x0B,0xFC,0xBF,0xEA,0x8E,0xF9,0xA9,0x7F,0x8D,0x1E,0x91,0x8D,0x2E, +0x91,0xA9,0x40,0x8D,0x2B,0x91,0xA9,0x40,0x8D,0x1B,0x91,0xA9,0xFE,0x8D,0x1C,0x91, +0xA9,0xDE,0x8D,0x2C,0x91,0xA2,0x00,0x8E,0x12,0x91,0xA2,0xFF,0x8E,0x22,0x91,0xA2, +0x00,0x8E,0x23,0x91,0xA2,0x80,0x8E,0x13,0x91,0xA2,0x00,0x8E,0x1F,0x91,0x20,0x84, +0xEF,0xA9,0x82,0x8D,0x1E,0x91,0x20,0x8D,0xEF,0xA9,0xC0,0x8D,0x2E,0x91,0xA9,0x89, +0x8D,0x24,0x91,0xA9,0x42,0x8D,0x25,0x91,0x60,0x85,0xB7,0x86,0xBB,0x84,0xBC,0x60, +0x85,0xB8,0x86,0xBA,0x84,0xB9,0x60,0xA5,0xBA,0xC9,0x02,0xD0,0x0B,0xAD,0x97,0x02, +0xA9,0x00,0x8D,0x97,0x02,0x60,0x85,0x9D,0xA5,0x90,0x05,0x90,0x85,0x90,0x60,0x8D, +0x85,0x02,0x60,0x90,0x06,0xAE,0x83,0x02,0xAC,0x84,0x02,0x8E,0x83,0x02,0x8C,0x84, +0x02,0x60,0x90,0x06,0xAE,0x81,0x02,0xAC,0x82,0x02,0x8E,0x81,0x02,0x8C,0x82,0x02, +0x60,0xB1,0xC1,0xAA,0xA9,0x55,0x91,0xC1,0xD1,0xC1,0xD0,0x08,0x6A,0x91,0xC1,0xD1, +0xC1,0xD0,0x01,0xA9,0x18,0x8A,0x91,0xC1,0x60,0x78,0x6C,0x18,0x03,0x48,0x8A,0x48, +0x98,0x48,0xAD,0x1D,0x91,0x10,0x48,0x2D,0x1E,0x91,0xAA,0x29,0x02,0xF0,0x1F,0x20, +0x3F,0xFD,0xD0,0x03,0x6C,0x02,0xA0,0x2C,0x11,0x91,0x20,0x34,0xF7,0x20,0xE1,0xFF, +0xD0,0x2D,0x20,0x52,0xFD,0x20,0xF9,0xFD,0x20,0x18,0xE5,0x6C,0x02,0xC0,0xAD,0x1E, +0x91,0x09,0x80,0x48,0xA9,0x7F,0x8D,0x1E,0x91,0x8A,0x29,0x40,0xF0,0x14,0xA9,0xCE, +0x05,0xB5,0x8D,0x1C,0x91,0xAD,0x14,0x91,0x68,0x8D,0x1E,0x91,0x20,0xA3,0xEF,0x4C, +0x56,0xFF,0x8A,0x29,0x20,0xF0,0x25,0xAD,0x10,0x91,0x29,0x01,0x85,0xA7,0xAD,0x18, +0x91,0xE9,0x16,0x6D,0x99,0x02,0x8D,0x18,0x91,0xAD,0x19,0x91,0x6D,0x9A,0x02,0x8D, +0x19,0x91,0x68,0x8D,0x1E,0x91,0x20,0x36,0xF0,0x4C,0x56,0xFF,0x8A,0x29,0x10,0xF0, +0x25,0xAD,0x93,0x02,0x29,0x0F,0xD0,0x00,0x0A,0xAA,0xBD,0x5A,0xFF,0x8D,0x18,0x91, +0xBD,0x5B,0xFF,0x8D,0x19,0x91,0xAD,0x10,0x91,0x68,0x09,0x20,0x29,0xEF,0x8D,0x1E, +0x91,0xAE,0x98,0x02,0x86,0xA8,0x68,0xA8,0x68,0xAA,0x68,0x40,0x92,0x27,0x40,0x1A, +0xC6,0x11,0x74,0x0E,0xEE,0x0C,0x45,0x06,0xF1,0x02,0x46,0x01,0xB8,0x00,0x71,0x00, +0x2A,0x00,0x48,0x8A,0x48,0x98,0x48,0xBA,0xBD,0x04,0x01,0x29,0x10,0xF0,0x03,0x6C, +0x16,0x03,0x6C,0x14,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0x4C,0x52,0xFD,0x4C,0x57,0xFD, +0x4C,0x66,0xFE,0x4C,0xC0,0xEE,0x4C,0xCE,0xEE,0x4C,0x73,0xFE,0x4C,0x82,0xFE,0x4C, +0x1E,0xEB,0x4C,0x6F,0xFE,0x4C,0x19,0xEF,0x4C,0xE4,0xEE,0x4C,0xF6,0xEE,0x4C,0x04, +0xEF,0x4C,0x17,0xEE,0x4C,0x14,0xEE,0x4C,0x57,0xFE,0x4C,0x50,0xFE,0x4C,0x49,0xFE, +0x6C,0x1A,0x03,0x6C,0x1C,0x03,0x6C,0x1E,0x03,0x6C,0x20,0x03,0x6C,0x22,0x03,0x6C, +0x24,0x03,0x6C,0x26,0x03,0x4C,0x42,0xF5,0x4C,0x75,0xF6,0x4C,0x67,0xF7,0x4C,0x60, +0xF7,0x6C,0x28,0x03,0x6C,0x2A,0x03,0x6C,0x2C,0x03,0x4C,0x34,0xF7,0x4C,0x05,0xE5, +0x4C,0x0A,0xE5,0x4C,0x00,0xE5,0xFF,0xFF,0xFF,0xFF,0xA9,0xFE,0x22,0xFD,0x72,0xFF, +}; diff --git a/MCUME_pico/pico20/kernalromp.h b/MCUME_pico/pico20/kernalromp.h new file mode 100644 index 0000000..923ee0f --- /dev/null +++ b/MCUME_pico/pico20/kernalromp.h @@ -0,0 +1,514 @@ +const unsigned char kernalrom[8192] = { +0x0F,0xDC,0xA5,0x61,0xC9,0x88,0x90,0x03,0x20,0xD4,0xDA,0x20,0xCC,0xDC,0xA5,0x07, +0x18,0x69,0x81,0xF0,0xF3,0x38,0xE9,0x01,0x48,0xA2,0x05,0xB5,0x69,0xB4,0x61,0x95, +0x61,0x94,0x69,0xCA,0x10,0xF5,0xA5,0x56,0x85,0x70,0x20,0x53,0xD8,0x20,0xB4,0xDF, +0xA9,0xC4,0xA0,0xDF,0x20,0x56,0xE0,0xA9,0x00,0x85,0x6F,0x68,0x20,0xB9,0xDA,0x60, +0x85,0x71,0x84,0x72,0x20,0xCA,0xDB,0xA9,0x57,0x20,0x28,0xDA,0x20,0x5A,0xE0,0xA9, +0x57,0xA0,0x00,0x4C,0x28,0xDA,0x85,0x71,0x84,0x72,0x20,0xC7,0xDB,0xB1,0x71,0x85, +0x67,0xA4,0x71,0xC8,0x98,0xD0,0x02,0xE6,0x72,0x85,0x71,0xA4,0x72,0x20,0x28,0xDA, +0xA5,0x71,0xA4,0x72,0x18,0x69,0x05,0x90,0x01,0xC8,0x85,0x71,0x84,0x72,0x20,0x67, +0xD8,0xA9,0x5C,0xA0,0x00,0xC6,0x67,0xD0,0xE4,0x60,0x98,0x35,0x44,0x7A,0x00,0x68, +0x28,0xB1,0x46,0x00,0x20,0x2B,0xDC,0x30,0x37,0xD0,0x20,0x20,0xF3,0xFF,0x86,0x22, +0x84,0x23,0xA0,0x04,0xB1,0x22,0x85,0x62,0xC8,0xB1,0x22,0x85,0x64,0xA0,0x08,0xB1, +0x22,0x85,0x63,0xC8,0xB1,0x22,0x85,0x65,0x4C,0xE0,0xE0,0xA9,0x8B,0xA0,0x00,0x20, +0xA2,0xDB,0xA9,0x8A,0xA0,0xE0,0x20,0x28,0xDA,0xA9,0x8F,0xA0,0xE0,0x20,0x67,0xD8, +0xA6,0x65,0xA5,0x62,0x85,0x65,0x86,0x62,0xA6,0x63,0xA5,0x64,0x85,0x63,0x86,0x64, +0xA9,0x00,0x85,0x66,0xA5,0x61,0x85,0x70,0xA9,0x80,0x85,0x61,0x20,0xD7,0xD8,0xA2, +0x8B,0xA0,0x00,0x4C,0xD4,0xDB,0xC9,0xF0,0xD0,0x07,0x84,0x38,0x86,0x37,0x4C,0x63, +0xC6,0xAA,0xD0,0x02,0xA2,0x1E,0x4C,0x37,0xC4,0x20,0xD2,0xFF,0xB0,0xE8,0x60,0x20, +0xCF,0xFF,0xB0,0xE2,0x60,0x20,0xC9,0xFF,0xB0,0xDC,0x60,0x20,0xC6,0xFF,0xB0,0xD6, +0x60,0x20,0xE4,0xFF,0xB0,0xD0,0x60,0x20,0x8A,0xCD,0x20,0xF7,0xD7,0xA9,0xE1,0x48, +0xA9,0x43,0x48,0xAD,0x0F,0x03,0x48,0xAD,0x0C,0x03,0xAE,0x0D,0x03,0xAC,0x0E,0x03, +0x28,0x6C,0x14,0x00,0x08,0x8D,0x0C,0x03,0x8E,0x0D,0x03,0x8C,0x0E,0x03,0x68,0x8D, +0x0F,0x03,0x60,0x20,0xD1,0xE1,0xA6,0x2D,0xA4,0x2E,0xA9,0x2B,0x20,0xD8,0xFF,0xB0, +0x95,0x60,0xA9,0x01,0x2C,0xA9,0x00,0x85,0x0A,0x20,0xD1,0xE1,0xA5,0x0A,0xA6,0x2B, +0xA4,0x2C,0x20,0xD5,0xFF,0xB0,0x57,0xA5,0x0A,0xF0,0x1A,0xA2,0x1C,0x20,0xB7,0xFF, +0x29,0x10,0xF0,0x03,0x4C,0x37,0xC4,0xA5,0x7A,0xC9,0x02,0xF0,0x07,0xA9,0x64,0xA0, +0xC3,0x4C,0x1E,0xCB,0x60,0x20,0xB7,0xFF,0x29,0xBF,0xF0,0x05,0xA2,0x1D,0x4C,0x37, +0xC4,0xA5,0x7B,0xC9,0x02,0xD0,0x0E,0x86,0x2D,0x84,0x2E,0xA9,0x76,0xA0,0xC3,0x20, +0x1E,0xCB,0x4C,0x2A,0xC5,0x20,0x8E,0xC6,0x4C,0x76,0xE4,0x20,0x16,0xE2,0x20,0xC0, +0xFF,0xB0,0x0B,0x60,0x20,0x16,0xE2,0xA5,0x49,0x20,0xC3,0xFF,0x90,0xC6,0x4C,0xF6, +0xE0,0xA9,0x00,0x20,0xBD,0xFF,0xA2,0x01,0xA0,0x00,0x20,0xBA,0xFF,0x20,0x03,0xE2, +0x20,0x54,0xE2,0x20,0x03,0xE2,0x20,0xFD,0xE1,0xA0,0x00,0x86,0x49,0x20,0xBA,0xFF, +0x20,0x03,0xE2,0x20,0xFD,0xE1,0x8A,0xA8,0xA6,0x49,0x4C,0xBA,0xFF,0x20,0x0B,0xE2, +0x4C,0x9E,0xD7,0x20,0x79,0x00,0xD0,0x02,0x68,0x68,0x60,0x20,0xFD,0xCE,0x20,0x79, +0x00,0xD0,0xF7,0x4C,0x08,0xCF,0xA9,0x00,0x20,0xBD,0xFF,0x20,0x0E,0xE2,0x20,0x9E, +0xD7,0x86,0x49,0x8A,0xA2,0x01,0xA0,0x00,0x20,0xBA,0xFF,0x20,0x03,0xE2,0x20,0xFD, +0xE1,0x86,0x4A,0xA0,0x00,0xA5,0x49,0xE0,0x03,0x90,0x01,0x88,0x20,0xBA,0xFF,0x20, +0x03,0xE2,0x20,0xFD,0xE1,0x8A,0xA8,0xA6,0x4A,0xA5,0x49,0x20,0xBA,0xFF,0x20,0x03, +0xE2,0x20,0x0B,0xE2,0x20,0x9E,0xCD,0x20,0xA3,0xD6,0xA6,0x22,0xA4,0x23,0x4C,0xBD, +0xFF,0xA9,0xDD,0xA0,0xE2,0x20,0x67,0xD8,0x20,0x0C,0xDC,0xA9,0xE2,0xA0,0xE2,0xA6, +0x6E,0x20,0x07,0xDB,0x20,0x0C,0xDC,0x20,0xCC,0xDC,0xA9,0x00,0x85,0x6F,0x20,0x53, +0xD8,0xA9,0xE7,0xA0,0xE2,0x20,0x50,0xD8,0xA5,0x66,0x48,0x10,0x0D,0x20,0x49,0xD8, +0xA5,0x66,0x30,0x09,0xA5,0x12,0x49,0xFF,0x85,0x12,0x20,0xB4,0xDF,0xA9,0xE7,0xA0, +0xE2,0x20,0x67,0xD8,0x68,0x10,0x03,0x20,0xB4,0xDF,0xA9,0xEC,0xA0,0xE2,0x4C,0x40, +0xE0,0x20,0xCA,0xDB,0xA9,0x00,0x85,0x12,0x20,0x68,0xE2,0xA2,0x4E,0xA0,0x00,0x20, +0xF3,0xE0,0xA9,0x57,0xA0,0x00,0x20,0xA2,0xDB,0xA9,0x00,0x85,0x66,0xA5,0x12,0x20, +0xD9,0xE2,0xA9,0x4E,0xA0,0x00,0x4C,0x0F,0xDB,0x48,0x4C,0x9A,0xE2,0x81,0x49,0x0F, +0xDA,0xA2,0x83,0x49,0x0F,0xDA,0xA2,0x7F,0x00,0x00,0x00,0x00,0x05,0x84,0xE6,0x1A, +0x2D,0x1B,0x86,0x28,0x07,0xFB,0xF8,0x87,0x99,0x68,0x89,0x01,0x87,0x23,0x35,0xDF, +0xE1,0x86,0xA5,0x5D,0xE7,0x28,0x83,0x49,0x0F,0xDA,0xA2,0xA5,0x66,0x48,0x10,0x03, +0x20,0xB4,0xDF,0xA5,0x61,0x48,0xC9,0x81,0x90,0x07,0xA9,0xBC,0xA0,0xD9,0x20,0x0F, +0xDB,0xA9,0x3B,0xA0,0xE3,0x20,0x40,0xE0,0x68,0xC9,0x81,0x90,0x07,0xA9,0xDD,0xA0, +0xE2,0x20,0x50,0xD8,0x68,0x10,0x03,0x4C,0xB4,0xDF,0x60,0x0B,0x76,0xB3,0x83,0xBD, +0xD3,0x79,0x1E,0xF4,0xA6,0xF5,0x7B,0x83,0xFC,0xB0,0x10,0x7C,0x0C,0x1F,0x67,0xCA, +0x7C,0xDE,0x53,0xCB,0xC1,0x7D,0x14,0x64,0x70,0x4C,0x7D,0xB7,0xEA,0x51,0x7A,0x7D, +0x63,0x30,0x88,0x7E,0x7E,0x92,0x44,0x99,0x3A,0x7E,0x4C,0xCC,0x91,0xC7,0x7F,0xAA, +0xAA,0xAA,0x13,0x81,0x00,0x00,0x00,0x00,0x20,0x5B,0xE4,0x20,0xA4,0xE3,0x20,0x04, +0xE4,0xA2,0xFB,0x9A,0x4C,0x74,0xC4,0xE6,0x7A,0xD0,0x02,0xE6,0x7B,0xAD,0x60,0xEA, +0xC9,0x3A,0xB0,0x0A,0xC9,0x20,0xF0,0xEF,0x38,0xE9,0x30,0x38,0xE9,0xD0,0x60,0x80, +0x4F,0xC7,0x52,0x58,0xA9,0x4C,0x85,0x54,0x85,0x00,0xA9,0x48,0xA0,0xD2,0x85,0x01, +0x84,0x02,0xA9,0x91,0xA0,0xD3,0x85,0x05,0x84,0x06,0xA9,0xAA,0xA0,0xD1,0x85,0x03, +0x84,0x04,0xA2,0x1C,0xBD,0x87,0xE3,0x95,0x73,0xCA,0x10,0xF8,0xA9,0x03,0x85,0x53, +0xA9,0x00,0x85,0x68,0x85,0x13,0x85,0x18,0xA2,0x01,0x8E,0xFD,0x01,0x8E,0xFC,0x01, +0xA2,0x19,0x86,0x16,0x38,0x20,0x9C,0xFF,0x86,0x2B,0x84,0x2C,0x38,0x20,0x99,0xFF, +0x86,0x37,0x84,0x38,0x86,0x33,0x84,0x34,0xA0,0x00,0x98,0x91,0x2B,0xE6,0x2B,0xD0, +0x02,0xE6,0x2C,0x60,0xA5,0x2B,0xA4,0x2C,0x20,0x08,0xC4,0xA9,0x36,0xA0,0xE4,0x20, +0x1E,0xCB,0xA5,0x37,0x38,0xE5,0x2B,0xAA,0xA5,0x38,0xE5,0x2C,0x20,0xCD,0xDD,0xA9, +0x29,0xA0,0xE4,0x20,0x1E,0xCB,0x4C,0x44,0xC6,0x20,0x42,0x59,0x54,0x45,0x53,0x20, +0x46,0x52,0x45,0x45,0x0D,0x00,0x93,0x2A,0x2A,0x2A,0x2A,0x20,0x43,0x42,0x4D,0x20, +0x42,0x41,0x53,0x49,0x43,0x20,0x56,0x32,0x20,0x2A,0x2A,0x2A,0x2A,0x0D,0x00,0x3A, +0xC4,0x83,0xC4,0x7C,0xC5,0x1A,0xC7,0xE4,0xC7,0x86,0xCE,0xA2,0x0B,0xBD,0x4F,0xE4, +0x9D,0x00,0x03,0xCA,0x10,0xF7,0x60,0x20,0xCC,0xFF,0xA9,0x00,0x85,0x13,0x20,0x7A, +0xC6,0x58,0x4C,0x74,0xC4,0xE8,0x20,0x33,0xC5,0x4C,0x77,0xC6,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xAD,0x2C,0x91,0x29,0xDF,0x8D,0x2C,0x91,0x60,0xAD,0x2C,0x91,0x09,0x20,0x8D,0x2C, +0x91,0x60,0xAD,0x1F,0x91,0xCD,0x1F,0x91,0xD0,0xF8,0x4A,0x60,0xA6,0xB9,0x4C,0x47, +0xF6,0x8A,0xD0,0x08,0xA5,0xC3,0x85,0xAE,0xA5,0xC4,0x85,0xAF,0x4C,0x6A,0xF6,0x20, +0xE3,0xF8,0x90,0x03,0x68,0xA9,0x00,0x4C,0x9E,0xF3,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xA2,0x10,0xA0,0x91,0x60,0xA2,0x16,0xA0,0x17,0x60,0xB0,0x07,0x86,0xD6,0x84,0xD3, +0x20,0x87,0xE5,0xA6,0xD6,0xA4,0xD3,0x60,0x20,0xBB,0xE5,0xAD,0x88,0x02,0x29,0xFD, +0x0A,0x0A,0x09,0x80,0x8D,0x05,0x90,0xAD,0x88,0x02,0x29,0x02,0xF0,0x08,0xA9,0x80, +0x0D,0x02,0x90,0x8D,0x02,0x90,0xA9,0x00,0x8D,0x91,0x02,0x85,0xCF,0xA9,0xDC,0x8D, +0x8F,0x02,0xA9,0xEB,0x8D,0x90,0x02,0xA9,0x0A,0x8D,0x89,0x02,0x8D,0x8C,0x02,0xA9, +0x06,0x8D,0x86,0x02,0xA9,0x04,0x8D,0x8B,0x02,0xA9,0x0C,0x85,0xCD,0x85,0xCC,0xAD, +0x88,0x02,0x09,0x80,0xA8,0xA9,0x00,0xAA,0x94,0xD9,0x18,0x69,0x16,0x90,0x01,0xC8, +0xE8,0xE0,0x18,0xD0,0xF3,0xA9,0xFF,0x95,0xD9,0xA2,0x16,0x20,0x8D,0xEA,0xCA,0x10, +0xFA,0xA0,0x00,0x84,0xD3,0x84,0xD6,0xA6,0xD6,0xA5,0xD3,0xB4,0xD9,0x30,0x08,0x18, +0x69,0x16,0x85,0xD3,0xCA,0x10,0xF4,0xB5,0xD9,0x29,0x03,0x0D,0x88,0x02,0x85,0xD2, +0xBD,0xFD,0xED,0x85,0xD1,0xA9,0x15,0xE8,0xB4,0xD9,0x30,0x06,0x18,0x69,0x16,0xE8, +0x10,0xF6,0x85,0xD5,0x60,0x20,0xBB,0xE5,0x4C,0x81,0xE5,0xA9,0x03,0x85,0x9A,0xA9, +0x00,0x85,0x99,0xA2,0x10,0xBD,0xE3,0xED,0x9D,0xFF,0x8F,0xCA,0xD0,0xF7,0x60,0xAC, +0x77,0x02,0xA2,0x00,0xBD,0x78,0x02,0x9D,0x77,0x02,0xE8,0xE4,0xC6,0xD0,0xF5,0xC6, +0xC6,0x98,0x58,0x18,0x60,0x20,0x42,0xE7,0xA5,0xC6,0x85,0xCC,0x8D,0x92,0x02,0xF0, +0xF7,0x78,0xA5,0xCF,0xF0,0x0C,0xA5,0xCE,0xAE,0x87,0x02,0xA0,0x00,0x84,0xCF,0x20, +0xA1,0xEA,0x20,0xCF,0xE5,0xC9,0x83,0xD0,0x10,0xA2,0x09,0x78,0x86,0xC6,0xBD,0xF3, +0xED,0x9D,0x76,0x02,0xCA,0xD0,0xF7,0xF0,0xCF,0xC9,0x0D,0xD0,0xC8,0xA4,0xD5,0x84, +0xD0,0xB1,0xD1,0xC9,0x20,0xD0,0x03,0x88,0xD0,0xF7,0xC8,0x84,0xC8,0xA0,0x00,0x8C, +0x92,0x02,0x84,0xD3,0x84,0xD4,0xA5,0xC9,0x30,0x1D,0xA6,0xD6,0x20,0x19,0xE7,0xE4, +0xC9,0xD0,0x14,0xD0,0x12,0xA5,0xCA,0x85,0xD3,0xC5,0xC8,0x90,0x0A,0xB0,0x42,0x98, +0x48,0x8A,0x48,0xA5,0xD0,0xF0,0x91,0xA4,0xD3,0xB1,0xD1,0xEA,0xEA,0xEA,0xEA,0xEA, +0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA, +0xEA,0xEA,0x85,0xD7,0x29,0x3F,0x06,0xD7,0x24,0xD7,0x10,0x02,0x09,0x80,0x90,0x04, +0xA6,0xD4,0xD0,0x04,0x70,0x02,0x09,0x40,0xE6,0xD3,0x20,0xB8,0xE6,0xC4,0xC8,0xD0, +0x17,0xA9,0x00,0x85,0xD0,0xA9,0x0D,0xA6,0x99,0xE0,0x03,0xF0,0x06,0xA6,0x9A,0xE0, +0x03,0xF0,0x03,0x20,0x42,0xE7,0xA9,0x0D,0x85,0xD7,0x68,0xAA,0x68,0xA8,0xA5,0xD7, +0xC9,0xDE,0xD0,0x02,0xA9,0xFF,0x18,0x60,0xC9,0x22,0xD0,0x08,0xA5,0xD4,0x49,0x01, +0x85,0xD4,0xA9,0x22,0x60,0x09,0x40,0xA6,0xC7,0xF0,0x02,0x09,0x80,0xA6,0xD8,0xF0, +0x02,0xC6,0xD8,0xAE,0x86,0x02,0x20,0xA1,0xEA,0x20,0xEA,0xE6,0x68,0xA8,0xA5,0xD8, +0xF0,0x02,0x46,0xD4,0x68,0xAA,0x68,0x18,0x58,0x60,0x20,0xFA,0xE8,0xE6,0xD3,0xA5, +0xD5,0xC5,0xD3,0xB0,0x37,0xC9,0x57,0xF0,0x2A,0xAD,0x92,0x02,0xF0,0x03,0x4C,0xF0, +0xE9,0xA6,0xD6,0xE0,0x17,0x90,0x07,0x20,0x75,0xE9,0xC6,0xD6,0xA6,0xD6,0x16,0xD9, +0x56,0xD9,0x4C,0x5B,0xED,0x69,0x16,0x85,0xD5,0xB5,0xD9,0x30,0x03,0xCA,0xD0,0xF9, +0x4C,0x7E,0xEA,0xC6,0xD6,0x20,0xC3,0xE8,0xA9,0x00,0x85,0xD3,0x60,0xA6,0xD6,0xD0, +0x06,0x86,0xD3,0x68,0x68,0xD0,0xA5,0xCA,0x86,0xD6,0x20,0x87,0xE5,0xA4,0xD5,0x84, +0xD3,0x60,0x48,0x85,0xD7,0x8A,0x48,0x98,0x48,0xA9,0x00,0x85,0xD0,0xA4,0xD3,0xA5, +0xD7,0x10,0x03,0x4C,0x00,0xE8,0xC9,0x0D,0xD0,0x03,0x4C,0xD8,0xE8,0xC9,0x20,0x90, +0x10,0xC9,0x60,0x90,0x04,0x29,0xDF,0xD0,0x02,0x29,0x3F,0x20,0xB8,0xE6,0x4C,0xC7, +0xE6,0xA6,0xD8,0xF0,0x03,0x4C,0xCB,0xE6,0xC9,0x14,0xD0,0x2E,0x98,0xD0,0x06,0x20, +0x2D,0xE7,0x4C,0x9F,0xE7,0x20,0xE8,0xE8,0x88,0x84,0xD3,0x20,0xB2,0xEA,0xC8,0xB1, +0xD1,0x88,0x91,0xD1,0xC8,0xB1,0xF3,0x88,0x91,0xF3,0xC8,0xC4,0xD5,0xD0,0xEF,0xA9, +0x20,0x91,0xD1,0xAD,0x86,0x02,0x91,0xF3,0x10,0x4D,0xA6,0xD4,0xF0,0x03,0x4C,0xCB, +0xE6,0xC9,0x12,0xD0,0x02,0x85,0xC7,0xC9,0x13,0xD0,0x03,0x20,0x81,0xE5,0xC9,0x1D, +0xD0,0x17,0xC8,0x20,0xFA,0xE8,0x84,0xD3,0x88,0xC4,0xD5,0x90,0x09,0xC6,0xD6,0x20, +0xC3,0xE8,0xA0,0x00,0x84,0xD3,0x4C,0xDC,0xE6,0xC9,0x11,0xD0,0x1D,0x18,0x98,0x69, +0x16,0xA8,0xE6,0xD6,0xC5,0xD5,0x90,0xEC,0xF0,0xEA,0xC6,0xD6,0xE9,0x16,0x90,0x04, +0x85,0xD3,0xD0,0xF8,0x20,0xC3,0xE8,0x4C,0xDC,0xE6,0x20,0x12,0xE9,0x4C,0x21,0xED, +0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA, +0xEA,0xEA,0xEA,0xEA,0xEA,0x29,0x7F,0xC9,0x7F,0xD0,0x02,0xA9,0x5E,0xEA,0xEA,0xEA, +0xEA,0xEA,0xEA,0xC9,0x20,0x90,0x03,0x4C,0xC5,0xE6,0xC9,0x0D,0xD0,0x03,0x4C,0xD8, +0xE8,0xA6,0xD4,0xD0,0x3F,0xC9,0x14,0xD0,0x37,0xA4,0xD5,0xB1,0xD1,0xC9,0x20,0xD0, +0x04,0xC4,0xD3,0xD0,0x07,0xC0,0x57,0xF0,0x24,0x20,0xEE,0xE9,0xA4,0xD5,0x20,0xB2, +0xEA,0x88,0xB1,0xD1,0xC8,0x91,0xD1,0x88,0xB1,0xF3,0xC8,0x91,0xF3,0x88,0xC4,0xD3, +0xD0,0xEF,0xA9,0x20,0x91,0xD1,0xAD,0x86,0x02,0x91,0xF3,0xE6,0xD8,0x4C,0xDC,0xE6, +0xA6,0xD8,0xF0,0x05,0x09,0x40,0x4C,0xCB,0xE6,0xC9,0x11,0xD0,0x16,0xA6,0xD6,0xF0, +0x37,0xC6,0xD6,0xA5,0xD3,0x38,0xE9,0x16,0x90,0x04,0x85,0xD3,0x10,0x2A,0x20,0x87, +0xE5,0xD0,0x25,0xC9,0x12,0xD0,0x04,0xA9,0x00,0x85,0xC7,0xC9,0x1D,0xD0,0x12,0x98, +0xF0,0x09,0x20,0xE8,0xE8,0x88,0x84,0xD3,0x4C,0xDC,0xE6,0x20,0x2D,0xE7,0x4C,0xDC, +0xE6,0xC9,0x13,0xD0,0x06,0x20,0x5F,0xE5,0x4C,0xDC,0xE6,0x09,0x80,0x20,0x12,0xE9, +0x4C,0x30,0xED,0x46,0xC9,0xA6,0xD6,0xE8,0xE0,0x17,0xD0,0x03,0x20,0x75,0xE9,0xB5, +0xD9,0x10,0xF4,0x86,0xD6,0x4C,0x87,0xE5,0xA2,0x00,0x86,0xD8,0x86,0xC7,0x86,0xD4, +0x86,0xD3,0x20,0xC3,0xE8,0x4C,0xDC,0xE6,0xA2,0x04,0xA9,0x00,0xC5,0xD3,0xF0,0x07, +0x18,0x69,0x16,0xCA,0xD0,0xF6,0x60,0xC6,0xD6,0x60,0xA2,0x04,0xA9,0x15,0xC5,0xD3, +0xF0,0x07,0x18,0x69,0x16,0xCA,0xD0,0xF6,0x60,0xA6,0xD6,0xE0,0x17,0xF0,0x02,0xE6, +0xD6,0x60,0xA2,0x07,0xDD,0x21,0xE9,0xF0,0x04,0xCA,0x10,0xF8,0x60,0x8E,0x86,0x02, +0x60,0x90,0x05,0x1C,0x9F,0x9C,0x1E,0x1F,0x9E,0xEF,0xA1,0xDF,0xA6,0xE1,0xB1,0xE2, +0xB2,0xE3,0xB3,0xE4,0xB4,0xE5,0xB5,0xE6,0xB6,0xE7,0xB7,0xE8,0xB8,0xE9,0xB9,0xFA, +0xBA,0xFB,0xBB,0xFC,0xBC,0xEC,0xBD,0xFE,0xBE,0x84,0xBF,0xF7,0xC0,0xF8,0xDB,0xF9, +0xDD,0xEA,0xDE,0x5E,0xE0,0x5B,0xE1,0x5D,0xE2,0x40,0xB0,0x61,0xB1,0x78,0xDB,0x79, +0xDD,0x66,0xB6,0x77,0xC0,0x70,0xF0,0x71,0xF1,0x72,0xF2,0x73,0xF3,0x74,0xF4,0x75, +0xF5,0x76,0xF6,0x7D,0xFD,0xA5,0xAC,0x48,0xA5,0xAD,0x48,0xA5,0xAE,0x48,0xA5,0xAF, +0x48,0xA2,0xFF,0xC6,0xD6,0xC6,0xC9,0xC6,0xF2,0xE8,0x20,0x7E,0xEA,0xE0,0x16,0xB0, +0x0C,0xBD,0xFE,0xED,0x85,0xAC,0xB5,0xDA,0x20,0x56,0xEA,0x30,0xEC,0x20,0x8D,0xEA, +0xA2,0x00,0xB5,0xD9,0x29,0x7F,0xB4,0xDA,0x10,0x02,0x09,0x80,0x95,0xD9,0xE8,0xE0, +0x16,0xD0,0xEF,0xA5,0xEF,0x09,0x80,0x85,0xEF,0xA5,0xD9,0x10,0xC4,0xE6,0xD6,0xE6, +0xF2,0xA9,0xFB,0x8D,0x20,0x91,0xAD,0x21,0x91,0xC9,0xFE,0x08,0xA9,0xF7,0x8D,0x20, +0x91,0x28,0xD0,0x0B,0xA0,0x00,0xEA,0xCA,0xD0,0xFC,0x88,0xD0,0xF9,0x84,0xC6,0xA6, +0xD6,0x68,0x85,0xAF,0x68,0x85,0xAE,0x68,0x85,0xAD,0x68,0x85,0xAC,0x60,0xA6,0xD6, +0xE8,0xB5,0xD9,0x10,0xFB,0x86,0xF2,0xE0,0x16,0xF0,0x0D,0x90,0x0B,0x20,0x75,0xE9, +0xA6,0xF2,0xCA,0xC6,0xD6,0x4C,0x0E,0xE7,0xA5,0xAC,0x48,0xA5,0xAD,0x48,0xA5,0xAE, +0x48,0xA5,0xAF,0x48,0xA2,0x17,0xCA,0x20,0x7E,0xEA,0xE4,0xF2,0x90,0x0E,0xF0,0x0C, +0xBD,0xFC,0xED,0x85,0xAC,0xB5,0xD8,0x20,0x56,0xEA,0x30,0xEA,0x20,0x8D,0xEA,0xA2, +0x15,0xE4,0xF2,0x90,0x0F,0xB5,0xDA,0x29,0x7F,0xB4,0xD9,0x10,0x02,0x09,0x80,0x95, +0xDA,0xCA,0xD0,0xED,0xA6,0xF2,0x20,0x0E,0xE7,0x68,0x85,0xAF,0x68,0x85,0xAE,0x68, +0x85,0xAD,0x68,0x85,0xAC,0x60,0x29,0x03,0x0D,0x88,0x02,0x85,0xAD,0x20,0x6E,0xEA, +0xA0,0x15,0xB1,0xAC,0x91,0xD1,0xB1,0xAE,0x91,0xF3,0x88,0x10,0xF5,0x60,0x20,0xB2, +0xEA,0xA5,0xAC,0x85,0xAE,0xA5,0xAD,0x29,0x03,0x09,0x94,0x85,0xAF,0x60,0xBD,0xFD, +0xED,0x85,0xD1,0xB5,0xD9,0x29,0x03,0x0D,0x88,0x02,0x85,0xD2,0x60,0xA0,0x15,0x20, +0x7E,0xEA,0x20,0xB2,0xEA,0xA9,0x20,0x91,0xD1,0xA9,0x01,0x91,0xF3,0x88,0x10,0xF5, +0x60,0xA8,0xA9,0x02,0x85,0xCD,0x20,0xB2,0xEA,0x98,0xA4,0xD3,0x91,0xD1,0x8A,0x91, +0xF3,0x60,0xA5,0xD1,0x85,0xF3,0xA5,0xD2,0x29,0x03,0x09,0x94,0x85,0xF4,0x60,0x20, +0xEA,0xFF,0xA5,0xCC,0xD0,0x29,0xC6,0xCD,0xD0,0x25,0xA9,0x14,0x85,0xCD,0xA4,0xD3, +0x46,0xCF,0xAE,0x87,0x02,0xB1,0xD1,0xB0,0x11,0xE6,0xCF,0x85,0xCE,0x20,0xB2,0xEA, +0xB1,0xF3,0x8D,0x87,0x02,0xAE,0x86,0x02,0xA5,0xCE,0x49,0x80,0x20,0xAA,0xEA,0xAD, +0x1F,0x91,0x29,0x40,0xF0,0x0B,0xA0,0x00,0x84,0xC0,0xAD,0x1C,0x91,0x09,0x02,0xD0, +0x09,0xA5,0xC0,0xD0,0x0D,0xAD,0x1C,0x91,0x29,0xFD,0x2C,0x1E,0x91,0x70,0x03,0x8D, +0x1C,0x91,0x20,0x1E,0xEB,0x2C,0x24,0x91,0x68,0xA8,0x68,0xAA,0x68,0x40,0xA9,0x00, +0x8D,0x8D,0x02,0xA0,0x40,0x84,0xCB,0x8D,0x20,0x91,0xAE,0x21,0x91,0xE0,0xFF,0xF0, +0x5E,0xA9,0xFE,0x8D,0x20,0x91,0xA0,0x00,0xA9,0x5E,0x85,0xF5,0xA9,0xEC,0x85,0xF6, +0xA2,0x08,0xAD,0x21,0x91,0xCD,0x21,0x91,0xD0,0xF6,0x4A,0xB0,0x16,0x48,0xB1,0xF5, +0xC9,0x05,0xB0,0x0C,0xC9,0x03,0xF0,0x08,0x0D,0x8D,0x02,0x8D,0x8D,0x02,0x10,0x02, +0x84,0xCB,0x68,0xC8,0xC0,0x41,0xB0,0x09,0xCA,0xD0,0xDF,0x38,0x2E,0x20,0x91,0xD0, +0xCF,0x6C,0x8F,0x02,0xA4,0xCB,0xB1,0xF5,0xAA,0xC4,0xC5,0xF0,0x07,0xA0,0x10,0x8C, +0x8C,0x02,0xD0,0x36,0x29,0x7F,0x2C,0x8A,0x02,0x30,0x16,0x70,0x49,0xC9,0x7F,0xF0, +0x29,0xC9,0x14,0xF0,0x0C,0xC9,0x20,0xF0,0x08,0xC9,0x1D,0xF0,0x04,0xC9,0x11,0xD0, +0x35,0xAC,0x8C,0x02,0xF0,0x05,0xCE,0x8C,0x02,0xD0,0x2B,0xCE,0x8B,0x02,0xD0,0x26, +0xA0,0x04,0x8C,0x8B,0x02,0xA4,0xC6,0x88,0x10,0x1C,0xA4,0xCB,0x84,0xC5,0xAC,0x8D, +0x02,0x8C,0x8E,0x02,0xE0,0xFF,0xF0,0x0E,0x8A,0xA6,0xC6,0xEC,0x89,0x02,0xB0,0x06, +0x9D,0x77,0x02,0xE8,0x86,0xC6,0xA9,0xF7,0x8D,0x20,0x91,0x60,0xAD,0x8D,0x02,0xC9, +0x03,0xD0,0x2C,0xCD,0x8E,0x02,0xF0,0xEE,0xAD,0x91,0x02,0x30,0x56,0xEA,0xEA,0xEA, +0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA, +0xAD,0x05,0x90,0x49,0x02,0x8D,0x05,0x90,0xEA,0xEA,0xEA,0xEA,0x4C,0x43,0xEC,0x0A, +0xC9,0x08,0x90,0x04,0xA9,0x06,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA, +0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA, +0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xEA,0xAA,0xBD,0x46,0xEC,0x85,0xF5,0xBD,0x47, +0xEC,0x85,0xF6,0x4C,0x74,0xEB,0x5E,0xEC,0x9F,0xEC,0xE0,0xEC,0xA3,0xED,0x5E,0xEC, +0x9F,0xEC,0x69,0xED,0xA3,0xED,0x21,0xED,0x69,0xED,0x69,0xED,0xA3,0xED,0x31,0x33, +0x35,0x37,0x39,0x2B,0x5C,0x14,0x5F,0x57,0x52,0x59,0x49,0x50,0x2A,0x0D,0x04,0x41, +0x44,0x47,0x4A,0x4C,0x3B,0x1D,0x03,0x01,0x58,0x56,0x4E,0x2C,0x2F,0x11,0x20,0x5A, +0x43,0x42,0x4D,0x2E,0x01,0x85,0x02,0x53,0x46,0x48,0x4B,0x3A,0x3D,0x86,0x51,0x45, +0x54,0x55,0x4F,0x40,0x5E,0x87,0x32,0x34,0x36,0x38,0x30,0x2D,0x13,0x88,0xFF,0x21, +0x23,0x25,0x27,0x29,0xDB,0xA9,0x94,0x5F,0xD7,0xD2,0xD9,0xC9,0xD0,0xC0,0x8D,0x04, +0xC1,0xC4,0xC7,0xCA,0xCC,0x5D,0x9D,0x83,0x01,0xD8,0xD6,0xCE,0x3C,0x3F,0x91,0xA0, +0xDA,0xC3,0xC2,0xCD,0x3E,0x01,0x89,0x02,0xD3,0xC6,0xC8,0xCB,0x5B,0x3D,0x8A,0xD1, +0xC5,0xD4,0xD5,0xCF,0xBA,0xDE,0x8B,0x22,0x24,0x26,0x28,0x30,0xDD,0x93,0x8C,0xFF, +0x21,0x23,0x25,0x27,0x29,0xA6,0xA8,0x94,0x5F,0xB3,0xB2,0xB7,0xA2,0xAF,0xDF,0x8D, +0x04,0xB0,0xAC,0xA5,0xB5,0xB6,0x5D,0x9D,0x83,0x01,0xBD,0xBE,0xAA,0x3C,0x3F,0x91, +0xA0,0xAD,0xBC,0xBF,0xA7,0x3E,0x01,0x89,0x02,0xAE,0xBB,0xB4,0xA1,0x5B,0x3D,0x8A, +0xAB,0xB1,0xA3,0xB8,0xB9,0xA4,0xDE,0x8B,0x22,0x24,0x26,0x28,0x30,0xDC,0x93,0x8C, +0xFF,0xC9,0x0E,0xD0,0x0B,0xA9,0x02,0x0D,0x05,0x90,0x8D,0x05,0x90,0x4C,0xDC,0xE6, +0xC9,0x8E,0xD0,0x0B,0xA9,0xFD,0x2D,0x05,0x90,0x8D,0x05,0x90,0x4C,0xDC,0xE6,0xC9, +0x08,0xD0,0x0A,0xA9,0x80,0x0D,0x91,0x02,0x8D,0x91,0x02,0x30,0xEF,0xC9,0x09,0xD0, +0xEB,0xA9,0x7F,0x2D,0x91,0x02,0x8D,0x91,0x02,0x10,0xE1,0xE8,0xB5,0xD9,0x09,0x80, +0x95,0xD9,0xCA,0xA5,0xD5,0x18,0x4C,0x15,0xE7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0x04,0xFF,0xFF,0xFF,0xFF,0xFF,0xE2,0x9D,0x83,0x01,0xFF,0xFF,0xFF,0xFF, +0xFF,0x91,0xA0,0xFF,0xFF,0xFF,0xFF,0xEE,0x01,0x89,0x02,0xFF,0xFF,0xFF,0xFF,0xE1, +0xFD,0x8A,0xFF,0xFF,0xFF,0xFF,0xFF,0xB0,0xE0,0x8B,0xF2,0xF4,0xF6,0xFF,0xF0,0xED, +0x93,0x8C,0xFF,0x90,0x1C,0x9C,0x1F,0x12,0xFF,0xFF,0xFF,0x06,0xFF,0x12,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, +0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x05,0x9F,0x1E,0x9E,0x92, +0xFF,0xFF,0xFF,0xFF,0x0C,0x26,0x16,0x2E,0x00,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x1B,0x4C,0x4F,0x41,0x44,0x0D,0x52,0x55,0x4E,0x0D,0x00,0x16,0x2C, +0x42,0x58,0x6E,0x84,0x9A,0xB0,0xC6,0xDC,0xF2,0x08,0x1E,0x34,0x4A,0x60,0x76,0x8C, +0xA2,0xB8,0xCE,0xE4,0x09,0x40,0x2C,0x09,0x20,0x20,0x60,0xF1,0x48,0x24,0x94,0x10, +0x0A,0x38,0x66,0xA3,0x20,0x49,0xEE,0x46,0x94,0x46,0xA3,0x68,0x85,0x95,0x20,0xA0, +0xE4,0xC9,0x3F,0xD0,0x03,0x20,0x84,0xEF,0xAD,0x1F,0x91,0x09,0x80,0x8D,0x1F,0x91, +0x20,0x8D,0xEF,0x20,0xA0,0xE4,0x20,0x96,0xEF,0x78,0x20,0xA0,0xE4,0x20,0xB2,0xE4, +0x4A,0xB0,0x61,0x20,0x84,0xEF,0x24,0xA3,0x10,0x0C,0x20,0xB2,0xE4,0x4A,0x90,0xFA, +0x20,0xB2,0xE4,0x4A,0xB0,0xFA,0x20,0xB2,0xE4,0x4A,0x90,0xFA,0x20,0x8D,0xEF,0xA9, +0x08,0x85,0xA5,0xAD,0x1F,0x91,0xCD,0x1F,0x91,0xD0,0xF8,0x4A,0x4A,0x90,0x38,0x66, +0x95,0xB0,0x05,0x20,0xA9,0xE4,0xD0,0x03,0x20,0xA0,0xE4,0x20,0x84,0xEF,0xEA,0xEA, +0xEA,0xEA,0xAD,0x2C,0x91,0x29,0xDF,0x09,0x02,0x8D,0x2C,0x91,0xC6,0xA5,0xD0,0xD3, +0xA9,0x04,0x8D,0x29,0x91,0xAD,0x2D,0x91,0x29,0x20,0xD0,0x0B,0x20,0xB2,0xE4,0x4A, +0xB0,0xF3,0x58,0x60,0xA9,0x80,0x2C,0xA9,0x03,0x20,0x6A,0xFE,0x58,0x18,0x90,0x49, +0x85,0x95,0x20,0x40,0xEE,0xAD,0x1F,0x91,0x29,0x7F,0x8D,0x1F,0x91,0x60,0x85,0x95, +0x20,0x40,0xEE,0x78,0x20,0xA9,0xE4,0x20,0xC5,0xEE,0x20,0x84,0xEF,0x20,0xB2,0xE4, +0xB0,0xFB,0x58,0x60,0x24,0x94,0x30,0x05,0x38,0x66,0x94,0xD0,0x05,0x48,0x20,0x49, +0xEE,0x68,0x85,0x95,0x18,0x60,0x20,0x8D,0xEF,0xAD,0x1F,0x91,0x09,0x80,0x8D,0x1F, +0x91,0xA9,0x5F,0x2C,0xA9,0x3F,0x20,0x1C,0xEE,0x20,0xC5,0xEE,0x8A,0xA2,0x0B,0xCA, +0xD0,0xFD,0xAA,0x20,0x84,0xEF,0x4C,0xA0,0xE4,0x78,0xA9,0x00,0x85,0xA5,0x20,0x84, +0xEF,0x20,0xB2,0xE4,0x90,0xFB,0x20,0xA0,0xE4,0xA9,0x01,0x8D,0x29,0x91,0xAD,0x2D, +0x91,0x29,0x20,0xD0,0x07,0x20,0xB2,0xE4,0xB0,0xF4,0x90,0x18,0xA5,0xA5,0xF0,0x05, +0xA9,0x02,0x4C,0xB9,0xEE,0x20,0xA9,0xE4,0x20,0x0C,0xEF,0xA9,0x40,0x20,0x6A,0xFE, +0xE6,0xA5,0xD0,0xD5,0xA9,0x08,0x85,0xA5,0xAD,0x1F,0x91,0xCD,0x1F,0x91,0xD0,0xF8, +0x4A,0x90,0xF5,0x4A,0x66,0xA4,0xAD,0x1F,0x91,0xCD,0x1F,0x91,0xD0,0xF8,0x4A,0xB0, +0xF5,0xC6,0xA5,0xD0,0xE3,0x20,0xA9,0xE4,0xA5,0x90,0xF0,0x03,0x20,0x0C,0xEF,0xA5, +0xA4,0x58,0x18,0x60,0xAD,0x2C,0x91,0x29,0xFD,0x8D,0x2C,0x91,0x60,0xAD,0x2C,0x91, +0x09,0x02,0x8D,0x2C,0x91,0x60,0xA9,0x04,0x8D,0x29,0x91,0xAD,0x2D,0x91,0x29,0x20, +0xF0,0xF9,0x60,0xA5,0xB4,0xF0,0x47,0x30,0x3F,0x46,0xB6,0xA2,0x00,0x90,0x01,0xCA, +0x8A,0x45,0xBD,0x85,0xBD,0xC6,0xB4,0xF0,0x06,0x8A,0x29,0x20,0x85,0xB5,0x60,0xA9, +0x20,0x2C,0x94,0x02,0xF0,0x14,0x30,0x1C,0x70,0x14,0xA5,0xBD,0xD0,0x01,0xCA,0xC6, +0xB4,0xAD,0x93,0x02,0x10,0xE3,0xC6,0xB4,0xD0,0xDF,0xE6,0xB4,0xD0,0xF0,0xA5,0xBD, +0xF0,0xED,0xD0,0xEA,0x70,0xE9,0x50,0xE6,0xE6,0xB4,0xA2,0xFF,0xD0,0xCB,0xAD,0x94, +0x02,0x4A,0x90,0x07,0x2C,0x20,0x91,0x10,0x1D,0x50,0x1E,0xA9,0x00,0x85,0xBD,0x85, +0xB5,0xAE,0x98,0x02,0x86,0xB4,0xAC,0x9D,0x02,0xCC,0x9E,0x02,0xF0,0x13,0xB1,0xF9, +0x85,0xB6,0xEE,0x9D,0x02,0x60,0xA9,0x40,0x2C,0xA9,0x10,0x0D,0x97,0x02,0x8D,0x97, +0x02,0xA9,0x40,0x8D,0x1E,0x91,0x60,0xA2,0x09,0xA9,0x20,0x2C,0x93,0x02,0xF0,0x01, +0xCA,0x50,0x02,0xCA,0xCA,0x60,0xA6,0xA9,0xD0,0x2E,0xC6,0xA8,0xF0,0x31,0x30,0x0D, +0xA5,0xA7,0x45,0xAB,0x85,0xAB,0x46,0xA7,0x66,0xAA,0x60,0xC6,0xA8,0xA5,0xA7,0xF0, +0x62,0xAD,0x93,0x02,0x0A,0xA9,0x01,0x65,0xA8,0xD0,0xEF,0xA9,0x90,0x8D,0x1E,0x91, +0x85,0xA9,0xA9,0x20,0x8D,0x1E,0x91,0x60,0xA5,0xA7,0xD0,0xEF,0x85,0xA9,0x60,0xAC, +0x9B,0x02,0xC8,0xCC,0x9C,0x02,0xF0,0x2A,0x8C,0x9B,0x02,0x88,0xA5,0xAA,0xAE,0x98, +0x02,0xE0,0x09,0xF0,0x04,0x4A,0xE8,0xD0,0xF8,0x91,0xF7,0xA9,0x20,0x2C,0x94,0x02, +0xF0,0xB9,0x30,0xB6,0xA5,0xA7,0x45,0xAB,0xF0,0x03,0x70,0xAE,0x2C,0x50,0xAB,0xA9, +0x01,0x2C,0xA9,0x04,0x2C,0xA9,0x80,0x2C,0xA9,0x02,0x0D,0x97,0x02,0x8D,0x97,0x02, +0x4C,0x5B,0xF0,0xA5,0xAA,0xD0,0xF1,0xF0,0xEC,0x4C,0x96,0xF7,0x85,0x9A,0xAD,0x94, +0x02,0x4A,0x90,0x27,0xA9,0x02,0x2C,0x10,0x91,0x10,0x1D,0xD0,0x1E,0xAD,0x1E,0x91, +0x29,0x30,0xD0,0xF9,0x2C,0x10,0x91,0x70,0xFB,0xAD,0x10,0x91,0x09,0x02,0x8D,0x10, +0x91,0x2C,0x10,0x91,0x70,0x05,0x30,0xF9,0x20,0x16,0xF0,0x18,0x60,0xAC,0x9E,0x02, +0xC8,0xCC,0x9D,0x02,0xF0,0xF7,0x8C,0x9E,0x02,0x88,0x91,0xF9,0x2C,0x1E,0x91,0x50, +0x01,0x60,0xAD,0x99,0x02,0x8D,0x14,0x91,0xAD,0x9A,0x02,0x8D,0x15,0x91,0xA9,0xC0, +0x8D,0x1E,0x91,0x4C,0xEE,0xEF,0x85,0x99,0xAD,0x94,0x02,0x4A,0x90,0x28,0x29,0x08, +0xF0,0x24,0xA9,0x02,0x2C,0x10,0x91,0x10,0xBF,0xF0,0x19,0x2C,0x1E,0x91,0x70,0xFB, +0xAD,0x10,0x91,0x29,0xFD,0x8D,0x10,0x91,0xAD,0x10,0x91,0x29,0x04,0xF0,0xF9,0xA9, +0x90,0x8D,0x1E,0x91,0x18,0x60,0xAD,0x1E,0x91,0x29,0x30,0xF0,0xF2,0x18,0x60,0xAC, +0x9C,0x02,0xCC,0x9B,0x02,0xF0,0x06,0xB1,0xF7,0xEE,0x9C,0x02,0x60,0xA9,0x00,0x60, +0x48,0xAD,0x1E,0x91,0xF0,0x0C,0xAD,0x1E,0x91,0x29,0x60,0xD0,0xF9,0xA9,0x10,0x8D, +0x1E,0x91,0x68,0x60,0x0D,0x49,0x2F,0x4F,0x20,0x45,0x52,0x52,0x4F,0x52,0x20,0xA3, +0x0D,0x53,0x45,0x41,0x52,0x43,0x48,0x49,0x4E,0x47,0xA0,0x46,0x4F,0x52,0xA0,0x0D, +0x50,0x52,0x45,0x53,0x53,0x20,0x50,0x4C,0x41,0x59,0x20,0x4F,0x4E,0x20,0x54,0x41, +0x50,0xC5,0x50,0x52,0x45,0x53,0x53,0x20,0x52,0x45,0x43,0x4F,0x52,0x44,0x20,0x26, +0x20,0x50,0x4C,0x41,0x59,0x20,0x4F,0x4E,0x20,0x54,0x41,0x50,0xC5,0x0D,0x4C,0x4F, +0x41,0x44,0x49,0x4E,0xC7,0x0D,0x53,0x41,0x56,0x49,0x4E,0x47,0xA0,0x0D,0x56,0x45, +0x52,0x49,0x46,0x59,0x49,0x4E,0xC7,0x0D,0x46,0x4F,0x55,0x4E,0x44,0xA0,0x0D,0x4F, +0x4B,0x8D,0x24,0x9D,0x10,0x0D,0xB9,0x74,0xF1,0x08,0x29,0x7F,0x20,0xD2,0xFF,0xC8, +0x28,0x10,0xF3,0x18,0x60,0xA5,0x99,0xD0,0x08,0xA5,0xC6,0xF0,0x6D,0x78,0x4C,0xCF, +0xE5,0xC9,0x02,0xD0,0x18,0x84,0x97,0x20,0x4F,0xF1,0xA4,0x97,0x18,0x60,0xA5,0x99, +0xD0,0x0B,0xA5,0xD3,0x85,0xCA,0xA5,0xD6,0x85,0xC9,0x4C,0x4F,0xE6,0xC9,0x03,0xD0, +0x09,0x85,0xD0,0xA5,0xD5,0x85,0xC8,0x4C,0x4F,0xE6,0xB0,0x38,0xC9,0x02,0xF0,0x3F, +0x86,0x97,0x20,0x50,0xF2,0xB0,0x16,0x48,0x20,0x50,0xF2,0xB0,0x0D,0xD0,0x05,0xA9, +0x40,0x20,0x6A,0xFE,0xC6,0xA6,0xA6,0x97,0x68,0x60,0xAA,0x68,0x8A,0xA6,0x97,0x60, +0x20,0x8A,0xF8,0xD0,0x0B,0x20,0xC0,0xF8,0xB0,0x11,0xA9,0x00,0x85,0xA6,0xF0,0xF0, +0xB1,0xB2,0x18,0x60,0xA5,0x90,0xF0,0x04,0xA9,0x0D,0x18,0x60,0x4C,0x19,0xEF,0x20, +0x05,0xF2,0xB0,0x05,0xC9,0x00,0xF0,0xF7,0x18,0x60,0x48,0xA5,0x9A,0xC9,0x03,0xD0, +0x04,0x68,0x4C,0x42,0xE7,0x90,0x04,0x68,0x4C,0xE4,0xEE,0xC9,0x02,0xF0,0x2A,0x68, +0x85,0x9E,0x48,0x8A,0x48,0x98,0x48,0x20,0x8A,0xF8,0xD0,0x0E,0x20,0xE3,0xF8,0xB0, +0x0E,0xA9,0x02,0xA0,0x00,0x91,0xB2,0xC8,0x84,0xA6,0xA5,0x9E,0x91,0xB2,0x18,0x68, +0xA8,0x68,0xAA,0x68,0x90,0x02,0xA9,0x00,0x60,0x68,0x86,0x97,0x84,0x9E,0x20,0xED, +0xF0,0xA6,0x97,0xA4,0x9E,0x18,0x60,0x20,0xCF,0xF3,0xF0,0x03,0x4C,0x84,0xF7,0x20, +0xDF,0xF3,0xA5,0xBA,0xF0,0x16,0xC9,0x03,0xF0,0x12,0xB0,0x14,0xC9,0x02,0xD0,0x03, +0x4C,0x16,0xF1,0xA6,0xB9,0xE0,0x60,0xF0,0x03,0x4C,0x8D,0xF7,0x85,0x99,0x18,0x60, +0xAA,0x20,0x14,0xEE,0xA5,0xB9,0x10,0x06,0x20,0xD3,0xEE,0x4C,0x01,0xF3,0x20,0xCE, +0xEE,0x8A,0x24,0x90,0x10,0xE6,0x4C,0x8A,0xF7,0x20,0xCF,0xF3,0xF0,0x03,0x4C,0x84, +0xF7,0x20,0xDF,0xF3,0xA5,0xBA,0xD0,0x03,0x4C,0x90,0xF7,0xC9,0x03,0xF0,0x0F,0xB0, +0x11,0xC9,0x02,0xD0,0x03,0x4C,0xBC,0xF0,0xA6,0xB9,0xE0,0x60,0xF0,0xEA,0x85,0x9A, +0x18,0x60,0xAA,0x20,0x17,0xEE,0xA5,0xB9,0x10,0x05,0x20,0xC5,0xEE,0xD0,0x03,0x20, +0xC0,0xEE,0x8A,0x24,0x90,0x10,0xE7,0x4C,0x8A,0xF7,0x20,0xD4,0xF3,0xF0,0x02,0x18, +0x60,0x20,0xDF,0xF3,0x8A,0x48,0xA5,0xBA,0xF0,0x57,0xC9,0x03,0xF0,0x53,0xB0,0x4E, +0xC9,0x02,0xD0,0x29,0x68,0x20,0xB2,0xF3,0xA9,0x7D,0x8D,0x1E,0x91,0xA9,0x06,0x8D, +0x10,0x91,0xA9,0xEE,0x8D,0x1C,0x91,0x20,0x75,0xFE,0xA5,0xF8,0xF0,0x01,0xC8,0xA5, +0xFA,0xF0,0x01,0xC8,0xA9,0x00,0x85,0xF8,0x85,0xFA,0x4C,0x3C,0xF5,0xA5,0xB9,0x29, +0x0F,0xF0,0x1E,0x20,0x4D,0xF8,0xA9,0x00,0x20,0x90,0xF2,0x4C,0xCF,0xE4,0xB0,0x2E, +0xA5,0xB9,0xC9,0x62,0xD0,0x0B,0xA9,0x05,0x20,0xE7,0xF7,0x4C,0xB1,0xF3,0x20,0xDA, +0xF6,0x68,0xAA,0xC6,0x98,0xE4,0x98,0xF0,0x14,0xA4,0x98,0xB9,0x59,0x02,0x9D,0x59, +0x02,0xB9,0x63,0x02,0x9D,0x63,0x02,0xB9,0x6D,0x02,0x9D,0x6D,0x02,0x18,0x60,0xA9, +0x00,0x85,0x90,0x8A,0xA6,0x98,0xCA,0x30,0x15,0xDD,0x59,0x02,0xD0,0xF8,0x60,0xBD, +0x59,0x02,0x85,0xB8,0xBD,0x63,0x02,0x85,0xBA,0xBD,0x6D,0x02,0x85,0xB9,0x60,0xA9, +0x00,0x85,0x98,0xA2,0x03,0xE4,0x9A,0xB0,0x03,0x20,0x04,0xEF,0xE4,0x99,0xB0,0x03, +0x20,0xF6,0xEE,0x86,0x9A,0xA9,0x00,0x85,0x99,0x60,0xA6,0xB8,0xD0,0x03,0x4C,0x8D, +0xF7,0x20,0xCF,0xF3,0xD0,0x03,0x4C,0x81,0xF7,0xA6,0x98,0xE0,0x0A,0x90,0x03,0x4C, +0x7E,0xF7,0xE6,0x98,0xA5,0xB8,0x9D,0x59,0x02,0xA5,0xB9,0x09,0x60,0x85,0xB9,0x9D, +0x6D,0x02,0xA5,0xBA,0x9D,0x63,0x02,0xF0,0x5A,0xC9,0x03,0xF0,0x56,0x90,0x05,0x20, +0x95,0xF4,0x90,0x4F,0xC9,0x02,0xD0,0x03,0x4C,0xC7,0xF4,0x20,0x4D,0xF8,0xB0,0x03, +0x4C,0x96,0xF7,0xA5,0xB9,0x29,0x0F,0xD0,0x1F,0x20,0x94,0xF8,0xB0,0x36,0x20,0x47, +0xF6,0xA5,0xB7,0xF0,0x0A,0x20,0x67,0xF8,0x90,0x18,0xF0,0x28,0x4C,0x87,0xF7,0x20, +0xAF,0xF7,0xF0,0x20,0x90,0x0C,0xB0,0xF4,0x20,0xB7,0xF8,0xB0,0x17,0xA9,0x04,0x20, +0xE7,0xF7,0xA9,0xBF,0xA4,0xB9,0xC0,0x60,0xF0,0x07,0xA0,0x00,0xA9,0x02,0x91,0xB2, +0x98,0x85,0xA6,0x18,0x60,0xA5,0xB9,0x30,0x2C,0xA4,0xB7,0xF0,0x28,0xA5,0xBA,0x20, +0x17,0xEE,0xA5,0xB9,0x09,0xF0,0x20,0xC0,0xEE,0xA5,0x90,0x10,0x05,0x68,0x68,0x4C, +0x8A,0xF7,0xA5,0xB7,0xF0,0x0C,0xA0,0x00,0xB1,0xBB,0x20,0xE4,0xEE,0xC8,0xC4,0xB7, +0xD0,0xF6,0x20,0x04,0xEF,0x18,0x60,0xA9,0x06,0x8D,0x12,0x91,0x8D,0x10,0x91,0xA9, +0xEE,0x8D,0x1C,0x91,0xA0,0x00,0x8C,0x97,0x02,0xC4,0xB7,0xF0,0x0A,0xB1,0xBB,0x99, +0x93,0x02,0xC8,0xC0,0x04,0xD0,0xF2,0x20,0x27,0xF0,0x8E,0x98,0x02,0xAD,0x93,0x02, +0x29,0x0F,0xD0,0x00,0x0A,0xAA,0xBD,0x5A,0xFF,0x0A,0xA8,0xBD,0x5B,0xFF,0x2A,0x48, +0x98,0x69,0xC8,0x8D,0x99,0x02,0x68,0x69,0x00,0x8D,0x9A,0x02,0xAD,0x94,0x02,0x4A, +0x90,0x09,0xAD,0x20,0x91,0x0A,0xB0,0x03,0x4C,0x16,0xF0,0xAD,0x9B,0x02,0x8D,0x9C, +0x02,0xAD,0x9E,0x02,0x8D,0x9D,0x02,0x20,0x75,0xFE,0xA5,0xF8,0xD0,0x05,0x88,0x84, +0xF8,0x86,0xF7,0xA5,0xFA,0xD0,0x05,0x88,0x84,0xFA,0x86,0xF9,0x38,0xA9,0xF0,0x4C, +0x7B,0xFE,0x86,0xC3,0x84,0xC4,0x6C,0x30,0x03,0x85,0x93,0xA9,0x00,0x85,0x90,0xA5, +0xBA,0xD0,0x03,0x4C,0x96,0xF7,0xC9,0x03,0xF0,0xF9,0x90,0x6E,0xA4,0xB7,0xD0,0x03, +0x4C,0x93,0xF7,0x20,0xBC,0xE4,0xA9,0x60,0x85,0xB9,0x20,0x95,0xF4,0xA5,0xBA,0x20, +0x14,0xEE,0xA5,0xB9,0x20,0xCE,0xEE,0x20,0x19,0xEF,0x85,0xAE,0xA5,0x90,0x4A,0x4A, +0xB0,0x45,0x20,0x19,0xEF,0x85,0xAF,0x20,0xC1,0xE4,0xA9,0xFD,0x25,0x90,0x85,0x90, +0x20,0xE1,0xFF,0xD0,0x03,0x4C,0xCB,0xF6,0x20,0x19,0xEF,0xAA,0xA5,0x90,0x4A,0x4A, +0xB0,0xE8,0x8A,0xA4,0x93,0xF0,0x0C,0xA0,0x00,0xD1,0xAE,0xF0,0x08,0xA9,0x10,0x20, +0x6A,0xFE,0x2C,0x91,0xAE,0xE6,0xAE,0xD0,0x02,0xE6,0xAF,0x24,0x90,0x50,0xCB,0x20, +0xF6,0xEE,0x20,0xDA,0xF6,0x90,0x7A,0x4C,0x87,0xF7,0xC9,0x02,0xD0,0x03,0x4C,0xB9, +0xF0,0x20,0x4D,0xF8,0xB0,0x03,0x4C,0x96,0xF7,0x20,0x94,0xF8,0xB0,0x68,0x20,0x47, +0xF6,0xA5,0xB7,0xF0,0x09,0x20,0x67,0xF8,0x90,0x0B,0xF0,0x5A,0xB0,0xD9,0x20,0xAF, +0xF7,0xF0,0x53,0xB0,0xD2,0xA5,0x90,0x29,0x10,0x38,0xD0,0x4A,0xE0,0x01,0xF0,0x11, +0xE0,0x03,0xD0,0xDD,0xA0,0x01,0xB1,0xB2,0x85,0xC3,0xC8,0xB1,0xB2,0x85,0xC4,0xB0, +0x04,0xA5,0xB9,0xD0,0xEF,0xA0,0x03,0xB1,0xB2,0xA0,0x01,0xF1,0xB2,0xAA,0xA0,0x04, +0xB1,0xB2,0xA0,0x02,0xF1,0xB2,0xA8,0x18,0x8A,0x65,0xC3,0x85,0xAE,0x98,0x65,0xC4, +0x85,0xAF,0xA5,0xC3,0x85,0xC1,0xA5,0xC4,0x85,0xC2,0x20,0x6A,0xF6,0x20,0xC9,0xF8, +0x24,0x18,0xA6,0xAE,0xA4,0xAF,0x60,0xA5,0x9D,0x10,0x1E,0xA0,0x0C,0x20,0xE6,0xF1, +0xA5,0xB7,0xF0,0x15,0xA0,0x17,0x20,0xE6,0xF1,0xA4,0xB7,0xF0,0x0C,0xA0,0x00,0xB1, +0xBB,0x20,0xD2,0xFF,0xC8,0xC4,0xB7,0xD0,0xF6,0x60,0xA0,0x49,0xA5,0x93,0xF0,0x02, +0xA0,0x59,0x4C,0xE2,0xF1,0x86,0xAE,0x84,0xAF,0xAA,0xB5,0x00,0x85,0xC1,0xB5,0x01, +0x85,0xC2,0x6C,0x32,0x03,0xA5,0xBA,0xD0,0x03,0x4C,0x96,0xF7,0xC9,0x03,0xF0,0xF9, +0x90,0x5F,0xA9,0x61,0x85,0xB9,0xA4,0xB7,0xD0,0x03,0x4C,0x93,0xF7,0x20,0x95,0xF4, +0x20,0x28,0xF7,0xA5,0xBA,0x20,0x17,0xEE,0xA5,0xB9,0x20,0xC0,0xEE,0xA0,0x00,0x20, +0xD2,0xFB,0xA5,0xAC,0x20,0xE4,0xEE,0xA5,0xAD,0x20,0xE4,0xEE,0x20,0x11,0xFD,0xB0, +0x16,0xB1,0xAC,0x20,0xE4,0xEE,0x20,0xE1,0xFF,0xD0,0x07,0x20,0xDA,0xF6,0xA9,0x00, +0x38,0x60,0x20,0x1B,0xFD,0xD0,0xE5,0x20,0x04,0xEF,0x24,0xB9,0x30,0x11,0xA5,0xBA, +0x20,0x17,0xEE,0xA5,0xB9,0x29,0xEF,0x09,0xE0,0x20,0xC0,0xEE,0x20,0x04,0xEF,0x18, +0x60,0xC9,0x02,0xD0,0x03,0x4C,0xB9,0xF0,0x20,0x4D,0xF8,0x90,0x8C,0x20,0xB7,0xF8, +0xB0,0x25,0x20,0x28,0xF7,0xA2,0x03,0xA5,0xB9,0x29,0x01,0xD0,0x02,0xA2,0x01,0x8A, +0x20,0xE7,0xF7,0xB0,0x12,0x20,0xE6,0xF8,0xB0,0x0D,0xA5,0xB9,0x29,0x02,0xF0,0x06, +0xA9,0x05,0x20,0xE7,0xF7,0x24,0x18,0x60,0xA5,0x9D,0x10,0xFB,0xA0,0x51,0x20,0xE6, +0xF1,0x4C,0x59,0xF6,0xA2,0x00,0xE6,0xA2,0xD0,0x06,0xE6,0xA1,0xD0,0x02,0xE6,0xA0, +0x38,0xA5,0xA2,0xE9,0x01,0xA5,0xA1,0xE9,0x1A,0xA5,0xA0,0xE9,0x4F,0x90,0x06,0x86, +0xA0,0x86,0xA1,0x86,0xA2,0xAD,0x2F,0x91,0xCD,0x2F,0x91,0xD0,0xF8,0x85,0x91,0x60, +0x78,0xA5,0xA2,0xA6,0xA1,0xA4,0xA0,0x78,0x85,0xA2,0x86,0xA1,0x84,0xA0,0x58,0x60, +0xA5,0x91,0xC9,0xFE,0xD0,0x07,0x08,0x20,0xCC,0xFF,0x85,0xC6,0x28,0x60,0xA9,0x01, +0x2C,0xA9,0x02,0x2C,0xA9,0x03,0x2C,0xA9,0x04,0x2C,0xA9,0x05,0x2C,0xA9,0x06,0x2C, +0xA9,0x07,0x2C,0xA9,0x08,0x2C,0xA9,0x09,0x48,0x20,0xCC,0xFF,0xA0,0x00,0x24,0x9D, +0x50,0x0A,0x20,0xE6,0xF1,0x68,0x48,0x09,0x30,0x20,0xD2,0xFF,0x68,0x38,0x60,0xA5, +0x93,0x48,0x20,0xC0,0xF8,0x68,0x85,0x93,0xB0,0x2C,0xA0,0x00,0xB1,0xB2,0xC9,0x05, +0xF0,0x24,0xC9,0x01,0xF0,0x08,0xC9,0x03,0xF0,0x04,0xC9,0x04,0xD0,0xE1,0xAA,0x24, +0x9D,0x10,0x11,0xA0,0x63,0x20,0xE6,0xF1,0xA0,0x05,0xB1,0xB2,0x20,0xD2,0xFF,0xC8, +0xC0,0x15,0xD0,0xF6,0x18,0x88,0x60,0x85,0x9E,0x20,0x4D,0xF8,0x90,0x5E,0xA5,0xC2, +0x48,0xA5,0xC1,0x48,0xA5,0xAF,0x48,0xA5,0xAE,0x48,0xA0,0xBF,0xA9,0x20,0x91,0xB2, +0x88,0xD0,0xFB,0xA5,0x9E,0x91,0xB2,0xC8,0xA5,0xC1,0x91,0xB2,0xC8,0xA5,0xC2,0x91, +0xB2,0xC8,0xA5,0xAE,0x91,0xB2,0xC8,0xA5,0xAF,0x91,0xB2,0xC8,0x84,0x9F,0xA0,0x00, +0x84,0x9E,0xA4,0x9E,0xC4,0xB7,0xF0,0x0C,0xB1,0xBB,0xA4,0x9F,0x91,0xB2,0xE6,0x9E, +0xE6,0x9F,0xD0,0xEE,0x20,0x54,0xF8,0xA9,0x69,0x85,0xAB,0x20,0xEA,0xF8,0xA8,0x68, +0x85,0xAE,0x68,0x85,0xAF,0x68,0x85,0xC1,0x68,0x85,0xC2,0x98,0x60,0xA6,0xB2,0xA4, +0xB3,0xC0,0x02,0x60,0x20,0x4D,0xF8,0x8A,0x85,0xC1,0x18,0x69,0xC0,0x85,0xAE,0x98, +0x85,0xC2,0x69,0x00,0x85,0xAF,0x60,0x20,0xAF,0xF7,0xB0,0x1D,0xA0,0x05,0x84,0x9F, +0xA0,0x00,0x84,0x9E,0xC4,0xB7,0xF0,0x10,0xB1,0xBB,0xA4,0x9F,0xD1,0xB2,0xD0,0xE7, +0xE6,0x9E,0xE6,0x9F,0xA4,0x9E,0xD0,0xEC,0x18,0x60,0x20,0x4D,0xF8,0xE6,0xA6,0xA4, +0xA6,0xC0,0xC0,0x60,0x20,0xAB,0xF8,0xF0,0x1C,0xA0,0x1B,0x20,0xE6,0xF1,0x20,0x4B, +0xF9,0x20,0xAB,0xF8,0xD0,0xF8,0xA0,0x6A,0x4C,0xE6,0xF1,0xA9,0x40,0x2C,0x1F,0x91, +0xD0,0x03,0x2C,0x1F,0x91,0x18,0x60,0x20,0xAB,0xF8,0xF0,0xF9,0xA0,0x2E,0xD0,0xDB, +0xA9,0x00,0x85,0x90,0x85,0x93,0x20,0x54,0xF8,0x20,0x94,0xF8,0xB0,0x1F,0x78,0xA9, +0x00,0x85,0xAA,0x85,0xB4,0x85,0xB0,0x85,0x9E,0x85,0x9F,0x85,0x9C,0xA9,0x82,0xA2, +0x0E,0xD0,0x11,0x20,0x54,0xF8,0xA9,0x14,0x85,0xAB,0x20,0xB7,0xF8,0xB0,0x68,0x78, +0xA9,0xA0,0xA2,0x08,0xA0,0x7F,0x8C,0x2E,0x91,0x8D,0x2E,0x91,0x20,0x60,0xF1,0xAD, +0x14,0x03,0x8D,0x9F,0x02,0xAD,0x15,0x03,0x8D,0xA0,0x02,0x20,0xFB,0xFC,0xA9,0x02, +0x85,0xBE,0x20,0xDB,0xFB,0xAD,0x1C,0x91,0x29,0xFD,0x09,0x0C,0x8D,0x1C,0x91,0x85, +0xC0,0xA2,0xFF,0xA0,0xFF,0x88,0xD0,0xFD,0xCA,0xD0,0xF8,0x8D,0x29,0x91,0x58,0xAD, +0xA0,0x02,0xCD,0x15,0x03,0x18,0xF0,0x1F,0x20,0x4B,0xF9,0xAD,0x2D,0x91,0x29,0x40, +0xF0,0xED,0xAD,0x14,0x91,0x20,0x34,0xF7,0x4C,0x2F,0xF9,0x20,0xE1,0xFF,0x18,0xD0, +0x0B,0x20,0xCF,0xFC,0x38,0x68,0x68,0xA9,0x00,0x8D,0xA0,0x02,0x60,0x86,0xB1,0xA5, +0xB0,0x0A,0x0A,0x18,0x65,0xB0,0x18,0x65,0xB1,0x85,0xB1,0xA9,0x00,0x24,0xB0,0x30, +0x01,0x2A,0x06,0xB1,0x2A,0x06,0xB1,0x2A,0xAA,0xAD,0x28,0x91,0xC9,0x15,0x90,0xF9, +0x65,0xB1,0x8D,0x24,0x91,0x8A,0x6D,0x29,0x91,0x8D,0x25,0x91,0x58,0x60,0xAE,0x29, +0x91,0xA0,0xFF,0x98,0xED,0x28,0x91,0xEC,0x29,0x91,0xD0,0xF2,0x86,0xB1,0xAA,0x8C, +0x28,0x91,0x8C,0x29,0x91,0x98,0xE5,0xB1,0x86,0xB1,0x4A,0x66,0xB1,0x4A,0x66,0xB1, +0xA5,0xB0,0x18,0x69,0x3C,0x2C,0x21,0x91,0xC5,0xB1,0xB0,0x4A,0xA6,0x9C,0xF0,0x03, +0x4C,0xAD,0xFA,0xA6,0xA3,0x30,0x1B,0xA2,0x00,0x69,0x30,0x65,0xB0,0xC5,0xB1,0xB0, +0x1C,0xE8,0x69,0x26,0x65,0xB0,0xC5,0xB1,0xB0,0x17,0x69,0x2C,0x65,0xB0,0xC5,0xB1, +0x90,0x03,0x4C,0x60,0xFA,0xA5,0xB4,0xF0,0x1D,0x85,0xA8,0xD0,0x19,0xE6,0xA9,0xB0, +0x02,0xC6,0xA9,0x38,0xE9,0x13,0xE5,0xB1,0x65,0x92,0x85,0x92,0xA5,0xA4,0x49,0x01, +0x85,0xA4,0xF0,0x21,0x86,0xD7,0xA5,0xB4,0xF0,0x18,0x2C,0x2D,0x91,0x50,0x13,0xA9, +0x00,0x85,0xA4,0xA5,0xA3,0x10,0x30,0x30,0xC9,0xA2,0xA6,0x20,0x5D,0xF9,0xA5,0x9B, +0xD0,0xC3,0x4C,0x56,0xFF,0xA5,0x92,0xF0,0x07,0x30,0x03,0xC6,0xB0,0x2C,0xE6,0xB0, +0xA9,0x00,0x85,0x92,0xE4,0xD7,0xD0,0x0F,0x8A,0xD0,0xAA,0xA5,0xA9,0x30,0xC7,0xC9, +0x10,0x90,0xC3,0x85,0x96,0xB0,0xBF,0x8A,0x45,0x9B,0x85,0x9B,0xA5,0xB4,0xF0,0xD2, +0xC6,0xA3,0x30,0xC5,0x46,0xD7,0x66,0xBF,0xA2,0xDA,0x20,0x5D,0xF9,0x4C,0x56,0xFF, +0xA5,0x96,0xF0,0x04,0xA5,0xB4,0xF0,0x04,0xA5,0xA3,0x10,0x85,0x46,0xB1,0xA9,0x93, +0x38,0xE5,0xB1,0x65,0xB0,0x0A,0xAA,0x20,0x5D,0xF9,0xE6,0x9C,0xA5,0xB4,0xD0,0x11, +0xA5,0x96,0xF0,0x26,0x85,0xA8,0xA9,0x00,0x85,0x96,0xA9,0xC0,0x8D,0x2E,0x91,0x85, +0xB4,0xA5,0x96,0x85,0xB5,0xF0,0x09,0xA9,0x00,0x85,0xB4,0xA9,0x40,0x8D,0x2E,0x91, +0xA5,0xBF,0x85,0xBD,0xA5,0xA8,0x05,0xA9,0x85,0xB6,0x4C,0x56,0xFF,0x20,0xDB,0xFB, +0x85,0x9C,0xA2,0xDA,0x20,0x5D,0xF9,0xA5,0xBE,0xF0,0x02,0x85,0xA7,0xA9,0x0F,0x24, +0xAA,0x10,0x17,0xA5,0xB5,0xD0,0x0C,0xA6,0xBE,0xCA,0xD0,0x0B,0xA9,0x08,0x20,0x6A, +0xFE,0xD0,0x04,0xA9,0x00,0x85,0xAA,0x4C,0x56,0xFF,0x70,0x31,0xD0,0x18,0xA5,0xB5, +0xD0,0xF5,0xA5,0xB6,0xD0,0xF1,0xA5,0xA7,0x4A,0xA5,0xBD,0x30,0x03,0x90,0x18,0x18, +0xB0,0x15,0x29,0x0F,0x85,0xAA,0xC6,0xAA,0xD0,0xDD,0xA9,0x40,0x85,0xAA,0x20,0xD2, +0xFB,0xA9,0x00,0x85,0xAB,0xF0,0xD0,0xA9,0x80,0x85,0xAA,0xD0,0xCA,0xA5,0xB5,0xF0, +0x0A,0xA9,0x04,0x20,0x6A,0xFE,0xA9,0x00,0x4C,0x97,0xFB,0x20,0x11,0xFD,0x90,0x03, +0x4C,0x95,0xFB,0xA6,0xA7,0xCA,0xF0,0x2D,0xA5,0x93,0xF0,0x0C,0xA0,0x00,0xA5,0xBD, +0xD1,0xAC,0xF0,0x04,0xA9,0x01,0x85,0xB6,0xA5,0xB6,0xF0,0x4B,0xA2,0x3D,0xE4,0x9E, +0x90,0x3E,0xA6,0x9E,0xA5,0xAD,0x9D,0x01,0x01,0xA5,0xAC,0x9D,0x00,0x01,0xE8,0xE8, +0x86,0x9E,0x4C,0x87,0xFB,0xA6,0x9F,0xE4,0x9E,0xF0,0x35,0xA5,0xAC,0xDD,0x00,0x01, +0xD0,0x2E,0xA5,0xAD,0xDD,0x01,0x01,0xD0,0x27,0xE6,0x9F,0xE6,0x9F,0xA5,0x93,0xF0, +0x0B,0xA5,0xBD,0xA0,0x00,0xD1,0xAC,0xF0,0x17,0xC8,0x84,0xB6,0xA5,0xB6,0xF0,0x07, +0xA9,0x10,0x20,0x6A,0xFE,0xD0,0x09,0xA5,0x93,0xD0,0x05,0xA8,0xA5,0xBD,0x91,0xAC, +0x20,0x1B,0xFD,0xD0,0x3A,0xA9,0x80,0x85,0xAA,0xA6,0xBE,0xCA,0x30,0x02,0x86,0xBE, +0xC6,0xA7,0xF0,0x08,0xA5,0x9E,0xD0,0x27,0x85,0xBE,0xF0,0x23,0x20,0xCF,0xFC,0x20, +0xD2,0xFB,0xA0,0x00,0x84,0xAB,0xB1,0xAC,0x45,0xAB,0x85,0xAB,0x20,0x1B,0xFD,0x20, +0x11,0xFD,0x90,0xF2,0xA5,0xAB,0x45,0xBD,0xF0,0x05,0xA9,0x20,0x20,0x6A,0xFE,0x4C, +0x56,0xFF,0xA5,0xC2,0x85,0xAD,0xA5,0xC1,0x85,0xAC,0x60,0xA9,0x08,0x85,0xA3,0xA9, +0x00,0x85,0xA4,0x85,0xA8,0x85,0x9B,0x85,0xA9,0x60,0xA5,0xBD,0x4A,0xA9,0x60,0x90, +0x02,0xA9,0xB0,0xA2,0x00,0x8D,0x28,0x91,0x8E,0x29,0x91,0xAD,0x20,0x91,0x49,0x08, +0x8D,0x20,0x91,0x29,0x08,0x60,0x38,0x66,0xAD,0x30,0x3C,0xA5,0xA8,0xD0,0x12,0xA9, +0x10,0xA2,0x01,0x20,0xF5,0xFB,0xD0,0x2F,0xE6,0xA8,0xA5,0xAD,0x10,0x29,0x4C,0x95, +0xFC,0xA5,0xA9,0xD0,0x09,0x20,0xF1,0xFB,0xD0,0x1D,0xE6,0xA9,0xD0,0x19,0x20,0xEA, +0xFB,0xD0,0x14,0xA5,0xA4,0x49,0x01,0x85,0xA4,0xF0,0x0F,0xA5,0xBD,0x49,0x01,0x85, +0xBD,0x29,0x01,0x45,0x9B,0x85,0x9B,0x4C,0x56,0xFF,0x46,0xBD,0xC6,0xA3,0xA5,0xA3, +0xF0,0x3A,0x10,0xF3,0x20,0xDB,0xFB,0x58,0xA5,0xA5,0xF0,0x12,0xA2,0x00,0x86,0xD7, +0xC6,0xA5,0xA6,0xBE,0xE0,0x02,0xD0,0x02,0x09,0x80,0x85,0xBD,0xD0,0xD9,0x20,0x11, +0xFD,0x90,0x0A,0xD0,0x91,0xE6,0xAD,0xA5,0xD7,0x85,0xBD,0xB0,0xCA,0xA0,0x00,0xB1, +0xAC,0x85,0xBD,0x45,0xD7,0x85,0xD7,0x20,0x1B,0xFD,0xD0,0xBB,0xA5,0x9B,0x49,0x01, +0x85,0xBD,0x4C,0x56,0xFF,0xC6,0xBE,0xD0,0x03,0x20,0x08,0xFD,0xA9,0x50,0x85,0xA7, +0xA2,0x08,0x78,0x20,0xFB,0xFC,0xD0,0xEA,0xA9,0x78,0x20,0xF3,0xFB,0xD0,0xE3,0xC6, +0xA7,0xD0,0xDF,0x20,0xDB,0xFB,0xC6,0xAB,0x10,0xD8,0xA2,0x0A,0x20,0xFB,0xFC,0x58, +0xE6,0xAB,0xA5,0xBE,0xF0,0x30,0x20,0xD2,0xFB,0xA2,0x09,0x86,0xA5,0xD0,0x85,0x08, +0x78,0x20,0x08,0xFD,0xA9,0x7F,0x8D,0x2E,0x91,0xA9,0xF7,0x8D,0x20,0x91,0xA9,0x40, +0x8D,0x2B,0x91,0x20,0x39,0xFE,0xAD,0xA0,0x02,0xF0,0x09,0x8D,0x15,0x03,0xAD,0x9F, +0x02,0x8D,0x14,0x03,0x28,0x60,0x20,0xCF,0xFC,0xF0,0x97,0xBD,0xE9,0xFD,0x8D,0x14, +0x03,0xBD,0xEA,0xFD,0x8D,0x15,0x03,0x60,0xAD,0x1C,0x91,0x09,0x0E,0x8D,0x1C,0x91, +0x60,0x38,0xA5,0xAC,0xE5,0xAE,0xA5,0xAD,0xE5,0xAF,0x60,0xE6,0xAC,0xD0,0x02,0xE6, +0xAD,0x60,0xA2,0xFF,0x78,0x9A,0xD8,0x20,0x3F,0xFD,0xD0,0x03,0x6C,0x00,0xA0,0x20, +0x8D,0xFD,0x20,0x52,0xFD,0x20,0xF9,0xFD,0x20,0x18,0xE5,0x58,0x6C,0x00,0xC0,0xA2, +0x05,0xBD,0x4C,0xFD,0xDD,0x03,0xA0,0xD0,0x03,0xCA,0xD0,0xF5,0x60,0x41,0x30,0xC3, +0xC2,0xCD,0xA2,0x6D,0xA0,0xFD,0x18,0x86,0xC3,0x84,0xC4,0xA0,0x1F,0xB9,0x14,0x03, +0xB0,0x02,0xB1,0xC3,0x91,0xC3,0x99,0x14,0x03,0x88,0x10,0xF1,0x60,0xBF,0xEA,0xD2, +0xFE,0xAD,0xFE,0x0A,0xF4,0x4A,0xF3,0xC7,0xF2,0x09,0xF3,0xF3,0xF3,0x0E,0xF2,0x7A, +0xF2,0x70,0xF7,0xF5,0xF1,0xEF,0xF3,0xD2,0xFE,0x49,0xF5,0x85,0xF6,0xA9,0x00,0xAA, +0x95,0x00,0x9D,0x00,0x02,0x9D,0x00,0x03,0xE8,0xD0,0xF5,0xA2,0x3C,0xA0,0x03,0x86, +0xB2,0x84,0xB3,0x85,0xC1,0x85,0x97,0x8D,0x81,0x02,0xA8,0xA9,0x04,0x85,0xC2,0xE6, +0xC1,0xD0,0x02,0xE6,0xC2,0x20,0x91,0xFE,0xA5,0x97,0xF0,0x22,0xB0,0xF1,0xA4,0xC2, +0xA6,0xC1,0xC0,0x20,0x90,0x25,0xC0,0x21,0xB0,0x08,0xA0,0x1E,0x8C,0x88,0x02,0x4C, +0x7B,0xFE,0xA9,0x12,0x8D,0x82,0x02,0xA9,0x10,0x8D,0x88,0x02,0xD0,0xF1,0x90,0xCF, +0xA5,0xC2,0x8D,0x82,0x02,0x85,0x97,0xC9,0x11,0x90,0xC4,0x20,0xC3,0xE5,0x4C,0xEB, +0xFD,0xA8,0xFC,0x0B,0xFC,0xBF,0xEA,0x8E,0xF9,0xA9,0x7F,0x8D,0x1E,0x91,0x8D,0x2E, +0x91,0xA9,0x40,0x8D,0x2B,0x91,0xA9,0x40,0x8D,0x1B,0x91,0xA9,0xFE,0x8D,0x1C,0x91, +0xA9,0xDE,0x8D,0x2C,0x91,0xA2,0x00,0x8E,0x12,0x91,0xA2,0xFF,0x8E,0x22,0x91,0xA2, +0x00,0x8E,0x23,0x91,0xA2,0x80,0x8E,0x13,0x91,0xA2,0x00,0x8E,0x1F,0x91,0x20,0x84, +0xEF,0xA9,0x82,0x8D,0x1E,0x91,0x20,0x8D,0xEF,0xA9,0xC0,0x8D,0x2E,0x91,0xA9,0x26, +0x8D,0x24,0x91,0xA9,0x48,0x8D,0x25,0x91,0x60,0x85,0xB7,0x86,0xBB,0x84,0xBC,0x60, +0x85,0xB8,0x86,0xBA,0x84,0xB9,0x60,0xA5,0xBA,0xC9,0x02,0xD0,0x0B,0xAD,0x97,0x02, +0xA9,0x00,0x8D,0x97,0x02,0x60,0x85,0x9D,0xA5,0x90,0x05,0x90,0x85,0x90,0x60,0x8D, +0x85,0x02,0x60,0x90,0x06,0xAE,0x83,0x02,0xAC,0x84,0x02,0x8E,0x83,0x02,0x8C,0x84, +0x02,0x60,0x90,0x06,0xAE,0x81,0x02,0xAC,0x82,0x02,0x8E,0x81,0x02,0x8C,0x82,0x02, +0x60,0xB1,0xC1,0xAA,0xA9,0x55,0x91,0xC1,0xD1,0xC1,0xD0,0x08,0x6A,0x91,0xC1,0xD1, +0xC1,0xD0,0x01,0xA9,0x18,0x8A,0x91,0xC1,0x60,0x78,0x6C,0x18,0x03,0x48,0x8A,0x48, +0x98,0x48,0xAD,0x1D,0x91,0x10,0x48,0x2D,0x1E,0x91,0xAA,0x29,0x02,0xF0,0x1F,0x20, +0x3F,0xFD,0xD0,0x03,0x6C,0x02,0xA0,0x2C,0x11,0x91,0x20,0x34,0xF7,0x20,0xE1,0xFF, +0xD0,0x2D,0x20,0x52,0xFD,0x20,0xF9,0xFD,0x20,0x18,0xE5,0x6C,0x02,0xC0,0xAD,0x1E, +0x91,0x09,0x80,0x48,0xA9,0x7F,0x8D,0x1E,0x91,0x8A,0x29,0x40,0xF0,0x14,0xA9,0xCE, +0x05,0xB5,0x8D,0x1C,0x91,0xAD,0x14,0x91,0x68,0x8D,0x1E,0x91,0x20,0xA3,0xEF,0x4C, +0x56,0xFF,0x8A,0x29,0x20,0xF0,0x25,0xAD,0x10,0x91,0x29,0x01,0x85,0xA7,0xAD,0x18, +0x91,0xE9,0x16,0x6D,0x99,0x02,0x8D,0x18,0x91,0xAD,0x19,0x91,0x6D,0x9A,0x02,0x8D, +0x19,0x91,0x68,0x8D,0x1E,0x91,0x20,0x36,0xF0,0x4C,0x56,0xFF,0x8A,0x29,0x10,0xF0, +0x25,0xAD,0x93,0x02,0x29,0x0F,0xD0,0x00,0x0A,0xAA,0xBD,0x5A,0xFF,0x8D,0x18,0x91, +0xBD,0x5B,0xFF,0x8D,0x19,0x91,0xAD,0x10,0x91,0x68,0x09,0x20,0x29,0xEF,0x8D,0x1E, +0x91,0xAE,0x98,0x02,0x86,0xA8,0x68,0xA8,0x68,0xAA,0x68,0x40,0xE6,0x2A,0x78,0x1C, +0x49,0x13,0xB1,0x0F,0x0A,0x0E,0xD3,0x06,0x38,0x03,0x6A,0x01,0xD0,0x00,0x83,0x00, +0x36,0x00,0x48,0x8A,0x48,0x98,0x48,0xBA,0xBD,0x04,0x01,0x29,0x10,0xF0,0x03,0x6C, +0x16,0x03,0x6C,0x14,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0x4C,0x52,0xFD,0x4C,0x57,0xFD, +0x4C,0x66,0xFE,0x4C,0xC0,0xEE,0x4C,0xCE,0xEE,0x4C,0x73,0xFE,0x4C,0x82,0xFE,0x4C, +0x1E,0xEB,0x4C,0x6F,0xFE,0x4C,0x19,0xEF,0x4C,0xE4,0xEE,0x4C,0xF6,0xEE,0x4C,0x04, +0xEF,0x4C,0x17,0xEE,0x4C,0x14,0xEE,0x4C,0x57,0xFE,0x4C,0x50,0xFE,0x4C,0x49,0xFE, +0x6C,0x1A,0x03,0x6C,0x1C,0x03,0x6C,0x1E,0x03,0x6C,0x20,0x03,0x6C,0x22,0x03,0x6C, +0x24,0x03,0x6C,0x26,0x03,0x4C,0x42,0xF5,0x4C,0x75,0xF6,0x4C,0x67,0xF7,0x4C,0x60, +0xF7,0x6C,0x28,0x03,0x6C,0x2A,0x03,0x6C,0x2C,0x03,0x4C,0x34,0xF7,0x4C,0x05,0xE5, +0x4C,0x0A,0xE5,0x4C,0x00,0xE5,0xFF,0xFF,0xFF,0xFF,0xA9,0xFE,0x22,0xFD,0x72,0xFF, +}; diff --git a/MCUME_pico/pico20/keyboard_osd.h b/MCUME_pico/pico20/keyboard_osd.h new file mode 100644 index 0000000..062eb4e --- /dev/null +++ b/MCUME_pico/pico20/keyboard_osd.h @@ -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 + diff --git a/MCUME_pico/pico20/mos6502.cpp b/MCUME_pico/pico20/mos6502.cpp new file mode 100644 index 0000000..f623a74 --- /dev/null +++ b/MCUME_pico/pico20/mos6502.cpp @@ -0,0 +1,1478 @@ +#include "mos6502.h" +#include "MOS6502Memory.h" + + //BusRead Read; + //BusWrite Write; + +#define Read(location) readWord(location) +#define Write(location,value) writeWord(location,value) + + +mos6502::mos6502() +{ + //Write = (BusWrite)w; + //Read = (BusRead)r; + Instr instr; + + // fill jump table with ILLEGALs + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_ILLEGAL; + for(int i = 0; i < 256; i++) + { + InstrTable[i] = instr; + } + + // insert opcodes + + instr.addr = &mos6502::Addr_IMM; + instr.code = &mos6502::Op_ADC; + instr.cycles = 2; + InstrTable[0x69] = instr; + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_ADC; + instr.cycles = 4; + InstrTable[0x6D] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_ADC; + instr.cycles = 3; + InstrTable[0x65] = instr; + instr.addr = &mos6502::Addr_INX; + instr.code = &mos6502::Op_ADC; + instr.cycles = 6; + InstrTable[0x61] = instr; + instr.addr = &mos6502::Addr_INY; + instr.code = &mos6502::Op_ADC; + instr.cycles = 6; + InstrTable[0x71] = instr; + instr.addr = &mos6502::Addr_ZEX; + instr.code = &mos6502::Op_ADC; + instr.cycles = 4; + InstrTable[0x75] = instr; + instr.addr = &mos6502::Addr_ABX; + instr.code = &mos6502::Op_ADC; + instr.cycles = 4; + InstrTable[0x7D] = instr; + instr.addr = &mos6502::Addr_ABY; + instr.code = &mos6502::Op_ADC; + instr.cycles = 4; + InstrTable[0x79] = instr; + + instr.addr = &mos6502::Addr_IMM; + instr.code = &mos6502::Op_AND; + instr.cycles = 2; + InstrTable[0x29] = instr; + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_AND; + instr.cycles = 4; + InstrTable[0x2D] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_AND; + instr.cycles = 3; + InstrTable[0x25] = instr; + instr.addr = &mos6502::Addr_INX; + instr.code = &mos6502::Op_AND; + instr.cycles = 6; + InstrTable[0x21] = instr; + instr.addr = &mos6502::Addr_INY; + instr.code = &mos6502::Op_AND; + instr.cycles = 5; + InstrTable[0x31] = instr; + instr.addr = &mos6502::Addr_ZEX; + instr.code = &mos6502::Op_AND; + instr.cycles = 4; + InstrTable[0x35] = instr; + instr.addr = &mos6502::Addr_ABX; + instr.code = &mos6502::Op_AND; + instr.cycles = 4; + InstrTable[0x3D] = instr; + instr.addr = &mos6502::Addr_ABY; + instr.code = &mos6502::Op_AND; + instr.cycles = 4; + InstrTable[0x39] = instr; + + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_ASL; + instr.cycles = 6; + InstrTable[0x0E] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_ASL; + instr.cycles = 5; + InstrTable[0x06] = instr; + instr.addr = &mos6502::Addr_ACC; + instr.code = &mos6502::Op_ASL_ACC; + instr.cycles = 2; + InstrTable[0x0A] = instr; + instr.addr = &mos6502::Addr_ZEX; + instr.code = &mos6502::Op_ASL; + instr.cycles = 6; + InstrTable[0x16] = instr; + instr.addr = &mos6502::Addr_ABX; + instr.code = &mos6502::Op_ASL; + instr.cycles = 7; + InstrTable[0x1E] = instr; + + instr.addr = &mos6502::Addr_REL; + instr.code = &mos6502::Op_BCC; + instr.cycles = 2; + InstrTable[0x90] = instr; + + instr.addr = &mos6502::Addr_REL; + instr.code = &mos6502::Op_BCS; + instr.cycles = 2; + InstrTable[0xB0] = instr; + + instr.addr = &mos6502::Addr_REL; + instr.code = &mos6502::Op_BEQ; + instr.cycles = 2; + InstrTable[0xF0] = instr; + + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_BIT; + instr.cycles = 4; + InstrTable[0x2C] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_BIT; + instr.cycles = 3; + InstrTable[0x24] = instr; + + instr.addr = &mos6502::Addr_REL; + instr.code = &mos6502::Op_BMI; + instr.cycles = 2; + InstrTable[0x30] = instr; + + instr.addr = &mos6502::Addr_REL; + instr.code = &mos6502::Op_BNE; + instr.cycles = 2; + InstrTable[0xD0] = instr; + + instr.addr = &mos6502::Addr_REL; + instr.code = &mos6502::Op_BPL; + instr.cycles = 2; + InstrTable[0x10] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_BRK; + instr.cycles = 7; + InstrTable[0x00] = instr; + + instr.addr = &mos6502::Addr_REL; + instr.code = &mos6502::Op_BVC; + instr.cycles = 2; + InstrTable[0x50] = instr; + + instr.addr = &mos6502::Addr_REL; + instr.code = &mos6502::Op_BVS; + instr.cycles = 2; + InstrTable[0x70] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_CLC; + instr.cycles = 2; + InstrTable[0x18] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_CLD; + instr.cycles = 2; + InstrTable[0xD8] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_CLI; + instr.cycles = 2; + InstrTable[0x58] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_CLV; + instr.cycles = 2; + InstrTable[0xB8] = instr; + + instr.addr = &mos6502::Addr_IMM; + instr.code = &mos6502::Op_CMP; + instr.cycles = 2; + InstrTable[0xC9] = instr; + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_CMP; + instr.cycles = 4; + InstrTable[0xCD] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_CMP; + instr.cycles = 3; + InstrTable[0xC5] = instr; + instr.addr = &mos6502::Addr_INX; + instr.code = &mos6502::Op_CMP; + instr.cycles = 6; + InstrTable[0xC1] = instr; + instr.addr = &mos6502::Addr_INY; + instr.code = &mos6502::Op_CMP; + instr.cycles = 3; + InstrTable[0xD1] = instr; + instr.addr = &mos6502::Addr_ZEX; + instr.code = &mos6502::Op_CMP; + instr.cycles = 4; + InstrTable[0xD5] = instr; + instr.addr = &mos6502::Addr_ABX; + instr.code = &mos6502::Op_CMP; + instr.cycles = 4; + InstrTable[0xDD] = instr; + instr.addr = &mos6502::Addr_ABY; + instr.code = &mos6502::Op_CMP; + instr.cycles = 4; + InstrTable[0xD9] = instr; + + instr.addr = &mos6502::Addr_IMM; + instr.code = &mos6502::Op_CPX; + instr.cycles = 2; + InstrTable[0xE0] = instr; + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_CPX; + instr.cycles = 4; + InstrTable[0xEC] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_CPX; + instr.cycles = 3; + InstrTable[0xE4] = instr; + + instr.addr = &mos6502::Addr_IMM; + instr.code = &mos6502::Op_CPY; + instr.cycles = 2; + InstrTable[0xC0] = instr; + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_CPY; + instr.cycles = 4; + InstrTable[0xCC] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_CPY; + instr.cycles = 3; + InstrTable[0xC4] = instr; + + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_DEC; + instr.cycles = 6; + InstrTable[0xCE] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_DEC; + instr.cycles = 5; + InstrTable[0xC6] = instr; + instr.addr = &mos6502::Addr_ZEX; + instr.code = &mos6502::Op_DEC; + instr.cycles = 6; + InstrTable[0xD6] = instr; + instr.addr = &mos6502::Addr_ABX; + instr.code = &mos6502::Op_DEC; + instr.cycles = 7; + InstrTable[0xDE] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_DEX; + instr.cycles = 2; + InstrTable[0xCA] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_DEY; + instr.cycles = 2; + InstrTable[0x88] = instr; + + instr.addr = &mos6502::Addr_IMM; + instr.code = &mos6502::Op_EOR; + instr.cycles = 2; + InstrTable[0x49] = instr; + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_EOR; + instr.cycles = 4; + InstrTable[0x4D] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_EOR; + instr.cycles = 3; + InstrTable[0x45] = instr; + instr.addr = &mos6502::Addr_INX; + instr.code = &mos6502::Op_EOR; + instr.cycles = 6; + InstrTable[0x41] = instr; + instr.addr = &mos6502::Addr_INY; + instr.code = &mos6502::Op_EOR; + instr.cycles = 5; + InstrTable[0x51] = instr; + instr.addr = &mos6502::Addr_ZEX; + instr.code = &mos6502::Op_EOR; + instr.cycles = 4; + InstrTable[0x55] = instr; + instr.addr = &mos6502::Addr_ABX; + instr.code = &mos6502::Op_EOR; + instr.cycles = 4; + InstrTable[0x5D] = instr; + instr.addr = &mos6502::Addr_ABY; + instr.code = &mos6502::Op_EOR; + instr.cycles = 4; + InstrTable[0x59] = instr; + + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_INC; + instr.cycles = 6; + InstrTable[0xEE] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_INC; + instr.cycles = 5; + InstrTable[0xE6] = instr; + instr.addr = &mos6502::Addr_ZEX; + instr.code = &mos6502::Op_INC; + instr.cycles = 6; + InstrTable[0xF6] = instr; + instr.addr = &mos6502::Addr_ABX; + instr.code = &mos6502::Op_INC; + instr.cycles = 7; + InstrTable[0xFE] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_INX; + instr.cycles = 2; + InstrTable[0xE8] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_INY; + instr.cycles = 2; + InstrTable[0xC8] = instr; + + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_JMP; + instr.cycles = 3; + InstrTable[0x4C] = instr; + instr.addr = &mos6502::Addr_ABI; + instr.code = &mos6502::Op_JMP; + instr.cycles = 5; + InstrTable[0x6C] = instr; + + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_JSR; + instr.cycles = 6; + InstrTable[0x20] = instr; + + instr.addr = &mos6502::Addr_IMM; + instr.code = &mos6502::Op_LDA; + instr.cycles = 2; + InstrTable[0xA9] = instr; + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_LDA; + instr.cycles = 4; + InstrTable[0xAD] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_LDA; + instr.cycles = 3; + InstrTable[0xA5] = instr; + instr.addr = &mos6502::Addr_INX; + instr.code = &mos6502::Op_LDA; + instr.cycles = 6; + InstrTable[0xA1] = instr; + instr.addr = &mos6502::Addr_INY; + instr.code = &mos6502::Op_LDA; + instr.cycles = 5; + InstrTable[0xB1] = instr; + instr.addr = &mos6502::Addr_ZEX; + instr.code = &mos6502::Op_LDA; + instr.cycles = 4; + InstrTable[0xB5] = instr; + instr.addr = &mos6502::Addr_ABX; + instr.code = &mos6502::Op_LDA; + instr.cycles = 4; + InstrTable[0xBD] = instr; + instr.addr = &mos6502::Addr_ABY; + instr.code = &mos6502::Op_LDA; + instr.cycles = 4; + InstrTable[0xB9] = instr; + + instr.addr = &mos6502::Addr_IMM; + instr.code = &mos6502::Op_LDX; + instr.cycles = 2; + InstrTable[0xA2] = instr; + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_LDX; + instr.cycles = 4; + InstrTable[0xAE] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_LDX; + instr.cycles = 3; + InstrTable[0xA6] = instr; + instr.addr = &mos6502::Addr_ABY; + instr.code = &mos6502::Op_LDX; + instr.cycles = 4; + InstrTable[0xBE] = instr; + instr.addr = &mos6502::Addr_ZEY; + instr.code = &mos6502::Op_LDX; + instr.cycles = 4; + InstrTable[0xB6] = instr; + + instr.addr = &mos6502::Addr_IMM; + instr.code = &mos6502::Op_LDY; + instr.cycles = 2; + InstrTable[0xA0] = instr; + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_LDY; + instr.cycles = 4; + InstrTable[0xAC] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_LDY; + instr.cycles = 3; + InstrTable[0xA4] = instr; + instr.addr = &mos6502::Addr_ZEX; + instr.code = &mos6502::Op_LDY; + instr.cycles = 4; + InstrTable[0xB4] = instr; + instr.addr = &mos6502::Addr_ABX; + instr.code = &mos6502::Op_LDY; + instr.cycles = 4; + InstrTable[0xBC] = instr; + + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_LSR; + instr.cycles = 6; + InstrTable[0x4E] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_LSR; + instr.cycles = 5; + InstrTable[0x46] = instr; + instr.addr = &mos6502::Addr_ACC; + instr.code = &mos6502::Op_LSR_ACC; + instr.cycles = 2; + InstrTable[0x4A] = instr; + instr.addr = &mos6502::Addr_ZEX; + instr.code = &mos6502::Op_LSR; + instr.cycles = 6; + InstrTable[0x56] = instr; + instr.addr = &mos6502::Addr_ABX; + instr.code = &mos6502::Op_LSR; + instr.cycles = 7; + InstrTable[0x5E] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_NOP; + instr.cycles = 2; + InstrTable[0xEA] = instr; + + instr.addr = &mos6502::Addr_IMM; + instr.code = &mos6502::Op_ORA; + instr.cycles = 2; + InstrTable[0x09] = instr; + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_ORA; + instr.cycles = 4; + InstrTable[0x0D] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_ORA; + instr.cycles = 3; + InstrTable[0x05] = instr; + instr.addr = &mos6502::Addr_INX; + instr.code = &mos6502::Op_ORA; + instr.cycles = 6; + InstrTable[0x01] = instr; + instr.addr = &mos6502::Addr_INY; + instr.code = &mos6502::Op_ORA; + instr.cycles = 5; + InstrTable[0x11] = instr; + instr.addr = &mos6502::Addr_ZEX; + instr.code = &mos6502::Op_ORA; + instr.cycles = 4; + InstrTable[0x15] = instr; + instr.addr = &mos6502::Addr_ABX; + instr.code = &mos6502::Op_ORA; + instr.cycles = 4; + InstrTable[0x1D] = instr; + instr.addr = &mos6502::Addr_ABY; + instr.code = &mos6502::Op_ORA; + instr.cycles = 4; + InstrTable[0x19] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_PHA; + instr.cycles = 3; + InstrTable[0x48] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_PHP; + instr.cycles = 3; + InstrTable[0x08] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_PLA; + instr.cycles = 4; + InstrTable[0x68] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_PLP; + instr.cycles = 4; + InstrTable[0x28] = instr; + + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_ROL; + instr.cycles = 6; + InstrTable[0x2E] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_ROL; + instr.cycles = 5; + InstrTable[0x26] = instr; + instr.addr = &mos6502::Addr_ACC; + instr.code = &mos6502::Op_ROL_ACC; + instr.cycles = 2; + InstrTable[0x2A] = instr; + instr.addr = &mos6502::Addr_ZEX; + instr.code = &mos6502::Op_ROL; + instr.cycles = 6; + InstrTable[0x36] = instr; + instr.addr = &mos6502::Addr_ABX; + instr.code = &mos6502::Op_ROL; + instr.cycles = 7; + InstrTable[0x3E] = instr; + + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_ROR; + instr.cycles = 6; + InstrTable[0x6E] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_ROR; + instr.cycles = 5; + InstrTable[0x66] = instr; + instr.addr = &mos6502::Addr_ACC; + instr.code = &mos6502::Op_ROR_ACC; + instr.cycles = 2; + InstrTable[0x6A] = instr; + instr.addr = &mos6502::Addr_ZEX; + instr.code = &mos6502::Op_ROR; + instr.cycles = 6; + InstrTable[0x76] = instr; + instr.addr = &mos6502::Addr_ABX; + instr.code = &mos6502::Op_ROR; + instr.cycles = 7; + InstrTable[0x7E] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_RTI; + instr.cycles = 6; + InstrTable[0x40] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_RTS; + instr.cycles = 6; + InstrTable[0x60] = instr; + + instr.addr = &mos6502::Addr_IMM; + instr.code = &mos6502::Op_SBC; + instr.cycles = 2; + InstrTable[0xE9] = instr; + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_SBC; + instr.cycles = 4; + InstrTable[0xED] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_SBC; + instr.cycles = 3; + InstrTable[0xE5] = instr; + instr.addr = &mos6502::Addr_INX; + instr.code = &mos6502::Op_SBC; + instr.cycles = 6; + InstrTable[0xE1] = instr; + instr.addr = &mos6502::Addr_INY; + instr.code = &mos6502::Op_SBC; + instr.cycles = 5; + InstrTable[0xF1] = instr; + instr.addr = &mos6502::Addr_ZEX; + instr.code = &mos6502::Op_SBC; + instr.cycles = 4; + InstrTable[0xF5] = instr; + instr.addr = &mos6502::Addr_ABX; + instr.code = &mos6502::Op_SBC; + instr.cycles = 4; + InstrTable[0xFD] = instr; + instr.addr = &mos6502::Addr_ABY; + instr.code = &mos6502::Op_SBC; + instr.cycles = 4; + InstrTable[0xF9] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_SEC; + instr.cycles = 2; + InstrTable[0x38] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_SED; + instr.cycles = 2; + InstrTable[0xF8] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_SEI; + instr.cycles = 2; + InstrTable[0x78] = instr; + + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_STA; + instr.cycles = 4; + InstrTable[0x8D] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_STA; + instr.cycles = 3; + InstrTable[0x85] = instr; + instr.addr = &mos6502::Addr_INX; + instr.code = &mos6502::Op_STA; + instr.cycles = 6; + InstrTable[0x81] = instr; + instr.addr = &mos6502::Addr_INY; + instr.code = &mos6502::Op_STA; + instr.cycles = 6; + InstrTable[0x91] = instr; + instr.addr = &mos6502::Addr_ZEX; + instr.code = &mos6502::Op_STA; + instr.cycles = 4; + InstrTable[0x95] = instr; + instr.addr = &mos6502::Addr_ABX; + instr.code = &mos6502::Op_STA; + instr.cycles = 5; + InstrTable[0x9D] = instr; + instr.addr = &mos6502::Addr_ABY; + instr.code = &mos6502::Op_STA; + instr.cycles = 5; + InstrTable[0x99] = instr; + + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_STX; + instr.cycles = 4; + InstrTable[0x8E] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_STX; + instr.cycles = 3; + InstrTable[0x86] = instr; + instr.addr = &mos6502::Addr_ZEY; + instr.code = &mos6502::Op_STX; + instr.cycles = 4; + InstrTable[0x96] = instr; + + instr.addr = &mos6502::Addr_ABS; + instr.code = &mos6502::Op_STY; + instr.cycles = 4; + InstrTable[0x8C] = instr; + instr.addr = &mos6502::Addr_ZER; + instr.code = &mos6502::Op_STY; + instr.cycles = 3; + InstrTable[0x84] = instr; + instr.addr = &mos6502::Addr_ZEX; + instr.code = &mos6502::Op_STY; + instr.cycles = 4; + InstrTable[0x94] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_TAX; + instr.cycles = 2; + InstrTable[0xAA] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_TAY; + instr.cycles = 2; + InstrTable[0xA8] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_TSX; + instr.cycles = 2; + InstrTable[0xBA] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_TXA; + instr.cycles = 2; + InstrTable[0x8A] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_TXS; + instr.cycles = 2; + InstrTable[0x9A] = instr; + + instr.addr = &mos6502::Addr_IMP; + instr.code = &mos6502::Op_TYA; + instr.cycles = 2; + InstrTable[0x98] = instr; + + return; +} + +uint16_t mos6502::Addr_ACC() +{ + return 0; // not used +} + +uint16_t mos6502::Addr_IMM() +{ + return pc++; +} + +uint16_t mos6502::Addr_ABS() +{ + uint16_t addrL; + uint16_t addrH; + uint16_t addr; + + addrL = Read(pc++); + addrH = Read(pc++); + + addr = addrL + (addrH << 8); + + return addr; +} + +uint16_t mos6502::Addr_ZER() +{ + return Read(pc++); +} + +uint16_t mos6502::Addr_IMP() +{ + return 0; // not used +} + +uint16_t mos6502::Addr_REL() +{ + uint16_t offset; + uint16_t addr; + + offset = (uint16_t)Read(pc++); + if (offset & 0x80) offset |= 0xFF00; + addr = pc + (int16_t)offset; + return addr; +} + +uint16_t mos6502::Addr_ABI() +{ + uint16_t addrL; + uint16_t addrH; + uint16_t effL; + uint16_t effH; + uint16_t abs; + uint16_t addr; + + addrL = Read(pc++); + addrH = Read(pc++); + + abs = (addrH << 8) | addrL; + + effL = Read(abs); + +#ifndef CMOS_INDIRECT_JMP_FIX + effH = Read((abs & 0xFF00) + ((abs + 1) & 0x00FF) ); +#else + effH = Read(abs + 1); +#endif + + addr = effL + 0x100 * effH; + + return addr; +} + +uint16_t mos6502::Addr_ZEX() +{ + uint16_t addr = (Read(pc++) + X) % 256; + return addr; +} + +uint16_t mos6502::Addr_ZEY() +{ + uint16_t addr = (Read(pc++) + Y) % 256; + return addr; +} + +uint16_t mos6502::Addr_ABX() +{ + uint16_t addr; + uint16_t addrL; + uint16_t addrH; + + addrL = Read(pc++); + addrH = Read(pc++); + + addr = addrL + (addrH << 8) + X; + return addr; +} + +uint16_t mos6502::Addr_ABY() +{ + uint16_t addr; + uint16_t addrL; + uint16_t addrH; + + addrL = Read(pc++); + addrH = Read(pc++); + + addr = addrL + (addrH << 8) + Y; + return addr; +} + + +uint16_t mos6502::Addr_INX() +{ + uint16_t zeroL; + uint16_t zeroH; + uint16_t addr; + + zeroL = (Read(pc++) + X) % 256; + zeroH = (zeroL + 1) % 256; + addr = Read(zeroL) + (Read(zeroH) << 8); + + return addr; +} + +uint16_t mos6502::Addr_INY() +{ + uint16_t zeroL; + uint16_t zeroH; + uint16_t addr; + + zeroL = Read(pc++); + zeroH = (zeroL + 1) % 256; + addr = Read(zeroL) + (Read(zeroH) << 8) + Y; + + return addr; +} + +void mos6502::Reset() +{ + A = 0x00; + Y = 0x00; + X = 0x00; + + pc = (Read(rstVectorH) << 8) + Read(rstVectorL); // load PC from reset vector + + sp = 0xFD; + + status |= CONSTANT; + + illegalOpcode = false; + + return; +} + +void mos6502::StackPush(uint8_t byte) +{ + Write(0x0100 + sp, byte); + if(sp == 0x00) sp = 0xFF; + else sp--; +} + +uint8_t mos6502::StackPop() +{ + if(sp == 0xFF) sp = 0x00; + else sp++; + return Read(0x0100 + sp); +} + +int mos6502::IRQ() +{ + int retval = 0; + if(!IF_INTERRUPT()) + { + SET_BREAK(0); + StackPush((pc >> 8) & 0xFF); + StackPush(pc & 0xFF); + StackPush(status); + SET_INTERRUPT(1); + pc = (Read(irqVectorH) << 8) + Read(irqVectorL); + retval = 1; + } + return retval; +} + +void mos6502::NMI() +{ + SET_BREAK(0); + StackPush((pc >> 8) & 0xFF); + StackPush(pc & 0xFF); + StackPush(status); + SET_INTERRUPT(1); + pc = (Read(nmiVectorH) << 8) + Read(nmiVectorL); + return; +} + +uint64_t mos6502::Run( + int32_t cyclesRemaining, + CycleMethod cycleMethod +) { + uint8_t opcode; + Instr instr; + uint64_t cycleCount=0; + + while(cyclesRemaining > 0 && !illegalOpcode) + { + // fetch + opcode = Read(pc++); + + // decode + instr = InstrTable[opcode]; + + // execute + Exec(instr); + cycleCount += instr.cycles; + cyclesRemaining -= + cycleMethod == CYCLE_COUNT ? instr.cycles + /* cycleMethod == INST_COUNT */ : 1; + } + return cycleCount; +} + +void mos6502::Exec(Instr i) +{ + uint16_t src = (this->*i.addr)(); + (this->*i.code)(src); +} + +void mos6502::Op_ILLEGAL(uint16_t src) +{ + illegalOpcode = true; +} + + +void mos6502::Op_ADC(uint16_t src) +{ + uint8_t m = Read(src); + unsigned int tmp = m + A + (IF_CARRY() ? 1 : 0); + SET_ZERO(!(tmp & 0xFF)); + if (IF_DECIMAL()) + { + if (((A & 0xF) + (m & 0xF) + (IF_CARRY() ? 1 : 0)) > 9) tmp += 6; + SET_NEGATIVE(tmp & 0x80); + SET_OVERFLOW(!((A ^ m) & 0x80) && ((A ^ tmp) & 0x80)); + if (tmp > 0x99) + { + tmp += 96; + } + SET_CARRY(tmp > 0x99); + } + else + { + SET_NEGATIVE(tmp & 0x80); + SET_OVERFLOW(!((A ^ m) & 0x80) && ((A ^ tmp) & 0x80)); + SET_CARRY(tmp > 0xFF); + } + + A = tmp & 0xFF; + return; +} + + + +void mos6502::Op_AND(uint16_t src) +{ + uint8_t m = Read(src); + uint8_t res = m & A; + SET_NEGATIVE(res & 0x80); + SET_ZERO(!res); + A = res; + return; +} + + +void mos6502::Op_ASL(uint16_t src) +{ + uint8_t m = Read(src); + SET_CARRY(m & 0x80); + m <<= 1; + m &= 0xFF; + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + Write(src, m); + return; +} + +void mos6502::Op_ASL_ACC(uint16_t src) +{ + uint8_t m = A; + SET_CARRY(m & 0x80); + m <<= 1; + m &= 0xFF; + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + A = m; + return; +} + +void mos6502::Op_BCC(uint16_t src) +{ + if (!IF_CARRY()) + { + pc = src; + } + return; +} + + +void mos6502::Op_BCS(uint16_t src) +{ + if (IF_CARRY()) + { + pc = src; + } + return; +} + +void mos6502::Op_BEQ(uint16_t src) +{ + if (IF_ZERO()) + { + pc = src; + } + return; +} + +void mos6502::Op_BIT(uint16_t src) +{ + uint8_t m = Read(src); + uint8_t res = m & A; + SET_NEGATIVE(res & 0x80); + status = (status & 0x3F) | (uint8_t)(m & 0xC0); + SET_ZERO(!res); + return; +} + +void mos6502::Op_BMI(uint16_t src) +{ + if (IF_NEGATIVE()) + { + pc = src; + } + return; +} + +void mos6502::Op_BNE(uint16_t src) +{ + if (!IF_ZERO()) + { + pc = src; + } + return; +} + +void mos6502::Op_BPL(uint16_t src) +{ + if (!IF_NEGATIVE()) + { + pc = src; + } + return; +} + +void mos6502::Op_BRK(uint16_t src) +{ + pc++; + StackPush((pc >> 8) & 0xFF); + StackPush(pc & 0xFF); + StackPush(status | BREAK); + SET_INTERRUPT(1); + pc = (Read(irqVectorH) << 8) + Read(irqVectorL); + return; +} + +void mos6502::Op_BVC(uint16_t src) +{ + if (!IF_OVERFLOW()) + { + pc = src; + } + return; +} + +void mos6502::Op_BVS(uint16_t src) +{ + if (IF_OVERFLOW()) + { + pc = src; + } + return; +} + +void mos6502::Op_CLC(uint16_t src) +{ + SET_CARRY(0); + return; +} + +void mos6502::Op_CLD(uint16_t src) +{ + SET_DECIMAL(0); + return; +} + +void mos6502::Op_CLI(uint16_t src) +{ + SET_INTERRUPT(0); + return; +} + +void mos6502::Op_CLV(uint16_t src) +{ + SET_OVERFLOW(0); + return; +} + +void mos6502::Op_CMP(uint16_t src) +{ + unsigned int tmp = A - Read(src); + SET_CARRY(tmp < 0x100); + SET_NEGATIVE(tmp & 0x80); + SET_ZERO(!(tmp & 0xFF)); + return; +} + +void mos6502::Op_CPX(uint16_t src) +{ + unsigned int tmp = X - Read(src); + SET_CARRY(tmp < 0x100); + SET_NEGATIVE(tmp & 0x80); + SET_ZERO(!(tmp & 0xFF)); + return; +} + +void mos6502::Op_CPY(uint16_t src) +{ + unsigned int tmp = Y - Read(src); + SET_CARRY(tmp < 0x100); + SET_NEGATIVE(tmp & 0x80); + SET_ZERO(!(tmp & 0xFF)); + return; +} + +void mos6502::Op_DEC(uint16_t src) +{ + uint8_t m = Read(src); + m = (m - 1) % 256; + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + Write(src, m); + return; +} + +void mos6502::Op_DEX(uint16_t src) +{ + uint8_t m = X; + m = (m - 1) % 256; + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + X = m; + return; +} + +void mos6502::Op_DEY(uint16_t src) +{ + uint8_t m = Y; + m = (m - 1) % 256; + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + Y = m; + return; +} + +void mos6502::Op_EOR(uint16_t src) +{ + uint8_t m = Read(src); + m = A ^ m; + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + A = m; +} + +void mos6502::Op_INC(uint16_t src) +{ + uint8_t m = Read(src); + m = (m + 1) % 256; + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + Write(src, m); +} + +void mos6502::Op_INX(uint16_t src) +{ + uint8_t m = X; + m = (m + 1) % 256; + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + X = m; +} + +void mos6502::Op_INY(uint16_t src) +{ + uint8_t m = Y; + m = (m + 1) % 256; + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + Y = m; +} + +void mos6502::Op_JMP(uint16_t src) +{ + pc = src; +} + +void mos6502::Op_JSR(uint16_t src) +{ + pc--; + StackPush((pc >> 8) & 0xFF); + StackPush(pc & 0xFF); + pc = src; +} + +void mos6502::Op_LDA(uint16_t src) +{ + uint8_t m = Read(src); + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + A = m; +} + +void mos6502::Op_LDX(uint16_t src) +{ + uint8_t m = Read(src); + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + X = m; +} + +void mos6502::Op_LDY(uint16_t src) +{ + uint8_t m = Read(src); + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + Y = m; +} + +void mos6502::Op_LSR(uint16_t src) +{ + uint8_t m = Read(src); + SET_CARRY(m & 0x01); + m >>= 1; + SET_NEGATIVE(0); + SET_ZERO(!m); + Write(src, m); +} + +void mos6502::Op_LSR_ACC(uint16_t src) +{ + uint8_t m = A; + SET_CARRY(m & 0x01); + m >>= 1; + SET_NEGATIVE(0); + SET_ZERO(!m); + A = m; +} + +void mos6502::Op_NOP(uint16_t src) +{ + return; +} + +void mos6502::Op_ORA(uint16_t src) +{ + uint8_t m = Read(src); + m = A | m; + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + A = m; +} + +void mos6502::Op_PHA(uint16_t src) +{ + StackPush(A); + return; +} + +void mos6502::Op_PHP(uint16_t src) +{ + StackPush(status | BREAK); + return; +} + +void mos6502::Op_PLA(uint16_t src) +{ + A = StackPop(); + SET_NEGATIVE(A & 0x80); + SET_ZERO(!A); + return; +} + +void mos6502::Op_PLP(uint16_t src) +{ + status = StackPop(); + SET_CONSTANT(1); + return; +} + +void mos6502::Op_ROL(uint16_t src) +{ + uint16_t m = Read(src); + m <<= 1; + if (IF_CARRY()) m |= 0x01; + SET_CARRY(m > 0xFF); + m &= 0xFF; + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + Write(src, m); + return; +} + +void mos6502::Op_ROL_ACC(uint16_t src) +{ + uint16_t m = A; + m <<= 1; + if (IF_CARRY()) m |= 0x01; + SET_CARRY(m > 0xFF); + m &= 0xFF; + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + A = m; + return; +} + +void mos6502::Op_ROR(uint16_t src) +{ + uint16_t m = Read(src); + if (IF_CARRY()) m |= 0x100; + SET_CARRY(m & 0x01); + m >>= 1; + m &= 0xFF; + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + Write(src, m); + return; +} + +void mos6502::Op_ROR_ACC(uint16_t src) +{ + uint16_t m = A; + if (IF_CARRY()) m |= 0x100; + SET_CARRY(m & 0x01); + m >>= 1; + m &= 0xFF; + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + A = m; + return; +} + +void mos6502::Op_RTI(uint16_t src) +{ + uint8_t lo, hi; + + status = StackPop(); + + lo = StackPop(); + hi = StackPop(); + + pc = (hi << 8) | lo; + return; +} + +void mos6502::Op_RTS(uint16_t src) +{ + uint8_t lo, hi; + + lo = StackPop(); + hi = StackPop(); + + pc = ((hi << 8) | lo) + 1; + return; +} + +void mos6502::Op_SBC(uint16_t src) +{ + uint8_t m = Read(src); + unsigned int tmp = A - m - (IF_CARRY() ? 0 : 1); + SET_NEGATIVE(tmp & 0x80); + SET_ZERO(!(tmp & 0xFF)); + SET_OVERFLOW(((A ^ tmp) & 0x80) && ((A ^ m) & 0x80)); + + if (IF_DECIMAL()) + { + if ( ((A & 0x0F) - (IF_CARRY() ? 0 : 1)) < (m & 0x0F)) tmp -= 6; + if (tmp > 0x99) + { + tmp -= 0x60; + } + } + SET_CARRY(tmp < 0x100); + A = (tmp & 0xFF); + return; +} + +void mos6502::Op_SEC(uint16_t src) +{ + SET_CARRY(1); + return; +} + +void mos6502::Op_SED(uint16_t src) +{ + SET_DECIMAL(1); + return; +} + +void mos6502::Op_SEI(uint16_t src) +{ + SET_INTERRUPT(1); + return; +} + +void mos6502::Op_STA(uint16_t src) +{ + Write(src, A); + return; +} + +void mos6502::Op_STX(uint16_t src) +{ + Write(src, X); + return; +} + +void mos6502::Op_STY(uint16_t src) +{ + Write(src, Y); + return; +} + +void mos6502::Op_TAX(uint16_t src) +{ + uint8_t m = A; + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + X = m; + return; +} + +void mos6502::Op_TAY(uint16_t src) +{ + uint8_t m = A; + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + Y = m; + return; +} + +void mos6502::Op_TSX(uint16_t src) +{ + uint8_t m = sp; + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + X = m; + return; +} + +void mos6502::Op_TXA(uint16_t src) +{ + uint8_t m = X; + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + A = m; + return; +} + +void mos6502::Op_TXS(uint16_t src) +{ + sp = X; + return; +} + +void mos6502::Op_TYA(uint16_t src) +{ + uint8_t m = Y; + SET_NEGATIVE(m & 0x80); + SET_ZERO(!m); + A = m; + return; +} diff --git a/MCUME_pico/pico20/mos6502.h b/MCUME_pico/pico20/mos6502.h new file mode 100644 index 0000000..392d173 --- /dev/null +++ b/MCUME_pico/pico20/mos6502.h @@ -0,0 +1,192 @@ +#ifndef _H_MOS6502 +#define _H_MOS6502 + +//============================================================================ +// Name : mos6502 +// Author : Gianluca Ghettini +// Version : 1.0 +// Copyright : +// Description : A MOS 6502 CPU emulator written in C++ +//============================================================================ + +#include + +#define NEGATIVE 0x80 +#define OVERFLOW 0x40 +#define CONSTANT 0x20 +#define BREAK 0x10 +#define DECIMAL 0x08 +#define INTERRUPT 0x04 +#define ZERO 0x02 +#define CARRY 0x01 + +#define SET_NEGATIVE(x) (x ? (status |= NEGATIVE) : (status &= (~NEGATIVE)) ) +#define SET_OVERFLOW(x) (x ? (status |= OVERFLOW) : (status &= (~OVERFLOW)) ) +#define SET_CONSTANT(x) (x ? (status |= CONSTANT) : (status &= (~CONSTANT)) ) +#define SET_BREAK(x) (x ? (status |= BREAK) : (status &= (~BREAK)) ) +#define SET_DECIMAL(x) (x ? (status |= DECIMAL) : (status &= (~DECIMAL)) ) +#define SET_INTERRUPT(x) (x ? (status |= INTERRUPT) : (status &= (~INTERRUPT)) ) +#define SET_ZERO(x) (x ? (status |= ZERO) : (status &= (~ZERO)) ) +#define SET_CARRY(x) (x ? (status |= CARRY) : (status &= (~CARRY)) ) + +#define IF_NEGATIVE() ((status & NEGATIVE) ? true : false) +#define IF_OVERFLOW() ((status & OVERFLOW) ? true : false) +#define IF_CONSTANT() ((status & CONSTANT) ? true : false) +#define IF_BREAK() ((status & BREAK) ? true : false) +#define IF_DECIMAL() ((status & DECIMAL) ? true : false) +#define IF_INTERRUPT() ((status & INTERRUPT) ? true : false) +#define IF_ZERO() ((status & ZERO) ? true : false) +#define IF_CARRY() ((status & CARRY) ? true : false) + + + +class mos6502 +{ +private: + // registers + uint8_t A; // accumulator + uint8_t X; // X-index + uint8_t Y; // Y-index + + // stack pointer + uint8_t sp; + + // program counter + uint16_t pc; + + // status register + uint8_t status; + + typedef void (mos6502::*CodeExec)(uint16_t); + typedef uint16_t (mos6502::*AddrExec)(); + + struct Instr + { + AddrExec addr; + CodeExec code; + uint8_t cycles; + }; + + Instr InstrTable[256]; + + void Exec(Instr i); + + bool illegalOpcode; + + // addressing modes + uint16_t Addr_ACC(); // ACCUMULATOR + uint16_t Addr_IMM(); // IMMEDIATE + uint16_t Addr_ABS(); // ABSOLUTE + uint16_t Addr_ZER(); // ZERO PAGE + uint16_t Addr_ZEX(); // INDEXED-X ZERO PAGE + uint16_t Addr_ZEY(); // INDEXED-Y ZERO PAGE + uint16_t Addr_ABX(); // INDEXED-X ABSOLUTE + uint16_t Addr_ABY(); // INDEXED-Y ABSOLUTE + uint16_t Addr_IMP(); // IMPLIED + uint16_t Addr_REL(); // RELATIVE + uint16_t Addr_INX(); // INDEXED-X INDIRECT + uint16_t Addr_INY(); // INDEXED-Y INDIRECT + uint16_t Addr_ABI(); // ABSOLUTE INDIRECT + + // opcodes (grouped as per datasheet) + void Op_ADC(uint16_t src); + void Op_AND(uint16_t src); + void Op_ASL(uint16_t src); void Op_ASL_ACC(uint16_t src); + void Op_BCC(uint16_t src); + void Op_BCS(uint16_t src); + + void Op_BEQ(uint16_t src); + void Op_BIT(uint16_t src); + void Op_BMI(uint16_t src); + void Op_BNE(uint16_t src); + void Op_BPL(uint16_t src); + + void Op_BRK(uint16_t src); + void Op_BVC(uint16_t src); + void Op_BVS(uint16_t src); + void Op_CLC(uint16_t src); + void Op_CLD(uint16_t src); + + void Op_CLI(uint16_t src); + void Op_CLV(uint16_t src); + void Op_CMP(uint16_t src); + void Op_CPX(uint16_t src); + void Op_CPY(uint16_t src); + + void Op_DEC(uint16_t src); + void Op_DEX(uint16_t src); + void Op_DEY(uint16_t src); + void Op_EOR(uint16_t src); + void Op_INC(uint16_t src); + + void Op_INX(uint16_t src); + void Op_INY(uint16_t src); + void Op_JMP(uint16_t src); + void Op_JSR(uint16_t src); + void Op_LDA(uint16_t src); + + void Op_LDX(uint16_t src); + void Op_LDY(uint16_t src); + void Op_LSR(uint16_t src); void Op_LSR_ACC(uint16_t src); + void Op_NOP(uint16_t src); + void Op_ORA(uint16_t src); + + void Op_PHA(uint16_t src); + void Op_PHP(uint16_t src); + void Op_PLA(uint16_t src); + void Op_PLP(uint16_t src); + void Op_ROL(uint16_t src); void Op_ROL_ACC(uint16_t src); + + void Op_ROR(uint16_t src); void Op_ROR_ACC(uint16_t src); + void Op_RTI(uint16_t src); + void Op_RTS(uint16_t src); + void Op_SBC(uint16_t src); + void Op_SEC(uint16_t src); + void Op_SED(uint16_t src); + + void Op_SEI(uint16_t src); + void Op_STA(uint16_t src); + void Op_STX(uint16_t src); + void Op_STY(uint16_t src); + void Op_TAX(uint16_t src); + + void Op_TAY(uint16_t src); + void Op_TSX(uint16_t src); + void Op_TXA(uint16_t src); + void Op_TXS(uint16_t src); + void Op_TYA(uint16_t src); + + void Op_ILLEGAL(uint16_t src); + + // IRQ, reset, NMI vectors + static const uint16_t irqVectorH = 0xFFFF; + static const uint16_t irqVectorL = 0xFFFE; + static const uint16_t rstVectorH = 0xFFFD; + static const uint16_t rstVectorL = 0xFFFC; + static const uint16_t nmiVectorH = 0xFFFB; + static const uint16_t nmiVectorL = 0xFFFA; + + // read/write callbacks + //typedef void (*BusWrite)(uint16_t, uint8_t); + //typedef uint8_t (*BusRead)(uint16_t); + //BusRead Read; + //BusWrite Write; + + // stack operations + inline void StackPush(uint8_t byte); + inline uint8_t StackPop(); + +public: + enum CycleMethod { + INST_COUNT, + CYCLE_COUNT, + }; + mos6502(); + void NMI(); + int IRQ(); + void Reset(); + uint64_t Run( + int32_t cycles, + CycleMethod cycleMethod = CYCLE_COUNT); +}; +#endif \ No newline at end of file diff --git a/MCUME_pico/pico20/pico20.cpp b/MCUME_pico/pico20/pico20.cpp new file mode 100644 index 0000000..534aa65 --- /dev/null +++ b/MCUME_pico/pico20/pico20.cpp @@ -0,0 +1,186 @@ +#include "pico.h" +#include "pico/stdlib.h" + +extern "C" { + #include "iopins.h" + #include "emuapi.h" +} +#include "keyboard_osd.h" +#include "v20.h" + +#include + +#ifdef USE_VGA +#include "vga_t_dma.h" +#else +#include "tft_t_dma.h" +#endif +volatile bool vbl=true; + +bool repeating_timer_callback(struct repeating_timer *t) { + uint16_t bClick = emu_DebounceLocalKeys(); + emu_Input(bClick); + if (vbl) { + vbl = false; + } else { + vbl = true; + } + return true; +} +TFT_T_DMA tft; + +static int skip=0; + + +#include "hardware/clocks.h" +#include "hardware/vreg.h" + +int main(void) { + vreg_set_voltage(VREG_VOLTAGE_1_05); +// set_sys_clock_khz(125000, true); +// set_sys_clock_khz(150000, true); +// set_sys_clock_khz(133000, true); +// set_sys_clock_khz(200000, true); +// set_sys_clock_khz(225000, true); + set_sys_clock_khz(250000, true); + stdio_init_all(); +#ifdef USE_VGA +// tft.begin(VGA_MODE_400x240); + tft.begin(VGA_MODE_320x240); +#else + tft.begin(); +#endif + emu_init(); + while (true) { + if (menuActive()) { + uint16_t bClick = emu_DebounceLocalKeys(); + int action = handleMenu(bClick); + char * filename = menuSelection(); + if (action == ACTION_RUNTFT) { + toggleMenu(false); + emu_start(); + emu_Init(filename); + tft.fillScreenNoDma( RGBVAL16(0x00,0x00,0x00) ); + tft.startDMA(); + struct repeating_timer timer; + add_repeating_timer_ms(15, repeating_timer_callback, NULL, &timer); + } + tft.waitSync(); + } + else { + //uint16_t bClick = emu_DebounceLocalKeys(); + //emu_Input(bClick); + emu_Step(); + } + + //int c = getchar_timeout_us(0); + //switch (c) { + // case ' ': + // printf("test: %d\n", 1); + // break; + //} + } +} + +static unsigned char palette8[PALETTE_SIZE]; +static unsigned short palette16[PALETTE_SIZE]; + +void emu_SetPaletteEntry(unsigned char r, unsigned char g, unsigned char b, int index) +{ + if (index +#include + +extern "C" { +#include "emuapi.h" +#include "platform_config.h" +} + + + + +// Vic 20 emulation includes +#include "mos6502.h" +#include "MOS6561.h" +#include "MOS6522.h" +#include "MOS6502Memory.h" +#include "kernalromp.h" +#include "charrom.h" +#include "basicrom.h" + +static mos6502 mos; +static MOS6561 mos6561; +static MOS6522 mos6522; +uint8_t vicmemory[0x10000];; + + +#define VIC20FREQBASE 65535 + +/* noise magic */ +#define NSHIFT(v, n) (((v)<<(n))|((((v)>>(23-(n)))^(v>>(18-(n))))&((1<<(n))-1))) +#define NVALUE(v) (noiseLSB[v&0xff]|noiseMID[(v>>8)&0xff]|noiseMSB[(v>>16)&0xff]) +#define NSEED 0x7ffff8 + +/* Noise tables */ +#define NOISETABLESIZE 256 +static uint8_t noiseMSB[NOISETABLESIZE]; +static uint8_t noiseMID[NOISETABLESIZE]; +static uint8_t noiseLSB[NOISETABLESIZE]; + +/* needed data for one voice */ +typedef struct voice_s +{ + /* counter value */ + int f; + /* counter step / sample */ + int fs; + /* noise shift register. Note! rv may be 0 to 15 shifts 'behind' the + real noise shift register value. Remaining shifts are done when + it is referenced */ + int rv; +} voice_t; + +/* needed data for SID */ +struct sound_s +{ + /* number of voices */ + voice_t v[4]; + /* 4-bit volume value */ + uint8_t vol; + /* internal constant used for sample rate dependent calculations */ + int speed1; +}; + +static sound_s psid; + +static void VIC_VOICE_HANDLE(int voice, int value, int shift) +{ + int div = 255 - value; + if (!div) + div = 127; + if (!(value & 0x80)) + psid.v[voice].fs = 0; + else + psid.v[voice].fs = psid.speed1*VIC20FREQBASE*(1 << shift)/div; +}; + + +void SND_Process(void * stream, int len) { + int o0, o1, o2, o3; + + short * sndbuf = (short *)stream; + for (int i = 0; i < len/2; i++) + { + /* addfptrs */ + psid.v[0].f += psid.v[0].fs; + psid.v[1].f += psid.v[1].fs; + psid.v[2].f += psid.v[2].fs; + psid.v[3].f += psid.v[3].fs; + /* noise */ + if (psid.v[3].f < psid.v[3].fs) + psid.v[3].rv = NSHIFT(psid.v[3].rv, 16); + /* voices */ + o0 = (psid.v[0].f & 0x80000000) >> 2; + o1 = (psid.v[1].f & 0x80000000) >> 2; + o2 = (psid.v[2].f & 0x80000000) >> 2; + o3 = (int)NVALUE(NSHIFT(psid.v[3].rv, psid.v[3].f >> 28)) << 22; + /* sample */ + uint16_t s = ((int)((o0+o1+o2+o3)>>20)-0x800)*psid.vol; + *sndbuf++ =s; + *sndbuf++ =s; + } +} + +static char * strext(char * filepath) { + int str_len = strlen(filepath); + for (int i=0; i ? + 0x7fef ,0xfefe ,0x7ffe ,0xfefd ,0x7ffd ,0xfefb ,0x7ffb ,0xfef7 ,0x7ff7 ,0xfeef ,0xdfdf ,0xfbbf ,0x1f7df,0xdfbf ,0x1efdf,0x1f7bf, + //@ A B C D E F G H I J K L M N O + 0xbfdf ,0xfbfd ,0xeff7 ,0xeffb ,0xfbfb ,0xbffd ,0xdffb ,0xfbf7 ,0xdff7 ,0xfdef ,0xfbef ,0xdfef ,0xfbdf ,0xefef ,0xf7ef ,0xbfef, + //P Q R S T U V W X Y Z [ \ ] ^ _ + 0xfddf ,0xbffe ,0xfdfb ,0xdffd ,0xbffb ,0xbff7 ,0xf7f7 ,0xfdfd ,0xf7fb ,0xfdf7 ,0xeffd ,0x1dfdf,0xffff ,0x1fbbf,0 ,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // ' a b c d e f g h i j k l m n o + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xfe7f,0, // p q r s t u v w x y z { | } ~ DEL + // 133:f1 f2 f3 f4 f5 f6 f7 f8 + 0,0,0,0,0,0xef7f,0x1ef7f,0xdf7f,0x1df7f,0xbf7f,0x1bf7f,0x7f7f,0x17f7f,0x00,0x00,0x00, // 128-143 + // 145:up 157:left + 0,0x1f77f,0,0,0,0,0,0,0,0,0,0,0,0x1fb7f,0,0 // 144-159 +}; + + +static int ik; +static int ihk; + +static int pik=0; + + +void v20_Input(int bClick) { + ik = emu_GetPad(); + ihk = emu_ReadI2CKeyboard(); +} + +void emu_KeyboardOnDown(int keymodifer, int key) { +} + +void emu_KeyboardOnUp(int keymodifer, int key) { +} + + +/* +uint8_t readWord( uint16_t location) { + switch (location) { + case 0x9111: + case 0x911F: + mos6522.joy1Input(); + break; + case 0x9120: + mos6522.joy2Input(); + break; + case 0x9121: + //case 0x912F: + mos6522.keyboardInput(); + break; + } + return vicmemory[location]; +} + +void writeWord( uint16_t location, uint8_t value){ + vicmemory[location] = value; +} +*/ + + +void v20_Init(void) +{ + + // Initialize emulation objects + mos.Reset(); + mos6561.initialize(); + mos6522.setCpu(&mos); + mos6522.initialize(); + + // clear memory + for(int i=0; i>(7-2))&0x04)|((i>>(4-1))&0x02)|((i>>(2-0))&0x01)); + noiseMID[i] = (((i>>(13-8-4))&0x10)|((i<<(3-(11-8)))&0x08)); + noiseMSB[i] = (((i<<(7-(22-16)))&0x80)|((i<<(6-(20-16)))&0x40) + |((i<<(5-(16-16)))&0x20)); + } + emu_sndInit(); +#endif +} + + + +void v20_Start(char * filename) +{ + loadROM(filename,0); + + // Reset cpu + mos.Reset(); + + // Execute boot sequence before doing much else + mos.Run(20000); +} + +void v20_Step(void) +{ + do { + // bind emulation to clock speed + + // Cpu clock is four times less than 6561 clock + //int cpuCycles = mos.executeInstruction(); + uint64_t cpuCycles = mos.Run(1); + mos6561.tick(1); + mos6522.tick(); + //mos6522.tick(); + + /* + uint64_t cpuCycles = mos.Run(mos6561.cyclesPerScanline); + mos6561.tick(mos6561.cyclesPerScanline); + mos6522.tick(); + mos6522.tick(); + mos6522.tick(); + mos6522.tick(); + mos6522.tick(); + mos6522.tick(); + */ + + /* + // printf("cycles %d\n", cpuCycles); + while (cpuCycles) { + cpuCycles--; + mos6522.tick(); + mos6522.tick(); + } + */ + + } while ((!mos6561.isFrameReady())); + + // Swap buffers if frame ready + if (mos6561.isFrameReady()) { + mos6561.renderFrame(); + } + + // Top basic + // Unexpanded + //vicmemory[55] = 0; + //vicmemory[56] = 0x1E; + // +3k + //vicmemory[55] = 0; + //vicmemory[56] = 0x1E; + // +8k + //vicmemory[55] = 0; + //vicmemory[56] = 0x40; + // +16k + //vicmemory[55] = 0; + //vicmemory[56] = 0x60; + // +24k + //vicmemory[55] = 0; + //vicmemory[56] = 0x80; + // Bottom basic ??? + //vicmemory[51] = 0; + //vicmemory[52] = 0x1E; + + emu_DrawVsync(); + + int hk=ihk; + +#ifdef PICOMPUTER + if (hk) { + int scan = ascii2scan[ihk]; + if (scan & 0x10000) mos6522.setShiftPressed(true); + else mos6522.setShiftPressed(false); + mos6522.setKeyPressed(scan & 0xffff); + } + else { + mos6522.setShiftPressed(false); + mos6522.setKeyPressed(0); + } +#endif + + + int k=ik; +#ifdef PICOMPUTER + // Ignore joypad if shift is pressed!!! + if ( !(k & MASK_KEY_USER2) ) +#endif + { + if ( !(pik & MASK_JOY2_BTN) && (k & MASK_JOY2_BTN) ) { + mos6522.setJoyStickPressed(MOS6522::Vic20JoyStickButton::Fire, true); + } + else if ( (pik & MASK_JOY2_BTN) && !(k & MASK_JOY2_BTN) ) { + mos6522.setJoyStickPressed(MOS6522::Vic20JoyStickButton::Fire, false); + } + if ( !(pik & MASK_JOY2_UP) && (k & MASK_JOY2_UP) ) { + mos6522.setJoyStickPressed(MOS6522::Vic20JoyStickButton::Up, true); + } + else if ( (pik & MASK_JOY2_UP) && !(k & MASK_JOY2_UP) ) { + mos6522.setJoyStickPressed(MOS6522::Vic20JoyStickButton::Up, false); + } + if ( !(pik & MASK_JOY2_DOWN) && (k & MASK_JOY2_DOWN) ) { + mos6522.setJoyStickPressed(MOS6522::Vic20JoyStickButton::Down, true); + } + else if ( (pik & MASK_JOY2_DOWN) && !(k & MASK_JOY2_DOWN) ) { + mos6522.setJoyStickPressed(MOS6522::Vic20JoyStickButton::Down, false); + } + if ( !(pik & MASK_JOY2_RIGHT) && (k & MASK_JOY2_RIGHT) ) { + mos6522.setJoyStickPressed(MOS6522::Vic20JoyStickButton::Left, true); + } + else if ( (pik & MASK_JOY2_RIGHT) && !(k & MASK_JOY2_RIGHT) ) { + mos6522.setJoyStickPressed(MOS6522::Vic20JoyStickButton::Left, false); + } + if ( !(pik & MASK_JOY2_LEFT) && (k & MASK_JOY2_LEFT) ) { + mos6522.setJoyStickPressed(MOS6522::Vic20JoyStickButton::Right, true); + } + else if ( (pik & MASK_JOY2_LEFT) && !(k & MASK_JOY2_LEFT) ) { + mos6522.setJoyStickPressed(MOS6522::Vic20JoyStickButton::Right, false); + } + } + +#ifndef PICOMPUTER + if ( !(pik & MASK_KEY_USER1) && (k & MASK_KEY_USER1) ) { + mos6522.setKeyPressed(0xEF7F); + mos6522.setShiftPressed(true); + } + else if ( (pik & MASK_KEY_USER1) && !(k & MASK_KEY_USER1) ) { + mos6522.setShiftPressed(false); + mos6522.setKeyPressed(0); + } + + if ( !(pik & MASK_KEY_USER2) && (k & MASK_KEY_USER2) ) { + mos6522.setShiftPressed(false); + mos6522.setKeyPressed(ascii2scan['1']); + } + else if ( (pik & MASK_KEY_USER2) && !(k & MASK_KEY_USER2) ) { + mos6522.setShiftPressed(false); + mos6522.setKeyPressed(0); + } +#endif + pik = k; + + + VIC_VOICE_HANDLE(0, vicmemory[mos6561.Audio1Register], 0); + VIC_VOICE_HANDLE(1, vicmemory[mos6561.Audio2Register], 1); + VIC_VOICE_HANDLE(2, vicmemory[mos6561.Audio3Register], 2); + VIC_VOICE_HANDLE(3, vicmemory[mos6561.Audio4Register], 0); + int vol = (vicmemory[mos6561.AudioVolRegister] & 0x0f); + psid.vol = vol; +} + + + diff --git a/MCUME_pico/pico20/v20.h b/MCUME_pico/pico20/v20.h new file mode 100644 index 0000000..e0af4cf --- /dev/null +++ b/MCUME_pico/pico20/v20.h @@ -0,0 +1,5 @@ +extern void v20_Init(void); +extern void v20_Step(void); +extern void v20_Start(char * filename); +extern void v20_Input(int key); +