1

Тема: Койяанискаци - как платформа

Конечно, наверное немного не в тему.
Администрация, надеюсь, не будет против маленького пиара полёта фантазии…

Имеeтся Страница на Хабре для ознакомления с концептуальной частью идеи.
Ссылки на Эмулятор и некоторые исходники черновых набросков для симуляции/синтеза находятся на странице так же…

Всё это творение появилась в одном из ностальгических приступов на фоне затворничества 2020 года.
Основной целью было попытаться разработать некое устройство процессорного класса, где система команд не имела бы неясных битовых полей эзотерического назначения.
(Для сравнения, у i8080 и i8086 в битовых полях команд прослеживается отголосок восьмеричной системы счисления во всём, от кода команд до полей операндов. И многое там просто эзотерично, пока не ознакомишься с архитектурой достаточно глубоко.)

Основополагающим во всей концепции является максимальная открытость и развёрнутость во всём.
Все команды имеют код, смежный со смысловым значением читаемого визуально в стиле акына: Что видится и читается, то и железом исполняется.

Конечно, за год весь материал успел устареть.
Но базовые принципы не изменились.

Сейчас прорабатывается карта устройств ввода-вывода.
Но, концептуально сохраняется акцент на максимальную развёрнутость, чтобы самой карты УВВ не было вовсе.
Например, для работы с устройствами ввода-вывода выделено 10 архитектурных регистра общего назначения D0…D9:

╔════╤════════╤════════════════════════════════════════════════════════════════╗
║ D9 │  ИМС   │ Описание доступа к ресурсам микросхемы через РОН процессора    ║
╠════╪════════╪════════════════════════════════════════════════════════════════╣
║0x32│ i8232  │ D0 - Регистр Данных                                            ║
║    │1816ВЕ32│ D1 - Регистр Статуса                                           ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x45│ i8245  │ D0 - Данные                                                    ║
║    │        │ D1 - Адрес                                                     ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x53│ i8253  │ D0/D1/D2 - Каналы Счётчиков 0/1/2                              ║
║    │К580ВИ53│ D3 - Регистр Статуса Таймера                                   ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x55│ i8255  │ D0/D1/D2 - Порты A/B/C ППА                                     ║
║    │К580ВИ55│ D3 - Регистр Статуса ППА                                       ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x57│ i8257  │ D0/D2/D4/D6 - Каналы 0/1/2/3: ПДП Адрес                        ║
║    │        │ D1/D3/D5/D7 - Каналы 0/1/2/3: ПДП Счёт                         ║
║    │К580ВТ57│ D8 - Регистр Статуса ПДП                                       ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x72│ i8272  │ D0 - Регистр Статуса                                           ║
║    │FDD Unit│ D1 - Регистр Данных                                            ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x75│ i8275  │ D0 - Регистр Данных                                            ║
║    │К580ВГ75│ D1 - Регистр Статуса                                           ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x79│ i8279  │ D0 - Регистр Данных                                            ║
║    │К580ВВ79│ D1 - Регистр Статуса                                           ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x93│ FD1793 │ D0 - Регистр Команд / Регистр Статуса                          ║
║    │        │ D1 - Регистр Дорожки                                           ║
║    │        │ D2 - Регистр Сектора                                           ║
║    │1818ВГ93│ D3 - Регистр Данных                                            ║
╚════╧════════╧════════════════════════════════════════════════════════════════╝

Тем самым, в D9 помещается серийный индекс номенклатуры микросхемы, а с D0…D8 работают уже как с внутренними регистрами самой микросхемы УВВ.
То есть, разработчику, имеющему опыт работы с конкретной ИМС УВВ не нужно никаких команд типа IN/OUT.

Естественно, в эмуляторе пока практически мало чего реализовано, так как он работает сейчас в тестовом режиме, чтобы создать хоть какую-то среду разработки/отладки кода и оценить, насколько сама идея жизнеспособна.



2

Re: Койяанискаци - как платформа

Идея выглядит интересной, но стоило ли так жёстко привязывать регистры к конкретным микросхемам? (Я про периферию.) Ведь может понадобится ещё много чего подключить... Как-то теряется универсальность, как мне кажется.



3

Re: Койяанискаци - как платформа

Тут всё очень просто.

Говоря на языке z80/x86 с командами in/out, мы в регистр «B»/«DH» помещаем индекс ИМС конкретной серии, а в «C»/«DL» уже порт самой ИМС:

DH__DL
_B_ _C_
55h 00h|Порт A i8255 №1
55h 01h|Порт B i8255 №1
55h 02h|Порт C i8255 №1
55h 03h|Режим i8255 №1
55h 04h|Порт A i8255 №2
55h 05h|Порт B i8255 №2
55h 06h|Порт C i8255 №2
55h 07h|Режим i8255 №2
... ... ...
55h FCh|Порт A i8255 №64
55h FDh|Порт B i8255 №64
55h FEh|Порт C i8255 №64
55h FFh|Режим i8255 №64
-----------------------
53h 00h|Канал 0 i8253 №1
53h 01h|Канал 1 i8253 №1
53h 02h|Канал 2 i8253 №1
53h 03h|Режим i8253 №1
53h 04h|Канал 0 i8253 №2
53h 05h|Канал 1 i8253 №2
53h 06h|Канал 2 i8253 №2
53h 07h|Режим i8253 №2
... ... ...
53h FCh|Канал 0 i8253 №64
53h FDh|Канал 1 i8253 №64
53h FEh|Канал 2 i8253 №64
53h FEh|Режим i8253 №64

