x80 - CISC

Публичный форум для http://www.nedopc.org/nedopc

Moderator: Shaos

User avatar
Paguo-86PK
Maniac
Posts: 267
Joined: 12 Apr 2011 20:43
Location: Tashkent

x80 - CISC

Post by Paguo-86PK »

Сначала я пробовал адаптировать исходные ресурсы готового эмулятора.
Но вскоре написал свой собственный.

Затем используя Icarus Verilog начал разрабатывать с чистого листа.
Облачный x80 хоть и исполняет несколько инструкций, но по листингу можно видеть, что там я запутался.
Всё-таки Verilog я знаю куда хуже, чем стандартные ЯВУ…

Почему-то моделировать схему графически легче, чем Verilog листинг.
Во-первых, масштаб схемы можно изменять и визуально охватывать целиком всё. Это нельзя сделать с листингом, так как текст воспринимается всё же иначе. Даже несмотря на продвинутые редакторы с подсветкой синтаксиса и выделения модулей.
Во-вторых, путь сигнала графически просматривается моментально. Тогда как в листинге именованные проводники, даже с подсветкой, прослеживаются хуже.
В-третьих, проектирования цифровых узлов я освоил в тетрадках ещё в школе. Но обычную радиоэлектронику не одолел, так как цифра - куда проще в плане входа-выхода.
К тому же, программирование я освоил позже, чем сборку цифровых узлов с мигалками и генераторами звука или растра на ТВ.

Идеология
Процессор x80 является подправленным i8080A в плане таблицы команд.
Здесь я описывал задумку. Но, повторюсь…
Байт-код x80 более интуитивно понятный, чем у совместимых процессоров. Прежде всего, для кодирования программ голым дампом, так как ассемблер или Си - роскошь в моём случае.
У x80 код инструкций более прозрачен и шестнадцатеричные нибблы говорят сами про инструкцию.
В отличии от i8080/z80, x80 имеет только 8-битные константы поля операндов инструкции. Команды ветвления только короткие.
Система команд разрабатывалась не в угоду упрощения аппаратной реализации в перспективе, так как в XXI веке достаточно всяческих микроконтроллеров с самой разнообразной архитектурой. И как-то не красиво уже в наше время уродовать систему команд ради укорочения какого-то проводочка где-то в дешифраторе.

Префиксы
Программисту доступно 7 префиксов на прикладном уровне и дополнительный префикс на системном уровне.
Префиксы кодируются насквозь кодами 11h, 22h, 33h, 44h, 55h, 66h, 77h. Это легко запомнить и декодировать аппаратно.
Системный префикс имеет код 00h, что необычно. Для прикладной программы код 00h - операция останова «hlt». Тогда как для операционного кода останов не требуется и открывается восьмой префикс. Это единственная привилегированная операция. Но логически, если приложение прыгнуло в адрес занулённой памяти, то будет однозначный моментальный останов.

Регистры
В состав РОН входят 7 8-битных регистров - AL/BL/CL/DL/BH/CH/DH и ячейка памяти [BX] (аналог M от i8080/z80)..
Имеются и регистровые пары - BX/CX/DX. А также и указатели - SP/BP/SI/DI.
Тем самым, в распоряжении программиста имеется почти весь набор регистров x86.

Прерывания
Имеется 10 инструкций программного прерывания с кодами F0…F9, что легко запомнить.
Они легко расширяются до 80 при помощи префиксов: 11 F0…F9, 22 F0…F9, 33 F0…F9, 44 F0…F9, 55 F0…F9, 66 F0…F9, 77 F0…F9.

Константы
Коды операций 80…BF загружает непосредственную константу в поле операндов инструкции. Аппаратно схему дешифратора это упрощает.
В комбинации с префиксом команда может иметь до трёх байтов:

Code: Select all

   04   |MOV AL,[BX]   ; Загрузка произвольной ячейки памяти в регистр #4
   A4 CE|MOV AL,0xCE   ; Загрузка непосредственной ячейки памяти в регистр #4
55 A4 CE|MOV AL,[BX-50]; Загрузка индексируемой ячейки памяти в регистр #4
Можно заметить, что добавление префикса несильно меняет логику команды.
В отличии от z80 с двумя индексными регистрами IX/IY, здесь за индексный регистр можно указывать любой из 7, почти как в x86.

Ветвления
Кодирование операций ветвлений сквозное и имеет коды BA…BF, что можно читать, например, BC как Branch by Carry.
Размах перехода у этих команд ±127 байтов, но с помощью 7 префиксов размах расширяется до ±1023 байтов.
Чтобы совершить прыжок на абсолютный адрес, необходимо его загрузить в стек и выполнить команду RET.

