С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Если загрузчик TU58 использует сигнал BREAK, то он не начнёт нормально работать до тех пор, пока в нужные места эмулятора не будут вставлены вызовы SetCommBreak и ClearCommBreak.
Эксперимент по запуску эмулятора TU58 с "Эмулятором ДВК" показал, что эмуляция сигнала BREAK для работы с эмулятором TU58 через com0com не обязательна.
После запуска - TU58.exe предлагает нажать клавишу [Esc] и пропустить ожидание сигнала BREAK. После чего начинает обрабатывать пакеты в заданном порту, позволяя результативно выполнить в эмуляторе ДВК команды DIR DD: и BOOT DD:
---------- Post added at 16:05 ---------- Previous post was at 14:48 ----------
Выяснилось, что эксперимент по работе с эмулятором TU58 без сигнала BREAK был не вполне корректным - оказывается, и эмулятор последовательного порта в "Эмуляторе ДВК", и адаптер COM-порта в модульном API поддерживают передачу сигнала BREAK. В описании com0com тоже указано, что передача сигнала BREAK не просто поддерживается, а многократно улучшалась.
Однако, эмулятор TU58 начал нормально работать только после отключения ожидания сигнала BREAK нажатием клавиши [Esc].
Так что пока вся эта история с сигналом BREAK выглядит довольно непонятно.
как бы вот, после нажатия ESC
Когда я отключил в эмуляторе ДВК посылку сигнала BREAK - стало так же, поэтому без посылки BREAK TU58.exe работать не будет.
Посылку BREAK добавить нетрудно - когда программа устанавливает бит 00 в статусе передатчика - нужно вызвать SetCommBreak( hComPort ) ( и ещё можно сделать Sleep(15) - тогда Windows успевает отреагировать до сброса этого бита эмулятором ), а когда программа обнуляет установленный бит 00 - нужно вызвать ClearCommBreak( hComPort ) ( здесь Sleep уже не нужен ).
---------- Post added at 20:45 ---------- Previous post was at 19:45 ----------
Хотя, если внимательнее присмотреться к сообщениям TU58.exe:
получается, что эмулятор опознал и выполнил команду чтения вторичного загрузчика.Код:command 2 count 800 block 2
Поэтому, ситуация с сигналом BREAK в данном конкретном случае не вполне ясна - если TU58.exe и без сигнала BREAK передал загрузчик, то на чём всё потом остановилось..
Однако, когда я отключил BREAK в эмуляторе ДВК и дал DIR DD: - эффект был нулевой, а с посылкой BREAK - всё работало как надо.
---------- Post added at 20:49 ---------- Previous post was at 20:45 ----------
Возможно, в последнем случае дело было не в самом сигнале BREAK, а в том, что при подаче BREAK эмулятор делал Sleep(15) - вот TU58.exe и успевал ответить до отвала драйвера DD.SYS по таймауту.
Сейчас проверю эту гипотезу..
---------- Post added at 20:59 ---------- Previous post was at 20:49 ----------
ДА! TU58.exe нормально работает без BREAK !!!
Если вместо сигнала BREAK просто делать Sleep(15) - TU58.exe без проблем обслуживает любые запросы драйвера DD.SYS
Только что загрузил RT-11 c DD: с отключенной посылкой BREAK.
Вот сюда:
Код:void CFirstMemoryController::SetPortByte(WORD address, BYTE byte) { WORD word = (address&1)?((WORD)byte) << 8:(WORD)byte; switch (address) { case 0176574: // Стык С2: Регистр состояния передатчика case 0176575: if (((m_Port176574 & 0300) == 0200) && (word & 0100)) m_pProcessor->InterruptVIRQ(8, 0374); if (word & 01) { if (!(m_Port176574 & 01)) { // BREAK SetCommBreak( m_hEmulatorComPort ); Sleep(15); } } else if (m_Port176574 & 01) ClearCommBreak( m_hEmulatorComPort ); m_Port176574 = (m_Port176574 & ~0105) | (word & 0105); break; } } void CFirstMemoryController::SetPortWord(WORD address, WORD word) { switch (address) { case 0176574: // Стык С2: Регистр состояния передатчика case 0176575: if (((m_Port176574 & 0300) == 0200) && (word & 0100)) m_pProcessor->InterruptVIRQ(8, 0374); if (word & 01) { if (!(m_Port176574 & 01)) { // BREAK SetCommBreak( m_hEmulatorComPort ); Sleep(15); } } else if( m_Port176574 & 01 ) ClearCommBreak( m_hEmulatorComPort ); m_Port176574 = (m_Port176574 & ~0105) | (word & 0105); break; } }
Я вот думаю -- не проще ли сразу после SystemFrame() вызвать SetCommBreak(), а непосредственно перед SystemFrame() сделать ClearCommBreak().
Если проблема действительно в паузе между фреймами, это может помочь.
---------- Post added at 17:10 ---------- Previous post was at 17:00 ----------
Попробовал -- не помогает.
Кроме того, я пробовал запускать загрузку по сети когда оба эмулятора работают на полной скорости (без звука) -- загрузка тоже падает с ошибкой.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)