DekatronPC: различия между версиями

Материал из DekatronPC
Строка 1: Строка 1:




Строка 10: Строка 12:
== Описание ==  
== Описание ==  


Компьютер на базе вакуумных и газоразрядных ламп, процессор которого не содержит полупроводниковых элементов.
Компьютер на базе вакуумных и газоразрядных ламп, процессор которого не содержит кремниевых полупроводниковых элементов.
 
Ламповый компьютер DekatronPC предназначен для выполнения программ, написанных яна языке программирования brainfuck. Это значит, что основу набора инструкций составляет восемь инструкций языка brainfuck: '''+-<>.,[]'''
 
Основное требование к ламповому компьютеру — чтобы инструкции в нем в точности соответствовали языку Brainfuck. Во-вторых — 99% существующих восьмибитных программ на Brainfuck должны исполняться исключительно на ламповой логике. Оставшийся 1% банально может не умещаться в ОЗУ. Максимум того, что допускается использовать в аутентичной части машины, — это германиевые диоды, да и то лишь в выпрямителях питания в схемах обвязки кубов памяти.


== Подпроекты ==  
== Подпроекты ==  
Строка 35: Строка 41:
* Количество ламп - 1000шт
* Количество ламп - 1000шт
* Потребляемая мощность 10кВт
* Потребляемая мощность 10кВт
== Архитектура ==
Декатрон — это многоэлектродная газоразрядная лампа, предназначенная для реверсивного счета импульсов. В центре находится диск анода, а вокруг него расположены тридцать электродов. Десяток катодов и две группы подкатодов — по два подкатода между каждым катодом. После подачи напряжения на декатрон между анодом и одним из катодов загорается тлеющий разряд. Подавая импульсы определенной последовательности на подкатоды и соседний катод, мы можем перемещать разряд между катодами, обеспечивая операцию инкремента или декремента. Да эта лампа просто создана для языка Brainfuck!
На базе декатрона мы можем создать простой реверсивный десятичный счетчик. Соединим нужное число таких счетчиков последовательно и получим многоразрядный счетчик, который, например, на базе трех декатронов сможет считать от 0 до 999.
[[Файл:Dpc core.jpg|центр|600px]]
Один такой счетчик на базе шести декатронов будет определять номер текущей исполняемой инструкции. В дополнение к нему нам нужен счетчик глубины вложенности циклов — сумматора в будущем компьютере нет, а значит, начало текущего цикла придется искать вручную, банально перематывая счетчик инструкции назад до тех пор, пока начало нашего цикла не будет найдено. Счетчик вложенных циклов поможет корректно искать нужное начало, даже если внутри нашего цикла множество вложенных. Счетчика от 0 до 999 будет более чем достаточно: в программах на Brainfuck, написанных людьми, даже больше 20–30 уровней вложенности циклов — редкость.
Третий счетчик от 0 до 29 999 будет определять номер текущей ячейки данных. Так как у нас чистый Brainfuck, то и число ячеек в точности соответствует исходной спецификации. Декатронный счетчик можно сбросить при любых значениях.
По адресу этого счетчика происходит выборка данных из ОЗУ. Данные помещаются в четвертый счетчик, который умеет считать от 0 до 255. То есть мы загружаем в декатрон наше старое значение, делаем инкремент или декремент и выгружаем данные обратно в память.
[[Файл:Dpc machine.jpg|600px|центр]]


== Набор инструкций (Актуальная версия на 18 марта 2022г.) ==
== Набор инструкций (Актуальная версия на 18 марта 2022г.) ==
Общая концепция[[Файл:Dpc insn list.jpg|600px|центр|альт=УСТАРЕЛО! Самая первая визуализация будущего набора команд.|мини|'''УСТАРЕЛО!''' Самая первая визуализация будущего набора команд. ]]
В итоге мы имеем:
* NOP — пустая инструкция, необходимая для выравнивания циклов внутри кеш-линеек;
* + и - — инкремент и декремент текущей ячейки данных;
* < и > — изменение номера текущей ячейки;
* [ и ] — начало и конец цикла;
* . и , — печать текущего символа в консоль и ввод из консоли.
Инструкция кодируется четырехбитным значением, а это значит, что остается еще семь свободных инструкций, которые можно использовать для управления машиной.
Например, инструкция '''HALT''' остановит машину при завершении работы программы. Еще две инструкции — '''LOAD''' и '''STORE''' — оптимизируют работу с памятью.
=== Оптимизация доступа к памяти ===
Допустим, у нас есть десять инструкций +, идущих подряд. Нам придется десять раз повторить следующий набор действий:
# Прочитать значение текущей ячейки и записать его в декатронный счетчик;
# Выполнить операцию инкремента;
# Записать новое значение текущей ячейки из счетчика в ОЗУ.
По факту мы девять раз просто так будем делать загрузку-выгрузку. Проще перед первым инкрементом один раз сделать явно сделать '''LOAD''' из памяти в счетчик, а после последнего явно вызвать '''STORE''' обратно из счетчика в ОЗУ. Либо ламповая логика должна понимать, какая инструкция будет идти следом за текущей и выполнять '''LOAD''' и '''STORE''' неявно, не тратя в дальнейшем время на холостые загрузки-выгрузки.


