PDA

Просмотр полной версии : Эмулятор терминала типа VT52



Страницы : [1] 2 3 4

Patron
28.09.2012, 12:35
Эмулятор терминала типа VT52 ( текущая сборка VT52_20.01.19_09-54 (http://emulator.pdp-11.org.ru/VT52/distr/VT52_20.01.19_09-54.rar) описана здесь (https://zx-pk.ru/threads/20092-emulyator-terminala-tipa-vt52.html?p=995502#post995502) ) позволяет подключаться к реальным и эмулируемым компьютерам через IP или COM порт.

Эмулятор получен путём переименования исполнимого файла "эмулятора ДВК (http://zx.pk.ru/showthread.php?t=18351)" ( pdp11.exe ) в VT52.exe и использования специальных файлов конфигурации, создающих только объект Terminal и адаптер IP- или COM-порта для потока байтов.


Описание:

При первом запуске файла VT52.exe - эмулятор загружает файл конфигурации IP.cfg пытаясь осуществить терминальное подключение на IP-адрес 127.0.0.1 ( порт 8023 ).


Эмулятор терминала.

1. Основные сведения (http://zx.pk.ru/showthread.php?p=476132#post476132).
2. Настройки клавиатуры (http://zx.pk.ru/showthread.php?p=476600#post476600).
3. Настройки цвета (http://zx.pk.ru/showthread.php?p=476753#post476753).
4. Настройки курсора (http://zx.pk.ru/showthread.php?p=476927#post476927).
5. Настройки полосы статуса внутреннего окна (http://zx.pk.ru/showthread.php?p=477262#post477262).

Использование эмулятора терминала:

Подключение через IP-порт (http://zx.pk.ru/showthread.php?p=543419#post543419).
Подключение через COM-порт (http://zx.pk.ru/showthread.php?p=543459#post543459).
Загрузка RT-11 через порт системного терминала (http://zx.pk.ru/showthread.php?p=543602#post543602).
Использование консольного дампа (http://zx.pk.ru/showthread.php?p=562746#post562746).
Подключение реальной клавиатуры МС 7004 (http://zx.pk.ru/showthread.php?p=674019#post674019).

...

Patron
28.09.2012, 14:17
При запуске эмулятора терминала в конфигурации по-умолчанию он использует файл конфигурации IP.cfg, пытающийся установить терминальное подключение на IP-адрес 127.0.0.1 ( порт 8023 ).

Если одновременно запустить "эмулятор ДВК" в конфигурации Server.cfg, то результат будет таким:

http://s3.hostingkartinok.com/uploads/images/2012/09/5ec5f99e4e858aee2fd3cc360ab36341.png

Адрес и порт для подключения задаются в разделе [IP_Adapter.ini] файла IP.cfg:



[IP_Adapter.ini]
Listen_on_IP =""
Listen_on_Port = 0
Connect_to_IP = 127.0.0.1
Connect_to_Port= 8023
Extended_Log=0


Для подключения к любому другому адресу и/или порту нужно изменить соответствующие значения.

В комплекте также есть файлы конфигурации CTAKAH.cfg и MIM.cfg для подключения к соответствующим Telnet-серверам сети HECnet.

Titus
28.09.2012, 16:38
Наверное очень все интересно, но для непосвященного человека в прикладном плане сложновато. Наверное это уже для совсем-совсем любителей.

Patron
28.09.2012, 17:06
Для подключения эмулятора терминала к реальному компьютеру через COM-порт нужно использовать файл конфигурации COM.cfg.

Раздел [ComPort.ini] файла COM.cfg содержит текущие настройки:



[ComPort.ini]
PortName="COM4"
InitialStateOf[ShowPortUse]=1
SaveChangesFor[ShowPortUse]=1


Параметр PortName задаёт системное имя используемого порта в Windows, а состояние ShowPortUse разрешает/запрещает вывод текущих значений скорости чтения и записи через этот порт в полосе статуса конфига.

Базовые параметры настройки COM-порта находятся в ini-файле класса Terminal_ComPort_Adapter.ini:



[Main]
BaudRate = CBR_9600
fDtrControl = DTR_CONTROL_DISABLE
fRtsControl = RTS_CONTROL_DISABLE
Parity = NOPARITY
StopBits = ONESTOPBIT
ByteSize = 8
fParity = FALSE
fOutxCtsFlow = FALSE
fOutxDsrFlow = FALSE
fDsrSensitivity = FALSE
fTXContinueOnXoff = FALSE
fOutX = FALSE
fInX = FALSE
fErrorChar = FALSE
fNull = FALSE
fAbortOnError = FALSE
XonLim = 512
XoffLim = 512
XonChar = 021
XoffChar = 023
ErrorChar= 0


Любой из этих параметров можно изменить в данном файле (тогда изменения коснутся всех создаваемых экземпляров типа Terminal_ComPort_Adapter ) либо переопределить в разделе конкретного объекта данного типа в интересующем файле конфигурации.

Patron
28.09.2012, 19:15
Наверное это уже для совсем-совсем любителей.Скорее для тех, кому просто нужна терминалка (т.е. терминальный клиент) для PC, понимающая КОИ-7 и управляющие коды VT-52.

До сегодняшнего дня - просьбы вроде такой: Посоветуйте терминалку для PC с кои-7 (http://zx.pk.ru/showthread.php?t=19039) - оставались без адекватного ответа и лишь со слабой надеждой на будущее.

Однако, сегодня это будущее наступило.

Error404
28.09.2012, 21:43
Скорее для тех, кому просто нужна терминалка (т.е. терминальный клиент) для PC, понимающая КОИ-7 и управляющие коды VT-52.

До сегодняшнего дня - просьбы вроде такой: Посоветуйте терминалку для PC с кои-7 (http://zx.pk.ru/showthread.php?t=19039) - оставались без адекватного ответа и лишь со слабой надеждой на будущее.

Однако, сегодня это будущее наступило.

Очень интересный проект и может оказаться полезным не только для ДВК.

Опубликуйте пожалуйста таблицу ESC-кодов, которые понимает терминал (куча несовместимых терминалов существовали, и все они считали себя VT-52 т.к. стандартизована была лишь дюжина базовых кодов).

И сразу предложение - сделать подключаемые таблицы перекодировки для любых 8-битных кодовых таблиц - как в Far-е, чтобы был не только KOI-7.

Гипертерминал дефолтный виндовозный, кстати, понимает VT52 и несколько кодовых таблиц, но список понимаемых им ESC-кодов через чур скуден.

Patron
29.09.2012, 13:03
Опубликуйте пожалуйста таблицу ESC-кодов, которые понимает терминал.Терминал понимает такие коды:



void VT_TerminalClass::SetupParser()
{
EscParser.AddSeq( "\005", SEQ_FUN( Answerback ) );
EscParser.AddSeq( "\007", SEQ_FUN( Beep ) );
EscParser.AddSeq( "\010", SEQ_FUN( BS ) );
EscParser.AddSeq( "\011", SEQ_FUN( TAB ) );
EscParser.AddSeq( "\012", SEQ_FUN( LF ) );
EscParser.AddSeq( "\013", SEQ_FUN( VT ) );
EscParser.AddSeq( "\014", SEQ_FUN( FF ) );
EscParser.AddSeq( "\015", SEQ_FUN( CR ) );
EscParser.AddSeq( "\016", SEQ_FUN( RUS ) );
EscParser.AddSeq( "\017", SEQ_FUN( LAT ) );

EscParser.AddSeq( "\033=", SEQ_FUN( Ext ) );
EscParser.AddSeq( "\033>", SEQ_FUN( Num ) );

EscParser.AddSeq( "\033[", SEQ_FUN( Hold_ON ) );
EscParser.AddSeq( "\033\\", SEQ_FUN( Hold_OFF ) );

EscParser.AddSeq( "\033A", SEQ_FUN( Up ) );
EscParser.AddSeq( "\033B", SEQ_FUN( Down ) );
EscParser.AddSeq( "\033C", SEQ_FUN( Right ) );
EscParser.AddSeq( "\033D", SEQ_FUN( Left ) );
EscParser.AddSeq( "\033F", SEQ_FUN( Graph_ON ) );
EscParser.AddSeq( "\033G", SEQ_FUN( Graph_OFF ) );
EscParser.AddSeq( "\033H", SEQ_FUN( Home ) );
EscParser.AddSeq( "\033I", SEQ_FUN( RevLF ) );
EscParser.AddSeq( "\033J", SEQ_FUN( CLS ) );
EscParser.AddSeq( "\033K", SEQ_FUN( ClrStr ) );
EscParser.AddSeq( "\033Y\1\1", SEQ_FUN( CurPosYX ) );
EscParser.AddSeq( "\033Z", SEQ_FUN( TerminalID ) );
}


И сразу предложение - сделать подключаемые таблицы перекодировки для любых 8-битных кодовых таблиц - как в Far-е, чтобы был не только KOI-7.Терминал понимает и текст в КОИ-8, перекодируя 8-битные текстовые коды по следующей таблице:


static byte KoiToWin[] = {
" "
" !\"#$%&'()*+,-./0123456789:;<=>?"
"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"
"`abcdefghijklmnopqrstuvwxyz{|}~\xA0"
" "
" !\"#¤%&'()*+,-./0123456789:;<=>?"
"юабцдефгхийклмнопярстужвьызшэщчъ"
"ЮАБЦДЕФГХИЙКЛМНОПЯРСТУЖВЬЫЗШЭЩЧ\xA0"
"§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§§"
}; // 0177 превращается в 0240 (неразрывный пробел)
При выводе на экран - код \xA0 графически превращается в засвеченное знакоместо.

Error404
29.09.2012, 14:10
Терминал понимает и текст в КОИ-8, перекодируя 8-битные текстовые коды по следующей таблице:


Я имел ввиду чтобы все таблицы кроме того чтобы были подменяемыми (например из файла), изначально были бы 8-битными, а не 7-битными. В восьмибитном поле имитировать 7-битное можно просто дважды заполнив массив перекодировки одинаковыми массивами по 128 кодов, а вот обратное (если терминал изначально 7-битный) уже не сделаешь никак.

Patron
29.09.2012, 15:52
обратное (если терминал изначально 7-битный) уже не сделаешь никак.Терминал изначально 8-битный и на входе переводит КОИ-7 в КОИ-8, устанавливая 8-й бит у текстовых символов при установленном флаге RUS/LAT (изменить вручную значение этого флага можно кликнув мышью на индикаторе RUS/LAT в строке статуса внутреннего окна терминала).

При установленном флаге RUS/LAT - символы, приходящие с очищенным 8-м битом отображаются точно так же, как и символы приходящие с установленным 8-м битом.
При сброшенном флаге RUS/LAT - символы отображаются в зависимости от исходного значения их 8-го бита.

Patron
21.10.2012, 19:00
Обновилась текущая сборка эмулятора терминала типа VT52: VT52_20.10.12_18-53

Изменения:

1. Добавлен виджет SB_StorageMediaButton, позволяющий "на лету" менять образы дисков, подключенные к мультиплексору HX. Описание использования здесь (http://zx.pk.ru/showthread.php?p=547001#post547001).

2 Уменьшена скорость передачи байтов объектом ODT_Loader для более уверенной передачи загрузчика HX на медленные машины.

3 В файлы конфигурации HX_IP.cfg и HX_COM.cfg добавлено создание объекта типа SB_StorageMediaButton, подключенного к мультиплексору HX.

...

form
13.11.2012, 21:29
Вопрос на засыпку - есть возможность послать BREAK в COM порт?
Фича весьма нужная если использовать для реальной машины.

Patron
13.11.2012, 23:49
Вопрос на засыпку - есть возможность послать BREAK в COM порт? Фича весьма нужная если использовать для реальной машины.Хорошая новость, что протокол ByteStream в модульном API поддерживает команды BreakOn и BreakOff, а объект Terminal выдаёт их в выходной поток байтов при нажатии и отпускании клавиши [Pause/Break] соответственно.

Плохая новсть, что объект Terminal_ComPort_Adapter никак на эти команды не реагирует.

В принципе, получив из потока байтов команду BreakOn - адаптер COM-порта может вызывать функцию Win32API SetCommBreak для "своего" порта, а получив BreakOff - вызывать ClearCommBreak, но это будет работать только в одну сторону - на передачу.

Чтобы два объекта Terminal_ComPort_Adapter, подключенные к разным COM-портам и соединённые потоком байтов, могли ретранслировать сигнал BREAK из одного COM-порта в другой - нужна более серьёзная доработка.

Отсюда вопрос - как мы это протестируем?

У меня нет возможности проверить работу объекта Terminal_ComPort_Adapter с реальными портами, поэтому я пока даже не знаю, работает ли он вообще.

form
14.11.2012, 00:00
но это будет работать только в одну сторону - на передачу

Так на передачу и надо - нужно уметь посылать BREAK машине, сидящей на COM порту. А принимать BREAK оттуда незачем - разьве что эмулировать полоску выключения питания как на CM7209 :)

---------- Post added at 02:52 ---------- Previous post was at 02:51 ----------

Кстати на прием BREAK должен определяться тупо как frame error :)

---------- Post added at 03:00 ---------- Previous post was at 02:52 ----------


Отсюда вопрос - как мы это протестируем

А проверить легко по назначению - подключу как TT0: к 11/83 и пошлю туда бряк :)

SecureCRT отлично умеет это делать.

Patron
14.11.2012, 16:43
Обновилась текущая сборка эмулятора терминала типа VT52: VT52_14.11.12_16-04.

Изменения:

1. Теперь при нажатии клавиши <Print Screen> в окне терминала - в буфер обмена помещается не только текстовый, но и графический скриншот.

2. Теперь объект Terminal_ComPort_Adapter передаёт команды BreakOn и BreakOff из потока байтов в "свой" COM-порт.

3. В файл Terminal.ini добавлены цветовые схемы для симуляции мониторов 15ИЭ-00-013, МС 6105 и VT220.



;
; Default Screen Colors
;

TerminalTextColor_RGB = 0,0,0
FrameBackgroundColor_RGB = 178,178,178
TerminalBackgroundColor_RGB = 170,204,221


;
; Green Screen Colors ( 15IE-00-013 )
;
; TerminalTextColor_RGB = 3,255,21
; FrameBackgroundColor_RGB = 178,178,178
; TerminalBackgroundColor_RGB = 64,81,57
;


;
; Blue Screen Colors ( MS 6105 )
;
; TerminalTextColor_RGB = 150,200,240
; FrameBackgroundColor_RGB = 172,170,160
; TerminalBackgroundColor_RGB = 50,60,55
;


;
; Gold Screen Colors ( VT220 )
;
; TerminalTextColor_RGB = 230,210,120
; FrameBackgroundColor_RGB = 145,140,135
; TerminalBackgroundColor_RGB = 48,44,58
;
Для изменения цветовой схемы - нужно закомментировать настройки текущей цветовой схемы ( добавив символы ';' в начале строк ) и раскомментировать ( убрав символы ';' в начале строк ) настройки интересующей цветовой схемы.

form
14.11.2012, 16:53
передаёт команды BreakOn и BreakOff из потока байтов в "свой" COM-порт.

Пашет.

form
14.11.2012, 17:00
Попутно мысль слегка добавить функциональности VT52 (может правда оно есть - слишком долго копаться) - реализовать VT52шный HOLD SCREEN с возможностью отключения.

Patron
14.11.2012, 17:36
реализовать VT52шный HOLD SCREENПри последовательных нажатиях на клавишу <Scroll Lock> - терминал отправляет в выходной поток символы Xon и Xoff, синхронизируясь с отправкой этих же символов с клавиатуры.

Если после включения режима Xoff на терминал поступят байты из входного потока - режим Xoff автоматически сбросится ( RT11 v5.4 отменяет режим Xoff при двойном нажатии <Ctrl><C> ).

Можно дополнительно сделать так, чтобы при нажатии <Shift><Scroll Lock> в режиме Xoff - терминал посылал Xon, ожидал одного из событий: 1) приём N строк; 2) истечение NN секунд - и снова посылал Xoff.

---------- Post added at 16:36 ---------- Previous post was at 16:32 ----------

Хотя, если за отведённое время нужное количество строк не пришло - какой смысл опять посылать Xoff - ведь это значит, что "обильный" вывод данных уже завершён.

form
14.11.2012, 17:55
При последовательных нажатиях на клавишу <Scroll Lock> - терминал отправляет в выходной поток символы Xon и Xoff, синхронизируясь с отправкой этих же символов с клавиатуры.

Если после включения режима Xoff на терминал поступят байты из входного потока - режим Xoff автоматически сбросится ( RT11 v5.4 отменяет режим Xoff при двойном нажатии <Ctrl><C> ).

Можно дополнительно сделать так, чтобы при нажатии <Shift><Scroll Lock> в режиме Xoff - терминал посылал Xon, ожидал одного из событий: 1) приём N строк; 2) истечение NN секунд - и снова посылал Xoff.

---------- Post added at 16:36 ---------- Previous post was at 16:32 ----------

Хотя, если за отведённое время нужное количество строк не пришло - какой смысл опять посылать Xoff - ведь это значит, что "бурный" вывод данных уже завершён.

Это не совсем то. Тут так или иначе подразумевается ручное вмешательство для задействования режима тогда как обычный HOLD включается програмно (например командой системы или прграммой которая режим использует), после чего пользователь по желанию может листать построчно или поэкранно.

---------- Post added at 20:48 ---------- Previous post was at 20:38 ----------

Пример работы HOLD SCREEN. Качество съемки хреновое, но суть понятна :)

http://pdp-11.org.ru/~form/files/pdp-11/hold.3gp

---------- Post added at 20:55 ---------- Previous post was at 20:48 ----------

Вобщем должно быть так: при поступлении <ESC>[ на экран включается режим HOLD. Как только курсор пытается сделать LF в последней строке экрана, посылается XOFF и экран застывает на этой строке (<LF> не отрабатывается).

При нажатии на клавишу <ROLL> (ScrollLock к примеру) печатается тот самый <LF> и одна строка, также все замирает после следующего <LF>. При нажатии на Shift+<ROLL> печатается один экран, после чего останавливается.

При выводе на экран <ESC>\ режим отключается.

Patron
14.11.2012, 18:08
Это не совсем то.Уловил.

Я сейчас адаптирую движок объекта Terminal для эмуляции некого подобия КСМ, а КСМ поддерживает Esc-коды <Esc><[> и <Esc><\>, поэтому их поддержка появится и в терминале.

После получения <Esc><[> терминал установит специальное состояние Hold и будет принимать данные до тех пор, пока не потребуется скроллинг - в этот момент терминал симулирует нажатие пользователем клавиши <Scroll Lock> и перейдёт в режим Xoff.

В режиме Hold + Xoff реакция терминала на одиночное нажатие <Scroll Lock> будет другой - режим Xon будет устанавливаться только для одной следующей строки.

Реакция на <Shift><Scroll Lock> в режиме Hold + Xoff будет отличаться отсутствием таймаута на приём страницы текста.

form
14.11.2012, 18:25
Баловство с VT52 заставило вчера подключить CM7209 к 11/83, сегодня решил поностальгировать... Все-таки никакие VT220 не заменят старого доброго... :)

Patron
15.11.2012, 16:54
Обновилась текущая сборка эмулятора терминала типа VT52: VT52_15.11.12_23-28.

Изменения:

1. Добавлен режим HOLD SCREEN, включаемый/выключаемый управляющими кодами <Esc><[> и <Esc><\>, а также кнопкой HOLD на полосе статуса внутреннего окна терминала.

2. Для объекта Terminal добавлена базовая ( т.е. задаваемая в ini-файле класса Terminal.ini ) константа HoldPageRows, определяющая число строк, выводимых на экран в режиме HOLD SCREEN после нажатия <Shift><Scroll Lock> ( или <Shift><Ctrl><Q> ). Допустимые значения 1 .. 24, значение по умолчанию 23.

3. Изменена цветовая схема имитации цветов монитора 15ИЭ-00-013:



;
; Green Screen Colors ( 15IE-00-013 )
;
TerminalTextColor_RGB = 54,250,43
FrameBackgroundColor_RGB = 178,178,178
TerminalBackgroundColor_RGB = 44,55,33
;


http://s2.hostingkartinok.com/uploads/images/2012/11/e8bd48e3c43a69c9130fcf5f508d0e26.png4. Добавлена цветовая схема имитации цветов монитора СМ 7209:



;
; Green Screen Colors ( SM 7209 )
;
TerminalTextColor_RGB = 70,240,170
FrameBackgroundColor_RGB = 178,178,178
TerminalBackgroundColor_RGB = 50,56,40
;


http://s2.hostingkartinok.com/uploads/images/2012/11/dabfc3638eb8ea776752b401d5e64a1b.png

form
15.11.2012, 17:09
VT52_15.11.12_13-25

Предложение - нумеровать в формате YY.MM.DD - так сортировка проще получается когда их много :)

---------- Post added at 20:09 ---------- Previous post was at 19:58 ----------


Добавлен режим HOLD SCREEN

У меня не получилось.
Делаю


>SET HOLD

как и положено очищается экран, загорается кнопка HOLD.
Делаю


>PAR

начинается вывод на экран, пока вывод идет - HOLD отжимается, выводится дофига строк (экрана 3 минимум) после чего снова загорается HOLD, но опять-таки никак себя не проявляет - жму <CR> - гаснет HOLD, печатается промпт на новой строке, загорается HOLD.

Patron
15.11.2012, 17:15
Мне удобнее сортировать по времени создания файла, поэтому "несортирабельная" дата в имени архива не напрягает.
Релизы выходят достаточно редко, поэтому, если хочется иметь другой формат даты в имени архива - вполне можно переименовать вручную.
Если ставить год вперёд - его лучше писать полностью: YYYY.MM.DD, иначе может возникнуть путаница.

form
15.11.2012, 17:17
иначе может возникнуть путаница.

Думаешь в 2112 году новые версии все еще будут выходить? :)

Patron
15.11.2012, 17:21
У меня не получилось.Думаю, это следствие внесённых мною "улучшений" - я сделал так, что любой ввод с клавиатуры в режиме Xon сбрасывает HOLD SCREEN.

form
15.11.2012, 17:25
Думаю, это следствие внесённых мною "улучшений" - я сделал так, что любой ввод с клавиатуры в режиме Xon сбрасывает HOLD SCREEN.

Так тогда весь смысл теряется.
HOLD SCREEN ничего общего с XON/XOFF не имеет (кроме того, что он ими пользуется). Никакая клавиша снять его не может. В момент когда экран застопорен, никакого вывода на экран быть не может пока не будет нажат <SCROLL> или <SHIFT>+<SCROLL>.

Ну и кроме того, как я сказал - и без всяких нажатий никакой HOLD не работает - печатает себе и печатает, а экраны спокойно пролетают мимо :)

Вот здесь (http://bitsavers.trailing-edge.com/pdf/dec/terminal/vt52/EK-VT5X-OP-001_Oper_Mar77.pdf) можно подробнее почитать (Section 3, HOLD SCREEN MODE).

Patron
15.11.2012, 17:40
Никакая клавиша снять его не может.В приложении - версия терминала, где HOLD SCREEN сам не сбрасывается.
...

form
15.11.2012, 17:58
В приложении - версия терминала, где HOLD SCREEN сам не сбрасывается....

Все-равно не особо пашет и по прежнему путается HOLD SCREEN с действием CTRL/S.

Тест 1: включаем режим (экран очищается системой, включается HOLD), запускаем вывод - честно останавливается в конце экрана. Нажимаем CTRL/Q - печатается очередная строка, застывает. Test FAILED. [см ниже про вывод в момент остановленного экрана]

Тест 2: Из положения выше нажимаем <SHIFT>+<ScrollLock> - пролистывает экран, застывает. Test PASSED.

Тест 3: Пара <ScrollLock>ов - пролистывает пару строк. Test PASSED.

Тест 4: <SHIFT>+<SCROLL> - долистывает вывод (меньше экрана), жмем <CR>ы пока не надоест - переводится строка, промпт итд... Test FAILED. [должен досчитать количество LFов до полного экрана и остановить вывод.

Тест 5: из положения выше даем команду с выводом. Экран останавливается на самой команде. Test PASSED.

Тест 6: из положения выше нажимаем <CTRL>+C, печатается пустая строка (которая осталась от вывода команды), экран замирает. Test FAILED. [никакого вывода на экран не должно быть в момент когда экран остановлен - весь вывод буферизуется для последующей обработки, а терминал если видит попытки дальше переводить строки повторяет посылку XOFF].

Для начала хватит :)

Patron
15.11.2012, 18:40
Тест 1: включаем режим (экран очищается системой, включается HOLD), запускаем вывод - честно останавливается в конце экрана. Нажимаем CTRL/Q - печатается очередная строка, застывает. Test FAILED. [см ниже про вывод в момент остановленного экрана]В эмуляторе так и должно быть - если на клавиатуре нет клавиши <Scroll Lock> - можно использовать <Ctrl><Q>.


Тест 4: <SHIFT>+<SCROLL> - долистывает вывод (меньше экрана), жмем <CR>ы пока не надоест - переводится строка, промпт итд... Test FAILED. [должен досчитать количество LFов до полного экрана и остановить вывод.Вывод не останавливается вообще?


Тест 6: из положения выше нажимаем <CTRL>+C, печатается пустая строка (которая осталась от вывода команды), экран замирает. Test FAILED. [никакого вывода на экран не должно быть в момент когда экран остановлен - весь вывод буферизуется для последующей обработки, а терминал если видит попытки дальше переводить строки повторяет посылку XOFF]В приложении - версия терминала, которая в режиме HOLD SCREEN не сбрасывает режим Xoff при повторном выводе символов.

...
P.S. В процессе тестов обнаружилось, что если в той версии RT11 v05.07, которая идёт в комплекте "эмулятора ДВК" - дать команду DIR, затем нажать <Ctrl><S>, а потом <Ctrl><C> <Ctrl><C> - то вывод на экран умирает и после <Ctrl><Q> уже ничего не выводится и работать дальше невозможно.

...

form
15.11.2012, 18:55
можно использвать <Ctrl><Q>.

А как его отличить от собственно CTRL/Q? :)


Вывод не останавливается вообще?

Не останавливает пока я просто жму Enter и система печатает подсказку ">" на новой строке. С точки зрения физики когда нажимается <CR> система выводит на экран <CR> (и ничего больше в качестве эха), а потом выводится подсказка CLI (в данном случае <LF>">" без кавычек).


P.S. В процессе тестов обнаружилось, что если в той версии RT11 v05.07, которая идёт в комплекте "эмулятора ДВК" - дать команду DIR, затем нажать <Ctrl><S>, а потом <Ctrl><C> <Ctrl><C> - то вывод на экран умирает и после <Ctrl><Q> уже ничего не выводится и работать дальше невозможно.

На 11/83 повторить не удалось. В документации по E11 кажется что-то было на эту тему.
Но вообще на что-то такое наступал.

---------- Post added at 21:55 ---------- Previous post was at 21:50 ----------


На 11/83 повторить не удалось.

Хотя у меня кроме всего прочего многотерминалка, а TT0 и TT1 подсоединены через USB COM двупорт который с настоящим портом общего имеет еще меньше чем всякие PCIшные.
Сейчас попробую в многотерминалке же SET TT CONSOL=2 (на CM7209) и оттуда...

Patron
15.11.2012, 19:12
Не останавливает пока я просто жму Enter и система печатает подсказку ">" на новой строке.Я сделал так:

1. Нажимал <CR>, пока промпт не "доехал" до низа экрана (чтобы HOLD сразу активировался и было удобно считать выведенные строки).
2. Нажал кнопку [HOLD] ( это полностью эквивалентно отправке на терминал <Esc><[> ).
3. Ввёл абракадабру, чтобы система ругнулась.
4. Нажал <CR> - включился Xoff ( кнопка [HOLD] стала красной ).
5. Нажал <Shift><Scroll Lock> - вывелось то, что хотела сказать система.
6. Нажимал <CR> и следил за введённой абракадаброй - она должна была "застрять" точно на верху экрана - так и произошло - после <Shift><Scroll Lock> терминал перевёл строку, принял 22 новых строки и остановил вывод.


На 11/83 повторить не удалось.Самое время загрузить RT-11 через порт терминала. Прописываем в файле HX_COM.cfg номер того COM-порта, к которому подключен системный терминал 11/83, загружаем этот конфиг в VT52.exe, переключаем ( при помощи кнопки выбора образа ) привод HX0 на образ HXsys57.DSK, нажимаем <Break> (чтобы выйти в пульт), нажимаем кнопку [Boot HX0] и понеслась..

form
15.11.2012, 19:30
Я сделал так:

Ну я в точности написал что делал - это последовательные шаги без чего-либо между ними. Из них было видно, что то работает то нет.

Про физику процесса я не случайно упомянул: в RSX и в RT-11 вывод подсказки и отработка <CR> идут по разному.

В RSX при нажатии на <CR> на вывод поступает дословно: <CR><LF>">".
В RT-11: <CR><LF><CR><LF>".".

Ну и самое главное не выполняется: в режиме в режиме HOLD SCREEN когда экран остановлен никакой вывод не может попасть на экран до тех пор пока не будет нажат <SCROLL> или <SHIFT>+<SCROLL> (включая непечатные символы). Если кто-то несмотря на XOFF продолжает что-то выводить, терминал должен записывать это в буфер, попутно постаравшись еще раз убедить с помощью XOFF что этого делать не стоит.

Кстати индикатор тоже не совсем адекватным получается так как он сделагн сейчас. Режим HOLD - это не момент когда экран остановлен или ждет ввода. Это режим который наступил при получении терминалом <ESC>[ и до тех пор пока не будет получен <ESC>\ (попутно напоминаю, что если в этот момент терминал остановлен - <ESC>\ не отработает пока не будет нажат <SCROLL>). Если делать полнофункциональный индикатор, он должен различать три состояния: выключен/включен/включен и остановлен.

---------- Post added at 22:30 ---------- Previous post was at 22:25 ----------


Самое время загрузить RT-11 через порт терминала. Прописываем в файле HX_COM.cfg номер того COM-порта, к которому подключен системный терминал 11/83, загружаем этот конфиг в VT52.exe, переключаем ( при помощи кнопки выбора образа ) привод HX0 на образ HXsys57.DSK, нажимаем <Break> (чтобы выйти в пульт), нажимаем кнопку [Boot HX0] и понеслась..

Кстати сейчас попробуем.
Только USB COM порт штука довольно муторная - он сразу пачками плюется походу. У меня в RSX особой разницы не заметно, а в RT-11 он сразу выплеввывает все рывками сразу по четверти страницы, а после выключения питания 11/83 (порт в это время должен получить BREAK) еще плюется тем, что было последним в его буфере - куском того, что выводил до этого :)

Patron
15.11.2012, 19:34
Ну я в точности написал что делалВерсия терминала с тех пор обновилась.


Если делать полнофункциональный индикатор, он должен различать три состояния: выключен/включен/включен и остановлен.Так и есть. Режимов индикации даже больше - индикатор дополнительно отслеживает и задержку вывода по <Ctrl><S> при отключенном режиме [HOLD] ( это четвёртое состояние индикации ).

form
15.11.2012, 19:54
Версия терминала с тех пор обновилась.

Не заметил.
Сейчас посмотрим.


задержку вывода по <Ctrl><S> при отключенном режиме [HOLD] ( это четвёртое состояние индикации ).

А как он определит задержку вывода по CTRL/S?
Для VT52 CTRL/S - рядовой символ, которы будучи нажат на клавиатуре тупо посылается системе, а уж система на него реагирует или не реагирует в зависимости от настроек SET TT [NO]PAGE (RT-11) и SET /[NO]TTSYNC=TI: (RSX-11).

Можно разьве что предположить на основании того, что был нажат CTRL/S и вывод прекратился, хотя и не со 100% гарантией :)

Загрузка с HX не прошла. Подвисает в районе 010030. BREAK из эмулятора при этом не работает - пришлось переключаться на SecureCRT.
поковыряю код.

---------- Post added at 22:49 ---------- Previous post was at 22:45 ----------

Предположил, что загрузка не прошла из-за неучета текущего состояния процессора (в частности настроек MMU), сделал полный сброс, еще раз попробовал - останов на 10366.

---------- Post added at 22:54 ---------- Previous post was at 22:49 ----------

Еще раз попробовал после ресета - опять висим...
Ладно, сейчас буду код ковырять.

Patron
15.11.2012, 19:58
Можно разьве что предположить на основании того, что был нажат CTRL/S и вывод прекратилсяТак и делает. После каждого нажатия Ctrl/S - загорается индикатор до момента следующего вывода на экран ( с задержкой первой проверки на 250 мс - чтобы система успела принять Ctrl/S и остановить вывод ).


Загрузка с HX не прошла. Исходники драйвера HX и двух вариантов начального загрузчика ЗДЕСЬ (http://zx.pk.ru/attachment.php?attachmentid=37603&d=1348940045). Начальный загрузчик пока довольно кривой - там даже SP не устанавливается.

Можно попробовать загнать в память копию первичного загрузчика из нулевого сектора образа.

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

form
15.11.2012, 21:40
Сейчас подумаем над улучшениями.

А вобщем лень думать - собственно это не функция загрузчика - приводить CPU в состояние, годное для загрузки. Так что достаточно установки SP. Пара слов разьве что:

MTPS есть не на всех моделях процессоров, но наверное там где нету, нету и @-подобного мониторчика
SOB есть не на всех процессорах, в том числе встречались @-мониторные без этой команды.


---------- Post added 16.11.2012 at 00:10 ---------- Previous post was 15.11.2012 at 23:23 ----------

По поводу последней версии терминала, проверка HOLD...

Немного побаловался, SET /NOHOLD, SET HOLD, комада - экран проплыл дальше примерно на 4 строки (вначале когда первый раз включал было нормально).

Поведение с подсказками RSX оказалось совершенно одинаковым с CM7209. Разгадка оказалась простой: если режим установлен командой "SET HOLD", перед выводом подсказки выводится <ESC>\, а после вывода <ESC>[. Поскольку <CR> в RSX эхается как тот же <CR>, а <LF> - часть подсказки, оно и получается, что подсказки системы не лочатся.

Другой тест: исходные условия - стоим в последней строке делаем команду "ACT". Полный вывод команды (с последующей подсказкой):


>ACT
MCR... (TT1:)
ACTT1 (TT1:)
>

- пишем ACT, жмем <CR>, в последней строке ">ACT", останов
- жмем <ROLL> -> первая строка
- жмем <ROLL> -> вторая строка
- жмем <ROLL> сколько угодно раз - подсказка не выходит, при этом на каждое нажатие индикатор меняется с желтого на розовый и обратно

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

Проверка показала, что при нажатии на <ScrollLock> система получает (чередуясь) ничего и <CtrlQ><CtrlS> . Косяк. Клавиша <ROLL> сама по себе не шлет никакого кода и если в данный момент экран не остановлен - хоть занажимайся - ничего послано не будет. Если же экран остановлен - при нажатии на клавишу посылается <CtrlQ> и все - никакого <CtrlS>. <CtrlS> посылается в тот момент когда на экран выводится очередной <LF>.

---------- Post added at 00:40 ---------- Previous post was at 00:19 ----------

Еще косяк. CTRL/S приостанавливает вывод терминалом.
Терминал не должен никаким боком реагировать на нажатие каких либо клавиш, имеющих код ASCII.

В результате: запрещаем отработку системой CTRL/S и CTRL/Q, запускаем команду с кучей вывода, жмем CTRL/S - хрясь - вывод приостановился (хотя не должен), затем пошел дальше. Если же пеоиодически продолжать нажимать на CTRL/S, в конце вывода поймаем ситуацию когда вывод приостановился насовсем. До CTRL/Q.

Patron
15.11.2012, 22:47
А вобщем лень думать - собственно это не функция загрузчика - приводить CPU в состояние, годное для загрузки. Так что достаточно установки SP.Для пробы - в приложении вариант короткого загрузчика с установкой SP = 010000 перед JSR R5.


Еще косяк. CTRL/S приостанавливает вывод терминалом.Это мой недосмотр. В приложении - исправленная версия терминала.


Проверка показала, что при нажатии на <ScrollLock> система получает (чередуясь) ничего и <CtrlQ><CtrlS> . Косяк. Клавиша <ROLL> сама по себе не шлет никакого кода и если в данный момент экран не остановлен - хоть занажимайся - ничего послано не будет. Если же экран остановлен - при нажатии на клавишу посылается <CtrlQ> и все - никакого <CtrlS>. <CtrlS> посылается в тот момент когда на экран выводится очередной <LF>.Чтобы точнее определить, в какой именно момент терминал выводит коды - можно добавить в конфигурацию дополнительную консоль, подключенную к выходам объекта Terminal и адаптера порта. Для этого в используемый файл конфигурации нужно добавить следующие строки в разделы [objects] и [links]:



[objects]
Con = Ядро:Console

[links]
ComPort > Con
VT52 > Con


У меня после каждого нажатия на <Scroll Lock> терминал выводит или <CtrlS>, или <CtrlQ> - и это видно на экране консоли.

...

form
15.11.2012, 22:54
У меня после каждого нажатия на <Scroll Lock> терминал выводит или <CtrlS>, или <CtrlQ> - и это видно на экране консоли.

Ну это наверное эффект приостановки терминалом :)

В любом случае правильная реакция: клавиша <ROLL> ни под каким соусом никаких кодов не шлет если в данный момент не действует останов скроллинга (который не имеет никакого отношения к реакции системы на CTRL/S). Если же в данный момент скроллинг остановлен, то (можно сказать так) посылается CTRL/Q. CTRL/S не посылается клавишей вообще никогда.

PS. Возможно тут с толку сбивает клавиша VT1xx/VT2xx для приостанова/продолжения печати - там клавиша как раз шлет поочередно CTRL/S и CTRL/Q и вдобавок, сам терминал прекращает/возобновляет вывод независимо от системы.

form
15.11.2012, 23:04
Для пробы - в приложении вариант короткого загрузчика с установкой SP = 010000 перед JSR R5.

Грузится.
Кстати, чем там в конфиге бряк управляется?
А то в случае повисания в этом HX варианте приходится выходить и запускать SecureCRT (из принципа не буду сейчас припаивать схему enable/halt) :)

Patron
15.11.2012, 23:33
Новый вариант терминала VT52_15.11.12_23-28, у которого мультиплексор HX транслирует (я надеюсь) команды потока байтов BreakOn и BreakOff со входа TTY на безымянный выход.

form
16.11.2012, 07:06
В приложении - вариант терминала, у которого мультиплексор HX транслирует (я надеюсь) команды потока байтов BreakOn и BreakOff со входа TTY на безымянный выход.

Посмотрим вечером.

form
16.11.2012, 12:59
Пашет.

form
16.11.2012, 14:55
Исходники драйвера HX

Заглянул в драйвер...
Несколько слов.


.Macro .ADDR x
Mov PC, R0
Add x -., R0
.EndM

Системная библиотека уже содержит макрокоманду .ADDR которая обладает весьма большим функционалом (кроме того что использован здесь). Вряд-ли есть смысл дублировать. Хотя на самом деле в данном драйвере она вообще не нужна (см ниже).


.Macro MTPS xx
Mov xx, -(SP)
Mov PC, -(SP)
Add #6, (SP)
RtI
.EndM

Макрокоманда нигде не используется ниже. В XM/ZM работать не будет (если вдруг возникнет желание сделать поддержку для). В системной библиотеке есть замечательная макрокоманда .MTPS для таких целей.


.IIF NDF RTE$M, RTE$M =: 0
.IIF NDF MMG$T, MMG$T =: 0
.IIF NDF ERL$G, ERL$G =: 0
.IIF NDF TIM$IT, TIM$IT =: 0

Повторение того, что и так делается автоматом. Определение же вручную этих настроек здесь ломает возможность использования драйвера в стандартной процедуре SYSGEN.



.DrPtr
.DrSpF <373>

Ничего полезного кроме несовместимости с RT-11 V5.0 на уровне исходников не дает: UMRы нам не нужны, error logging не поддерживается, а больше нигде от этих команд пользы нет. Ну разьве что сторонние утилиты могут посмотреть в эти таблицы (система их никак не использует). Зачем нужен .DRPTR без параметров даже придумать не могу.


. = 116

HXMES:
.ASCIZ <CR><LF>"HX DSK/TTY multiplexer v1.0 2012"<CR><LF>

Не очень хорошая идея вписываться в докементированные (со времен как минимум 4.0) области заголовка драйвера.


. = 200 ; DATA DEVICE Installation check
Return
. = 202 ; SYSTEM DEVICE Installation check

Если совместимость с самыми древними мониторами не нужна (а в том виде как есть ее и так нет), то можно
воспользоваться макросом .DRINS который предназначен для определения точки инсталяции.


.ADDR #HXMES

Думаю проще JSR R0 и строка текста после :)
Кстати, тут как я понимаю готовился .PRINT изначально, мешался драйверу?


.DrSet MMGT, 2, O.GEN, NUM

Бессмысленный функционал. Драйвер работает с буфером программы и следовательно требует специальной работы с ним для XM. Непонятно зачем испольхуется значение - можно же было сделать [NO]KEY.


O.GEN:
Tst R0 ; Arg = 0 ?
BEq 30$
BiS R3, HX.GEN ; Set SYSGEN bit.
Br 31$
30$:
BiC R3, HX.GEN ; Clear SYSGEN bit.
31$:
ClC
Return

CLC лишний - никто бит C не взводил, да и первая же команда его чистит в явном виде.


.IIF GT .-1000 .ERROR

В системной библиотеке есть замечательная макрокоманда для этого

.ASSUME . LE 1000,MESSAGE=<;SET area overflow>


Mov @#TPS, TPSRes

В начале драйвера есть намек на разные CSRы. Тогда проще сделать поддержку SET HX CSR=xxxxxx.


BiC #100, @#TPS

CLR будет короче :)
Попутно стоит отметить, что подобное не сработает в многотерминальных системах. Можно добавить проверку и .ERROR (на случай сборки родным SYSGEN) или проверку в подпрограмме инсталяции.

Дальше углубляться не стал. Добавлю еще, что для сборки драйвера неплохо бы LINK/NOBITMAP использовать (что согласно документации в принципе требуется).

form
16.11.2012, 18:44
Вопрос на засыпку - как проще всего удостовериться, что терминал подключен через HX?

Patron
16.11.2012, 19:04
Драйвер работает с буфером программы и следовательно требует специальной работы с ним для XM.Т.е. драйвер должен ругать тех, кто пытается собрать его текущую версию с MMG$T = 1 или выполнить SET HX MMGT=1.


Вопрос на засыпку - как проще всего удостовериться, что терминал подключен через HX?Набрать DIR HX:.
Если мультиплексора нет - на терминал вылезет запрос протокола HX, стандартной отменой которого является <Ctrl/C>.

form
16.11.2012, 19:10
Т.е. драйвер должен ругать тех, кто пытается собрать его текущую версию под XM или выполнить SET HX MMGT=1.

То есть SET команды переделки mapped драйвера в unmapped и наоборот не должно быть в принципе (для I/O устройства это слишком сложно - проще как и положено иметь два драйвера), а для XM надо пользоваться подпрограммами маппинга буфера.

Ругаться же смысла нет поскольку XMу вообще нет никакого дела до файлов xx.SYS, а если усер переименовал его в xxX.SYS, то это его проблемы :)



Набрать DIR HX:.
Если мультиплексора нет - на терминал вылезет запрос протокола HX, стандартной отменой которого является <Ctrl/C>.

Я о программном способе - к примеру из загрузчика. Хотя думаю самое простое - просто счетчик попыток ожидания готовности на прием :)

Patron
16.11.2012, 19:35
Я о программном способеЕсли мультиплексор получает запрос "\01\376\0\0" - он отвечает: "\375\0".

form
17.11.2012, 02:27
Запустил XM с HX...
DIR, загруженный в верхнюю память, показывает каталог.

Драйвер не оптимизировал, так, попинал слегка от нефиг делать :)


.IIF EQ MMG$T .BlkW 5
.IIF EQ ERL$G .BlkW 1
.IIF EQ TIM$IT .BlkW 1

Перечисленное выше не имеет никакого смысла и в нормальном драйвере ничем не поможет. Причина проста: эти директивы всего лишь добавляют лишний код в драйвер, тем самым просто отодвигая дальше вектор системных подпрограмм. Это спасет драйвер от перезаписи его кода значениями этого самого вектора, но никак не поможет драйверу попасть в правильные точки вызова (к примеру в системе с поддержкой device timeout, $INPTR, вызываемый .DRASTом находится на одно слово дальше, а драйвер, скомпиленный без поддержки по прежнему будет вызывать подпрограмму по привычному смещению и тем самым вызовет @$TIMIT вместо @$INPTR).

Данный конкретный драйвер для unmapped системы будет работать и с таким довеском - он просто ничего не вызывает из этого вектора. С mapped драйвером сложнее - там нам нужны вызовы из системного вектора, а если драйвер собран без поддержки таймаута, значение, предназначенное для $TIMIT как раз впишется в точки вызова XMных подпрограмм. Можно правда плюнуть на это так как XM без поддержки device timeout вроде не бывает в принципе.

Правильный метод - использовать .DREND или .DRBOT с FORCE (это правда не решит проблеммы с точками вызовов которые лежат после $TIMIT и $ERLG, но пофиксит в нашем случае XMный драйвер), но к сожалению .DRBOT только в V5.6 научился это делать. Что впрочем не мешает нам собрать драйвер в 5.7 и использовать его потом где угодно :)

Из серии "дурацкая идея": можно засунуть стартовый код в котором будет обычная программа синхронизации с монитором - она спросит файл монитора, прочитает оттуда sysgen слово, пропишет в драйвер и подправит вызовы подпрограмм из вектора, и никаких сетов ;)

Другая дурацкая идея - вызывать все вручную. Какой-то драйвер вроде делал так.

Кстати, SETы переделал на [NO] варианты. Проверять лень было :)

