Восстановил таблицу команд этого процессора.
Спойлер     +------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
     |  .0  |  .1  |  .2  |  .3  |  .4  |  .5  |  .6  |  .7  |  .8  |  .9  |  .A  |  .B  |  .C  |  .D  |  .E  |  .F  |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 0. | HLT  |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    |      | D0+1 | D0+2 | D0+3 | D0+4 | D0+5 | D0+6 | D0+7 | D0+8 | D0+9 | R,T0 | R,T0 | R,T0 | R,T0 | R,T0 | R,T0 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 1. |      |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    | D1+0 | D1+1 | D1+2 | D1+3 | D1+4 | D1+5 | D1+6 | D1+7 | D1+8 | D1+9 | R,T1 | R,T1 | R,T1 | R,T1 | R,T1 | R,T1 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 2. |      |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    | D2+0 | D2+1 | D2+2 | D2+3 | D2+4 | D2+5 | D2+6 | D2+7 | D2+8 | D2+9 | R,T2 | R,T2 | R,T2 | R,T2 | R,T2 | R,T2 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 3. |      |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    | D3+0 | D3+1 | D3+2 | D3+3 | D3+4 | D3+5 | D3+6 | D3+7 | D3+8 | D3+9 | R,T3 | R,T3 | R,T3 | R,T3 | R,T3 | R,T3 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 4. |      |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    | D4+0 | D4+1 | D4+2 | D4+3 | D4+4 | D4+5 | D4+6 | D4+7 | D4+8 | D4+9 | R,T4 | R,T4 | R,T4 | R,T4 | R,T4 | R,T4 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 5. |      |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    | D5+0 | D5+1 | D5+2 | D5+3 | D5+4 | D5+5 | D5+6 | D5+7 | D5+8 | D5+9 | R,T5 | R,T5 | R,T5 | R,T5 | R,T5 | R,T5 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 6. |      |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    | D6+0 | D6+1 | D6+2 | D6+3 | D6+4 | D6+5 | D6+6 | D6+7 | D6+8 | D6+9 | R,T6 | R,T6 | R,T6 | R,T6 | R,T6 | R,T6 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 7. |      |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    | D7+0 | D7+1 | D7+2 | D7+3 | D7+4 | D7+5 | D7+6 | D7+7 | D7+8 | D7+9 | R,T7 | R,T7 | R,T7 | R,T7 | R,T7 | R,T7 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 8. |      |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    | D8+0 | D8+1 | D8+2 | D8+3 | D8+4 | D8+5 | D8+6 | D8+7 | D8+8 | D8+9 | R,T8 | R,T8 | R,T8 | R,T8 | R,T8 | R,T8 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 9. |      |      |      |      |      |      |      |      |      |      | ADD  | SUB  | AND  | OR   | EOR  | MOV  |
|    | D9+0 | D9+1 | D9+2 | D9+3 | D9+4 | D9+5 | D9+6 | D9+7 | D9+8 | D9+9 | R,T9 | R,T9 | R,T9 | R,T9 | R,T9 | R,T9 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| A. | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | ARG  | ARG  | ARG  | ARG  | CLR  | NOT  |
|    | A0   | A1   | A2   | A3   | A4   | A5   | A6   | A7   | A8   | A9   | A,A  | A,B  | A,C  | A,D  | AF   | AF   |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| B. | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | ARG  | ARG  | ARG  | ARG  | CLR  | NOT  |
|    | B0   | B1   | B2   | B3   | B4   | B5   | B6   | B7   | B8   | B9   | B,A  | B,B  | B,C  | B,D  | BF   | BF   |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| C. | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | ARG  | ARG  | ARG  | ARG  | CLR  | NOT  |
|    | C0   | C1   | C2   | C3   | C4   | C5   | C6   | C7   | C8   | C9   | C,A  | C,B  | C,C  | C,D  | CF   | CF   |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| D. | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | REG  | ARG  | ARG  | ARG  | ARG  | CLR  | NOT  |
|    | D0   | D1   | D2   | D3   | D4   | D5   | D6   | D7   | D8   | D9   | D,A  | D,B  | C,D  | D,D  | DF   | DF   |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| E. | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  |
|    | E000 | E100 | E200 | E300 | E400 | E500 | E600 | E700 | E800 | E900 | EA00 | EB00 | EC00 | ED00 | EE00 | EF00 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
| F. | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  | INT  |
|    | F000 | F100 | F200 | F300 | F400 | F500 | F600 | F700 | F800 | F900 | FA00 | FB00 | FC00 | FD00 | FE00 | FF00 |
+----+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
 Сейчас сижу в рутине описания модели на Verilog, так как концептуально имеются некоторые трудности в описании некоторых команд.
