﻿Система команд процессорного устройства разрабатывалась максимально прозрачной
для понимания на уровне машинного кода в своём шестнадцатеричном представлении
как есть визуальным сочетанием своих нибблов в форме элементарных аббревиатур.
Кодирование алгоритма малой степени сложности доступно пользователю с базовыми
навыками редактирования таблиц дампа и не представляет особой сложности в силу
максимально осмысленного кодирования всех инструкций в шестнадцатеричном виде.

------------------------------------------------------------------------------
|Код команд / диапазоны|Группа    |Описания, замечания, комментарий
-----------------------|----------|-------------------------------------------
00                     |HLT       |Прекращение счёта указателем команд IP
02-09                  |REP 2-9   |Префикс повтора/пропуска операции n-раз
10-99 01               |ADD Ri,BCD|Двоично-десятичное накопление в регистр
0A-9F                  |ALU Ri,Tk |Операция АЛУ с комбинацией аргументов
A0-A9 B0-B9 C0-C9 D0-D9|REG Rn    |Установка индекса активного регистра группы
AA-AD BA-BD CA-CD DA-DD|ARG Ri,Tj |Выбор комбинации аргументов операциям АЛУ
AE    BE    CE    DE   |EXT Ri    |Экстракция данных из внешнего ОЗУ в регистр
AF    BF    CF    DF   |FIX Ri    |Фиксация значения регистра во внешнее ОЗУ
E0-E7                  |EX0-7     |Переход на адрес 0xE000-0xE700
E8-EF                  |Ecnd      |Выполнение следующей команды по условию
F0                     |FIN       |Завершение с переходом на адрес Базы:Счёта
F1-FF                  |FN1-15    |Переход на адрес 0xF000-0xFF00
------------------------------------------------------------------------------
(n - устанавливаемый индекс, указанный битами команды)
(i или j - индекс, установленный раннее)
(k - индекс регистра временно берётся из старшего ниббла кода команды)

Группы регистров A0-A9, B0-B9 и C0-C9 составляют внутренний регистровый файл с
безусловным доступом к ним на программном уровне. Регистры B0-B9 хранят "Базу"
для обращения к памяти блоком в 256 байт, а регистры C0-C9 - счёт байта блока.
Инструкция с кодом F0 помещает текущий адрес указателя инструкций из IP в B0 и
C0, а значения из Bi и Cj помещает в IP, производя переход на адрес Bi:Cj. Тем
самым, можно обращаться к коду подпрограмм и знать адрес возврата через B0:C0.

Группу регистров D0-D9 составляют внешние Device-устройства с непосредственным
использованием в качестве операндов. Не рекомендуется активно использовать эту
группу в любых вычислительных действиях, так как нет гарантии работы программ.

Префикс REP используется для повтора любой операции на нужные n-тактов дольше.
Исключение представляет условная группа Ecnd, которая исполняет n-ую команду в
очереди, если условие ЛОЖНО.

******************************************************************************
* Примеры                                                                    *
******************************************************************************

     AA A1 1E          |EOR  A1,A1  ;Очистка по Исключающему Или (sf pf cf ZF)
     AA A1 2E          |EOR  A1,A2  ;Исключающее Или A1 с A2     (?? ?? ?? ??)
     AB A1 1A          |EOR  A1,B1  ;Исключающее Или A1 с B1     (?? ?? ?? ??)
     AB A1 2A          |EOR  A1,B2  ;Исключающее Или A1 с B2     (?? ?? ?? ??)
     AA A1 1E AB 2A    |MOV  A1,B2  ;Присвоение Исключающим Или  (sf pf cf ZF)
     AA A1 34          |SUM  A1,34  ;Инкремент на константу      (-- -- -- --)
     AA A1 02 34       |SUM  A1,2*34;Расширенный инкремент       (-- -- -- --)
     E4                |CALL 0xE400 ;Вызов подпрограммы
     02 E4             |CALL 0xE402 ;Вызов подпрограммы с пропуском команд
     F0                |RET         ;Возврат из подпрограммы
     03 F0             |RET  3      ;Возврат с переходом на команду #3
     03 EC             |EC   3      ;Условное выполнение по CF по команду #3
******************************************************************************
0000 03 EE A1 A2 A3    |IF ZF THEN {A1 A2 A3} ELSE A3
0005 03 EF A1 A2 A3    |IF ZF THEN A3 ELSE {A1 A2 A3}
000A 03 E0 A1 A2 A3    |GOSUB E003:A1:A2:A3
E003 03 F0             |RETURN TO A3
******************************************************************************