PS. SPFUN я там не переделывал для XM. Принцип тот же, только $PTWRD...

Patron
17.11.2012, 15:21
Запустил XM с HX...А зачем при входе в HX.Write и HX.Read устанавливать R4:



HX.Write:
.IF NE MMG$T
Mov HXCQE, R4
.ENDC
-----------------------------
-----------------------------
HX.Read:

.IF NE MMG$T
MOV HXCQE,R4
.ENDC


Ведь в дальнейшем коде R4 не используется..

form
17.11.2012, 15:27
Ведь в дальнейшем коде R4 не используется.

$GTxxx/$PTxxx подпрограммы требуют чтобы R4 смотрел на Q.BLKN.
Подпрограммы упдатят Q.BUFF.

---------- Post added at 18:23 ---------- Previous post was at 18:23 ----------

Сейчас выложу дорайвер в котором SPFUN в XM тоже работает.

---------- Post added at 18:27 ---------- Previous post was at 18:23 ----------

Загрузка получается одна из 10-30 попыток. Если загрузилось - дальше работает. Где-то видимо вылезает разница между полноценным и USBшным COM портом.

Patron
17.11.2012, 15:50
Если загрузилось - дальше работает.Видимо, проблема в том, что ODT_Loader не ждёт завершения ответа эмулятора пульта PDP после передачи строки, а сразу передаёт следующую.