Ламповый компьютер DekatronPC предназначен для выполнения программ, написанных яна языке программирования brainfuck. Это значит, что основу набора инструкций составляет восемь инструкций языка brainfuck: '''+-<>.,[]'''
С одной стороны, неявный '''LOAD/STORE''' позволит грузить в компьютер программы, написанные на Brainfuck вообще без модификаций. С другой стороны, усложняется логика выборки инструкции, так как при чтении следующей инструкции необходимо учитывать текущее состояние флагов машины и выполнять дополнительные действия.
 
В итоге выбрал способ неявного '''LOAD''' и '''STORE'''. За основу взят принцип data-lock.
 
# Pагружаем новую инструкцию
#Текущая инструкция  '''+'''(или '''-''').
##Проверяем флаг '''APLock''':
###Флаг снят. значит в счетчик данных еще не загружено значение из текущей ячейки данных.  Производим операцию LOAD из текущей ячейки памяти в счетчик данных. Выставляется флаг '''APLock'''
###Флаг стоит. Значит данные в счетчике уже загружены. Ничего не делаем
# Текущая инструкция < или >
##Проверяем флаг '''APLock'''
###Флаг снят. Ничего не делаем
###Флаг стоит. Производим операцию выгрузки текущего значения счетчика данных в ОЗУ. Снимаем флаг APLock
#Текущая инструкция - другая
##Дополнительных действий не требуется.
#Исполняем текущую инструкцию


Каждая инструкция представлена в памяти 4-х разрядным значением, соответствующим тому или иному опкоду.  
Каждая инструкция представлена в памяти 4-х разрядным значением, соответствующим тому или иному опкоду.  
Строка 44: Строка 102:
При этом, компьютер имеет дополнительные инструкции, которые предназначены для непосредственного управления машиной.
При этом, компьютер имеет дополнительные инструкции, которые предназначены для непосредственного управления машиной.


Для этого, в машине имеется 1-х разрядный регистр текущего набора команд. ISAREG, цоторый в теории расширяет число инструкций до 32 - представляя два набора инструкций:
Для этого, в машине имеется 1-х разрядный регистр текущего набора команд. ISAREG, который в теории расширяет число инструкций до 32 - представляя два набора инструкций:


