vak: (Default)
[personal profile] vak posting in [community profile] besm6
Я предлагаю сделать контроллер прерываний для МЭСМ-6 по мотивам одной из известных ардуинной публике архитектур. Упростить и адаптировать к 48-битному слову. Из опыта разработки RTOS для этих чипов, мне лично по душе подход PIC32.

Ограничимся 48 внешними прерываниями.

Введём регистр активных прерываний РАП, отдалённый аналог бэсмовского ГРП. Единица в каком-то бите означает, что поступил соответствующий сигнал прерывания. Единица "залипает", пока не будет сброшена софтом.

Введём регистр маски разрешённых прерываний РМРП, аналогичный бэсмовскому МГРП. Если бит маски установлен в единицу, и в регистре активных прерываний тоже стоит единица в этом бите, то на вход процессора будет подан запрос прерывания.

Выделим для этих регистров по два дополнительных адреса: "установка в 1" ии "установка в 0". Запись битовой маски по первому адресу уставливает эти биты в единицу, записо по второму адресу сбрасывает их в 0.

Введём регистр номера текущего прерывания РНП (только чтение). На каждом такте проверяем, если есть активные прерывания (РАП) и разрешены ли они (РМРП). В этом случае заносим номер самого старшего бита в РНП и активируем глобальный сигнал прерывания для процессора.

Для каждого прерывания выделим отдельный адрес обработчика, скажем 0100-0157. Адреса ниже 0100 будут заняты отработчиками экстракодов.

Ориентировочый список внешних прерываний:
1. Таймер 0.
2. Таймер 1.
3. Блок GPIO, включая внешние сигналы прерываний.
4. Сторожевой таймер.
5. Асинхронный порт UART 0.
6. Асинхронный порт UART 1.
7. Порт SPI 0.
8. Порт SPI 1.
9. Порт I2C 0.
10. Порт I2C 1.

Date: 2019-04-15 10:40 pm (UTC)
spamsink: (Default)
From: [personal profile] spamsink
По мне так чем проще хардвер и чем ближе к БЭСМ-6, тем лучше. НЕД-УИ-МОД-ПБ достаточно для перехода на обработчик конкретного прерывания по произвольному динамически устаравливаемому адресу, а НЕД-УИ-ПБ - для перехода по статическому диапазону адресов.

