Код:
Вопрос:
Подскажите, как правильно по системному запретить
передачу кодов клавиш от клавиатуры на терминал,
но при этом самому эти коды получать?
Приведу пример: я вывожу какую-то информацию на экран,
после чего спрашиваю "Continue?".
Тут человек должен нажать любую клавишу, и программа
продолжится. Если делать опрос клавиш через EMT 340,
то коды клавиш отображаются на экране, а мне этого не надо.
Если же делать через чтение данных напрямую из канала 0
(канал клавиатуры), то символы все равно отправляются в
монитор и потом печатаются. Т.е. какая-то должна быть
системная функция, запрещающая выводить на терминал коды
приходящих клавиш, но я ее не знаю.
Ответ:
Для этого надо установить бит TTSPC$ (12й) в $JSW (44).
к примеру:
Код:
.MCALL .TTYIN,.PRINT,.EXIT
$JSW = 44
TTSPC$ = 10000
TEST: BIS #TTSPC$,@#$JSW
.PRINT #PROMPT
.TTYIN
.EXIT
PROMPT: .ASCII /--->/<200>
печатает подсказку, ждет нажатия клавиши, выходит
Другой вариант - запретить прерывания от клавиатуры
и работать напрямую с регистрами, но этот вариант
несовместим с виртуальными программами и не будет
работать в системах с поддержкой многотерминальности.
---------- Post added at 17:57 ---------- Previous post was at 17:46 ----------
Еще дополнение - иногда полезен бит TCBIT$ (6й) - при его установке
TTINR (EMT 340) не останавливается в ожидании символа, а проходит
дальше с установленным битом C если ничего не нажато.
-------------------------------------------------------------------------------
.Print #NextPage ;Печатаем сообщение "Next page?"
.Print #KeyON ;Включить клавиатуру
BIS #TTSPC$,@#$JSW ;Запрет отображения символов на экране
.TTYIN ;Ожидание нажатия клавиши
CMP R0,#13 ;Если код = 13 (Возврат каретки),
BNE 6$ ;то ожидаем еще один код = 10 (перевод строки)
.TTYIN ;
6$:
.Print #KeyOFF ;Отключить клавиатуру
.Print #NextLine ;Переходим на следующую строку
...
NextPage: .ASCII "Next page?"<128>
NextLine: .ASCII <13><10><128>
KeyOFF: .ASCII <27><91><50><104><128>
KeyON: .ASCII <27><91><50><108><128>
++++++++++++++++++++++++++++++++
К слову коды клавиш/символов вообще
удобнее выносить в начало - к примеру так:
Код:
ESC = ^O33
CR = ^O15
LF = ^O12
================================
^B - Binary
^C - Complement
^D - Decimal
^F - Floating
^O - Octal
^R - Radix50
^X - 16-ричные???
================================
.TITLE TXT -- ПЕЧАТЬ ТЕКСТОВЫХ СТРОК
.MCALL .PRINT
TXT:: MOV (R5)+,R1 ;ЧИСЛО АРГУМЕНТОВ
BEQ 30$ ;EQ - НЕТ АРГУМЕНТОВ
10$: MOV (R5)+,R0 ;АДРЕС ОЧЕРЕДНОГО АРГУМЕНТА
CMP #-1,R0 ;ЕСЛИ -1 - АРГУМЕНТ ПРОПУЩЕН
BEQ 20$ ;...ПРОПУСКАЕМ
.PRINT ;ПЕЧАТАЕМ СТРОКУ
20$: SOB R1,10$ ;ЦИКЛИМСЯ ПОКА ЕСТЬ АРГУМЕНТЫ
30$: RETURN ;ВОЗВРАЩАЕМ УПРАВЛЕНИЕ
.END
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Раз уж есть тема по программированию, предлагаю сюда же
свалить всякие хитрости какие кто пользует
Например такие:
Код:
JSR Rx,@PC ;СОХРАНИТЬ Rx В СТЕКЕ, НЕ ТРОГАЯ PSW
MOV #160000,SP ;ПОЛНАЯ ОЧИСТКА ПАМЯТИ (56Kb)
MOV #4747,@#0 ;И ЧИСТЫЙ ОСТАНОВ БЕЗ ОШИБОК
CLR PC ;В КОНЦЕ
CALL @(SP)+ ;ВЫЗОВ СОПРОГРАММЫ
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
И я тоже добавлю - простой способ разворачивания цикла
2x:
1. Пусть есть цикл, выполняющийся N раз, типа:
mov N,r0
1$: cmd ! некая команда, например, clr(r1)+
sob r0,1$
2. Простой способ разворачивания того ж цикла в линейку:
mov N,r0
inc r0
asr r0
bcc 2$
1$: cmd
2$: cmd
sob r0,1$
Идея состоит в том, чтоб позаботиться о нечётном числе
итераций до начала цикла, и войти внутрь цикла в обход
стандартного начала.
========================================================
Устанавливает цвет курсора
8 цветов от 60 до 67 (третий параметр)
.TTYOUT #33
.TTYOUT #247
.TTYOUT #67
Цвет экрана
.TTYOUT #33
.TTYOUT #242
.TTYOUT #60
Цвет символов
.TTYOUT #33
.TTYOUT #241
.TTYOUT #67
Цвет знакоместа
.TTYOUT #33
.TTYOUT #240
.TTYOUT #60
Установка формата экрана
(61 - 80х24, 62 - 40х24, 63 - 20х24, 64 - 10х24)
.TTYOUT #33
.TTYOUT #246
.TTYOUT #61
Запускаем нужное приложение (на примере 'МЗ1:ДИГГЕР.САЖ')
.MCALL .CHAIN
MOV #^RMZ1,@#500
MOV #^RDIG,@#502
MOV #^RGER,@#504
MOV #^RSAV,@#506
.CHAIN
PROCEDURE WAITKEY;
VAR KEY ORIGIN 177560B: INTEGER;
BEGIN
REPEAT KEY:=0 UNTIL KEY>0
END;
Если завести глобальную переменную
INKEY ORIGIN 177562B: INTEGER;
там будет код последней нажатой клавиши
PROCEDURE gotoXY(X,Y: INTEGER);
BEGIN
WRITE(CHR(27),'Y',CHR(32+Y),CHR(32+X));
END;
---------------------------------------------
Ну да, если буфер переполнен, то устанавливается
бит C в PSW. Поэтому код должен быть таким:
Код:
EMT ^O341
BCS .-2
---------------------------------------------
Код:
.PRINT #TEXT1 ;БЕЗ <CR><LF>
.PRINT #TEXT2 ;<CR><LF> В КОНЦЕ
TEXT1: .ASCII /TEXT/<200>
TEXT2: .ASCIZ /TEXT/
_______________________________________________