Пользовательский ввод MARS: как я повторяю звездочки из пользовательского ввода? - PullRequest
1 голос
/ 06 мая 2019

Я хотел бы сохранить какой-то тип парольной фразы из пользовательского ввода в MARS. Когда пользователь печатает, я хотел бы, чтобы он отображал * вместо напечатанного символа.

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

Как бы я поступил так?

1 Ответ

0 голосов
/ 06 мая 2019

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

(в нем есть режим «растровая графика», поэтому, я думаю, вы могли бы рисовать глифы * на этом дисплее при чтении ввода с клавиатуры. Но у него нет функций для рисования текста в растровом изображении.)


В POSIX на текстовом терминале это можно сделать, отключив эхо-сигнал TTY и переведя терминал в режим raw (с помощью системного вызова ioctl).

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


Я не вижу поддержки MARS для любого этого в списке системных вызовов. http://courses.missouristate.edu/KenVollmar/mars/Help/SyscallHelp.html

Вы должны добавить новые системные вызовы: http://courses.missouristate.edu/KenVollmar/mars/Help/MarsHelpTools.html описывает, как вы можете написать класс Java для обработки нового системного вызова и подключить его к MARS.

SPIM имеет MMIO-доступ к «терминальному» устройству , где вы можете читать ввод с клавиатуры отдельно от того, как он отображается на экране, но MARS ничего подобного не документирует. Я думаю, что клавиатурный / экранный ввод / вывод MARS доступен только через системные вызовы, а полный набор, описанный в документации, этого не позволяет.


Похоже, что печать символа '\b' (ASCII backspace) не работает, чтобы переместить курсор назад на что-то, набранное пользователем. Вы просто получаете белую коробку с черным контуром.

Возможно, если вы запускаете MARS в режиме без графического интерфейса из командной строки внутри XTerm (или Gnome-терминала или Konsole) на рабочем столе Linux или в окне терминала MacOS X, вы можете получить вывод MARS на терминал, который обрабатывает escape-последовательности и коды перемещения курсора.

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

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

...