******************************************************************************
* Примечания                                                                 *
******************************************************************************
По Сбросу процессора очищаются все регистры и программа начинает выполняться с
адреса 0000, а сброшенные регистры B0:C0 указывают на аппаратный сигнал Сброса 
без программного останова через формальную инструкцию HLT с переходом по 0000.

; Процедура запуска системы с проверкой на останов по HLT
0000 AA A9 9E          |EOR  A9,A9   ;Очищаем Аккумулятор #9
0003 AB 0D             |OR   A9,B0   ;Проверим Базу возврата
0005 AC 0D             |OR   A9,C0   ;А также и Счётчик по базе
0007 09 EE             |EE BEGIN     ;Выполнение блока если был Сброс
0009    BB B9 59 59    | SUM B9,0x76 ;База под Стек
000D    CC C9 04 52    | SUM C9,0xD0 ;Счётчик байтов по Базе
0011 AA A9 9E          |EOR  A9,A9   ;Обнуляем Аккумулятор #9
0014 08 F8             |CALL 0xF808  ;Вызов подпрограммы по F808
0016 "Hello, World!" 00|TEXT "..."   ;Выводимое сообщение на Терминал
0030 AA 9E             |EOR  A9,A9   ;Обнуляем Аккумулятор #9
0032 03 F8             |CALL 0xF803  ;Вызов подпрограммы по F803
0034                 00|HLT          ;Заглушка
0035 AA A9 9E          |EOR  A9,A9   ;Обнуляем Аккумулятор #9
0038 09 F8             |CALL 0xF809  ;Вызов подпрограммы по F809
003A E3(30 00)         |E3   (0x0030);Служебная подпрограмма JMP
.......................
E300 CC C0 01          |INC  C0      ;Инкремент адреса возврата
E303 B0 A9 AE          |EXT  A9,B0:C0;Чтение ячейки с младшим байтом
E306 01                |INC  C0      ;Инкремент счётчика байтов
E307 BE                |EXT  B0,B0:C0;Чтение ячейки со старшим байтом
E308 0E                |EOR  C0,C0   ;Очищение счётчика
E309 CA 9D             |OR   C0,A9   ;Запись младшего байта
E30B F0                |FO           ;Переход на адрес
...
E3C9 C9 B9 A9 AE       |EXT  A9,B9:C9;Чтение ячейки с младшим байтом
E3CD CC 01             |INC  C9      ;Инкремент счётчика байтов
E3CF C0 0E CA 9A       |MOV  C0,A9   ;Младший байт возврата
E3D3 C9 AE             |EXT  A9,B9:C9;Чтение ячейки со старшим байтом
E3D5 01                |INC  C9      ;Инкремент счётчика байтов
E3D6 BB B0 0E BA 9A    |MOV  B0,A9   ;Старший байт возврата
E3DB F0                |FO           ;Переход на адрес
.......................
F800 01 01 ... 01 01 01|SUB  A9,9    ;Инкремент аккумулятора
F809 CC C9 03 85       |DEC  C9      ;Декремент счётчика стека
F80D AA A8 8E AB 0D    |MOV  A8,B0   ;Старший байт адреса возврата
F812 B9 AF             |FIX  B9:C9,A8;Помещаем в стек
F814 CC C9 03 85       |DEC  C9      ;Декремент счётчика стека
F818 AA A8 8E AC 0D    |MOV  A8,C0   ;Старший байт адреса возврата
F81D B9 AF             |FIX  B9:C9,A8;Помещаем в стек
F81F BB B0 0E 03 85    |MOV  B0,0xFF ;База таблицы подпрограмм
F824 CC C0 0E 04 56    |ADD  C0,4*56 ;Смещение таблицы по FFE0
F829 CA 02 9A          |ADD  C0,2*A9 ;Адрес подпрограммы FFE0+2*1..8
F82C B0 A9 AE          |EXT  A9,B0:C0;Чтение ячейки с младшим байтом
F82F 01                |INC  C0      ;Инкремент счётчика байтов
F830 BE                |EXT  B0,B0:C0;Чтение ячейки со старшим байтом
F831 0E                |EOR  C0,C0   ;Очищение счётчика
F832 CA 9D             |OR   C0,A9   ;Запись младшего байта
F834 F0                |FO           ;Переход на адрес
.......................
F8A0 