Можно провести эксперимент - взять текст из файла HX Boot.odt, удалить символы имитации <LF> ( '¬' ) и копи-пастить построчно в терминал, посылая <LF> вручную ( клавишей '+' на доп.клавиатуре ). После копирования в терминал предпоследней строки файла HX Boot.odt нужно нажать <CR>.
Всё должно сразу и без проблем загрузиться.

form
17.11.2012, 15:56
Видимо, проблема в том, что ODT_Loader не ждёт завершения ответа эмулятора пульта PDP после передачи строки, а сразу передаёт следующую.

Да вроде все успевает - ни разу не было признаков потерь.
Скорости то дохера :)

---------- Post added at 18:56 ---------- Previous post was at 18:51 ----------

Нет, все-таки есть пропуски.
Думаю ждать ответа не нужно - просто увеличить задержку - иначе какой-нибудь ДВК вообще колом встанет :)

Patron
17.11.2012, 15:58
Да вроде все успеваетКогда выходит сообщение "HX Boot-I-Cold boot.." - это уже работает первичный загрузчик.

form
17.11.2012, 16:06
Когда выходит сообщение "HX Boot-I-Cold boot.." - это уже работает первичный загрузчик.

До него как раз и не доходит.
Похоже этот USBшный порт просто тупо накапливает в себе дохера символов и потом большой пачкой херачит их. Во всяком случае в сторону PC это очень сильно заметно в RT-11: делаешь DIR, долгая пауза, херакс - пол экрана мгновенно, пауза, еще пол экрана итд.

---------- Post added at 19:01 ---------- Previous post was at 18:59 ----------

Потом если не лень будет - просто вставлю в 11/83 список загрузчик и буду обычной командой B грузить :)

---------- Post added at 19:06 ---------- Previous post was at 19:01 ----------

Вобщем лень сейчас ковырять. SPFUN так делается:


.IF EQ MMG$T
Mov R1, @(R4)+ ; Report unit size
.IFF
MOV HXCQE,R4
MOV R1,-(SP)
CALL @$PTWRD
.ENDC
Br DONE

Patron
17.11.2012, 22:24
Если мы хотим сохранить совместимость по исходным текстам с предыдущими версиями RT-11, то не годится строчка:



.DrBot HX, START, READ, FORCE=7


Т.к. даже при компиляции в RT-11 V05.04 результат такой:



RT-11SJ V05.04

.MAC/NOOBJ HX
P 611 000004 .IIF EQ ...V3 .ERROR;?SYSMAC-E
-Invalid c o n t r o l value - FORCE=7;
?MACRO-E-Errors detected: 1
=HD3:HX

.

Совместимый вариант выглядит так:



.IIF EQ MMG$T .BlkW 5
.IIF EQ ERL$G .BlkW 1
.IIF EQ TIM$IT .BlkW 1

.DrBot HX, START, READ




RT-11SJ V05.04

.MAC/NOOBJ HX

.

form
17.11.2012, 22:26
Совместимый вариант выглядит так

Совместимости не получится. Как я уже писал выше, это не поможет драйверу правильно вызывать системные подпрограммы из вектора, а значит оно и не стоит того как минимум для всех mapped драйверов и всех которые используют прерывания.

form
19.11.2012, 12:34
Собственно, возвращаясь к теме терминала... Как бы это от него получить Alt Keypad в VT52? Верхний ряд (который в любом режиме <ESC>P-<ESC>R работает, а остальное шлет коды стрелок и еще чего-то).
Еще при запуске отправляется код CTRL/Q, что не есть хорошо.
А если еще отучить прогу (хотя ьы опционально) трогать лампочку NumLock (и периодически оставлять ее в таком состоянии за пределами программы) - было бы вообще отлично.
При включении/выключении опционально break - стандартное поведение VT52/CM7209.
Ну и пора уже подумать о <ESC>F :)
Во губу раскатал :)

Patron
19.11.2012, 15:22
Собственно, возвращаясь к теме терминала... Как бы это от него получить Alt Keypad в VT52?Т.е. как-то иначе, нежели отправкой "\033=" и "\033>" ?


При включении/выключении опционально break - стандартное поведение VT52/CM7209.Т.е. при включении посылать BreakOff, а при выключении BreakOn или в обоих случаях посылать BreakOn-пауза-BreakOff ?



Еще при запуске отправляется код CTRL/Q, что не есть хорошо.Это я тоже заметил.



Ну и пора уже подумать о <ESC>FОсутствие правильных символов псевдографики в системных шрифтах Windows делает это невозможным для универсального текстового терминала.

Через некоторое время в модульном API появится поддержка знакогенераторов с пользовательскими матрицами, но у меня есть только матрица для КСМ, а там псевдографика не такая как у VT52.

С прицелом на будущее нужно заиметь матрицы всех 256 ячеек знакогенератора тех мониторов, поддержку отображения символов которых хотелось бы иметь в дальнейшем.




А если еще отучить прогу (хотя ьы опционально) трогать лампочку NumLock (и периодически оставлять ее в таком состоянии за пределами программы) - было бы вообще отлично.Относительно NumLock возможны следующие режимы работы терминала, задаваемые константами в файле Terminal.ini:

1. Режим по умолчанию ( имитация клавиатуры 15ИЭ-00-013 )


KeyboardControlling = 1
NumLockControlling = 1
NumpadSwapping = 1
Use_NumLock_as_PF1 = 0


KeyboardControlling = 1 - терминалу разрешено имитировать нажатия клавиш пользователем.
NumLockControlling = 1 - терминалу разрешено имитировать нажатие пользователем клавиши NumLock
( при KeyboardControlling = 0 и/или Use_NumLock_as_PF1 = 1 - игнорируется ).
NumpadSwapping = 1 - разрешено переключение отбражения клавиш в зависимости от состояния лампочки NumLock

.......... [NumLock горит] .................................. [NumLock не горит]:

http://s3.hostingkartinok.com/uploads/images/2012/08/51544f07cd76abd854892275703d2c06.jpg / http://s2.hostingkartinok.com/uploads/images/2012/08/f7f1e795d64c457f982f5cf7ba45237d.jpg

Use_NumLock_as_PF1 = 0 - Не использовать клавишу <NumLock> для имитации клавиши <PF1>.


2. Имитация клавиатуры VT52


KeyboardControlling = 1
NumLockControlling = 1 ( значение игнорируется )
NumpadSwapping = 0
Use_NumLock_as_PF1 = 1

В таком режиме клавиша <NumLock> в окне терминала используется для имитации клавиши <PF1>, а за пределами окна терминала - для переключения режимов NumLock, которые ни на что в терминале при этом влиять не будут.



3. Плохой вариант


KeyboardControlling = 1
NumLockControlling = 1 ( значение игнорируется )
NumpadSwapping = 1
Use_NumLock_as_PF1 = 1

Если в предыдущем режиме установить NumpadSwapping = 1, то при возврате в окно термнала будет происходить переключение отображения блоков клавиш 15ИЭ-00-013 в зависимости то того, горит или нет лампочка NumLock ( при том, что изменить её состояние можно только перейдя из окна терминала в любое другое ).

Идиотский вариант?

Возможно, есть смысл принудительно отключать NumpadSwapping при установке Use_NumLock_as_PF1 = 1..

form
19.11.2012, 16:25
Т.е. как-то иначе, нежели отправкой "\033=" и "\033>" ?

Нет, именно это у меня не работает.
Доп инфа - NumLock заставляю работать как Gold - без этого и keypad не нужен :)


Т.е. при включении посылать BreakOff, а при выключении BreakOn или в обоих случаях посылать BreakOn-пауза-BreakOff ?

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

Да, еще пожелание, чтобы запоминал после выходи жирность шрифта, индикатор Alt/Num (по русски не знаю как обозвать второе, первое на УКНЦ ДКЛ обзывается). И курсор высотой в строчную букву (как на родных VT) - это может и есть - просто не знаю :)



Осутствие правильных символов псевдографики в системных шрифтах Windows делает это невозможным для универсального текстового терминала.

SecureCRT выбирает из системных (например Lucida console, Courier New) для основных символов, используемых в псевдографике - как минимум умеет рисовать рамочки и значок переполнения строки для EDT/KED. Правда это для VT1xx/VT2xx, но сути не меняет. А шрифт - это уже для полного счастья если свой делать с вариантами.



Через некоторое время в модульном API появится поддержка знакогенераторов с пользовательскими матрицами, но у меня есть только матрица для КСМ, а там псевдографика не такая как у VT52.

VT52 и CM7209 найдем, 15ИЭ кто-нибудь подбросит поди - там вроде греческие буквы были.


С прицелом на будущее нужно заиметь матрицы всех 256 ячеек

На VT52 никаких 256 нету :)
Это всякие УКНЦы да КСМы наверное только умеют.



Относительно NumLock возможны следующие режимы работы терминала, задаваемые константами в файле Terminal.ini:

У меня работает вот это: Use_NumLock_as_PF1 = 1 - то, что собственно требуется. Но циферки независимо от <ESC>= генерят что угодно кроме положенных име <ESC>?x кодов :)



2. Имитация клавиатуры VT52


KeyboardControlling = 1
NumLockControlling = 1 ( значение игнорируется )
NumpadSwapping = 0
Use_NumLock_as_PF1 = 1


Да, в точности так настроено.
Выдвет циферки в данный момент. Вчера удавалось заставить выдавать <ESC> коды в виде <ESC>x из которых стрелочные соответствовали 4, 8, 2, 6, но это опять не то.

А вроде когда-то еще в эмуляторе ДВК работало у меня все (хотя сейчас уже не вспомню насколько проверял).



Возможно, есть смысл принудительно отключать NumpadSwapping при установке Use_NumLock_as_PF1 = 1..

По идее если NumLock используется как <GOLD> то переключать должен только код <ESC>= и <ESC>>. В любом случае, сейчас отцепил NumLock от голда, но NumLock переключает совсем не то:

0 - (что так что эдак) 0, должно быть <ESC>?p
1 - <ESC>e, должно быть <ESC>?q
2 - <ESC>B, должно быть <ESC>?r
3 - должно быть <ESC>?s
4 - должно быть <ESC>?t
5 - должно быть <ESC>?u
6 - должно быть <ESC>?v
7 - должно быть <ESC>?w
8 - должно быть <ESC>?x
9 - должно быть <ESC>?y
. - должно быть <ESC>?n
<Enter> - <ESC>?M

---------- Post added at 19:25 ---------- Previous post was at 19:19 ----------

Сейчас попью чаю и сформулирую как мне видится набор возможностей VT52 на все случаи жизни :)

form
19.11.2012, 17:52
Первая порция.
Варианты/идеи будут в следующем посте.


Итак, пойдем по порядку.

Для начала за основу берем CM7209 - он у меня сейчас подключен к 11/83 и в случае чего
легко проверить. Кроме того из тех, что мне попадались, он самый близкий по поведению
к родному VT52.

1. Терминал должен иметь следующие индикаторы (можно менять в зависимости от профиля
или как минимум):
POWER ON - ;)
LINE - Терминал подключен (шлет в порт, принимает из порта). Возможность
переключения в offline - терминал шлет сам себе.
HOLD SCREEN - Терминал в режиме HOLD SCREEN. Никакой связи с простановкой вывода.
AUTO COPY - Включен режим автокопирования на принтер
AALT KEY - Включен режим ALT Keypad

2. Терминал должен уметь посылать BREAK в линию. Варианты: кортокий, до отключения.
На родном VT52 не помню как, на CM7209 к примеру <BREAK> включает отправку,
<SHIFT>+<BREAK> выключает. VT220 у меня просто шлет разовый.

3. Звук на символ <BEL> длинный (запишу звук), регулируется громкость. Кроме того
при печати любого символа в 72 колонке также раздается звук.

4. Нажатие клавиш вызывает клик, писк короткий, громкость регулируется вместе с громкостью
<BEL>.

5. При достижении курсором правой границы экрана перевода строки не происходит. Новый печатный символ печатается поверх старого.

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

7. При получении BREAK терминал печатает символ закраски знакоместа (точки в шахматном порядке, два соседних символа сливаются). То есть пока принимаются символы с ошибкой FRAME ERROR, терминал рисует эти символы. На практике это выглядит как печать строки (целой или частичной) из этих символов при отключении машины к кторой он подцеплен (в том числе если прицепить к PC).

Управление экраном:

<BEL> - собственно он
<BS> - Курсор влево. Если в начале строки - ничего не делать.
<HT> - Установка курсора в ближайшую позицию вперед:
8, 16, 24, ..., 72, 73, 74. 75, 76, 77, 78, 79 (символы по дороге не затираются)
<CR> - Курсов в начало строки.
<LF> - Курсор на строку вниз со скроллингом если в последней строке.

Остальные CTRL-коды никак не отображаются на экране и не выполняют никаких действий.
8 бит отрезается, символ <DEL> ничего не выводит (пока говорим только о профиле CM7209).
Отдельного упоминания стоит <FF> - аналогично - ничего не выводит - это его стандартное поведение на терминале.

<ESC> = - Переключиться в ALT Keypad
<ECS> > - Переключиться в NUM Keypad
<ESC> A - Курсор вверх на строку. Если уже в верхней - ничего не делать.
<ESC> B - Курсор вниз на строку. Если уже в нижней - ничего не делать.
<ESC> C - Курсор вправо. Если в последней колонке - ничего не делать.
<ESC> D - Курсор влево. Если в первой колонке - ничего не делать.
<ESC> F - Включить графику
<ESC> G - Отключить графику
<ESC> H - Курсов в начало экрана
<ESC> I - Курсор на строку вверх. Если в первой - сдвинуть экран вниз.
<ESC> J - Очистить экран от курсора до конца
<ESC> K - Очистка от курсора до конца строки
<ESC> Z - Запрос идентификации терминала

<ESX> Y - Позиционирование курсора. Варианты настроек (не уверен что нужны):
- запредельные координаты игнорить / позиционировать в конец
- позиционировать на первую координату сразу по получении
символа / после получения всей последовательности
- непечатные (CTRL, DEL) символы игнорировать полностью всегда
(в последовательности их не учитывать)

<ESC> [ - Включение режима HOLD SCREEN
<ESC> \ - Отключение.

<ESC> ] - Включение COPY SCREEN - экран отправляется на принтер/лог, в линию шлется <DC3>,
из линии буферизуется и на экран не попадает до окончания, по окончании шлется <DC1>
и включается вывод.

<ESC> ^ - Включить автокопирование на принтер (в лог)
<ESC> - - Отключить (позже почитаю как точно эта фича работает)

Ответ терминала на INQUIRE:

<ESC>/K - VT52 без принтера
<ESC>/L - VT52 с принтером


---------- Post added at 20:52 ---------- Previous post was at 20:38 ----------

Теперь собственно идеи.
Первое что напрашивается - профили настроек (чтобы одним движением руки выбрать нужный терминал)

