Эмулятор троичного компьютера: ввод-вывод
Добавлено: 05 фев 2017, 10:12
Цикл статей:
эмулятор троичного процессора
оперативная память
Чтобы общаться с программами на эмулируемом компьютере необходимо
написать несколько функций взаимодействия с линукс терминалом
и еще чтение программы из бинарного файла и чтение-запись текстовых
файлов. Что надо сделать. Первое две функции - сканирование с терминала
и печать строк. Второе преобразование кодов ascii символов в упращенную
таблицу. Так как предел эмулируемого процессора ограничен 80 символами
Исключим из таблицы ряд прописных символов и сдвинем все влево на 31
пункт, а оставшиеся за бортом пять знаков перенесем по отдельному
алгоритму на место неиспользованных заглавных букв. В результате
у нас образуется даже резервное поле шириной в 10 значений. Удивительно
и это всего на четырех канальной шине!
Так, базовую таблицу преобразовали, следующим шагом будет считанные
байты символов с терминала линукс преобразовать и записать в трайты.
За это отвечает ранее написанные функции decimalToTernary() которая
байт за байтом будет транслировать байт-код в трайт-код и две других
функции с самоопределяющимися назавниями writeBus() и readBus(). Готово.
Следующая задача научить компьютер определять границы массива строк,
но так же будет актуально и для массивов целых чисел.
В си это организованно тем что в конце любой строки помещается
нулевой байт код '\0' это кстати не ноль который имеет в таблице ascii
код 48. И функция чтения останавливается там где находит этот нулевой
символ. Я подумала раз мы будем вынуждены на такую метку тратить
по любому один трайт - минимально доступный опперанд данных для
нашего компьютера, то не лучше ли тогда использовать лишний трайт по
максимуму. Я решила добавить в спецификацию хранения массивов
такой порядок - первым трайтом записывается размер массива и только
потом тело самого массива. Тем самым мы исключим за ненадобностью
сперва считывать массив до метки а потом вычислять его размер и только
потом перебирать массив по индексу. Функция вывода на печать сразу
считает нулевой индекс (а это как известно адресс самого массива или
имя массива в текстовом коде), поместит полученный результат в логический
блок и проведет итерацию по символам начиная не с нуля как обычно,
а с единицы. Если мне не изменяет память такое хранение массивов
является правильным по какомуто докумету по стандартизации,
может ANSI ?
Функции printStr() и scanStr()
https://github.com/olecya/trinc_4003/bl ... .ru/main.c
Добавила в главную функцию пару строк демонстрирующих
работу написанных функций, скомпилируйте программу и запустите
Потом мусор удалю.
Готово, закоммитила. Пошла писать функции по загрузке бинарной программы из
файла и по работе с текстовыми файлами.
эмулятор троичного процессора
оперативная память
Чтобы общаться с программами на эмулируемом компьютере необходимо
написать несколько функций взаимодействия с линукс терминалом
и еще чтение программы из бинарного файла и чтение-запись текстовых
файлов. Что надо сделать. Первое две функции - сканирование с терминала
и печать строк. Второе преобразование кодов ascii символов в упращенную
таблицу. Так как предел эмулируемого процессора ограничен 80 символами
Исключим из таблицы ряд прописных символов и сдвинем все влево на 31
пункт, а оставшиеся за бортом пять знаков перенесем по отдельному
алгоритму на место неиспользованных заглавных букв. В результате
у нас образуется даже резервное поле шириной в 10 значений. Удивительно
и это всего на четырех канальной шине!
Так, базовую таблицу преобразовали, следующим шагом будет считанные
байты символов с терминала линукс преобразовать и записать в трайты.
За это отвечает ранее написанные функции decimalToTernary() которая
байт за байтом будет транслировать байт-код в трайт-код и две других
функции с самоопределяющимися назавниями writeBus() и readBus(). Готово.
Следующая задача научить компьютер определять границы массива строк,
но так же будет актуально и для массивов целых чисел.
В си это организованно тем что в конце любой строки помещается
нулевой байт код '\0' это кстати не ноль который имеет в таблице ascii
код 48. И функция чтения останавливается там где находит этот нулевой
символ. Я подумала раз мы будем вынуждены на такую метку тратить
по любому один трайт - минимально доступный опперанд данных для
нашего компьютера, то не лучше ли тогда использовать лишний трайт по
максимуму. Я решила добавить в спецификацию хранения массивов
такой порядок - первым трайтом записывается размер массива и только
потом тело самого массива. Тем самым мы исключим за ненадобностью
сперва считывать массив до метки а потом вычислять его размер и только
потом перебирать массив по индексу. Функция вывода на печать сразу
считает нулевой индекс (а это как известно адресс самого массива или
имя массива в текстовом коде), поместит полученный результат в логический
блок и проведет итерацию по символам начиная не с нуля как обычно,
а с единицы. Если мне не изменяет память такое хранение массивов
является правильным по какомуто докумету по стандартизации,
может ANSI ?
Функции printStr() и scanStr()
https://github.com/olecya/trinc_4003/bl ... .ru/main.c
Код: Выделить всё
sed '352,389!d' main.c #современем номера интервала строк станут неактуальнымиработу написанных функций, скомпилируйте программу и запустите
Код: Выделить всё
сс -Wall -O2 main.c -o main
./mainГотово, закоммитила. Пошла писать функции по загрузке бинарной программы из
файла и по работе с текстовыми файлами.