Команда IT специалистов выполнит подготовку инфраструктуры для вашего бизнеса.
Внедрение самых передовых решений и технологий.
Поддержка и сопровождение ваших сервисов.
Выполнение работ под "ключ", от покупки сервера, до настройки автоматизации процессов. 8(977)608-78-62 adm@nixm.ru
Внедрение самых передовых решений и технологий.
Поддержка и сопровождение ваших сервисов.
Выполнение работ под "ключ", от покупки сервера, до настройки автоматизации процессов. 8(977)608-78-62 adm@nixm.ru
Эмулятор троичного компьютера: оперативная память
Эмулятор троичного компьютера: оперативная память
Сегодня сделала рабочий набросок оперативной памяти. Были мысли запилить через соккеты, но пока
ограничилась функцией. Далее стоял вопрос в чем держать адресное пространство виртуального
компьютера. Может просто в массиве? Выбрала выделенное пространство в куче. Так же был
соблазн сделать динамический двумерный массив указателей с размером указателя 8 байт на 1 байт данных
но победила маленькое линейное пространство только под данные с ячейкой в один трайт == один байт
и общим размером в 82 байта.
Кому интересно можно посмотреть на вывод программы. Выводится все доступное адресное пространство однотрайтового
компьютера. В первые ячейки записаны для наглядности некоторые данные и в 22 ячейку сделана запись и чтение
из нее самой рабочей функцией ram() к которой и будут адресоваться запросы на чтение и запись.
Если кто хочет присоединится но не силен в Си, заходите будем через написание эмулятора подтягивать
знания вместе.
Для компиляции
И запуск
[spoiler][/spoiler]
Пара штрихов и можно переходить к написанию эмулятора стека.
ограничилась функцией. Далее стоял вопрос в чем держать адресное пространство виртуального
компьютера. Может просто в массиве? Выбрала выделенное пространство в куче. Так же был
соблазн сделать динамический двумерный массив указателей с размером указателя 8 байт на 1 байт данных
но победила маленькое линейное пространство только под данные с ячейкой в один трайт == один байт
и общим размером в 82 байта.
Кому интересно можно посмотреть на вывод программы. Выводится все доступное адресное пространство однотрайтового
компьютера. В первые ячейки записаны для наглядности некоторые данные и в 22 ячейку сделана запись и чтение
из нее самой рабочей функцией ram() к которой и будут адресоваться запросы на чтение и запись.
Если кто хочет присоединится но не силен в Си, заходите будем через написание эмулятора подтягивать
знания вместе.
Для компиляции
Код: Выделить всё
cc -Wall -O2 prog.c -o prog //вторая опция заглавная буква O
Код: Выделить всё
./prog
Код: Выделить всё
#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;
}
}
Пара штрихов и можно переходить к написанию эмулятора стека.
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Re: Эмулятор троичного компьютера: оперативная память
За наличием небольшой оперативной памяти я решила не выделять в ней адреса
под стек, а создать стек из стопки дополнительных регистров для реализации
переходов являющихся частью логических операций. Тогда хоть и
будет утеряна возможность обращаться к стеку по адресу, но
очень удачно будет можно разделить все адресное пространство на две секции.
В секции text, берущей начало с нулевого адреса и растущей по возрастанию адресов
будет загружаться программа с глобальной точкой входа 0, а вторую секцию data,
с началом на наибольшем доступном адресе 80 и растущей по убыванию, как стек,
отведем под секцию данных на которые в программе будут создаваться указатели,
в основном это задумано под массивы чисел и строчные данные. Других секций
в памяти не будет.
под стек, а создать стек из стопки дополнительных регистров для реализации
переходов являющихся частью логических операций. Тогда хоть и
будет утеряна возможность обращаться к стеку по адресу, но
очень удачно будет можно разделить все адресное пространство на две секции.
В секции text, берущей начало с нулевого адреса и растущей по возрастанию адресов
будет загружаться программа с глобальной точкой входа 0, а вторую секцию data,
с началом на наибольшем доступном адресе 80 и растущей по убыванию, как стек,
отведем под секцию данных на которые в программе будут создаваться указатели,
в основном это задумано под массивы чисел и строчные данные. Других секций
в памяти не будет.
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Re: Эмулятор троичного компьютера: оперативная память
Что бы задействовать максимум возможностей четырех тритного
процессора я решила воспользоваться особенностями архитектуры
гарварда и даже пойти несколько дальше и разделить память на три равные
сегмента с размером каждого в 81 байт. Так же я планирую ввести сегментный
регистр и возможно я придумаю механизм как компенсировать нехватку места
в одном сегменте местом в другом. Но пока это будут полностью независимые
три сегмента памяти.
Первый сегмент я отдаю под стек. Таким образом организованный ранее доступ
по целому числу я упраздняю и верхушка стека будет переделана под общий
тип структуры трайта. Тоесть область в регистре флагов преобразуется
в полноценную структуру адресов с 81 доступным адресом в стеке и для этого
будет отведен полноценный регистр SP.
Общую шину соответственно двум другим сегментам я разделю на шину данных
и шину инструкций. Теперь секции text и data будут находится не на
противоположных краях единой, плоской памяти а в двух разных симметричных
областях - пока независимых сегментах.
Пошла воплощать.
процессора я решила воспользоваться особенностями архитектуры
гарварда и даже пойти несколько дальше и разделить память на три равные
сегмента с размером каждого в 81 байт. Так же я планирую ввести сегментный
регистр и возможно я придумаю механизм как компенсировать нехватку места
в одном сегменте местом в другом. Но пока это будут полностью независимые
три сегмента памяти.
Первый сегмент я отдаю под стек. Таким образом организованный ранее доступ
по целому числу я упраздняю и верхушка стека будет переделана под общий
тип структуры трайта. Тоесть область в регистре флагов преобразуется
в полноценную структуру адресов с 81 доступным адресом в стеке и для этого
будет отведен полноценный регистр SP.
Общую шину соответственно двум другим сегментам я разделю на шину данных
и шину инструкций. Теперь секции text и data будут находится не на
противоположных краях единой, плоской памяти а в двух разных симметричных
областях - пока независимых сегментах.
Пошла воплощать.
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay
Re: Эмулятор троичного компьютера: оперативная память
В принципе основание готово. https://github.com/olecya/trinc_4003/bl ... .ru/main.c
Есть функции алу, функции логики, записи в память и чтение, работа со стеком.
Появилась на мой взгляд замечательная идея. Я собралась реализовывать
работу с памятью гарвардского типа, тоесть создаю две области памяти-
одна для инструкций, другая для данных. Но так как инструкции будут иметь
разное количество параметров то необходим механизм разграничения
между инструкциями с переменным числом аргументов. Возможно представить
память как непрерывную цепочку инструкций и параметров а границы записывать
в отдельную область. Получится программный массив массивов с индексами границ
записанными в другой, синхронизированной области памяти.
В память text пишем всю программу и указатели на данные,
а в память data пишем сами данные и структуру программы - массив из массива
однобайтовых данных определяющих колличество аргументов
в порядке следования тактов. Например при вызове инструкции
push r0 читаем из области данных один трайт цифру с цифрой 2, естественно
записанной в тричной системе сч. - это будет значить что
в программе один параметр и одна инструкция и к указателю адреса
следующей инструкции регистру IP прибавится 2.
В общем осталось самое интересное, написать простейший ассемблер,
кросскомпилятор и блок ввода-вывода на линукс консоль.
Есть функции алу, функции логики, записи в память и чтение, работа со стеком.
Появилась на мой взгляд замечательная идея. Я собралась реализовывать
работу с памятью гарвардского типа, тоесть создаю две области памяти-
одна для инструкций, другая для данных. Но так как инструкции будут иметь
разное количество параметров то необходим механизм разграничения
между инструкциями с переменным числом аргументов. Возможно представить
память как непрерывную цепочку инструкций и параметров а границы записывать
в отдельную область. Получится программный массив массивов с индексами границ
записанными в другой, синхронизированной области памяти.
В память text пишем всю программу и указатели на данные,
а в память data пишем сами данные и структуру программы - массив из массива
однобайтовых данных определяющих колличество аргументов
в порядке следования тактов. Например при вызове инструкции
push r0 читаем из области данных один трайт цифру с цифрой 2, естественно
записанной в тричной системе сч. - это будет значить что
в программе один параметр и одна инструкция и к указателю адреса
следующей инструкции регистру IP прибавится 2.
В общем осталось самое интересное, написать простейший ассемблер,
кросскомпилятор и блок ввода-вывода на линукс консоль.
"I invented the term Object-Oriented and I can tell you I did not have C++ in mind." - Alan Kay