🇷🇺 | 🇬🇧 |
---|
История попыток создания модели процессора с интуитивно ясным набором команд.
- Страничка викии
- i8080 частичная совместимость по командам (краткость, методы, простота)
- i8086 частичная совместимость по ассемблеру (гибкость, указатели, регистры)
- i8080/i8086/z80 совместимость по машинному коду напрямую не предусматривается
- Запустить
▶️ демонстрацию в браузере
- CPU-182:
- 1-байтовый относительный скачок ветвлений (Jcnd
$-128 .. $ +127) - 8-битные РОН (BH CH DH AL BL CL DL)
- 16-битные регистровые пары (BX CX DX)
- 16-битные указатели (IP SP BP SI DI)
- 16-битная страница ОЗУ [0..65535]
- 1-байтовый относительный скачок ветвлений (Jcnd
- CPU-18x:
- 08x - Нуль-битный ALU (опытный фактор)
- 18x - 8-битный ALU
- 28x - 16-битный ALU
- 38x - 32-битный ALU
- 48x - 64-битный ALU
- CPU-x82:
- x80 - Релиз нуль-модификации (опытная модель)
- x81 - Модель первой модификации
- x82 - Модель второй модификации
- x83 - модель третьей модификации
- CPU-284:
- 2-байтовый относительный скачок ветвлений (Jcnd
$-32768 .. $ +32767) - 16-битные РОН (BH CH DH AL BL CL DL)
- 32-битные регистровые пары (BX CX DX)
- 24-битные указатели (IP SP BP SI DI)
- 24-битная страница ОЗУ [0..16777215]
- 2-байтовый относительный скачок ветвлений (Jcnd
- CPU-386:
- 3-байтовый относительный скачок (Jcnd
$-8388608 .. $ +8388607) - 32-битные РОН (BH CH DH AL BL CL DL)
- 64-битные регистровые пары (BX CX DX)
- 32-битные указатели (IP SP BP SI DI)
- 32-битная страница ОЗУ [до 4 Гб]
- 3-байтовый относительный скачок (Jcnd
Никаких x86-костылей, как EAX или RIP. Имена регистров не меняются, меняется их разрядность.
Вы уверены, что архитектура i8080 безнадёжно устарела? А Z80 - самый удачный его клон? Современными технологиями можно воссоздать программирование под модернизированную архитектуру. Почему бы не попробовать?
### Подробности
00: HLT - Всюду НОЛЬ - конец всего (например, файла, текста), т.к. это - логично;
80: NOP - Арифметическая петля -(-128) равно -128 - пустое действие;
FF: RET - Анти-НОЛЬ - анти-конец или продолжение основного с концом текущего.
🔂 Воспроизведение i8080-костылей:
┌─►RET Example:
Bx FF:Jcond $+1─┐ 1.RZ
┌──┘┌►Rcond │ 2.RNZ
└───┴───────────┘ 3.RPO
🔁 Воспроизведение x86-костылей:
Bx FE:Jcond $+0─┐ 1.REPZ
↑ ┌►REPcond │ 2.REPNZ
└─┴─────────────┘ 3.REPPO
🔂 Воспроизведение вызовов скрытых функций через пустой вызов:
┌─►RET Example:
Bx FF:Ccond $+1─┐ 1.DAA
┌──┘┌► «Other» │ 2.CLI/STI
└───┴───────────┘ 3.CPUID
🔁 Воспроизведение сложных команд через петлю переполнения стека:
Bx FE:Ccond $+0─┐ 1.WAIT
↑ ┌► «Complex» │ 2.MUL/DIV
└─┴─────────────┘ 3.MOVS/CMPS
[:page_facing_up: Таблица команд](http://htmlpreview.github.com/?http://github.com/Alikberov/x80/blob/master/emulator.html?instructions) составлялась с интуитивно ясной позиционной логикой:
Ax: Ассигнации регистров / ALU-операции;
Bx: Ветвления;
Dx: Декременты;
Fx: Функции.
✔️ Удачные решения (к запоминанию):
AB: ALU - Вычитание (SUB);
AD: ALU - Дизъюнкция (OR);
AE: ALU - Эксклюзивное ИЛИ(XOR);
... . . . . . . . . . . . . . .
BE: Ветка, если Эквивалент равенству
BF: Ветка, если Фиктивное равенство
... . . . . . . . . . . . . . .
DC: Декремент CX-указателя;
DD: Декремент DX-указателя;
... . . . . . . . . . . . . . .
CF: Смена Флага переноса (CMC);
F0..F7: Функция #n (INT n);
FF: Функциональный Финиш (RET);
❔ Экспериментальные наброски:
┌──┬──┬──┬──┬──┬──┬──┬──┐
AH:│??│??│TF│WF│PF│SF│CF│ZF│
└──┴──┴──┴──┴──┴──┴──┴──┘
Флаговый Регистр (AH - ALU Heap):
Бит 0:Zero (Нулевой флаг отвечает за Ноль);
Бит 1:Carry (Первый флаг отвечает за перенос 1 бита);
Бит 2:Signed(n - 2n = -n);
Бит 4:Word (1<<4 = 16-битовый режим);
Бит 5:Trace (1<<5 = Тридцать два - Трассировка)
❔ Особенности системного кода:
00: Префикс SS (не HLT-останов);
Система команд позволяет производить реверсивные операции АЛУ над аккумулятором (SUB, SBB, CMP):
5B |SUB AL,BL ; AL = AL - BL
AB 7F|SUB AL,0x7F ; AL = AL - 0x7F
33 5B |SUB DH,BL ; DH = DH - BL
33 AB 7F|SUB DH,0x7F ; DH = DH - 0x7F
44 5B |SUB BL ; AL = BL - AL
44 AB 7F|SUB 0x7F ; AL = 0x7F - AL
.. .. ..
5F |CMP AL,BL ; Test(AL - BL)
AF 7F|CMP AL,0x7F ; Test(AL - 0x7F)
33 5F |CMP DH,BL ; Test(DH - BL)
33 AF 7F|CMP DH,0x7F ; Test(DH - 0x7F)
44 5F |CMP BL ; Test(BL - AL)
44 AF 7F|CMP 0x7F ; Test(0x7F - AL)
Так как остальные реверсивные операции бессмысленны (ADD,ADC,AND,OR,XOR), они работают как операции сравнения:
5C |AND AL,BL ; AL = AL & BL
AC 7F|AND AL,0x7F ; AL = AL & 0x7F
33 5C |AND DH,BL ; DH = DH & BL
33 AC 7F|AND DH,0x7F ; DH = DH & 0x7F
44 5C |AND BL ; Test(BL & AL)
44 AC 7F|AND 0x7F ; Test(0x7F & AL)
## Системные трюки ### Порты ввода/вывода Доступ к памяти с относительным смещением от указателя и выходом за границы в 64кб обрабатывается как доступ к внешним устройствам.
MOV AL,[SP-1] ; Равно, как IN AL,255 если SP равен 0x0000
MOV [SP+1],AL ; Равно, как OUT 1,AL если SP равен 0xFFFF
Процессор не имеет особых операций управления внутренним состоянием. Все действия с командами PUSH/POP обеспечивают доступ к внутренним регистрам, если SP-указатель лежит на границе памяти. Если указатель стека ОБНУЛЁН или выставлен в максимум, нормальная работа команд PUSH/POP невозможна и обращается ко внутренним служебным ресурсам (регистрам отладки, контекста задачи, обратной совместимости с i8080/z80). Как правило, операционная среда должна контролировать подобные действия приложений, прерывая или симулируя нужные действия.
PUSH DX ; Если SP равен 0x0000, DX записывается в сервисные регистры
PUSH AX ; Пропустить текущий сервисный регистр
POP DX ; Если SP равен 0xFFFF, DX читается из сервисных регистров
POP AX ; Пропустить текущий сервисный регистр
PUSH CX ; Если SP равен 0x0001, CX индексируется страницу сервиса
В частности, это другой способ работы с портами ввода/вывода. Как вариант, если индекс страницы содержит шестнацатиричную букву ("A".."F"), она считается системной и закрыта для прикладного кода.