Переключаемые опции:


ответ на INQUIRE стандартные VT52 или <ESC>/Z (VT100 в режиме VT52) - 15ИЭ вроде именно так отвечает
писк в 72 колонке (15ИЭ)
автоперевод в конце строки (15ИЭ)
режим BLINK CTRL (15ИЭ) - CTRL символы не работают, а печатают мигающий символ который собственно CTRL+
FF стирает экран (УКНЦ)
программирование F-клавиш (УКНЦ)
цвет
тип курсора (в том числе моргающий, горящий, с инверсным символом)
DEL - печатный символ (прямоугольник, не сливается)
разные наборы граф режима или отсутствие такового
поддержка HOLD SCREEN
charset ENG, ENG+RUS, 8bit, <SI>/<SO>
разные наборы шрифтов
отработка <ESC>[?2l как NOP и снятие HOLD SCREEN (который включится по <ESC>[) если был выключен до этого
Keypad Enter - <ESC>H в NUM режиме
регулировка яркости как на терминале ;)
поддержка передачи файлов (KERMIT, TRANSF)


Возможность всяких фич - например строка статуса как в 15ИЭ с возможностью выставления опций в ней как в родном, с отключаемыми часами в ней итд.

Экранные клавиатуры в стилях разных терминалов, оформление в стиле терминала ;)

Будут еще идеи - сюда же допишу, пока отвлекли...

Patron
19.11.2012, 18:00
Нет, именно это у меня не работает.У меня это работает так:


http://s1.hostingkartinok.com/uploads/images/2012/11/3bdce5328c86d7e1a421b2f2bdd7842f.png



Да, еще пожелание, чтобы запоминал после выхода жирность шрифтаНужно открыть используемый файл конфигурации и в разделе [VT52.ini] найти следующие строки:



InitialStateOf[Bold] = 0
SaveChangesFor[Bold] = 0
И установить интересующий режим.



индикатор Alt/NumСейчас добавлю.


курсор высотой в строчную буквуТакой курсор будет, если его настройки вообще не задавать в cfg файлах ( но в комплекте поставки они задаются во всех файлах *.cfg ). Для отмены - найти и удалить в используемом файле конфигурации следующую строку ( в разделе [VT52.ini] ):



CURSOR_Y_START_% = 85




SecureCRT выбирает из системных (например Lucida console, Courier New) для основных символов, используемых в псевдографике - как минимум умеет рисовать рамочки и значок переполнения строки для EDT/KED.Можно разрешить псевдографику для отдельных имён шрифтов и использовать специальную матрицу перестановок для каждого такого имени.


VT52 и CM7209 найдем, 15ИЭ кто-нибудь подбросит поди - там вроде греческие буквы были.Матрица 15ИЭ идентична матрице КСМ ( точнее наоборот - разработчики КСМ использовали коды ПЗУ знакогенератора 15ИЭ ). Однако, 15ИЭ не поддерживает псевдографику, поэтому соответствующие ячейки ПЗУ используются только в КСМ.


По идее если NumLock используется как <GOLD> то переключать должен только код <ESC>= и <ESC>>NumpadSwapping имеет смысл только при имитации клавиатуры 15ИЭ, поэтому установка Use_NumLock_as_PF1 = 1 в последующих версиях терминала будет этот параметр блокировать.

form
19.11.2012, 18:21
У меня это работает так

Похоже на правду, только регистр неправильный (или приводится к UC).

form
19.11.2012, 18:42
Наборы символов для псевдографики.
Наиболее интересен символ, соответствующий 'a' - закрашенный квадратик. Он используется в EDT, K52 и RTMON.

Patron
19.11.2012, 19:40
Обновилась текущая сборка эмулятора терминала типа VT52: VT52_19.11.12_22-06.

Изменения:

1. В комплект поставки добавлен каталог HX Sources с исходниками драйвера HX.SYS и начального загрузчика HX.

2. В мультиплексор HX добавлена поддержка передачи сжатых потоков. Приём сжатых потоков добавлен в основной и первичный драйверы HX.

3. В файлы конфигурации HX_IP.cfg и HX_COM.cfg добавлена кнопка [Use HX Compression], позволяющая управлять использованием сжатия при работе мультиплексора HX.

Время загрузки RT-11 на скорости 9600 BPS в зависимости от использвания сжатия:



Сжатие HX Нет Есть
Система

RT-11 V05.04 70 сек. 60 сек.

RT-11 V05.07 88 сек. 70 сек.

4. Теперь объект ODT_Loader после отправки символов <LF> или '/' переходит в состояние ожидания до приёма пробела или промпта.

5. На полосу статуса внутреннего окна терминала добавлен индикатор [NUM/ALT] ( [ /ДКЛ] ), отображающий состояние дополнительной клавиатуры и позволяющий изменять его при помощи клика мыши.

form
19.11.2012, 20:01
Обновилась текущая сборка эмулятора терминала типа VT52

Сейчас мы его...
Я понял что нужно сделать - нужно снести все и с нуля настроит :)

---------- Post added at 23:01 ---------- Previous post was at 22:42 ----------


VT52_19.11.12_19-08

Keypad работает. Видимо или в конфиге чего-то накрутил или (только что подумал) - может по привычке '=' пытался с shiftом нажать :)
Хотя нет - обнаружил-то сначала что из K52 выйти не могу. В отличие от EDT там нет командного режима в который можно выйти по CTRL/Z.

За что индикатор EXTом обозван? Есть же стандартное название (которое вошло также в стандарт ANSI) - Alternate keypad, Numeric keypad. :)

Кстати, как бы ему шрифтик побольше сделать - пытался найти, но больше чем он предлагает по умолчанию не получилось. На больших экранах как-то неуютно :)

С HX грузится устойчиво.

form
19.11.2012, 20:14
Кстати, как бы ему шрифтик побольше сделать

О, нашел - само меняется если аккуратно растянуть...