У меня в роли регистра «B»/«DH» выступает D₉, а D₈ выбирает порядковый номер в системе:

    MOV D9,0x55     ; Выбираем ИМС i8255/К580ВВ55
    MOV D8,1        ; Если в системе несколько i8255, указываем индекс
    MOV [BC1+1],D1  ; Считываем "Порт B" ИМС i8255 и сохраняем в память
    MOV D9,0x53     ; Выбираем ИМС i8253/К580ВИ53
    MOV D8,3        ; Если таймеров много, укажем индекс (1 из 256 штук)
    MOV D3,0xB6     ; Канал #2 в режим №3
    MOV D2,[BC1+1]  ; Младший байт коэффициента
    MOV D2,[BC1+2]  ; Старший байт коэффициента

Если по такой схеме к z80/x86 можно подключить до 64 штук i8253/i8255, то здесь можно подключить до 512 ИМС типа i8253/i8255, до 1024 ИМС типа i8275/i8279, до 128 ИМС типа i8257. То есть, суммарно - примерно до 25 тысяч различных периферийных интерфейсов. Думаю, хватит с лихвой!
Не так ли? roll



4

Re: Койяанискаци - как платформа

Принцип я понял, просто у меня вызвало некоторые сомнения то, что типы и регистры микросхем как бы заранее "зашиты" в архитектуру. Скажем, нужно будет добавить какую-то другую микросхему, да ещё и с похожим номером - тут это будет затруднительно, потому что типы микросхем и их регистры заранее заданы. Тем более, если номер этой новой тоже будет заканчиваться, скажем, на 57, как и у i8257.
Использование портов ввода-вывода в этом плане универсальнее, т.к. позволяет использовать абсолютно любые заранее неизвестные устройства.



5

Re: Койяанискаци - как платформа

Здeсь просто концептуальный приём.
Если на любительской практике наиболее доступными контроллерами периферии были ИМС серии i82xx, то ничто не мешает применять и триггеры/регистры серии sn74xx. Однако, концептуально я настоятельно рекомендую не коверкать карту дешифрации портов УВВ и назначать строгие адреса.
Например:

╔════╤════════╤════════════════════════════════════════════════════════════════╗
║ D9 │  ИМС   │ Описание доступа к ресурсам микросхемы через РОН процессора    ║
╠════╪════════╪════════════════════════════════════════════════════════════════╣
║0x06│ KS58006│ D0…D7 - Порты доступа к DTMF                                   ║
║    │1008ВЖ16│                                                                ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x31│ UM91531│ D0…D7 - Порты доступа к DTMF                                   ║
║    │1008ВЖ19│                                                                ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x70│ CMS8870│ D0…D7 - Порты доступа к DTMF                                   ║
║    │1008ВЖ18│                                                                ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x73│  74373 │ D0…D7 - Порты доступа к регистрам                              ║
║    │ 555ИР22│                                                                ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x74│  7474  │ D0…D7 - Порты доступа к триггерам                              ║
║    │ 155ТМ2 │                                                                ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x10│AY3-8910│ D0…D7 - Порты доступа к Синтезатору звука                      ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x49│ YM2149 │ D0…D7 - Порты доступа к Синтезатору звука                      ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x51│TDA5051A│ D0…D7 - Порты доступа к AC-Модему                              ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x06│ DS2406 │ D0…D7 - Порты доступа к 1-Wire                                 ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x08│ DS2408 │ D0…D7 - Порты доступа к 1-Wire                                 ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x20│ DS18S20│ D0…D7 - Порты доступа к 1-Wire                                 ║
╟────┼────────┼────────────────────────────────────────────────────────────────╢
║0x90│ DS9490R│ D0…D7 - Порты доступа к 1-Wire                                 ║
╚════╧════════╧════════════════════════════════════════════════════════════════╝

То есть, использовать можно любые ИМС, но при развязке дешифрации код из индекса конкретной ИМС должен отражаться и в индексе доступа.

Сегодня продолжил разработку эмулятора.
Добавил «Классический Режим» - режим работы ТТЛ-схемы в Logisim, где операция собирается из байтов не целым машинным циклом, а серией циклов.
В этим режиме в дизассемблере наглядно видно, как представлена та или иная команда в реальности.

Автозапуск
Классический режим

P.S.: На данный момент, из-за мелких неполадок ПК, заниматься разработкой получается раз в неделю…



6

Re: Койяанискаци - как платформа

https://ru.wikipedia.org/wiki/Койяанискаци



7

Re: Койяанискаци - как платформа

Восстановил таблицу команд этого процессора.

Спойлер

     +------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+------+
     |  .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)

Post's attachments

Иконка вложений vector_calculator.png 388.41 Кб, 36 скачиваний с 2023-06-23