Команда IT специалистов выполнит подготовку инфраструктуры для вашего бизнеса.
Внедрение самых передовых решений и технологий.
Поддержка и сопровождение ваших сервисов.
Выполнение работ под "ключ", от покупки сервера, до настройки автоматизации процессов.
8(977)608-78-62 adm@nixm.ru

Эмулятор троичного компьютера: оперативная память

Ответить
Аватара пользователя
nezabudka
Местный говорун
Местный говорун
Сообщения: 618
Зарегистрирован: 18 апр 2015, 06:13
Откуда: Ростов на Дону

Эмулятор троичного компьютера: оперативная память

Сообщение nezabudka »

Сегодня сделала рабочий набросок оперативной памяти. Были мысли запилить через соккеты, но пока
ограничилась функцией. Далее стоял вопрос в чем держать адресное пространство виртуального
компьютера. Может просто в массиве? Выбрала выделенное пространство в куче. Так же был
соблазн сделать динамический двумерный массив указателей с размером указателя 8 байт на 1 байт данных :D
но победила маленькое линейное пространство только под данные с ячейкой в один трайт == один байт
и общим размером в 82 байта.
Кому интересно можно посмотреть на вывод программы. Выводится все доступное адресное пространство однотрайтового
компьютера. В первые ячейки записаны для наглядности некоторые данные и в 22 ячейку сделана запись и чтение
из нее самой рабочей функцией ram() к которой и будут адресоваться запросы на чтение и запись.
Если кто хочет присоединится но не силен в Си, заходите будем через написание эмулятора подтягивать
знания вместе.
Для компиляции

Код: Выделить всё

cc -Wall -O2 prog.c -o prog //вторая опция заглавная буква O
И запуск [spoiler]

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#define N 82

typedef struct tryte_t {
	uint8_t three:2;
	uint8_t two:2;
	uint8_t one:2;
	uint8_t ou:2;
} Tryte_t;

Tryte_t *addr;
unsigned short ternary_to_decimal(Tryte_t *);
Tryte_t decimal_to_ternary(unsigned short);
Tryte_t ram(Tryte_t, Tryte_t, unsigned short);


int main(void) {
	addr = (Tryte_t *)malloc(N);
	unsigned short chislo = 90; //лимит 80
	unsigned short esheodno = 27;
	int mem = 0;
	Tryte_t test = {0, 2, 1, 0}; //21
	Tryte_t tost = {0, 1, 2, 2}; //17
	Tryte_t tist = {0, 0, 1, 2}; //5
	Tryte_t pervy = {0, 2, 1, 1}; //адрес для записи 22
	Tryte_t data = {1, 2, 2, 0}; //данные для записи 51
	memcpy((addr + mem), &test, 1);
	mem++;
	memcpy((addr + mem), &tost, 1);
	mem++;
	memcpy((addr + mem), &tist, 1);
	mem++;
	memcpy((addr + mem), &test, 1);
	mem++;
	Tryte_t tust = decimal_to_ternary(chislo);
	memcpy((addr + mem), &tust, 1);
	tust = decimal_to_ternary(esheodno);
	mem++;
	memcpy((addr + mem), &tust, 1);
	ram(pervy, data, 1); //записываем данные по адресу
	for(int i = 0; i < N; i++)
		printf("%hu %p\n", ternary_to_decimal(addr+i), (addr+i));
	data = ram(pervy, data, 0); //считываем данные по адресу
	printf(" Наш выход: %hu\n", ternary_to_decimal(&data));
	return 0;
}

unsigned short ternary_to_decimal(Tryte_t *st) { //преобразование троичных данных в десятичные
	return st->three*(3*3*3)+st->two*(3*3)+st->one*3+st->ou*1;
}

Tryte_t decimal_to_ternary(unsigned short digit) { //преобразование десятичных данных в троичные
	Tryte_t temp;
	temp.ou = digit % 3;
	if(digit /= 3) {
		temp.one = digit % 3;
		if(digit /= 3) {
			temp.two = digit % 3;
			if(digit /= 3)
				temp.three = digit % 3;
		}
	}
	return temp;
}