# ISAREG=0 - Debug ISA - режим, в котором машина находится после включения. в нем доступны инструкции очистки ОЗУ, сброса состояния машины, команды загрузки данных с перфоленты
# ISAREG=0 - Debug ISA - режим, в котором машина находится после включения. в нем доступны инструкции очистки ОЗУ, сброса состояния машины, команды загрузки данных с перфоленты
Строка 59: Строка 117:
|  N ||  0x0  ||          ||NOP ||  No operation - Must be in both ISA set
|  N ||  0x0  ||          ||NOP ||  No operation - Must be in both ISA set
|-
|-
|  ||  0x1  ||          ||||  
H||  0x1  ||          ||HALT|| Must be in both ISA set
|-
|-
|  ||  0x2  ||          ||  ||
|  ||  0x2  ||          ||  ||
Строка 65: Строка 123:
|  ||  0x3  ||        ||  ||
|  ||  0x3  ||        ||  ||
|-
|-
| > || 0x4  ||     >    || AINC || Инкремент счетчика адреса (Может отказаться от дублирования? в brainfuck ISA они есть)
| || || || ||
|-
|-
| < || 0x5  ||     <    || ADEC || Декремент счетчика адреса
| || || || ||
|-
|-
|  { ||  0x6  ||          ||LABEG || Если текущий адрес равен нулю - пропустить тело цикла
|  { ||  0x6  ||          ||LABEG || Если текущий адрес равен нулю - пропустить тело цикла
Строка 122: Строка 180:
Второй вариант - использовать счетчик адреса загрузчиком. Но тогда не получится очистить память данных от мусора.
Второй вариант - использовать счетчик адреса загрузчиком. Но тогда не получится очистить память данных от мусора.


Третий вариант - использовать аппаратный способ загрузки - когда синхросигнал с перфоленты будет инкрементировать значение счетчика инструкций, а другой сигнал - подавать сигнал записи в память. Таким образом можно инструкцией запустить этот процесс и дальше аппаратные средства сделают все самостоятельно.
Третий вариант наиболее предпочтителен - использовать аппаратный способ загрузки - когда синхросигнал с перфоленты будет инкрементировать значение счетчика инструкций, а другой сигнал - подавать сигнал записи в память. Таким образом можно инструкцией запустить этот процесс и дальше аппаратные средства сделают все самостоятельно.


=== Brainfuck ISA (ISAREG=1) ===
=== Brainfuck ISA (ISAREG=1) ===
Строка 144: Строка 202:
|  N ||  0x0  ||          ||NOP || Пустая инструкция
|  N ||  0x0  ||          ||NOP || Пустая инструкция
|-
|-
|  H ||  0x1  ||          ||HALT || Останов машины (Может переместить ее в Maintance ISA?)
|  H ||  0x1  ||          ||HALT || Останов машины
|-
|-
|  + ||  '''0x2'''  ||    '''+'''    ||INC  || Increment of Current data cell
|  + ||  '''0x2'''  ||    '''+'''    ||INC  || Increment of Current data cell
Строка 162: Строка 220:
|  , ||  '''0x9'''  ||    ''','''    ||CIN || Read symbol from the terminal (Blocked acces - Program halted while no symbol)
|  , ||  '''0x9'''  ||    ''','''    ||CIN || Read symbol from the terminal (Blocked acces - Program halted while no symbol)
|-
|-
|  0 ||  0xA  ||          ||CLRD || Write zero to current Data Cell  
|  0 ||  0xA  ||          '''[-]'''||CLRD || Basic brainfuck optimization: Write zero to current Data Cell  
|-
|-
|  M ||  0xB  ||          ||CLRML|| Clear memory lock
|  M ||  0xB  ||          ||CLRML|| Clear memory lock
Строка 177: Строка 235:
=== Формат записи на магнитную ленту ===
=== Формат записи на магнитную ленту ===


Если использовать кассетный или бобинный магнитофон (типа ламповой коменты или яузы) для хранения программ и их последующего ввода в память машины, можно использовать [https://ru.wikipedia.org/wiki/DTMF DTMF]-сигналы. Программа пишется 4-х битовыми пачками, так что в одном сигнале сразу будет готовая инструкция.
Если использовать кассетный или бобинный магнитофон (типа ламповой коменты или яузы) для хранения программ и их последующего ввода в память машины, можно использовать [https://ru.wikipedia.org/wiki/DTMF DTMF]-сигналы, когда двумя синусоидами кодируется до 16 символов. Так как программа пишется 4-х битовыми пачками, так что в одном сигнале сразу будет готовая инструкция. По завершении записи на ленте формируется прерывистый сигнал 0x01(HALT)
 
== Архитектура ==
 
Декатрон — это многоэлектродная газоразрядная лампа, предназначенная для реверсивного счета импульсов. В центре находится диск анода, а вокруг него расположены тридцать электродов. Десяток катодов и две группы подкатодов — по два подкатода между каждым катодом. После подачи напряжения на декатрон между анодом и одним из катодов загорается тлеющий разряд. Подавая импульсы определенной последовательности на подкатоды и соседний катод, мы можем перемещать разряд между катодами, обеспечивая операцию инкремента или декремента. Да эта лампа просто создана для языка Brainfuck!
 
На базе декатрона мы можем создать простой реверсивный десятичный счетчик. Соединим нужное число таких счетчиков последовательно и получим многоразрядный счетчик, который, например, на базе трех декатронов сможет считать от 0 до 999.
 
[[Файл:Dpc core.jpg|центр|600px]]
 
Один такой счетчик на базе шести декатронов будет определять номер текущей исполняемой инструкции. В дополнение к нему нам нужен счетчик глубины вложенности циклов — сумматора в будущем компьютере нет, а значит, начало текущего цикла придется искать вручную, банально перематывая счетчик инструкции назад до тех пор, пока начало нашего цикла не будет найдено. Счетчик вложенных циклов поможет корректно искать нужное начало, даже если внутри нашего цикла множество вложенных. Счетчика от 0 до 999 будет более чем достаточно: в программах на Brainfuck, написанных людьми, даже больше 20–30 уровней вложенности циклов — редкость.
 
Третий счетчик от 0 до 29 999 будет определять номер текущей ячейки данных. Так как у нас чистый Brainfuck, то и число ячеек в точности соответствует исходной спецификации. Декатронный счетчик можно сбросить при любых значениях.
 
По адресу этого счетчика происходит выборка данных из ОЗУ. Данные помещаются в четвертый счетчик, который умеет считать от 0 до 255. То есть мы загружаем в декатрон наше старое значение, делаем инкремент или декремент и выгружаем данные обратно в память.
 
[[Файл:Dpc machine.jpg|600px|центр]]
 
== Система команд ==
 
Одно из требований к ламповому компьютеру — чтобы инструкции в нем в точности соответствовали языку Brainfuck. Второе требование — 99% существующих восьмибитных программ на Brainfuck должны исполняться исключительно на ламповой логике. Оставшийся 1% банально может не умещаться в ОЗУ. Максимум того, что допускается использовать в аутентичной части машины, — это германиевые диоды, да и то лишь в схемах обвязки кубов памяти.
 
[[Файл:Dpc insn list.jpg|600px|центр]]
 
В итоге мы имеем:
 
* NOP — пустая инструкция, необходимая для выравнивания циклов внутри кеш-линеек;
* + и - — инкремент и декремент текущей ячейки данных;
* < и > — изменение номера текущей ячейки;
* [ и ] — начало и конец цикла;
* . и , — печать текущего символа в консоль и ввод из консоли.
 
Инструкция кодируется четырехбитным значением, а это значит, что остается еще семь свободных инструкций, которые можно использовать для управления машиной.
 
Например, инструкция '''HALT''' остановит машину при завершении работы программы. Еще две инструкции — '''LOAD''' и '''STORE''' — оптимизируют работу с памятью.
 
Допустим, у нас есть десять инструкций +, идущих подряд. Нам придется десять раз повторить следующий набор действий:
 
прочитать значение текущей ячейки и записать его в декатронный счетчик;
выполнить операцию инкремента;
записать новое значение текущей ячейки из счетчика в ОЗУ.
По факту мы девять раз просто так будем делать загрузку-выгрузку. Проще явно сказать, что нужно сделать LOAD из памяти в счетчик и STORE обратно из счетчика в ОЗУ. Либо ламповая логика должна понимать, какая инструкция будет идти следом за текущей и выполнять LOAD и STORE неявно, не тратя в дальнейшем время на холостые загрузки-выгрузки.
 
С одной стороны, неявный LOAD/STORE позволит грузить в компьютер программы, написанные на Brainfuck вообще без модификаций. С другой стороны, усложняется логика выборки инструкции, так как необходимо читать на одну инструкцию вперед.
 
В итоге выбрал способ неявного Load и Store. За основу взят принцип data-lock.
 
* При исполнении инструкции + и - сначала проверяется флаг загрузки счетчика.
** Если флаг снят, значит в счетчик еще не загружено значение из текущей ячейки данных. Сначала необходимо выгрузить значение из ОЗУ в счетчик и только потом производить операцию + и -.
** Если флаг стоит, значит данные в счетчик уже загружены
* При исполнении инструкции < и > сначала проверяется флаг загрузки счетчика
**  Если флаг снят. То счетчик свободен и можно изменять значение AP-счетчика
** Если флаг стоит, то счетчик занят, значит необходимо сначала сохранить значение из счетчика в ОЗУ и только потом менять значение AP-счетчика
* При исполнении инструкции , флаг не проверяется  - значение из консоли заносится сразу в ОЗУ
* При исполнении инструкции . флаг проверяется - и значение в консоль печатается либо из ОЗУ либо из счетчика в зависимости от флага.


== Декатронные счетчики==
== Декатронные счетчики==
Строка 308: Строка 312:
|200
|200
|}
|}
=== Экспериментальная декатронная ячейка ===
==== Источники питания: ====
* ТСШ-170 - предназначен для выработки основного питания +150В, а также пары накальных линий для 6С19П. Трансформатор необходимо проверить на сопротивление изоляции.
* ТН61 - общей мощностью 190Вт. Имеет 4 линии 6.3В  - 3 по 8А и 1 машина - 6.1А.  Будет обеспечивать основное питание накалов ламп, разбитых на группы по смещениям.
* ТА48, мощностью 36Вт - питание декатрона +500В (технически сам источник будет на +350В), а также напряжение смещения -50В.


== DekatronPC Challenge==
== DekatronPC Challenge==
Строка 328: Строка 340:
*''Питание?''  
*''Питание?''  
**Каждый блок будет оснащен своим собственным источником накального напряжения. Основной источник накального - трансформаторы ТН60 и ТН61.
**Каждый блок будет оснащен своим собственным источником накального напряжения. Основной источник накального - трансформаторы ТН60 и ТН61.
**Напряжения смещения а также напряжение питания декатронов - анодные трансформаторы ТА и ТПП подходящей мощности и напряжений. Все напряжения смещения будут оборудованы стабилизаторами выходного напряжения. ти напряжения подаются через пускатель по команде общего блока управления - после прогрева ламп.
**Напряжения смещения а также напряжение питания декатронов - анодные трансформаторы ТА и ТПП подходящей мощности и напряжений. Все напряжения смещения будут оборудованы стабилизаторами выходного напряжения. Эти напряжения подаются через пускатель по команде общего блока управления - после прогрева ламп.
**Основное анодное напряжение - некоторые блоки будут получать от собственных силовых трансформаторов типа ТС160, ТС170, ТС270 - это трансформаторы от ламповых телевизоров. а также от трансформаторов типа ТА подходящей мощности. Стабилизаторов напряжения на выходе не будет предусмотрено. Анодное на схему будет подаваться через пускатель по команде общего блока управления после подачи накального напряжения и прогрева ламп, подачи напряжений смещения, анодного декатронов.
**Основное анодное напряжение - некоторые блоки будут получать от собственных силовых трансформаторов типа ТС160, ТС170, ТС270 - это трансформаторы от ламповых телевизоров. а также от трансформаторов типа ТА подходящей мощности. Стабилизаторов напряжения на выходе не будет предусмотрено. Анодное на схему будет подаваться через пускатель по команде общего блока управления после подачи накального напряжения и прогрева ламп, подачи напряжений смещения, анодного декатронов.
**Предусмотрен общий стабилизатор напряжения на базе автотрансформатора. От него будут питаться все остальные блоки.
**Предусмотрен общий стабилизатор напряжения на базе автотрансформатора. От него будут питаться все остальные блоки.

Версия 07:58, 14 февраля 2023


Dekatronpc logo.jpg

Описание

Компьютер на базе вакуумных и газоразрядных ламп, процессор которого не содержит кремниевых полупроводниковых элементов.

Ламповый компьютер DekatronPC предназначен для выполнения программ, написанных яна языке программирования brainfuck. Это значит, что основу набора инструкций составляет восемь инструкций языка brainfuck: +-<>.,[]

Основное требование к ламповому компьютеру — чтобы инструкции в нем в точности соответствовали языку Brainfuck. Во-вторых — 99% существующих восьмибитных программ на Brainfuck должны исполняться исключительно на ламповой логике. Оставшийся 1% банально может не умещаться в ОЗУ. Максимум того, что допускается использовать в аутентичной части машины, — это германиевые диоды, да и то лишь в выпрямителях питания в схемах обвязки кубов памяти.

Подпроекты

Технические характеристики (проектные)

  • Архитектура - с раздельной памятью данных и кода.
  • Объем памяти программ - 1МиБ, из них:
    • Ферритовая память - 1.5киБ
    • Внешняя память - до 1МиБ
  • Объем памяти данных - 29.29КиБ(30000ячеек данных). из них:
    • Ферритовая память - 1 Киб
    • Внешняя память (накопитель на магнитной ленте) - до 29.29КиБ
  • Разрядность:
    • Шины данных - 8 бит
    • Шина адреса данных - 15 бит
    • Шина адреса программ - 20 бит
  • Тактовая частота - 1МГц
  • Быстродействие - 1млн операций в секунду
  • Количество ламп - 1000шт
  • Потребляемая мощность 10кВт

Архитектура

Декатрон — это многоэлектродная газоразрядная лампа, предназначенная для реверсивного счета импульсов. В центре находится диск анода, а вокруг него расположены тридцать электродов. Десяток катодов и две группы подкатодов — по два подкатода между каждым катодом. После подачи напряжения на декатрон между анодом и одним из катодов загорается тлеющий разряд. Подавая импульсы определенной последовательности на подкатоды и соседний катод, мы можем перемещать разряд между катодами, обеспечивая операцию инкремента или декремента. Да эта лампа просто создана для языка Brainfuck!

На базе декатрона мы можем создать простой реверсивный десятичный счетчик. Соединим нужное число таких счетчиков последовательно и получим многоразрядный счетчик, который, например, на базе трех декатронов сможет считать от 0 до 999.

Dpc core.jpg

Один такой счетчик на базе шести декатронов будет определять номер текущей исполняемой инструкции. В дополнение к нему нам нужен счетчик глубины вложенности циклов — сумматора в будущем компьютере нет, а значит, начало текущего цикла придется искать вручную, банально перематывая счетчик инструкции назад до тех пор, пока начало нашего цикла не будет найдено. Счетчик вложенных циклов поможет корректно искать нужное начало, даже если внутри нашего цикла множество вложенных. Счетчика от 0 до 999 будет более чем достаточно: в программах на Brainfuck, написанных людьми, даже больше 20–30 уровней вложенности циклов — редкость.

Третий счетчик от 0 до 29 999 будет определять номер текущей ячейки данных. Так как у нас чистый Brainfuck, то и число ячеек в точности соответствует исходной спецификации. Декатронный счетчик можно сбросить при любых значениях.

По адресу этого счетчика происходит выборка данных из ОЗУ. Данные помещаются в четвертый счетчик, который умеет считать от 0 до 255. То есть мы загружаем в декатрон наше старое значение, делаем инкремент или декремент и выгружаем данные обратно в память.

Dpc machine.jpg

Набор инструкций (Актуальная версия на 18 марта 2022г.)

Общая концепция

УСТАРЕЛО! Самая первая визуализация будущего набора команд.
УСТАРЕЛО! Самая первая визуализация будущего набора команд.

В итоге мы имеем:

  • NOP — пустая инструкция, необходимая для выравнивания циклов внутри кеш-линеек;
  • + и - — инкремент и декремент текущей ячейки данных;
  • < и > — изменение номера текущей ячейки;
  • [ и ] — начало и конец цикла;
  • . и , — печать текущего символа в консоль и ввод из консоли.

Инструкция кодируется четырехбитным значением, а это значит, что остается еще семь свободных инструкций, которые можно использовать для управления машиной.

Например, инструкция HALT остановит машину при завершении работы программы. Еще две инструкции — LOAD и STORE — оптимизируют работу с памятью.

Оптимизация доступа к памяти

Допустим, у нас есть десять инструкций +, идущих подряд. Нам придется десять раз повторить следующий набор действий:

  1. Прочитать значение текущей ячейки и записать его в декатронный счетчик;
  2. Выполнить операцию инкремента;
  3. Записать новое значение текущей ячейки из счетчика в ОЗУ.

По факту мы девять раз просто так будем делать загрузку-выгрузку. Проще перед первым инкрементом один раз сделать явно сделать LOAD из памяти в счетчик, а после последнего явно вызвать STORE обратно из счетчика в ОЗУ. Либо ламповая логика должна понимать, какая инструкция будет идти следом за текущей и выполнять LOAD и STORE неявно, не тратя в дальнейшем время на холостые загрузки-выгрузки.

С одной стороны, неявный LOAD/STORE позволит грузить в компьютер программы, написанные на Brainfuck вообще без модификаций. С другой стороны, усложняется логика выборки инструкции, так как при чтении следующей инструкции необходимо учитывать текущее состояние флагов машины и выполнять дополнительные действия.

В итоге выбрал способ неявного LOAD и STORE. За основу взят принцип data-lock.

  1. Pагружаем новую инструкцию
  2. Текущая инструкция +(или -).
    1. Проверяем флаг APLock:
      1. Флаг снят. значит в счетчик данных еще не загружено значение из текущей ячейки данных. Производим операцию LOAD из текущей ячейки памяти в счетчик данных. Выставляется флаг APLock
      2. Флаг стоит. Значит данные в счетчике уже загружены. Ничего не делаем
  3. Текущая инструкция < или >
    1. Проверяем флаг APLock
      1. Флаг снят. Ничего не делаем
      2. Флаг стоит. Производим операцию выгрузки текущего значения счетчика данных в ОЗУ. Снимаем флаг APLock
  4. Текущая инструкция - другая
    1. Дополнительных действий не требуется.
  5. Исполняем текущую инструкцию

Каждая инструкция представлена в памяти 4-х разрядным значением, соответствующим тому или иному опкоду.

При этом, компьютер имеет дополнительные инструкции, которые предназначены для непосредственного управления машиной.

Для этого, в машине имеется 1-х разрядный регистр текущего набора команд. ISAREG, который в теории расширяет число инструкций до 32 - представляя два набора инструкций:

  1. ISAREG=0 - Debug ISA - режим, в котором машина находится после включения. в нем доступны инструкции очистки ОЗУ, сброса состояния машины, команды загрузки данных с перфоленты
  2. ISAREG=1 - Brainfuck ISA - основной режим, в котором доступны 8 инструкций языка brainfuck плюс несколько дополнительных

В реальности, одни и те же инструкции могут присутствовать в разных наборах. например инструкции выбора набора инструкций присутствуют везде, таким образом, в одном наборе может быть только до 14 инструкуций по существу.

Debug ISA (ISAREG=0)

Символ Опкод Brainfuck название описание
N 0x0 NOP No operation - Must be in both ISA set
H 0x1 HALT Must be in both ISA set
0x2
0x3
{ 0x6 LABEG Если текущий адрес равен нулю - пропустить тело цикла
} 0x7 LAEND Если текущий адрес не равен нулю - выполнить итерацию цикла
L 0x8 CLRL Сбросить счетчик глубины вложенностей циклов
I 0x9 CLRI Сбросить счетчик инструкций
0 0xA CLRD Сбросить счетчик данных
A 0xB CLRA Сбросить счетчик адреса (Что делать с флагом захвата?)
0xC
R 0xD RST Hard reset
D 0xE ISA2 Set ISAREG=0 - Debug ISA
B 0xF ISA3 Set ISAREG=1 - Brainfuck ISA

Загрузчик

загрузчик - код, который будет выполняться сразу после включения машины и подачи тактирования. Расположен по нулевому адресу в памяти. Bootloder is the code, which is performed after reset vector. In placed on the instruction address 0x00000;

Очистка памяти

После включения или перезагрузки, в ОЗУ данных может быть мусор. По правилам brainfuck - все ячейки должны изначально иметь нулевое состояние, в С такой код выглядит следующим образом:

  for (i = 0; i < 30000; ++i)
  {
    Memory[i] = 0;
  }

В формате инструкций компьютера DekatronPC, начальный код загрузчика выглядит так:

  A0> //Установка счетчика адреса в нуль, Обнуление текущей ячейки данных и выбор следующей
  {   // Пока текущее значение счетчика адреса не равно нулю:
    0 >//Обнуление текущей ячейки данных и выбор следующей
  }
  B //Выбор Brainfuck ISA

PunchTape ISA (ISAREG=0) (в составе Debug ISA)

Предназначен для загрузки данных с перфоленты в память программ. Как именно это сделать - пока не понятно. Так как загрузчик использует счетчик инструкций и часть памяти программ для себя. Следовательно, необходимо реализовать возможность использования счетчика адреса в этих целях. Однако, счетчик адреса не в состоянии покрыть ведь диапазон памяти программ.

Второй вариант - использовать счетчик адреса загрузчиком. Но тогда не получится очистить память данных от мусора.

Третий вариант наиболее предпочтителен - использовать аппаратный способ загрузки - когда синхросигнал с перфоленты будет инкрементировать значение счетчика инструкций, а другой сигнал - подавать сигнал записи в память. Таким образом можно инструкцией запустить этот процесс и дальше аппаратные средства сделают все самостоятельно.

Brainfuck ISA (ISAREG=1)

Помимо восьми основных brainfuck-инструкций имеет еще 8 дополнительных. Особое внимание стоит уделить инструкциям CLRML, LOAD, STORE

Они могут быть использованы для копирования данных в памяти. счетчик данных может быть использован как временный регистр.

Допустим, нужно скопировать данные из ячейки А в ячейку Б.

  1. Счетчик адреса устанавливается на ячейку А
  2. Дается команда LOAD - данные загружаются из памяти в счетчик данных
  3. Стирается флаг памяти - CLRML. Возможно имеет смысл команду LOAD делать без поднятия флага, тогда эта операция будет не нужна
  4. Счетчик адреса устанавливается на ячейку Б
  5. Дается команда STORE. значение из счетчика данных выгружается в ячейку памяти Б
Символ Опкод Brainfuck название описание
N 0x0 NOP Пустая инструкция
H 0x1 HALT Останов машины
+ 0x2 + INC Increment of Current data cell
- 0x3 - DEC Decrement of current data cell
> 0x4 > AINC Increment of address pointer
< 0x5 < ADEC Decrement of address pointer
[ 0x6 [ LBEG If current data cell equal zero, skip the loop
] 0x7 ] LEND If current data cell not equal zero, repeat loop iteration
. 0x8 . COUT Print current symbol to the terminal
, 0x9 , CIN Read symbol from the terminal (Blocked acces - Program halted while no symbol)
0 0xA [-] CLRD Basic brainfuck optimization: Write zero to current Data Cell
M 0xB CLRML Clear memory lock
G 0xC LOAD Explicit Load from current memory cell to Data Counter
S 0xD STORE Explicit Store from Data Counter to current memory cell
D 0xE ISA2 Set ISAREG=0 - Debug ISA
B 0xF ISA3 Set ISAREG=1 - Brainfuck ISA

Формат записи на магнитную ленту

Если использовать кассетный или бобинный магнитофон (типа ламповой коменты или яузы) для хранения программ и их последующего ввода в память машины, можно использовать DTMF-сигналы, когда двумя синусоидами кодируется до 16 символов. Так как программа пишется 4-х битовыми пачками, так что в одном сигнале сразу будет готовая инструкция. По завершении записи на ленте формируется прерывистый сигнал 0x01(HALT)

Декатронные счетчики

Лампы по платам работы с декатроном
Платы Триоды Диоды
Схема чтения 2 8
Схема записи 29 0
Управление, перенос 5 6
Лампы по счетчикам
Счетчик Функционал Чтение Запись Управление Декатроны Диоды Триоды
IP Counter Сброс в нуль, Чтение данных, Zero 6 0 6 6 84 42
AP Counter Сброс в нуль, Чтение данных, Zero 5 0 5 5 70 35
Data Counter Сброс в нуль, запись данных, чтение данных, Zero 3 3 3 3 42 108
Loop Counter Сброс в нуль, Zero 0 0 3 3 18 15
Всего 14 3 17 17 214 200

Экспериментальная декатронная ячейка

Источники питания:

  • ТСШ-170 - предназначен для выработки основного питания +150В, а также пары накальных линий для 6С19П. Трансформатор необходимо проверить на сопротивление изоляции.
  • ТН61 - общей мощностью 190Вт. Имеет 4 линии 6.3В - 3 по 8А и 1 машина - 6.1А. Будет обеспечивать основное питание накалов ламп, разбитых на группы по смещениям.
  • ТА48, мощностью 36Вт - питание декатрона +500В (технически сам источник будет на +350В), а также напряжение смещения -50В.

DekatronPC Challenge

Сейчас у меня собрано все железо, нужное для начала экспериментов. Впереди — долгий и интересный процесс проектирования и сборки будущей машины. В отличие от релейного компьютера с его монолитной конструкцией, здесь будет блочная. Тот или иной блок можно будет собрать за пару месяцев и продолжать спокойно заниматься другими делами.

Однако не стоит забывать о нормальном моделировании схемотехники будущей ЭВМ. Для начала в планах написать программный эмулятор, в котором виртуально реализована предполагаемая архитектура.

На втором этапе эту же самую архитектуру необходимо реализовать на языке VHDL или Verilog и запускать как в эмуляторе, так и на живой ПЛИС.

Третьим этапом будет воссоздание блоков в железе и их подключение к ПЛИС. Получается, что блоки можно будет использовать для реальных вычислений по ходу строительства компьютера. Потом, замещая один за другим эмулируемые блоки реальным железом, мы полностью избавимся от ПЛИС, и ламповый компьютер станет полностью самостоятельным. Проект будет считаться завершенным, когда от ПЛИС в системе не останется и следа.

Впереди много разноплановой работы: эксперименты с ламповой логикой и ферритовой памятью, создание реверсивных декатронных счетчиков... В общем, будет весело.

Часто-задаваемые вопросы и ответы

  • Зачем?
    • Затем.
  • Почему brainfuck? Может быть лучше взять более практичный урезанный ассемблер?
    • brainfuck - и есть урезанный ассемблер. Ламповая машина в любом случае будет в миллион раз медленнее современных компьютеров и проект является видом инженерного искусства. А раз так - то реализовывать надо наиболее безумный вариант. Тем более что декатрон - основа машины - позволяет реализовать brainfuck и ничего более.
  • Питание?
    • Каждый блок будет оснащен своим собственным источником накального напряжения. Основной источник накального - трансформаторы ТН60 и ТН61.
    • Напряжения смещения а также напряжение питания декатронов - анодные трансформаторы ТА и ТПП подходящей мощности и напряжений. Все напряжения смещения будут оборудованы стабилизаторами выходного напряжения. Эти напряжения подаются через пускатель по команде общего блока управления - после прогрева ламп.
    • Основное анодное напряжение - некоторые блоки будут получать от собственных силовых трансформаторов типа ТС160, ТС170, ТС270 - это трансформаторы от ламповых телевизоров. а также от трансформаторов типа ТА подходящей мощности. Стабилизаторов напряжения на выходе не будет предусмотрено. Анодное на схему будет подаваться через пускатель по команде общего блока управления после подачи накального напряжения и прогрева ламп, подачи напряжений смещения, анодного декатронов.
    • Предусмотрен общий стабилизатор напряжения на базе автотрансформатора. От него будут питаться все остальные блоки.

Общий прогресс

Видеоматериалы

Ссылки