Вы хоть раз пользовались симуляторами? Там все как раз совпадает с тем, что получается в железе. Если теория такая кривая, почему же тогда мат модели правильные?
Сделал вот так, создал одну переменную status, продефайнил её биты:
#define ALLOW_DRL 0
#define DRL_TURN_ON 1
#define DIRECTION 2
#define TRIG 3
#define TRIG1 4
и заменил все операции с переменной drl_turn_on на операции с битом DRL_TURN_ON переменной status:
drl_turn_on=0; ======> status&=~(1<<DRL_TURN_ON);
drl_turn_on=1; ======> status|=(1<<DRL_TURN_ON);
if(drl_turn_on==0) ======> if(!(status&(1<<DRL_TURN_ON)));
if(drl_turn_on) ======> if(status&(1<<DRL_TURN_ON));
В итоге получил только увеличение объёма кода на 3%... Думаю что это из-за увеличения арифметических операций, в первой строчке в левом столбце я просто присвоил 0 переменной, а в правом сначала идёт битовый сдвиг, потом операция инверсии, потом ещё и сложение.
Ну такие вещи сейчас не для использования же по прямому назначению покупаются, а как предмет коллекционирования. Тем более, состояние, как из магазина только.
Загружать, кстати, можно хоть с MP3 плеера, есть специальные программы - конверторы, где можно подобрать оптимальные для данного железа параметры звукового файла.