form
19.11.2012, 20:30
Вот кстати пример где этот символ `a' используется.
Навскидку перебрал несколько программ DECовских - везде только он и используется для VT52.

Patron
19.11.2012, 20:47
За что индикатор EXTом обозван?Т.е. надо не EXT, а ALT ..

Для разнообразия - исправим эту проблему при помощи API локализации.

Нужно открыть текстовый файл Terminal_module.lng, найти там следующие строки:



DEF:"EXT"
RUS:"ДКЛ"


и добавить вариант перевода для английского языка:



DEF:"EXT"
ENG:"ALT"
RUS:"ДКЛ"


---------- Post added at 19:45 ---------- Previous post was at 19:35 ----------


из K52 выйти не могу.Нажимая <Gold>, <Буквенная клавиша> ?

---------- Post added at 19:47 ---------- Previous post was at 19:45 ----------


С HX грузится устойчиво.На скрине - в VT52.exe загружен файл конфигурации COM.cfg ( для загрузки с HX нужен HX_COM.cfg ).

form
19.11.2012, 20:52
Нажимая <Gold>, <Буквенная клавиша> ?

<GOLD>7

Сейчас проблемы нет - видимо где-то чего-то в конфиги испортил :)

---------- Post added at 23:52 ---------- Previous post was at 23:49 ----------


На скрине - в VT52.exe загружен файл конфигурации COM.cfg ( для загрузки с HX нужен HX_COM.cfg ).

С HX уже наигрался - это обычный VT52.
Я уже и RTEM запустил с него - правда у меня там SET SL ON стоит в автомате - пришлось со второго терминала спасать :)

Patron
19.11.2012, 20:56
<GOLD>7Хитрость в том, что если редактируется русский текст, то ввести команду <Gold>, <Буквенная клавиша> можно только переключившись на латинский регистр.

В терминале есть специльный режим Gold Mode, который после нажатия <GOLD> отключает русскую раскладку для следующей клавиши. Но этот режим пока работает только для клавиши <GOLD>, выдающей " \033f ".

form
19.11.2012, 21:04
Хитрость в том, что если редактируется русский текст

С учетом того, что я использую родные непеределанные системы, даже при всем желании русский текст редактировать не получится :)
Точнее сама система как многотерминальная позволяет вводить-выводить 8bit, но это нужно флаги терминала выставлять. А KED/K52 все-равно с 8bit не работает. Там я смотрел в сорцах - есть зарубки в коментариях, но времени не было поковырять.

---------- Post added 20.11.2012 at 00:04 ---------- Previous post was 19.11.2012 at 23:58 ----------

Вобщем сейчас все отлично. HOLD вот только напрягает путанницей ибо все свалено в кучу до приведения собственно HOLD в неработоспособность :)

Patron
19.11.2012, 21:05
я использую родные непеределанные системыТогда проблем быть не должно.

Для контроля обмена управляющими кодами можно добавить в используемый файл конфигурации консоль, на которую будут копироваться байты, передаваемые из порта в терминал и из терминала в порт:



[objects]
Con = Ядро:Console


[links]
ComPort > Con
VT52 > Con

form
19.11.2012, 21:06
Тогда проблем быть не должно.

Так уж сто раз написал, что нет больше проблем.
А откуда они выросли теперь трудно найти - я просто снес каталог и развернул новый дистриб :)

Patron
19.11.2012, 21:11
все свалено в кучу до приведения собственно HOLD в неработоспособностьНа мой взгляд - там всё достаточно логично.

Сейчас после активации HOLD ( например, нажатием его кнопки ) скроллинг никогда не происходит до нажатия <Scroll Lock> ( или <Ctrl/Q> ).

form
19.11.2012, 21:31
На мой взгляд - там всё достаточно логично.

Сейчас после активации HOLD ( например, нажатием его кнопки ) скроллинг никогда не происходит до нажатия <Scroll Lock> ( или <Ctrl/Q> ).

Режим HOLD не предназначен для активации кнопкой. Он активируется програмно. С самим HOLD как таковым собственно проблем нет (по крайней мере на первый взгляд).

Зато кнопка, эмулирующая <SCROLL> херачит в линию то <DC3> то <DC1> тогда как эта клавиша на терминале ASCII кода не имеет ни постоянного ни сменного и ничего в порт не шлет сама по себе. Лишь должна проинструктировать терминал послать <DC1> если это требуется (вывод остановлен), а <DC3> ни сама клавиша не посылает, ни терминал к тому этой клавишей никогда не побуждается (у нас все-таки VT52, а не VT220).

Еще прикол. Запускаю прогу которая показывает коды нажатых клавиш, жму CTRL/S, прога честно рисует <023> (ну терминал конечно радостно мне меняет цвет HOLDу, к этому уже кажется привыкли), далее совсем смешно: нажимаю любую клавишу - скажем <CR>, он мне показывает, что нажаты <CR><DC1> тогда как никакого CTRL/Q я не нажимал. На лицо косяк который может заставить программы криво работать.

Все-таки по-моему не очень хорошая идея предполагать как ведет себя софт на основании своих правил :)

---------- Post added at 00:31 ---------- Previous post was at 00:22 ----------

Дописал еще идейку в список (http://zx-pk.ru/showpost.php?p=553484&postcount=60) :)

Patron
19.11.2012, 22:13
Режим HOLD не предназначен для активации кнопкой. Он активируется програмно.А у нас ещё и кнопкой!

Если эту кнопку не трогать - никто не пострадает, а если трогать - можно останавливать и продолжать вывод любого листинга при помощи кликов мыши, что бывает весьма удобно.


кнопка, эмулирующая <SCROLL> херачит в линию то <DC3> то <DC1>Эта кнопка эмулирует <SCROLL> только когда вывод на экран остановлен в режиме HOLD. Всё остальное время эта кнопка переключает режимы Xoff/Xon ( что эквивалентно последовательным нажатиям <Cltrl/S><Ctrl/Q> ).


нажимаю любую клавишу - скажем <CR>, он мне показывает, что нажаты <CR><DC1> тогда как никакого CTRL/Q я не нажимал. На лицо косяк который может заставить программы криво работать.Это косяк, исправленный вариант терминала VT52_19.11.12_22-06.

form
19.11.2012, 22:38
Если эту кнопку не трогать

Так тогда зачем мне этот режим? - один раз упереться в конец экрана и все на этом? :)



можно останавливать и продолжать вывод любого листинга при помощи кликов мыши, что бывает весьма удобно.

Э-э, я не про кнопку которая на экране - я про кнопку, эмулирующую <SCROLL>/<ROLL>.


переключает режимы Xoff/Xon ( что эквивалентно последовательным нажатиям <Cltrl/S><Ctrl/Q>

Что не эквивалентно останову/продолжению так как с точки зрения софта эти символы могут быть обыкновенными рядовыми ASCII кодами и попытка вмешательства (пример показал - жму одно, нажимается другое) может поломать всю картину :)

---------- Post added at 01:22 ---------- Previous post was at 01:17 ----------


Это косяк, в приложении - исправленный вариант терминала.

Во.
Теперь лишний CTRL/Q не выдается.
Осталась мелочь - отвязать кнопку ScrollLock от переключения режима и приделаеть ей родной функционал, да еще опционально убрать реакцию на CTRL/S и CTRL/Q вообще чтобы с толку не сбивали :)

Кстати ScrollLock параллельно работает по своему родному функционалу - по крайней мере лампочку переключает.

---------- Post added at 01:38 ---------- Previous post was at 01:22 ----------

Я тут кстати подумал - можно соединить HX и RTEM монитор и получить стопроцентно безконфликтную систему :)

Patron
19.11.2012, 22:43
Кстати ScrollLock параллельно работает по своему родному функционалу - по крайней мере лампочку переключает.При включённом режиме KeyboardControlling = 1 ( в файле Terminal.ini ) - лампочка [Scroll Lock] индицирует состояние режима Xoff/Xon ( горит - Xoff, не горит - Xon ).

Если KeyboardControlling = 0 - терминал не может имитировать нажатия на <Scroll Lock> для синхронизации режима горения лампочки с режимом Xoff/Xon, поэтому в таком случае лампочка просто переключается при каждом нажатии на клавишу <Scroll Lock> без како-либо гарантированной системы.


опционально убрать реакцию на CTRL/S и CTRL/Q вообще чтобы с толку не сбивалиДобавлю такую возможность в следующем релизе.


можно соединить HX и RTEM монитор и получить стопроцентно безконфликтную системуЧто значит "соединить" ?
Я про RTEM ничего не знаю.

form
19.11.2012, 22:50
Если KeyboardControlling = 0 - терминал не может имитировать нажатия на <Scroll Lock>

У меня и стоит 0, а переключает ее система видимо :)



Что значит "соединить" ?
Я про RTEM ничего не знаю.

RTEM монитор - обычный RT-11, только собирается с опцией RTE$M=1 и файлом определений критических точек входа. При этом BSTRAP при загрузке патчит систему так, что вместо обращения к физическому железу в разных местах система вызывает соответствующие подпрограммы которые эмулируют нужный функционал (например переложив его на операционку внутри которой мы запускаем RT-11).
Посмотреть как это работает можно на CTAKAHе - команда "RTE /VS" загрузит RT-11 внутри RSX.

Ну а в данном случае, можно почти все подпрограммы заставить делать то, что они обычно и делали, а к примеру терминальные грамотно разделить одно от другого.

Хотя еще правильнее будет просто добавить такой функционал в сорцы системы (тем же способом как RTEM - заставить BSTRAP пропатчить) :)

Patron
19.11.2012, 23:10
RTEM монитор - обычный RT-11, только собирается с опцией RTE$M=1 и файлом определений критических точек входа. При этом BSTRAP при загрузке патчит систему
Т.е. диск ( или DSK-образ ) так загрузить нельзя.
Что BSTRAP будет патчить в 0-м блоке загружаемого образа..

form
19.11.2012, 23:15
Т.е. диск ( или DSK-образ ) так загрузить нельзя.
Что BSTRAP будет патчить в 0-м блоке загружаемого образа..

Почему это нельзя?
Собственно именно образ и грузится в обычном RTEM. Даже еще хитрее - комбинируется из двух образов рабочий.

Причем тут нулевой блок?
BSTRAP патчит сам монитор который он уже загрузил в память.

К примеру есть в системе код:


SPL7: MOV #340,@#PS
RETURN

А мы работаем в другой системе, ни о каком PS речи не идет, зато можно запретить AST прерывания. BSTRAP патчит этот кусок кода по таблице и меняет его на


SPL7: DSAR$S
RETURN

К слову, и без всякого ртема загрузчик такие патчи накладывает - к примеру для LSI-11 меняет команды запичи-чтения PSW :)

Также можно пропатчить точки драйвера терминала (что RTEM также делает) чтобы получить над ними контроль. Для HX собственно достаточно именно этого и ничего больше.

Patron
19.11.2012, 23:29
Также можно пропатчить точки драйвера терминала (что RTEM также делает) чтобы получить над ними контроль. Для HX собственно достаточно именно этого и ничего больше.А зачем вообще что-то патчить для HX..

Можно написать версию HX.SYS которая будет читать/писать байты не через порт, а через системные вызовы. Правда, такая версия будет быстро работать только на быстрых машинах - на ДВК-1 потеря скорости составит > 25%.

form
19.11.2012, 23:37
А зачем вообще что-то патчить для HX..

Можно написать версию HX.SYS которая будет читать/писать байты не через порт, а через системные вызовы. Правда, такая версия будет быстро работать только на быстрых машинах - на ДВК-1 потеря скорости составит > 25%.

Это сведется по сути к тому же самому, что и сейчас: сестема будет много времени проводить внутри драйвера и имеет все шансы вообще зависнуть нам навечно. А RT-11 бывает не только однозадачным :)
И по прежнему не решается возможный конфликт когда мы вычитываем не свои данные к примеру, а потом нам остается либо их выкинуть либо городить огромный огород много сложнее двух-трех хуков в систему.

Кстати в 5.6 и 5.7 терминальные хуки в принципе предусмотрены без вмешательства в исходники, но в старых системах такого не было.

Интересна также ситуация когда делается .READC который превращается в .READW с последующим прерыванием - для SJ это вообще смерть как правило. Надо потестить для интереса.

Patron
19.11.2012, 23:43
не решается возможный конфликт когда мы вычитываем не свои данныеКогда драйвер HX принимает данные от мультиплексора, то это всегда именно то, что ему нужно. Другое дело, что контрольная сумма принятых данных может не совпасть - тогда драйвер сообщит об ошибке чтения.

form
20.11.2012, 00:05
Когда драйвер HX принимает данные от мультиплексора, то это всегда именно то, что ему нужно. Другое дело, что контрольная сумма принятых данных может не совпасть - тогда драйвер сообщит об ошибке чтения.

Проблема не в этом.
Проблема в том, что сейчас фактически попав в драйвер запрос блокирует вообще все, в том числе в ситуации когда программа обязана продолжать выполнение, а вместо этого она довисит до конца, а потом возможно обрушится вместе с системой.

Кстати простой тест сделал - COP HX1:file HX0: и пока оно копируется потыкал в клавиши. Результат - output i/o error :)
Это так сказать безболезненный случай.

---------- Post added at 02:59 ---------- Previous post was at 02:46 ----------

...и снова возвращаясь к терминалам. Сделай возможность игнорирования "<ESC>[?2l" - то есть <ESC>[ может включить HOLD SCREEN, но если следом идут ?2l - отключить обратно.

Это добавит совместимости с софтом который пробует принудительно заVT52ить терминал.

---------- Post added at 03:05 ---------- Previous post was at 02:59 ----------

А-а, кстати RSTS/E который мне сейчас выдал этот самый <ESC>[?2l попросту прав. У тебя терминал отвечает как <ESC>/Z, соответственно RSTS/E справедливо считает, что это VT100 и на <ESC>[ не обидится :)

Для пробы на CM7209 сделал SET TERM/INQ - честно определил тип и не засветил HOLD SCREEN.

Patron
20.11.2012, 00:15
Проблема в том, что сейчас фактически попав в драйвер запрос блокирует вообще все, в том числе в ситуации когда программа обязана продолжать выполнение, а вместо этого она довисит до конца, а потом возможно обрушится вместе с системой.Прерывания (кроме экрана и клавиатуры) не запрещены, поэтому непонятно, почему запрос блокирует ВООБЩЕ всё.. В многозадачной системе прерывание от таймера вызовет переключение и если порт поддерживает RTS/CTS - HX ничего не потеряет.

Типа, предлагается переключать прерывания экрана и клавиатуры на HX, не запрещая их ?

form
20.11.2012, 00:20
Прерывания (кроме экрана и клавиатуры) не запрещены, поэтому непонятно, почему запрос блокирует ВООБЩЕ всё..

I/O запрос поступает в драйвер и на этом труба - выполняется он долго, а управление не отдает пока не закончится. Соответственно прога которая отправила запрос и расчитывает продолжить выполнение реально стоит колом на этом месте, а потом могут возникнуть непонятки с тем, что I/O запрос завершился раньше чем закончилась постановка его в очередь :)

---------- Post added at 03:20 ---------- Previous post was at 03:16 ----------


Типа, предлагается переключать прерывания экрана и клавиатуры на HX, не запрещая их ?

В идеале прерывания вообще не запрещаем и работаем по прерываниям, а на уровне точек прерываний уже разруливаем что куда. Ввод-вывод дробим на мелкие блочки, чтобы иметь возможность между ними просунуть высокоприоритетную информацию (терминальный ввод-вывод), ну и не ломать асинхронный ввод-вывод, превращая мощную достаточно систему в MS-DOS когда он дискету читает :)

Правда все это скорее для общего развития так как изначально наколько я понимаю HX задумывался как некий workaround для машины где ничего нет и нужно подняться с нуля, а в этом случае можно и потерпеть мелкие неудобства.

Patron
20.11.2012, 00:20
терминал отвечает как <ESC>/Z, соответственно RSTS/E справедливо считает, что это VT100Это ответ 15ИЭ.

Нужно открыть файл Terminal.ini и изменить значение:



TerminalID_ANSI_STR = "\033/Z"

form
20.11.2012, 00:23
TerminalID_ANSI_STR

Кстати к ANSI это не имеет отношения. В ANSI запрос типа терминала есть только в двух вариантах:


<CSI>c
<ESC>[c


А ответ - длинная пачка свойств с тем же c в конце.
А <ESC>Z - это для совместимости оставлено :)

form
20.11.2012, 00:29
Во, теперь не HOLDится.

--
кстати, как вы этом форуме картинки под спойлер запихивать?

Patron
20.11.2012, 00:51
Кстати к ANSI это не имеет отношения.Но это имеет отношение к ANSI_STR, т.е. такому представлению строки, когда управляющие символы задаются как "\OOO", где OOO - восьмеричное число или "\xHH", где HH - шестнадцатеричное число.


как вы этом форуме картинки под спойлер запихивать?



[ spoiler]
[ img]http://zx.pk.ru/attachment.php?attachmentid=38364[/ img]
[/ spoiler]

Даст такой результат:


http://zx.pk.ru/attachment.php?attachmentid=38364

Для просмотра BB-кода можно нажать у этого сообщения [quote].

form
20.11.2012, 00:53
Но это имеет отношение к ANSI_STR, т.е. такому представлению строки, когда управляющие символы задаются как "\OOO", где OOO - восьмеричное число или "\xHH", где HH - шестнадцатеричное число.

Тоже нет - это было реализовано до ANSIфикации всего этого :)

Patron
20.11.2012, 01:18
это было реализовано до ANSIфикации всего этогоВ модульном API - это было реализовано после.

В модульном API строковые данные могут быть двух типов - простые строки, которые не могут содержать управляющие символы, и строки ANSI_STR, которые могут.

Понять, какие где - мне самому трудно, поэтому для облегчения понимания - имена параметров и констант, для которых точно можно задавать управляющие символы - оканчиваются на ANSI_STR.

Patron
20.11.2012, 18:05
Обновилась текущая сборка эмулятора терминала типа VT52: VT52_20.11.12_17-44.

Изменения:

1. Теперь табуляция не стирает содержимое экрана, не перемещает курсор дальше последнего столбца и после 72 столбца смещает курсор только на одну позицию вправо.

2. Теперь при KeyboardControlling = 0 нажатия на клавишу <Scroll Lock> в окне терминала не изменяют состояние её лампочки на клавиатуре.

3. Из файла Terminal.ini удалены настройки шрифта по-умолчанию:


FontSize = 0
FontFace = "Courier New"

4. В файл Terminal.ini добавлены настройки кодов клавиш [Pad_Dot] и [Pad_Enter] для режима цифровой клавиатуры:


ANSI_STR_FOR_KEY[Pad_Dot] = "."
ANSI_STR_FOR_KEY[Pad_Enter] = "\015"

5. В файл Terminal.ini добавлена константа Xoff_Indication_On_Hold_Button, задающая отображать или нет на кнопке HOLD текущее состояние Xon/Xoff:


Xoff_Indication_On_Hold_Button = 1

6. Добавлена поддержка управляющих кодов включения и выключения псевдографики "\033F" и "\033G" с поддержкой отображения единственного символа псевдографики VT52 - "Solid Rectangle" ( код 0141 ).

form
20.11.2012, 18:29
VT52_20.11.12_17-44

Теперь RTMON, K52, EDT, NTD смотрятся по человечески.
Для полного счастья осталось две вещи:

возможность превратить кнопку <ScrollLock> в честный аналог <SCROLL>
возможность включения workaroundа для программ которые пытаются включить VT52 режим


Кстати курсор у меня не получилось большой сделать - толи не там писал толи что. И настройки эти в файле аж в трех местах обнаружились :)

form
20.11.2012, 18:46
Еще идея в копилку: поддержка передачи файлов (KERMIT, TRANSF).

Patron
20.11.2012, 18:54
курсор у меня не получилось большой сделатьРецепт успеха ( для файла конфигурации COM.cfg ):

1. Открываем файл COM.cfg в текстовом редакторе.

2. Находим в разделе [VT52.ini] строку:


CURSOR_Y_START_% = 85

3. Теперь можно сделать одно из трёх ( смотря что удобнее ):

- Изменить значение 85 на 0:


CURSOR_Y_START_% = 0

- Поставить в начале строки один или несколько символов ';':


;;; CURSOR_Y_START_% = 85

- Удалить эту строку:

form
20.11.2012, 18:58
Рецепт успеха

Получилось. Курсор правда слишком крупный получается. Можно его этими циферками подкрутить чтобы он не больше больших букв был размером? (ну или с тот самый символ что <ESC>Fa).
В досе когда программил хитрую хрень (два символа в одном знакоместе текстового режима) помню урсор задавался с какой по какую линию, а здесь как?

Patron
20.11.2012, 19:12
Курсор правда слишком крупный получается. Можно его этими циферками подкрутить чтобы он не больше больших букв был размером?Курсор может иметь любые прямоугольные пропорции в пределах знакоместа. Начальная и конечная позиции курсора в знакоместе по вертикали и горизонтали задаются следующими параметрами в файле Terminal.ini:



CURSOR_Y_START_% = 0
CURSOR_X_START_% = 0
CURSOR_Y_END_% = 100
CURSOR_X_END_% = 100Значения (в процентах от размера знакоместа) могут быть любыми в диапазоне 0..100. Рекомендуемый шаг изменения 5%, что примерно соответствует одному пикселу матрицы.

form
01.12.2012, 12:03
Кхм.
Попробовал связь по IP.
telnet не поддерживается ;(

Patron
01.12.2012, 12:45
telnet не поддерживается ;(Добавлять поддержку телнета в эмулятор терминала - значит грешить против истины, ведь эмулируемые терминалы, подключенные через IP-адаптер - будут вести себя именно так.

form
01.12.2012, 12:50
Добавлять поддержку телнета в эмулятор терминала - значит грешить против истины, ведь эмулируемые терминалы, подключенные через IP-адаптер - будут вести себя именно так.

На данный момент в сети ровно на 100% больше именно телнетных точек ;)
Кроме того никто не мешает сделать настройку raw/telnet. Тем более, что собственно поддержка как таковая не нужна - достаточно просто вырезать телнетные команды.

---------- Post added at 15:47 ---------- Previous post was at 15:47 ----------

SimH к слову именно так поступает (всмысле вырезает).

---------- Post added at 15:50 ---------- Previous post was at 15:47 ----------

Хотя в идеале в режиме телнета надо все-таки передать опции что требуется посимвольный режим.

Patron
01.12.2012, 13:00
достаточно просто вырезать телнетные командыГлавная задача проекта эмуляции терминалов - достижение максимальной идентичности, чтобы на одинаковые байты на входе эмулируемые и оригинальные терминалы реагировали одинаково.

Поэтому, идеологически правильно использовать внешние фильтры протокола, типа мультиплексора HX, который вырезает из потока байтов фрагменты блокового обмена, отправляя на выход TTY очищенный терминальный поток.

Чтобы не делать новый фильтр - можно добавить в настройки HX опцию вырезания команд Telnet.

Но насколько это актуально.. Ведь при подключении по IP к эмулируемым системам - команды Telnet можно встретить только на этапе подключения. Терминалы не реагируют на команды телнет - поэтому эти команды и не применяются в терминальном обмене.

form
01.12.2012, 13:01
Главная задача проекта эмуляции терминалов - достижение максимальной идентичности, чтобы на одинаковые байты на входе эмулируемые и оригинальные терминалы реагировали одинаково.

Ну так терминальные эмуляторы по TCP все до одного как раз телнет пользуют :)

Patron
01.12.2012, 13:02
Хотя в идеале в режиме телнета надо все-таки передать опции что требуется посимвольный режим.Такая опция возможна в IP-адаптере.

Что тогда нужно отправить Telnet-серверу ?

form
01.12.2012, 13:03
Такая опция возможна в IP-адаптере.

Что тогда нужно отправить Telnet-серверу ?

Протокол надо смотреть - на память не помню. Главное - уметь вырезать телнетную часть, посимвольный режим как правило в клиенте принудительно можно выставить.

Patron
01.12.2012, 13:14
посимвольный режим как правило в клиенте принудительно можно выставить.IP-адаптер отправляет пакеты 60 раз в секунду, поэтому проблема может быть только со стороны сервера, который по-умолчанию отправляет пакеты только 10 раз в секунду (или даже реже).

---------- Post added at 12:14 ---------- Previous post was at 12:08 ----------

У IP-адаптера есть опция


Extended_Log = 0

Если установить там 1 - в логе будет записан каждый принятый и отправленный пакет.

form
01.12.2012, 13:15
Если установить там 1 - в логе будет записан каждый принятый и отправленный пакет.

Да зачем оно - протокол описан в RFC и даже вроде просто на википедии.

Patron
01.12.2012, 13:20
Да зачем оно - протокол описан в RFC и даже вроде просто на википедии.Дело в том, что в стеке IP есть низкоуровневая настройка времени буферизации данных перед отправкой пакета. Даже если сам Telnet работает в посимвольном режиме - долгая буферизация приводит к тому, что данные при непрерывном выводе поступают неравномерно.

Для проверки надо дать команду типа DUMP и оценить равномерность передачи листинга. При этом в логе IP-адаптера можно посмотреть как часто и какого размера пакеты приходят от сервера.

form
01.12.2012, 13:25
Дело в том, что в стеке IP есть низкоуровневая настройка времени буферизации данных перед отправкой пакета. Даже если сам Telnet работает в посимвольном режиме - долгая буферизация приводит к тому, что данные при непрерывном выводе поступают неравномерно.

Для проверки надо дать команду типа DUMP и оценить равномерность передачи листинга. При этом в логе IP-адаптера можно посмотреть как часто и какого размера пакеты приходят от сервера.

Телнет работает как угодно, по символьный режим не гарантирует посимвольности, а лишь отдает предпочтение отправке клавиатурного ввода как можно быстрее. Сервер же при этом шлет обычно пачками (в зависимости от скорости поступления данных).

У меня вон сейчас USB<>2COM адаптер - так RT-11 в нем и без всяких сетей фигачит пачками по пол экрана. Неудобно, но жить можно :)

В RSX вот все как обычно.

Patron
01.12.2012, 13:36
Сервер же при этом шлет обычно пачкамиКогда IP-адаптер "эмулятора ДВК" выступает в качестве сервера - он отправляет пачки 60 раз в секунду. Это специально сделано для того, чтобы было комфортно запускать на таком сервере игры.

Если загрузить в эмуляторе ДВК файл конфигурации Server.cfg - он начинает принимать входящие соединения на всех IP-адресах хоста в порту 8023.

Адрес и порт ожидания соединения можно задать настройками:


[IP_Adapter.ini]
Listen_on_IP =""
Listen_on_Port = 8023


Подняв такой сервер - можно зайти на него эмулятором терминала и оценить плавность работы в играх.

form
01.12.2012, 13:40
Когда IP-адаптер "эмулятора ДВК" выступает в качестве сервера - он отправляет пачки 60 раз в секунду.

Вполне нормальный режим.
Просто добавить фичу чтобы умел вырезать телнетные команды при приеме, а при отправке символа с кодом 377 отправлял его дважды.
Опция должна быть отключаема так как CHARON к примеру наоборот вроде raw ip использует.

Позже можно подумать об эмуляции DLV11-E/F с фичей приема звонка/дозвона :)

Patron
01.12.2012, 13:53
при отправке символа с кодом 377 отправлял его дваждыРедкий терминал отправляет такой код - для этого надо специально извратить настроки в файле Terminal.ini, задав какой-нибудь настраиваемой клавише отправку "\377".

Если же мы коннектимся не для терминального обмена (например, к эмулятору устройства с последовательным интерфейсом) - вероятность наличия на другой стороне сервера Telnet равна нулю.

form
01.12.2012, 13:57
Редкий терминал отправляет такой код - для этого надо специально извратить настроки в файле Terminal.ini, задав какой-нибудь настраиваемой клавише отправку "\377".

Если же мы коннектимся не для терминального обмена (например, к эмулятору устройства с последовательным интерфейсом) - вероятность наличия на другой стороне сервера Telnet равна нулю.

Дело не в терминале, а в принципиальной возможности отправить такой код например записав его в 177566. Телнетный клиент будет сбит с толку если следующий символ будет отличным от 377. Задача - максимально близко к реальности сделать, то есть чтобы терминальный клиент (телнетным) работал так как будто это настоящий терминал.

---------- Post added at 16:57 ---------- Previous post was at 16:55 ----------

Ну и обратное - телнетный клиент или сервер обязательно будет слать свои опции в виде <377><OP> или <377><OP><VAL>, их надо вырезать чтобы они не вылетали из регистров устройства.

Patron
01.12.2012, 14:02
Задача - максимально близко к реальности сделать, то есть чтобы терминальный клиент (телнетным) работал так как будто это настоящий терминал.Если Telnet-клиент, подключившись к серверу - посылает запрос настроек Telnet - IP-адаптер можно научить адекватно отвечать. Но если Telnet-клиент подключается "молча" - он должен работать в режиме RAW, т.к. IP-адаптер в принципе пассивен - он не может быть инициатором траффика.

form
01.12.2012, 14:04
Если Telnet-клиент, подключившись к серверу - посылает запрос настроек Telnet - IP-адаптер можно научить адекватно отвечать. Но если Telnet-клиент подключается "молча" - он должен работать в режиме RAW, т.к. IP-адаптер в принципе пассивен - он не может быть инициатором траффика.

Вполне приемлемый вариант. Аналогично для сервера. Но опция которая позволяет отключать вручную тоже пригодится - скажем telnet, raw, auto.

Patron
01.12.2012, 14:26
опция которая позволяет отключать вручную тоже пригодится - скажем telnet, raw, auto.Замечу, что в модульном API реализуется стратегия фильтрации точных совпадений - т.е. из потока вырезаются только те участки, которые на 100% совпадают с шаблоном и для которых фильтр точно знает, что они означают. Те последовательности, которые не на 100% совпадают с шаблоном или назначение которых фильтру неизвестно - всегда пропускаются, потому что вслед за этим фильтром в цепочке может стоять следующий, который как раз такую последовательность и обрабатывает.

form
01.12.2012, 15:17
У-у как все запущено в этом самом USB<>2COM...

Отправляю с 11/83 коды 101,33,321.


<101>
<033>
<321>

Тут все в норме - прилетает как и положено...
Теперь отправляю BREAK.


<000>
<BRKON>
<BRKOFF>
<056>
<122>
<105>
<114>
<015>
<012>
<052>
<136>
<103>
<015>
<012>
<101>
<033>
<321>


Получаем полную хрень: кратковременный BREAK и остатки буфера (то, что уже было напечатано до этого) :)

В принципе я конечно все это уже видел когда выключал питание 11/83, но здесь в явном виде с полной раскладкой...

Не берите PCI и USB портов если нужен полный функционал хотя бы на уровне DL(V)11 :)

hobot
01.12.2012, 17:34
Подняв такой сервер - можно зайти на него эмулятором терминала и оценить плавность работы в играх.
Игрушки! )


Не берите PCI и USB портов если нужен полный функционал хотя бы на уровне DL(V)11
Лучший вариант как я понял обычный COM на материнке, но помню ещё по работе
в рознице вариантов "USB2COM" и "PCI2COM" - очень много, может быть возможно
и подобрать что-то приемлемое? Для тех у кого ну очень новые компьютеры, а
потребность\желание каких то COM-соединений (по теме) всё таки возникнет?
Но это всё так - риторическая лирика ) Просто может кто-то отпишет, что мол
вот такой адаптер-переходник работает отлично, молодцы китайцы или что-то в этом роде.

form
01.12.2012, 17:40
подобрать что-то приемлемое?

Другого способа кроме как проверять по очереди все не вижу.
На данный момент из двух PCI карточек и одной USB ни одна полного функционала COM порта не позволила делать. Возможно это проблема драйверов этих железок, но может и самих железок.

Для терминала такой урезанный функционал в принципе не страшен, для других функций (например эмуляция стандартных нетерминальных устройств, подключаемых к DL(V)11) это полностью исключает работоспособность.

hobot
01.12.2012, 17:43
Другого способа кроме как проверять по очереди все не вижу.
Да, надо коробку с моделями прям брать и переставлять, такая возможность вряд ли будет у одного человека. Правильно ли я понял, что проблема отчасти возможно в том, что буфер слишком объёмный? Или скорее в том, что не чистится от уже улетевших данных?

form
01.12.2012, 17:49
Да, надо коробку с моделями прям брать и переставлять, такая возможность вряд ли будет у одного человека. Правильно ли я понял, что проблема отчасти возможно в том, что буфер слишком объёмный? Или скорее в том, что не чиститься от уже улетевших данных?

PCI и USB порты обычно недешевые...
Проблема не в буфере - это в конце концов может создать некоторые неудобства, но терпимые.
Проблема в том, что функционал COM порта далеко не исчерпывается возможностью слать и принимать символы. Нужно еще уметь слать BREAK и определять когда тебе шлют его. Пока с этим справлялись только традиционные COM порты. Всякие PCI-USB могли только слать BREAK.

hobot
01.12.2012, 18:02
PCI и USB порты обычно недешевые...
Относительно да, риторический же вопрос, а нет какого-то готового аппаратного решения от наследников, официальных "хозяев" платформы PDP? Пусть и не дешёвое, но с гарантией 100% требуемого функционала порта на современных PC-платах? (да ведь существуют не только INTEL чипсеты - я последнее время немного отвлёкся, но надо капнуть, есть шанс что делают платы с полноценным
COM-портом под актуальные ЦП?) - я просто помню когда все расстроились по
поводу отказа от IDE, однако какое-то время платы с ним продолжали штамповать
даже ведущие брэнды. Другой момент что большинству даже и не интересно сам
порт, а о тонкостях знают вообще 10 человек ) Это c любыми контроллерами поколения PC-90ых.

---------- Post added at 18:02 ---------- Previous post was at 17:58 ----------

С ходу только вот такое по первой ссылке в гугле http://www.easycom.com.ua/mboard/gigabyte_ga-z68ma-d2h-b3/?lang=ru


Внутренние порты I/O


1 x разъём для подключения системного вентилятора
1 x коннектор вывода звука на переднюю панель
2 x порт SATA 6Гбит/с
4 x порт SATA 3Гбит/с
1 x блок коннекторов передней панели
1 x разъем вентилятора CPU
1 x джампер для сброса CMOS
1 х COM
4 х USB 2.0/1.1
1 x Trusted Platform Module (TPM)
1 x SPDIF Out

form
01.12.2012, 18:05
с гарантией 100% требуемого функционала порта на современных PC-платах?

Любая материнка с COM портом на нейю


поводу отказа от IDE, однако какое-то время платы с ним продолжали штамповатьх.

И сейчас даже очень навороченные платы продолжают выпускаться с IDE. Разьве что разъем теперь обычно всего один делают. А те, что совсем без всего старого - они обычно не стоят того, чтобы даже смотреть в их сторону :)

---------- Post added at 21:05 ---------- Previous post was at 21:03 ----------

Предлагаю дальнейшее обсуждение (если таковое будет) вынести в отдельную тему.

form
02.12.2012, 10:24
Предложение: создать по образу и подобию виртуальный принтер который рисует листы бумаги (вершина счастья - с перфорацией по краям и линиями стыковки) и текстом (с возможностью отправить на виндовсный принтер). И кнопочку чтобы отправляла на реальный принтер сразу.

Весьма полезная вещь в качестве LS: будет :)

anasana
02.12.2012, 12:59
А есть список какие модели принтеров использовались? Это же были сразу 'line printers'?
Линейка устройств ЕС и СМ (с ESC/P) вполне неплохо раскрыта для дальнейших игр (тот же проект nzeemin'а) и просто наведения красоты в коде.

form
02.12.2012, 13:06
А есть список какие модели принтеров использовались? Это же были сразу 'line printers'?

Последовательные у DEC какие были навскидку не скажу - у нас только параллельные всегда были. Можно в описании DEC Pro покопаться - у него только последовательный интерфейс предусмотрен для принтера.

Я последовательные видел только на PC :)

anasana
02.12.2012, 13:11
Список для Pro как бы есть, но я имел в виду не последовательный интерфейс связи как линии - а принцип при печати: вывод сразу целой строкой символов (где шрифтами не поуправляешь если они с барабана печатаются), а не по-'dots'. Хотя я вспоминаю что что-то читал про печать знакоместом.

form
02.12.2012, 13:17
Список для Pro как бы есть, но я имел в виду не последовательный интерфейс связи как линии - а принцип при печати: вывод сразу целой строкой символов, а не по-'dots'.

Это от принтера зависит - будет он выводить символы сразу по мере их поступления в него или только после того как наберется целая строка. У нас и такие и такие были.

---------- Post added at 16:17 ---------- Previous post was at 16:16 ----------

Был у нас скоростной гроб который по десятку страниц в секунду выплеввывал :)

anasana
02.12.2012, 13:45
Получается что в эмуляторе VT52 должен быть драйвер принтера(ов), который готовит строку инициализации, знает про ширину каретки, полюбому нужен какой-то список.

form
02.12.2012, 13:48
Получается что в эмуляторе VT52 должен быть драйвер принтера(ов), который готовит строку инициализации, знает про ширину каретки, полюбому нужен какой-то список.

Эмулятор VT52 в данном случае непричем (хотя в дальнейшем можно реализовать стандартную фичу VT52 с принтером). Нужен просто эмулятор принтера. Ну а там уже настройки длины-ширины. Таблица стандартных параметров для разных DECовских устройств есть (хотя она и не особо нужна).

---------- Post added at 16:48 ---------- Previous post was at 16:47 ----------

Кстати можно и бумажный терминал эмулировать :)

hobot
02.12.2012, 14:47
Список для Pro как бы есть, но я имел в виду не последовательный интерфейс связи как линии - а принцип при печати: вывод сразу целой строкой символов (где шрифтами не поуправляешь если они с барабана печатаются), а не по-'dots'. Хотя я вспоминаю что что-то читал про печать знакоместом.
На УК-НЦ есть "огромное" количество программ для принтеров Epson, D100 и Robotron с различными возможностями печати и очень гибкими настройками,
есть возможность печати установленным в системе шрифтом ну и всё такое.
Есть программы типа МИЭТовской DOC.SAV для ДВК. Можно даже покопаться
в архиве в плане исходников. ) Про варианты драйвера LP.SYS (LP.SAV), NEWLP.SYS
я пока слишком мало знаю, но и там настроек хватает различных.

Patron
02.12.2012, 14:54
Кстати можно и бумажный терминал эмулироватьЗдесь важен не столько аспект эмуляции ( т.е. воспроизведения внутренних особенностей функционирования ), сколько аспект симуляции ( т.е. воспроизведения внешних признаков работы ).

В плане эмуляции модульный API предполагает возможность абстрактной, дискретной и аналоговой эмуляции любых электронных компонентов, устройств и систем, а в плане симуляции - звуковую и видео ( абстрактную, 2D и 3D ) симуляцию.

Для перфолент и телетайпов абстрактная видео-симуляция не очень интересна - гораздо интереснее фотореалистичная 2D или 3D симуляция с хотя бы абстрактной звуковой симуляцией ( т.е. без 2D или 3D позиционирования источников звука в симулируемом пространстве ).

form
02.12.2012, 14:58
Здесь важен не столько аспект эмуляции ( т.е. воспроизведения внутренних особенностей функционирования ), сколько аспект симуляции ( т.е. воспроизведения внешних признаков работы ).

В плане эмуляции модульный API предполагает возможность абстрактной, дискретной и аналоговой эмуляции любых электронных компонентов, устройств и систем, а в плане симуляции -звуковую и видео ( абстрактную, 2D и 3D ) симуляцию.

Для перфолент и телетайпов абстрактная видео-симуляция не очень интересна - гораздо интереснее фотореалистичная 2D или 3D симуляция с хотя бы абстрактной звуковой симуляцией ( т.е. без 2D или 3D позиционирования источников звука в симулируемом пространстве ).

(замахал руками) слишком много умных слов непонятно зачем :)
идея простая: эмуляция принтера который бы показывал страницы и мог бы их при желании печатать. Все.

Также как эмулятор VT52 можно подключить к живой машине и пользоваться, этот эмулятор принтера можно будет подключить к живой машине (тому же ДВК или УКНЦ) и пользоваться.

К примеру разбираясь с прогами весьма удобно было бы делать


MAC/LIS:LS: PROG

я конечно и сейчас так делаю, а потом скролю окно securecrt, но было бы удобнее, чтобы еще и директивы MACRO-11 для листинга работали :)

Patron
02.12.2012, 15:24
я конечно и сейчас так делаю, а потом скролю окно securecrt, но было бы удобнее, чтобы еще и директивы MACRO-11 для листинга работалиКакие директивы ?

form
02.12.2012, 15:24
Какие директивы ?

.PAGE например

Идея - видеть листинг так как напечатанный на бумаге, а не просто построчный на терминале.

hobot
02.12.2012, 16:58
А такая функция эмулятором-принтера должна быть? Твёрдая копия в смысле?
http://images.netbynet.ru/direct/f5cd1702ca11c1f79e7dd1a8b328d1be.png

Patron
02.12.2012, 17:02
.PAGE например
Идея - видеть листинг так как напечатанный на бумаге, а не просто построчный на терминале.Ну, .PAGE (насколько я понимаю) просто добавляет в листинг байт прогона формата <\014>.

Но такой байт принтеры Windows должны понимать.

Получается, что единственное требование к консоли, чтобы её можно было использовать для эмуляции принтера - настройка размера страницы и оформление страницы при выводе на экран горизонтальными разделителями ( ну и чтобы при получении кода FF - консоль выполняла "прогон формата" ).

form
02.12.2012, 17:05
Ну, .PAGE (насколько я понимаю) просто добавляет в листинг байт прогона формата <\014>.

Именно так.


Но такой байт принтеры Windows должны понимать.

Принтер непричем. Задача - смотреть результат, а не печатать.
Печатать - опция.


настройка размера страницы и оформление страницы при выводе на экран горизонтальными разделителями ( ну и чтобы при получении кода FF - консоль выполняла "прогон формата" ).

Еще поддержка <VT>, char<BS>char, char<BS>_. Детальнее надо почитать какую-нибудь доку по простенькому принтеру, чтобы освежить в памяти особенности.

Patron
02.12.2012, 17:19
Еще поддержка <VT>Это можно.


char<BS>char, char<BS>Полностью исключено - консоль может выводить в окно Windows только символы шрифта Courier New. Можно научить консоль рисовать в окне страничный разделитель, но это максимум, на что она способна.

---------- Post added at 16:19 ---------- Previous post was at 16:16 ----------

Проблема с регулировкой жирности в том, что жирный шрифт имеет в Windows другую ширину матрицы. Вот почему либо весь текст консоли может быть жирным, либо весь обычным.

form
02.12.2012, 17:21
Полностью исключено - консоль может выводить в окно Windows только символы шрифта Courier New. Можно научить консоль рисовать в окне страничный разделитель, но это максимум, на что она способна.

Отрабатывать в любом случае надо независимо от умения (как все остальные проги) делать жирные и подчеркнутые символы :)
Как минимум чтобы хотя бы символ не двоился.

---------- Post added at 20:21 ---------- Previous post was at 20:19 ----------

Жирность можно обозначать цветом как терминальные проги делают.

form
02.12.2012, 17:27
Проблема с регулировкой жирности в том, что жирный шрифт имеет в Windows другую ширину матрицы. Вот почему либо весь текст консоли может быть жирным, либо весь обычным.

Кхм...

Patron
02.12.2012, 17:34
Можно научить консоль осмысленно реагировать на попытки "ужирнения" и "подчёркивания" выводимых символов при помощи <BS> так, чтобы результат (как минимум) не искажался - т.е. чтобы (например) подчёркиваемые символы не заменялись на подчёркивания вне зависимости от положения подчёркивания относительно <BS>.

---------- Post added at 16:34 ---------- Previous post was at 16:32 ----------


Кхм...Это какой шрифт?

form
02.12.2012, 17:37
Это какой шрифт?

Lucida console.

Вот courier new...

Patron
02.12.2012, 17:44
Как выяснилось - для некоторых размеров шрифта жирная и обычная матрицы у Windows совпадают по размерам. Так что возможность научить консоль "ужирнению" есть, но только для тех шрифтов/размеров, у которых матрицы обоих типов имеют одинаковую высоту и ширину.

form
02.12.2012, 17:46
Как выяснилось - для некоторых размеров шрифта жирная и обычная матрицы у Windows совпадают. Так что возможность научить консоль "ужирнению" есть, но только для тех шрифтов/размеров, у которых матрицы обоих типов имеют одинаковую высоту и ширину

Ну где неодинаковая - можно цветом обозначить.

---------- Post added at 20:46 ---------- Previous post was at 20:45 ----------

У меня досовский драйвер есть шрифтовой с обычными и жирными шрифтами - делалось для лаптопов старых когда-то :)

Patron
02.12.2012, 18:14
Чтобы содержимое окна консоли с символами, отличающимися не только их кодами, но и экранным представлением, можно было проматывать по вертикали и горизонтали - буфер текста должен хранить не только байты текста, но и байты признаков для каждого символа.

Поэтому все предложенные улучшения появятся только в новой консоли, когда она будет написана.

---------- Post added at 17:14 ---------- Previous post was at 16:54 ----------

Надо будет проверить размеры матриц для вариантов Italic, Underline и StrikeOut, которые есть у каждого шрифта Windows.

form
03.12.2012, 09:05
Patron, напомни pls детали относительно того как правильно блокировать переключение numlock при обработке клавиш. А то руки так и не дошли в dbit написать, а сейчас потерял где это было :)

Patron
03.12.2012, 11:10
как правильно блокировать переключение numlock при обработке клавишВ последней версии терминала ошибиться невозможно. После установки Use_NumLock_as_PF1 = 1 терминал проверяет только KeyboardControlling, а оставшиеся два параметра игнорирует.

form
03.12.2012, 11:27
В последней версии терминала ошибиться невозможно. После установки Use_NumLock_as_PF1 = 1 терминал проверяет только KeyboardControlling, а оставшиеся два параметра игнорирует.

Я не про то.
Мне с точки зрения програминга нужно - хочу допинать автора E11 чтобы хотя бы половина моих пожеланий была реализована :)

Patron
03.12.2012, 11:53
Мне с точки зрения програминга нужноС точки зрения программинга это нереально сложно. Для реализации нужен глобальный хук клавиатуры, который может быть только один. Но если программа может быть запущена в нескольких копиях и, возможно, из разных каталогов одновременно ( как, например, эмулятор ДВК и эмулятор VT52 ) - то для обеспечения нормальной работы всех запущенных экземпляров через единый глобальный хук - запущенные экземпляры должны реализовывать довольно сложный протокол глобального арбитража работы глобального хука. Ведь если завершится та программа, которая была запущена первой - роль "провайдера глобального хука" должна немедленно перейти к одной (и только одной) из позднее запущенных её копий.

form
03.12.2012, 11:54
С точки зрения программинга это нереально сложно.

Ну ты уже писал в двух словах как-то что нужно делать, я просто потерял где это было :)

Patron
03.12.2012, 11:56
Не исключено, что я чего-то недопонял и можно нормально работать с неcколькими глобальными хуками одновременно, но тогда и спрашивать нужно не у меня, а у того, кто умеет легко и просто программировать глобальные хуки.

form
03.12.2012, 11:59
Не исключено, что я чего-то недопонял и можно нормально работать с неколькими глобальными хуками одновременно, но тогда и спрашивать нужно не у меня, а у того, кто умеет лекго и просто программировать глобальные хуки.

На данный момент у тебя в эмуляторе терминала можно включить режим когда NumLock не переключается. Все, что нужно - это принцип как оно сделано. А всякие слова умные - это пусть они там в dbit сами разбираются. Я пока нет потребности гуевые проги в виндовсе делать, не полезу изучать как оно там делается - с меня пока и mingw + dmc хватит, ну в крайнем случае SDL :)

Patron
03.12.2012, 12:04
я просто потерял где это былоЯ ухитрился найти ссылку Гуглом: Глобальный хук для терминала (http://zx.pk.ru/showthread.php?postid=472147).

form
03.12.2012, 12:07
Я ухитрился найти ссылку Гуглом: Глобальный хук для терминала (http://zx.pk.ru/showthread.php?postid=472147).

Во.
То что надо.

У SecureCRT другой способ - там NumLock отрабатывается, а потом прога переключает его обратно. Автор E11 вроде пробовал такой метод, но столкнулся с проблемами. Вобщем отправлю ему - пусть разбирается.

Patron
03.12.2012, 12:40
пусть разбирается.Мне начинает казаться, что вполне можно обойтись без взаимодействия всех запущенных экземпляров программы с общим глобальным хуком - ведь когда окно теряет фокус оно может отключать свой глобальный хук, а когда получает фокус - подключать. Т.к. фокус во всей системе может иметь только одно окно - уникальность подключенного глобального хука будет гарантирована.

---------- Post added at 11:22 ---------- Previous post was at 11:12 ----------

Если каждое окно, в котором хочется отключить реакцию Windows на NumLock будет при получении фокуса устанавливать:


ghKeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL, KeyboardHook, ghInstance, 0);а при потере фокуса отключать такой глобальный хук:



LRESULT CALLBACK KeyboardHook( int nCode, WPARAM wp, LPARAM lp )
{
static bool bVK_NUMLOCK_pressed = false;

KBDLLHOOKSTRUCT *pkh = (KBDLLHOOKSTRUCT *) lp;
dword wParam = pkh->vkCode;
dword lParam = 1;
dword lParamHi = pkh->scanCode;
signed char cFlags = pkh->flags;

if( cFlags & 1 )
{
lParamHi |= BIT_8;
}
if( cFlags < 0 )
{
lParamHi |= BIT_14;
lParamHi |= BIT_15;
}

if( nCode == HC_ACTION )
{
if( wParam == VK_NUMLOCK )
{
if( cFlags < 0 )
{
bVK_NUMLOCK_pressed = false;
lParamHi <<= 16;
lParam |= lParamHi;
PostMessage( hWnd, WM_KEYUP, wParam, lParam );
}
else
{
if( bVK_NUMLOCK_pressed ) { lParamHi |= BIT_14; }
bVK_NUMLOCK_pressed = true;
lParamHi <<= 16;
lParam |= lParamHi;
PostMessage( hWnd, WM_KEYDOWN, wParam, lParam );
}
return 1;
}
}
return CallNextHookEx( ghKeyboardHook, nCode, wParam, lParam );
}
то проблемы конкуренции глобальных хуков между собой не возникнет.

...

Небольшая сложность есть только с тем, что сообщения о получении фокуса в новое окно и об утрате фокуса в старое окно приходят без гарантированной последовательности. Поэтому, при использовании общего кода хука несколькими окнами - они перед установкой хука должны записывать свой hWnd в глобальную статическую переменную hWnd, которую использует хук, но перед удалением хука эту переменную не трогать, т.к. там уже может быть hWnd другого окна, которое уже установило другой экземпляр этого же хука.

form
06.12.2012, 11:33
Patron, тебе списиба от автора E11 :)
А ты по англицки шпрехаешь?
А то может проще пригласить тебя в переписку напрямую, чтобы вы сами между собой могли объясняться? :)
А то я в виндовсной гуйне ничего не смыслю - програмил или на delphi очень простые вещи или переносил свои изначально униховые проги без гуя :)

Patron
06.12.2012, 11:51
чтобы вы сами между собой могли объясняться?Интересные многим темы лучше обсуждать публично. Помоги ему зарегистрироваться на этом форуме - здесь он всё и узнает.

form
06.12.2012, 11:55
Интересные многим темы лучше обсуждать публично. Помоги ему зарегистрироваться на этом форуме - здесь он всё и узнает.

Сомневаюсь, что он легко поймет русский даже со словарем :)

---------- Post added at 14:55 ---------- Previous post was at 14:52 ----------

Да и виндовсных программеров тут наверное не так уж много :)

Patron
06.12.2012, 12:43
Сомневаюсь, что он легко поймет русский даже со словаремАвтопереводчики интернета с каждым днём всё круче.

Да и виндовсных программеров тут наверное не так уж многоДа, где-то 90% - не больше :)

form
06.12.2012, 13:13
Автопереводчики интернета с каждым днём всё круче.
Да, где-то 90% - не больше :)

С учетом того, что активных поситителей здесь два и один точно в гуевом програминге нифига не смыслит... :)

form
06.12.2012, 17:02
Дурацкий вопрос пока не по теме, но...
У кого-нибудь есть под рукой sparc, powerpc или еще какая тупоконечная архитектура? :)

Patron
06.12.2012, 18:08
У кого-нибудь есть под рукой sparc, powerpc или еще какая тупоконечная архитектура?А чем эти архитектуры интересны в плане эмуляции терминалов?

form
06.12.2012, 18:09
А чем эти архитектуры интересны в плане эмуляции терминалов?

Ничем. Темой промахнулся - хотел в эмулятор ДВК :)
На данный момент связи нет, а вот если сделать один эксперимент - будет :)

Patron
06.12.2012, 18:18
а вот если сделать один экспериментИ что за эксперимент хотелось бы осуществить..

form
06.12.2012, 18:19
Самый простой - собрать simh, запустить, записать пофигу что в образ ленты родного формата.
Я конечно могу и в сорцах покопаться, но если есть готовое решение - это было бы проще :)

Patron
22.12.2012, 20:01
Обновилась текущая сборка эмулятора терминала типа VT52: VT52_23.12.12_18-30.

Изменения:

1. В файл Terminal.ini добавлена константа SolidRectangle_Padding_%, задающая (в процентах от размера знакоместа) отступ закраски от краёв знакоместа при выводе символа "Закрашенный прямоугольник". Допустимые значения 0..20, значение по умолчанию 5:



SolidRectangle_Padding_% = 5

Для шрифта по-умолчанию зависимость отступа закраски знакоместа от значения константы SolidRectangle_Padding_%, следующая:



| Значение | Отступ сверху и снизу | Отступ слева и справа |
| ( % ) | ( пикселов ) | ( пикселов ) |
-----------------------------------------------------------------
| 0 | 0 | 0 |
| 5 | 1 | 1 |
| 10 | 2 | 1 |
| 15 | 3 | 2 |
| 20 | 4 | 2 |



2. В файл Terminal.ini добавлена настройка


DestructiveTabs = 1
в зависимости от которой табуляция вызывает вывод пробелов ( по умолчанию ) или только перемещение курсора ( при DestructiveTabs = 0 ).


3. В файл Terminal.ini добавлена константа


Strip_8Bit_HighLimit = 0240
задающая максимальное значение байта, до которого 8-й бит очищается. Минимальное значение 0177 - отключает очистку 8-го бита для всех байтов, максимальное значение 0377 - включает очистку 8-го бита для всех байтов. Значение по-умолчанию 0240 - очищает 8-й бит у управляющих символов и пробела.


4. Параметры настройки консоли


LeftDumpSeparator="«"
RightDumpSeparator="»"
стали базовыми и теперь задаются в ini-файле класса: Console.ini .


5. Количество режимов консольного дампа увеличено до 8-ми ( 0..7 ). Режим дампа задаётся константой


DumpMode = 1
в файле конфигурации. Допустимые значения 0, 1, 2, 3, 4, 5, 6, 7. Значение по-умолчанию 1.


6. В файл Console.ini добавлена константа


DumpCols = 20
задающая количество столбцов консольного дампа в режимах дампа 4, 5, 6, 7. Минимальное значение 1. Максимальное значение 512. Значение по-умолчанию 20.


7. В файл Console.ini добавлена константа


DumpRadix = 8
задающая основание счисления для формирования дампа. Допустимые значения 8, 10, 16. Значение по-умолчанию 8.


8. Исправлен код начального загрузчика с HX, находящийся в файлах HXBOOT.MAC и HX Boot.odt.


9. Монитор RT11SJ.SYS в образе HXsys54.DSK заменён на версию Y2K 8_Bit.


10. В образы HXsys57.DSK и HXsys54.DSK добавлена программа DAY.SAV, запускаемая в процессе загрузки.

form
22.12.2012, 20:05
2. В файл Terminal.ini добавлена настройка


DestructiveTabs = 1
в зависимости от которой табуляция вызывает вывод пробелов ( по умолчанию ) или только перемещение курсора ( при DestructiveTabs = 0 ).

Эмулятор VT52 с настройкой по умолчанию, делающей его несовместимым ни с одной из реализацией VT52? :)

Patron
22.12.2012, 20:16
Эмулятор VT52 с настройкой по умолчанию, делающей его несовместимым ни с одной из реализацией VT52?Это (насколько я понял) - режим 15ИЭ-00-013.
Когда в модульном API появятся пресеты - пресетом терминала по-умолчанию будет эмуляция 15ИЭ-00-013.

Мне удалось найти программы, не работающие без DestructiveTabs.
А вот можно ли найти такие, которые не смогут нормально формировать изображение в режиме DestructiveTabs..

form
22.12.2012, 20:20
Это (насколько я понял) - режим 15ИЭ-00-013.

Нет.
15ИЭ в режиме VT52 ведет себя также - TAB не стирает ничего.
Про не-VT52 ничего не скажу, не помню так как не использовал его у нас никто.

---------- Post added at 23:20 ---------- Previous post was at 23:17 ----------

Правда может там единичка для настройки на эту тему была - не помню уже.
Помню что насчет врапа в конце строки единичка в строке настроек была :)

Patron
22.12.2012, 20:24
15ИЭ в режиме VT52 ведет себя также - TAB не стирает ничего.КСМ точно не стирает.

Но какие программы всё же "обломает" DestructiveTabs ?

Ни одной такой пока не встретил.


может там единичка для настройки на эту тему былаТам настроек чёртова куча - знать бы их все..

Мне пока известны только эти:


9600 0010 1110 0000 0000 09 15 00
---- ^ ^^^ ^ \ часы /
^ ! !!! !
! ! !!! +------------ выключить служебную строку
! ! !!+----------------------- система команд N2
! ! !!
! ! !+------------------------ отсутствие звукового сигнала
! ! ! при нажатии клавиши
! ! +------------------------- отсутствие звукового сигнала
! ! в 72 позиции курсора
! +---------------------------- код КОИ-7 Н0/1
+------------------ Скорость обмена информацией терминала с ЭВМ

form
22.12.2012, 20:29
Но какие программы всё же "обломает" DestructiveTabs ?

Вряд-ли. Такие программы сами отрабатывают стирание.
TED/USED к примеру - работают на классическом VT52.




9600 0010 1110 0000 0000 09 15 00
---- ^ ^^^ ^ \ часы /
^ ! !!! !
! ! !!! +------------ выключить служебную строку
! ! !!+----------------------- система команд N2
! ! !!
! ! !+------------------------ отсутствие звукового сигнала
! ! ! при нажатии клавиши
! ! +------------------------- отсутствие звукового сигнала
! ! в 72 позиции курсора
! +---------------------------- код КОИ-7 Н0/1
+------------------ Скорость обмена информацией терминала с ЭВМ

BLINK CTRL вроде была еще настройка - вместо CTRL-символов выводились моргающие символы+100.
Или отдельная клавиша была - не помню уже. Помню еще поведение, что можно было ВР спичкой зажать, а НР начинал как полноценный shift при этом работать :)

Patron
22.12.2012, 20:34
Вряд-ли.Я имею в виду относительно свежие программы для нормального режима, у которых при DestructiveTabs = 1 не могла бы правильно формироваться картинка.

Мне такая ни одна не попадалась.

form
22.12.2012, 20:36
Я имею в виду относительно свежие программы для нормального режима, у которых бы при DestructiveTabs = 1 не могла правильно формироваться картинка.
Мне такая ни одна не попадалась.

А какое отношение "нормальный" режим к VT52 имеет? Там ни один код с VT52 не был совместимым :)

Patron
22.12.2012, 20:39
А какое отношение "нормальный" режим к VT52 имеет?Вижу, что неправильно я вопрос формулирую. Попробую ещё раз.

Я имею в виду относительно свежие программы, работающие с VT100 в режиме совместимости с VT52, у которых при DestructiveTabs = 1 не могла бы правильно формироваться картинка.

Мне такая ни одна не попадалась.

form
22.12.2012, 20:40
Вижу, что неправильно я вопрос формулирую. Попробую ещё раз.

Я имею в виду относительно свежие программы, работающие с VT100 в режиме совместимости с VT52, у которых при DestructiveTabs = 1 не могла бы правильно формироваться картинка.

Мне такая ни одна не попадалась.

Это можно проверить - VT220 есть.

Patron
22.12.2012, 20:45
Это можно проверить - VT220 есть.Вот это я и имел в виду. Я нашёл пока 1 программу, которая не может нормально формировать картинку без DestructiveTabs = 1.

Так что в поисках "режима TAB, максимально совместимого с большинством реальных программ" - счёт пока 1:0 в пользу DestructiveTabs = 1.

form
22.12.2012, 20:59
Вобщем проверка простой программой показала: на настоящем VT220 при переходе в VT52 режим табы работают как обычно - ничего не стирая. На SecureCRT - TAB стирает. Там вроде есть ESC последовательность которая переключает это дело...


#include <stdio.h>

int
main(void)
{
(void)printf("\033[?2l");
(void)printf("\033H\033J");
(void)printf("01234567890123456789");
(void)printf("\033H\t#\n");

return (0);
}

На VT220:


01234567#90123456789

В SecureCRT


#90123456789

---------- Post added at 23:59 ---------- Previous post was at 23:47 ----------

А что перестанет работать навскидку при destructive tabs - это все DECовские экранные программы :)
Так, что счет много:0 в пользу не-destructibve tabs :)

Patron
22.12.2012, 22:37
все DECовские экранные программыНо хоть одна-то конкретная есть, или им всем режим TAB в VT52 Mode без разницы..

form
22.12.2012, 22:51
K52, EDT, TPU, EVE

Patron
22.12.2012, 23:11
K52, EDT, TPU, EVEТ.е. нормально работать в этих программах из SecureCRT невозможно.

Я, помнится, работал с K52 на ДВК - что там разрушается в режиме DestructiveTabs = 1 ?

form
22.12.2012, 23:13
Т.е. нормально работать в этих программах из SecureCRT невозможно.

Я, помнится, работал с K52 на ДВК - что там разрушается в режиме DestructiveTabs = 1 ?

Возможно и нормально работают, но они не пытаются переключиться в VT52 режим так как видят, что это VT220. Другое дело если терминал позиционирует себя как VT52, но не работает как он.

---------- Post added at 02:13 ---------- Previous post was at 02:12 ----------

Там в пределах строки позиционирование можнт выполняться табуляцией. Помню натыкался где-то когда от этого текст стирался.

Patron
22.12.2012, 23:16
Возможно и нормально работаютА какая программа именно не работает как надо с SecureCRT из-за разрушающей табуляции ?

Ведь, у SecureCRT (если я правильно понимаю) разрушающая табуляция и в VT52 Mode, и в VT100 Mode..

form
22.12.2012, 23:17
А какая програма именно не работает с SecureCRT из-за разрушающей табуляции ?

Ведь, у SecureCRT (если я правильно понимаю) разрушающая табуляция и в VT52 Mode, и в VT100 Mode..

Еще раз - никакая так как SecureCRT эмулирует VT220 и ни одной проге в голову не придет переключаться в VT52 режим.
Проблему встречал на эмуляторах VT52.
В не VT52 режимах видимо TAB не используется.

Patron
22.12.2012, 23:20
SecureCRT эмулирует VT220А в режиме VT220 у него табуляция не разрушающая ?
Это точно?

form
22.12.2012, 23:21
Вобщем пусть остается как есть, наткнусь на проблему - посмотрим.
А не проявится так и фиг с ней - просто поставлю как положено...

---------- Post added at 02:21 ---------- Previous post was at 02:20 ----------


А в режиме VT220 у него табуляция не разрушающая ?
Это точно?

Разрушающая.
Но в режиме VT220 это управляемое свойство которое программа может сама настроить. Причем если не ошибаюсь, INQUIRE возвращает текущее состояние этого параметра.

Patron
22.12.2012, 23:24
Но в режиме VT220 это управляемое свойство которое программа может сама настроить. Причем если не ошибаюсь, INQUIRE возвращает текущее состояние этого параметра.Т.е. есть реальный способ заставить SecureCRT в режиме VT220 делать неразрушающую табуляцию.

А как надо модифицировать тест, чтобы это проверить..

form
22.12.2012, 23:26
Т.е. есть реальный способ заставить SecureCRT в режиме VT220 делать неразрушающую табуляцию.

А как надо модифицировать тест, чтобы это проверить..

Сейчас поищу описание ESC последовательностей...

---------- Post added at 02:26 ---------- Previous post was at 02:24 ----------

Навскидку не попалось, позже доку по VT220 посмотрю.

Patron
23.12.2012, 00:02
Прочитал DEC VT240 programmer reference manual - там нет настройки DestructiveTabs.

Похоже, что SecureCRT делает разрушающую табуляцию всегда.

А какие экранные программы из-за этого не могут нормально работать ?

form
23.12.2012, 00:03
Прочитал DEC VT240 programmer reference manual - там нет настройки DestructiveTabs.

Похоже, что SecureCRT делает разрушающую табуляцию всегда.

А какие экранные программы из-за этого не могут нормально работать ?

EDT работает, TPU/EVE косячат. Из-за этого или нет - понятия не имею.
А вот K52 точно ловил на VT52 нерабочесть из-за такого.
И еще был косяк когда некоторые эмуляторы по <ESC>J стирали экран - вылезало только в DECовских прогах.

Patron
23.12.2012, 00:34
TPU/EVE косячат. Из-за этого или нет - понятия не имею. А вот K52 точно ловил на VT52 нерабочесть из-за такого.Не зря же я сделал для консоли целых 8 режимов дампа выводимых символов - можно подключить консоль параллельно терминалу и как только на терминале какой-то глюк - тут же смотреть в консольном дампе, какие коды шли на экран.

form
23.12.2012, 00:36
Не зря же я сделал для консоли целых 8 режимов дампа выводимых символов - можно подключить консоль параллельно терминалу и как только на терминале какой-то глюк - тут же смотреть в консольном дампе, какие символы шли на экран.

Да, только это никак не поможет разобраться в чем косяк в SecureCRT :)
К слову, косяка вроде нет если использовать XTerm с моими настройками VT220.

Patron
23.12.2012, 00:44
Точно определить, какая программа и в каких случаях испытывает проблемы при разрушающих табуляциях - полезно и с познавательной, и с практической точек зрения. Не исключено, что VT52.exe - единственная терминалка, позволяющая настраивать способ вывода табуляции.

form
23.12.2012, 00:47
Не исключено, что VT52.exe - единственная терминалка, позволяющая настраивать способ вывода табуляции.

Я даже больше скажу.
Это вообще единственная программа которая таки эмулирует VT52, а не заявляет, что умеет это делать :)
Ну E11 не в счет, им тоже можно, но фич меньше.

form
23.12.2012, 03:32
Соврал я насчет SecureCRT.
Ничего там TAB не стирает.
Просто сетевой терминал по умолчанию настроен на запрет аппаратного таба и выводит пробелы. Если переключить - все как обычно работает.

Так что касаемо проги, может просто надо терминал переключить: SET TT [NO]TAB :)
И многие еще от SET TT [NO]CRLF зависят.

Patron
23.12.2012, 11:57
Обновилась текущая сборка эмулятора терминала типа VT52: VT52_23.12.12_11-45.

Изменения:

1. Исправлена ошибка в реализации консольного дампа.

Patron
23.12.2012, 19:18
Обновилась текущая сборка эмулятора терминала типа VT52: VT52_23.12.12_18-30.

Изменения:

1. Исправлена ошибка в применении тем оформления.

form
29.12.2012, 01:04
1. В файл Terminal.ini добавлена константа SolidRectangle_Padding_%, задающая (в процентах от размера знакоместа) отступ закраски от краёв знакоместа при выводе символа "Закрашенный прямоугольник".

Помогает привести графический символ "a" примерно в тот вид который он имеет на VT52, но одновременно ломает символ <DEL>, отображаемый советскими терминалами.
Кстати хорошо бы иметь возможность отключать отображение этого символа (DEL) так как некоторые программы выводят его на экран исходя из того, что он непечатный.

Titus
30.12.2012, 22:06
ghKeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL, KeyboardHook, ghInstance)

Очень странно, но у меня почему-то такой перехват не работает. Вобще не попадает в KeyboardHook. Причем, если ставлю вместо WH_KEYBOARD_LL - WH_KEYBOARD, то попадает. Сверялся с MSDN, вроде все делаю правильно. В чем может быть загвоздка? Видел в сети, что не только у меня такая проблема, но ответа пока что не нашел.

---------- Post added at 21:36 ---------- Previous post was at 21:27 ----------

Так, кажется понял:


The global hooks are a shared resource, and installing one affects all applications in the same desktop as the calling thread. All global hook functions must be in libraries. Global hooks should be restricted to special-purpose applications or to use as a development aid during application debugging. Libraries that no longer need a hook should remove its hook procedure.

Т.е. все глобальные хуки должны быть БИБЛИОТЕКАМИ! А как быть, если я не хочу делать хук библиотекой? А чтобы он был в моем запускаемом файле? Этоже хрен какие костыли получаются.

---------- Post added at 21:43 ---------- Previous post was at 21:36 ----------

Очевидно, надо придумать, как иметь библиотеку (раз уж без нее нельзя), в теле моего экзешника.

---------- Post added at 22:06 ---------- Previous post was at 21:43 ----------

В общем, я так понял, что иметь .dll в теле програмы нельзя... Хм... Может можно создать какой-то новый процесс, который как бы .dll?

Patron
30.12.2012, 22:56
Т.е. все глобальные хуки должны быть БИБЛИОТЕКАМИ!Не знаю как, но у меня глобальный хук работает в обычном exe-файле.

И в XP, и в Висте - без проблем работает.

Щас попробую сделать небольшой консольный екзешник, устанавливающий глобальный хук..

Titus
30.12.2012, 23:05
Не знаю как, но у меня глобальный хук работает в обычном exe-файле.

И в XP, и в Висте - без проблем работает.

Щас попробую сделать небольшой консольный екзешник, устанавливающий глобальный хук..

Оки.

form
30.12.2012, 23:15
И в XP, и в Висте - без проблем работает.

И даже на виндовс 8 :)

Patron
31.12.2012, 01:11
Глобальный хук работает только тогда, когда установившее его приложение проверяет очередь сообщений.

В приложении - программа, которая глобально отключает NumLock на 20 секунд и пишет все нажатые клавиши в GlobalHook.log

...

v1.1 делает то же самое, не отнимая процессорного времени.

...

Titus
31.12.2012, 04:27
Действительно, работает.

Буду разбираться, почему.

И что понимается под проверкой очереди сообщений.

---------- Post added at 02:12 ---------- Previous post was at 02:09 ----------

Если под очередью сообщений подразумевается PeekMessage() и т.д., то у меня тоже это все проверяется, но хук не вызывается)

---------- Post added at 03:45 ---------- Previous post was at 02:12 ----------

Перенес затем один в один обработчик в свой эмулятор - не работает)

Не понимаю, как из-за сообщений что-то там вообще может зависеть. Откуда такая информация? Чисто экспериментально?

У тебя они обрабатываются так:

if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
if( msg.message == WM_QUIT ) break;
}


а у меня так:


if (PeekMessage(&msg, NULL, 0, 0, 0)) {
if (GetMessage(&msg, NULL, 0, 0)) { // Получить сообщение
TranslateMessage(&msg); // Если сообщение не QUIT,
DispatchMessage(&msg); // оттранслировать его окну
}
else SysExit(); // Иначе выйти закрыв все устройства
}

Разницы никакой.


Еще точнее уточнил.
Если активно окно эмулятора, хук не работает. Если не активно работает. Опять активно - не работает.

Причем обработчик окна меняю даже на полностью дефолтный типа:

return (DefWindowProc(hWnd,Message,wParam,lParam));

Это ничего не меняет. Т.е. зависит не от функции обработки окна а... непонятно опять от чего)

Patron
31.12.2012, 04:44
зависит не от функции обработки окна а... непонятно опять от чего)У меня эмулятор многопоточный. Есть поток интерфейса и потоки эмуляции. Поток интерфейса мало что делает. Главным образом - ждёт сообщений. Ну, разве что активное окно 60 раз в секунду перерисовывает. Может, поэтому я пока и не столкнулся с проблемами при работе хука.

---------- Post added at 03:44 ---------- Previous post was at 03:36 ----------


Если активно окно эмулятора, хук не работает. Если не активно работает. Опять активно - не работает.Это похоже на последствия предыдущих экспериментов, когда при получении фокуса окно эмулятора криво устанавливает какой-то свой кривой обработчик глобального хука, а после потери фокуса - убирает его и опять всё приходит в норму.

Titus
31.12.2012, 13:11
Это похоже на последствия предыдущих экспериментов, когда при получении фокуса окно эмулятора криво устанавливает какой-то свой кривой обработчик глобального хука, а после потери фокуса - убирает его и опять всё приходит в норму.
В том-то и дело, что никаких хуков я не устанавливаю.

Только что вспомнил, что я использую DirectInput привязанный к моему окну. Может это он делает.
Проверю.

Patron
31.12.2012, 13:42
Проверю.Когда программа имеет рабочий (с интересующей точки зрения ) вариант и не рабочий - причину неработоспособности легко определить "методом половинного деления" - добавляя в рабочий вариант куски нерабочего до тех пор, пока не обнаружится тот кусок, при добавлении которого нормальная работа прекращается.

Иногда так и приходится приятать весь программный код ( кроме начального создания главного окна программы ) в комментариях, а потом добавлять по-немногу, чтобы выловить некоторые глюки.

Titus
31.12.2012, 14:33
Когда программа имеет рабочий (с интересующей точки зрения ) вариант и не рабочий - причину неработоспособности легко определить "методом половинного деления" - добавляя в рабочий вариант куски нерабочего до тех пор, пока не обнаружится тот кусок, при добавлении которого нормальная работа прекращается.

Программа гигантская, чтобы так легко было части прятать)
Но попробую сперва отключить DirectInput, посмотрю, чего получится.

А запусти мой эмуль параллельно своей тестилке хуков, посмотри, работает ли блокировка нумлока при активном моем окне.

---------- Post added at 14:33 ---------- Previous post was at 14:24 ----------

Проверил. Отключил DirectInput, все заработало.

Но проблема в том, что DirectInput мне очень необходим)
Надо будет почитать доки к нему.

Интересно, почему он нарушает глобальный хук.
Причем, совершенно штатно, т.к. никаких кривых методов его использования я не применяю.

Patron
31.12.2012, 15:53
DirectInput мне очень необходим)Если DirectInput при получении окном фокуса устанавливает свой кривой глобальный хук ( не вызывающий после завершения обработки нажатия следующий глобальный хук в цепочке глобальных хуков ) - то, возможно, если каждый раз устанавливать свой глобальный хук после того, как это сделал DirectInput - то всё заработает.

Проще говоря - при получении фокуса окном нужно проверить следующие варианты:

1. Установить свой хук сразу ( и проверить успешность его установки ).

2. Установить сначала вместо хука таймер на 50 мс и после получения сигнала таймера - установить хук. Пользователь вряд ли успеет нажать на клавишу быстрее чем через 50 мс после активации окна.

Titus
31.12.2012, 16:53
Если DirectInput при получении окном фокуса устанавливает свой кривой глобальный хук ( не вызывающий после завершения обработки нажатия следующий глобальный хук в цепочке глобальных хуков ) - то, возможно, если каждый раз устанавливать свой глобальный хук после того, как это сделал DirectInput - то всё заработает.

Проще говоря - при получении фокуса окном нужно проверить следующие варианты:

1. Установить свой хук сразу ( и проверить успешность его установки ).

2. Установить сначала вместо хука таймер на 50 мс и после получения сигнала таймера - установить хук. Пользователь вряд ли успеет нажать на клавишу быстрее чем через 50 мс после активации окна.

Я пробовал устанавливать хук при получении фокуса окном - не помогает. Наличие активного окна с подключенным директинпутом этот хук игнорирует.

С задержкой не пробовал, но это какие-то дикие костыли.

Не должен директинпут быть кривым.

Попробую инициализировать более новую версию. Ведь у меня используется интерфейс DirectInput, а не, скажем, DirectInput8, для совместимости даже с древними версиями виндовсов и дирекиксов. В принципе, функционал особо в них не менялся, но может древняя версия интерфейса как раз глючная.

Patron
31.12.2012, 17:10
Наличие активного окна с подключенным директинпутом этот хук игнорирует.Такое впечатление, что DirectInput оправдывает своё название, отключая обычную обработку нажатий клавиш в Windows..

Тот факт, что хук нормально работает при выходе из окна с DirectInput - позволяет предположить, что когда DirectInput активен - Windows обрабатывает нажатия клавиш совсем не так, как обычно и ( в частности ) глобальные хуки не вызываются вообще.

Titus
31.12.2012, 17:19
Тот факт, что хук нормально работает при выходе из окна с DirectInput - позволяет предположить, что когда DirectInput активен - Windows обрабатывает нажатия клавиш совсем не так, как обычно и ( в частности ) глобальные хуки не вызываются вообще.

Но ведь системные клавиши работают! Капслоки всякие тоже зажигают лампочки.

Кстати, как управлять этими лампочками? Эмулятор Амиги умеет. Вариант - посылать коды нажатий нумлоков и капслоков через хук - не канает, т.к. это позволяет ИНВЕРТИРОВАТЬ лампочку, но не управлять ей напрямую.

Patron
31.12.2012, 19:02
это позволяет ИНВЕРТИРОВАТЬ лампочку, но не управлять ей напрямую.Сначала надо прочитать состояние лампочки (которое отслеживает Windows) и не инвертировать лампочку, если она уже в нужном состоянии:



void SetCapsLock( bool bState )
{
BYTE keyState[256];

GetKeyboardState((LPBYTE)&keyState);

if( (bState && !(keyState[VK_CAPITAL] & 1)) ||
(!bState && (keyState[VK_CAPITAL] & 1)) )
{
// Simulate a key press
keybd_event( VK_CAPITAL,
0,
KEYEVENTF_EXTENDEDKEY | 0,
0 );

// Simulate a key release
keybd_event( VK_CAPITAL,
0,
KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,
0);
}
}


---------- Post added at 18:02 ---------- Previous post was at 17:58 ----------


Но ведь системные клавиши работают! Капслоки всякие тоже зажигают лампочки.DirectX - это подсистема Windows, написанная тем же автором.

Titus
31.12.2012, 19:59
Сначала надо прочитать состояние лампочки (которое отслеживает Windows) и не инвертировать лампочку, если она уже в нужном состоянии
Т.е. все-таки метода управления ими напрямую нету?
Зато можно читать? Ну и то хорошо.

Но тогда по-любому через хук.

Странно, что он не дружит с директинпутом, тем более написанным авторами Windows.

---------- Post added at 19:26 ---------- Previous post was at 19:20 ----------

Получается, что массив состояния клавиш хранит не состояние CapsLock - нажата / не нажата, а состояние, активирована / не активирована?

---------- Post added at 19:57 ---------- Previous post was at 19:26 ----------

Хм, а вот это меня насторожило:


While DirectInput forms a part of the DirectX library, it has not been significantly revised since DirectX 8 (2001–2002). Microsoft recommends that new applications make use of the Windows message loop for keyboard and mouse input instead of DirectInput (as indicated in the Meltdown 2005 slideshow[1]), and to use XInput instead of DirectInput for Xbox 360 controllers.

---------- Post added at 19:59 ---------- Previous post was at 19:57 ----------

Т.е. микрософт не рекоммендует использовать директинпут для клавиатуры, а вместо него систему сообщений. Эту тормознутую бяку (как я ее считаю).

Patron
31.12.2012, 20:01
Т.е. все-таки метода управления ими напрямую нетуВ смысле, так, чтобы обмануть Windows? Чтобы Windows думала, что лампочка ещё горит, а мы ( хе-хе! ) её уже потушили. А зачем такое может потребоваться..

Выше я привёл код функции управления состоянием лампочки CapsLock. После вызова SetCapsLock(1) лампочка гарантированно будет гореть, а после SetCapsLock(0) - гарантированно гореть НЕ будет. Какие проблемы.. Что ещё надо?


Получается, что массив состояния клавиш хранит не состояние CapsLock - нажата / не нажата, а состояние, активирована / не активирована?В бите 15 хранится [нажата / не нажата], а в бите 0 - [активирована / не активирована] ( позже выяснилось, что это ошибочное утверждение - т.к. в матрице хранятся байты ).

---------- Post added at 19:01 ---------- Previous post was at 18:59 ----------


систему сообщений. Эту тормознутую бяку (как я ее считаю).Ну, миллион сообщений в секунду Windows без проблем пропускает.

Titus
31.12.2012, 20:03
Мне директинпут очень нравится. Он быстрый, дает состояние ВСЕХ клавиш быстренько в одном массиве. А так же различает Enter на основной и дополнительной клавиатурах.

Patron
31.12.2012, 20:13
Мне директинпут очень нравится. Он быстрый, дает состояние ВСЕХ клавиш быстренько в одном массиве. А так же различает Enter на основной и дополнительной клавиатурах.


BYTE keyState[256];
GetKeyboardState((LPBYTE)&keyState);
Даёт одним махом состояние всех клавиш и всех лампочек. Причём, Windows дополнительно поддерживает специальные виртуальные клавиши, отражающие "суммарное" состояние пар контролов, шифтов и альтов.

Если какой-то информации не хватает - глобальный хук можно не отключать и он всегда будет в курсе всех нажатий, устанавливая для программы любые флаги, какие надо.

Titus
31.12.2012, 20:23
А эта функция относится к чему?
Связана ли она с фокусом окна?
Позволяет ли отличить Enter на основной и доп-клавиатуре?
С какой версии виндовс она появилась?

---------- Post added at 20:23 ---------- Previous post was at 20:16 ----------


В бите 15 хранится [нажата / не нажата], а в бите 0 - [активирована / не активирована].

Точно в 15? Массив-то байтовый.

Patron
31.12.2012, 20:36
А эта функция относится к чему?

GetKeyboardState function (Windows) (http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms646299(v=vs.85).aspx)


Связана ли она с фокусом окна?Функция возвращает матрицу виртуальных клавиш текщего потока, которая по умолчанию совпадает с матрицей виртуальных кавиш Windows, но может локально изменяться вызовами SetKeyboardState (http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms646314(v=vs.85).aspx).


Позволяет ли отличить Enter на основной и доп-клавиатуре?Список виртуальных клавиш Windows выглядит так Virtual-Key Codes (http://msdn.microsoft.com/ru-ru/library/windows/desktop/dd375731(v=vs.85).aspx), есть ли там флаг, позволяющий отличить PadEnter - не знаю. Можно написать тест, который будет после каждого нажатия клавиши сравнивать матрицу с предыдущей и показывать отличия. Если у PadEnter нет своего флага - можно научить глобальный хук писать флаг состояния PadEnter в отдельную переменную или в ту же матрицу виртуальных клавиш ( там есть свободные ячейки ).


С какой версии виндовс она появилась?Проклятый Microsift теперь упорно делает вид, будто первой Windows была Windows 2000, поэтому про более ранние версии ничего узнать нельзя.

Titus
31.12.2012, 20:40
Функция возвращает матрицу виртуальных клавиш текщего потока, которая по умолчанию совпадает с матрицей виртуальных кавиш Windows

Понятно, значит не отслеживает. Директинпут настраивается, чтобы реагировать на клавиши только при активном окне. Ну это поправимо.

Patron
31.12.2012, 20:41
Точно в 15? Массив-то байтовый.Пардон, это я спутал с GetKeyState (http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms646301(v=vs.85).aspx).

Что в байтовой матрице происходит - надо смотреть.

Titus
31.12.2012, 20:42
Список виртуальных клавиш Windows выглядит так Virtual-Key Codes (http://msdn.microsoft.com/ru-ru/library/windows/desktop/dd375731(v=vs.85).aspx), есть ли там флаг, позволяющий отличить PadEnter - не знаю. Можно написать тест, который будет после каждого нажатия клавиши сравнивать матрицу с предыдущей и показывать отличия. Если у PadEnter нет своего флага - можно научить глобальный хук писать флаг состояния PadEnter в отдельную переменную или в ту же матрицу виртуальных клавиш ( там есть свободные ячейки )
В этом списке что-то не нашел. Да и на форуме уже проскакивала тема, что нельзя отличить эти два энтера.

---------- Post added at 20:42 ---------- Previous post was at 20:41 ----------

А как узнать в глобальном хуке состояние PadEnter? Или у него еще свои коды виртуальных клавиш?

Patron
31.12.2012, 20:52
А как узнать в глобальном хуке состояние PadEnter?Если эта клавиша при нажатии генерит автоповтор - то когда бы ни был подключен глобальный хук - он состояние этой клавиши тут же "подцепит".

Проверить просто - тестовая программка с хуком есть. Хук вызывается при каждом нажатии, автоповторе и отжатии каждой клавиши, получая её скан-код с битом нажата/отжата.

Формат аргументов глобального хука описан здесь: GlobalKeyboardHook (http://msdn.microsoft.com/en-us/library/windows/desktop/ms644985(v=vs.85).aspx).

Titus
31.12.2012, 21:06
Если эта клавиша при нажатии генерит автоповтор - то когда бы ни был подключен глобальный хук - он состояние этой клавиши тут же "подцепит".
Я имею ввиду, как хук позволяет отличить основной Enter от нупадовского? У него есть разные коды для этих клавиш?

Patron
31.12.2012, 21:22
Я имею ввиду, как хук позволяет отличить основной Enter от нупадовского? У него есть разные коды для этих клавиш?В приложении продвинутая версия хук-теста.

Вот, что она пишет в лог при нажатии и отжатии сначала обычного, а потом дополнительного Enter:



wp[0x100] ; vkCode[0xD] ; scanCode[0x1C] ; flags[0x0]
wp[0x101] ; vkCode[0xD] ; scanCode[0x1C] ; flags[0x80]
wp[0x100] ; vkCode[0xD] ; scanCode[0x1C] ; flags[0x1]
wp[0x101] ; vkCode[0xD] ; scanCode[0x1C] ; flags[0x81]
Отличие есть - это флаг доп. клавиатуры в наборе флагов.

...

Titus
31.12.2012, 21:33
Отличие есть - это флаг доп. клавиатуры в наборе флагов.

Только что сделал тест для сравнения виртуальных кодов клавиш через GetKeyboardState(). В ней, к сожалению, нажатия разных энтеров ТОЧНО не различаются.

Опять, получается, костыли всякие.

---------- Post added at 21:33 ---------- Previous post was at 21:30 ----------


Вот, что она пишет в лог при нажатии и отжатии сначала обычного, а потом дополнительного Enter:



wp[0x100] ; vkCode[0xD] ; scanCode[0x1C] ; flags[0x0]
wp[0x101] ; vkCode[0xD] ; scanCode[0x1C] ; flags[0x80]
wp[0x100] ; vkCode[0xD] ; scanCode[0x1C] ; flags[0x1]
wp[0x101] ; vkCode[0xD] ; scanCode[0x1C] ; flags[0x81]
Отличие есть - это флаг доп. клавиатуры в наборе флагов.

...

Все правильно, и в доке так сказано:


0 Specifies whether the key is an extended key, such as a function key or a key on the numeric keypad. The value is 1 if the key is an extended key; otherwise, it is 0.

Patron
31.12.2012, 21:34
Опять, получается, костыли всякие.DirectInput - те же самые костыли, только написанные в Микрософте.

Titus
31.12.2012, 21:39
DirectInput - те же самые костыли, только написанные в Микрософте.
Ну в ней хоть все единообразно, в одном массиве, где все клавиши различаются.

Ну, допустим, сделать перехват клавиши дополнительного энтера в хуке. Куда потом его сувать? Придумывать новый сканкод? Это будет самодеятельность, т.к. эти же сканкоды получают другие приложения.

Так же всегда есть задержка между включеним и отключением глобального хука по активизации окна.

Можно, конечно, засинхронизироваться, но это все усложненно.

Patron
31.12.2012, 22:08
Куда потом его сувать?Можно вести полностью свою матрицу всех клавиш - в удобном для себя формате.


Так же всегда есть задержка между включеним и отключением глобального хука по активизации окна.Хук можно включать один раз - при запуске программы. При получении фокуса устанавливать флажок для хука, а при потере - убирать. А уже хук, глядя на этот флажок - будет пропускать или не пропускать нажатие NumLock в Windows.

Чтобы не пустить нажатие в Windows - хук должен сделать return 1;,
а чтобы пропустить - return CallNextHookEx( ghKeyboardHook, nCode, wp, lp );


Кстати - у меня в хук-тесте ошибка, там в CallNextHookEx передаются не оригинальные параметры вызова ( wp и lp ), а переработанные ( wParam и lParam ) - а надо передавать точно те, которые получены хуком.

Titus
31.12.2012, 22:50
Да, я тоже заподозрил там ошибку, но решил, пока сам не разберусь, не говорить)

Попробовал DirectInput8 - все тоже самое, но функционала больше. А так тоже блокирует глобльный хук.

Ну что же, похоже, действительно придется делать хук и в нем формировать массив из клавиш плюс дополнительная клавиша энтера нумпада. Сделаю конвертирование сканкодов VK_ в DIK_, т.к. у меня все заточено под них.

Patron
01.01.2013, 00:44
придется делать хук и в нем формировать массив из клавишГлобальный хук стандартен в модульном API, но на массив клавиш пока стандарта нет - мне этот массив понадобится только в эмуляторе КСМ, делать который я ещё не начал. Поэтому, если есть конструктивные идеи относительно универсального массива клавиш, пригодного для использования в любом эмуляторе - это будет кстати.

Поскольку в модульном API глобальный хук один на все экземпляры программ, использующих этот API - программа не сможет изменять глобальный массив клавиш, а только получать оттуда значения.

Titus
01.01.2013, 03:32
И все-таки меня вот ЭТО настараживает:


Теперь надо сделать небольшое лирическое отступление от данной темы, для лучшего понятия описываемого механизма. В 32-битных (а далее в 64-битных) операционных системах Windows каждый процесс в системе имеет своё собственное обособленное адресное пространство. Обратиться к чужому адресному пространству можно только через несколько API функций и имея определённые привилегии. Т.е. по одному и тому же адресу в разных процессах могут быть совершенно разные данные. Для того чтобы фильтрующая функция могла обработать сообщение, она должна находиться в памяти именно того процесса, которому принадлежит целевое окно и оконная функция. Итак, если хук устанавливается на всю систему, то фильтрующая функция должна быть загружена в каждый процесс, у которого есть хотя бы один цикл сообщений c использованием функций GetMessage или PeekMessage. Единственный стандартный способ загрузки нашего кода в чужой процесс, это использование DLL. Т.е. для нормального функционирования хуков установленных на всю систему необходимо использовать DLL.

Patron
01.01.2013, 04:34
И все-таки меня вот ЭТО настараживает:Чепуха.

Я в этом вопросе собаку съел и в модульном API любой EXE-шник может выступать провайдером глобальной таблицы клавиш, доступной всем процессам Windows, использующим модульный API.

Т.е. код глобального хука есть у всех одновременно запущенных EXE-шников модульного API, но в любой момент времени работает только один из этих глобальных хуков, который и обслуживает глобальную таблицу.

Titus
01.01.2013, 14:07
Тут, как я понял, имеется в виду другое.
Библиотечная функция имеет адресное пространство, доступное всем процессам. А твой конкретный экзешник, внутри которого код хука, может и не быть доступен другим процессам. Может это зависит от конкретной системы, многоядерности или еще чего. Я с этой стороны Виндовс знаю слабо.

Patron
01.01.2013, 14:18
конкретный экзешник, внутри которого код хука, может и не быть доступен другим процессамЭто проблемы Windows. В XP и дальше - глобальный хук прекрасно работает из EXE. Т.к. модульный API работоспособен только в среде XP, то если работает API - работает и глобальный хук.

Titus
01.01.2013, 14:23
Это проблемы Windows. В XP и дальше - глобальный хук прекрасно работает из EXE. Т.к. модульный API работоспособен только в среде XP, то если работает API - работает и глобальный хук.

В общем, это надо попроверять на разных вин-системах, с разными ядрами и многоядерностями. Не с потолка же в MSDN так сказано.

Patron
01.01.2013, 14:53
это надо попроверять на разных вин-системахВот консольный вариант хук-теста (http://zx.pk.ru/attachment.php?attachmentid=39062).

Запускаем, переходим в окно блокнота, давим все кнопки подряд и радуемся.

...

hobot
01.01.2013, 16:39
Запускаем,

Что то не вышло у меня с запуском на ноуте! )

http://savepic.ru/3740038.png

http://savepic.ru/3796377.png

Patron
01.01.2013, 18:21
Что то не вышло у меня с запуском на ноуте!Там резидентный антивирус запрещает глобальные хуки. Нужно "прописать" там тест так же, как "эмулятор ДВК", который на этом ноуте тоже пришлось с бубном запускать.

Titus
01.01.2013, 20:24
Где достать таблицу для:


scanCode

Type: DWORD

A hardware scan code for the key.


хардварных сканкодов клавиш? Единая ли она для винды, или же для разных версий дров, клавиатур и т.д. может отличаться?

Patron
01.01.2013, 21:15
Где достать таблицу для хардварных сканкодов клавиш?Scan Code values generated by the PC Keyboard (http://philipstorr.id.au/pcbook/book3/scancode.htm)


Единая ли она для винды, или же для разных версий дров, клавиатур и т.д. может отличаться?Не зависит от операционки - эти коды генерит контроллер клавиатуры.

Titus
01.01.2013, 23:48
Пока что разбираюсь, как эмулировать зажигание лампочек изнутри функции обработки хука.

Предложенный метод не подходит:

// Simulate a key press
keybd_event( VK_CAPITAL,
0,
KEYEVENTF_EXTENDEDKEY | 0,
0 );

Т.к. он по идее сам и вызовет хук?

Попытка внутри хука менять на лету параметр vkCode, scanCode, да и вообще все - на зажигание лампочки НЕ влияет. Влияет если только прервать цепочку хуков по return (1). А мне нужно не прервать, а подменить один код на другой, чтобы заставить принудительно включить или выключить лампочку.

Patron
02.01.2013, 00:23
Пока что разбираюсь, как эмулировать зажигание лампочек изнутри функции обработки хукаХук нужен только для того, чтобы пропускать или не пропускать "лампочные" нажатия в Windows. Всё остальное должны делать обычные подпрограммы.

Представим предельно сложную ситуацию, когда клавиша CapsLock и лампочка CapsLock никак друг с другом не связаны - нажатия проходят "мимо лампочки", а лампочка напрямую управляется из программы.

Чтобы хук мог отличить обычные нажатия ( которые он запишет в матрице, но не пропустит в Windows ) и фейк-нажатия (которые в нужный момент генерятся программой специально, чтобы переключить лампочку, и не должны влиять на матрицу нажатых клавиш) - то чтобы хук мог их отличать - нужен всего лишь ещё один флаг для хука, который будет устанавливаться подпрограммой управления лампочкой перед посылкой фейк-нажатия и сбрасываться сразу после этого.

Titus
02.01.2013, 00:27
Чтобы хук мог отличить обычные нажатия ( которые он запишет в матрице, но не пропустит в Windows ) и фейк-нажатия (которые в нужный момент генерятся программой специально, чтобы переключить лампочку, и не должны влиять на матрицу нажатых клавиш) - то чтобы хук мог их отличать - нужен всего лишь ещё один флаг для хука, который будет устанавливаться подпрограммой управления лампочкой перед посылкой фейк-нажатия и сбрасываться сразу после этого.
Ну я так и думал.
Просто хорошо было бы, если б были более компактные решения)

Patron
02.01.2013, 00:44
хорошо было бы, если б были более компактные решения)Флаг можно посылать в скан-коде - это даже лучше, т.к. настоящее нажатие точно не сможет встрять. Перед отправкой кода в Windows хук должен этот бит чистить.

Titus
02.01.2013, 00:53
Флаг можно посылать в скан-коде - это даже лучше, т.к. настоящее нажатие точно не сможет встрять. Перед отправкой кода в Windows хук должен этот бит чистить.

Как его засунуть в сканкод?

---------- Post added at 00:53 ---------- Previous post was at 00:48 ----------

Если передавать в поле bScan, то не стремно ли? Считается, что этот параметр не используется, может быть он и не дойдет в каких-то версиях.

Patron
02.01.2013, 01:03
Как его засунуть в сканкодВ параметр dwFlags функции keybd_event (http://msdn.microsoft.com/ru-ru/library/windows/desktop/ms646304(v=vs.85).aspx) - там полно места.

---------- Post added 02.01.2013 at 00:03 ---------- Previous post was 01.01.2013 at 23:59 ----------

А можно и прямо в bScan - он там как раз для того, чтобы "общаться" с хуком.

Titus
02.01.2013, 01:48
Я уже нашел штатный флаг, который устанавливается при симуляции нажатия - это:


4 Specifies whether the event was injected. The value is 1 if the event was injected; otherwise, it is 0.

Patron
02.01.2013, 01:57
Да, в прошлом году я этот флаг тоже нашёл, но за прошедший день упел про него забыть :)