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

------------------------------------------------------------------------------
|Код команд / диапазоны|Группа    |Описания, замечания, комментарий
-----------------------|----------|-------------------------------------------
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 0xE420 ;Вызов подпрограммы и переход на строку #2
     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 E030:A1:A2:A3
E030 03       F0       |RETURN   TO   A2
******************************************************************************

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

; Процедура запуска системы с проверкой на останов по HLT
Демонстрационная программа
==========================

0000    AA A9 9E|EOR   A9,A9   ;Очищаем аккумулятор
0003    AB    0D|OR    A9,B0   ;Чтобы проверить адрес возврата
0005    AC    0D|OR    A9,C0   ;Хранимый регистрами B0 и C0
0007 03 EE F8   |F8'Z          ;Переход на F800, если ZF
000A F9         |F9            ;Переход на F900

F800    CC C9 9E|EOR   C9,C9   ;
F803 04 52      |SUM   C9,0xD0 ;
F805    BB B9 9E|EOR   B9,B9   ;
F808 02 59      |SUM   B9,0x76 ;B9:C9=0x76D0 - стек
F80A    AA A9 9E|EOR   A9,A9   ;здесь начинается нуднейщая операция
F80D    AC 0D   |OR    A9,C0   ;помещения адреса возврата в стек
F80F    AA A8 8E|EOR   A8,A8   ;
F812    AB 0D   |OR    A8,B0   ;
F814 CC C9 03 85|DEC   C9      ;
F818    B9 A8 AF|FIX   B9:C9,A8;
F81B    C9 03 85|DEC   C9      ;
F81E       A9 AF|FIX   B9:C9,A9;итого: 22 операции - 48 тактов! ПФ-ФФФ!!!
F820 BB B8 8E   |EOR   B8,B8   ;
F823    04 62   |SUM   B8,0xF8 ;
F825 CC C8 8E   |EOR   C8,C8   ;
F828    02 80   |SUM   C8,0xA0 ;
F82A 09 F8      |CALL  0xF890  ;Печать сообщения
F82C CC CC CC CC|NOP           ;
F830 A9 B9 C9 AE|EXT   A9,B9:C9;
F834    CC 01   |INC   C9      ;
F836    A8 AE   |EXT   A8,B9:C9;
F838       01   |INC   C9      ;
F839 BB B0 0E   |EOR   B0,B0   ;
F83C    BA 8D   |OR    B0,A8   ;
F83E CC C0 0E   |EOR   C0,C0   ;
F841    CA 9D   |OR    C0,A9   ;
F843       01   |INC   C0      ;
F844       F0   |FO            ;
....
F890 A8 B8 C8 AE|EXT   A8,B8:C8;Читаем код символа из буфера
F894    CC 01   |INC   C8      ;Инкремент счётчика символов в буфере
F896    DA D8 8D|OR    D8,A8   ;Вывод на Терминал
F899 CC C0 03 85|DEC   C0      ;Повторять операции вывода?
F89D    EA 03 F0|<<< ?????? >>>;IF SF THEN FO 3 ELSE FO

.... ........... ..............
F900    DD D1 1D|OR    D1,D1   ;Эхо с джойстика на матрицу
F903    AA A9 9E|CLR   A9      ;Очищаем аккумулятор A9
F906    AD D0 0D|OR    A9,D0   ;Считываем статус клавиатуры
F909 EA       F0|FIN'S         ;Прерываемся, если бит #7 не НОЛЬ
F90B    DA    9D|OR    D0,A9   ;Выводим код на терминал
F90D       AA A9|USE   A9,A9   ;Используем A9
F90F    85 85 40|SUM   A9,-46  ;Проверим не код клавиши ТОЧКА
F912          9D|OR    D9,D9   ;
F913 EF       F0|FIN'F         ;Завершаем подпрограмму, если ФАЛЬШ
F915          00|HLT           ;Останов
------------------------------------------------------------------------