Ну ладно, расскажу ещё из странного по теме:
По крайней мере мои Падауки имеют непривычную маркировку - не сверху, а только на пузе, притом исключительно невнятную. Интересно, это у данного производителя всегда так? Получается, что когда вы встречаете очередную кетайскую поделку на контроллере с "затёртой" маркировкой, то оказывается, что это может быть и норма, и никогда этой маркировки не было!
Ещё момент про 16-битный таймер: по крайней мере на PFS154 доступ к
почти всей периферии сделан более-менее по современной классике - через регистры, хоть и в специальном адресном пространстве ввода-вывода. За исключением доступа к счётному регистру этого таймера, который делается через...
специальные команды ядра ldt16 и stt16!

Вы где такое раньше видели, чтобы специально для периферии в ядре был выделенный набор команд?! Я такое последний раз видел, разве что,
в 8048 контроллерах и может ещё в каких-то додревних архитектурах. Основной головняк в том, что в SDCC даже в последней версии (на нынешний день), похоже, работа с этими командами не оформлена должным образом. Поэтому приходится изгаляться. Пока что у меня получилось сделать так:
Делаем глобальную переменную, причём запихиваем её по конкретному адресу ОЗУ. Причём гугль И-И утверждает, что она должна выравниваться по
чётным адресам.
Код: Выделить всё
volatile __at(0x20) uint16_t T16C_current = 0;
Потом, когда надо, влепляем ассемблерную вставку, в которой параметром команды жёстко забиваем адрес, ранее занятый переменной:
Код: Выделить всё
//получаем данные таймера так, поскольку функция __sfr16 load недопилена в компиляторе
__asm
ldt16 0x20
__endasm;
//всё. Содержимое таймера скопировано в T16C_current
А как вы решили для себя эту проблему?