Цитата из книги Н. В. Гоголя "Мертвые души":[
"... Ничего не прочитаешь в хладных, бесчувственных чертах бесчеловечной старости..."
Продолжаю "оживлять мертвую душу" малой цифровой троичной машины.
Навёл порядок о комментариях к исходному коду. Добавил пару функций. Ещё раз посмотрел реализацию
эмулятора. Было три варианта.
Первый вариант - это реализация функций ферритового цифрового элемента Н.П.Брусенцова. Подход
интересный для реализации FPGA. Функции являются обычными цифровыми двоичными элементами, у которых два сигнальных выхода.
Code: Select all
/*
* Элемент "BTE-00"
*
* in[A]
* A1=A;
* out[Y5]
* Y5 = A
*/
typedef struct bte_00_st
{
S8 a1;
S8 y5;
S8 fc1;
S8 fc2;
S8 fc3;
} bte_00_st_t;
Второй вариант - это реализация библиотеки троичных вычислений от Рамиль Альварес Хосе, разработчика программного обеспечения для троичной машины. Удобный для программирования, но не оптимальный для реализации в микроконтроллерах.
Code: Select all
typedef struct trin {
int n;
int trit[SIZE_WORD_LONG];
} trit_t;
Третий вариант - это представление тритов как поле из бит. Позволяет выполнять быстрые
операции в ARM-процессорах, заменив в будущем фрагменты кода на Си вызовом функций на ассемблере.
Code: Select all
/**
* Тип данных троичного числа
*/
typedef struct trs {
int16_t w; /* знак троичного числа */
int16_t l; /* длина троичного числа в тритах */
uint64_t tb; /* двоичное битовое поле троичного числа */
} trs_t;
"Эмулятор Сетунь-1958 вер. 1.12 на языке СИ"
Вывод содержания ферритовой памяти:
Code: Select all
-- DUMP FRAM SEUN-1958 ---
ram[ 54] ( 0:-27) = [110-10-1011], (8482), 13XX4
ram[ 55] ( 0:-26) = [10110-1011], (7510), 113X4
ram[ 56] ( 0:-25) = [1-1100-11-1-1], (5081), 1Y0YW
ram[ 57] ( 0:-24) = [000000000], (0), 00000
ram[ 58] ( 0:-23) = [-1-1-1-110-110], (-9645), ZWYZ3
ram[ 59] ( 0:-22) = [1-10-110100], (4221), 1XY10
ram[ 60] ( 0:-21) = [0-1-100-11-10], (-2937), 0W0YX
ram[ 61] ( 0:-20) = [-101-100-100], (-6084), Z1XZ0
ram[ 62] ( 0:-19) = [-100111000], (-6210), Z0430
ram[ 63] ( 0:-18) = [-100011010], (-6450), Z0133
ram[ 64] ( 0:-17) = [-1001010-10], (-6294), Z033X
ram[ 65] ( 0:-16) = [1-11-110100], (4950), 1YY10
Продолжаю разбираться с троичной адресацией памяти. Возможно начало зоны Z=0 вместо
ram[ 54] ( 0:-27) нужно использовать вот это
ram[ 54] ( 0:-26). В описании работы машины этот момент описан неточно.
Вывод регистров машины Сетунь-1958 и выполнение кода операции:
Code: Select all
oper k6..8 = 000 : A*=>(C)
[ Dump Setun-1958: ]
K: [-111000010], (-3642), Z4003
F: [00000], (0), 000
WF: [0], (0), 0
C: [-11100], (-45), Z40
S: [000000000000000000], (0), 0000000000
WS: [0], (0), 0
R: [000000000000000000], (0), 0000000000
WR: [0], (0), 0
oper k6..8 = 00+ : (C)=>(A*)
[ Dump Setun-1958: ]
K: [000000000], (0), 00000
F: [00000], (0), 000
WF: [0], (0), 0
C: [00000], (0), 000
S: [000000000000000000], (0), 0000000000
WS: [0], (0), 0
R: [000000000000000000], (0), 0000000000
WR: [0], (0), 0
Получилось удобно, на мой взгляд. Печатаю троичное представление числа, десятичное, и 9-тиричное.
Фактически происходит дизассемблирование кода операции для отладки программ.
Чтение программ:
Исходные программы для троичной машины Сетунь-1958 - это текстовый ascii-файл, в котором
реализован способ ввода исходных кодов и данных в текстовом виде.
Code: Select all
--- RUN SETUN-1958 ---
--- Load 'test-1.txs' ---
01yz0
0110x
101x0
11wx4
11wxy
003z0
...
МАТЕМАТИЧЕСКОЕ ОБСЛУЖИВАНИЕ ДЛЯ МАШИНЫ «СЕТУНЬ»
Начал перенос распечаток реализации интерпретаторов из книг по обслуживанию троичной машины. Хочется запустить ИП-5 - библиотеку с плавающей запятой повышенной точности.
(Ваша помощь очень помогла бы сократить время на ввод, проверку и отладку).
Code: Select all
├── ip5_drum_1w_setun.txs
├── ip5_drum_1x_setun.txs
├── ip5_drum_1y_setun.txs
├── ip5_drum_1z_setun.txs
├── ip5_fram_00_setun.txs
ИДЕИ
Для обсуждения будущей версии эмулятора "Сетунь-58/20". Хочется расширить адреса FRAM.
В 'Сетунь-1958' одноадресная команда занимает 9-трит: K(1:9)
Для 'Сетунь-58/20' использовать 18 трит: KE(1:9)K(10:18), где K(10:18) = K(1:9), а KE(1:9) - это расширение адреса. А также использовать три неиспользованные кода операции для работы.
Получается
KAaddr(1:9)Kaddr(1:5) = ADDR(-11076674 ...0... +11076674) Физическая память составит 22153348 из 9-трит.
Code: Select all
ЗАМЕТКИ О ТРОИЧНОЙ ЦИФРОВОЙ ТЕХНИКЕ - ЧАСТЬ 2
Н. П. Брусенцов
АРХИТЕКТУРА ЦИФРОВОЙ МАШИНЫ "СЕТУНЬ"
Подтвердим сказанное кратким описанием архитектуры машины "Сетунь"
[5]. Ее можно охарактеризовать как одноаккумуляторную, с индекс-регистром и
одноадресным форматом команд. Длина аккумулятора 18 тритов, длина ячеек
главной памяти 9 тритов, что эквивалентно 14,3 бита. Команды занимают по
одной ячейке памяти, а операнды могут занимать как по одной, так и по две
ячейке, рассматриваемые как одно 18-тритное слово.
Девять тритов, кодирующих команду К(1:9), разделяются на код операции
К(6:8) и адресную часть К(1:5)К(9). Первые четыре трита К(1:4) адресной части
составляют адрес пары 9-тритных ячеек, обращение к которым производится
трояко в зависимости от значения К(5): при К(5)=0 доступна одна из этих ячеек,
при К(5) =1 - другая, при К(5)=-1-18-тритное слово, младшей частью которого
является ячейка, соответствующая К(5)=1, а старшей - ячейка,
соответствующая К(5) =0. Трит К(9) управляет индексацией так, что
исполнительный адрес ЕА определяется выражением
EA(1:5)=K(1:5)+K(9)*F(1:5), где F(1:5) - индекс-регистр. Поскольку K(9) принимает значения 0, 1, - 1, то EA
равно либо К(1:5), либо K(1:5)+F(1:5), либо K(1:5)-F(1:5).
"Ученье свет, а неученье — тьма. Дело мастера боится, и коль крестьянин не умеет сохою владеть — хлеб не родится." (С)