Speccy - наш выбор!

Speccy - наш выбор! (http://zx-pk.ru/index.php)
-   Эмуляторы отечественных компьютеров (http://zx-pk.ru/forumdisplay.php?f=61)
-   -   Эмулятор УКНЦ (http://zx-pk.ru/showthread.php?t=6257)

alone 31st January 2013 17:42

Quote:

Originally Posted by Patron (Post 571852)
Сейчас оптимизаторы достигли такой крутизны, что при включённой глобальной оптимизации - вызов целого вороха вложенных функций может скомпилироваться в одну-две ассемблерных команды вообще без всяких вызовов подпрограмм.

Удивительно, почему тогда программы пухнут год от года.

Patron 31st January 2013 18:14

Если загрузчик TU58 использует сигнал BREAK, то он не начнёт нормально работать до тех пор, пока в нужные места эмулятора не будут вставлены вызовы SetCommBreak и ClearCommBreak.

Patron 1st February 2013 18:05

Эксперимент по запуску эмулятора 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 выглядит довольно непонятно.

Vamos 1st February 2013 19:26

1 Attachment(s)
как бы вот, после нажатия ESC
http://zx-pk.ru/attachment.php?attac...1&d=1359728766

Patron 1st February 2013 22:59

Quote:

Originally Posted by Vamos (Post 572333)
как бы вот, после нажатия 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:
Code:

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.

Vamos 1st February 2013 23:01

1 Attachment(s)
Quote:

Originally Posted by Patron (Post 572356)
то на чём всё потом остановилось..

вот на этом

http://zx-pk.ru/attachment.php?attac...1&d=1359741657

Patron 1st February 2013 23:29

Quote:

Originally Posted by Vamos (Post 572388)
вот на этом

Т.е. загрузчик успешно прочитался, успешно запустился и довольно много чего читает.

Есть уже отладочная печать в том месте, где бит переполнения устанавливается ?
Из-за переполнения проблема или нет ?

Vamos 1st February 2013 23:48

1 Attachment(s)
Quote:

Originally Posted by Patron (Post 572400)
Есть уже отладочная печать в том месте, где бит переполнения устанавливается ?

У меня нет.

Quote:

Originally Posted by Patron (Post 572400)
Из-за переполнения проблема или нет ?

видимо нет. видимо BREAK
http://zx-pk.ru/attachment.php?attac...1&d=1359744341

Подскажите куда втыкать SetCommBreak, там где порт инициализируется или там где бит 00 обрабатывается.

Patron 2nd February 2013 00:29

Quote:

Originally Posted by Vamos (Post 572403)
куда втыкать SetCommBreak

Вот сюда:
Code:

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;
    }
}


nzeemin 2nd February 2013 18:10

Я вот думаю -- не проще ли сразу после SystemFrame() вызвать SetCommBreak(), а непосредственно перед SystemFrame() сделать ClearCommBreak().
Если проблема действительно в паузе между фреймами, это может помочь.

---------- Post added at 17:10 ---------- Previous post was at 17:00 ----------

Попробовал -- не помогает.
Кроме того, я пробовал запускать загрузку по сети когда оба эмулятора работают на полной скорости (без звука) -- загрузка тоже падает с ошибкой.


All times are GMT +4. The time now is 02:52.

Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.