Цитата Сообщение от S_V_B Посмотреть сообщение
Не нравится влияние прерываний на скорость вывода, придется отключать. В связи с этим вопрос, подскажите правильный опрос клавиатуры без прерываний и ЕМТов, и прочих TTYIn.
правильным считается как раз опрос через системный вызов )
я всегда опрашивал раньше с регистры адреса и данных
полистайте тему ПАСКАЛЬ\МАКРО-11 и программирование на УК-НЦ как?

комок шпор


Код:
Вопрос:
Подскажите, как правильно по системному запретить
передачу кодов клавиш от клавиатуры на терминал,
но при этом самому эти коды получать?
Приведу пример: я вывожу какую-то информацию на экран,
после чего спрашиваю "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/


_______________________________________________
[свернуть]


- - - Добавлено - - -

S_V_B, вам надо там свой драйвер загружать и подминать под свой контроль все упр. клавиши - только так )

- - - Добавлено - - -

S_V_B, вот эта авторская игра ведёт себя так как будто написана на движке УК-НЦ который я разыскиваю
https://www.old-games.ru/forum/threa...2#post-1238737

то есть подминает под себя всё и потом начинает игровые экраны выводить )
кстати автор иногда отвечает )