Сообщение от
Trol73
track_data[]
тогда на буфер сектора надо будет 512 байт а не 256
- - - Добавлено - - -
как вариант можно нечто такое расмотреть
Код:
alignas(256) static const uint8_t mfmtab_h[256] = { .... };
alignas(256) static const uint8_t mfmtab_l[256] = { ... };
alignas(256) static uint8_t sect_data[2][256];
register uint8_t rdbuff asm("r3"); // тут держим старшую половину адреса текущего буфера
register uint8_t rdpos asm("r4"); // тут позиция в буфере
ISR(USART_UDRE_vect, ISR_NAKED)
{
asm ("push r31");
asm ("push r30");
asm ("push r29");
// формируем указатель в буфере сектора
asm ("mov r31, r3");
asm ("mov r30, r4");
// читаем данные из буфера сектора
asm ("ld r29, Z");
asm ("inc r3");
// формируем указатель на mfmtab_h
asm ("ldi r31, hi8(mfmtab_h)");
asm ("mov r30, r29");
// чтение mfm_h
asm ("lpm r29, Z");
asm ("sts 0xc9, r29");
// формируем указатель на mfmtab_l
asm ("inc r31");
// чтение mfm_l
asm ("lpm r29, Z");
asm ("sts 0xc9, r29");
asm ("pop r29");
asm ("pop r30");
asm ("pop r31");
asm ("reti");
/* аналог на Си
uint8_t* pos = (uint8_t*)((rdbuff << 8) | rdpos);
UDR0 = mfmtab_h[*pos];
UDR0 = mfmtab_l[*pos];
rdpos++;
*/
}
тело ISR где то 19 тактов, GCC раз 5 больше выхлоп дает