Постфиксы
В состав команд ветвления входят ситуации, когда команда условного перехода замыкается на себя, провоцируя бесконечный цикл.
Аппаратно на уровне загрузки кода такие случаи исключаются и преобразовываются в особые коды префиксов.
Так, «BC FE» зациклена на себя при переносе - «JC $». Однако дешифратор предотвращает это, генерируя префикс #14.
Тем самым, «BC FE» уже из команды ветвления интерпретируется как «CLC».

Аппаратная реализация
Первоначально может показаться, что аппаратно загружать в буфер инструкции из памяти, предусматривая префиксы, постфиксы и «hlt» как дополнительный префикс в режиме ядра - довольно непросто.
Однако, используя LogiSim, удалось разработать достаточно компактную схему, выполняющую все основные функции по корректной загрузке команды любой длины в буфер:

P.S.: Здесь я тренировался своим RISC, приобретая опыт работы с памятью.
Если активно заниматься проектом, можно воплотить этот x80 в рамках визуального симулятора реального времени LogiSim. Что предоставит некоторый опыт для дальнейшего перевода проекта на уровень Verilog…
You do not have the required permissions to view the files attached to this post.
Last edited by Paguo-86PK on 16 Jan 2020 16:07, edited 4 times in total.
User avatar
Paguo-86PK
Maniac
Posts: 267
Joined: 12 Apr 2011 20:43
Location: Tashkent

Re: x80 - 8-битный CISC

Post by Paguo-86PK »

reserved
User avatar
Paguo-86PK
Maniac
Posts: 267
Joined: 12 Apr 2011 20:43
Location: Tashkent

Re: x80 - 8-битный CISC

Post by Paguo-86PK »

reserved
User avatar
Paguo-86PK
Maniac
Posts: 267
Joined: 12 Apr 2011 20:43
Location: Tashkent

Re: x80 - 8-битный CISC

Post by Paguo-86PK »

reserved
User avatar
Paguo-86PK
Maniac
Posts: 267
Joined: 12 Apr 2011 20:43
Location: Tashkent

x80 - 8-битный CISC

Post by Paguo-86PK »

Практичeски год прошёл…
Так как я запутался в узле управления внешней памятью и здесь это прослеживается на cpu.v в строчках 42…98 приличным бардаком, была мысль подойти к решению этой проблемы со стороны графического дизайна принципиальной схемы. А так как серьёзная OrCAD и весит достаточно серьёзно, имея к тому же уйму багов в графическом редакторе, я решил использовать более простой инструмент - LogiSim.
Здесь я уже построил RISC и узел управления шинами более-менее работоспособный.
Однако, этот узел не применим в моём CISC и требуется заново всё разрабатывать и отлаживать.

Удалось лишь проработать узел регистрации x80-команд.
А именно:
  • IC (Instruction Code) - регистр хранения кода активной команды
  • IB (Instruction Base) - регистр хранения префикса активной команды
  • ID (Immediate Data) - регистр хранения константы активной команды
  • IA (Instruction Align) - регистр опционального выравнивания команды

 Демонстрация CISC-схемы в LogiSim

В принципе, можно видеть дешифрацию 21 команды в ASCII-поток под Терминал. Тем самым, получился своеобразный дизассемблер x80-команд, выполненный на аппаратном уровне с помощью трёх ПЗУ малой ёмкости. Где основная хранит обозначение мнемоники, правая хранит коды управления выборкой операндов, а нижняя ПЗУ хранит имена регистров, операций АЛУ и индексы.
Тем самым, ничего не мешает перепрошить ПЗУ уже под микрокод, а Терминал заменить исполнительным узлом управления регистрами, стеком и памятью. Правда, тогда схема разрастётся уже за пределы экрана и не будет пригодна для наглядного визуального охвата её работы в открытом виде, без упакованных модулей.

Таким образом, с помощью простого LogiSim я прощупываю пути к корректному логическому описанию моего x80 средствами Verilog, так как в LogiSim можно оперативно прервать работу схемы в любой момент и изучить всё состояние схемы в деталях, внося коррекцию без перезапуска. Тогда как в Verilog я, как разработчик, обязан чётко понимать по диаграммам что где должно переключаться в такой-то момент. А это для меня слишком затруднительно на моём текущем уровне владения Verilog.
You do not have the required permissions to view the files attached to this post.
User avatar
Paguo-86PK
Maniac
Posts: 267
Joined: 12 Apr 2011 20:43
Location: Tashkent

x80 - 8-битный CISC

Post by Paguo-86PK »

