![]() |
Quote:
(С) я думаю всё знают чей =) |
Quote:
|
Quote:
|
Про ООП (но не про Си!)
Скрытый текстЯ не проф. и Си вообще всегда бежал, но вот Паскаль от УК-НЦ потом турбо-паскаль в ДОС - для удовольствия и наконец Delphi под Win. ООП - конструкторы\диструкторы я понял только из объяснений Patrona - слишком заумные мне попадались видимо толкователи до этого. Но я вот что хотел сказать то - читал учебник (автора не помню), по Delphi, где автор полностью отказался от термина ООП и вообще не использовал его ни разу ни на одной странице (единственный учебник в котором автор на одном со мной языке говорил про ООП паскаль и Delphi), он вводит там такой термин Событийно Ориентированное Программирование. Мне например "методы" ? Ну то есть переменные объекта, которые через точку пишутся очень обрадовали! Но потребовалось время что-бы привыкнуть воспринимать и код и результат по новому, если раньше программа была строго линейная (или я такой как рельсы прямой!), то есть автоматом вылетала в монитор когда доходила до END., то под Win созданное окно так и будет висеть и получать сообщения. В целом это я так - впечатлениями делюсь, но мне например нелегко было отказаться от циклов и некоторых других вещей которые "не рекомендуются" при СОП, просто потому-что не нужны или не желательны или требуют дополнительного обслуживания (я имею в виду ProcessMessages). И странное дело, вот объяснения Patrona я понимаю, а код из примеров (сам синтаксис Си для меня всегда был страшен - может потому что я начинал с Бейсика на БК0010? Но все эти фигурные скобочки - у меня ассоциация с комментами из паскаля ))) Паскаль - просто больше похож (Delphi сюда же). на язык человека и наглядней (для меня) для простых вычислений. Но я не профи. [свернуть] Вот кстати говоря вопрос такой - если Си родился из макро-11 (а судя по данным многие профессионалы сразу начинали с той самой версии, минуя ассемблер, где Паскаль впервые в виде транслятора появился, так же на PDP? (наверное это легко нагуглить, но всё же). ---------- Post added at 20:35 ---------- Previous post was at 20:34 ---------- Quote:
|
Quote:
Когда я впервые в жизни включил глобальную оптимизацию и посмотрел ассемблерный листинг компиляции - то очень удивился. Из функций исчезли прологи и эпилоги, а аргументы стали передаваться в регистрах вместо стека. Если функция не числится глобальной (а значит не должна быть доступна в OBJ-файле в виде глобального имени) - оптимизатор может иногда вообще не компилировать её, а подставлять в точках вызовов как макрос. |
Patron, Vamos -- спасибо за критику и вклад в проект.
Сейчас станции уже начинают пытаться переговариваться, но сбиваются. http://img-fotki.yandex.ru/get/4119/..._3d220139_orig При этом на принимающей станции выпадает в СТОП. Загрузчик из сети в ПЗУ (спасибо Alex_K): Code:
; Загрузчик из сети |
Quote:
Можно вставить в эмулятор слежение за битом 012 в регистре состояния приёмника и убедиться. |
Так вот он какой 1801ВП-065, там оказывается есть бит 0 и бит 2 в регистре состояния приемника.
Бит 2 это вывод ST, программное управление вкл./выкл. станции из кольцевой сети. Бит 0 ??? , разрыв линии Получается это те самые DTR/DSR которые и должны были быть 107, 108 на стыке С2 |
Quote:
Бит 0 - разрыв линии - это посылка BREAK. А вывод ST - это не бит 2, а сигнал "свой адрес". Благодаря этому можно на неиспользуемые биты 1801ВП1-065 вешать свою обвязку без необходимости дешифрации адреса. В этом случае достаточно запомнить только младшие биты (различать приемник, передатчик, регистры данных) и реагировать на сигналы DIN, DOUT. Сигнал RPLY выставит сама 1801ВП1-065. Вот в этой обвязке есть номер станции и управление электронным коммутатором сети. |
Quote:
|
Quote:
http://zx-pk.ru/attachment.php?attac...1&d=1358979832 поэтому, проверить на счёт переполнений всегда есть смысл первым делом. |
Quote:
Есть ли смысл рассматривать фукцию CreateFile() с параметром FILE_FLAG_OVERLAPPED или результат будет такой же? |
Quote:
Но ведь в порту com0com включена бесконечная буферизация и переполнения быть не может.. |
Как я понял, запись в буфер происходит слишком быстро и код эмулятора не успевает.
|
1 Attachment(s)
Ну вот чего ему не хватает :mad:
http://zx-pk.ru/attachment.php?attac...1&d=1359589855 если кому попадался этот тест с пунктом 6 (стык С2) поделитесь пожалуйста. |
Quote:
|
Patron, на этот вопрос у меня ответа нет, но вот код, может там чего
Code:
if (m_SerialInCallback != NULL && frameticks % 416 == 0) |
У меня пока основная гипотеза -- что передача байт из эмулятора происходит без проверки того готов ли к этому COM-порт. Поэтому вероятно мы и видим overrun. Вообще общение с COM-портом у меня построено не на overlapped и не на событиях, а по более простой схеме -- чисто байтовое чтение и запись. При чтении если очередной байт не готов -- он не отдаётся. Но при записи пишется всё не взирая на возможные переполнения.
|
1 Attachment(s)
Quote:
попробуй TS.SAV - просто ради эксперимента? http://savepic.org/2745756.png http://savepic.org/2736540.png и вот ещё отдельный для СА "TSA.SAV" http://savepic.org/2697628.png |
Кажется где-то под С2 было что-то отдельно написано, если откопаю-вспомню выложу сразу.
|
Quote:
Мы видим именно бит 010000 в регистре статуса приёмника ? Если да - это неправильная эмуляция. Вот такой код в принципе ошибочен: Code:
if (m_SerialInCallback(&b))Quote:
Но ещё надо учитывать, что драйвер com0com - пакетный. Он не следит за промежутком времени между байтами ( в Windows вообще ни одна программа этого не делает ), поэтому, если эмулятор допускает формирование признака overrun - при работе в Windows этот признак обязательно будет формироваться. ---------- Post added at 11:38 ---------- Previous post was at 11:35 ---------- Здесь даже промежутки времени не столь важны. Ведь в реальном порту действует квитирование, т.е. байт не может быть принят, если порт не готов. А в эмуляторе может! И даже признак overrun формируется! ---------- Post added at 11:41 ---------- Previous post was at 11:38 ---------- Поэтому - в нынешнем состоянии эмулятор эмулирует работу 1801ВП1-065 по кабелю без линий квитирования. А по такому кабелю ни TU58, ни сеть УКНЦ работать не могут. |
Quote:
Quote:
И кстати в сетевом адаптере линии квитирования не используются, там только прием, передача и земля. |
Quote:
Quote:
|
Quote:
Проблема может быть в другом. UKNCBTL работает по фреймам, 25 фреймов в секунду. Т.е. быстренько эмулируется 1/25 секунды, обновляется экран, а потом спит в ожидании завершения 1/25 секунды на реальном PC. Вот во время этой спячки и могут придти реальные данные. Но однако же в эмуляторе данные с очереди снимаются со скоростью порта внутри фрейма, поэтому между снятиями данных эмулируемая программа должна успеть прочесть приемник. Если успевает, то и переполнения не будет. Quote:
|
Quote:
|
Quote:
В настройках COM-порта можно сделать дополнительную опцию: Эмулировать OVERRUN - при включении которой чтение из буфера Windows будет работать как сейчас, а при выключении - как надо. ---------- Post added at 14:11 ---------- Previous post was at 14:08 ---------- Quote:
---------- Post added at 14:19 ---------- Previous post was at 14:11 ---------- Хочется же иметь возможность эмулировать как работу по кабелю без квитирования, так и работу по кабелю с квитированием. Вот выбор этих режимов и надо добавить в окно настроек COM-порта. |
Quote:
Quote:
|
Quote:
А если добавить в это самое место отладочную печать и всё узнать ? |
Quote:
|
Если с выключенной эмуляцией оверрана всё заработает - значит оверран эмулируется плохо. Если же и тогда ничего не заработает - значит качество эмуляции оверрана не при чём.
|
Quote:
|
Если загрузчик 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 выглядит довольно непонятно. |
1 Attachment(s)
как бы вот, после нажатия ESC
http://zx-pk.ru/attachment.php?attac...1&d=1359728766 |
Quote:
Посылку 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. |
1 Attachment(s)
Quote:
http://zx-pk.ru/attachment.php?attac...1&d=1359741657 |
Quote:
Есть уже отладочная печать в том месте, где бит переполнения устанавливается ? Из-за переполнения проблема или нет ? |
1 Attachment(s)
Quote:
Quote:
http://zx-pk.ru/attachment.php?attac...1&d=1359744341 Подскажите куда втыкать SetCommBreak, там где порт инициализируется или там где бит 00 обрабатывается. |
Quote:
Code:
void CFirstMemoryController::SetPortByte(WORD address, BYTE byte) |
Я вот думаю -- не проще ли сразу после 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:55. |
Powered by vBulletin® Version 3.8.3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.