Speccy - наш выбор!

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

Patron 31st January 2013 03:18

Quote:

Originally Posted by Vamos (Post 571907)
А подскажите пожалуйста как в НХ сервере сделана работа с СОМ портом, что переполнения не происходит.

Так и там тоже были переполнения

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

поэтому, проверить на счёт переполнений всегда есть смысл первым делом.

Vamos 31st January 2013 03:30

Quote:

Originally Posted by Patron (Post 571923)
Так и там тоже были переполнения

НО переполнения возникали уже в загрузчике НХ сервера, а все остальные программы вызывают переполнение в загрузчике УКНЦ, почти сразу.
Есть ли смысл рассматривать фукцию CreateFile() с параметром FILE_FLAG_OVERLAPPED или результат будет такой же?

Patron 31st January 2013 04:25

Quote:

Originally Posted by Vamos (Post 571925)
Есть ли смысл рассматривать фукцию CreateFile() с параметром FILE_FLAG_OVERLAPPED или результат будет такой же?

Т.е. чтение виртуального порта в Windows возвращается с ошибкой?
Но ведь в порту com0com включена бесконечная буферизация и переполнения быть не может..

Vamos 31st January 2013 04:38

Как я понял, запись в буфер происходит слишком быстро и код эмулятора не успевает.

Vamos 31st January 2013 04:51

1 Attachment(s)
Ну вот чего ему не хватает :mad:

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

если кому попадался этот тест с пунктом 6 (стык С2) поделитесь пожалуйста.

Patron 31st January 2013 04:54

Quote:

Originally Posted by Vamos (Post 571928)
Как я понял, запись в буфер происходит слишком быстро и код эмулятора не успевает.

Речь пока не о диагнозе, а об анамнезе - т.е. действительно ли какая-то из функций Windows ( чтение порта, запись порта ) возвращает ошибку или WaitCommEvent рапортует о EV_ERR ?

Vamos 31st January 2013 05:16

Patron, на этот вопрос у меня ответа нет, но вот код, может там чего
Code:

                if (m_SerialInCallback != NULL && frameticks % 416 == 0)
        {
            CFirstMemoryController* pMemCtl = (CFirstMemoryController*) m_pFirstMemCtl;
            if ((pMemCtl->m_Port176574 & 004) == 0)  // Not loopback?
            {
                BYTE b;
                if (m_SerialInCallback(&b))
                                {
                                        if ((pMemCtl->m_Port176570 & 0200) == 0)  // Ready?
                                        {
                                                pMemCtl->m_Port176572 = b;
                                        }
                                        else
                                                {
                                                        pMemCtl->m_Port176570 |= 010000;  // Set Overflow flag
                                                }
                                        pMemCtl->m_Port176570 |= 0200;  // Set Ready flag
                                }
                        }
                }

        if (m_SerialOutCallback != NULL && frameticks % serialOutTicks == 0)
        {
            CFirstMemoryController* pMemCtl = (CFirstMemoryController*) m_pFirstMemCtl;
            if (serialTxCount > 0)
            {
                serialTxCount--;
                if (serialTxCount == 0)  // Translation countdown finished - the byte translated
                {
                    if ((pMemCtl->m_Port176574 & 004) == 0)  // Not loopback?
                                        {
                                                (*m_SerialOutCallback)((BYTE)(pMemCtl->m_Port176576 & 0xff));
                                        }
                                        else  // Loopback
                    {
                        pMemCtl->m_Port176572 = pMemCtl->m_Port176576 & 0xff;
                                                pMemCtl->m_Port176570 |= 0200;  // Set Ready flag
                    }
                    pMemCtl->m_Port176574 |= 0200;  // Set Ready flag
                }
            }
            else if ((pMemCtl->m_Port176574 & 0200) == 0)  // Ready is 0?
            {
                serialTxCount = 8;  // Start translation countdown
            }
        }


nzeemin 31st January 2013 10:27

У меня пока основная гипотеза -- что передача байт из эмулятора происходит без проверки того готов ли к этому COM-порт. Поэтому вероятно мы и видим overrun. Вообще общение с COM-портом у меня построено не на overlapped и не на событиях, а по более простой схеме -- чисто байтовое чтение и запись. При чтении если очередной байт не готов -- он не отдаётся. Но при записи пишется всё не взирая на возможные переполнения.

hobot 31st January 2013 12:44

1 Attachment(s)
Quote:

Originally Posted by Vamos (Post 571930)
если кому попадался этот тест с пунктом 6 (стык С2) поделитесь пожалуйста.

Эта версия TUK.SAV от СЭМЗА, я сейчас потыкался - другой версии не нашёл,
попробуй TS.SAV - просто ради эксперимента?

http://savepic.org/2745756.png

http://savepic.org/2736540.png


и вот ещё отдельный для СА "TSA.SAV"
http://savepic.org/2697628.png

hobot 31st January 2013 12:46

Кажется где-то под С2 было что-то отдельно написано, если откопаю-вспомню выложу сразу.


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

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