Ход мысли - правильный. Из помех на пути - невозможность обращения проца к слову по нечетному адресу
Т.к. DATA байтовый, он может залечь легко и с нечетного адреса и при первом же HDR.CRC := получим ёк.
Гарантировать лежку DATA с четного адреса можно :

1.
Рукотворно после проверки и внедрения, при необходимости, например лишнего типа DATA :array[ -1...127] of byte


2.
Изначального расположения DATA в FB или в структуре с явными предварительными выравнивающими байтами типа
VAR_INPUT
d : dword;
b1,b2 : byte;
DATA : ..[0..127]
В общем развитие варианта 1.


3.
Отказа от базового типа DATA как байтового. А нафига байт-то сдался ?
DATA : array[0..63] of word;


4.
Вообще отказа от промежуточных буферов. А на фига буфера-то нужен ?
НDR : array[0..??] of TiceHeader; //это и есть буфер. Сюда/отсюда и пишем/читаем, и кузнец нам не нужен


5.
Простого необращения к полям структур в стремных местах
X : TiceHeader;

FOR I := 0 TO 5 DO
HDR := ADR(DATA) + I * SIZEOF(TiceHeader);
X.CRC := GetCRC16;
X.Size := 3;
X.Signature := I;
HDR^ := X; //тута нет обращений к полям
END_FOR


6.
Юзания функций типа SysMemCpy (местного аналога) для переноса абстрактных куч байтов