Так - народ! я уже часть оффтопа и флуда - снес в соотв ветку. Давайте холиварить не тут!
В конце концов - демо пишут как раз вопреки...
Может и этот проект таки до релиза дойдет...
Вид для печати
Так - народ! я уже часть оффтопа и флуда - снес в соотв ветку. Давайте холиварить не тут!
В конце концов - демо пишут как раз вопреки...
Может и этот проект таки до релиза дойдет...
del
Не уверен, что обращение к еепром будет быстрее чем к флеш. Так что придется все-равно налету делать или что-то изобретать, временный файл здесь мне видится наиболее подходящим вариантом с подгрузкой нужной части CRC при переходе с дорожки на дорожку.
PS: последний раз про STM, если вам нужно на STM то вот здесь http://zx-pk.ru/showthread.php?t=126...l=1#post825463 есть всё готовое, отправляйтесь туда
Ну и шутка дня: Core-i7, LPT порт, 32GB, 8TB HDD покроют всю возможную нехватку ресурсов атмеги и программировать будет удобнее :-D
Было бы более полезно, если бы вы открыли свои тогдашние наработки, а не вынуждали людей изобретать трехколесные велосипеды, приговаривая "у вас всё неправильно, а я знаю как делать, но вам не скажу".
Понятное дело, деньги всем нужны - но вы или умные, или красивые, либо вы честно барыжите закрытым продуктом - либо открываете его для всех желающих, без вот этой вот клоунады.
Со всем уважением к вашим бесспорным заслугам.
Насчет кодирования данных, сейчас я себе это вижу так.
Есть буфер на 256 байт, загружаем в него 256 байт сектора.
После того как индекс ушел за середину буфера, подгружаем в его начало следующие 128 байт.
Когда индекс перескочил в первую половину, подгружаем следующие 128 байт.
После того как индекс стал = 0 переключаемся на другой буфер, где находится CRC и закодированные пробелы и синхробайты в формате БАЙТ,КОЛИЧЕСТВО.
Как-то так.
Не помешает сделать еще один буфер на 256 для второй стороны, но не знаю, на сколько это необходимо.
И так, XOR не дает правильный сигнал, импульсы идут как по фронту, так и по спаду.
Получил корректный MFM с помощью инвертора и RC цепочки.
Вот, снял на лог анализаторе, на картинке, верхний - выход с МК, нижний - MFM
Вложение 56592
Для получения такого сигнала, инвертировал выходной сигнал, передал его через конденсатор 2.2нФ, после чего притянул его к +5в через 1кОм
PS: наверное можно обойтись и без инвертора, инвертировав таблицу и исправив операцию замены последнего бита
PS2: поставил последнюю версию ардуины, в ней alignas работает.
Вот в таком виде отлично работает без инвертора.
Код:// ZX-Spectrum FDD Emulator
//
//#include <petit_fatfs.h>
#define DRIVE_SEL PC0 // DRIVE SELECT CONNECT DS0-DS3 using jumper (INPUT)
#define MOTOR_ON PC1 // MOTOR ON (INPUT)
#define WRT_DATA PC2 // WRITE DATA (INPUT)
#define WRT_GATE PC3 // WRITE GATE (INPUT)
#define DIR_SEL PC4 // DIRECTION SELECT (INPUT)
#define SIDE_SEL PC5 // SIDE SELECT (INPUT)
uint8_t sector_data[256] = // 1 сектор
{
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,
};//
register volatile uint8_t sector_byte asm("r19");
register volatile uint8_t tmp asm("r20");
register volatile uint8_t XH_Save asm("r9");
register volatile uint8_t XL_Save asm("r10");
register volatile uint8_t ZH_Save asm("r11");
register volatile uint8_t ZL_Save asm("r12");
register volatile uint8_t b_index asm("r13");
register volatile uint8_t SREGSave asm("r14");
uint8_t MFM_tab_h[32] =
{
0x55,0x54,0x52,0x52,0x49,0x48,0x4A,0x4A,0x25,0x24,0x22,0x22,0x29,0x28,0x2A,0x2A,0x95,0x94,0x92,0x92,0x89,0x88,0x8A,0x8A,0xA5,0xA4,0xA2,0xA2,0xA9,0xA8,0xAA,0xAA
};
uint8_t MFM_tab_l[16] = //PROGMEM =
{
0x55,0x52,0x49,0x4A,0x25,0x22,0x29,0x2A,0x95,0x92,0x89,0x8A,0xA5,0xA2,0xA9,0xAA
};
ISR(USART_UDRE_vect, ISR_NAKED)
{
asm ("in r14,0x3F"); // save SREG
asm ("mov r9,r24"); // save XH
asm ("mov r10,r25"); // save XL
asm ("mov r11,r30"); // save ZH
asm ("mov r12,r31"); // save ZL
if(!tmp) // it is ok, as MFM_tab doesn't have zero values
{ // Send first MFM byte
asm(
"mov r20,r19\n" //tmp = sector_byte;
"lsr r20\n" //tmp >>= 3; -------------
"lsr r20\n"
"lsr r20" // -----------------------
);
tmp = MFM_tab_h[tmp]; // get first MFM byte from table
UDR0 = ~tmp; // put byte to send buffer
tmp = sector_byte;
tmp &= 0x0f;
tmp = MFM_tab_l[tmp]; // get second MFM byte from table to "tmp"
}
else
{ // Send second MFM byte
sector_byte = sector_data[b_index]; // pre-get new byte from buffer
//if((tmp & 0x02) || (sector_byte & 0x80)) tmp &= 0xFE; else tmp |= 0x1; // change the last bit
if(sector_byte & 0x80) tmp &= 0xFE; // ДАННЫЙ КОД ОПТИМАЛЬНЕЕ ПРЕДЫДУЩЕЙ СТРОКИ :-D
UDR0 = ~tmp; // put byte to send buffer
tmp=0;
b_index++;
}
asm ("mov r31,r12"); // restore ZL
asm ("mov r30,r11"); // restore ZH
asm ("mov r25,r10"); // restore XL
asm ("mov r24,r9"); // restore XH
asm ("out 0x3F,r14"); // restore SREG
reti();
}
int main() {
// init();
// Setup USART in MasterSPI mode 500000bps
cli();
//DDRD |= (1 << DDD4);
UBRR0H = 0x00;
UBRR0L = 0x0F;
UCSR0C = 0xC0;
UCSR0A = 0x00;
UCSR0B = 0x28;
tmp=0;
b_index = 0;
sector_byte=sector_data[b_index++];
sei();
while(1)
{
// main loop
}
}
так и должно, на запись идет манчестероподобный сигнал, который меняет полярность магнитного поля головки дисковода, а при чтении, магнитная головка вырабатывает импульс в момент смены полярности на диске
- - - Добавлено - - -
хотя про запись точно не помню, в дисководе триггер стоит который по сигналу меняет полярность или от контроллера дисковода идет сигнал в управляющий полярностью, но это пока не важно
- - - Добавлено - - -
тут поидее в ISR будет регистры портить, для расчета адреса
- - - Добавлено - - -
вот отличнейшая статья чтение/запись на дисководы
Поправил регистры, пришлось дизассемблировать, чтобы понять что там и как :)
Вот код ISR в таком виде, как выше.
Итого имеем вроде как 50 циклов в худшем случае. 50*62.5 = 3.1мкс, байт у нас отправляется за 16мкс (байт данных за 32мкс), остается ~13мкс (~26мкс на байт) на основной код. Итого, нагрузка ISR составляет не более 9%Цитата:
L0053:
; 4 (ICALL)+2 (RJMP) + 1 = 7 циклов перед входом в прерывание
; вход в прерывание (7-8 циклов) ---------------------------------
in r14,SREG
mov r9,r24
mov r10,r25
mov r11,r30
mov r12,r31
cpse r19,r1
rjmp L006F
;-----------------------------------------------------------------------
;
; // отправка первого байта (26 циклов) ---------------------------
mov r20,r18
lsr r20
lsr r20
lsr r20
mov r30,r20
ldi r31,0x00
subi r30,0xE0
sbci r31,0xFE
ld r30,Z
mov r20,r30
mov r24,r30
com r24
sts D00C6,r24
mov r20,r18
andi r20,0x0F
ldi r31,0x00
subi r30,0x00
sbci r31,0xFF
ld r19,Z
rjmp L0080
; ----------------------------------------------------------------------
L006F:
; // отправка второго байта (20 циклов макс) ---------------------
mov r30,r13
ldi r31,0x00
subi r30,0x00
sbci r31,0xFE
ld r24,Z
mov r18,r24
sbrc r24,7
rjmp L0087
sbrc r19,1
rjmp L0087
rjmp L0089
; ----------------------------------------------------------------------
L007A:
mov r24,r19
com r24
sts D00C6,r24
clr r19
inc r13
; ----------------------------------------------------------------------
L0080:
; выход из прерывания (9 циклов)
mov r31,r12
mov r30,r11
mov r25,r10
mov r24,r9
out SREG,r14
reti
; ----------------------------------------------------------------------
L0087:
andi r19,0xFE
rjmp L007A
; ----------------------------------------------------------------------
L0089:
ori r19,0x01
rjmp L007A
Правда надо еще учитывать, что ардуина использует свой жуткий таймерный код, хотя там всего-то идет увеличение переменной типа long на единицу каждую мкс, для работы функций delay_ms и delay_us, так что, думаю общая нагрузка периодических прерываний не должна превышать 20%
Насчет сигнала, я же снимал анализатором с реального дисковода и он там был именно таким как сейчас генерируется через RC.
по всей видимости ты формируешь не смену сигнала а фронты, RC + инвертор ты их просто подрезаешь, ну такой вариант тоже можно, просто эти импульсы что шли с дисковода это момент смены сигнала
- - - Добавлено - - -
вот картинка
1. строка MFM сигнал (на байт 16 возможных изменений сигнала)
2. то что выдает дисковод
Итого что бы в 2х байтах SPI выдать нужно количество импульсов, надо слать или 32 бита и укорачивать фронт или выдавать импульс по изменению сигнала и тогда хватит 16 бит
- - - Добавлено - - -
ну или как вариант, подмешивать сигнал синхронизации SPI по логическому И тогда бит 1 это импульс, 0 пропуск
- - - Добавлено - - -
байт 0xFF в mfm будет 16 импульсов, для формирования 16 импульсов нужно 32бит либо 16 смен уровня
Не, мне кажется это уже не из той серии :) Может так дисковод внутри работает, но то что в него из него передается оно имеет вид именно тот что я привел на рисунке. Оно даже по той ссылке так показано.
Вот, еще раз приведу диаграммы.
Первая это сигнал который сейчас генерит ардуина (верхний график) через RC (нижний график).
Вторая реальный дисковод.
Сигналы полностью идентичны, правда на реальном нужно было поставить частоту побольше, а то брешет немного.
я не вижу что идентичного, похожие импульсы и интервалы это еще не значит что правильно, я привел ссылку что на выходе дисковода, по описанию mfm байт 0xff это 16 импульсов с минимальным шагом
на диаграммах нужна привязка к времени и какие входные данные были до mfm кодирования, что бы понять правильно или нет
- - - Добавлено - - -
>> 0xF8:0xAA95,0xF9:0xAA92,0xFA:0xAA89,0xFB:0xAA8A,0x FC:0xAAA5,0xFD:0xAAA2,0xFE:0xAAA9,0xFF:0xAAAA,
вот кстати из таблицы, видно что 0xFF = 0xAAAA это не 8 импульсов а !16 смен уровня сигнала, то есть 16 мпульсов на выходе дисковода, о чем я и говорил, вернее 15, нужно учитывать последний бит предыдущего байта
Так оно и кодируется там в 2 байта по таблице, каждый импульс получается 2мкс, после инвертирования и применения RC импульс становится 1мкс (уменьшается только импульс нуля, единица остается такой как и была), всё в точности как в оригинальном сигнале.
Можно семпл, как буфет выглядеть последовательность, 0xff, 0x00, 0xAA
Вечером выложу, неожиданно пришлось ехать на работу
Исправил ошибку в скетче на предыдущей странице, по дурости заменил >>= 3 на ROL :))) а надо на 3 LSR
Вот картинка с этими 3 байтами с самого начала передачи
Вложение 56601
Походу пришло время генерить дорожки, на основе этого сектора пока что, и цеплять к реалу. Потом уже SD.
Данные сектора скорее всего буду подгружать так.
Первая половина данных ушла - грузим первую половину следующего сектора
Вторая половина ушла, грузим вторую половину следующего сектора
Вот так вычисляю CRC для заголовка
Каждое действие делаю на шаге генерации байта первого пробела сектора, т.е. циклов там нет, а есть кейс по номеру байта пробела.Код:// CRC CALCULATION, PRE-CALC value for A1,A1,A1,FE = 0xB230
{
union
{
uint16_t value;
unsigned char bytes[2];
} crc;
crc.value = 0xB230;
crc.bytes[0] ^= track;
for (b_index = 0; b_index < 8; b_index++) crc.value = crc.bytes[0] & 0x80 ? (crc.value << 1) ^ 0x1021 : crc.value << 1;
crc.bytes[0] ^= side;
for (b_index = 0; b_index < 8; b_index++) crc.value = crc.bytes[0] & 0x80 ? (crc.value << 1) ^ 0x1021 : crc.value << 1;
crc.bytes[0] ^= sector;
for (b_index = 0; b_index < 8; b_index++) crc.value = crc.bytes[0] & 0x80 ? (crc.value << 1) ^ 0x1021 : crc.value << 1;
crc.bytes[0] ^= 1; // sector size;
for (b_index = 0; b_index < 8; b_index++) crc.value = crc.bytes[0] & 0x80 ? (crc.value << 1) ^ 0x1021 : crc.value << 1;
sector_header[0x56]=crc.bytes[0];
sector_header[0x57]=crc.bytes[1];
}
И так, дорожку сгенерировал, данные на лог анализаторе выводятся нормально, без разрывов, всё отлично, CRC успевает сгенерироваться.
Причем дорожка у меня во флеше 4к, и он её читает по пол сектора, успевает! Проверял успеваемость флажком состояния, когда не успевает, то отключает прерывания и уходит в бесконечный цикл.
не, отбой, в голове попутался mfm и fm
Подключил к ZX, получаю
Disc Error
Trk 0 sec 9
Retry, Abort, Ignore ?
Помню такая фигня была когда втыкаешь MS-DOS дискету
В чем здесь может быть проблема? Неверный формат? Не вовремя Index генерирую?
PS: скорее всего где-то что-то напутал, буду дальше разбираться...
Выяснил, такую ошибку выдает, когда вычисленная CRC не совпадает, при этом должен генерироваться INDEX, если INDEX не генерируется, то зависает :) CRC генерил в регистре 20,21, но он видимо портился при вызове функций.
UPD: теперь диск егор, думаю это уже наполовину успех :)
UPD2: действительно! наполовину успех! диск егор означает, что адресное поле грузится нормально и CRC в нем рассчитано нормально, а вот поле данных кривое пока что, буду дальше оптимизировать. САМОЕ УДИВИТЕЛЬНОЕ это то, что эта штука работает напрямую с выхода атмеги, никаких резисторов и конденсаторов не нужно!
UPD3: Ура товарищи! Чтение работает как надо! Всё, буду допиливать ближайшие дни, потом буду выкладывать результаты, так что ожидайте. Короче, в итоге для эмуляции дисковода нужно будет I2C дисплей, Atmega328p, SD карта по SPI, кнопки. Ну и всё, в принципе.
если разобраться не получится, можно на fpga сделать сепаратор и декодер mfm и логировать что видит контролер дисковода
Ну что ж, господа, выкладываю первый рабочий вариант для ардуины.
В данном скетче нулевая дорожка с одного из моих дисков вбита во флеш.
Из флеша читаются сектора, для других дорожек нулевая дублируется. В итоге, при подключении к ZX нормально выводится оглавление диска и можно бегать по секторам в диск докторе.
Принимается любая критика и пожелания по дальнешему допиливанию.
Вот, собственно скетч. Провода к шлейфу цеплять прямо от ардуины, те что указаны в дефайнах. PD0-PD7 это пины 0-7 на ардуины, PC0-PC2 - это A0-A2, PB0-PB1 пока что не используются. DRIVE SELECT цеплять пока что не надо, только MOTOR ON.
Теперь наконец-то можно спокойно поспать :-DКод:// 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);
}
}
Отлично! А что за проблема была постом ранее?
ps увидел, не превыкну, что здесь принято сообщения старые дополнять)
- - - Добавлено - - -
Ещё бы в итоге оставить независимость блока работы с дисководом, чтобы не вплеталось в него работа с картой памяти, дисплеем и прочим, чтобы при желании использовать с другим дисплеем например или совсем без него.
- - - Добавлено - - -
Где-то выше было про открытый проект и обучающий вроде)
Давно не программировал, но всё это интересно уровне хобби,
если можно опишите структуру уже написанной программы,
возможно добавите обобщающие комментарии непосредственно в коде?
ps надо купить ардуино, на досуге повторить этот проект и кормушку для кота сделать давно задумал.
Что-то с картой пока что засада, не успевает нифига... походу надо 2 дорожки всё-таки в памяти держать :( придется что-то думать, возможно ардуину придется исключить... Первое, что приходит на ум - это ATMEGA1284P :-D (700р DIP, 200р QFP)
Извиняюсь за очередной, возможно странный вопрос, но почему не последовательную память использовать для буфера?
вроде такой http://arduino-related.livejournal.com/1414.html
Идея хорошая, но, думаю работать не будет такой вариант, т.к. у нас очень прожорливое прерывание работает. Последовательная передача будет практически невозможна. Хотя, тут нужно еще подумать, но сомневаюсь. Нужна SRAM доступная параллельно. Здесь есть 2 варианта, выбрать дорогой AVR с 16к памяти или перейти на PIC, STM32 и т.д. Еще можно использовать RAW формат флешки и данные получать по прерыванию.
Ну, и, совсем сумасшедший вариант, читать данные двух дорожек во флеш атмеги, а потом из флеша отдавать ))) Вопрос только долго она проживет...
PS: еще можно сделать таблицу кластеров для дорожки и читать её по таймеру, но это очень долго ковырять, если будет много времени свободного...
так там финтов можно накрутить и укоротить, вместо тех же case и fsm можно заюзать указатель на простые naked функции, мутки с mfm не понятны, почему не хранить целиком таблицу? места есть а проца не хватает
так же, куча регистров зарезервировано, компилятор начинает городить когда ему регистров не хватает, в общем как по мне, есть где над ISR поработать
- - - Добавлено - - -
служебную область и данных разными ISR формировать, по указателю скакать, в общем несколько но простых обработчиков сделать чем один навороченый и по максимуму ветвления за скобки
Может попробуете на http://olx.ua/obyavlenie/arduino-32-...tml#da342014cf, точно должно времени хватить
На этой штуке точно хватит :-D но хотелось бы на ардуине
UPD:
Еще мне видится вполне работоспособным такой вариант
Инициализируем передачу даннах с SD карты, пропускаем нужное число байт в кластере до начала сектора.
После чего в прерывании читаем данные не из буфера а по SPI с SD карты. В данном случае пропускается несколько промежуточных шагов и нет необходимости ждать чтения всего сектора.
По поводу чтения SD через SPI. У AVR SPI молотит максимум на половине тактовой частоты, это ограничение плюс необходимость в худшем случае вычитывать все 512 байт сектора позволяют прикинуть типичные траты по времени.
Раз пошла такая пьянка - есть же Arduino Mega (да простят меня Arduino-хейтеры), стоит в Китае меньше 500р в сборе:http://ru.aliexpress.com/item/Mega-2560-R3-Mega2560-REV3-ATmega2560-16AU-CH340G-Board-ON-USB-Cable-compatible-for-arduino-No/
Почему не взять её? Возни с пайкой нет, ног просто море, можно LCD без I2C-переходника (если приспичит) прицепить и ещё останутся!
И вопрос - с какой SD-шкой тестируете? Может, просто карта тормозная?
В регистраторах явно никто не парится о ресурсе флешки, тем не менее годами служат, конечно совсем не думать о ресурсе не стоит,
но здесь трафик и объем небольшие получаются,
можно создать временный файл на несколько мегабайт и последовательно его использовать несколько раз,
затем создать новый временный и стереть предыдущий, это если получится хранить буфер на карте.
По-моему надо постараться остаться на ардуине, что ближе к первоначальной задумке простого и недорогого устройства,
это способствует популярности проекта, т.к. нет препятствия в создании платы и монтаже.
Мало ли, возможно в результате оптимизация дойдет и до Atmega8)
Производительности для основного блока по передаче данных на fdd уже хватает, остальное мелочи)
По поводу производительности AVR и SD - нужно для начала оценить, с какой скоростью требуется читать с карты.
По поводу ардуины - никогда не мог понять, почему некоторые так любят использовать эту хрень и плодить макаронных монстров на её основе. Когда можно развести нормальную печатную плату и поиметь аккуратный девайс на одной плате без клубка МГТФа. При том, что по стоимости получится не дороже (или ненамного дороже) бабуины.
По поводу дисплея - вчера соорудил для тестера микросхем такой дисплейный модуль (красная платка) - экран от nokia 5110 + 5 клавиш. Рулится по двум проводкам (UART). По стоимости получается почти как 1602 с i2c контроллером (ну или чуть дороже), а возможностей куда больше. Особенно для устройства, интерфейс которого требует навигации по файловой системе
adruino это удобно, хотя ни разу не юзал её среду, AvrStudio это то что реально делает AVR на голову выше ARM, платные среды с кряками не мой путь, CLion + gcc/calng + cmake + stm32 что то не получилось завести пока
Можно сделать прототип на ардуине, и уже релиз на отдельной плате для красоты, если проект некоммерческий,
то возможность воспроизвести его на коленке - хороший фактор, для жизнеспособности девайса.
Arduino Mega это вариант, 8к SRAM достаточно, чтобы держать дорожку в памяти, конечно 16к было бы оптимальнее, но 8к это уже что-то не нужно др..чить карту каждые 12мс, а при переключении сторон отключать прерывания, не будет генерироваться INDEX и контроллер будет спокойно ждать его появления после обновления данных.
Насчет MFM таблицы урезанной, ну, тут я подумал, зачем 512 байт в памяти держать, когда там всего один AND, не так уж много он циклов отнимает, особенно для регистра r19.
Пока что буду оптимизировать ISR, потом скорее всего буду думать в сторону Arduino Mega.
UPD:
Сейчас пытаюсь добиться нормальной работы двух дорожек из флеша ардуины, переделал расчет CRC по таблице, заметно увеличилась производительность, даже почти нормально грузится BOOT из второй дорожки.
Всё, дооптимизировал, что бут нормально загружается :)
Вот пример, где грузится бут нормально.
PS: убрал маппинг регистров и ISR_NAKED, компилятор справляется нормально :)Код:// 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 track_header[146]; // track header
uint8_t sector_data[256]; // sector data
// STATE variable values
// 0-1 - TRACK HEADER
// 2-7 - SECTOR
// 8 - TRACK FOOTER
uint8_t state;
uint8_t sector_byte;
uint8_t prev_byte;
uint8_t second_byte;
uint8_t tmp;
uint8_t b_index;
uint16_t CRC;
volatile uint8_t track;
volatile uint8_t sector;
volatile uint8_t side;
volatile uint8_t data_sent;
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,
};
const uint16_t Crc16Table[256] = {
0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7,
0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF,
0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6,
0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE,
0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485,
0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D,
0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4,
0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC,
0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823,
0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B,
0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12,
0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A,
0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41,
0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49,
0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70,
0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78,
0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F,
0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067,
0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E,
0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D,
0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C,
0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634,
0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB,
0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3,
0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A,
0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92,
0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9,
0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1,
0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0
};
// 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)
{
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: // start track header -----------------------------------------
// set index LOW
PORTD &= ~_BV(INDEX);
//set TRK00 LOW or HIGH
if (track == 0) PORTD &= ~(1 << TRK00); else PORTD |= (1 << TRK00);
sector_byte = 0x4E;
b_index = 1;
state = 1;
break;
case 1: // send track header ------------------------------------------
sector_byte = track_header[b_index];
if(sector_byte == 0xC2) second_byte = 0x24;
b_index++;
if (b_index != 146) break;
state = 2;
b_index = 0;
break;
case 2: // ------------------------------------------------------------
switch (b_index)
{
case 0:
// set INDEX high
PORTD |= _BV(INDEX);
CRC = 0xB230;
break;
case 1:
CRC = (CRC << 8) ^ Crc16Table[(CRC >> 8) ^ track];
break;
case 2:
CRC = (CRC << 8) ^ Crc16Table[(CRC >> 8) ^ side];
break;
case 3:
CRC = (CRC << 8) ^ Crc16Table[(CRC >> 8) ^ sector];
break;
case 4:
CRC = (CRC << 8) ^ Crc16Table[(CRC >> 8) ^ 1]; // sector size 1 = 256;
break;
case 5:
sector_header[16] = track;
sector_header[17] = side;
break;
case 12:
case 13:
case 14:
second_byte = 0x89;
break;
case 15:
sector_header[18] = sector;
sector_header[20] = (byte)(CRC >> 8);
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
if (b_index != 60) break;
b_index = 0;
state = 3;
// START GENERATING CRC HERE, PRE-CALC value for A1,A1,A1,FB = 0xE295
CRC = 0xE295; // next CRC value
data_sent = 0;
break;
case 3: // ------------------------------------------------------------
// get sector data values
sector_byte = sector_data[b_index++]; // pre-get new byte from buffer
CRC = (CRC << 8) ^ Crc16Table[(CRC >> 8) ^ sector_byte];
if (b_index != 0) break;
state = 4;
break;
case 4:
if(bit_is_set(PINC, SIDE_SEL)) side = 0; else side = 1;
sector_byte = (byte)(CRC >> 8);
state = 5;
// b_index = 0; not needed
break;
case 5:
if (sector <= 15)
{
sector++; // increase sector
data_sent = 1;
}
sector_byte = (byte)CRC;
state = 6;
break;
case 6:
sector_byte = 0x4E;
state = 7;
break;
case 7:
b_index++;
if (b_index != 56) break;
if (data_sent)
{
state = 2;
b_index = 0;
break;
}
sector = 1;
data_sent = 1;
state = 8;
b_index = 0;
break;
case 8:
// send track footer
if (++b_index != 200) break;
state = 0;
b_index = 0;
break;
}
// PRE-FETCH END
tmp = sector_byte;
tmp >>= 4;
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!
}
}
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)
}
void prepare_track_header()
{
// Address field
byte i;
for(i=0; i < 80; i++) track_header[i] = 0x4E;
for(i=80; i < 92; i++) track_header[i] = 0x00;
sector_header[92] = 0xC2;
sector_header[93] = 0xC2;
sector_header[94] = 0xC2;
sector_header[95] = 0xFC;
for(i=96; i < 146; i++) track_header[i] = 0x4E;
}
alignas(256) const byte track0[16][256] PROGMEM =
{
0x62,0x6F,0x6F,0x74,0x20,0x20,0x20,0x20,0x42,0x89,0x06,0x00,0x00,0x07,0x00,0x01,
0x44,0x49,0x5A,0x5A,0x59,0x31,0x2E,0x52,0x42,0xD9,0x02,0x00,0x00,0xA0,0x07,0x01,
0x44,0x49,0x5A,0x5A,0x59,0x32,0x2E,0x52,0x42,0xD1,0x01,0x00,0x00,0xAF,0x07,0x0B,
0x44,0x49,0x5A,0x5A,0x59,0x33,0x2E,0x52,0x42,0xD9,0x02,0x00,0x00,0xCD,0x06,0x16,
0x44,0x49,0x5A,0x5A,0x33,0x2E,0x35,0x52,0x42,0x90,0x00,0x90,0x00,0x9D,0x03,0x23,
0x44,0x49,0x5A,0x5A,0x59,0x20,0x34,0x52,0x42,0xFA,0x00,0x0E,0x00,0x64,0x00,0x2D,
0x44,0x49,0x5A,0x5A,0x59,0x20,0x34,0x52,0x43,0x00,0x00,0x00,0x00,0xC4,0x04,0x33,
0x44,0x49,0x5A,0x5A,0x59,0x20,0x35,0x52,0x42,0x92,0x00,0x92,0x00,0xFF,0x08,0x3F,
0x44,0x49,0x5A,0x5A,0x59,0x20,0x35,0x52,0x20,0x00,0x00,0x00,0x00,0xB1,0x07,0x4F,
0x44,0x49,0x5A,0x5A,0x59,0x20,0x36,0x52,0x42,0x93,0x00,0x93,0x00,0xE5,0x08,0x5A,
0x53,0x45,0x59,0x4D,0x4F,0x55,0x52,0x31,0x42,0xAB,0x00,0xAB,0x00,0x7B,0x0D,0x68,
0x53,0x45,0x59,0x4D,0x4F,0x55,0x52,0x32,0x42,0xF2,0x00,0x10,0x00,0xBF,0x08,0x70,
0x53,0x45,0x59,0x4D,0x4F,0x55,0x52,0x32,0x43,0x00,0x00,0x00,0x00,0xB8,0x07,0x7C,
0x52,0x4F,0x42,0x4F,0x43,0x4F,0x50,0x33,0x42,0x5B,0x00,0x5B,0x00,0x7B,0x0F,0x87,
0x72,0x6F,0x62,0x6F,0x63,0x6F,0x70,0x33,0x53,0x00,0x00,0x00,0x00,0xFF,0x0A,0x8F,
0x00,0x41,0x57,0x53,0x2B,0x20,0x20,0x20,0x42,0xAD,0x00,0x9A,0x00,0x94,0x02,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,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x41,0x64,0x76,0x61,0x6E,0x63,0x65,0x64,0x20,0x44,0x69,0x73,0x6B,0x20,0x53,0x65,
0x72,0x76,0x69,0x63,0x65,0x20,0x76,0x2E,0x20,0x31,0x2E,0x30,0x31,0x20,0x7F,0x20,
0x31,0x39,0x39,0x33,0x20,0x56,0x6C,0x61,0x64,0x69,0x6D,0x69,0x72,0x20,0x56,0x61,
0x73,0x69,0x6C,0x65,0x76,0x73,0x6B,0x69,0x6A,0x2E,0x4D,0x69,0x50,0x68,0x26,0x54,
0x20,0x48,0x41,0x43,0x4B,0x45,0x52,0x20,0x43,0x4C,0x55,0x42,0x2E,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x09,0x9F,0x16,0x0F,0x07,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x67,0x61,0x6D,0x65,0x73,0x30,0x32,0x33,0x00,0x00,0x00,
0x00,0x01,0xF6,0x02,0xF9,0xC0,0xB0,0x22,0x32,0x33,0x38,0x38,0x34,0x22,0x3A,0xEA,
0x3A,0xAF,0xD3,0xFE,0x21,0x00,0x40,0xE5,0xD1,0x13,0x01,0xFF,0x1A,0x75,0xED,0xB0,
0x21,0x68,0x5D,0x11,0x00,0xDE,0x01,0x00,0x03,0xD5,0xED,0xB0,0xC9,0xF3,0x3E,0x70,
0x21,0x14,0xDE,0x06,0xA7,0xED,0x4F,0xED,0x5F,0xED,0x7E,0xEE,0x40,0xAE,0x77,0x23,
0x10,0xC7,0x3D,0xA5,0x6C,0x7A,0x81,0x68,0x71,0x7A,0xEE,0x62,0x15,0x1E,0xCA,0x6F,
0x39,0xAF,0x17,0xBA,0x2C,0xC8,0x18,0x5B,0x11,0x33,0xF5,0xA8,0xA0,0x98,0xDA,0x29,
0x8E,0x76,0xBC,0x93,0x07,0xBE,0xD8,0x52,0xA8,0x20,0x88,0x75,0x5C,0x95,0x97,0x0A,
0xF0,0xBE,0x8C,0xA0,0x82,0x20,0x88,0xEE,0x94,0x36,0xEA,0xD0,0x32,0x7C,0x01,0xF4,
0x58,0xB8,0xBB,0x98,0x08,0xEC,0x21,0x54,0x19,0x51,0x34,0x0D,0x69,0xE4,0xC8,0xF0,
0xD4,0xF1,0x64,0x54,0x63,0x5F,0x6E,0xC8,0x0A,0x0C,0x4F,0xA0,0x55,0x33,0x86,0xCB,
0xB8,0xE0,0xF4,0xD0,0x99,0x10,0xF1,0xA5,0x48,0x5D,0x75,0x1C,0x6C,0x45,0xD0,0x66,
0x04,0x3F,0x45,0x53,0x0B,0xDC,0x2E,0x38,0xAA,0x0F,0xD5,0x33,0x56,0x8C,0x8A,0xCB,
0x59,0x47,0xB8,0x5C,0x20,0x1B,0x65,0x41,0xC4,0xB0,0x66,0x37,0xA4,0xBC,0xC3,0xC6,
0x37,0x3E,0x64,0x5D,0x89,0x9C,0xAA,0xDB,0x39,0x37,0xA8,0x5C,0xC2,0x3E,0x45,0x11,
0xA4,0x20,0xF0,0x02,0xE4,0x8C,0xE3,0x86,0x46,0x94,0x8B,0xD4,0x9F,0x50,0x67,0x04,
0xB3,0x62,0xCB,0xE4,0xA3,0xC9,0x12,0x1B,0xA5,0x3A,0xD0,0x29,0x14,0x0B,0xD7,0x54,
0x30,0x1A,0x06,0x9F,0x16,0xF8,0xBC,0x53,0x29,0xFD,0x9B,0x6F,0x3C,0x96,0x99,0xA0,
0x3C,0xBD,0x43,0x69,0x5A,0x0A,0x72,0x36,0xA6,0x10,0x06,0x26,0xC3,0x5D,0x10,0x49,
0xB3,0x27,0xDE,0xE8,0xE7,0xCE,0xC1,0x0D,0x08,0x0B,0x16,0x71,0x1C,0xCA,0x24,0x9A,
0xF3,0xDD,0x76,0x6D,0xC1,0xF8,0xA1,0xA3,0xCB,0xAA,0x68,0x7B,0xCB,0x07,0x30,0xA3,
0x07,0x72,0x44,0x2B,0x1E,0xD1,0x85,0x99,0x91,0x9D,0x0C,0xC5,0x26,0x36,0x9D,0x9A,
0xCC,0x29,0xC2,0x03,0xDF,0x0F,0x0C,0x00,0x26,0x32,0x99,0x7A,0x95,0x43,0x10,0x5C,
0xF6,0xAC,0x9D,0x53,0xE8,0xC8,0x04,0x27,0xAC,0x41,0x92,0xF8,0x8F,0x35,0x43,0x92,
0x8F,0xB2,0x14,0xF5,0x2E,0xAB,0x8D,0x7A,0x62,0xEE,0x1D,0x28,0x76,0xB9,0x97,0x9E,
0xE9,0xD3,0x24,0xAF,0xDB,0x6F,0xC4,0x9F,0xEE,0x11,0xDE,0xA6,0x56,0x97,0xDD,0x1C,
0x84,0x94,0xA9,0x53,0xAD,0x0D,0xB9,0x57,0x31,0xAC,0xC1,0xD6,0xE0,0x25,0xFA,0xA2,
0x6A,0xE7,0xA1,0x5F,0xA3,0xB1,0xC5,0x26,0x91,0xDE,0x72,0x4B,0x38,0x01,0x49,0x0B,
0x26,0x16,0xE1,0x1E,0x77,0xEA,0x18,0x8E,0xAD,0x0F,0x15,0x74,0xC6,0x8F,0x61,0x01,
0x66,0x62,0x6C,0x80,0x9F,0xAA,0x42,0xBD,0xB0,0x95,0x4C,0xB8,0x6C,0x5B,0x12,0xAD,
0x89,0xF6,0x72,0x2E,0xC7,0x48,0x38,0x31,0xD3,0x7C,0x9A,0xD8,0x5C,0x92,0xBE,0x2B,
0xA8,0x1B,0xF1,0x71,0xF4,0x16,0x3F,0x42,0xE3,0x1D,0x74,0xEE,0x93,0x5D,0xFE,0xA7,
0x67,0xED,0x30,0x4C,0x0D,0x67,0xB5,0xA1,0xD3,0x44,0xCB,0xE6,0x63,0x14,0x6D,0x6B,
0x75,0x67,0xD1,0x46,0x07,0x6B,0xC9,0x20,0x1A,0xB3,0xE1,0xC8,0x21,0x22,0x3C,0x67,
0xD5,0x59,0x8E,0x31,0x4B,0xA6,0xA6,0x53,0xBD,0x3F,0x7A,0x6D,0xAF,0x1C,0x6D,0x9A,
0xA9,0x69,0x4C,0x40,0x67,0x65,0x32,0x7D,0x7C,0x26,0x79,0x77,0x2D,0x62,0x61,0x38,
0x34,0x69,0x36,0x50,0x6B,0x27,0x18,0x68,0x7C,0x1F,0x09,0x7E,0x29,0x96,0xAD,0x28,
0x7B,0x79,0xB1,0xC0,0xA4,0xBA,0xBF,0x9F,0x4E,0x95,0x99,0x44,0x12,0x76,0x38,0x1D,
0x8B,0x0A,0x46,0x04,0xE7,0xBA,0xE6,0x9E,0x0C,0x33,0x69,0x07,0xF4,0x13,0xDD,0xEB,
0x98,0xF6,0x67,0x60,0x46,0xF6,0x69,0x98,0xD0,0x96,0x97,0x3B,0x63,0xA2,0x21,0x23,
0x96,0x0D,0x1E,0xA0,0x45,0x67,0x58,0xFC,0x41,0x43,0xC9,0xBB,0x42,0x2F,0x30,0x94,
0x51,0x3B,0xD1,0x71,0xE7,0x14,0x38,0xF9,0xD6,0x4C,0xBD,0xAE,0xEA,0x14,0x61,0x7E,
0xB0,0xBE,0xD4,0xDD,0xCE,0xEF,0x57,0x9A,0x85,0x77,0x0A,0x7D,0xDA,0x04,0x52,0xB9,
0xFE,0x8F,0x1F,0x48,0xCC,0xCF,0x42,0x34,0x6B,0x06,0x8C,0x4F,0xF9,0xA7,0x3B,0xC2,
0x13,0x93,0x45,0x85,0x81,0x53,0xF3,0x55,0x0C,0x15,0x5D,0xD8,0xBC,0x28,0x55,0x39,
0x34,0xD4,0x49,0xD4,0x3E,0xAE,0x35,0xEF,0xCE,0x9B,0x0D,0x33,0x8C,0xA2,0xB8,0xBE,
0x4F,0x09,0x8F,0xBB,0xFD,0xD2,0x48,0x0B,0x15,0xE9,0xF1,0x09,0xF6,0xF7,0x35,0x6E,
0xB5,0xAA,0x1E,0x43,0x6D,0xA1,0xA9,0x1F,0xA6,0x75,0x32,0xB8,0xD5,0x54,0xF9,0xCB,
0xC0,0xE4,0x32,0x54,0xB5,0x70,0xE8,0xA5,0xEC,0x0D,0x80,0xAA,0x01,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF7,0x3F,0x4C,0x5B,0xCA,0x7E,0x09,0x03,
0xFF,0x3C,0x4C,0x5B,0xC5,0x7E,0x03,0x6E,0xF7,0x3F,0x4C,0x5B,0xA7,0x7F,0x1E,0x49,
0xBE,0x3D,0xDC,0x5B,0xF7,0x7A,0x2B,0x54,0xD4,0x3D,0x42,0x5B,0x0E,0x79,0x25,0x3F,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBC,0x3D,0xDE,0x5B,0x95,0x71,0x37,0x28,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xBD,0x3D,0xDF,0x5B,0x8F,0x71,0x52,0x41,
0x85,0x3D,0xE7,0x5B,0x11,0x74,0x60,0x2C,0xDC,0x3D,0x5C,0x5B,0xD5,0x71,0x78,0x37,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5C,0x3D,0x26,0x5B,0x1E,0x76,0x8F,0x20,
0x03,0x3F,0x61,0x59,0x32,0x7A,0x87,0x0B,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
alignas(256) const byte track1[16][256] PROGMEM =
{
0x00,0x01,0x1D,0x00,0xD4,0xC0,0x2E,0x0E,0x00,0x00,0xF4,0x5E,0x00,0xF3,0x21,0x00,
0x3D,0x11,0x00,0x91,0x06,0x60,0xC5,0x01,0x04,0x00,0xED,0xB0,0x06,0x04,0x7E,0xCB,
0x27,0xB6,0x12,0x23,0x13,0x10,0xF7,0xC1,0x10,0xEC,0xC9,0x16,0x00,0x0E,0x4E,0x41,
0x4D,0x45,0x53,0x3A,0x3E,0xBF,0x90,0x47,0xA7,0x1F,0x37,0x1F,0xA7,0x1F,0xA8,0xE6,
0xF8,0xA8,0x67,0x79,0x07,0x07,0x07,0xA8,0xE6,0xC7,0xA8,0x07,0x07,0x6F,0x79,0xF6,
0xF8,0x2F,0xC9,0xC9,0xCD,0x6F,0x5D,0xCB,0x07,0xCB,0x07,0xCB,0x07,0x06,0xC6,0x80,
0x32,0x9F,0x5D,0xCB,0x00,0xC9,0xCD,0x6F,0x5D,0xCB,0x07,0xCB,0x07,0xCB,0x07,0x06,
0x86,0x80,0x32,0xB1,0x5D,0xCB,0x00,0xC9,0x3E,0x00,0x32,0xF0,0x5E,0xCD,0xC2,0x5D,
0xCD,0xD2,0x5D,0xCD,0x27,0x63,0xC9,0x00,0xC5,0x01,0x1F,0x00,0xED,0x78,0x21,0xF0,
0x5E,0xB6,0x32,0xF0,0x5E,0xC1,0xC9,0xC5,0x01,0xFE,0xDF,0xED,0x78,0xE6,0x03,0xF5,
0x01,0xFE,0xFB,0xED,0x78,0xE6,0x01,0xCB,0x07,0xCB,0x07,0xCB,0x07,0x57,0xF1,0xB2,
0xF5,0x01,0xFE,0xFD,0xED,0x78,0xE6,0x01,0xCB,0x07,0xCB,0x07,0x57,0xF1,0xB2,0xF5,
0x01,0xFE,0x7F,0xED,0x78,0xE6,0x04,0xCB,0x07,0xCB,0x07,0x57,0xF1,0xB2,0xC1,0x2F,
0xE6,0x1F,0x21,0xF0,0x5E,0xB6,0x32,0xF0,0x5E,0xC9,0x00,0x00,0x00,0x00,0x00,0x0D,
0x00,0x01,0x00,0x00,0x0D,0x00,0x01,0x01,0x00,0x00,0x0D,0x00,0x01,0x01,0x01,0x00,
0x00,0x0D,0x00,0x01,0x01,0x01,0x01,0x00,0x00,0x0D,0x00,0x01,0x01,0x01,0x01,0x01,
0x00,0x00,0x0D,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x0D,0x00,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x00,0x0D,0x00,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,
0x0D,0x00,0x01,0x01,0x00,0x01,0x00,0x00,0x0D,0x00,0x01,0x00,0x00,0x01,0x01,0x00,
0x0D,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x0D,0x09,0x09,0x09,0x09,0x00,0x01,
0x01,0x00,0x0D,0x09,0x09,0x09,0x09,0x00,0x00,0x01,0x00,0x0D,0x09,0x09,0x09,0x09,
0x09,0x00,0x01,0x00,0x0D,0x09,0x09,0x09,0x09,0x09,0x00,0x00,0x00,0x0D,0xFF,0x21,
0x17,0x5E,0xED,0x4B,0xF1,0x5E,0xED,0x43,0xF3,0x5E,0x7E,0xFE,0xFF,0xC8,0xFE,0x0D,
0x20,0x10,0x3A,0xF1,0x5E,0x32,0xF3,0x5E,0xDD,0x21,0xF3,0x5E,0xDD,0x35,0x01,0x23,
0x18,0xE8,0xFE,0x09,0x20,0x09,0xE5,0x21,0xF3,0x5E,0x34,0xE1,0x23,0x18,0xDB,0xFE,
0x01,0x20,0x11,0xE5,0xED,0x4B,0xF3,0x5E,0x03,0xED,0x43,0xF3,0x5E,0xCD,0x8F,0x5D,
0xE1,0x23,0x18,0xC6,0xE5,0xED,0x4B,0xF3,0x5E,0x03,0xED,0x43,0xF3,0x5E,0xCD,0xA1,
0x5D,0xE1,0x23,0x18,0xB5,0x00,0x00,0x00,0x00,0xCD,0x48,0x5D,0xED,0x73,0xF5,0x5E,
0x01,0xF4,0x01,0xC5,0x3E,0x00,0x01,0x1F,0x00,0xED,0x78,0xB7,0x28,0x05,0x3E,0xC9,
0x32,0xC2,0x5D,0xC1,0x0B,0xAF,0xB0,0xB1,0x20,0xE9,0x00,0x00,0x21,0x00,0x90,0x22,
0x36,0x5C,0xFD,0x21,0x3A,0x5C,0xED,0x7B,0xF5,0x5E,0x3E,0x06,0x32,0x12,0x5C,0x3E,
0x02,0xCD,0x01,0x16,0x3E,0xFF,0xFD,0x77,0x00,0x3E,0x2B,0x32,0x48,0x5C,0x32,0x8D,
0x5C,0xCD,0x6B,0x0D,0x3E,0x05,0xD3,0xFE,0x2A,0x3D,0x5C,0x01,0x15,0x5F,0x71,0x23,
0x70,0x21,0x40,0x9C,0x11,0x00,0x00,0x06,0x08,0x0E,0x05,0xCD,0x13,0x3D,0x3E,0xFF,
0x32,0x15,0x5E,0x32,0x16,0x5E,0xF3,0xDD,0x21,0x40,0x9C,0xFD,0x21,0xC8,0xAF,0xDD,
0x7E,0x00,0xFE,0x00,0xCA,0xEB,0x5F,0xFE,0x01,0xCA,0x87,0x5F,0xDD,0x7E,0x08,0xFE,
0x42,0xCA,0x94,0x5F,0xDD,0x7E,0x0D,0xFE,0xC0,0xCA,0xCF,0x5F,0xDD,0xE5,0xE1,0x11,
0x10,0x00,0x19,0xE5,0xDD,0xE1,0xC3,0x6A,0x5F,0xDD,0x7E,0x00,0xFE,0x62,0x20,0x34,
0xDD,0x7E,0x01,0xFE,0x6F,0x20,0x2D,0xDD,0x7E,0x02,0xFE,0x6F,0x20,0x26,0xDD,0x7E,
0x03,0xFE,0x74,0x20,0x1F,0xDD,0x7E,0x04,0xFE,0x20,0x20,0x18,0xDD,0x7E,0x05,0xFE,
0x20,0x20,0x11,0xC3,0x87,0x5F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0xFD,0xE5,0xD1,0xDD,0xE5,0xE1,0x01,0x09,0x00,0xED,0xB0,0x21,
0x15,0x5E,0x34,0xFD,0xE5,0xE1,0x11,0x09,0x00,0x19,0xE5,0xFD,0xE1,0xC3,0x87,0x5F,
0xFD,0x21,0x3A,0x5C,0x3A,0x15,0x5E,0xFE,0xFF,0xCA,0x34,0x62,0xFE,0x14,0xD2,0x48,
0x62,0x06,0xB4,0x0E,0xA7,0xED,0x43,0xF1,0x5E,0x06,0x00,0x0E,0x0C,0x2E,0x09,0x3A,
0x15,0x5E,0x67,0x24,0x24,0x24,0x3E,0x70,0x32,0xC0,0x61,0xCD,0xC3,0x61,0x06,0x00,
0x0E,0x0C,0x21,0x09,0x00,0x3E,0x46,0x32,0xC0,0x61,0xCD,0xC3,0x61,0x3E,0x47,0x32,
0xC0,0x61,0x3A,0x15,0x5E,0xC6,0x04,0x47,0x0E,0x0D,0x21,0x09,0x00,0x3A,0xC0,0x61,
0xCD,0xC3,0x61,0x0E,0x16,0x3A,0x15,0x5E,0xC6,0x02,0x67,0x2E,0x00,0x06,0x01,0x3A,
0xC0,0x61,0xCD,0xC3,0x61,0x3E,0x46,0x32,0x8D,0x5C,0x3E,0x02,0xCD,0x01,0x16,0x11,
0x66,0x5D,0x01,0x09,0x00,0xCD,0x3C,0x20,0x3E,0x70,0x32,0x8D,0x5C,0x3E,0x02,0xCD,
0x01,0x16,0x3A,0x15,0x5E,0xDD,0x21,0xC8,0xAF,0x26,0x01,0x3C,0x47,0xC5,0x24,0x7C,
0x32,0x83,0x60,0xE5,0x3E,0x16,0xD7,0x3E,0x03,0xD7,0x3E,0x0D,0xD7,0xDD,0xE5,0xD1,
0x01,0x08,0x00,0xCD,0x3C,0x20,0xDD,0xE5,0xE1,0x11,0x09,0x00,0x19,0xE5,0xDD,0xE1,
0xE1,0xC1,0x10,0xD9,0xCD,0xAF,0x63,0x11,0x00,0xC0,0x01,0x00,0x18,0xED,0xB0,0xCD,
0xB3,0x5D,0x3A,0xF0,0x5E,0xDD,0x21,0xF1,0x5E,0xCB,0x47,0x28,0x03,0xDD,0x34,0x00,
0xCB,0x4F,0x28,0x03,0xDD,0x35,0x00,0xCB,0x57,0x28,0x03,0xDD,0x35,0x01,0xCB,0x5F,
0x28,0x03,0xDD,0x34,0x01,0xCB,0x67,0x28,0x0B,0x3A,0x16,0x5E,0xFE,0xFF,0x28,0x04,
0xFB,0xC3,0x8C,0x62,0xED,0x4B,0xF1,0x5E,0x3E,0x10,0xB8,0x38,0x02,0x06,0x10,0xB9,
0x38,0x02,0x0E,0x10,0x3E,0xBD,0xB8,0x30,0x02,0x06,0xBD,0x3E,0xEF,0xB9,0x30,0x02,
0x0E,0xEF,0xED,0x43,0xF1,0x5E,0xCD,0x9A,0x5E,0x3A,0xF0,0x5E,0xFE,0x00,0xCA,0xB2,
0x61,0x06,0x11,0xC5,0xED,0x4B,0xF1,0x5E,0xD1,0xD5,0x04,0x78,0x92,0x3C,0x47,0xCD,
0x6F,0x5D,0x3E,0x80,0x84,0x57,0x5D,0x1A,0xB6,0x77,0x23,0x13,0x1A,0xB6,0x77,0x23,
0x13,0x1A,0xB6,0x77,0xC1,0x10,0xDC,0x3A,0xF2,0x5E,0x47,0x3E,0xBF,0x90,0xE6,0xF8,
0xCB,0x0F,0xCB,0x0F,0xCB,0x0F,0xFE,0x02,0x38,0x4F,0x47,0x3A,0x15,0x5E,0xC6,0x02,
0xB8,0x38,0x46,0x3A,0xF1,0x5E,0xFE,0x60,0x38,0x3F,0xFE,0xB0,0x30,0x3B,0x3A,0xF2,
0x5E,0x47,0x3E,0xBF,0x90,0xE6,0xF8,0x0F,0x0F,0x0F,0x21,0x16,0x5E,0xBE,0x28,0x47,
0x32,0x16,0x5E,0x06,0x02,0x0E,0x0C,0x2E,0x09,0x3A,0x15,0x5E,0x67,0x24,0x3E,0x70,
0x32,0xC0,0x61,0xCD,0xC3,0x61,0x3A,0x16,0x5E,0x47,0x0E,0x0C,0x21,0x09,0x00,0x3E,
0x46,0x32,0xC0,0x61,0xCD,0xC3,0x61,0x18,0x1E,0x3A,0x16,0x5E,0xFE,0xFF,0x28,0x17,
0x3E,0xFF,0x32,0x16,0x5E,0x06,0x02,0x0E,0x0C,0x2E,0x09,0x3A,0x15,0x5E,0x67,0x3E,
0x70,0x32,0xC0,0x61,0xCD,0xC3,0x61,0xCD,0x54,0x1F,0xDA,0xAA,0x60,0xCD,0x54,0x1F,
0x30,0xFB,0xC3,0x15,0x5F,0x00,0x00,0x00,0x32,0xC0,0x61,0xED,0x43,0xC1,0x61,0x05,
0x0D,0x24,0x2C,0x09,0x04,0x0C,0xCD,0xE2,0x61,0x79,0xBD,0x38,0xF8,0x3A,0xC1,0x61,
0x4F,0x0D,0x78,0xBC,0x38,0xEE,0xC9,0xE5,0xC5,0x16,0x00,0x58,0x06,0x05,0x3F,0xCB,
0x23,0xCB,0x12,0x10,0xF9,0xC1,0xC5,0xD5,0xE1,0x16,0x00,0x59,0x19,0x11,0x00,0x58,
0x19,0x3A,0xC0,0x61,0x77,0xC1,0xE1,0xC9,0xCD,0xBC,0x63,0x01,0x06,0x0C,0x21,0x11,
0x02,0x3E,0x57,0x32,0x8D,0x5C,0x32,0xC0,0x61,0xCD,0xC3,0x61,0x06,0x0F,0x0E,0x07,
0x21,0x11,0x00,0x3E,0x00,0x32,0xC0,0x61,0xCD,0xC3,0x61,0x06,0x0D,0x0E,0x18,0x2E,
0x00,0x26,0x02,0x3E,0x00,0xCD,0xC3,0x61,0xC9,0xCD,0x03,0x62,0x3E,0x02,0xCD,0x01,
0x16,0x11,0x63,0x62,0x01,0x14,0x00,0xCD,0x3C,0x20,0xC3,0x59,0x62,0xCD,0x03,0x62,
0x3E,0x02,0xCD,0x01,0x16,0x11,0x78,0x62,0x01,0x14,0x00,0xCD,0x3C,0x20,0xCD,0x8E,
0x02,0xCB,0x7B,0x20,0xF9,0xC3,0x15,0x5F,0x16,0x0D,0x07,0x20,0x20,0x4E,0x4F,0x20,
0x45,0x58,0x45,0x2D,0x46,0x49,0x4C,0x45,0x20,0x21,0x20,0x20,0x20,0x16,0x0D,0x07,
0x4E,0x4F,0x20,0x4D,0x4F,0x52,0x45,0x20,0x54,0x48,0x41,0x4E,0x20,0x32,0x30,0x21,
0x20,0x2A,0x3D,0x5C,0x01,0x15,0x5F,0x71,0x23,0x70,0x3E,0x00,0x32,0x36,0x5C,0x3E,
0x3C,0x32,0x37,0x5C,0x3E,0x00,0x32,0x48,0x5C,0x32,0x8D,0x5C,0x3E,0x02,0xCD,0x01,
0x16,0xCD,0x6B,0x0D,0x3E,0x00,0xD3,0xFE,0x31,0xFF,0xFF,0x21,0xC8,0xAF,0x3A,0x16,
0x5E,0x3D,0x3D,0xCB,0x07,0xCB,0x07,0xCB,0x07,0x47,0x3A,0x16,0x5E,0x3D,0x3D,0x80,
0x5F,0x16,0x00,0x19,0xE5,0xDD,0xE1,0xED,0x7B,0xF5,0x5E,0xDD,0x7E,0x08,0xFE,0x43,
0x28,0x14,0x11,0x0D,0x63,0x01,0x08,0x00,0xED,0xB0,0x21,0x08,0x63,0x22,0x5D,0x5C,
0xCD,0x03,0x3D,0xC3,0x15,0x5F,0x11,0x1C,0x63,0x01,0x08,0x00,0xED,0xB0,0xCD,0xBF,
0x16,0x21,0x17,0x63,0x22,0x5D,0x5C,0xCD,0x03,0x3D,0xC3,0x15,0x5F,0x3A,0xEA,0x3A,
0xF7,0x22,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x0D,0x3A,0xEA,0x3A,0xEC,
0x22,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0xAF,0x0D,0x01,0xFE,0xEF,0x16,
0x00,0xED,0x78,0xCB,0x47,0x20,0x02,0xCB,0xE2,0xCB,0x4F,0x20,0x02,0xCB,0xDA,0xCB,
0x57,0x20,0x02,0xCB,0xD2,0xCB,0x5F,0x20,0x02,0xCB,0xC2,0xCB,0x67,0x20,0x02,0xCB,
0xCA,0x3A,0xF0,0x5E,0xB2,0x32,0xF0,0x5E,0xC9,0x01,0xD0,0x07,0x21,0x00,0x00,0x7E,
0xE6,0xF8,0xF6,0x01,0xD3,0xFE,0x23,0x0B,0xAF,0xB0,0xB1,0x20,0xF2,0xC9,0xCA,0x3A,
0x1D,0x5F,0xB2,0x32,0x1D,0x5F,0xC9,0x01,0xD0,0x07,0x21,0x00,0x00,0x7E,0xE6,0xF8,
0xF6,0x01,0xD3,0xFE,0x23,0x0B,0xAF,0xB0,0xB1,0x20,0xF2,0xC9,0x16,0x15,0x01,0x10,
0x02,0x11,0x05,0x13,0x00,0x20,0x50,0x55,0x42,0x4C,0x49,0x53,0x48,0x45,0x44,0x20,
0x42,0x59,0x20,0x53,0x4F,0x46,0x54,0x53,0x54,0x41,0x52,0x20,0x4F,0x46,0x20,0x4D,
0x4B,0x48,0x47,0x20,0x11,0x87,0x63,0x01,0x28,0x00,0xCD,0x3C,0x20,0x21,0x00,0x40,
0xC9,0xCD,0x54,0x63,0x3E,0x05,0xD3,0xFE,0xC9,0x80,0xAA,0x01,0x00,0x00,0x00,0x00,
0x43,0x4F,0x52,0x52,0x45,0x43,0x54,0x45,0x44,0x20,0x42,0x59,0x20,0x4B,0x53,0x41,
0x20,0x53,0x4F,0x46,0x54,0x57,0x41,0x52,0x45,0x2C,0x53,0x50,0x45,0x43,0x49,0x41,
0x4C,0x20,0x46,0x4F,0x52,0x20,0x41,0x4E,0x44,0x52,0x45,0x57,0x20,0x49,0x53,0x41,
0x45,0x56,0x20,0x20,0x31,0x39,0x39,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x01,0x82,0x00,0xF9,0xC0,0x30,0x0E,0x00,0x00,0x72,0x5D,0x00,0x16,0x00,0x00,
0x13,0x01,0x11,0x05,0x10,0x00,0x20,0x2A,0x20,0x50,0x52,0x4F,0x54,0x45,0x43,0x54,
0x49,0x4F,0x4E,0x20,0x42,0x59,0x20,0x4B,0x53,0x41,0x20,0x53,0x4F,0x46,0x54,0x57,
0x41,0x52,0x45,0x20,0x2A,0x20,0x13,0xF3,0x31,0x00,0x40,0xAF,0xD3,0xFE,0x21,0x00,
0x40,0x11,0x01,0x40,0x01,0xFF,0x1A,0x75,0xED,0xB0,0x21,0x90,0x5D,0x06,0xA1,0x7E,
0xAD,0x77,0x23,0x10,0xFA,0xA1,0x95,0xD2,0xB2,0x0B,0xC8,0x87,0x93,0xD8,0x98,0xBA,
0x9B,0x71,0x2D,0x57,0x5F,0xFD,0xD5,0xBA,0x92,0x79,0xF8,0x6A,0xFA,0x6E,0xF4,0xF7,
0x7E,0xF1,0x4A,0xF3,0x1A,0xED,0x0D,0xEF,0x40,0xE9,0x84,0x07,0xEA,0x46,0xCD,0x15,
0x72,0x13,0x6E,0x40,0x76,0xFA,0xB4,0x9F,0x02,0xF7,0x0C,0xFD,0xF9,0x82,0x37,0xB2,
0x02,0xF6,0xAF,0x93,0x61,0xF3,0x7F,0xF1,0x7D,0x1D,0xF4,0xD4,0x89,0xE6,0xDC,0x09,
0x25,0x15,0xFC,0x2D,0x82,0x4E,0xC2,0x4C,0xC0,0x4A,0xC6,0x2F,0xD9,0xC0,0xDE,0xFD,
0x45,0xCF,0x43,0xCD,0x41,0xD3,0x5F,0x3B,0xD2,0xDB,0xAB,0xE7,0x12,0xF9,0xF8,0x1F,
0xFA,0x82,0x51,0x56,0x56,0xAA,0xAA,0xAF,0xED,0x05,0xEB,0xF8,0xE9,0x4A,0xE7,0x22,
0x7C,0x2F,0x1E,0x05,0x77,0xA1,0x31,0xFB,0x32,0x3B,0x4B,0x07,0x17,0xE8,0x18,0xFF,
0x1A,0xF1,0xAD,0x2F,0x08,0x7E,0x00,0x34,0x7D,0x35,0x30,0x78,0x26,0x8D,0x29,0x1C,
0x2B,0xC1,0x95,0xE7,0x38,0xF8,0xEE,0xB3,0xD1,0xC7,0x3A,0xDE,0xA1,0x9C,0xC7,0xDB,
0xDA,0x08,0x11,0x14,0xE7,0xA9,0xAE,0xA3,0xA0,0xA5,0xBA,0xBF,0xBC,0xB1,0xB6,0x48,
0x4B,0x4E,0x41,0x44,0x47,0x5A,0x5D,0x50,0x53,0x56,0x29,0x2C,0x2F,0x22,0x25,0x38,
0x3B,0x3E,0x31,0x34,0x37,0x0A,0xE0,0x57,0xF2,0xD7,0xF4,0x43,0x78,0xFF,0x42,0xDB,
0x0A,0x2E,0x21,0xC1,0xF6,0x3B,0x3D,0x6B,0xF2,0x27,0xEC,0x51,0xDA,0xEF,0x4A,0xFD,
0xCA,0x05,0x0A,0x0F,0x11,0xEA,0x00,0x50,0x2A,0xC7,0xF9,0xFC,0xEE,0xF3,0xF5,0x89,
0x8B,0xD5,0x44,0x41,0x42,0xA9,0xAE,0x7D,0x23,0xB7,0x96,0x93,0x4C,0xA4,0x64,0x5A,
0xEB,0x23,0x53,0xEA,0x2A,0x70,0xC7,0x1E,0xBD,0x85,0x99,0x7D,0x8F,0x0F,0xB0,0x56,
0x6A,0x50,0x63,0x5A,0x64,0x44,0x79,0x4E,0x76,0x48,0x4F,0x72,0x48,0x7C,0x4D,0x66,
0x52,0xA0,0x58,0x96,0x57,0x2A,0xEE,0xE5,0x10,0x04,0x39,0x3C,0x1D,0x30,0x35,0x35,
0xB7,0x33,0xBC,0xD5,0xE2,0x84,0x00,0xB2,0x0E,0xBD,0x74,0x49,0x4E,0x4B,0x8F,0xB8,
0xBB,0x8F,0x1B,0x1E,0x8C,0xB1,0xBE,0x61,0x62,0x5F,0x40,0x45,0xBE,0x0C,0xC8,0x96,
0x0B,0x08,0x93,0x3B,0xFA,0x5B,0x64,0xA1,0xDD,0xB6,0x5C,0x9D,0xE1,0x82,0x50,0x89,
0x0B,0xC3,0x44,0x5D,0xD3,0x22,0x3F,0x2A,0x42,0x2B,0x37,0x3C,0x3A,0x36,0x26,0x29,
0x48,0x56,0x20,0x4E,0x55,0x5A,0x3C,0x62,0x7D,0x71,0x9D,0xCB,0xD6,0xD6,0xF4,0x96,
0xFB,0x13,0xBE,0x19,0xA4,0x34,0x32,0x15,0xF0,0xD7,0x54,0x82,0x32,0x81,0x2B,0x17,
0xD8,0xFF,0x8F,0xE4,0x32,0xEC,0x02,0xE6,0x0C,0x2F,0xDF,0x33,0xD9,0x3D,0x04,0x01,
0xC3,0xD9,0xC9,0xD1,0xCF,0xA9,0x6E,0xF0,0xFD,0x7B,0x98,0xCB,0xE1,0x59,0x5E,0xA2,
0x97,0x62,0x9D,0x66,0x9F,0x8A,0x67,0x6A,0xB3,0xB2,0xF5,0xC8,0xCB,0xFE,0xC1,0x13,
0xC4,0xC0,0xE9,0x14,0x66,0x55,0x2E,0x51,0x5C,0x34,0x2B,0x26,0x2D,0x20,0x2F,0xF0,
0xC7,0x70,0xF9,0x23,0x22,0x2B,0xC2,0xE8,0x9C,0x40,0x7F,0x12,0x11,0xEE,0xA4,0xF9,
0x21,0x24,0xF8,0xD6,0xBC,0x41,0x72,0xD1,0xF7,0x92,0xE4,0xAC,0x1B,0x8B,0xFC,0xB9,
0x52,0x9D,0x29,0xA8,0x4E,0xCC,0xEA,0xF1,0xBF,0x97,0x14,0x79,0x41,0xB7,0x72,0xEC,
0x53,0xBB,0x7E,0x79,0xC0,0x2C,0x30,0x41,0xAA,0x11,0x88,0x75,0xFE,0xE7,0x21,0x21,
0xAC,0x18,0x2D,0xD5,0x8E,0x1B,0x70,0x48,0x4E,0x1F,0x30,0x21,0x86,0x21,0xFD,0x64,
0xE2,0x45,0x70,0x45,0x13,0x82,0x40,0x25,0x32,0xE3,0x5E,0x98,0x07,0x87,0x2A,0xD5,
0x0C,0x45,0xCE,0x44,0x0E,0xD1,0xCC,0x53,0x87,0x3E,0xD5,0xBC,0x8B,0x9A,0xE9,0xD8,
0xCF,0xB6,0xAD,0x84,0xF3,0xD2,0xE1,0x80,0x97,0xAE,0xA5,0xCC,0xFB,0xEA,0x99,0x88,
0x9F,0xE6,0xFD,0xD4,0xA6,0xBB,0xBC,0xB1,0xB2,0xB7,0x88,0x8D,0x8E,0x83,0xA4,0xB9,
0xBA,0xBF,0xB0,0xB5,0xB6,0x74,0x73,0x7E,0x7D,0x78,0x67,0x62,0x61,0x6C,0x6B,0x16,
0x15,0x10,0x1F,0x1A,0x19,0x04,0x03,0x0E,0x20,0x80,0xAA,0x01,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xF3,0xCD,0x52,0x00,0x3B,0x3B,0xC1,0x21,0x97,0x00,0x09,0xEB,0x21,0x66,0x00,0x09,
0x73,0x23,0x72,0x21,0x7B,0x00,0x09,0x73,0x23,0x72,0x21,0x89,0x00,0x09,0x73,0x23,
0x72,0x21,0xBE,0x00,0x09,0x11,0x00,0x40,0xD5,0xD9,0x08,0x3E,0x03,0xB7,0x06,0x08,
0x48,0xE1,0x08,0xD9,0x7E,0xCB,0x7F,0x20,0x3A,0xE6,0x07,0x4F,0x7E,0x0F,0x0F,0x0F,
0xE6,0x0F,0xC6,0x03,0x47,0x23,0x7B,0x96,0x23,0xE5,0x6F,0x7A,0x99,0x67,0xE5,0x7C,
0xE6,0x58,0xFE,0x58,0x28,0x12,0x4F,0x7D,0xE6,0x07,0xB1,0x4F,0x29,0x29,0x7C,0xE6,
0x1F,0x67,0x7D,0xE6,0xE0,0xB4,0x6F,0x61,0x7E,0xCD,0xA6,0x74,0xE1,0x23,0x10,0xDE,
0xE1,0x18,0xC1,0xE6,0x7F,0x28,0x1D,0x23,0xCB,0x77,0x20,0x0A,0x47,0x7E,0xCD,0xA6,
0x74,0x23,0x10,0xF9,0x18,0xAE,0xE6,0x3F,0xC6,0x03,0x47,0x7E,0xCD,0xA6,0x74,0x10,
0xFB,0x23,0x18,0xA0,0xD9,0x21,0x58,0x27,0xD9,0xFB,0xC9,0x13,0xD9,0x77,0x08,0x28,
0x19,0x24,0x10,0x1B,0x11,0x20,0xF8,0x19,0x0D,0x20,0x12,0x11,0x01,0xFF,0x19,0xC6,
0x08,0x30,0x08,0x11,0xE0,0x07,0x19,0x3D,0x18,0x01,0x23,0x0E,0x08,0x06,0x08,0x08,
0xD9,0xC9,0xC8,0x00,0x87,0x30,0xDC,0xEF,0xEB,0xEF,0xEB,0x5C,0xCB,0x00,0x8F,0x3C,
0x5E,0xBF,0x9F,0xAF,0x95,0x42,0x3C,0x00,0x3A,0x74,0xA8,0x96,0xAF,0x5D,0x18,0x06,
0x40,0x0C,0x88,0x00,0x00,0x01,0x03,0x07,0x07,0x0F,0x0E,0xC0,0x1D,0x8B,0x2D,0x3E,
0x2F,0x2F,0x14,0x16,0x13,0x09,0x08,0x04,0x03,0x08,0x56,0x00,0x16,0x8B,0x0F,0x08,
0x0F,0x61,0xB2,0x75,0x6B,0x57,0x2E,0x45,0x38,0x18,0x68,0x81,0x27,0x30,0x6F,0x82,
0x7F,0x05,0xC1,0xFF,0x00,0x60,0xC3,0xFF,0x85,0x3C,0x18,0x18,0xDB,0xDB,0x08,0x0C,
0x86,0x00,0x81,0xDB,0xE7,0x3F,0x05,0x00,0x19,0x8F,0x00,0xC3,0xC3,0xE7,0xE7,0x24,
0xE7,0x86,0xCB,0xD7,0xAE,0x5D,0xBA,0x14,0xE3,0x20,0x36,0x30,0xAF,0x82,0xFF,0x78,
0x10,0x40,0x89,0x04,0x00,0x00,0x80,0xC0,0xE0,0xE0,0xF0,0x70,0xC0,0xB8,0x8B,0xBC,
0x7C,0xFC,0xFC,0x38,0x78,0xF8,0xF0,0xF0,0xE0,0xC0,0x08,0xD6,0x00,0x16,0x8B,0xF0,
0x10,0xF0,0x18,0x2C,0x5D,0xBA,0x75,0xEB,0x51,0x8E,0x20,0x36,0x81,0x3F,0x38,0xF0,
0x81,0xFC,0x10,0x80,0x41,0x00,0x87,0x0C,0x3B,0xF7,0xD7,0xF7,0xD7,0x3A,0x59,0x00,
0x00,0xC0,0x83,0xEB,0xD7,0xAE,0x28,0xC0,0x81,0xFC,0x00,0xB2,0x81,0x23,0x30,0x83,
0x60,0x40,0xD2,0x00,0x58,0xC0,0x08,0x81,0x81,0x83,0x38,0x40,0x08,0xA8,0x83,0x06,
0x06,0x03,0xC0,0x06,0x84,0x00,0x38,0x7C,0x7C,0xC1,0xFE,0x81,0x7C,0x68,0x52,0x58,
0xC0,0x00,0x74,0x83,0x00,0xFF,0x0F,0x38,0x0C,0x01,0xBE,0x86,0x36,0xB6,0xE6,0xB7,
0xB7,0x36,0x78,0x40,0x78,0xC0,0x01,0xEB,0x81,0x1F,0x08,0x40,0x81,0xFF,0x11,0x9F,
0x83,0x00,0x00,0xC0,0x10,0xFF,0x86,0x33,0x76,0xF0,0xB0,0x36,0x33,0x78,0x80,0x78,
0xC0,0x18,0xF3,0x00,0x43,0x29,0x37,0x81,0xFD,0x0A,0x3D,0x86,0xE6,0x36,0xE7,0x36,
0x36,0xE6,0x78,0xC0,0x78,0xC0,0x83,0x00,0x00,0x3F,0xC4,0xFF,0x22,0x75,0x81,0xE8,
0x10,0xC0,0x84,0x36,0xF6,0x37,0x37,0x78,0xC0,0x79,0x80,0x19,0x72,0x48,0x40,0x81,
0x40,0x12,0xB6,0x85,0x70,0xF0,0xB0,0x30,0x30,0x79,0x40,0x79,0x80,0x02,0x2B,0x83,
0xFF,0xFF,0xFE,0x40,0x80,0x12,0xA6,0x82,0x04,0x06,0xC3,0x02,0x83,0x06,0x04,0x07,
0x28,0x12,0x81,0x07,0x28,0x0B,0x71,0x80,0x02,0xB2,0x84,0xF8,0xFF,0xFF,0xFC,0x43,
0x35,0x84,0xF0,0x08,0xE4,0x92,0xC1,0x8A,0x84,0x92,0xE4,0x08,0xF0,0x1B,0x4C,0x85,
0x91,0x51,0x9D,0x55,0x9D,0x7A,0x40,0x20,0x81,0x29,0xB7,0x1B,0x78,0x8D,0x20,0x60,
0xE3,0xA2,0xA2,0xA4,0xA8,0xB2,0xA6,0x8A,0x92,0xA2,0xA2,0x22,0xE4,0x81,0x04,0x00,
0x80,0x02,0xD7,0x7A,0x40,0x0B,0xAB,0x81,0xC7,0x00,0x72,0x2A,0x00,0x13,0xBB,0x84,
0x9F,0xA0,0xA7,0x98,0xC1,0x80,0x84,0x98,0xA7,0xA0,0x9F,0x1B,0xCC,0x85,0x5F,0x50,
0xDE,0x50,0x5F,0x7A,0x40,0x20,0x71,0x03,0xF0,0x81,0xB2,0x4B,0xE2,0x8A,0xE3,0x14,
0xD4,0x57,0x50,0xA0,0xA0,0x50,0x57,0xD4,0x2B,0x64,0x85,0x39,0x45,0x41,0x45,0x39,
0x7B,0x00,0x2C,0x29,0x13,0xEF,0x82,0x0F,0x0F,0xC3,0x1F,0x8D,0x0F,0x0F,0xFC,0x02,
0xFA,0x0A,0x0A,0x14,0x14,0x0A,0x0A,0xFA,0x02,0x11,0x17,0x87,0xA0,0x00,0xF7,0x01,
0xE1,0x01,0xF1,0x7B,0x00,0x14,0x69,0x81,0x0F,0x2A,0x02,0xC6,0xFF,0x8C,0xE1,0xA1,
0xA2,0xA4,0xA9,0xB3,0xA5,0x89,0x91,0xA1,0xA1,0xE1,0x1C,0x8C,0x85,0xDF,0x10,0x1E,
0x10,0x1F,0x7B,0x00,0x14,0xA9,0x11,0xBE,0x50,0x43,0x81,0xC0,0xC7,0x40,0x13,0xF6,
0x1A,0x17,0x12,0x1A,0x7B,0xC0,0x04,0x2D,0x88,0xE0,0xF0,0xF8,0xF8,0xFC,0xFC,0xFE,
0xFE,0x1C,0xF8,0x82,0x06,0x07,0x7B,0x80,0x7B,0xC0,0x43,0xC0,0x5D,0x1D,0x83,0x01,
0x03,0x8F,0x7B,0x80,0x7B,0xC0,0x34,0x80,0x81,0x9E,0x3D,0x6E,0x83,0x40,0x40,0x60,
0x04,0xA0,0x82,0xF8,0xF8,0x7B,0x80,0x7C,0x80,0x2C,0x80,0x81,0x03,0x7C,0x70,0x7B,
0x80,0x7C,0x80,0x35,0x40,0x6C,0xB0,0xC0,0x01,0x81,0x03,0x7B,0x80,0x7C,0x80,0x25,
0x40,0x81,0x7F,0x65,0x30,0x85,0x08,0x08,0x1C,0x1C,0xBE,0x7B,0x80,0x7D,0x40,0x25,
0x40,0x82,0xFF,0xFF,0x0B,0x22,0x83,0x10,0x10,0x28,0x0C,0xEC,0x04,0xF0,0x85,0x7C,
0x7D,0x79,0x79,0x7B,0xDD,0x00,0x46,0x00,0x83,0xFF,0xFF,0x01,0x25,0xA9,0x8A,0x0C,
0x1E,0x3F,0x00,0x1E,0x5C,0xDE,0xDC,0x9E,0x5C,0x41,0x52,0x7E,0xC0,0x5D,0x40,0x81,
0x01,0x03,0xFB,0x08,0xB5,0x00,0xB6,0x82,0x1C,0x3E,0xC2,0x1C,0x84,0xDD,0xED,0xF3,
0xF9,0x7E,0xC0,0x76,0xC0,0x26,0x00,0x0E,0xB0,0x2C,0x18,0x02,0x75,0xC0,0xE0,0x84,
0xF0,0xF0,0xF9,0xD1,0x7E,0xC0,0x7E,0xC0,0x16,0xC0,0x1C,0xFC,0x57,0x5D,0x84,0x80,
0x80,0xC0,0xC1,0x7E,0xC0,0x6E,0xC0,0x86,0x5C,0xBA,0x74,0xEA,0x50,0x8E,0x24,0xFC,
0x81,0x01,0x21,0x03,0xD1,0x00,0x7E,0xC0,0x47,0xC0,0x87,0x80,0x5C,0x2E,0x17,0x6B,
0xB5,0xBA,0x18,0x06,0x40,0x0C,0x7F,0xD2,0x7F,0xE4,0x7F,0xF6,0x38,0x36,0xC1,0x00,
0x84,0x01,0x07,0x1F,0x3F,0x02,0x1D,0x82,0xFF,0xE0,0x0F,0x76,0x05,0x20,0x0F,0xDA,
0x9C,0x5A,0x3D,0x92,0x09,0x40,0x44,0x4E,0x0C,0x15,0x80,0x10,0x1A,0x3A,0x57,0x12,
0x80,0x28,0x0C,0x1C,0x2A,0x08,0x40,0x01,0x23,0x23,0x35,0x63,0x05,0xC1,0x00,0x8A,
0x07,0x0B,0x15,0x0A,0x00,0x0B,0x0B,0x05,0x0E,0x1F,0x08,0x3A,0xC2,0xFF,0x08,0x3F,
0x0F,0xB8,0x1E,0x25,0xA7,0x6F,0x92,0x44,0x91,0x88,0x0A,0x23,0x22,0x70,0xA8,0x71,
0x31,0x2B,0x03,0x25,0x61,0x70,0xB0,0x68,0xA2,0x02,0x07,0x06,0x8A,0x93,0x46,0x0A,
0x02,0x00,0x40,0x04,0xF0,0xFC,0xFC,0xB8,0x00,0x98,0x98,0x90,0xC0,0x00,0x83,0x80,
0xC3,0xF7,0x0E,0x58,0x3D,0x96,0x81,0xE0,0x1E,0x67,0x95,0xAB,0x57,0x8A,0x00,0x22,
0x30,0xA2,0x03,0x27,0x0A,0x02,0x88,0x61,0x23,0x61,0xB0,0x24,0x06,0x0E,0x05,0xC4,
0xC0,0x00,0x8C,0x5E,0xAF,0x50,0x0F,0x2B,0x57,0x2A,0x00,0x2E,0x1E,0x2E,0x14,0xC0,
0x00,0x84,0x40,0xE0,0xF0,0xFC,0x69,0x9B,0x18,0xC5,0x8D,0x7F,0xAD,0x52,0x04,0x20,
0x02,0x00,0x10,0x80,0x00,0x08,0x18,0x9C,0x00,0xBF,0x93,0x00,0x00,0x40,0x00,0x5C,
0xBE,0x00,0x74,0x74,0x00,0xC0,0xE0,0xF1,0xE3,0x00,0x60,0x61,0x61,0x41,0x1A,0x92,
0x82,0x01,0x81,0x69,0xDB,0x81,0xF0,0x1E,0xEA,0x88,0x6B,0x54,0xA9,0x02,0x10,0x00,
0x02,0x40,0x02,0xB9,0x86,0x2E,0x5F,0x00,0x2E,0x2E,0x00,0x02,0xFF,0x8E,0x12,0x12,
0x42,0x02,0x00,0x00,0xFF,0xFF,0xA5,0x00,0xFF,0x39,0x30,0x2B,0xC0,0x00,0x82,0xE0,
0xF3,0x0F,0x17,0x81,0xF8,0x5F,0xFA,0x17,0x2A,0x89,0xFD,0xFF,0xAB,0x45,0x10,0x82,
0x08,0x00,0x04,0x03,0x36,0x87,0x30,0x38,0x5C,0x38,0x34,0x52,0x10,0x0A,0x7B,0x81,
0x00,0x01,0x6F,0x87,0x95,0xC0,0xAE,0x2E,0x17,0x00,0x00,0x16,0x8B,0x81,0xC0,0x09,
0x74,0xD2,0x00,0x90,0x01,0x01,0x6E,0x96,0x2A,0x00,0x8A,0x02,0x10,0x84,0x00,0x04,
0x04,0x0E,0x96,0x0D,0x08,0xF0,0x0F,0xFA,0x86,0xE0,0xF0,0x60,0x00,0x60,0x60,0x2D,
0x31,0x0D,0x17,0x45,0xDD,0x9D,0x1F,0x1F,0x3F,0x3F,0x7F,0x5F,0xDF,0xAF,0xDF,0xAF,
0x9F,0x2F,0x5F,0x2B,0x5F,0x2F,0x57,0x2B,0x17,0x2A,0x95,0x82,0x89,0x42,0x49,0x22,
0x20,0x11,0x08,0x23,0x1D,0xC0,0x00,0x82,0x01,0x03,0x07,0x39,0x32,0x8F,0x2A,0x04,
0xD4,0xFF,0x8E,0xBF,0xFF,0x7F,0xAF,0x7F,0xAB,0x57,0x2A,0x55,0x09,0x22,0x00,0xE0,
0x1C,0x03,0x60,0x83,0x3E,0xF7,0x0F,0x07,0x8D,0x82,0x7E,0x3E,0xC1,0x00,0x81,0x02,
0x06,0x17,0x81,0xF8,0x7D,0xDB,0x2F,0xEE,0x83,0xFE,0xD0,0xA0,0x15,0xE5,0x05,0xBC,
0x87,0xB0,0xFC,0x57,0xAA,0x55,0x80,0x01,0x0D,0xBE,0x86,0x8F,0xBD,0x43,0x7F,0xBF,
0xBF,0x26,0xF4,0x81,0x83,0x07,0xD3,0x03,0x48,0x82,0xF0,0xF8,0x05,0xDA,0x0F,0xE1,
0x82,0xE3,0xDD,0xC1,0xD8,0x8B,0xEE,0xF1,0xFF,0xFF,0xF9,0xFC,0xFE,0x3F,0x1F,0x63,
0x81,0x1F,0xE2,0x87,0x09,0x03,0x0F,0xFD,0xBB,0x4E,0x38,0x16,0x29,0x81,0x80,0x06,
0x07,0xC0,0xFC,0x0D,0x06,0x81,0x07,0x0E,0x96,0x4B,0x97,0x81,0xCE,0x0B,0x93,0xC1,
0xF0,0x82,0xF8,0xF8,0x0F,0xD5,0x81,0xC0,0xC0,0xF8,0x00,0x0F,0x96,0xE0,0xE0,0xC0,
};
// read sector
void read_sector()
{
if( side == 0)
{
byte i = 0, s = sector - 1;
while(1)
{
uint16_t w = pgm_read_word_near(track0[s] + i);
sector_data[i] = (uint8_t)w;
sector_data[i+1] = (uint8_t)(w >> 8);
if(i==254) break;
i += 2;
}
}
else
{
byte i = 0, s = sector - 1;
while(1)
{
uint16_t w = pgm_read_word_near(track1[s] + i);
sector_data[i] = (uint8_t)w;
sector_data[i+1] = (uint8_t)(w >> 8);
if(i==254) break;
i += 2;
}
}
}
int main() {
// init();
cli();
prepare_track_header();
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)
{
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;
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);
}
}
Ура! С таким кодом у меня уже грузится бут с SD карты!
NAKED имеет смысл для функций целиком из ассемблерных вставок
Так, добился я загрузки бута с SD карты, но теперь другая проблема... не грузится нормально то что после 1-ой дорожки... завтра буду думать с чем это связано...
Позвольте тоже немного встрять. Слежу за Вашей разработкой с очень внимательным интересом, очень многообещающая идея. И, что примечательно, она движется. Аплодирую стоя на голове.
Ваш выбор платформы не собираюсь ни критиковать, ни поддерживать - каждый может по Вашим исходникам сделать свой вариант. Даже, возможно, я одолел бы :) STM, конечно, дал бы развернуться во всю ширь и все такое, но выбор сделан, ардуина куплена :) Если для экспериментов Вам нужна будет дунька мега - могу предложить свою - все равно валяется, место занимает, а у Вас может на благое дело пойти :)
Если все-таки будете присматриваться в сторону ARM, позволю себе порекомендовать серию Discavery от STM - распространенная платформа, имеет все необходимое для старта из коробки (еще бы кило мозгов прилагался, тогда и у меня бы заработала, наверное :)).
П.С. Извиняюсь, сразу забыл спросить - в чем Вы писали этот код, какая среда?
Да у меня она тоже есть, для второго 3D принтера брал, пока что не доделал, так что можно в крайнем случае её использовать :)
Код делался в Arduino 1.6.8, в принципе, легко переносится в AVR Studio
- - - Добавлено - - -
Так, ну что, в целом вроде SD нормально работает, то что часто читаются сектора - не проблема, т.к. чтение же идет не постоянно, а выключается при отключении мотора. Сделал так, что не делается lseek при переходе к 1 сектору дорожки с последнего, а просто подставляются значения кластера/сектора, которые были при переходе на дорожку. Основная проблема сейчас это передвижение указателя в файле при смене дорожек, очень долго это делается стандартной функцией. Придется делать таблицу кластеров при открытии файла. Это снимет все проблемы.
Ура! Я загрузил дримтимовскую DIZZY 3.5 с microSD карты!!! Это успех! Правда пока что не все файлы грузит. Где-то что-то не успевает. Надеюсь, что сегодня доделаю!
UPD: теперь уже и ROBOCOP 3 грузится :)
Жги!