Из таблицы можно заметить всего 7 основных групп команд:
- HLT: Останов 
- REG: Активация конкретного регистра в качестве аккумулятора результата 
- ARG: Установка операндов для АЛУ-операций 
- CLR/NOT: Сброс/инверсия флагов AF/BF/CF/DF 
- INT: Программное прерывание на указанный адрес 
- ALU: Операции АЛУ 
- 99 префиксов-расширителей функциональности 
Вот именно под префиксами логика работы команд меняется так сильно, что внятного описания действия операции ещё не найдено.
Возьмём за пример известную архитектуру x86 IA-32.
- ADD EAX,CS: DS: ES: FS: GS:[BX] 
- ADD EAX,SS: ES: GS:[BX] - префиксами "закодировано" слово "SEG" 
Такие инструкции искусственно вставлять в программу можно, хотя и мало толку. Но, в случае исключения, внутреннему отладчику такое странное сочетание префиксов может нести некую скрытую информацию.
Инструкция LEA EAX,[EAX+EAX*2+3] вроде бы работает и всё понятно.
Но, с позиции логического описания вектора адреса она - ошибочна, так как в качестве базового указателя и индекса здесь используется один регистр!
Да, для LEA-вычислений такой вектор может служить математическим выражением местами, но в качестве адресатора ячейки памяти это использовать нельзя: Получим исключение.
В моей архитектуре я к вопросу указателей подошёл со всей серьёзностью и строгостью. На аппаратном уровне сформирован "фильтр", который отсеивает такие ситуации.
Однако, система не генерирует "исключение", а помечает комбинацию префиксов особым флажком: "маргинальная адресация".
Чтобы понять механизм лучше, представьте, что в x86 инструкции "маргинализируют" указатель:
- ADD EAX,[EBX+EBX*2+3] работает как ADD EAX,(EBX*2+3) 
- SUB EAX,[EBX+EBX*2+3] работает как SUB EAX,(EBX*2+3) 
А вот что делать с командой "ADD [EBX+EBX*2+3],EAX" в таком случае?
Ведь не может она работать как "ADD (EBX*2+3),EAX" - логика здесь вообще не известна!
(Допустим, как CMP/TEST: Сложить (EBX*2+3) с EAX, но результат никуда не сохранять, только выставить флаги.)
И если Вы согласны, то...
Товарищи!
Вы на полпути к понимании концептуальной сложности "маргинальных указателей" в случае именно моей архитектуры...
А так как у меня регистр A0 используется за флаговый PSW, ряд операций вообще "в резерве":
- ADD A0,A0 - как ADD PSW,PSW абсолютно бессмысленный 
- SUB A0,A0 - как SUB PSW,PSW абсолютно бессмысленный 
- AND A0,A0 - как AND PSW,PSW абсолютно бессмысленный 
- OR A0,A0 - как OR PSW,PSW абсолютно бессмысленный 
- EOR A0,A0 - как EOR PSW,PSW абсолютно бессмысленный 
- MOV A0,A0 - как MOV PSW,PSW абсолютно бессмысленный 
(Есть мысль использовать такие операции для Форт-вычислений - в стеке внешнего сопроцессора.)
Для обработки префиксов-указателей и префиксов "маргиналов" был разработан Verilog-модуль и схема на ТТЛ (не закончена).
По схеме можно оценить, на сколько сложно обрабатывать "префиксы" вычислительно: Уйма К155ИМ3 и К555ИР23 с К555КП11.
С другой стороны, для "Homebrew Processor" я визуально через схему оцениваю, на сколько сложна архитектура.
Но, сложность имеет и другую сторону - ортогональную гибкость.
Ни в каком 8-битном процессоре невозможно описать операцию, типа:
; вот такой вектор "переваривает" Verilog-модель
ADD C5,[D1+2*D2+3*D3+4*D4+5*D5+6*D6+7*D7+8*D8+9*D9+65432]
; для компактности в ассемблере нужно использовать математическую нотацию и заменить квадратные скобки на решётку
ADD C5,#D1+2D2+3D3+4D4+5D5+6D6+7D7+8D8+9D9+65432
; сам "маргинал" указывается непосредственно в имени инструкции
ADD1986 C5,#D1+2D2+3D3+4D4+5D5+6D6+7D7+8D8+9D9+65432
; или перед решёткой
ADD C5,1986#D1+2D2+3D3+4D4+5D5+6D6+7D7+8D8+9D9+65432
Ознакомиться/экспериментировать с кодированием инструкций можно по этой ссылке...
Вся работа над архитектурой тянется довольно вяло из-за неожиданных сюрпризов.
На днях сделал набросок дизассемблера на Verilog и обнаружил ещё несколько "маргинальных инструкций", о которых не подозревал.
Дело в том, что в x86-архитектуре одну и ту же операцию можно закодировать чуть ли ни десятком способов.
Тогда как у меня с этим всё крайне строго, таблица истинности дешифратора команд довольно хитрая и не допускает дублирования: Каждую из операций можно выполнить только одним способом.
P.S.: Даже в JavaScript-эмуляторе я не знаю, как интерпретировать экзотические сочетания кодов, чтобы не допускать синонимов.
А на Verilog это на порядок сложнее...
						Отредактировано Alikberov (26-06-2023 18:20:13)