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

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

Сообщение nezabudka » 27 янв 2017, 19:19

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

И запуск
Код: выделить все
./prog

[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
Местный говорун
Местный говорун
 
Автор темы
Сообщений: 614
Фото: 180
Стаж: 3 года 6 месяцев 26 дней
Откуда: Ростов на Дону
Благодарил (а): 286 раз.
Поблагодарили: 147 раз.

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

Спонсор

Спонсор
 

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

Сообщение nezabudka » 28 янв 2017, 13:14

За наличием небольшой оперативной памяти я решила не выделять в ней адреса
под стек, а создать стек из стопки дополнительных регистров для реализации
переходов являющихся частью логических операций. Тогда хоть и
будет утеряна возможность обращаться к стеку по адресу, но
очень удачно будет можно разделить все адресное пространство на две секции.
В секции 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
Местный говорун
Местный говорун
 
Автор темы
Сообщений: 614
Фото: 180
Стаж: 3 года 6 месяцев 26 дней
Откуда: Ростов на Дону
Благодарил (а): 286 раз.
Поблагодарили: 147 раз.

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

Сообщение nezabudka » 01 фев 2017, 09:07

Что бы задействовать максимум возможностей четырех тритного
процессора я решила воспользоваться особенностями архитектуры
гарварда и даже пойти несколько дальше и разделить память на три равные
сегмента с размером каждого в 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
Местный говорун
Местный говорун
 
Автор темы
Сообщений: 614
Фото: 180
Стаж: 3 года 6 месяцев 26 дней
Откуда: Ростов на Дону
Благодарил (а): 286 раз.
Поблагодарили: 147 раз.

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

Сообщение nezabudka » 02 фев 2017, 18:10

В принципе основание готово. https://github.com/olecya/trinc_4003/blob/master/linuxim.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
Аватар пользователя
nezabudka
Местный говорун
Местный говорун
 
Автор темы
Сообщений: 614
Фото: 180
Стаж: 3 года 6 месяцев 26 дней
Откуда: Ростов на Дону
Благодарил (а): 286 раз.
Поблагодарили: 147 раз.


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

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron