Hardware components | ||||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
Software apps and online services | ||||||
|
This is the Z80-MBC (Mobile Breadboard Computer), a mini 4MHz Z80 64kB RAM system with a Basic interpreter and that can be easily expanded. It has an "Arduino heart" using an Atmega32A as an "universal" I/O emulator. And can be used and powered with a tablet or smart phone too.
DetailsDuring some surfing on Ebay I realized that with 4$ it is possible to buy enough ICs to build a complete Z80 system that can be done using a breadboard. So I did it and here it is the story!
Here is a video with the Z80-MBC in action:
And here with a smart phone (so it is explained the word "Mobile" in his name) with a common OTG cable (the various test clips in this video were used for some measurements with a Logic Analyzer):
The needed ICs are:- Z80 CPU CMOS (Z84C00) 4Mhz or greater $1.16
- Atmega32A $1.70
- TC551001-70 (128kB RAM) $1.10
- 74HC00 $0.25
Total cost: $4.21
The wires were taken from salvaged broken LAN cables, and the other components were salvaged from other unused breadboards.
The schematic is attached in the Files section. The MCU Atmega32A is used as universal I/O subsystem, as Eeprom, and as reset and 4MHz clock generator for the Z80 CPU. Into the Atmega32A it is flashed an Arduino bootloader taken from here, and it is possible to use the Board Manager of the Arduino IDE for that.
Flash the Arduino bootloader at first (with the method you prefer), next you can start to build the whole thing!
Of course I used the Arduino IDE to develop the I/O Subsytem that interacts with the Z80 bus and "virtualizes" the peripherals seen by the Z80 CPU. As oscillator the internal 8MHz Atmega32A oscillator is used, so no quartz is needed, and from this one is derived the 4MHz clock for the Z80 CPU (so the "Internal 8MHZ osc.
" bootloader variant must be chosen when flashing the bootloader from the Arduino IDE!).
The 74HC00 is mainly used as RS flipflop to stop the Z80 CPU during I/O operation, giving the needed time to the Atmega32A to interact with the Z80 bus. The 128kB RAM TC551001 is used only for half (64kB) because the Z80 address space is only 64kB (I've chosen this IC for the low cost). Note that only the CMOS version of the Z80 CPU can be used here. This because only CMOS version, under given condition that are respected in this schematic, has logical levels compatibles with Atmega32A and 74HC00.
Notes about the components:You can use any Z80 CMOS speed grade, because the lowest is 4MHz. The Atmega32A can be substituted with an Atmega16A, I've chosen the first one just to have enough space for future upgrades. The 74HC00 can be substituted with a 74HCT00 if you already have one. The RAM chip TC551001-70 can be substituted with any suitable 64kB RAM (do not use < 64kB RAM). The USER LED (D5 in the schematic) MUST be blue or white just to be sure that V (forward) is >= 3V.
Here is a video that shows a simple basic program that interacts with the "USER LED
" and "USER key
":
On the breadboard there are others status LED's: the HALT led turns on if an HALT instruction is executed and the Z80 CPU is in a Halt state, the DMA led turns on during DMA operations when the Z80 bus is in Hi-Z, the IO_OP LED turns on when the Z80 CPU is accessing a I/O virtual device "emulated" by the Atmega32A (as the serial port), the LED_D0 LED is the classical "Arduino" LED (that one connected to D13 pin on the Arduino Uno) that here is connected with the Arduino D0 pin and is turned on normally as a power on indicator.
The serial port SERIAL-USB (see schematic) can be connected with a TTL-RS232 adapter, or with a serial-USB adapter. I've used a serial-USB adapter that acts also as power source for the Z80-MBC, and has the DTR signal for the "autoreset
" driven from the Arduino IDE. For a terminal that has a serial TTL port no adapter is needed.
In the schematic there is also the IOEXP port to expand the I/O capabilities, i.e. adding GPIO ports or a RTC for future expansions.
Software overviewI've "ported" the Basic interpreter to the Z80-MBC using the sources provided in the great Grant Searle site, after the needed modification due the different HW design. In the Grant's site is requested an acknowledgement.
Files- A041116 schematic.pdf: Z80-MBC schematic
- S221116_Z80_Breadboard.ino: The sketch for the Atmega32A
/* ------------------------------------------------------------------------------
S221116 - HW ref: A041116
IOS - I/O Subsystem - for Z80-MBC (Mobile Breadboard Computer)
(Z80 64kB RAM @ 4Mhz)
Notes:
1: This SW is ONLY for the Atmega32A used as EEPROM and I/O subsystem (8MHz internal oscillator).
2: Tested on ATmega16A/Atmega32A @ Arduino IDE 1.6.5.
3: Embedded FW: S091116 Loader, S121216 uBIOS + Basic
4: Utilities: S111216 TASM conversion utility (S111216.c)
--------------------------------------------------------------------------------- */
// ------------------------------------------------------------------------------
//
// Hardware definitions (see A041116 schematic)
//
// ------------------------------------------------------------------------------
#define D0 24 // PA0 pin 40 Z80 data bus
#define D1 25 // PA1 pin 39
#define D2 26 // PA2 pin 38
#define D3 27 // PA3 pin 37
#define D4 28 // PA4 pin 36
#define D5 29 // PA5 pin 35
#define D6 30 // PA6 pin 34
#define D7 31 // PA7 pin 33
#define AD0 18 // PC2 pin 24 Z80 address bus (AD0-AD8 = A0-A8 on A04113 schematic)
#define AD1 19 // PC3 pin 25
#define AD2 20 // PC4 pin 26
#define AD3 21 // PC5 pin 27
#define AD4 22 // PC6 pin 28
#define AD5 23 // PC7 pin 29
#define AD6 10 // PD2 pin 16
#define AD7 11 // PD3 pin 17
#define AD8 12 // PD4 pin 18
#define INT_ 1 // PB1 pin 2 Z80 control bus
#define BUSACK_ 2 // PB2 pin 3
#define WAIT_ 3 // PB3 pin 4
#define WR_ 4 // PB4 pin 5
#define RD_ 5 // PB5 pin 6
#define MREQ_ 6 // PB6 pin 7
#define RESET_ 7 // PB7 pin 8
#define BUSREQ_ 14 // PD6 pin 20
#define CLK 15 // PD7 pin 21
#define SCL_PC0 16 // PC0 pin 22 IOEXP connector
#define SDA_PC1 17 // PC1 pin 23
#define LED_D0 0 // PB0 pin 1 Led LED_0 ON if HIGH
#define WAIT_RES_ 0 // PB0 pin 1 Internal control line
#define USER 13 // PD5 pin 19 Led USER and key
// ------------------------------------------------------------------------------
//
// Libraries
//
// ------------------------------------------------------------------------------
#include <avr/pgmspace.h> // needed for PROGMEM
// ------------------------------------------------------------------------------
//
// Constants
//
// ------------------------------------------------------------------------------
const byte debugLev = 0; // Set the level of debug (0 = no debug, 1 = only phase 1 boot,
// 2 = 1 + phase 2 boot + runtime I/O)
const word bootPhase1StrAddr = 0x0000; // Phase 1 payload image starting address
const byte bootPhase1[] PROGMEM = { // Phase 1 payload image (S091116 Loader)
0xC3, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x15, 0x00, 0x11, 0x00, 0xFC, 0x01, 0x24, 0x00,
0xED, 0xB0, 0xC3, 0x00, 0xFC, 0xED, 0x5B, 0x05, 0x00, 0x2A, 0x03, 0x00, 0xDD, 0x2A, 0x03, 0x00,
0x0E, 0x02, 0x06, 0x00, 0x7A, 0xB7, 0xCA, 0x1A, 0xFC, 0xED, 0xB2, 0x3D, 0xC3, 0x11, 0xFC, 0x7B,
0xB7, 0xCA, 0x22, 0xFC, 0x43, 0xED, 0xB2, 0xDD, 0xE9
};
const word bootPhase2StrAddr = 0x0000; // Phase 2 payload image starting address
const byte bootPhase2[] PROGMEM = { // Phase 2 payload image (S121216 uBIOS + Basic)
0xF3, 0xC3, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x91, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xC3, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0xF5, 0xE5, 0xDB, 0x01, 0xF5, 0x3A,
0x43, 0x20, 0xFE, 0x3F, 0x20, 0x03, 0xF1, 0x18, 0x1C, 0x2A, 0x3F, 0x20, 0x23, 0x7D, 0xFE, 0x3F,
0x20, 0x03, 0x21, 0x00, 0x20, 0x22, 0x3F, 0x20, 0xF1, 0x77, 0x3A, 0x43, 0x20, 0x3C, 0x32, 0x43,
0x20, 0xFE, 0x30, 0x38, 0x00, 0xE1, 0xF1, 0xFB, 0xED, 0x4D, 0x3A, 0x43, 0x20, 0xFE, 0x00, 0x28,
0xF9, 0xE5, 0x2A, 0x41, 0x20, 0x23, 0x7D, 0xFE, 0x3F, 0x20, 0x03, 0x21, 0x00, 0x20, 0xF3, 0x22,
0x41, 0x20, 0x3A, 0x43, 0x20, 0x3D, 0x32, 0x43, 0x20, 0xFE, 0x05, 0x30, 0x00, 0x7E, 0xFB, 0xE1,
0xC9, 0xF5, 0xF1, 0xD3, 0x01, 0xC9, 0x3A, 0x43, 0x20, 0xFE, 0x00, 0xC9, 0x7E, 0xB7, 0xC8, 0xCF,
0x23, 0x18, 0xF9, 0xC9, 0x21, 0xED, 0x20, 0xF9, 0x21, 0x00, 0x20, 0x22, 0x3F, 0x20, 0x22, 0x41,
0x20, 0xAF, 0x32, 0x43, 0x20, 0xED, 0x56, 0xFB, 0x21, 0xF1, 0x00, 0xCD, 0x9C, 0x00, 0x3A, 0x44,
0x20, 0xFE, 0x59, 0x20, 0x16, 0x21, 0x2A, 0x01, 0xCD, 0x9C, 0x00, 0xCD, 0x6A, 0x00, 0xE6, 0xDF,
0xFE, 0x43, 0x20, 0x0F, 0xCF, 0x3E, 0x0D, 0xCF, 0x3E, 0x0A, 0xCF, 0x3E, 0x59, 0x32, 0x44, 0x20,
0xC3, 0x50, 0x01, 0xFE, 0x57, 0x20, 0xE4, 0xCF, 0x3E, 0x0D, 0xCF, 0x3E, 0x0A, 0xCF, 0xC3, 0x53,
0x01, 0x75, 0x42, 0x49, 0x4F, 0x53, 0x20, 0x2D, 0x20, 0x53, 0x31, 0x32, 0x31, 0x32, 0x31, 0x36,
0x20, 0x28, 0x41, 0x64, 0x61, 0x70, 0x74, 0x65, 0x64, 0x20, 0x66, 0x72, 0x6F, 0x6D, 0x20, 0x5A,
0x38, 0x30, 0x20, 0x53, 0x42, 0x43, 0x20, 0x62, 0x79, 0x20, 0x47, 0x72, 0x61, 0x6E, 0x74, 0x20,
0x53, 0x65, 0x61, 0x72, 0x6C, 0x65, 0x29, 0x0D, 0x0A, 0x00, 0x0D, 0x0A, 0x75, 0x42, 0x49, 0x4F,
0x53, 0x3A, 0x20, 0x43, 0x6F, 0x6C, 0x64, 0x20, 0x6F, 0x72, 0x20, 0x77, 0x61, 0x72, 0x6D, 0x20,
0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x28, 0x43, 0x2F, 0x57, 0x29, 0x3F, 0x00, 0x00, 0x00, 0x00,
0xC3, 0x56, 0x01, 0xC3, 0xF4, 0x01, 0xDD, 0x21, 0x00, 0x00, 0xC3, 0x61, 0x01, 0x07, 0x0A, 0x7D,
0x11, 0x21, 0x45, 0x20, 0xF9, 0xC3, 0x9C, 0x1D, 0x11, 0x2E, 0x04, 0x06, 0x63, 0x21, 0x45, 0x20,
0x1A, 0x77, 0x23, 0x13, 0x05, 0xC2, 0x70, 0x01, 0xF9, 0xCD, 0x2F, 0x06, 0xCD, 0xFD, 0x0B, 0x32,
0xEF, 0x20, 0x32, 0x3E, 0x21, 0x21, 0x43, 0x02, 0xCD, 0x9B, 0x12, 0xCD, 0x4C, 0x06, 0xCD, 0x55,
0x09, 0xB7, 0xC2, 0xAA, 0x01, 0x21, 0xA2, 0x21, 0x23, 0x7C, 0xB5, 0xCA, 0xBC, 0x01, 0x7E, 0x47,
0x2F, 0x77, 0xBE, 0x70, 0xCA, 0x98, 0x01, 0xC3, 0xBC, 0x01, 0xCD, 0x21, 0x0A, 0xB7, 0xC2, 0xFD,
0x04, 0xEB, 0x2B, 0x3E, 0xD9, 0x46, 0x77, 0xBE, 0x70, 0xC2, 0x85, 0x01, 0x2B, 0x11, 0xA1, 0x21,
0xCD, 0xC5, 0x07, 0xDA, 0x85, 0x01, 0x11, 0xCE, 0xFF, 0x22, 0xF4, 0x20, 0x19, 0x22, 0x9F, 0x20,
0xCD, 0x0A, 0x06, 0x2A, 0x9F, 0x20, 0x11, 0xEF, 0xFF, 0x19, 0x11, 0x3E, 0x21, 0x7D, 0x93, 0x6F,
0x7C, 0x9A, 0x67, 0xE5, 0x21, 0x0C, 0x02, 0xCD, 0x9B, 0x12, 0xE1, 0xCD, 0x3E, 0x19, 0x21, 0xFD,
0x01, 0xCD, 0x9B, 0x12, 0x31, 0xAB, 0x20, 0xCD, 0x2F, 0x06, 0xC3, 0x48, 0x05, 0x20, 0x42, 0x79,
0x74, 0x65, 0x73, 0x20, 0x66, 0x72, 0x65, 0x65, 0x0D, 0x0A, 0x00, 0x00, 0x5A, 0x38, 0x30, 0x20,
0x42, 0x41, 0x53, 0x49, 0x43, 0x20, 0x56, 0x65, 0x72, 0x20, 0x34, 0x2E, 0x37, 0x62, 0x0D, 0x0A,
0x43, 0x6F, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, 0x43, 0x29, 0x20, 0x31, 0x39,
0x37, 0x38, 0x20, 0x62, 0x79, 0x20, 0x4D, 0x69, 0x63, 0x72, 0x6F, 0x73, 0x6F, 0x66, 0x74, 0x0D,
0x0A, 0x00, 0x00, 0x4D, 0x65, 0x6D, 0x6F, 0x72, 0x79, 0x20, 0x74, 0x6F, 0x70, 0x00, 0xB3, 0x17,
0x77, 0x18, 0xC9, 0x17, 0x48, 0x20, 0x5B, 0x11, 0xE0, 0x14, 0x89, 0x11, 0x3D, 0x1A, 0x1C, 0x1B,
0x58, 0x16, 0x8B, 0x1A, 0x91, 0x1B, 0x97, 0x1B, 0xF8, 0x1B, 0x0D, 0x1C, 0x34, 0x15, 0x78, 0x1C,
0x96, 0x20, 0x0D, 0x14, 0x25, 0x12, 0xA7, 0x14, 0x1C, 0x14, 0x2D, 0x14, 0x9A, 0x1C, 0x2D, 0x1D,
0x3D, 0x14, 0x6D, 0x14, 0x77, 0x14, 0xC5, 0x4E, 0x44, 0xC6, 0x4F, 0x52, 0xCE, 0x45, 0x58, 0x54,
0xC4, 0x41, 0x54, 0x41, 0xC9, 0x4E, 0x50, 0x55, 0x54, 0xC4, 0x49, 0x4D, 0xD2, 0x45, 0x41, 0x44,
0xCC, 0x45, 0x54, 0xC7, 0x4F, 0x54, 0x4F, 0xD2, 0x55, 0x4E, 0xC9, 0x46, 0xD2, 0x45, 0x53, 0x54,
0x4F, 0x52, 0x45, 0xC7, 0x4F, 0x53, 0x55, 0x42, 0xD2, 0x45, 0x54, 0x55, 0x52, 0x4E, 0xD2, 0x45,
0x4D, 0xD3, 0x54, 0x4F, 0x50, 0xCF, 0x55, 0x54, 0xCF, 0x4E, 0xCE, 0x55, 0x4C, 0x4C, 0xD7, 0x41,
0x49, 0x54, 0xC4, 0x45, 0x46, 0xD0, 0x4F, 0x4B, 0x45, 0xC4, 0x4F, 0x4B, 0x45, 0xD3, 0x43, 0x52,
0x45, 0x45, 0x4E, 0xCC, 0x49, 0x4E, 0x45, 0x53, 0xC3, 0x4C, 0x53, 0xD7, 0x49, 0x44, 0x54, 0x48,
0xCD, 0x4F, 0x4E, 0x49, 0x54, 0x4F, 0x52, 0xD3, 0x45, 0x54, 0xD2, 0x45, 0x53, 0x45, 0x54, 0xD0,
0x52, 0x49, 0x4E, 0x54, 0xC3, 0x4F, 0x4E, 0x54, 0xCC, 0x49, 0x53, 0x54, 0xC3, 0x4C, 0x45, 0x41,
0x52, 0xC3, 0x4C, 0x4F, 0x41, 0x44, 0xC3, 0x53, 0x41, 0x56, 0x45, 0xCE, 0x45, 0x57, 0xD4, 0x41,
0x42, 0x28, 0xD4, 0x4F, 0xC6, 0x4E, 0xD3, 0x50, 0x43, 0x28, 0xD4, 0x48, 0x45, 0x4E, 0xCE, 0x4F,
0x54, 0xD3, 0x54, 0x45, 0x50, 0xAB, 0xAD, 0xAA, 0xAF, 0xDE, 0xC1, 0x4E, 0x44, 0xCF, 0x52, 0xBE,
0xBD, 0xBC, 0xD3, 0x47, 0x4E, 0xC9, 0x4E, 0x54, 0xC1, 0x42, 0x53, 0xD5, 0x53, 0x52, 0xC6, 0x52,
0x45, 0xC9, 0x4E, 0x50, 0xD0, 0x4F, 0x53, 0xD3, 0x51, 0x52, 0xD2, 0x4E, 0x44, 0xCC, 0x4F, 0x47,
0xC5, 0x58, 0x50, 0xC3, 0x4F, 0x53, 0xD3, 0x49, 0x4E, 0xD4, 0x41, 0x4E, 0xC1, 0x54, 0x4E, 0xD0,
0x45, 0x45, 0x4B, 0xC4, 0x45, 0x45, 0x4B, 0xD0, 0x4F, 0x49, 0x4E, 0x54, 0xCC, 0x45, 0x4E, 0xD3,
0x54, 0x52, 0x24, 0xD6, 0x41, 0x4C, 0xC1, 0x53, 0x43, 0xC3, 0x48, 0x52, 0x24, 0xC8, 0x45, 0x58,
0x24, 0xC2, 0x49, 0x4E, 0x24, 0xCC, 0x45, 0x46, 0x54, 0x24, 0xD2, 0x49, 0x47, 0x48, 0x54, 0x24,
0xCD, 0x49, 0x44, 0x24, 0x80, 0x9F, 0x09, 0x9C, 0x08, 0x77, 0x0D, 0xEC, 0x0A, 0x7E, 0x0C, 0xB3,
0x0F, 0xAD, 0x0C, 0x03, 0x0B, 0xA9, 0x0A, 0x8C, 0x0A, 0x7B, 0x0B, 0x65, 0x09, 0x98, 0x0A, 0xC7,
0x0A, 0xEE, 0x0A, 0x9D, 0x09, 0xEC, 0x14, 0x5D, 0x0B, 0xDE, 0x09, 0xF2, 0x14, 0x91, 0x11, 0x3B,
0x15, 0x83, 0x1C, 0xEE, 0x0A, 0x69, 0x1C, 0x5C, 0x1C, 0x61, 0x1C, 0x99, 0x1D, 0x99, 0x20, 0x9C,
0x20, 0x9F, 0x0B, 0xCB, 0x09, 0x11, 0x08, 0x46, 0x0A, 0xEE, 0x0A, 0xEE, 0x0A, 0x09, 0x06, 0x79,
0x25, 0x19, 0x79, 0x59, 0x15, 0x7C, 0x97, 0x16, 0x7C, 0xF8, 0x16, 0x7F, 0x46, 0x1A, 0x50, 0x0C,
0x0F, 0x46, 0x0B, 0x0F, 0x4E, 0x46, 0x53, 0x4E, 0x52, 0x47, 0x4F, 0x44, 0x46, 0x43, 0x4F, 0x56,
0x4F, 0x4D, 0x55, 0x4C, 0x42, 0x53, 0x44, 0x44, 0x2F, 0x30, 0x49, 0x44, 0x54, 0x4D, 0x4F, 0x53,
0x4C, 0x53, 0x53, 0x54, 0x43, 0x4E, 0x55, 0x46, 0x4D, 0x4F, 0x48, 0x58, 0x42, 0x4E, 0xC3, 0xF4,
0x01, 0xC3, 0x1C, 0x0A, 0xD3, 0x00, 0xC9, 0xD6, 0x00, 0x6F, 0x7C, 0xDE, 0x00, 0x67, 0x78, 0xDE,
0x00, 0x47, 0x3E, 0x00, 0xC9, 0x00, 0x00, 0x00, 0x35, 0x4A, 0xCA, 0x99, 0x39, 0x1C, 0x76, 0x98,
0x22, 0x95, 0xB3, 0x98, 0x0A, 0xDD, 0x47, 0x98, 0x53, 0xD1, 0x99, 0x99, 0x0A, 0x1A, 0x9F, 0x98,
0x65, 0xBC, 0xCD, 0x98, 0xD6, 0x77, 0x3E, 0x98, 0x52, 0xC7, 0x4F, 0x80, 0xDB, 0x00, 0xC9, 0x01,
0xFF, 0x1C, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x42, 0x07, 0xC3,
0x00, 0x00, 0xC3, 0x00, 0x00, 0xC3, 0x00, 0x00, 0xA2, 0x21, 0xFE, 0xFF, 0x3F, 0x21, 0x20, 0x45,
0x72, 0x72, 0x6F, 0x72, 0x00, 0x20, 0x69, 0x6E, 0x20, 0x00, 0x4F, 0x6B, 0x0D, 0x0A, 0x00, 0x00,
0x42, 0x72, 0x65, 0x61, 0x6B, 0x00, 0x21, 0x04, 0x00, 0x39, 0x7E, 0x23, 0xFE, 0x81, 0xC0, 0x4E,
0x23, 0x46, 0x23, 0xE5, 0x69, 0x60, 0x7A, 0xB3, 0xEB, 0xCA, 0xC0, 0x04, 0xEB, 0xCD, 0xC5, 0x07,
0x01, 0x0D, 0x00, 0xE1, 0xC8, 0x09, 0xC3, 0xAA, 0x04, 0xCD, 0xE3, 0x04, 0xC5, 0xE3, 0xC1, 0xCD,
0xC5, 0x07, 0x7E, 0x02, 0xC8, 0x0B, 0x2B, 0xC3, 0xCF, 0x04, 0xE5, 0x2A, 0x1F, 0x21, 0x06, 0x00,
0x09, 0x09, 0x3E, 0xE5, 0x3E, 0xD0, 0x95, 0x6F, 0x3E, 0xFF, 0x9C, 0xDA, 0xF2, 0x04, 0x67, 0x39,
0xE1, 0xD8, 0x1E, 0x0C, 0xC3, 0x11, 0x05, 0x2A, 0x0E, 0x21, 0x22, 0xA1, 0x20, 0x1E, 0x02, 0x01,
0x1E, 0x14, 0x01, 0x1E, 0x00, 0x01, 0x1E, 0x12, 0x01, 0x1E, 0x22, 0x01, 0x1E, 0x0A, 0x01, 0x1E,
0x18, 0xCD, 0x2F, 0x06, 0x32, 0x8A, 0x20, 0xCD, 0xF0, 0x0B, 0x21, 0x04, 0x04, 0x57, 0x3E, 0x3F,
0xCD, 0xD6, 0x07, 0x19, 0x7E, 0xCD, 0xD6, 0x07, 0xCD, 0x55, 0x09, 0xCD, 0xD6, 0x07, 0x21, 0x8E,
0x04, 0xCD, 0x9B, 0x12, 0x2A, 0xA1, 0x20, 0x11, 0xFE, 0xFF, 0xCD, 0xC5, 0x07, 0xCA, 0x61, 0x01,
0x7C, 0xA5, 0x3C, 0xC4, 0x36, 0x19, 0x3E, 0xC1, 0xAF, 0x32, 0x8A, 0x20, 0xCD, 0xF0, 0x0B, 0x21,
0x9A, 0x04, 0xCD, 0x9B, 0x12, 0x21, 0xFF, 0xFF, 0x22, 0xA1, 0x20, 0xCD, 0x42, 0x07, 0xDA, 0x55,
0x05, 0xCD, 0x55, 0x09, 0x3C, 0x3D, 0xCA, 0x55, 0x05, 0xF5, 0xCD, 0x21, 0x0A, 0xD5, 0xCD, 0x59,
0x06, 0x47, 0xD1, 0xF1, 0xD2, 0x35, 0x09, 0xD5, 0xC5, 0xAF, 0x32, 0x11, 0x21, 0xCD, 0x55, 0x09,
0xB7, 0xF5, 0xCD, 0xE9, 0x05, 0xDA, 0x8E, 0x05, 0xF1, 0xF5, 0xCA, 0xC2, 0x0A, 0xB7, 0xC5, 0xD2,
0xA5, 0x05, 0xEB, 0x2A, 0x1B, 0x21, 0x1A, 0x02, 0x03, 0x13, 0xCD, 0xC5, 0x07, 0xC2, 0x96, 0x05,
0x60, 0x69, 0x22, 0x1B, 0x21, 0xD1, 0xF1, 0xCA, 0xCC, 0x05, 0x2A, 0x1B, 0x21, 0xE3, 0xC1, 0x09,
0xE5, 0xCD, 0xC9, 0x04, 0xE1, 0x22, 0x1B, 0x21, 0xEB, 0x74, 0xD1, 0x23, 0x23, 0x73, 0x23, 0x72,
0x23, 0x11, 0xA6, 0x20, 0x1A, 0x77, 0x23, 0x13, 0xB7, 0xC2, 0xC4, 0x05, 0xCD, 0x15, 0x06, 0x23,
0xEB, 0x62, 0x6B, 0x7E, 0x23, 0xB6, 0xCA, 0x55, 0x05, 0x23, 0x23, 0x23, 0xAF, 0xBE, 0x23, 0xC2,
0xDD, 0x05, 0xEB, 0x73, 0x23, 0x72, 0xC3, 0xD1, 0x05, 0x2A, 0xA3, 0x20, 0x44, 0x4D, 0x7E, 0x23,
0xB6, 0x2B, 0xC8, 0x23, 0x23, 0x7E, 0x23, 0x66, 0x6F, 0xCD, 0xC5, 0x07, 0x60, 0x69, 0x7E, 0x23,
0x66, 0x6F, 0x3F, 0xC8, 0x3F, 0xD0, 0xC3, 0xEC, 0x05, 0xC0, 0x2A, 0xA3, 0x20, 0xAF, 0x77, 0x23,
0x77, 0x23, 0x22, 0x1B, 0x21, 0x2A, 0xA3, 0x20, 0x2B, 0x22, 0x13, 0x21, 0x2A, 0xF4, 0x20, 0x22,
0x08, 0x21, 0xAF, 0xCD, 0x65, 0x09, 0x2A, 0x1B, 0x21, 0x22, 0x1D, 0x21, 0x22, 0x1F, 0x21, 0xC1,
0x2A, 0x9F, 0x20, 0xF9, 0x21, 0xF8, 0x20, 0x22, 0xF6, 0x20, 0xAF, 0x6F, 0x67, 0x22, 0x19, 0x21,
0x32, 0x10, 0x21, 0x22, 0x23, 0x21, 0xE5, 0xC5, 0x2A, 0x13, 0x21, 0xC9, 0x3E, 0x3F, 0xCD, 0xD6,
0x07, 0x3E, 0x20, 0xCD, 0xD6, 0x07, 0xC3, 0x93, 0x20, 0xAF, 0x32, 0xF3, 0x20, 0x0E, 0x05, 0x11,
0xA6, 0x20, 0x7E, 0xFE, 0x20, 0xCA, 0xE1, 0x06, 0x47, 0xFE, 0x22, 0xCA, 0x01, 0x07, 0xB7, 0xCA,
0x08, 0x07, 0x3A, 0xF3, 0x20, 0xB7, 0x7E, 0xC2, 0xE1, 0x06, 0xFE, 0x3F, 0x3E, 0x9E, 0xCA, 0xE1,
0x06, 0x7E, 0xFE, 0x30, 0xDA, 0x8C, 0x06, 0xFE, 0x3C, 0xDA, 0xE1, 0x06, 0xD5, 0x11, 0x85, 0x02,
0xC5, 0x01, 0xDD, 0x06, 0xC5, 0x06, 0x7F, 0x7E, 0xFE, 0x61, 0xDA, 0xA5, 0x06, 0xFE, 0x7B, 0xD2,
0xA5, 0x06, 0xE6, 0x5F, 0x77, 0x4E, 0xEB, 0x23, 0xB6, 0xF2, 0xA7, 0x06, 0x04, 0x7E, 0xE6, 0x7F,
0xC8, 0xB9, 0xC2, 0xA7, 0x06, 0xEB, 0xE5, 0x13, 0x1A, 0xB7, 0xFA, 0xD9, 0x06, 0x4F, 0x78, 0xFE,
0x88, 0xC2, 0xC8, 0x06, 0xCD, 0x55, 0x09, 0x2B, 0x23, 0x7E, 0xFE, 0x61, 0xDA, 0xD1, 0x06, 0xE6,
0x5F, 0xB9, 0xCA, 0xB7, 0x06, 0xE1, 0xC3, 0xA5, 0x06, 0x48, 0xF1, 0xEB, 0xC9, 0xEB, 0x79, 0xC1,
0xD1, 0x23, 0x12, 0x13, 0x0C, 0xD6, 0x3A, 0xCA, 0xEF, 0x06, 0xFE, 0x49, 0xC2, 0xF2, 0x06, 0x32,
0xF3, 0x20, 0xD6, 0x54, 0xC2, 0x62, 0x06, 0x47, 0x7E, 0xB7, 0xCA, 0x08, 0x07, 0xB8, 0xCA, 0xE1,
0x06, 0x23, 0x12, 0x0C, 0x13, 0xC3, 0xF8, 0x06, 0x21, 0xA5, 0x20, 0x12, 0x13, 0x12, 0x13, 0x12,
0xC9, 0x3A, 0x89, 0x20, 0xB7, 0x3E, 0x00, 0x32, 0x89, 0x20, 0xC2, 0x25, 0x07, 0x05, 0xCA, 0x42,
0x07, 0xCD, 0xD6, 0x07, 0x3E, 0x05, 0x2B, 0xCA, 0x39, 0x07, 0x7E, 0xCD, 0xD6, 0x07, 0xC3, 0x4B,
0x07, 0x05, 0x2B, 0xCD, 0xD6, 0x07, 0xC2, 0x4B, 0x07, 0xCD, 0xD6, 0x07, 0xCD, 0xFD, 0x0B, 0xC3,
0x42, 0x07, 0x21, 0xA6, 0x20, 0x06, 0x01, 0xAF, 0x32, 0x89, 0x20, 0xCD, 0x00, 0x08, 0x4F, 0xFE,
0x7F, 0xCA, 0x11, 0x07, 0x3A, 0x89, 0x20, 0xB7, 0xCA, 0x64, 0x07, 0x3E, 0x00, 0xCD, 0xD6, 0x07,
0xAF, 0x32, 0x89, 0x20, 0x79, 0xFE, 0x07, 0xCA, 0xA8, 0x07, 0xFE, 0x03, 0xCC, 0xFD, 0x0B, 0x37,
0xC8, 0xFE, 0x0D, 0xCA, 0xF8, 0x0B, 0xFE, 0x15, 0xCA, 0x3C, 0x07, 0xFE, 0x40, 0xCA, 0x39, 0x07,
0xFE, 0x5F, 0xCA, 0x31, 0x07, 0xFE, 0x08, 0xCA, 0x31, 0x07, 0xFE, 0x12, 0xC2, 0xA3, 0x07, 0xC5,
0xD5, 0xE5, 0x36, 0x00, 0xCD, 0xAD, 0x1D, 0x21, 0xA6, 0x20, 0xCD, 0x9B, 0x12, 0xE1, 0xD1, 0xC1,
0xC3, 0x4B, 0x07, 0xFE, 0x20, 0xDA, 0x4B, 0x07, 0x78, 0xFE, 0x49, 0x3E, 0x07, 0xD2, 0xBD, 0x07,
0x79, 0x71, 0x32, 0x11, 0x21, 0x23, 0x04, 0xCD, 0xD6, 0x07, 0xC3, 0x4B, 0x07, 0xCD, 0xD6, 0x07,
0x3E, 0x08, 0xC3, 0xB7, 0x07, 0x7C, 0x92, 0xC0, 0x7D, 0x93, 0xC9, 0x7E, 0xE3, 0xBE, 0x23, 0xE3,
0xCA, 0x55, 0x09, 0xC3, 0xFD, 0x04, 0xF5, 0x3A, 0x8A, 0x20, 0xB7, 0xC2, 0xD0, 0x12, 0xF1, 0xC5,
0xF5, 0xFE, 0x20, 0xDA, 0xFA, 0x07, 0x3A, 0x87, 0x20, 0x47, 0x3A, 0xF0, 0x20, 0x04, 0xCA, 0xF6,
0x07, 0x05, 0xB8, 0xCC, 0xFD, 0x0B, 0x3C, 0x32, 0xF0, 0x20, 0xF1, 0xC1, 0xCD, 0x96, 0x1D, 0xC9,
0xCD, 0x5A, 0x1C, 0xE6, 0x7F, 0xFE, 0x0F, 0xC0, 0x3A, 0x8A, 0x20, 0x2F, 0x32, 0x8A, 0x20, 0xAF,
0xC9, 0xCD, 0x21, 0x0A, 0xC0, 0xC1, 0xCD, 0xE9, 0x05, 0xC5, 0xCD, 0x67, 0x08, 0xE1, 0x4E, 0x23,
0x46, 0x23, 0x78, 0xB1, 0xCA, 0x48, 0x05, 0xCD, 0x70, 0x08, 0xCD, 0x80, 0x09, 0xC5, 0xCD, 0xFD,
0x0B, 0x5E, 0x23, 0x56, 0x23, 0xE5, 0xEB, 0xCD, 0x3E, 0x19, 0x3E, 0x20, 0xE1, 0xCD, 0xD6, 0x07,
0x7E, 0xB7, 0x23, 0xCA, 0x1D, 0x08, 0xF2, 0x3D, 0x08, 0xD6, 0x7F, 0x4F, 0x11, 0x86, 0x02, 0x1A,
0x13, 0xB7, 0xF2, 0x4F, 0x08, 0x0D, 0xC2, 0x4F, 0x08, 0xE6, 0x7F, 0xCD, 0xD6, 0x07, 0x1A, 0x13,
0xB7, 0xF2, 0x59, 0x08, 0xC3, 0x40, 0x08, 0xE5, 0x2A, 0x8D, 0x20, 0x22, 0x8B, 0x20, 0xE1, 0xC9,
0xE5, 0xD5, 0x2A, 0x8B, 0x20, 0x11, 0xFF, 0xFF, 0xED, 0x5A, 0x22, 0x8B, 0x20, 0xD1, 0xE1, 0xF0,
0xE5, 0x2A, 0x8D, 0x20, 0x22, 0x8B, 0x20, 0xCD, 0x5A, 0x1C, 0xFE, 0x03, 0xCA, 0x93, 0x08, 0xE1,
0xC3, 0x70, 0x08, 0x2A, 0x8D, 0x20, 0x22, 0x8B, 0x20, 0xC3, 0xF7, 0x01, 0x3E, 0x64, 0x32, 0x10,
0x21, 0xCD, 0x03, 0x0B, 0xC1, 0xE5, 0xCD, 0xEC, 0x0A, 0x22, 0x0C, 0x21, 0x21, 0x02, 0x00, 0x39,
0xCD, 0xAA, 0x04, 0xD1, 0xC2, 0xCC, 0x08, 0x09, 0xD5, 0x2B, 0x56, 0x2B, 0x5E, 0x23, 0x23, 0xE5,
0x2A, 0x0C, 0x21, 0xCD, 0xC5, 0x07, 0xE1, 0xC2, 0xB0, 0x08, 0xD1, 0xF9, 0xEB, 0x0E, 0x08, 0xCD,
0xDA, 0x04, 0xE5, 0x2A, 0x0C, 0x21, 0xE3, 0xE5, 0x2A, 0xA1, 0x20, 0xE3, 0xCD, 0xC5, 0x0D, 0xCD,
0xCB, 0x07, 0xA6, 0xCD, 0xC2, 0x0D, 0xE5, 0xCD, 0xF0, 0x17, 0xE1, 0xC5, 0xD5, 0x01, 0x00, 0x81,
0x51, 0x5A, 0x7E, 0xFE, 0xAB, 0x3E, 0x01, 0xC2, 0x08, 0x09, 0xCD, 0x55, 0x09, 0xCD, 0xC2, 0x0D,
0xE5, 0xCD, 0xF0, 0x17, 0xCD, 0xA4, 0x17, 0xE1, 0xC5, 0xD5, 0xF5, 0x33, 0xE5, 0x2A, 0x13, 0x21,
0xE3, 0x06, 0x81, 0xC5, 0x33, 0xCD, 0x80, 0x09, 0x22, 0x13, 0x21, 0x7E, 0xFE, 0x3A, 0xCA, 0x35,
0x09, 0xB7, 0xC2, 0xFD, 0x04, 0x23, 0x7E, 0x23, 0xB6, 0xCA, 0xA7, 0x09, 0x23, 0x5E, 0x23, 0x56,
0xEB, 0x22, 0xA1, 0x20, 0xEB, 0xCD, 0x55, 0x09, 0x11, 0x15, 0x09, 0xD5, 0xC8, 0xD6, 0x80, 0xDA,
0x03, 0x0B, 0xFE, 0x25, 0xD2, 0xFD, 0x04, 0x07, 0x4F, 0x06, 0x00, 0xEB, 0x21, 0xA5, 0x03, 0x09,
0x4E, 0x23, 0x46, 0xC5, 0xEB, 0x23, 0x7E, 0xFE, 0x3A, 0xD0, 0xFE, 0x20, 0xCA, 0x55, 0x09, 0xFE,
0x30, 0x3F, 0x3C, 0x3D, 0xC9, 0xEB, 0x2A, 0xA3, 0x20, 0xCA, 0x7A, 0x09, 0xEB, 0xCD, 0x21, 0x0A,
0xE5, 0xCD, 0xE9, 0x05, 0x60, 0x69, 0xD1, 0xD2, 0xC2, 0x0A, 0x2B, 0x22, 0x21, 0x21, 0xEB, 0xC9,
0xDF, 0xC8, 0xD7, 0xFE, 0x1B, 0x28, 0x11, 0xFE, 0x03, 0x28, 0x0D, 0xFE, 0x13, 0xC0, 0xD7, 0xFE,
0x11, 0xC8, 0xFE, 0x03, 0x28, 0x07, 0x18, 0xF6, 0x3E, 0xFF, 0x32, 0x92, 0x20, 0xC0, 0xF6, 0xC0,
0x22, 0x13, 0x21, 0x21, 0xF6, 0xFF, 0xC1, 0x2A, 0xA1, 0x20, 0xF5, 0x7D, 0xA4, 0x3C, 0xCA, 0xBA,
0x09, 0x22, 0x17, 0x21, 0x2A, 0x13, 0x21, 0x22, 0x19, 0x21, 0xAF, 0x32, 0x8A, 0x20, 0xCD, 0xF0,
0x0B, 0xF1, 0x21, 0xA0, 0x04, 0xC2, 0x31, 0x05, 0xC3, 0x48, 0x05, 0x2A, 0x19, 0x21, 0x7C, 0xB5,
0x1E, 0x20, 0xCA, 0x11, 0x05, 0xEB, 0x2A, 0x17, 0x21, 0x22, 0xA1, 0x20, 0xEB, 0xC9, 0xCD, 0x23,
0x15, 0xC0, 0x32, 0x86, 0x20, 0xC9, 0xE5, 0x2A, 0x8F, 0x20, 0x06, 0x00, 0x4F, 0x09, 0x22, 0x8F,
0x20, 0xE1, 0xC9, 0x7E, 0xFE, 0x41, 0xD8, 0xFE, 0x5B, 0x3F, 0xC9, 0xCD, 0x55, 0x09, 0xCD, 0xC2,
0x0D, 0xCD, 0xA4, 0x17, 0xFA, 0x1C, 0x0A, 0x3A, 0x2C, 0x21, 0xFE, 0x90, 0xDA, 0x4C, 0x18, 0x01,
0x80, 0x90, 0x11, 0x00, 0x00, 0xE5, 0xCD, 0x1F, 0x18, 0xE1, 0x51, 0xC8, 0x1E, 0x08, 0xC3, 0x11,
0x05, 0x2B, 0x11, 0x00, 0x00, 0xCD, 0x55, 0x09, 0xD0, 0xE5, 0xF5, 0x21, 0x98, 0x19, 0xCD, 0xC5,
0x07, 0xDA, 0xFD, 0x04, 0x62, 0x6B, 0x19, 0x29, 0x19, 0x29, 0xF1, 0xD6, 0x30, 0x5F, 0x16, 0x00,
0x19, 0xEB, 0xE1, 0xC3, 0x25, 0x0A, 0xCA, 0x19, 0x06, 0xCD, 0xFE, 0x09, 0x2B, 0xCD, 0x55, 0x09,
0xE5, 0x2A, 0xF4, 0x20, 0xCA, 0x69, 0x0A, 0xE1, 0xCD, 0xCB, 0x07, 0x2C, 0xD5, 0xCD, 0xFE, 0x09,
0x2B, 0xCD, 0x55, 0x09, 0xC2, 0xFD, 0x04, 0xE3, 0xEB, 0x7D, 0x93, 0x5F, 0x7C, 0x9A, 0x57, 0xDA,
0xF2, 0x04, 0xE5, 0x2A, 0x1B, 0x21, 0x01, 0x28, 0x00, 0x09, 0xCD, 0xC5, 0x07, 0xD2, 0xF2, 0x04,
0xEB, 0x22, 0x9F, 0x20, 0xE1, 0x22, 0xF4, 0x20, 0xE1, 0xC3, 0x19, 0x06, 0xCA, 0x15, 0x06, 0xCD,
0x19, 0x06, 0x01, 0x15, 0x09, 0xC3, 0xA8, 0x0A, 0x0E, 0x03, 0xCD, 0xDA, 0x04, 0xC1, 0xE5, 0xE5,
0x2A, 0xA1, 0x20, 0xE3, 0x3E, 0x8C, 0xF5, 0x33, 0xC5, 0xCD, 0x21, 0x0A, 0xCD, 0xEE, 0x0A, 0xE5,
0x2A, 0xA1, 0x20, 0xCD, 0xC5, 0x07, 0xE1, 0x23, 0xDC, 0xEC, 0x05, 0xD4, 0xE9, 0x05, 0x60, 0x69,
0x2B, 0xD8, 0x1E, 0x0E, 0xC3, 0x11, 0x05, 0xC0, 0x16, 0xFF, 0xCD, 0xA6, 0x04, 0xF9, 0xFE, 0x8C,
0x1E, 0x04, 0xC2, 0x11, 0x05, 0xE1, 0x22, 0xA1, 0x20, 0x23, 0x7C, 0xB5, 0xC2, 0xE6, 0x0A, 0x3A,
0x11, 0x21, 0xB7, 0xC2, 0x47, 0x05, 0x21, 0x15, 0x09, 0xE3, 0x3E, 0xE1, 0x01, 0x3A, 0x0E, 0x00,
0x06, 0x00, 0x79, 0x48, 0x47, 0x7E, 0xB7, 0xC8, 0xB8, 0xC8, 0x23, 0xFE, 0x22, 0xCA, 0xF2, 0x0A,
0xC3, 0xF5, 0x0A, 0xCD, 0xB8, 0x0F, 0xCD, 0xCB, 0x07, 0xB4, 0xD5, 0x3A, 0xF2, 0x20, 0xF5, 0xCD,
0xD4, 0x0D, 0xF1, 0xE3, 0x22, 0x13, 0x21, 0x1F, 0xCD, 0xC7, 0x0D, 0xCA, 0x56, 0x0B, 0xE5, 0x2A,
0x29, 0x21, 0xE5, 0x23, 0x23, 0x5E, 0x23, 0x56, 0x2A, 0xA3, 0x20, 0xCD, 0xC5, 0x07, 0xD2, 0x45,
0x0B, 0x2A, 0x9F, 0x20, 0xCD, 0xC5, 0x07, 0xD1, 0xD2, 0x4D, 0x0B, 0x21, 0x04, 0x21, 0xCD, 0xC5,
0x07, 0xD2, 0x4D, 0x0B, 0x3E, 0xD1, 0xCD, 0xFC, 0x13, 0xEB, 0xCD, 0x35, 0x12, 0xCD, 0xFC, 0x13,
0xE1, 0xCD, 0xFF, 0x17, 0xE1, 0xC9, 0xE5, 0xCD, 0xFC, 0x17, 0xD1, 0xE1, 0xC9, 0xCD, 0x23, 0x15,
0x7E, 0x47, 0xFE, 0x8C, 0xCA, 0x6C, 0x0B, 0xCD, 0xCB, 0x07, 0x88, 0x2B, 0x4B, 0x0D, 0x78, 0xCA,
0x3D, 0x09, 0xCD, 0x22, 0x0A, 0xFE, 0x2C, 0xC0, 0xC3, 0x6D, 0x0B, 0xCD, 0xD4, 0x0D, 0x7E, 0xFE,
0x88, 0xCA, 0x89, 0x0B, 0xCD, 0xCB, 0x07, 0xA9, 0x2B, 0xCD, 0xC5, 0x0D, 0xCD, 0xA4, 0x17, 0xCA,
0xEE, 0x0A, 0xCD, 0x55, 0x09, 0xDA, 0xA9, 0x0A, 0xC3, 0x3C, 0x09, 0x2B, 0xCD, 0x55, 0x09, 0xCA,
0xFD, 0x0B, 0xC8, 0xFE, 0xA5, 0xCA, 0x30, 0x0C, 0xFE, 0xA8, 0xCA, 0x30, 0x0C, 0xE5, 0xFE, 0x2C,
0xCA, 0x19, 0x0C, 0xFE, 0x3B, 0xCA, 0x53, 0x0C, 0xC1, 0xCD, 0xD4, 0x0D, 0xE5, 0x3A, 0xF2, 0x20,
0xB7, 0xC2, 0xE9, 0x0B, 0xCD, 0x49, 0x19, 0xCD, 0x59, 0x12, 0x36, 0x20, 0x2A, 0x29, 0x21, 0x34,
0x2A, 0x29, 0x21, 0x3A, 0x87, 0x20, 0x47, 0x04, 0xCA, 0xE5, 0x0B, 0x04, 0x3A, 0xF0, 0x20, 0x86,
0x3D, 0xB8, 0xD4, 0xFD, 0x0B, 0xCD, 0x9E, 0x12, 0xAF, 0xC4, 0x9E, 0x12, 0xE1, 0xC3, 0x9B, 0x0B,
0x3A, 0xF0, 0x20, 0xB7, 0xC8, 0xC3, 0xFD, 0x0B, 0x36, 0x00, 0x21, 0xA5, 0x20, 0x3E, 0x0D, 0xCD,
0xD6, 0x07, 0x3E, 0x0A, 0xCD, 0xD6, 0x07, 0xAF, 0x32, 0xF0, 0x20, 0x3A, 0x86, 0x20, 0x3D, 0xC8,
0xF5, 0xAF, 0xCD, 0xD6, 0x07, 0xF1, 0xC3, 0x0E, 0x0C, 0x3A, 0x88, 0x20, 0x47, 0x3A, 0xF0, 0x20,
0xB8, 0xD4, 0xFD, 0x0B, 0xD2, 0x53, 0x0C, 0xD6, 0x0E, 0xD2, 0x27, 0x0C, 0x2F, 0xC3, 0x48, 0x0C,
0xF5, 0xCD, 0x20, 0x15, 0xCD, 0xCB, 0x07, 0x29, 0x2B, 0xF1, 0xD6, 0xA8, 0xE5, 0xCA, 0x43, 0x0C,
0x3A, 0xF0, 0x20, 0x2F, 0x83, 0xD2, 0x53, 0x0C, 0x3C, 0x47, 0x3E, 0x20, 0xCD, 0xD6, 0x07, 0x05,
0xC2, 0x4C, 0x0C, 0xE1, 0xCD, 0x55, 0x09, 0xC3, 0xA2, 0x0B, 0x3F, 0x52, 0x65, 0x64, 0x6F, 0x20,
0x66, 0x72, 0x6F, 0x6D, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x0D, 0x0A, 0x00, 0x3A, 0x12, 0x21,
0xB7, 0xC2, 0xF7, 0x04, 0xC1, 0x21, 0x5A, 0x0C, 0xCD, 0x9B, 0x12, 0xC3, 0x48, 0x06, 0xCD, 0x06,
0x12, 0x7E, 0xFE, 0x22, 0x3E, 0x00, 0x32, 0x8A, 0x20, 0xC2, 0x98, 0x0C, 0xCD, 0x5A, 0x12, 0xCD,
0xCB, 0x07, 0x3B, 0xE5, 0xCD, 0x9E, 0x12, 0x3E, 0xE5, 0xCD, 0x4C, 0x06, 0xC1, 0xDA, 0xA4, 0x09,
0x23, 0x7E, 0xB7, 0x2B, 0xC5, 0xCA, 0xEB, 0x0A, 0x36, 0x2C, 0xC3, 0xB2, 0x0C, 0xE5, 0x2A, 0x21,
0x21, 0xF6, 0xAF, 0x32, 0x12, 0x21, 0xE3, 0xC3, 0xBE, 0x0C, 0xCD, 0xCB, 0x07, 0x2C, 0xCD, 0xB8,
0x0F, 0xE3, 0xD5, 0x7E, 0xFE, 0x2C, 0xCA, 0xE6, 0x0C, 0x3A, 0x12, 0x21, 0xB7, 0xC2, 0x53, 0x0D,
0x3E, 0x3F, 0xCD, 0xD6, 0x07, 0xCD, 0x4C, 0x06, 0xD1, 0xC1, 0xDA, 0xA4, 0x09, 0x23, 0x7E, 0xB7,
0x2B, 0xC5, 0xCA, 0xEB, 0x0A, 0xD5, 0x3A, 0xF2, 0x20, 0xB7, 0xCA, 0x10, 0x0D, 0xCD, 0x55, 0x09,
0x57, 0x47, 0xFE, 0x22, 0xCA, 0x04, 0x0D, 0x3A, 0x12, 0x21, 0xB7, 0x57, 0xCA, 0x01, 0x0D, 0x16,
0x3A, 0x06, 0x2C, 0x2B, 0xCD, 0x5D, 0x12, 0xEB, 0x21, 0x1B, 0x0D, 0xE3, 0xD5, 0xC3, 0x1E, 0x0B,
0xCD, 0x55, 0x09, 0xCD, 0xAB, 0x18, 0xE3, 0xCD, 0xFC, 0x17, 0xE1, 0x2B, 0xCD, 0x55, 0x09, 0xCA,
0x27, 0x0D, 0xFE, 0x2C, 0xC2, 0x6D, 0x0C, 0xE3, 0x2B, 0xCD, 0x55, 0x09, 0xC2, 0xBA, 0x0C, 0xD1,
0x3A, 0x12, 0x21, 0xB7, 0xEB, 0xC2, 0x7B, 0x09, 0xD5, 0xB6, 0x21, 0x42, 0x0D, 0xC4, 0x9B, 0x12,
0xE1, 0xC9, 0x3F, 0x45, 0x78, 0x74, 0x72, 0x61, 0x20, 0x69, 0x67, 0x6E, 0x6F, 0x72, 0x65, 0x64,
0x0D, 0x0A, 0x00, 0xCD, 0xEC, 0x0A, 0xB7, 0xC2, 0x6C, 0x0D, 0x23, 0x7E, 0x23, 0xB6, 0x1E, 0x06,
0xCA, 0x11, 0x05, 0x23, 0x5E, 0x23, 0x56, 0xEB, 0x22, 0x0E, 0x21, 0xEB, 0xCD, 0x55, 0x09, 0xFE,
0x83, 0xC2, 0x53, 0x0D, 0xC3, 0xE6, 0x0C, 0x11, 0x00, 0x00, 0xC4, 0xB8, 0x0F, 0x22, 0x13, 0x21,
0xCD, 0xA6, 0x04, 0xC2, 0x03, 0x05, 0xF9, 0xD5, 0x7E, 0x23, 0xF5, 0xD5, 0xCD, 0xE2, 0x17, 0xE3,
0xE5, 0xCD, 0x4F, 0x15, 0xE1, 0xCD, 0xFC, 0x17, 0xE1, 0xCD, 0xF3, 0x17, 0xE5, 0xCD, 0x1F, 0x18,
0xE1, 0xC1, 0x90, 0xCD, 0xF3, 0x17, 0xCA, 0xB2, 0x0D, 0xEB, 0x22, 0xA1, 0x20, 0x69, 0x60, 0xC3,
0x11, 0x09, 0xF9, 0x2A, 0x13, 0x21, 0x7E, 0xFE, 0x2C, 0xC2, 0x15, 0x09, 0xCD, 0x55, 0x09, 0xCD,
0x7A, 0x0D, 0xCD, 0xD4, 0x0D, 0xF6, 0x37, 0x3A, 0xF2, 0x20, 0x8F, 0xB7, 0xE8, 0xC3, 0x0F, 0x05,
0xCD, 0xCB, 0x07, 0x28, 0x2B, 0x16, 0x00, 0xD5, 0x0E, 0x01, 0xCD, 0xDA, 0x04, 0xCD, 0x4B, 0x0E,
0x22, 0x15, 0x21, 0x2A, 0x15, 0x21, 0xC1, 0x78, 0xFE, 0x78, 0xD4, 0xC5, 0x0D, 0x7E, 0x16, 0x00,
0xD6, 0xB3, 0xDA, 0x0C, 0x0E, 0xFE, 0x03, 0xD2, 0x0C, 0x0E, 0xFE, 0x01, 0x17, 0xAA, 0xBA, 0x57,
0xDA, 0xFD, 0x04, 0x22, 0x0A, 0x21, 0xCD, 0x55, 0x09, 0xC3, 0xF0, 0x0D, 0x7A, 0xB7, 0xC2, 0x33,
0x0F, 0x7E, 0x22, 0x0A, 0x21, 0xD6, 0xAC, 0xD8, 0xFE, 0x07, 0xD0, 0x5F, 0x3A, 0xF2, 0x20, 0x3D,
0xB3, 0x7B, 0xCA, 0x91, 0x13, 0x07, 0x83, 0x5F, 0x21, 0xEF, 0x03, 0x19, 0x78, 0x56, 0xBA, 0xD0,
0x23, 0xCD, 0xC5, 0x0D, 0xC5, 0x01, 0xE3, 0x0D, 0xC5, 0x43, 0x4A, 0xCD, 0xD5, 0x17, 0x58, 0x51,
0x4E, 0x23, 0x46, 0x23, 0xC5, 0x2A, 0x0A, 0x21, 0xC3, 0xD7, 0x0D, 0xAF, 0x32, 0xF2, 0x20, 0xCD,
0x55, 0x09, 0x1E, 0x24, 0xCA, 0x11, 0x05, 0xDA, 0xAB, 0x18, 0xCD, 0xF3, 0x09, 0xD2, 0xB2, 0x0E,
0xFE, 0x26, 0x20, 0x12, 0xCD, 0x55, 0x09, 0xFE, 0x48, 0xCA, 0xEF, 0x1C, 0xFE, 0x42, 0xCA, 0x5F,
0x1D, 0x1E, 0x02, 0xCA, 0x11, 0x05, 0xFE, 0xAC, 0xCA, 0x4B, 0x0E, 0xFE, 0x2E, 0xCA, 0xAB, 0x18,
0xFE, 0xAD, 0xCA, 0xA1, 0x0E, 0xFE, 0x22, 0xCA, 0x5A, 0x12, 0xFE, 0xAA, 0xCA, 0x93, 0x0F, 0xFE,
0xA7, 0xCA, 0xBE, 0x11, 0xD6, 0xB6, 0xD2, 0xC3, 0x0E, 0xCD, 0xD0, 0x0D, 0xCD, 0xCB, 0x07, 0x29,
0xC9, 0x16, 0x7D, 0xCD, 0xD7, 0x0D, 0x2A, 0x15, 0x21, 0xE5, 0xCD, 0xCD, 0x17, 0xCD, 0xC5, 0x0D,
0xE1, 0xC9, 0xCD, 0xB8, 0x0F, 0xE5, 0xEB, 0x22, 0x29, 0x21, 0x3A, 0xF2, 0x20, 0xB7, 0xCC, 0xE2,
0x17, 0xE1, 0xC9, 0x06, 0x00, 0x07, 0x4F, 0xC5, 0xCD, 0x55, 0x09, 0x79, 0xFE, 0x31, 0xDA, 0xEA,
0x0E, 0xCD, 0xD0, 0x0D, 0xCD, 0xCB, 0x07, 0x2C, 0xCD, 0xC6, 0x0D, 0xEB, 0x2A, 0x29, 0x21, 0xE3,
0xE5, 0xEB, 0xCD, 0x23, 0x15, 0xEB, 0xE3, 0xC3, 0xF2, 0x0E, 0xCD, 0x99, 0x0E, 0xE3, 0x11, 0xAD,
0x0E, 0xD5, 0x01, 0x4E, 0x02, 0x09, 0x4E, 0x23, 0x66, 0x69, 0xE9, 0x15, 0xFE, 0xAD, 0xC8, 0xFE,
0x2D, 0xC8, 0x14, 0xFE, 0x2B, 0xC8, 0xFE, 0xAC, 0xC8, 0x2B, 0xC9, 0xF6, 0xAF, 0xF5, 0xCD, 0xC5,
0x0D, 0xCD, 0x07, 0x0A, 0xF1, 0xEB, 0xC1, 0xE3, 0xEB, 0xCD, 0xE5, 0x17, 0xF5, 0xCD, 0x07, 0x0A,
0xF1, 0xC1, 0x79, 0x21, 0x7C, 0x11, 0xC2, 0x2E, 0x0F, 0xA3, 0x4F, 0x78, 0xA2, 0xE9, 0xB3, 0x4F,
0x78, 0xB2, 0xE9, 0x21, 0x45, 0x0F, 0x3A, 0xF2, 0x20, 0x1F, 0x7A, 0x17, 0x5F, 0x16, 0x64, 0x78,
0xBA, 0xD0, 0xC3, 0x34, 0x0E, 0x47, 0x0F, 0x79, 0xB7, 0x1F, 0xC1, 0xD1, 0xF5, 0xCD, 0xC7, 0x0D,
0x21, 0x89, 0x0F, 0xE5, 0xCA, 0x1F, 0x18, 0xAF, 0x32, 0xF2, 0x20, 0xD5, 0xCD, 0xDE, 0x13, 0x7E,
0x23, 0x23, 0x4E, 0x23, 0x46, 0xD1, 0xC5, 0xF5, 0xCD, 0xE2, 0x13, 0xCD, 0xF3, 0x17, 0xF1, 0x57,
0xE1, 0x7B, 0xB2, 0xC8, 0x7A, 0xD6, 0x01, 0xD8, 0xAF, 0xBB, 0x3C, 0xD0, 0x15, 0x1D, 0x0A, 0xBE,
0x23, 0x03, 0xCA, 0x71, 0x0F, 0x3F, 0xC3, 0xAF, 0x17, 0x3C, 0x8F, 0xC1, 0xA0, 0xC6, 0xFF, 0x9F,
0xC3, 0xB6, 0x17, 0x16, 0x5A, 0xCD, 0xD7, 0x0D, 0xCD, 0xC5, 0x0D, 0xCD, 0x07, 0x0A, 0x7B, 0x2F,
0x4F, 0x7A, 0x2F, 0xCD, 0x7C, 0x11, 0xC1, 0xC3, 0xE3, 0x0D, 0x2B, 0xCD, 0x55, 0x09, 0xC8, 0xCD,
0xCB, 0x07, 0x2C, 0x01, 0xAA, 0x0F, 0xC5, 0xF6, 0xAF, 0x32, 0xF1, 0x20, 0x46, 0xCD, 0xF3, 0x09,
0xDA, 0xFD, 0x04, 0xAF, 0x4F, 0x32, 0xF2, 0x20, 0xCD, 0x55, 0x09, 0xDA, 0xD4, 0x0F, 0xCD, 0xF3,
0x09, 0xDA, 0xE1, 0x0F, 0x4F, 0xCD, 0x55, 0x09, 0xDA, 0xD5, 0x0F, 0xCD, 0xF3, 0x09, 0xD2, 0xD5,
0x0F, 0xD6, 0x24, 0xC2, 0xF0, 0x0F, 0x3C, 0x32, 0xF2, 0x20, 0x0F, 0x81, 0x4F, 0xCD, 0x55, 0x09,
0x3A, 0x10, 0x21, 0x3D, 0xCA, 0x9D, 0x10, 0xF2, 0x00, 0x10, 0x7E, 0xD6, 0x28, 0xCA, 0x75, 0x10,
0xAF, 0x32, 0x10, 0x21, 0xE5, 0x50, 0x59, 0x2A, 0x23, 0x21, 0xCD, 0xC5, 0x07, 0x11, 0x25, 0x21,
0xCA, 0xE5, 0x16, 0x2A, 0x1D, 0x21, 0xEB, 0x2A, 0x1B, 0x21, 0xCD, 0xC5, 0x07, 0xCA, 0x33, 0x10,
0x79, 0x96, 0x23, 0xC2, 0x28, 0x10, 0x78, 0x96, 0x23, 0xCA, 0x67, 0x10, 0x23, 0x23, 0x23, 0x23,
0xC3, 0x1A, 0x10, 0xE1, 0xE3, 0xD5, 0x11, 0xB5, 0x0E, 0xCD, 0xC5, 0x07, 0xD1, 0xCA, 0x6A, 0x10,
0xE3, 0xE5, 0xC5, 0x01, 0x06, 0x00, 0x2A, 0x1F, 0x21, 0xE5, 0x09, 0xC1, 0xE5, 0xCD, 0xC9, 0x04,
0xE1, 0x22, 0x1F, 0x21, 0x60, 0x69, 0x22, 0x1D, 0x21, 0x2B, 0x36, 0x00, 0xCD, 0xC5, 0x07, 0xC2,
0x59, 0x10, 0xD1, 0x73, 0x23, 0x72, 0x23, 0xEB, 0xE1, 0xC9, 0x32, 0x2C, 0x21, 0x21, 0x99, 0x04,
0x22, 0x29, 0x21, 0xE1, 0xC9, 0xE5, 0x2A, 0xF1, 0x20, 0xE3, 0x57, 0xD5, 0xC5, 0xCD, 0xFB, 0x09,
0xC1, 0xF1, 0xEB, 0xE3, 0xE5, 0xEB, 0x3C, 0x57, 0x7E, 0xFE, 0x2C, 0xCA, 0x7B, 0x10, 0xCD, 0xCB,
0x07, 0x29, 0x22, 0x15, 0x21, 0xE1, 0x22, 0xF1, 0x20, 0x1E, 0x00, 0xD5, 0x11, 0xE5, 0xF5, 0x2A,
0x1D, 0x21, 0x3E, 0x19, 0xEB, 0x2A, 0x1F, 0x21, 0xEB, 0xCD, 0xC5, 0x07, 0xCA, 0xD5, 0x10, 0x7E,
0xB9, 0x23, 0xC2, 0xB7, 0x10, 0x7E, 0xB8, 0x23, 0x5E, 0x23, 0x56, 0x23, 0xC2, 0xA3, 0x10, 0x3A,
0xF1, 0x20, 0xB7, 0xC2, 0x06, 0x05, 0xF1, 0x44, 0x4D, 0xCA, 0xE5, 0x16, 0x96, 0xCA, 0x33, 0x11,
0x1E, 0x10, 0xC3, 0x11, 0x05, 0x11, 0x04, 0x00, 0xF1, 0xCA, 0x1C, 0x0A, 0x71, 0x23, 0x70, 0x23,
0x4F, 0xCD, 0xDA, 0x04, 0x23, 0x23, 0x22, 0x0A, 0x21, 0x71, 0x23, 0x3A, 0xF1, 0x20, 0x17, 0x79,
0x01, 0x0B, 0x00, 0xD2, 0xF8, 0x10, 0xC1, 0x03, 0x71, 0x23, 0x70, 0x23, 0xF5, 0xE5, 0xCD, 0x90,
0x18, 0xEB, 0xE1, 0xF1, 0x3D, 0xC2, 0xF0, 0x10, 0xF5, 0x42, 0x4B, 0xEB, 0x19, 0xDA, 0xF2, 0x04,
0xCD, 0xE3, 0x04, 0x22, 0x1F, 0x21, 0x2B, 0x36, 0x00, 0xCD, 0xC5, 0x07, 0xC2, 0x16, 0x11, 0x03,
0x57, 0x2A, 0x0A, 0x21, 0x5E, 0xEB, 0x29, 0x09, 0xEB, 0x2B, 0x2B, 0x73, 0x23, 0x72, 0x23, 0xF1,
0xDA, 0x57, 0x11, 0x47, 0x4F, 0x7E, 0x23, 0x16, 0xE1, 0x5E, 0x23, 0x56, 0x23, 0xE3, 0xF5, 0xCD,
0xC5, 0x07, 0xD2, 0xD0, 0x10, 0xE5, 0xCD, 0x90, 0x18, 0xD1, 0x19, 0xF1, 0x3D, 0x44, 0x4D, 0xC2,
0x38, 0x11, 0x29, 0x29, 0xC1, 0x09, 0xEB, 0x2A, 0x15, 0x21, 0xC9, 0x2A, 0x1F, 0x21, 0xEB, 0x21,
0x00, 0x00, 0x39, 0x3A, 0xF2, 0x20, 0xB7, 0xCA, 0x77, 0x11, 0xCD, 0xDE, 0x13, 0xCD, 0xDE, 0x12,
0x2A, 0x9F, 0x20, 0xEB, 0x2A, 0x08, 0x21, 0x7D, 0x93, 0x4F, 0x7C, 0x9A, 0x41, 0x50, 0x1E, 0x00,
0x21, 0xF2, 0x20, 0x73, 0x06, 0x90, 0xC3, 0xBB, 0x17, 0x3A, 0xF0, 0x20, 0x47, 0xAF, 0xC3, 0x7D,
0x11, 0xCD, 0x14, 0x12, 0xCD, 0x06, 0x12, 0x01, 0xEC, 0x0A, 0xC5, 0xD5, 0xCD, 0xCB, 0x07, 0x28,
0xCD, 0xB8, 0x0F, 0xE5, 0xEB, 0x2B, 0x56, 0x2B, 0x5E, 0xE1, 0xCD, 0xC5, 0x0D, 0xCD, 0xCB, 0x07,
0x29, 0xCD, 0xCB, 0x07, 0xB4, 0x44, 0x4D, 0xE3, 0x71, 0x23, 0x70, 0xC3, 0x53, 0x12, 0xCD, 0x14,
0x12, 0xD5, 0xCD, 0x99, 0x0E, 0xCD, 0xC5, 0x0D, 0xE3, 0x5E, 0x23, 0x56, 0x23, 0x7A, 0xB3, 0xCA,
0x09, 0x05, 0x7E, 0x23, 0x66, 0x6F, 0xE5, 0x2A, 0x23, 0x21, 0xE3, 0x22, 0x23, 0x21, 0x2A, 0x27,
0x21, 0xE5, 0x2A, 0x25, 0x21, 0xE5, 0x21, 0x25, 0x21, 0xD5, 0xCD, 0xFC, 0x17, 0xE1, 0xCD, 0xC2,
0x0D, 0x2B, 0xCD, 0x55, 0x09, 0xC2, 0xFD, 0x04, 0xE1, 0x22, 0x25, 0x21, 0xE1, 0x22, 0x27, 0x21,
0xE1, 0x22, 0x23, 0x21, 0xE1, 0xC9, 0xE5, 0x2A, 0xA1, 0x20, 0x23, 0x7C, 0xB5, 0xE1, 0xC0, 0x1E,
0x16, 0xC3, 0x11, 0x05, 0xCD, 0xCB, 0x07, 0xA7, 0x3E, 0x80, 0x32, 0x10, 0x21, 0xB6, 0x47, 0xCD,
0xBD, 0x0F, 0xC3, 0xC5, 0x0D, 0xCD, 0xC5, 0x0D, 0xCD, 0x49, 0x19, 0xCD, 0x59, 0x12, 0xCD, 0xDE,
0x13, 0x01, 0x39, 0x14, 0xC5, 0x7E, 0x23, 0x23, 0xE5, 0xCD, 0xB4, 0x12, 0xE1, 0x4E, 0x23, 0x46,
0xCD, 0x4D, 0x12, 0xE5, 0x6F, 0xCD, 0xD1, 0x13, 0xD1, 0xC9, 0xCD, 0xB4, 0x12, 0x21, 0x04, 0x21,
0xE5, 0x77, 0x23, 0x23, 0x73, 0x23, 0x72, 0xE1, 0xC9, 0x2B, 0x06, 0x22, 0x50, 0xE5, 0x0E, 0xFF,
0x23, 0x7E, 0x0C, 0xB7, 0xCA, 0x6F, 0x12, 0xBA, 0xCA, 0x6F, 0x12, 0xB8, 0xC2, 0x60, 0x12, 0xFE,
0x22, 0xCC, 0x55, 0x09, 0xE3, 0x23, 0xEB, 0x79, 0xCD, 0x4D, 0x12, 0x11, 0x04, 0x21, 0x2A, 0xF6,
0x20, 0x22, 0x29, 0x21, 0x3E, 0x01, 0x32, 0xF2, 0x20, 0xCD, 0xFF, 0x17, 0xCD, 0xC5, 0x07, 0x22,
0xF6, 0x20, 0xE1, 0x7E, 0xC0, 0x1E, 0x1E, 0xC3, 0x11, 0x05, 0x23, 0xCD, 0x59, 0x12, 0xCD, 0xDE,
0x13, 0xCD, 0xF3, 0x17, 0x1C, 0x1D, 0xC8, 0x0A, 0xCD, 0xD6, 0x07, 0xFE, 0x0D, 0xCC, 0x07, 0x0C,
0x03, 0xC3, 0xA5, 0x12, 0xB7, 0x0E, 0xF1, 0xF5, 0x2A, 0x9F, 0x20, 0xEB, 0x2A, 0x08, 0x21, 0x2F,
0x4F, 0x06, 0xFF, 0x09, 0x23, 0xCD, 0xC5, 0x07, 0xDA, 0xD2, 0x12, 0x22, 0x08, 0x21, 0x23, 0xEB,
0xF1, 0xC9, 0xF1, 0x1E, 0x1A, 0xCA, 0x11, 0x05, 0xBF, 0xF5, 0x01, 0xB6, 0x12, 0xC5, 0x2A, 0xF4,
0x20, 0x22, 0x08, 0x21, 0x21, 0x00, 0x00, 0xE5, 0x2A, 0x9F, 0x20, 0xE5, 0x21, 0xF8, 0x20, 0xEB,
0x2A, 0xF6, 0x20, 0xEB, 0xCD, 0xC5, 0x07, 0x01, 0xEF, 0x12, 0xC2, 0x43, 0x13, 0x2A, 0x1B, 0x21,
0xEB, 0x2A, 0x1D, 0x21, 0xEB, 0xCD, 0xC5, 0x07, 0xCA, 0x16, 0x13, 0x7E, 0x23, 0x23, 0xB7, 0xCD,
0x46, 0x13, 0xC3, 0x00, 0x13, 0xC1, 0xEB, 0x2A, 0x1F, 0x21, 0xEB, 0xCD, 0xC5, 0x07, 0xCA, 0x6C,
0x13, 0xCD, 0xF3, 0x17, 0x7B, 0xE5, 0x09, 0xB7, 0xF2, 0x15, 0x13, 0x22, 0x0A, 0x21, 0xE1, 0x4E,
0x06, 0x00, 0x09, 0x09, 0x23, 0xEB, 0x2A, 0x0A, 0x21, 0xEB, 0xCD, 0xC5, 0x07, 0xCA, 0x16, 0x13,
0x01, 0x35, 0x13, 0xC5, 0xF6, 0x80, 0x7E, 0x23, 0x23, 0x5E, 0x23, 0x56, 0x23, 0xF0, 0xB7, 0xC8,
0x44, 0x4D, 0x2A, 0x08, 0x21, 0xCD, 0xC5, 0x07, 0x60, 0x69, 0xD8, 0xE1, 0xE3, 0xCD, 0xC5, 0x07,
0xE3, 0xE5, 0x60, 0x69, 0xD0, 0xC1, 0xF1, 0xF1, 0xE5, 0xD5, 0xC5, 0xC9, 0xD1, 0xE1, 0x7D, 0xB4,
0xC8, 0x2B, 0x46, 0x2B, 0x4E, 0xE5, 0x2B, 0x2B, 0x6E, 0x26, 0x00, 0x09, 0x50, 0x59, 0x2B, 0x44,
0x4D, 0x2A, 0x08, 0x21, 0xCD, 0xCC, 0x04, 0xE1, 0x71, 0x23, 0x70, 0x69, 0x60, 0x2B, 0xC3, 0xE1,
0x12, 0xC5, 0xE5, 0x2A, 0x29, 0x21, 0xE3, 0xCD, 0x4B, 0x0E, 0xE3, 0xCD, 0xC6, 0x0D, 0x7E, 0xE5,
0x2A, 0x29, 0x21, 0xE5, 0x86, 0x1E, 0x1C, 0xDA, 0x11, 0x05, 0xCD, 0x4A, 0x12, 0xD1, 0xCD, 0xE2,
0x13, 0xE3, 0xCD, 0xE1, 0x13, 0xE5, 0x2A, 0x06, 0x21, 0xEB, 0xCD, 0xC8, 0x13, 0xCD, 0xC8, 0x13,
0x21, 0xE0, 0x0D, 0xE3, 0xE5, 0xC3, 0x7B, 0x12, 0xE1, 0xE3, 0x7E, 0x23, 0x23, 0x4E, 0x23, 0x46,
0x6F, 0x2C, 0x2D, 0xC8, 0x0A, 0x12, 0x03, 0x13, 0xC3, 0xD2, 0x13, 0xCD, 0xC6, 0x0D, 0x2A, 0x29,
0x21, 0xEB, 0xCD, 0xFC, 0x13, 0xEB, 0xC0, 0xD5, 0x50, 0x59, 0x1B, 0x4E, 0x2A, 0x08, 0x21, 0xCD,
0xC5, 0x07, 0xC2, 0xFA, 0x13, 0x47, 0x09, 0x22, 0x08, 0x21, 0xE1, 0xC9, 0x2A, 0xF6, 0x20, 0x2B,
0x46, 0x2B, 0x4E, 0x2B, 0x2B, 0xCD, 0xC5, 0x07, 0xC0, 0x22, 0xF6, 0x20, 0xC9, 0x01, 0x8C, 0x11,
0xC5, 0xCD, 0xDB, 0x13, 0xAF, 0x57, 0x32, 0xF2, 0x20, 0x7E, 0xB7, 0xC9, 0x01, 0x8C, 0x11, 0xC5,
0xCD, 0x11, 0x14, 0xCA, 0x1C, 0x0A, 0x23, 0x23, 0x5E, 0x23, 0x56, 0x1A, 0xC9, 0x3E, 0x01, 0xCD,
0x4A, 0x12, 0xCD, 0x26, 0x15, 0x2A, 0x06, 0x21, 0x73, 0xC1, 0xC3, 0x7B, 0x12, 0xCD, 0xD6, 0x14,
0xAF, 0xE3, 0x4F, 0xE5, 0x7E, 0xB8, 0xDA, 0x4B, 0x14, 0x78, 0x11, 0x0E, 0x00, 0xC5, 0xCD, 0xB4,
0x12, 0xC1, 0xE1, 0xE5, 0x23, 0x23, 0x46, 0x23, 0x66, 0x68, 0x06, 0x00, 0x09, 0x44, 0x4D, 0xCD,
0x4D, 0x12, 0x6F, 0xCD, 0xD1, 0x13, 0xD1, 0xCD, 0xE2, 0x13, 0xC3, 0x7B, 0x12, 0xCD, 0xD6, 0x14,
0xD1, 0xD5, 0x1A, 0x90, 0xC3, 0x41, 0x14, 0xEB, 0x7E, 0xCD, 0xDB, 0x14, 0x04, 0x05, 0xCA, 0x1C,
0x0A, 0xC5, 0x1E, 0xFF, 0xFE, 0x29, 0xCA, 0x90, 0x14, 0xCD, 0xCB, 0x07, 0x2C, 0xCD, 0x23, 0x15,
0xCD, 0xCB, 0x07, 0x29, 0xF1, 0xE3, 0x01, 0x43, 0x14, 0xC5, 0x3D, 0xBE, 0x06, 0x00, 0xD0, 0x4F,
0x7E, 0x91, 0xBB, 0x47, 0xD8, 0x43, 0xC9, 0xCD, 0x11, 0x14, 0xCA, 0xC4, 0x15, 0x5F, 0x23, 0x23,
0x7E, 0x23, 0x66, 0x6F, 0xE5, 0x19, 0x46, 0x72, 0xE3, 0xC5, 0x7E, 0xFE, 0x24, 0xC2, 0xC5, 0x14,
0xCD, 0xEF, 0x1C, 0x18, 0x0D, 0xFE, 0x25, 0xC2, 0xCF, 0x14, 0xCD, 0x5F, 0x1D, 0x18, 0x03, 0xCD,
0xAB, 0x18, 0xC1, 0xE1, 0x70, 0xC9, 0xEB, 0xCD, 0xCB, 0x07, 0x29, 0xC1, 0xD1, 0xC5, 0x43, 0xC9,
0xCD, 0x26, 0x15, 0x32, 0x84, 0x20, 0xCD, 0x83, 0x20, 0xC3, 0x8C, 0x11, 0xCD, 0x10, 0x15, 0xC3,
0x4B, 0x20, 0xCD, 0x10, 0x15, 0xF5, 0x1E, 0x00, 0x2B, 0xCD, 0x55, 0x09, 0xCA, 0x06, 0x15, 0xCD,
0xCB, 0x07, 0x2C, 0xCD, 0x23, 0x15, 0xC1, 0xCD, 0x83, 0x20, 0xAB, 0xA0, 0xCA, 0x07, 0x15, 0xC9,
0xCD, 0x23, 0x15, 0x32, 0x84, 0x20, 0x32, 0x4C, 0x20, 0xCD, 0xCB, 0x07, 0x2C, 0xC3, 0x23, 0x15,
0xCD, 0x55, 0x09, 0xCD, 0xC2, 0x0D, 0xCD, 0x01, 0x0A, 0x7A, 0xB7, 0xC2, 0x1C, 0x0A, 0x2B, 0xCD,
0x55, 0x09, 0x7B, 0xC9, 0xCD, 0x07, 0x0A, 0x1A, 0xC3, 0x8C, 0x11, 0xCD, 0xC2, 0x0D, 0xCD, 0x07,
0x0A, 0xD5, 0xCD, 0xCB, 0x07, 0x2C, 0xCD, 0x23, 0x15, 0xD1, 0x12, 0xC9, 0x21, 0x22, 0x1A, 0xCD,
0xF3, 0x17, 0xC3, 0x5E, 0x15, 0xCD, 0xF3, 0x17, 0x21, 0xC1, 0xD1, 0xCD, 0xCD, 0x17, 0x78, 0xB7,
0xC8, 0x3A, 0x2C, 0x21, 0xB7, 0xCA, 0xE5, 0x17, 0x90, 0xD2, 0x78, 0x15, 0x2F, 0x3C, 0xEB, 0xCD,
0xD5, 0x17, 0xEB, 0xCD, 0xE5, 0x17, 0xC1, 0xD1, 0xFE, 0x19, 0xD0, 0xF5, 0xCD, 0x0A, 0x18, 0x67,
0xF1, 0xCD, 0x23, 0x16, 0xB4, 0x21, 0x29, 0x21, 0xF2, 0x9E, 0x15, 0xCD, 0x03, 0x16, 0xD2, 0xE4,
0x15, 0x23, 0x34, 0xCA, 0x0C, 0x05, 0x2E, 0x01, 0xCD, 0x39, 0x16, 0xC3, 0xE4, 0x15, 0xAF, 0x90,
0x47, 0x7E, 0x9B, 0x5F, 0x23, 0x7E, 0x9A, 0x57, 0x23, 0x7E, 0x99, 0x4F, 0xDC, 0x0F, 0x16, 0x68,
0x63, 0xAF, 0x47, 0x79, 0xB7, 0xC2, 0xD1, 0x15, 0x4A, 0x54, 0x65, 0x6F, 0x78, 0xD6, 0x08, 0xFE,
0xE0, 0xC2, 0xB2, 0x15, 0xAF, 0x32, 0x2C, 0x21, 0xC9, 0x05, 0x29, 0x7A, 0x17, 0x57, 0x79, 0x8F,
0x4F, 0xF2, 0xC9, 0x15, 0x78, 0x5C, 0x45, 0xB7, 0xCA, 0xE4, 0x15, 0x21, 0x2C, 0x21, 0x86, 0x77,
0xD2, 0xC4, 0x15, 0xC8, 0x78, 0x21, 0x2C, 0x21, 0xB7, 0xFC, 0xF6, 0x15, 0x46, 0x23, 0x7E, 0xE6,
0x80, 0xA9, 0x4F, 0xC3, 0xE5, 0x17, 0x1C, 0xC0, 0x14, 0xC0, 0x0C, 0xC0, 0x0E, 0x80, 0x34, 0xC0,
0xC3, 0x0C, 0x05, 0x7E, 0x83, 0x5F, 0x23, 0x7E, 0x8A, 0x57, 0x23, 0x7E, 0x89, 0x4F, 0xC9, 0x21,
0x2D, 0x21, 0x7E, 0x2F, 0x77, 0xAF, 0x6F, 0x90, 0x47, 0x7D, 0x9B, 0x5F, 0x7D, 0x9A, 0x57, 0x7D,
0x99, 0x4F, 0xC9, 0x06, 0x00, 0xD6, 0x08, 0xDA, 0x32, 0x16, 0x43, 0x5A, 0x51, 0x0E, 0x00, 0xC3,
0x25, 0x16, 0xC6, 0x09, 0x6F, 0xAF, 0x2D, 0xC8, 0x79, 0x1F, 0x4F, 0x7A, 0x1F, 0x57, 0x7B, 0x1F,
0x5F, 0x78, 0x1F, 0x47, 0xC3, 0x35, 0x16, 0x00, 0x00, 0x00, 0x81, 0x03, 0xAA, 0x56, 0x19, 0x80,
0xF1, 0x22, 0x76, 0x80, 0x45, 0xAA, 0x38, 0x82, 0xCD, 0xA4, 0x17, 0xB7, 0xEA, 0x1C, 0x0A, 0x21,
0x2C, 0x21, 0x7E, 0x01, 0x35, 0x80, 0x11, 0xF3, 0x04, 0x90, 0xF5, 0x70, 0xD5, 0xC5, 0xCD, 0x5E,
0x15, 0xC1, 0xD1, 0x04, 0xCD, 0xFA, 0x16, 0x21, 0x47, 0x16, 0xCD, 0x55, 0x15, 0x21, 0x4B, 0x16,
0xCD, 0xEC, 0x1A, 0x01, 0x80, 0x80, 0x11, 0x00, 0x00, 0xCD, 0x5E, 0x15, 0xF1, 0xCD, 0x1F, 0x19,
0x01, 0x31, 0x80, 0x11, 0x18, 0x72, 0x21, 0xC1, 0xD1, 0xCD, 0xA4, 0x17, 0xC8, 0x2E, 0x00, 0xCD,
0x62, 0x17, 0x79, 0x32, 0x3B, 0x21, 0xEB, 0x22, 0x3C, 0x21, 0x01, 0x00, 0x00, 0x50, 0x58, 0x21,
0xAF, 0x15, 0xE5, 0x21, 0xBB, 0x16, 0xE5, 0xE5, 0x21, 0x29, 0x21, 0x7E, 0x23, 0xB7, 0xCA, 0xE7,
0x16, 0xE5, 0x2E, 0x08, 0x1F, 0x67, 0x79, 0xD2, 0xD5, 0x16, 0xE5, 0x2A, 0x3C, 0x21, 0x19, 0xEB,
0xE1, 0x3A, 0x3B, 0x21, 0x89, 0x1F, 0x4F, 0x7A, 0x1F, 0x57, 0x7B, 0x1F, 0x5F, 0x78, 0x1F, 0x47,
0x2D, 0x7C, 0xC2, 0xC4, 0x16, 0xE1, 0xC9, 0x43, 0x5A, 0x51, 0x4F, 0xC9, 0xCD, 0xD5, 0x17, 0x01,
0x20, 0x84, 0x11, 0x00, 0x00, 0xCD, 0xE5, 0x17, 0xC1, 0xD1, 0xCD, 0xA4, 0x17, 0xCA, 0x00, 0x05,
0x2E, 0xFF, 0xCD, 0x62, 0x17, 0x34, 0x34, 0x2B, 0x7E, 0x32, 0x57, 0x20, 0x2B, 0x7E, 0x32, 0x53,
0x20, 0x2B, 0x7E, 0x32, 0x4F, 0x20, 0x41, 0xEB, 0xAF, 0x4F, 0x57, 0x5F, 0x32, 0x5A, 0x20, 0xE5,
0xC5, 0x7D, 0xCD, 0x4E, 0x20, 0xDE, 0x00, 0x3F, 0xD2, 0x32, 0x17, 0x32, 0x5A, 0x20, 0xF1, 0xF1,
0x37, 0xD2, 0xC1, 0xE1, 0x79, 0x3C, 0x3D, 0x1F, 0xFA, 0xE5, 0x15, 0x17, 0x7B, 0x17, 0x5F, 0x7A,
0x17, 0x57, 0x79, 0x17, 0x4F, 0x29, 0x78, 0x17, 0x47, 0x3A, 0x5A, 0x20, 0x17, 0x32, 0x5A, 0x20,
0x79, 0xB2, 0xB3, 0xC2, 0x1F, 0x17, 0xE5, 0x21, 0x2C, 0x21, 0x35, 0xE1, 0xC2, 0x1F, 0x17, 0xC3,
0x0C, 0x05, 0x78, 0xB7, 0xCA, 0x86, 0x17, 0x7D, 0x21, 0x2C, 0x21, 0xAE, 0x80, 0x47, 0x1F, 0xA8,
0x78, 0xF2, 0x85, 0x17, 0xC6, 0x80, 0x77, 0xCA, 0xE5, 0x16, 0xCD, 0x0A, 0x18, 0x77, 0x2B, 0xC9,
0xCD, 0xA4, 0x17, 0x2F, 0xE1, 0xB7, 0xE1, 0xF2, 0xC4, 0x15, 0xC3, 0x0C, 0x05, 0xCD, 0xF0, 0x17,
0x78, 0xB7, 0xC8, 0xC6, 0x02, 0xDA, 0x0C, 0x05, 0x47, 0xCD, 0x5E, 0x15, 0x21, 0x2C, 0x21, 0x34,
0xC0, 0xC3, 0x0C, 0x05, 0x3A, 0x2C, 0x21, 0xB7, 0xC8, 0x3A, 0x2B, 0x21, 0xFE, 0x2F, 0x17, 0x9F,
0xC0, 0x3C, 0xC9, 0xCD, 0xA4, 0x17, 0x06, 0x88, 0x11, 0x00, 0x00, 0x21, 0x2C, 0x21, 0x4F, 0x70,
0x06, 0x00, 0x23, 0x36, 0x80, 0x17, 0xC3, 0xAC, 0x15, 0xCD, 0xA4, 0x17, 0xF0, 0x21, 0x2B, 0x21,
0x7E, 0xEE, 0x80, 0x77, 0xC9, 0xEB, 0x2A, 0x29, 0x21, 0xE3, 0xE5, 0x2A, 0x2B, 0x21, 0xE3, 0xE5,
0xEB, 0xC9, 0xCD, 0xF3, 0x17, 0xEB, 0x22, 0x29, 0x21, 0x60, 0x69, 0x22, 0x2B, 0x21, 0xEB, 0xC9,
0x21, 0x29, 0x21, 0x5E, 0x23, 0x56, 0x23, 0x4E, 0x23, 0x46, 0x23, 0xC9, 0x11, 0x29, 0x21, 0x06,
0x04, 0x1A, 0x77, 0x13, 0x23, 0x05, 0xC2, 0x01, 0x18, 0xC9, 0x21, 0x2B, 0x21, 0x7E, 0x07, 0x37,
0x1F, 0x77, 0x3F, 0x1F, 0x23, 0x23, 0x77, 0x79, 0x07, 0x37, 0x1F, 0x4F, 0x1F, 0xAE, 0xC9, 0x78,
0xB7, 0xCA, 0xA4, 0x17, 0x21, 0xAD, 0x17, 0xE5, 0xCD, 0xA4, 0x17, 0x79, 0xC8, 0x21, 0x2B, 0x21,
0xAE, 0x79, 0xF8, 0xCD, 0x39, 0x18, 0x1F, 0xA9, 0xC9, 0x23, 0x78, 0xBE, 0xC0, 0x2B, 0x79, 0xBE,
0xC0, 0x2B, 0x7A, 0xBE, 0xC0, 0x2B, 0x7B, 0x96, 0xC0, 0xE1, 0xE1, 0xC9, 0x47, 0x4F, 0x57, 0x5F,
0xB7, 0xC8, 0xE5, 0xCD, 0xF0, 0x17, 0xCD, 0x0A, 0x18, 0xAE, 0x67, 0xFC, 0x70, 0x18, 0x3E, 0x98,
0x90, 0xCD, 0x23, 0x16, 0x7C, 0x17, 0xDC, 0xF6, 0x15, 0x06, 0x00, 0xDC, 0x0F, 0x16, 0xE1, 0xC9,
0x1B, 0x7A, 0xA3, 0x3C, 0xC0, 0x0B, 0xC9, 0x21, 0x2C, 0x21, 0x7E, 0xFE, 0x98, 0x3A, 0x29, 0x21,
0xD0, 0x7E, 0xCD, 0x4C, 0x18, 0x36, 0x98, 0x7B, 0xF5, 0x79, 0x17, 0xCD, 0xAC, 0x15, 0xF1, 0xC9,
0x21, 0x00, 0x00, 0x78, 0xB1, 0xC8, 0x3E, 0x10, 0x29, 0xDA, 0xD0, 0x10, 0xEB, 0x29, 0xEB, 0xD2,
0xA6, 0x18, 0x09, 0xDA, 0xD0, 0x10, 0x3D, 0xC2, 0x98, 0x18, 0xC9, 0xFE, 0x2D, 0xF5, 0xCA, 0xB7,
0x18, 0xFE, 0x2B, 0xCA, 0xB7, 0x18, 0x2B, 0xCD, 0xC4, 0x15, 0x47, 0x57, 0x5F, 0x2F, 0x4F, 0xCD,
0x55, 0x09, 0xDA, 0x08, 0x19, 0xFE, 0x2E, 0xCA, 0xE3, 0x18, 0xFE, 0x45, 0xC2, 0xE7, 0x18, 0xCD,
0x55, 0x09, 0xCD, 0xFB, 0x0E, 0xCD, 0x55, 0x09, 0xDA, 0x2A, 0x19, 0x14, 0xC2, 0xE7, 0x18, 0xAF,
0x93, 0x5F, 0x0C, 0x0C, 0xCA, 0xBF, 0x18, 0xE5, 0x7B, 0x90, 0xF4, 0x00, 0x19, 0xF2, 0xF6, 0x18,
0xF5, 0xCD, 0xEC, 0x16, 0xF1, 0x3C, 0xC2, 0xEA, 0x18, 0xD1, 0xF1, 0xCC, 0xCD, 0x17, 0xEB, 0xC9,
0xC8, 0xF5, 0xCD, 0x8D, 0x17, 0xF1, 0x3D, 0xC9, 0xD5, 0x57, 0x78, 0x89, 0x47, 0xC5, 0xE5, 0xD5,
0xCD, 0x8D, 0x17, 0xF1, 0xD6, 0x30, 0xCD, 0x1F, 0x19, 0xE1, 0xC1, 0xD1, 0xC3, 0xBF, 0x18, 0xCD,
0xD5, 0x17, 0xCD, 0xB6, 0x17, 0xC1, 0xD1, 0xC3, 0x5E, 0x15, 0x7B, 0x07, 0x07, 0x83, 0x07, 0x86,
0xD6, 0x30, 0x5F, 0xC3, 0xD5, 0x18, 0xE5, 0x21, 0x95, 0x04, 0xCD, 0x9B, 0x12, 0xE1, 0xEB, 0xAF,
0x06, 0x98, 0xCD, 0xBB, 0x17, 0x21, 0x9A, 0x12, 0xE5, 0x21, 0x2E, 0x21, 0xE5, 0xCD, 0xA4, 0x17,
0x36, 0x20, 0xF2, 0x57, 0x19, 0x36, 0x2D, 0x23, 0x36, 0x30, 0xCA, 0x0D, 0x1A, 0xE5, 0xFC, 0xCD,
0x17, 0xAF, 0xF5, 0xCD, 0x13, 0x1A, 0x01, 0x43, 0x91, 0x11, 0xF8, 0x4F, 0xCD, 0x1F, 0x18, 0xB7,
0xE2, 0x84, 0x19, 0xF1, 0xCD, 0x01, 0x19, 0xF5, 0xC3, 0x66, 0x19, 0xCD, 0xEC, 0x16, 0xF1, 0x3C,
0xF5, 0xCD, 0x13, 0x1A, 0xCD, 0x4C, 0x15, 0x3C, 0xCD, 0x4C, 0x18, 0xCD, 0xE5, 0x17, 0x01, 0x06,
0x03, 0xF1, 0x81, 0x3C, 0xFA, 0xA0, 0x19, 0xFE, 0x08, 0xD2, 0xA0, 0x19, 0x3C, 0x47, 0x3E, 0x02,
0x3D, 0x3D, 0xE1, 0xF5, 0x11, 0x26, 0x1A, 0x05, 0xC2, 0xB1, 0x19, 0x36, 0x2E, 0x23, 0x36, 0x30,
0x23, 0x05, 0x36, 0x2E, 0xCC, 0xFA, 0x17, 0xC5, 0xE5, 0xD5, 0xCD, 0xF0, 0x17, 0xE1, 0x06, 0x2F,
0x04, 0x7B, 0x96, 0x5F, 0x23, 0x7A, 0x9E, 0x57, 0x23, 0x79, 0x9E, 0x4F, 0x2B, 0x2B, 0xD2, 0xC0,
0x19, 0xCD, 0x03, 0x16, 0x23, 0xCD, 0xE5, 0x17, 0xEB, 0xE1, 0x70, 0x23, 0xC1, 0x0D, 0xC2, 0xB1,
0x19, 0x05, 0xCA, 0xF1, 0x19, 0x2B, 0x7E, 0xFE, 0x30, 0xCA, 0xE5, 0x19, 0xFE, 0x2E, 0xC4, 0xFA,
0x17, 0xF1, 0xCA, 0x10, 0x1A, 0x36, 0x45, 0x23, 0x36, 0x2B, 0xF2, 0x01, 0x1A, 0x36, 0x2D, 0x2F,
0x3C, 0x06, 0x2F, 0x04, 0xD6, 0x0A, 0xD2, 0x03, 0x1A, 0xC6, 0x3A, 0x23, 0x70, 0x23, 0x77, 0x23,
0x71, 0xE1, 0xC9, 0x01, 0x74, 0x94, 0x11, 0xF7, 0x23, 0xCD, 0x1F, 0x18, 0xB7, 0xE1, 0xE2, 0x7B,
0x19, 0xE9, 0x00, 0x00, 0x00, 0x80, 0xA0, 0x86, 0x01, 0x10, 0x27, 0x00, 0xE8, 0x03, 0x00, 0x64,
0x00, 0x00, 0x0A, 0x00, 0x00, 0x01, 0x00, 0x00, 0x21, 0xCD, 0x17, 0xE3, 0xE9, 0xCD, 0xD5, 0x17,
0x21, 0x22, 0x1A, 0xCD, 0xE2, 0x17, 0xC1, 0xD1, 0xCD, 0xA4, 0x17, 0x78, 0xCA, 0x8B, 0x1A, 0xF2,
0x56, 0x1A, 0xB7, 0xCA, 0x00, 0x05, 0xB7, 0xCA, 0xC5, 0x15, 0xD5, 0xC5, 0x79, 0xF6, 0x7F, 0xCD,
0xF0, 0x17, 0xF2, 0x73, 0x1A, 0xD5, 0xC5, 0xCD, 0x77, 0x18, 0xC1, 0xD1, 0xF5, 0xCD, 0x1F, 0x18,
0xE1, 0x7C, 0x1F, 0xE1, 0x22, 0x2B, 0x21, 0xE1, 0x22, 0x29, 0x21, 0xDC, 0x38, 0x1A, 0xCC, 0xCD,
0x17, 0xD5, 0xC5, 0xCD, 0x58, 0x16, 0xC1, 0xD1, 0xCD, 0x99, 0x16, 0xCD, 0xD5, 0x17, 0x01, 0x38,
0x81, 0x11, 0x3B, 0xAA, 0xCD, 0x99, 0x16, 0x3A, 0x2C, 0x21, 0xFE, 0x88, 0xD2, 0x80, 0x17, 0xCD,
0x77, 0x18, 0xC6, 0x80, 0xC6, 0x02, 0xDA, 0x80, 0x17, 0xF5, 0x21, 0x47, 0x16, 0xCD, 0x4F, 0x15,
0xCD, 0x90, 0x16, 0xF1, 0xC1, 0xD1, 0xF5, 0xCD, 0x5B, 0x15, 0xCD, 0xCD, 0x17, 0x21, 0xCB, 0x1A,
0xCD, 0xFB, 0x1A, 0x11, 0x00, 0x00, 0xC1, 0x4A, 0xC3, 0x99, 0x16, 0x08, 0x40, 0x2E, 0x94, 0x74,
0x70, 0x4F, 0x2E, 0x77, 0x6E, 0x02, 0x88, 0x7A, 0xE6, 0xA0, 0x2A, 0x7C, 0x50, 0xAA, 0xAA, 0x7E,
0xFF, 0xFF, 0x7F, 0x7F, 0x00, 0x00, 0x80, 0x81, 0x00, 0x00, 0x00, 0x81, 0xCD, 0xD5, 0x17, 0x11,
0x97, 0x16, 0xD5, 0xE5, 0xCD, 0xF0, 0x17, 0xCD, 0x99, 0x16, 0xE1, 0xCD, 0xD5, 0x17, 0x7E, 0x23,
0xCD, 0xE2, 0x17, 0x06, 0xF1, 0xC1, 0xD1, 0x3D, 0xC8, 0xD5, 0xC5, 0xF5, 0xE5, 0xCD, 0x99, 0x16,
0xE1, 0xCD, 0xF3, 0x17, 0xE5, 0xCD, 0x5E, 0x15, 0xE1, 0xC3, 0x04, 0x1B, 0xCD, 0xA4, 0x17, 0x21,
0x5E, 0x20, 0xFA, 0x7D, 0x1B, 0x21, 0x7F, 0x20, 0xCD, 0xE2, 0x17, 0x21, 0x5E, 0x20, 0xC8, 0x86,
0xE6, 0x07, 0x06, 0x00, 0x77, 0x23, 0x87, 0x87, 0x4F, 0x09, 0xCD, 0xF3, 0x17, 0xCD, 0x99, 0x16,
0x3A, 0x5D, 0x20, 0x3C, 0xE6, 0x03, 0x06, 0x00, 0xFE, 0x01, 0x88, 0x32, 0x5D, 0x20, 0x21, 0x81,
0x1B, 0x87, 0x87, 0x4F, 0x09, 0xCD, 0x4F, 0x15, 0xCD, 0xF0, 0x17, 0x7B, 0x59, 0xEE, 0x4F, 0x4F,
0x36, 0x80, 0x2B, 0x46, 0x36, 0x80, 0x21, 0x5C, 0x20, 0x34, 0x7E, 0xD6, 0xAB, 0xC2, 0x74, 0x1B,
0x77, 0x0C, 0x15, 0x1C, 0xCD, 0xAF, 0x15, 0x21, 0x7F, 0x20, 0xC3, 0xFC, 0x17, 0x77, 0x2B, 0x77,
0x2B, 0x77, 0xC3, 0x58, 0x1B, 0x68, 0xB1, 0x46, 0x68, 0x99, 0xE9, 0x92, 0x69, 0x10, 0xD1, 0x75,
0x68, 0x21, 0xDB, 0x1B, 0xCD, 0x4F, 0x15, 0xCD, 0xD5, 0x17, 0x01, 0x49, 0x83, 0x11, 0xDB, 0x0F,
0xCD, 0xE5, 0x17, 0xC1, 0xD1, 0xCD, 0xFA, 0x16, 0xCD, 0xD5, 0x17, 0xCD, 0x77, 0x18, 0xC1, 0xD1,
0xCD, 0x5B, 0x15, 0x21, 0xDF, 0x1B, 0xCD, 0x55, 0x15, 0xCD, 0xA4, 0x17, 0x37, 0xF2, 0xC7, 0x1B,
0xCD, 0x4C, 0x15, 0xCD, 0xA4, 0x17, 0xB7, 0xF5, 0xF4, 0xCD, 0x17, 0x21, 0xDF, 0x1B, 0xCD, 0x4F,
0x15, 0xF1, 0xD4, 0xCD, 0x17, 0x21, 0xE3, 0x1B, 0xC3, 0xEC, 0x1A, 0xDB, 0x0F, 0x49, 0x81, 0x00,
0x00, 0x00, 0x7F, 0x05, 0xBA, 0xD7, 0x1E, 0x86, 0x64, 0x26, 0x99, 0x87, 0x58, 0x34, 0x23, 0x87,
0xE0, 0x5D, 0xA5, 0x86, 0xDA, 0x0F, 0x49, 0x83, 0xCD, 0xD5, 0x17, 0xCD, 0x97, 0x1B, 0xC1, 0xE1,
0xCD, 0xD5, 0x17, 0xEB, 0xCD, 0xE5, 0x17, 0xCD, 0x91, 0x1B, 0xC3, 0xF8, 0x16, 0xCD, 0xA4, 0x17,
0xFC, 0x38, 0x1A, 0xFC, 0xCD, 0x17, 0x3A, 0x2C, 0x21, 0xFE, 0x81, 0xDA, 0x2A, 0x1C, 0x01, 0x00,
0x81, 0x51, 0x59, 0xCD, 0xFA, 0x16, 0x21, 0x55, 0x15, 0xE5, 0x21, 0x34, 0x1C, 0xCD, 0xEC, 0x1A,
0x21, 0xDB, 0x1B, 0xC9, 0x09, 0x4A, 0xD7, 0x3B, 0x78, 0x02, 0x6E, 0x84, 0x7B, 0xFE, 0xC1, 0x2F,
0x7C, 0x74, 0x31, 0x9A, 0x7D, 0x84, 0x3D, 0x5A, 0x7D, 0xC8, 0x7F, 0x91, 0x7E, 0xE4, 0xBB, 0x4C,
0x7E, 0x6C, 0xAA, 0xAA, 0x7F, 0x00, 0x00, 0x00, 0x81, 0xC9, 0xD7, 0xC9, 0x3E, 0x0C, 0xC3, 0x96,
0x1D, 0xCD, 0x23, 0x15, 0x7B, 0x32, 0x87, 0x20, 0xC9, 0xCD, 0xC2, 0x0D, 0xCD, 0x07, 0x0A, 0xED,
0x53, 0x8B, 0x20, 0xED, 0x53, 0x8D, 0x20, 0xC9, 0xCD, 0x07, 0x0A, 0xD5, 0xE1, 0x46, 0x23, 0x7E,
0xC3, 0x7D, 0x11, 0xCD, 0xC2, 0x0D, 0xCD, 0x07, 0x0A, 0xD5, 0xCD, 0xCB, 0x07, 0x2C, 0xCD, 0xC2,
0x0D, 0xCD, 0x07, 0x0A, 0xE3, 0x73, 0x23, 0x72, 0xE1, 0xC9, 0xCD, 0xC5, 0x0D, 0xCD, 0x07, 0x0A,
0xC5, 0x21, 0x2E, 0x21, 0x7A, 0xFE, 0x00, 0x28, 0x0C, 0xCD, 0xD2, 0x1C, 0x78, 0xFE, 0x30, 0x28,
0x02, 0x70, 0x23, 0x71, 0x23, 0x7B, 0xCD, 0xD2, 0x1C, 0x7A, 0xFE, 0x00, 0x20, 0x05, 0x78, 0xFE,
0x30, 0x28, 0x02, 0x70, 0x23, 0x71, 0x23, 0xAF, 0x77, 0x23, 0x77, 0xC1, 0x21, 0x2E, 0x21, 0xC3,
0x2B, 0x12, 0x47, 0xE6, 0x0F, 0xFE, 0x0A, 0x38, 0x02, 0xC6, 0x07, 0xC6, 0x30, 0x4F, 0x78, 0x0F,
0x0F, 0x0F, 0x0F, 0xE6, 0x0F, 0xFE, 0x0A, 0x38, 0x02, 0xC6, 0x07, 0xC6, 0x30, 0x47, 0xC9, 0xEB,
0x21, 0x00, 0x00, 0xCD, 0x08, 0x1D, 0xDA, 0x28, 0x1D, 0x18, 0x05, 0xCD, 0x08, 0x1D, 0x38, 0x1F,
0x29, 0x29, 0x29, 0x29, 0xB5, 0x6F, 0x18, 0xF3, 0x13, 0x1A, 0xFE, 0x20, 0xCA, 0x08, 0x1D, 0xD6,
0x30, 0xD8, 0xFE, 0x0A, 0x38, 0x05, 0xD6, 0x07, 0xFE, 0x0A, 0xD8, 0xFE, 0x10, 0x3F, 0xC9, 0xEB,
0x7A, 0x4B, 0xE5, 0xCD, 0x7C, 0x11, 0xE1, 0xC9, 0x1E, 0x26, 0xC3, 0x11, 0x05, 0xCD, 0xC5, 0x0D,
0xCD, 0x07, 0x0A, 0xC5, 0x21, 0x2E, 0x21, 0x06, 0x11, 0x05, 0x78, 0xFE, 0x01, 0x28, 0x08, 0xCB,
0x13, 0xCB, 0x12, 0x30, 0xF4, 0x18, 0x04, 0xCB, 0x13, 0xCB, 0x12, 0x3E, 0x30, 0xCE, 0x00, 0x77,
0x23, 0x05, 0x20, 0xF3, 0xAF, 0x77, 0x23, 0x77, 0xC1, 0x21, 0x2E, 0x21, 0xC3, 0x2B, 0x12, 0xEB,
0x21, 0x00, 0x00, 0xCD, 0x7C, 0x1D, 0xDA, 0x8A, 0x1D, 0xD6, 0x30, 0x29, 0xB5, 0x6F, 0xCD, 0x7C,
0x1D, 0x30, 0xF6, 0xEB, 0x7A, 0x4B, 0xE5, 0xCD, 0x7C, 0x11, 0xE1, 0xC9, 0x13, 0x1A, 0xFE, 0x20,
0xCA, 0x7C, 0x1D, 0xFE, 0x30, 0xD8, 0xFE, 0x32, 0x3F, 0xC9, 0x1E, 0x28, 0xC3, 0x11, 0x05, 0xDD,
0x21, 0xFF, 0xFF, 0xC3, 0x61, 0x01, 0xC3, 0x08, 0x00, 0xC3, 0x00, 0x00, 0x3E, 0x00, 0x32, 0x92,
0x20, 0xC3, 0x68, 0x01, 0xED, 0x45, 0xF5, 0xA0, 0xC1, 0xB8, 0x3E, 0x00, 0xC9, 0xCD, 0xD6, 0x07,
0xC3, 0xFD, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
// ------------------------------------------------------------------------------
//
// Global variables
//
// ------------------------------------------------------------------------------
byte ioAddress;
byte ioData;
byte tempByte;
word indexPhase2 = 0; // Index for the bootPhase2[] array
// ------------------------------------------------------------------------------
void setup() {
// ------------------------------------------------------------------------------
//
// Local variables
//
// ------------------------------------------------------------------------------
byte data; // Data byte
word address; // External RAM current address;
// ------------------------------------------------------------------------------
// Initialize RESET_and BUSREQ_
pinMode(RESET_, OUTPUT); // Configure RESET_ and set it ACTIVE
digitalWrite(RESET_, LOW);
pinMode(WAIT_RES_, OUTPUT); // Configure WAIT_RES_ and set it ACTIVE to reset the WAIT FF (U1C)
digitalWrite(WAIT_RES_, LOW);
pinMode(USER, OUTPUT); // USER led OFF
digitalWrite(USER, HIGH);
pinMode(INT_, INPUT_PULLUP); // Configure INT_ and set it NOT ACTIVE
pinMode(INT_, OUTPUT);
digitalWrite(INT_, HIGH);
pinMode(BUSACK_, INPUT); // Configure BUSACK_ as input
pinMode(WAIT_, INPUT); // Configure WAIT_ as input
pinMode(BUSREQ_, INPUT_PULLUP); // Set BUSREQ_ HIGH
pinMode(BUSREQ_, OUTPUT);
digitalWrite(BUSREQ_, HIGH);
DDRA = 0x00; // Configure Z80 data bus D0-D7 (PA0-PA7) as input with pull-up
PORTA = 0xFF;
DDRC = DDRC & B00000011; // Configure Z80 address bus AD0-AD5 (PC2-PC7) as input with pull-up
PORTC = PORTC | B11111100;
DDRD = DDRD & B11100011; // Configure Z80 address bus AD6-AD8 (PD2-PD4) as input with pull-up
PORTD = PORTD | B00011100;
pinMode(MREQ_, INPUT_PULLUP); // Configure MREQ_ as input with pull-up
pinMode(RD_, INPUT_PULLUP); // Configure RD_ as input with pull-up
pinMode(WR_, INPUT_PULLUP); // Configure WR_ as input with pull-up
// Initialize CLK @ 4MHz. Z80 clock_freq = (Atmega_clock) / (OCR2 + 1) = (Atmega_clock) / 2
ASSR &= ~(1 << AS2); // Set Timer2 clock from system clock
TCCR2 |= (1 << CS20); // Set Timer2 clock to "no prescaling"
TCCR2 &= ~((1 << CS21) | (1 << CS22));
TCCR2 |= (1 << WGM21); // Set Timer2 CTC mode
TCCR2 &= ~(1 << WGM20);
TCCR2 |= (1 << COM20); // Set "toggle OC2 on compare match"
TCCR2 &= ~(1 << COM21);
OCR2 = 0; // Set the compare value to toggle OC2
pinMode(CLK, OUTPUT); // Set OC2 as output and start to output the clock @ 4Mhz
Serial.begin(9600);
Serial.println();
Serial.println("Z80-MBC (Mobile Breadboard Computer) - A041116");
Serial.println("IOS - I/O Subsystem - S221116");
Serial.println();
delay(1); // Wait for reset completed
digitalWrite(WAIT_RES_, HIGH); // Set WAIT_RES_ HIGH
digitalWrite(BUSREQ_, LOW); // Activate DMA request signal
delay(1);
digitalWrite(RESET_, HIGH); // Release Z80 from RESET
delay(1); // Wait for Z80 bus thee-stated
// Load Phase 1 boot payload into external RAM with DMA and using address (AD0-AD8) and data (D0-D7) bus
address = bootPhase1StrAddr; // Initialize the starting address of external RAM
Serial.println("IOS: Loading phase 1 boot program...");
pinMode(WR_, OUTPUT); // Configure WR_ as ouput and set it HIGH
digitalWrite(WR_, HIGH);
pinMode(RD_, OUTPUT); // Configure RD_ as ouput and set it HIGH
digitalWrite(RD_, HIGH);
pinMode(MREQ_, OUTPUT); // Configure MREQ_ as ouput and set it HIGH
digitalWrite(MREQ_, HIGH);
for (int i = 0; i < sizeof(bootPhase1); i++)
// Write boot program into external RAM
{
if (debugLev > 0)
{
Serial.print("DMA WRITE -> ADDR: ");
Serial.print(address, HEX);
Serial.print(" - DATA: ");
}
switch (i)
// Get the current data to write into external RAM (Compliant with the S091116 specs)
{
case 3:
// Send the LSB of the starting addres of the phase 2 boot program
data = lowByte(bootPhase2StrAddr);
break;
case 4:
// Send the MSB of the starting addres of the phase 2 boot program
data = highByte(bootPhase2StrAddr);
break;
case 5:
// Send the LSB of the lenght in bytes of the phase 2 boot program
data = lowByte(sizeof(bootPhase2));
break;
case 6:
// Send the MSB of the lenght in bytes of the phase 2 boot program
data = highByte(sizeof(bootPhase2));
break;
default:
// Get a byte of the phase 1 payload
data = pgm_read_byte(&bootPhase1[i]);
break;
}
if (debugLev > 0)
{
if (data < 0x10) Serial.print("0");
Serial.println(data, HEX);
Serial.println(" 76543210 76543210");
Serial.print("PORTC=");
printBinaryByte(PORTC);
Serial.print(" PORTD=");
printBinaryByte(PORTD);
Serial.println();
}
DDRA = 0xFF; // Configure Z80 data bus D0-D7 (PA0-PA7) as output
PORTA = data; // Current output on data bus
DDRC = DDRC | B11111100; // Configure Z80 address bus AD0-AD5 (PC2-PC7) as output
DDRD = DDRD | B00011100; // Configure Z80 address bus AD6-AD8 (PD2-PD4) as output
PORTC = (PORTC & B00000011) | ((lowByte(address) << 2) & B11111100); // Output address AD0-AD5 (PC2-PC7)
PORTD = (PORTD & B11100011) | (byte(address >> 4 ) & B00011100); // Output address AD6-AD8 (PD2-PD4)
//PORTC = (PORTC & B11111101) | ((highByte(address) & B00000100) >> 1); // Output address AD10 (PC1)
digitalWrite(MREQ_, LOW); // Enable external RAM /CE1 pin
digitalWrite(WR_, LOW); // Write data into current address of the external RAM (10us 1-0-1 pulse)
digitalWrite(WR_, HIGH);
address++; // Set next address
}
Serial.println("IOS: Loading phase 1 done.");
// Release Z80 address AD0-AD8 and data D0-D7 bus and run the Z80 CPU
pinMode(WR_, INPUT_PULLUP); // Configure WR_ as input with pull-up
pinMode(WR_, INPUT);
pinMode(RD_, INPUT_PULLUP); // Configure RD_ as input with pull-up
pinMode(RD_, INPUT);
pinMode(MREQ_, INPUT_PULLUP); // Configure MREQ_ as input with pull-up
DDRA = 0x00; // Configure Z80 data bus D0-D7 (PA0-PA7) as input with pull-up
PORTA = 0xFF;
DDRC = DDRC & B00000011; // Configure Z80 address bus AD0-AD5 (PC2-PC7) as input with pull-up
PORTC = PORTC | B11111100;
DDRD = DDRD & B11100011; // Configure Z80 address bus AD6-AD8 (PD2-PD4) as input with pull-up
PORTD = PORTD | B00011100;
digitalWrite(RESET_, LOW); // Activate Z80 RESET_ signal
digitalWrite(BUSREQ_, HIGH); // Release Z80 from DMA
digitalWrite(RESET_, HIGH); // Release Z80 from RESET. Z80 is running from now.
Serial.println("IOS: Z80 is running from now.");
Serial.println();
}
// ------------------------------------------------------------------------------
void loop() {
if (!digitalRead(WAIT_))
// IO operaton requested
{
if (!digitalRead(WR_))
// IO WRITE operation requested
{
ioAddress = PINC >> 2; // Read Z80 address bus AD0-AD5 (PC2-PC7)
ioAddress = (ioAddress & B00111111) | ((PIND << 4) & B11000000); // Read Z80 address bus AD6-AD7 (PD2-PD3)
ioData = PINA; // Read Z80 data bus D0-D7 (PA0-PA7)
if (debugLev > 1)
{
Serial.print("IOS: I/O WRITE operation requested");
Serial.print(" - DATA: ");
if (ioData < 0x10) Serial.print("0");
Serial.print(ioData, HEX);
Serial.print(" ");
printBinaryByte(ioData);
Serial.print(" ADDR: ");
if (ioAddress < 0x10) Serial.print("0");
Serial.print(ioAddress, HEX);
Serial.print(" ");
printBinaryByte(ioAddress);
Serial.println();
}
switch (ioAddress)
// Execute the requested I/O WRITE operation
{
case 0x00:
// USER LED: I/O DATA: D7 D6 D5 D4 D3 D2 D1 D0
// ---------------------------------------------------------
// x x x x x x x 0 USER Led off
// x x x x x x x 1 USER Led on
if (ioData & B00000001) digitalWrite(USER, LOW);
else digitalWrite(USER, HIGH);
break;
case 0x01:
// SERIAL TX: I/O DATA: D7 D6 D5 D4 D3 D2 D1 D0
// ---------------------------------------------------------
// D7 D6 D5 D4 D3 D2 D1 D0 ASCII char to be sent to serial
Serial.write(ioData);
break;
}
digitalWrite(BUSREQ_, LOW); // Request for a DMA
digitalWrite(WAIT_RES_, LOW); // Reset WAIT FF exiting from WAIT state
digitalWrite(WAIT_RES_, HIGH); // Now Z80 is in DMA, so it's safe set WAIT_RES_ HIGH again
digitalWrite(BUSREQ_, HIGH); // Resume Z80 from DMA
}
else
if (!digitalRead(RD_))
// IO READ operation requested
{
ioAddress = PINC >> 2; // Read Z80 address bus AD0-AD5 (PC2-PC7)
ioAddress = (ioAddress & B00111111) | ((PIND << 4) & B11000000); // Read Z80 address bus AD6-AD7 (PD2-PD3)
switch (ioAddress)
// Execute the requested I/O READ operation
{
case 0x00:
// USER KEY: I/O DATA: D7 D6 D5 D4 D3 D2 D1 D0
// ---------------------------------------------------------
// 0 0 0 0 0 0 0 0 USER Key not pressed
// 0 0 0 0 0 0 0 1 USER Key pressed
tempByte = digitalRead(USER); // Save USER led status
pinMode(USER, INPUT_PULLUP); // Read USER Key
ioData = !digitalRead(USER);
pinMode(USER, OUTPUT);
digitalWrite(USER, tempByte); // Restore USER led status
break;
case 0x01:
// SERIAL RX: I/O DATA: D7 D6 D5 D4 D3 D2 D1 D0
// ---------------------------------------------------------
// D7 D6 D5 D4 D3 D2 D1 D0 ASCII char read from serial
//
// NOTE 1: if there is no input char, a value 0xFF is forced as input char.
// NOTE 2: the INT_ signal is always reset (set to HIGH) after this I/O operation.
ioData = 0xFF;
if (Serial.available() > 0) ioData = Serial.read();
digitalWrite(INT_, HIGH);
break;
case 0x02:
// READ BOOT PHASE 2 PAYLOAD:
// I/O DATA: D7 D6 D5 D4 D3 D2 D1 D0
// ---------------------------------------------------------
// D7 D6 D5 D4 D3 D2 D1 D0 current byte of bootPhase2[]
//
// NOTE 1: a new byte is read every I/O read operation, and the pointer is automatically incremented to next byte
// every I/O read operation.
// NOTE 2: a value 0x00 is forced as output byte for successive readings if the end of bootPhase2[] is reached.
if (indexPhase2 < sizeof(bootPhase2)) ioData = pgm_read_byte(&bootPhase2[indexPhase2]);
else ioData = 0;
indexPhase2++;
break;
}
if (debugLev > 1)
{
Serial.print("IOS: I/O READ operation requested");
Serial.print(" - DATA: ");
if (ioData < 0x10) Serial.print("0");
Serial.print(ioData, HEX);
Serial.print(" ");
printBinaryByte(ioData);
Serial.print(" ADDR: ");
if (ioAddress < 0x10) Serial.print("0");
Serial.print(ioAddress, HEX);
Serial.print(" ");
printBinaryByte(ioAddress);
Serial.println();
}
DDRA = 0xFF; // Configure Z80 data bus D0-D7 (PA0-PA7) as output
PORTA = ioData; // Current output on data bus
digitalWrite(BUSREQ_, LOW); // Request for a DMA
digitalWrite(WAIT_RES_, LOW); // Now is safe reset WAIT FF (exiting from WAIT state)
delayMicroseconds(2); // Wait 2us just to be sure that Z80 read the data
DDRA = 0x00; // Configure Z80 data bus D0-D7 (PA0-PA7) as input with pull-up
PORTA = 0xFF;
digitalWrite(WAIT_RES_, HIGH); // Now Z80 is in DMA, so it's safe set WAIT_RES_ HIGH again
digitalWrite(BUSREQ_, HIGH); // Resume Z80 from DMA
}
else
// INTERRUPT operation setting IORQ_ LOW, so nothing to do
{
if (debugLev > 1) Serial.println("IOS: INT operation (nothing to do)");
digitalWrite(BUSREQ_, LOW); // Request for a DMA
digitalWrite(WAIT_RES_, LOW); // Reset WAIT FF exiting from WAIT state
digitalWrite(WAIT_RES_, HIGH); // Now Z80 is in DMA, so it's safe set WAIT_RES_ HIGH again
digitalWrite(BUSREQ_, HIGH); // Resume Z80 from DMA
}
}
}
// ------------------------------------------------------------------------------
void printBinaryByte(byte value)
{
for (byte mask = 0x80; mask; mask >>= 1)
{
Serial.print((mask & value) ? '1' : '0');
}
}
// ------------------------------------------------------------------------------
void serialEvent()
// Set INT_ to ACTIVE if there are received chars from serial to read
{
if (Serial.available()) digitalWrite(INT_, LOW);
}
Comments