Удивительно, почему тогда программы пухнут год от года.
Вид для печати
Если загрузчик 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
http://zx-pk.ru/attachment.php?attac...1&d=1359728766
Когда я отключил в эмуляторе ДВК посылку сигнала 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.
У меня нет.
видимо нет. видимо BREAK
http://zx-pk.ru/attachment.php?attac...1&d=1359744341
Подскажите куда втыкать SetCommBreak, там где порт инициализируется или там где бит 00 обрабатывается.
Вот сюда:
Код: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 ----------
Попробовал -- не помогает.
Кроме того, я пробовал запускать загрузку по сети когда оба эмулятора работают на полной скорости (без звука) -- загрузка тоже падает с ошибкой.