Но вскоре написал свой собственный.
Затем используя 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…