Код:
// ZX-Spectrum FDD Emulator
//
//#include <petit_fatfs.h>
#define SIDE_SEL PC0 // SIDE SELECT (INPUT)
#define DRIVE_SEL PC1 // DRIVE SELECT CONNECT DS0-DS3 using jumper (INPUT) /// not used yet
#define MOTOR_ON PC2 // MOTOR ON (INPUT)
#define WRT_GATE PB0 // WRITE GATE (INPUT) /// not used yet
#define WRT_DATA PB1 // WRITE DATA (INPUT) /// not used yet
#define READ_DATA PD1 // READ_DATA (OUTPUT) /// defined in USART
#define STEP PD2 // STEP (INPUT)
#define DIR_SEL PD3 // DIRECTION SELECT (INPUT)
// PD4 UNABLE TO USE!!
#define INDEX PD5 // INDEX (OUTPUT)
#define TRK00 PD6 // TRACK 00 (OUTPUT)
#define WP PD7 // WRITE PROTECT (OUTPUT)
uint8_t sector_header[64]; // sector header
uint8_t sector_data[256]; // sector data
// STATE variable values
// 0 - TRACK HEADER
// 1 - SECTOR HEADER
// 2 - SECTOR DATA
// 3 - SECTOR FOOTER
// 4 - TRACK FOOTER
register uint8_t XH_Save asm("r2");
register uint8_t XL_Save asm("r3");
register uint8_t ZH_Save asm("r4");
register uint8_t ZL_Save asm("r5");
register volatile uint8_t state asm("r6");
register volatile uint8_t SREGSave asm("r7");
register volatile uint8_t sector_byte asm("r8");
register volatile uint8_t track asm("r9");
register volatile uint8_t sector asm("r10");
register volatile uint8_t side asm("r11");
register volatile uint8_t data_sent asm("r12");
register volatile uint8_t second_byte asm("r13");
register volatile uint8_t prev_byte asm("r14");
register volatile uint8_t b_index asm("r17");
register volatile uint8_t tmp asm("r19");
//register volatile uint8_t trk00 = 0;
uint16_t CRC;
uint8_t MFM_tab[32] =
{
0xAA,0xA9,0xA4,0xA5,0x92,0x91,0x94,0x95,0x4A,0x49,0x44,0x45,0x52,0x51,0x54,0x55,
0x2A,0x29,0x24,0x25,0x12,0x11,0x14,0x15,0x4A,0x49,0x44,0x45,0x52,0x51,0x54,0x55,
};
// STEP pin interrupt
ISR(INT0_vect)
{
if ((PIND & (1 << DIR_SEL))==0) {
track++;
if (track > 79) track = 79; // !!!!!!!!!!!!!!!! use max track calculated on mounting TRD
}
else
{
if (track > 0) track--;
}
sector = 1;
}
ISR(USART_UDRE_vect, ISR_NAKED)
{
asm ("in r7,0x3F"); // save SREG
asm ("mov r2,r24"); // save XH
asm ("mov r3,r25"); // save XL
asm ("mov r4,r30"); // save ZH
asm ("mov r5,r31"); // save ZL
if (!tmp) // it is ok, as MFM_tab doesn't have zero values
{ // Send first MFM byte
// GET DATA BYTE (REAL DATA NOT MFM)
switch (state)
{
case 0: // ------------------------------------------------------------
// send track GAP
switch (b_index)
{
case 0:
// set index LOW
PORTD &= ~(1 << INDEX);
sector_byte = 0x4E;
//set TRK00 LOW or HIGH
if (track == 0) PORTD &= ~(1 << TRK00); else PORTD |= (1 << TRK00);
break;
case 78:
// set index HIGH
PORTD |= (1 << INDEX);
break;
case 80:
sector_byte = 0;
break;
case 92:
sector_byte = 0xC2; // translate this value!
case 93:
case 94:
second_byte = 0x24;
break;
case 95:
sector_byte = 0xFC;
break;
case 96:
sector_byte = 0x4E;
break;
}
b_index++;
if (b_index != 146) break;
state = 1;
b_index = 0;
break;
case 1: // ------------------------------------------------------------
switch (b_index)
{
case 0:
CRC = 0xB230;
CRC ^= track*256;
break;
case 1:
case 2:
case 3:
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
break;
case 4:
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
tmp = PINC;
tmp ^= 1;
tmp &= 1;
side = tmp;
break;
case 5:
sector_header[16] = track;
sector_header[17] = side;
CRC ^= side*256;
break;
case 6:
case 7:
case 8:
case 9:
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
break;
case 10:
CRC ^= sector*256;
break;
case 11:
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
break;
case 12:
case 13:
case 14:
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
second_byte = 0x89;
break;
case 15:
sector_header[18] = sector;
CRC ^= 256; // sector size;
break;
case 16:
case 17:
case 18:
case 19:
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
break;
case 20:
sector_header[20] = (byte)(CRC >> 8);
break;
case 21:
sector_header[21] = (byte)CRC;
/*if(sector == 1 && side == 0 && CRC != 0xFA0C) {
cli();
while(1);
}*/
break;
case 56:
case 57:
case 58:
second_byte = 0x89;
break;
}
// send sector bytes before data
sector_byte = sector_header[b_index]; // pre-get new byte from buffer
b_index++;
if (b_index != 60) break;
b_index = 0;
state = 2;
// START GENERATING CRC HERE, PRE-CALC value for A1,A1,A1,FB = 0xE295
CRC = 0xE295; // next CRC value
data_sent = 0;
break;
case 2: // ------------------------------------------------------------
// get sector data values
sector_byte = sector_data[b_index]; // pre-get new byte from buffer
// CALCULATE CRC HERE!
CRC ^= sector_byte << 8; // sector size;
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
CRC = CRC & 0x8000 ? (CRC << 1) ^ 0x1021 : CRC << 1;
if (b_index != 255)
{
b_index++;
break;
}
state = 3;
b_index = 0;
break;
case 3:
// send CRC + sector footer
if (b_index == 0)
sector_byte = (byte)(CRC >> 8);
else if (b_index == 1)
sector_byte = (byte)CRC;
else sector_byte = 0x4E;
b_index++;
if (b_index != 24) break;
if (sector <= 15)
{
sector++; // increase sector
data_sent = 1;
state = 1;
b_index = 0;
break;
}
sector = 1;
data_sent = 1;
state = 4;
b_index = 0;
break;
case 4:
// send track footer
sector_byte = 0x4E;
b_index++;
if (b_index != 80) break;
state = 0;
b_index = 0;
break;
}
// PRE-FETCH END
// tmp = sector_byte;
// tmp >>= 4;
asm(
"mov r19,r8\n" //tmp = sector_byte;
"swap r19\n" //tmp >>= 4; -------------
"andi r19,0x0f" // -----------------------
);
tmp = MFM_tab[tmp]; // get first MFM byte from table
if((prev_byte & 1) && !(sector_byte & 0x80)) tmp &= 0x7F;
UDR0 = ~tmp; // put byte to send buffer
}
else
{ // Send second MFM byte
prev_byte = sector_byte;
if (second_byte == 0)
{
tmp = sector_byte;
tmp &= 0x1f;
tmp = MFM_tab[tmp]; // get second MFM byte from table to "tmp"
}
else
{
tmp = second_byte;
second_byte = 0;
}
UDR0 = ~tmp; // put byte to send buffer
tmp = 0; // this is important!
}
asm ("mov r31,r5"); // restore ZL
asm ("mov r30,r4"); // restore ZH
asm ("mov r25,r3"); // restore XL
asm ("mov r24,r2"); // restore XH
asm ("out 0x3F,r7"); // restore SREG
reti();
}
void prepare_sector_header()
{
// Address field
byte i;
for(i=0; i <= 11; i++) sector_header[i] = 0x00; // 0x00(0)-0x0B(11) sync field
for(i=12; i <= 14; i++) sector_header[i] = 0xA1; // 0x0C(12)-0x0E(14) 3x0xA1
sector_header[15] = 0xFE; // 0x0F(15) 0xFE
// TRACK, SIDE, SECTOR
sector_header[16] = 0x00; // 0x10(16) track
sector_header[17] = 0x00; // 0x11(17) side
sector_header[18] = 0x01; // 0x12(18) sector
sector_header[19] = 0x01; // 0x13(19) sector len (256 bytes)
sector_header[20] = 0xFA; // 0x14(20) CRC1 for trk=0, side=0, sector=1
sector_header[21] = 0x0C; // 0x15(21) CRC2
// GAP 2
for(i=22; i <= 43; i++) sector_header[i] = 0x4E; // 0x16(22)-0x2B
// DATA field
for(i=44; i <= 55; i++) sector_header[i] = 0x00; // 0x2C(44)-0x37 sync field
for(i=56; i <= 58; i++) sector_header[i] = 0xA1; // 0x38(56)-0x3A
sector_header[59] = 0xFB; // 0x3B(59)
}
//alignas(256)
const byte track0[4096] PROGMEM =
{
0x62, 0x6F, 0x6F, 0x74, 0x20, 0x20, 0x20, 0x20, 0x42, 0xB4, 0x00, 0xB4, 0x00, 0x23, 0x00, 0x01,
0x46, 0x55, 0x4C, 0x4C, 0x20, 0x54, 0x48, 0x52, 0x42, 0x6D, 0x00, 0x6D, 0x00, 0x01, 0x03, 0x03,
0x66, 0x74, 0x31, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x40, 0x9C, 0x00, 0x12, 0x12, 0x04, 0x03,
0x66, 0x74, 0x32, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0xB4, 0x5F, 0x0A, 0x6E, 0x6F, 0x06, 0x04,
0x52, 0x41, 0x49, 0x4E, 0x42, 0x4F, 0x57, 0x2B, 0x42, 0x08, 0x01, 0x08, 0x01, 0x02, 0x05, 0x0B,
0x52, 0x41, 0x49, 0x4E, 0x42, 0x2E, 0x2B, 0x24, 0x43, 0x00, 0x40, 0x00, 0x1B, 0x1B, 0x07, 0x0B,
0x52, 0x41, 0x49, 0x4E, 0x42, 0x2E, 0x2B, 0x63, 0x43, 0xA8, 0x61, 0x58, 0x9E, 0x9F, 0x02, 0x0D,
0x52, 0x41, 0x49, 0x4E, 0x42, 0x2E, 0x2B, 0x73, 0x43, 0x00, 0x40, 0x08, 0x07, 0x08, 0x01, 0x17,
0x52, 0x41, 0x49, 0x31, 0x20, 0x20, 0x20, 0x20, 0x43, 0x98, 0x00, 0x57, 0x1A, 0x1B, 0x09, 0x17,
0x52, 0x41, 0x49, 0x32, 0x20, 0x20, 0x20, 0x20, 0x43, 0x98, 0x00, 0x1A, 0x1B, 0x1C, 0x04, 0x19,
0x52, 0x41, 0x49, 0x33, 0x20, 0x20, 0x20, 0x20, 0x43, 0x98, 0x00, 0x13, 0x1D, 0x1E, 0x00, 0x1B,
0x52, 0x41, 0x49, 0x34, 0x20, 0x20, 0x20, 0x20, 0x43, 0x98, 0x00, 0x26, 0x1D, 0x1E, 0x0E, 0x1C,
0x52, 0x41, 0x49, 0x35, 0x20, 0x20, 0x20, 0x20, 0x43, 0x98, 0x00, 0x92, 0x1C, 0x1D, 0x0C, 0x1E,
0x52, 0x41, 0x49, 0x36, 0x20, 0x20, 0x20, 0x20, 0x43, 0x98, 0x00, 0x08, 0x1E, 0x1F, 0x09, 0x20,
0x52, 0x41, 0x49, 0x37, 0x20, 0x20, 0x20, 0x20, 0x43, 0x98, 0x00, 0x10, 0x1C, 0x1D, 0x08, 0x22,
0x52, 0x41, 0x49, 0x38, 0x20, 0x20, 0x20, 0x20, 0x43, 0x98, 0x00, 0xE3, 0x1F, 0x20, 0x05, 0x24,
0x50, 0x2E, 0x42, 0x4F, 0x41, 0x54, 0x34, 0x38, 0x42, 0x1F, 0x01, 0xF9, 0x00, 0x02, 0x05, 0x26,
0x50, 0x2E, 0x42, 0x31, 0x20, 0x20, 0x20, 0x20, 0x43, 0xFF, 0x00, 0x00, 0x1B, 0x1B, 0x07, 0x26,
0x50, 0x2E, 0x42, 0x32, 0x20, 0x20, 0x20, 0x20, 0x43, 0xA8, 0x61, 0x60, 0x9B, 0x9C, 0x02, 0x28,
0x53, 0x54, 0x5F, 0x43, 0x4F, 0x42, 0x52, 0x41, 0x42, 0xFF, 0x00, 0xEC, 0x00, 0x02, 0x0E, 0x31,
0x53, 0x31, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0xBE, 0x6E, 0xCB, 0x07, 0x08, 0x00, 0x32,
0x53, 0x32, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0xA8, 0x61, 0x58, 0x9E, 0x9F, 0x08, 0x32,
0x48, 0x49, 0x47, 0x48, 0x5F, 0x53, 0x5F, 0x52, 0x42, 0xE9, 0x00, 0xE9, 0x00, 0x01, 0x07, 0x3C,
0x48, 0x53, 0x31, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x00, 0x40, 0x00, 0x1B, 0x1B, 0x08, 0x3C,
0x48, 0x53, 0x32, 0x20, 0x20, 0x20, 0x20, 0x20, 0x43, 0x00, 0x66, 0x00, 0x9A, 0x9A, 0x03, 0x3E,
0x53, 0x41, 0x49, 0x47, 0x4F, 0x4E, 0x31, 0x52, 0x42, 0x47, 0x01, 0x34, 0x01, 0x02, 0x0D, 0x47,
0x53, 0x43, 0x31, 0x32, 0x20, 0x20, 0x20, 0x20, 0x43, 0x00, 0x7C, 0x00, 0x03, 0x03, 0x0F, 0x47,
0x53, 0x43, 0x31, 0x31, 0x20, 0x20, 0x20, 0x20, 0x43, 0xA8, 0x61, 0x5A, 0x64, 0x65, 0x02, 0x48,
0x53, 0x43, 0x31, 0x24, 0x20, 0x20, 0x20, 0x20, 0x43, 0xBE, 0x6E, 0x33, 0x0B, 0x0C, 0x07, 0x4E,
0x53, 0x41, 0x4E, 0x58, 0x5F, 0x52, 0x55, 0x53, 0x42, 0x33, 0x02, 0x20, 0x02, 0x03, 0x03, 0x4F,
0x53, 0x41, 0x4E, 0x58, 0x2E, 0x31, 0x52, 0x20, 0x43, 0xA8, 0x61, 0x12, 0x3E, 0x3F, 0x06, 0x4F,
0x53, 0x41, 0x4E, 0x58, 0x2E, 0x32, 0x52, 0x20, 0x43, 0xF0, 0x6E, 0x00, 0x03, 0x03, 0x05, 0x53,
0x43, 0x2E, 0x53, 0x68, 0x65, 0x72, 0x77, 0x2E, 0x42, 0x66, 0x00, 0x66, 0x00, 0xA9, 0x08, 0x53,
0x4F, 0x56, 0x45, 0x52, 0x2E, 0x52, 0x55, 0x53, 0x42, 0x3F, 0x01, 0x2C, 0x01, 0x02, 0x01, 0x5E,
0x6F, 0x76, 0x6C, 0x31, 0x20, 0x20, 0x20, 0x20, 0x43, 0x40, 0x9C, 0xBA, 0x10, 0x11, 0x03, 0x5E,
0x6F, 0x76, 0x6C, 0x32, 0x20, 0x20, 0x20, 0x20, 0x43, 0xA8, 0x61, 0xA9, 0x99, 0x9A, 0x04, 0x5F,
0x6F, 0x76, 0x6C, 0x33, 0x20, 0x20, 0x20, 0x20, 0x43, 0x00, 0x7C, 0x00, 0x03, 0x03, 0x0E, 0x68,
0x56, 0x49, 0x58, 0x45, 0x4E, 0x2D, 0x33, 0x20, 0x42, 0xA5, 0x00, 0xA5, 0x00, 0xB3, 0x01, 0x69,
0x46, 0x52, 0x55, 0x49, 0x54, 0x2D, 0x49, 0x49, 0x42, 0x64, 0x00, 0x64, 0x00, 0x01, 0x04, 0x74,
0x46, 0x52, 0x55, 0x49, 0x54, 0x5F, 0x34, 0x38, 0x43, 0xC0, 0x5E, 0xBB, 0x95, 0x96, 0x05, 0x74,
0x57, 0x41, 0x54, 0x45, 0x52, 0x4D, 0x49, 0x4C, 0x42, 0x10, 0x01, 0x10, 0x01, 0x02, 0x0B, 0x7D,
0x57, 0x4D, 0x34, 0x38, 0x2F, 0x31, 0x32, 0x38, 0x43, 0x00, 0x40, 0x00, 0x00, 0xFF, 0x0D, 0x7D,
0x4B, 0x61, 0x62, 0x61, 0x6C, 0x69, 0x73, 0x74, 0x42, 0x00, 0x03, 0x00, 0x03, 0xD7, 0x0C, 0x8D,
0x55, 0x44, 0x41, 0x42, 0x2E, 0x52, 0x20, 0x20, 0x42, 0x24, 0x10, 0x24, 0x10, 0x11, 0x03, 0x9B,
0x75, 0x64, 0x61, 0x76, 0x20, 0x20, 0x20, 0x20, 0x43, 0x18, 0xF6, 0xE8, 0x09, 0x0A, 0x04, 0x9C,
0x00, 0x6F, 0x6F, 0x74, 0x20, 0x20, 0x20, 0x20, 0x42, 0xB4, 0x00, 0xB4, 0x00, 0x23, 0x02, 0x9B,
0x00, 0x61, 0x72, 0x75, 0x6D, 0x61, 0x7E, 0x32, 0x43, 0x00, 0x80, 0xFF, 0x05, 0x06, 0x02, 0x23,
0x00, 0x65, 0x73, 0x73, 0x69, 0x79, 0x61, 0x20, 0x43, 0x00, 0x80, 0x90, 0x05, 0x06, 0x08, 0x23,
0x00, 0x6F, 0x75, 0x6E, 0x64, 0x6D, 0x7E, 0x31, 0x43, 0x00, 0x80, 0xE4, 0x09, 0x0A, 0x0E, 0x23,
0x00, 0x74, 0x61, 0x72, 0x74, 0x32, 0x20, 0x20, 0x43, 0x00, 0x80, 0x76, 0x06, 0x07, 0x08, 0x24,
0x00, 0x68, 0x65, 0x66, 0x6C, 0x61, 0x7E, 0x31, 0x43, 0x00, 0x80, 0x51, 0x03, 0x04, 0x0F, 0x24,
0x00, 0x6F, 0x72, 0x6C, 0x64, 0x20, 0x20, 0x20, 0x43, 0x00, 0x80, 0xF7, 0x02, 0x03, 0x03, 0x25,
0x00, 0x78, 0x63, 0x6C, 0x75, 0x62, 0x7E, 0x31, 0x43, 0x00, 0x80, 0x16, 0x05, 0x06, 0x06, 0x25,
0x00, 0x78, 0x63, 0x6C, 0x75, 0x62, 0x7E, 0x32, 0x43, 0x00, 0x80, 0x86, 0x07, 0x08, 0x0C, 0x25,
0x00, 0x78, 0x63, 0x6C, 0x75, 0x62, 0x7E, 0x33, 0x43, 0x00, 0x80, 0xD6, 0x0D, 0x0E, 0x04, 0x26,
0x00, 0x78, 0x63, 0x6C, 0x75, 0x62, 0x7E, 0x34, 0x43, 0x00, 0x80, 0x4C, 0x08, 0x09, 0x02, 0x27,
0x00, 0x78, 0x63, 0x6C, 0x75, 0x62, 0x7E, 0x35, 0x43, 0x00, 0x80, 0xBA, 0x0A, 0x0B, 0x0B, 0x27,
0x00, 0x78, 0x63, 0x6C, 0x75, 0x62, 0x7E, 0x36, 0x43, 0x00, 0x80, 0x5F, 0x06, 0x07, 0x06, 0x28,
0x00, 0x78, 0x63, 0x6C, 0x75, 0x62, 0x7E, 0x37, 0x43, 0x00, 0x80, 0xDE, 0x08, 0x09, 0x0D, 0x28,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x61, 0x7E, 0x31, 0x43, 0x00, 0x80, 0xD9, 0x0A, 0x0B, 0x06, 0x29,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x61, 0x7E, 0x32, 0x43, 0x00, 0x80, 0x9B, 0x07, 0x08, 0x01, 0x2A,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x61, 0x7E, 0x33, 0x43, 0x00, 0x80, 0x7B, 0x0A, 0x0B, 0x09, 0x2A,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x61, 0x7E, 0x34, 0x43, 0x00, 0x80, 0xC1, 0x09, 0x0A, 0x04, 0x2B,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x61, 0x7E, 0x36, 0x43, 0x00, 0x80, 0x27, 0x0D, 0x0E, 0x0E, 0x2B,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x61, 0x7E, 0x37, 0x43, 0x00, 0x80, 0x64, 0x13, 0x14, 0x0C, 0x2C,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x61, 0x7E, 0x38, 0x43, 0x00, 0x80, 0xD5, 0x08, 0x09, 0x00, 0x2E,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x61, 0x7E, 0x39, 0x43, 0x00, 0x80, 0xC0, 0x09, 0x0A, 0x09, 0x2E,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x7E, 0x31, 0x30, 0x43, 0x00, 0x80, 0x08, 0x0B, 0x0C, 0x03, 0x2F,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x7E, 0x31, 0x31, 0x43, 0x00, 0x80, 0x01, 0x07, 0x08, 0x0F, 0x2F,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x7E, 0x31, 0x32, 0x43, 0x00, 0x80, 0x8B, 0x07, 0x08, 0x07, 0x30,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x7E, 0x31, 0x33, 0x43, 0x00, 0x80, 0x98, 0x06, 0x07, 0x0F, 0x30,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x7E, 0x31, 0x34, 0x43, 0x00, 0x80, 0x8E, 0x10, 0x11, 0x06, 0x31,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x7E, 0x31, 0x35, 0x43, 0x00, 0x80, 0xF7, 0x06, 0x07, 0x07, 0x32,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x7E, 0x31, 0x36, 0x43, 0x00, 0x80, 0xF1, 0x06, 0x07, 0x0E, 0x32,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x7E, 0x31, 0x37, 0x43, 0x00, 0x80, 0x00, 0x0A, 0x0A, 0x05, 0x33,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x7E, 0x31, 0x38, 0x43, 0x00, 0x80, 0x38, 0x0E, 0x0F, 0x0F, 0x33,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x7E, 0x31, 0x39, 0x43, 0x00, 0x80, 0xEA, 0x04, 0x05, 0x0E, 0x34,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x7E, 0x32, 0x30, 0x43, 0x00, 0x80, 0x57, 0x0A, 0x0B, 0x03, 0x35,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x7E, 0x32, 0x31, 0x43, 0x00, 0x80, 0xC4, 0x05, 0x06, 0x0E, 0x35,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x7E, 0x32, 0x32, 0x43, 0x00, 0x80, 0x81, 0x06, 0x07, 0x04, 0x36,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x7E, 0x32, 0x33, 0x43, 0x00, 0x80, 0xAD, 0x16, 0x17, 0x0B, 0x36,
0x00, 0x75, 0x6E, 0x65, 0x72, 0x7E, 0x32, 0x34, 0x43, 0x00, 0x80, 0xB5, 0x09, 0x0A, 0x02, 0x38,
0x00, 0x65, 0x77, 0x79, 0x65, 0x61, 0x7E, 0x31, 0x43, 0x00, 0x80, 0xC6, 0x06, 0x07, 0x0C, 0x38,
0x00, 0x61, 0x72, 0x75, 0x6D, 0x61, 0x7E, 0x31, 0x43, 0x00, 0x80, 0x1E, 0x03, 0x04, 0x03, 0x39,
0x00, 0x69, 0x6E, 0x67, 0x62, 0x6F, 0x7E, 0x31, 0x43, 0x00, 0x80, 0x49, 0x05, 0x06, 0x07, 0x39,
0x00, 0x69, 0x6E, 0x67, 0x62, 0x6F, 0x7E, 0x32, 0x43, 0x00, 0x80, 0xF2, 0x05, 0x06, 0x0D, 0x39,
0x00, 0x61, 0x74, 0x76, 0x61, 0x39, 0x20, 0x20, 0x43, 0x00, 0x80, 0x5A, 0x06, 0x07, 0x03, 0x3A,
0x00, 0x5F, 0x63, 0x61, 0x72, 0x74, 0x20, 0x20, 0x43, 0x00, 0x80, 0x65, 0x06, 0x07, 0x0A, 0x3A,
0x00, 0x72, 0x65, 0x65, 0x6C, 0x6F, 0x76, 0x65, 0x43, 0x00, 0x80, 0x03, 0x07, 0x08, 0x01, 0x3B,
0x00, 0x75, 0x6E, 0x6E, 0x79, 0x62, 0x7E, 0x31, 0x43, 0x00, 0x80, 0x75, 0x0B, 0x0C, 0x09, 0x3B,
0x00, 0x75, 0x6E, 0x6E, 0x79, 0x62, 0x7E, 0x32, 0x43, 0x00, 0x80, 0xA1, 0x04, 0x05, 0x05, 0x3C,
0x00, 0x75, 0x6E, 0x6E, 0x79, 0x62, 0x7E, 0x33, 0x43, 0x00, 0x80, 0x05, 0x0C, 0x0D, 0x0A, 0x3C,
0x00, 0x75, 0x6E, 0x6E, 0x79, 0x62, 0x7E, 0x34, 0x43, 0x00, 0x80, 0x90, 0x05, 0x06, 0x07, 0x3D,
0x00, 0x75, 0x6E, 0x6E, 0x79, 0x62, 0x7E, 0x35, 0x43, 0x00, 0x80, 0x3C, 0x04, 0x05, 0x0D, 0x3D,
0x00, 0x75, 0x6E, 0x6E, 0x79, 0x62, 0x7E, 0x36, 0x43, 0x00, 0x80, 0xA2, 0x06, 0x07, 0x02, 0x3E,
0x00, 0x75, 0x6E, 0x6E, 0x79, 0x62, 0x7E, 0x37, 0x43, 0x00, 0x80, 0x2B, 0x06, 0x07, 0x09, 0x3E,
0x00, 0x5F, 0x6D, 0x5F, 0x62, 0x6F, 0x62, 0x61, 0x43, 0x00, 0x80, 0x87, 0x03, 0x04, 0x00, 0x3F,
0x00, 0x6E, 0x76, 0x69, 0x73, 0x69, 0x7E, 0x31, 0x43, 0x00, 0x80, 0x07, 0x0A, 0x0B, 0x04, 0x3F,
0x00, 0x30, 0x6C, 0x64, 0x65, 0x61, 0x74, 0x68, 0x43, 0x00, 0x80, 0xB0, 0x03, 0x04, 0x0F, 0x3F,
0x00, 0x6F, 0x6C, 0x6F, 0x62, 0x6F, 0x7E, 0x31, 0x43, 0x00, 0x80, 0xE0, 0x08, 0x09, 0x03, 0x40,
0x00, 0x7A, 0x32, 0x5F, 0x35, 0x20, 0x20, 0x20, 0x43, 0x00, 0x80, 0x20, 0x06, 0x07, 0x0C, 0x40,
0x00, 0x70, 0x72, 0x69, 0x6E, 0x74, 0x31, 0x38, 0x43, 0x00, 0x80, 0xAE, 0x06, 0x07, 0x03, 0x41,
0x00, 0x61, 0x72, 0x61, 0x7A, 0x6D, 0x35, 0x20, 0x43, 0x00, 0x80, 0xC9, 0x02, 0x03, 0x0A, 0x41,
0x00, 0x70, 0x65, 0x63, 0x74, 0x72, 0x65, 0x32, 0x43, 0x00, 0x80, 0x7F, 0x04, 0x05, 0x0D, 0x41,
0x00, 0x74, 0x6F, 0x70, 0x66, 0x69, 0x72, 0x65, 0x43, 0x00, 0x80, 0xD4, 0x07, 0x08, 0x02, 0x42,
0x00, 0x6E, 0x6B, 0x6E, 0x32, 0x20, 0x20, 0x20, 0x43, 0x00, 0x80, 0xB3, 0x05, 0x06, 0x0A, 0x42,
0x00, 0x6E, 0x6B, 0x6E, 0x33, 0x20, 0x20, 0x20, 0x43, 0x00, 0x80, 0x63, 0x05, 0x06, 0x00, 0x43,
0x00, 0x6E, 0x6B, 0x6E, 0x34, 0x20, 0x20, 0x20, 0x43, 0x00, 0x80, 0xAA, 0x03, 0x04, 0x06, 0x43,
0x00, 0x5F, 0x74, 0x72, 0x65, 0x61, 0x6D, 0x20, 0x43, 0x00, 0x80, 0xA1, 0x05, 0x06, 0x0A, 0x43,
0x00, 0x5F, 0x77, 0x65, 0x61, 0x72, 0x20, 0x20, 0x43, 0x00, 0x80, 0x4D, 0x06, 0x07, 0x00, 0x44,
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, 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, 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, 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, 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, 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, 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, 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,
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, 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, 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, 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, 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, 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, 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, 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,
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, 0x00, 0x00,
0x00, 0x0E, 0x9C, 0x16, 0x2D, 0x32, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x11, 0x00, 0x44, 0x55, 0x47, 0x4C, 0x41, 0x53, 0x20, 0x20, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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,
};
// read sector
void read_sector()
{
byte i = 0;
while(1)
{
sector_data[i] = pgm_read_byte_near(track0 + i + (sector-1)*256);
if(i==255) break;
i++;
}
}
int main() {
// init();
cli();
prepare_sector_header();
// Setup USART in MasterSPI mode 500000bps
//DDRD |= (1 << DDD4);
UBRR0H = 0x00;
UBRR0L = 0x0F; // 500 kbps
UCSR0C = 0xC0;
UCSR0A = 0x00;
UCSR0B = 0x28; // enable USART
//INIT INT0 interrupt
EICRA = 0x03; // falling edge=2, rising edge=3
EIFR = 0x01; // clear interrupt flag
EIMSK = 0x01; // enable INT0
// AFTER TRD is MOUNTED
PORTC |= ((1 << MOTOR_ON) | (1 << DRIVE_SEL) | (1 << SIDE_SEL));
//SET INDEX,TRK00 AS OUTPUT AND HIGH, WP AS OUTPUT AND LOW
//PORTD |= ((1 << INDEX) | (1 << TRK00)); // set 1
//PORTD |= (1 << STEP) | (1 << DIR_SEL);
PORTD = 255;
//////PORTD &= ~(1 << READ_DATA); // set 0
PORTD &= ~(1 << WP); // set 0
DDRD |= ((1 << INDEX) | (1 << TRK00) | (1 << WP));
// ---------------------------------------------------
while (1)
{
uint16_t sector_offset;
while ((PINC & (1 << MOTOR_ON)) > 0);
// this part is after motor on and drive sel --------
PORTD &= ~(1 << TRK00); // set 0
tmp = 0;
state = 0;
b_index = 0;
prev_byte = 0x4E;
second_byte = 0;
sector = 1;
track = 0;
side = 0;
data_sent = 0;
read_sector();
sei(); // ENABLE INTERRUPTS
do
{
while (data_sent != 1);
// read next half of sector
read_sector();
if (data_sent == 0) { cli(); while (1); } // speed test
while (data_sent != 0);
}
while ((PINC & (1 << MOTOR_ON)) == 0);
cli(); // DISABLE INTERRUPTS
PORTD |= (1 << TRK00);
}
}
Теперь наконец-то можно спокойно поспать :-D