Вчерa весь вечер потратил на перенос схемы с LogiSim в Proteus…
Так как многие логические элементы изображаются фигурными и слишком крупно, пришлось изрядно потрудиться и над IEC-дизайном. Почему-то в LogiSim с этим особых проблем не возникало, тогда как в OrCAD и Proteus дефолтная графика слишком по-детсадовски огромна! :esurprised:

Не удалось применить микросхемы одной серии и пришлось смешивать S/ALS/F/HC/HCT, что уже довольно не хорошо! А когда почти закончил, ахнул от величины схемы в корпусах: 20 микросхем! :o
Почему почти? Один бит (самый старший в ID на LogiSim-дизайне) не смог никуда разместить! Отдельно ТМ2 добавлять - тоже не очень красиво, так как помимо тактового входа требуется ещё разрешающий. А это требует вентилей опять же…
И U19/U20 корпусами выдались как знаменитый ИД3! :surprised:

В общем, теперь сижу и думаю…
По-своему красиво было бы процессор свой живьём собирать отдельными платками-модулями для каскадной сборки.
А с другой стороны - никак не ожидал, что модуль выборки команд получится таким концентрированным, объёмным и сложным… :roll:

P.S.: Два месяца прошло, а чем серьёзнее я хватаюсь за идею, тем больше разочарования и ошеломительных подробностей… :econfused:
You do not have the required permissions to view the files attached to this post.
User avatar
Lavr
Supreme God
Posts: 16682
Joined: 21 Oct 2009 08:08
Location: Россия

Re: x80 - 8-битный CISC

Post by Lavr »

Paguo-86PK wrote:Вчерa весь вечер потратил на перенос схемы с LogiSim в Proteus…
Так как многие логические элементы изображаются фигурными и слишком крупно, пришлось изрядно потрудиться и над IEC-дизайном. Почему-то в LogiSim с этим особых проблем не возникало, тогда как в OrCAD и Proteus дефолтная графика слишком по-детсадовски огромна! :esurprised:
Ну во-первых, в Proteus есть выбор между фигурными и НЕфигурными элементами,
а во-вторых, в Proteus без потери функционала можно нарисовать собственные элементы
любой произвольной формы.
Вот по-детсадовски жаловаться на пакеты с широкими возможностями как-то неуместно. :-?
iLavr
User avatar
Shaos
Admin
Posts: 24021
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: ×⁸₀ - CISC₈ ®

Post by Shaos »

Нос буратино ушёл в курилку...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Paguo-86PK
Maniac
Posts: 267
Joined: 12 Apr 2011 20:43
Location: Tashkent

Re: ×⁸₀ - CISC₈ ®

Post by Paguo-86PK »

Shaos wrote:Нос буратино ушёл в курилку...
Спасибо! :oops:
User avatar
Paguo-86PK
Maniac
Posts: 267
Joined: 12 Apr 2011 20:43
Location: Tashkent

x80 - CISC

Post by Paguo-86PK »

Потрaтил три дня на то, чтобы подогнать свой HTML5-эмулятор под новый префикс - «00».
Казалось бы - пустячок!
На самом же деле - рухнуло всё!
Исчезла вся таблица команд, отказал ассемблер и дизассемблер, отказало и само ядро эмуляции.
И все три дня я шаг за шагом, средствами встроенного в Хром отладчика, корректировал десятки моментов по разным строчкам в файле с общим числом строк более 6500 :exclaim:

В итоге, пришлось забраковать частично то решение, которое я реализовал в схеме.
В схеме команда без префикса имеет префикс по-умолчанию #8, а «супер-префикс» для нужд супервизора имеет код #0, что, казалось бы, схематически упрощает решение.
Однако, на многих сайтах я спорил на тему, что в своём x80 я не буду совершать банальные ошибки инженеров 70-х, которые ради упрощения топологии кристалла устроили исковерканную систему команд. В своём процессоре система команд, хоть и не так проста для новичка, но она не требует зубрёжки, если программировать прямо дампом. Большинство кодов - сквозные и шестнадцатеричные знаки кода являются аббревиатурой инструкции.

Тем самым, если описывать дешифрацию команд по схеме, то она усложняется. Так как в JavaScript команды я закодировал в стиле Verilog под модуль с «casex», то без префикса код 8 всё ломал и усложнял.
Пришлось оставить префикс по-умолчанию - код 0, а супер-префикс - код 8. И всё заработало как надо.

Теперь нужно думать, как доработать схему к новому принципу.
Хотя, если схема будет просто ссылаться на адрес микрокода - то ничего менять не нужно.
А если схема будет реальной CISC-архитектурой, то данная мелочь с префиксами, если её не исправить, усложнит узел дешифратора не так уж незначительно. :roll: