Тут MOV может на сотню тактов растянуться, а он об умножении... =)
Вид для печати
Тут MOV может на сотню тактов растянуться, а он об умножении... =)
Ну с нашими РУшками главный тормоз всё равно же именно проц? И это видимо не только из-за кривой архитектуры с диким обменом с памятью. А из-за реализации.
Да, процессор является главным тормозом, а реализация такая, какую транзисторный бюджет на тот момент позволял. Сейчас потихоньку смотрю LSI-11, есть у меня подозрение что оно еще медленее. И, много знакомого, люди делавшие ВМ1 явно LSI-11 и его устройство и микропрограмму изучали.
Ну, мне в этом плане проще гораздо, нет никакого апи - не нужно ничего
адаптировать, зато можно нужное апи создать.
Вам может и можно, а у меня всё гораздо проще, что вижу - о том и пою, имеющаяся у меня абстрактная модель абсолютно несовместима с V-моделью. Там даже сравнивать нечего, как мокрое с мягким.
Вот я пытаюсь собрать минимальный инструментарий для запуска сдаточных тестов ВМ1: модель процессора (правильность которой как раз и над проверить), простейшая модель памяти, простейшая модель терминального устройства, и всё это взаимодействует между собой посредством сигналов ОШ МПИ, по диаграммам из соответствующего ГОСТа (без учёта времянок естественно, лишь бы сигналы выставлялись в соответствующем порядке). Как-то тяжко идёт. У меня есть подозрение, что это дело можно сэмулировать как-то проще, но в голову ничего иного не приходит.
Если согласовать интерфейс V-модели процессора 1801ВМ1 ( т.е. полный перечень публичных методов для чтения/записи сигналов на входах и выходах процессора ) - я могу сделать специальный вариант эмулятора ДВК-1 с исходниками отдельного модуля ( в виде проекта Visual C++ 2005 ), создающего объекты с таким интерфейсом. Тогда V-модель можно будет запускать в эмуляторе ДВК.
А их нету, так что подойдут любые.
Сейчас у меня сделано так: есть структура MPI в которой заданы все гостовские сигналы типа bool, а шина адрес-данные - слово unsigned short int, всё это в инверсном виде, для аутентичности, потому что у Vslav модель процессора тоже получает/выдаёт инверсные данные.
И есть единственная функция, отрабатывающая один такт устройства:
CPU получает сигналы МПИ, отрабатывает полутакт ТЧ, если есть изменения - изменяет данные сигналов структуры МПИ, затем все остальные устройства, сидящие на шине, таким же образом. Всё это теоретически. Практически работоспособность не проверена, т.к. сейчас модель процессора не работает, ищу опечатки, так что даже публиковать исходники смысла нету. Конкретно сейчас - цикл dati не завершается, после съёма внешним устройством RPLY, процессор не хочет снимать SYNC, поэтому дело дальше не идёт.Код:void tboard::maincycle()
{
m_CPU.eval_p(&m_MPI); //отработаем передний фронт ТЧ
m_Memory.eval(&m_MPI);
m_IRPS.eval(&m_MPI);
OutLog();
m_CPU.eval_n(&m_MPI); //отработаем задний фронт ТЧ
m_Memory.eval(&m_MPI);
m_IRPS.eval(&m_MPI);
OutLog();
m_nClk++;
}
Vslav, QSync\vm1_qbus.v, строка 683 - там длинное условие получается такое
if (pin_dmgi & ... & ~pin_dmgi), т.е. никогда не true, нету ли ошибки?
Да, получается есть ошибка, внесена при переносе на синхронную модель, должно быть так:
Выходит что генерация SACК привязана к срезу DMGI_IN, а не к уровню, потому что работает дополнительный триггер qbus_req.Код:if (pin_dmgi & (qbus_nosr_rc | (sync_out & ~qbus_win)) & qbus_req)
Правильно ли я понимаю, что следующий интерфейс является исчерпывающим для V-модели 1801ВМ1:
Код:typedef unsigned short word;
struct MPI_signals_type
{
bool SACK;
bool DMGO;
bool DMR;
bool SEL1;
bool SEL2;
word AD;
bool BSY;
bool DCLO;
bool ACLO;
bool IRQ1;
bool IRQ2;
bool IRQ3;
bool INIT;
bool VIRQ;
bool IAKO;
bool DOUT;
bool DIN;
bool RPLY;
bool WTBT;
bool SYNC;
};
class VM1_MPI_interface {
public:
virtual void Clock()=0;
virtual MPI_signals_type & Link_MPI()
{
return MPI_signals;
}
protected:
MPI_signals_type MPI_signals;
};