Shaos wrote:
Копирование в 3-м и 4-м тактах цикла может происходить из триады:
0000 - на шине данных по адресу DPn (виртуальный регистр N)
0001 - на шине данных по адресу DPo (виртуальный регистр O)
0010 - на шине данных по адресу DPp (виртуальный регистр P)
0011 - регистр F
0100 - регистр A
0101 - регистр B
0110 - регистр H (старшая триада текущего DPx)
0111 - регистр M (средняя триада текущего DPx)
1000 - регистр L (младшая триада текущего DPx)
1001 - регистр T0
1010 - выход OPA(A,T1)
1011 - выход OPB(A,B,T1,T2,T3)
1100 - выход сумматора (который всегда складывает A и T1)
1101 - регистр A сдвинутый влево через флаг BCF
1110 - регистр A сдвинутый вправо через флаг BCF
1111 - сюда можно поместить особые случаи, которые можно кодировать следующими 4-мя битами
в триаду:
0000 - на шине данных по адресу DPn (виртуальный регистр N)
0001 - на шине данных по адресу DPo (виртуальный регистр O)
0010 - на шине данных по адресу DPp (виртуальный регистр P)
0011 - регистр F
0100 - регистр A
0101 - регистр B
0110 - регистр H (старшая триада текущего DPx)
0111 - регистр M (средняя триада текущего DPx)
1000 - регистр L (младшая триада текущего DPx)
1001 - регистр A и флаг BCF
1010 - регистр A и флаг RSF
1011 - регистр A и оба флага BCF и RSF
1100 - вывод на выходной регистр GPIO
1101 - регистр T1 (старшая триада регистра TP)
1110 - регистр T2 (средняя триада регистра TP)
1111 - регистр T3 (младшая триада регистра TP)
(не все комбинации источников и приёмников на практике возможны - например нельзя скопировать из L в T1 или из N в H)
Чего-то наверное много дополнительного декодирования тут придётся делать - наверное можно придумать какое-то более детальное разбиение на флаги, причём оставаясь в пределах тех же самых 8 бит?
Например 4-битный адрес микросхемы памяти 74189 будет подаваться и когда она приёмник, и когда она источник, и это всегда будет одно из нижеследующего (MEMADR):
00 - адрес будет выбран в зависимости от состояния младшего трита T0 (N:0010, O:0000, P:0001)
01 - адрес будет выбран в зависимости от состояния флага DPF (N:0010, O:0000, P:0001)
10 - адрес будет взят с 4-битного регистра SP (0000...1111)
11 - адрес будет установлен в 0011 (для выбора 9-тритного регистра TP)
Далее и по входу, и по выходу нужно будет мультиплексировать-демультиплексировать выходы и входы - если эта память является приёмником (DSTMUX):
00 - подключаем входы нулевого канала на внутреннюю шину, чтобы записать T1/H
01 - подключаем входы первого канала на внутреннюю шину, чтобы записать T2/M
10 - подключаем входы второго канала на внутреннюю шину, чтобы записать T3/L
11 -
включает особые случаи
Если эта память является источником (SRCMUX):
00 - подключаем выходы нулевого канала на внутреннюю шину, чтобы прочитать T1/H
01 - подключаем выходы первого канала на внутреннюю шину, чтобы прочитать T2/M
10 - подключаем выходы третьего канала на внутреннюю шину, чтобы прочитать T3/L
11 -
подключаем выходы операций на внутреннюю шину
Те же самые биты могут выбирать один из отдельно стоящих троичных регистров (DSTMUX или SRCMUX):
00 - регистр T0
01 - регистр F
10 - регистр A
11 - регистр B
Что является источником, а что приёмником (DIRECT):
00 - с регистра на шину (9-тритный адрес берётся с памяти)
01 - с шины на регистр (9-тритный адрес берётся с памяти)
10 - с регистра на память
(сюда также подпадают особые случаи)
11 - с памяти на регистр
(сюда также подпадают операции)
И ещё осталось повыбирать операции и действия с флагами, а битов больше нет...
P.S. Хотя операции можно попробовать воткнуть через память (см. выше, что добавлено жирным) и адресовать их теми же битами MEMADR, что и память и иногда учитывать код операции (T0):
00 - выход OPA(A,T1)
01 - выход OPB(A,B,T1,T2,T3)
10 - выход сумматора (который всегда складывает A и T1)
11 и T0.l==N - регистр A сдвинутый влево через флаг BCF
11 и T0.l==O - например значение SP в троичном виде (?)
11 и T0.l==P - регистр A сдвинутый вправо через флаг BCF
Особые случаи можно включать выбирая DIRECT=10 (с регистра на память), DSTMUX=11 (особые случаи) и кодируя действие через комбинацию MEMADR и SRCMEM (который тут не будет использоваться по назначению) - как раз получается 16 особых случаев (см. тут) - причём MEMADR будет корректно выбирать адресацию через DPF (01) или адресацию через SP (10) если SRCMEM будет нулевым.
А вот что делать с флагами? Или просто заполнять те флаги, какие надо для соответствующих операций?