Пока чипы едут, начал ковырять ассемблер. Смотрю, как можно организовать цикл записи с АЦП в память. Вот как это выглядит:
- Код: Выделить всё • Развернуть
{{
Цикл записи сэмплов с АЦП в основную память.
Сигналом остановки служит изменение состояния
одного из выводов чипа. Это удобно тем, что
линии ввода/вывода доступны всем процессорам
без доступа к концентратору
}}
ORG 0
{
WRORD пишет в основную память, а значит
требует синхронизации с концентратором -
отсюда переменное число тактов.
}
loop wrword INA, addr '7..22
add addr, #1 '4
and addr, addr_mask '4
wrword INA, addr '7..22
add addr, #1 '4
test INA, stop_mask wz '4 Сказано остановиться?
wrword INA, addr '7..22
nop '4
add addr, #1 '4
wrword INA, addr '7..22
add addr, #1 '4
IF_NZ jmp #loop '4/8
' Запись остановлена, ждём команды на продолжение
{ .............. }
addr long 0
stop_mask long $0800_0000
addr_mask long $1FFF ' 8 КиБ под буфер сэмплов
Ну да, ничего особенного, ассемблер как ассемблер
Но пара интересных особенностей всё же есть. В большинстве процессоров, выполнение арифметических и логических операций безусловно влияет на флаги. Здесь же нужно явно указывать модификаторы WZ, WC - что и используется в моём коде. После тестирования бита остановки цикла, времени на условный переход не остаётся, иначе пропустим окно доступа к концентратору. Но так как модификатор WZ больше не используется, можно спокойно проверить условие в конце цикла. Ещё интересная возможность - условное выполнение любой операции. Существует 16 модификаторов IF_*, проверяющая различные комбинации флагов. Наличие условия не влияет на время исполнения операции - очень удобно, когда важно точно задать время выполнения участка кода. Есть также модификатор NR, который отменяет запись результат операции. Например, если надо проверить, возникнет ли переполнение при сложении двух чисел, не изменяя операнды, пишем
- Код: Выделить всё • Развернуть
add A, B wc nr
Продожение следует