Tryte_t ram(Tryte_t address, Tryte_t data, unsigned short control) { //функция для записи и чтения
	if(control == 0) { // чтение из памяти
		memcpy(&data, (addr + ternary_to_decimal(&address)), 1);
		return data;
	}
	else {
		memcpy((addr + ternary_to_decimal(&address)), &data, 1);
		return data;
	}
}
[/spoiler]
Пара штрихов и можно переходить к написанию эмулятора стека.
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Аватара пользователя
nezabudka
Местный говорун
Местный говорун
Сообщения: 618
Зарегистрирован: 18 апр 2015, 06:13
Откуда: Ростов на Дону

Re: Эмулятор троичного компьютера: оперативная память

Сообщение nezabudka »

За наличием небольшой оперативной памяти я решила не выделять в ней адреса
под стек, а создать стек из стопки дополнительных регистров для реализации
переходов являющихся частью логических операций. Тогда хоть и
будет утеряна возможность обращаться к стеку по адресу, но
очень удачно будет можно разделить все адресное пространство на две секции.
В секции text, берущей начало с нулевого адреса и растущей по возрастанию адресов
будет загружаться программа с глобальной точкой входа 0, а вторую секцию data,
с началом на наибольшем доступном адресе 80 и растущей по убыванию, как стек,
отведем под секцию данных на которые в программе будут создаваться указатели,
в основном это задумано под массивы чисел и строчные данные. Других секций
в памяти не будет.
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Аватара пользователя
nezabudka
Местный говорун
Местный говорун
Сообщения: 618
Зарегистрирован: 18 апр 2015, 06:13
Откуда: Ростов на Дону

Re: Эмулятор троичного компьютера: оперативная память

Сообщение nezabudka »

Что бы задействовать максимум возможностей четырех тритного
процессора я решила воспользоваться особенностями архитектуры
гарварда и даже пойти несколько дальше и разделить память на три равные
сегмента с размером каждого в 81 байт. Так же я планирую ввести сегментный
регистр и возможно я придумаю механизм как компенсировать нехватку места
в одном сегменте местом в другом. Но пока это будут полностью независимые
три сегмента памяти.
Первый сегмент я отдаю под стек. Таким образом организованный ранее доступ
по целому числу я упраздняю и верхушка стека будет переделана под общий
тип структуры трайта. Тоесть область в регистре флагов преобразуется
в полноценную структуру адресов с 81 доступным адресом в стеке и для этого
будет отведен полноценный регистр SP.
Общую шину соответственно двум другим сегментам я разделю на шину данных
и шину инструкций. Теперь секции text и data будут находится не на
противоположных краях единой, плоской памяти а в двух разных симметричных
областях - пока независимых сегментах.
Пошла воплощать. 8-)
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Аватара пользователя
nezabudka
Местный говорун
Местный говорун
Сообщения: 618
Зарегистрирован: 18 апр 2015, 06:13
Откуда: Ростов на Дону

Re: Эмулятор троичного компьютера: оперативная память

Сообщение nezabudka »

В принципе основание готово. https://github.com/olecya/trinc_4003/bl ... .ru/main.c
Есть функции алу, функции логики, записи в память и чтение, работа со стеком.
Появилась на мой взгляд замечательная идея. Я собралась реализовывать
работу с памятью гарвардского типа, тоесть создаю две области памяти-
одна для инструкций, другая для данных. Но так как инструкции будут иметь
разное количество параметров то необходим механизм разграничения
между инструкциями с переменным числом аргументов. Возможно представить
память как непрерывную цепочку инструкций и параметров а границы записывать
в отдельную область. Получится программный массив массивов с индексами границ
записанными в другой, синхронизированной области памяти.
В память text пишем всю программу и указатели на данные,
а в память data пишем сами данные и структуру программы - массив из массива
однобайтовых данных определяющих колличество аргументов
в порядке следования тактов. Например при вызове инструкции
push r0 читаем из области данных один трайт цифру с цифрой 2, естественно
записанной в тричной системе сч. - это будет значить что
в программе один параметр и одна инструкция и к указателю адреса
следующей инструкции регистру IP прибавится 2.
В общем осталось самое интересное, написать простейший ассемблер,
кросскомпилятор и блок ввода-вывода на линукс консоль. :D
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Ответить

Вернуться в «C/C++»