Date: 2019-04-16 01:44 am (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Отдельные регистры для установки и гашения масок - тоже чисто для ускорения.
Единственная лажа, от которой действительно стоит избавиться - это различие между гасимыми и негасимыми разрядами.

Date: 2019-04-16 02:41 am (UTC)
x86128: (Default)
From: [personal profile] x86128
По мне так чем проще хардвер и чем ближе к БЭСМ-6, тем лучше. НЕД-УИ-МОД-ПБ достаточно для перехода на обработчик конкретного прерывания по произвольному динамически устанавливаемому адресу, а НЕД-УИ-ПБ - для перехода по статическому диапазону адресов.

Хорошее решение.

Регистры всех периферийных блоков я бы предложил отобразить в память. Занять под них диапазон 77000-77777. Так к ним удобнее будет обращаться из языков высокого уровня. Команды РЕГ и УВВ не особо нужны. Совместимость с БЭСМ-6 нам тут никак не помогает.

То есть мы всё таки отказываемся от команд РЕГ (для обращения к спец. регистрам УУ (процессора)) и УВВ (для обращения к периферийным регистрам) ? И делаем всё обращение к системным регистрам через ATX, XTA(и др. AEX,AOX и т.д.) через MMU?

Date: 2019-04-16 02:55 am (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Отображение внешних регистров в память, возможно, упростит архитектуру, но сделает результат не клоном БЭСМ-6, а скорее клоном СВС.

Date: 2019-04-17 04:46 am (UTC)
x86128: (Default)
From: [personal profile] x86128
Хорошо. Вынесу регистры статуса, масок прерываний за MMU. Выкину РЕГ и УВВ.

Микрокод будет просто тогда по прерыванию заходить в один вектор и передавать управление на адрес 0100.

По адресу 0100 будет будет лежать тогда utc РНП, UJ 0101. РНП когда нету активных запросов на прерывания будет давать 0.

Так нормально?

Единственное, что тут еще вылезло. Посмотрел какие бывают штны - AHB-lite, APB, SBA.
На fpga получается все read шины slave'ов собирают в один "жирный" такой мультиплексор - это нормально? Или надо сделать все выходы slave'ов с output enable с третьим состоянием?

Date: 2019-04-16 08:07 am (UTC)
spamsink: (Default)
From: [personal profile] spamsink
А как БЭСМ-6 жила без атомарных гашений?

Date: 2019-04-16 02:19 pm (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Что могло теоретически сбросить какие-то биты, появившиеся с момента чтения ГРП. Если бы это происходило, то при печати на двух АЦПУ прерывание терялось бы в среднем каждые 100 строк, приводя к ошибочно напечатанной строке. Но АЦПУ работали стабильно: хоть буквы и плавали, прерывания не терялось. Парадокс?

Date: 2019-04-16 06:47 pm (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Именно. Так зачем выдумывать велосипед? Мы делаем клон БЭСМ-6 или что?

Date: 2019-04-16 10:59 pm (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Тогда я уж лучше теперь софтом займусь. Ты будешь пытаться заканчивать втаскивать Паскаль-компилятор под FreePascal, или можно начинать C++изацию?

Date: 2019-04-18 12:15 am (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Идёт как по маслу, уже >750 компилируемых строк готово. Среди TODO, кроме очевидных, связанных с перекодировкой символов, еще есть mkBitset(const char *), принимающий строки типа "0, 1, 3..5, 8". :) Но это потом.

С целым порядком, похоже, больших проблем не будет, потому что мест, где формируются полнословные целые константы, и порядок добавляется неявно, немного. Больше мест, где на целое число накладывается маска, содержащая порядок, и сравнивается с подобным же множеством. Но это явно видно, уже одно такое место я прошел.

Вот тебе задачка: как с минимальной кровью организовать доступ к переменным из объемлющих процедур?

Date: 2019-04-18 04:50 am (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Я об этом знаю (хотя в С++ еще и не пробовал), но хотелось бы пользоваться стандартными фичами языка. Я уже придумал, как; пока (уже около 1500 строк) к переменным из объемлющих блоков не так уж и много обращений.
Для простоты компилятор будет поначалу принимать только ASCII.

Date: 2019-04-18 04:54 am (UTC)
x86128: (Default)
From: [personal profile] x86128
Покажите проблемный кусок кода. Не совсем понятно о чем речь.
В Си можно к переменным ходить из вложенного блока во внешний, наоборот - нельзя.

Date: 2019-04-18 05:36 am (UTC)
spamsink: (Default)
From: [personal profile] spamsink
Я зачекинил pascompl.cc в toolchain/pascompl. Ради сохранения той же последовательности объявлений переменных и тел процедур, объемлющие процедуры становятся классами с вынесенным телом конструктора. Для нерекурсивных процедур достаточно одного статического в классе указателя на "фрейм", которым при необходимости пользуются "вложенные" процедуры. Для рекурсивных это будет стек.

Пара сотен последних сконвертированных строк пока чисто не компилируется.

Date: 2019-04-16 04:04 am (UTC)
x86128: (Default)
From: [personal profile] x86128
Хорошо. Давайте примем эту концепцию. Глобальные/значимые отличия от БЭСМ-6 будем сгружать ввиде липких бумажек во второй проект на гитхаб

https://github.com/besm6/mesm6/projects/2

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

Адреса векторов помещаются в микрокод, поэтому не вижу сложностей реализации экстракодов.

Прыжок на вектор по прерыванию будет по адресу 0100+РНП. РНП = 0, для РАП == 0.

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

Date: 2019-04-16 04:10 am (UTC)
x86128: (Default)
From: [personal profile] x86128
Результат РНП придется вычислять внутри PIC и отдавать эти 6 бит в процессор.

Если это не сделать, то тогда придется прыгать программно по схеме Леонида.

Date: 2019-04-18 02:53 am (UTC)
x86128: (Default)
From: [personal profile] x86128
Таже ситуация. Привезли "отечественное" κρиπто-железо. надо запустить
Поэтому я пока копипастить ahb-lite не буду. Использую то, что есть уже для шины у нас. Потом когда уже железо будет расширим сигналы и перенесем uart.

Profile

Сообщество любителей БЭСМ-6

January 2026

S M T W T F S
    123
45678910
11121314151617
18192021222324
2526272829 3031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Mar. 6th, 2026 05:55 am
Powered by Dreamwidth Studios