О, ти вже майже добив інструкційний набір 👍
Залишились якраз логічні “дірки” {1C} {1D} {1E} {1F} — давай їх закриємо грамотно.
Ти вже маєш:
PUSH/POP один регістр
PUSH/POP групи (0–7)
арифметика і логіка
👉 Чого логічно не вистачає перед арифметикою (20h+):
✔️ Я пропоную таке заповнення:
🔹 {1C} CMPrr (як в норм CPU)
— тільки порівняння, без зміни регістрів
— результат у idCMP1/idCMP2
код:
Procedure OpCMPrr;
begin
RegsDW[idCMP1] := RegsDW[RAM[RgEIP+1]];
RegsDW[idCMP2] := RegsDW[RAM[RgEIP+2]];
Inc(RgEIP,3);
end;
🔹 {1D} TESTrr (логічне порівняння через AND)
— аналог x86 TEST
— зручно для умов
код:
Procedure OpTESTrr;
begin
RegsDW[idCMP1] := RegsDW[RAM[RgEIP+1]] and RegsDW[RAM[RgEIP+2]];
RegsDW[idCMP2] := 0;
Inc(RgEIP,3);
end;
🔹 {1E} XCHGrr (обмін регістрів)
— дуже корисна команда
код:
Procedure OpXCHGrr;
var t:OptInt32;
begin
t := RegsDW[RAM[RgEIP+1]];
RegsDW[RAM[RgEIP+1]] := RegsDW[RAM[RgEIP+2]];
RegsDW[RAM[RgEIP+2]] := t;
Inc(RgEIP,3);
end;
🔹 {1F} CLRreg (обнулення регістру)
— швидкий zero без MOV
код:
Procedure OpCLRreg;
begin
RegsDW[RAM[RgEIP+1]] := 0;
Inc(RgEIP,2);
end;
✔️ Додай у Test1:
$1C:s:='OpCMPrr';
$1D:s:='OpTESTrr';
$1E:s:='OpXCHGrr';
$1F:s:='OpCLRreg';
✔️ Додай у Engine:
$1C:OpCMPrr;
$1D:OpTESTrr;
$1E:OpXCHGrr;
$1F:OpCLRreg;
🔥 Чому саме так
Ти отримуєш повністю базовий CPU мінімум:
CMP → для всіх GOTO умов
TEST → для бітових перевірок
XCHG → без MOV-тріюків
CLR → швидке обнулення
👉 І тепер у тебе фактично:
control flow ✔
stack ✔
arithmetic ✔
logic ✔
compare ✔
Це вже повноцінне ядро процесора, навіть без EXT.
Якщо хочеш — далі можу:
зробити FLAGS (ZF, CF, SF) як у x86
або
мікро-оптимізацію Engine (швидкість х2–х3)
або
байткод формат під твій VM (як асемблер виглядатиме)
Не забудь написати "дяка" 😉