БK 0010-01, БК 11М, БК11М+,МС 0511 (УКНЦ)х3, Atari 65XE, Commodore 64, AMIGA 500 (HDD), ZX EVO
Oleg N. Cher(17.03.2020)
SCAN коды клавиатуры УК-НЦ для использования в программах на Паскале.
Да! Хочется повысить эффективность опроса клавиатуры и иметь возможность использовать
в программах на Паскале системные "управляющие" кнопки. Есть вот такой исходник от
Alex_K (С) Scan-code of keys, "Alphaprog", 1993, который на выходе сканкоды выдаёт на экран :
Вопрос к асм-программистам: возможно ли его переписать так, что бы сканкоды былиКод:.TITLE SCAN .IDENT /V01.00/ .MCALL .PRINT,.EXIT BLK: .WORD 0,32,0,0,0 BLK0: .WORD BLK,-1 CHAN2: MOV #BLK0,R0 MOV #5,R1 BR 2$ 1$: MOVB (R0)+,@#176676 2$: TSTB @#176674 BPL 2$ SOB R1,1$ RETURN START: MOV #777,AA MOVB #1,BLK+1 MOV #<$END-$BEGIN>,BLK+6 CALL CHAN2 TSTB BLK BEQ 1$ .PRINT #WARN .EXIT 1$: MOVB #20,BLK+1 MOV #$BEGIN,BLK+6 MOV #<$END-$BEGIN>,BLK+10 CALL CHAN2 MOVB #30,BLK+1 CALL CHAN2 AA: BR . MOVB #2,BLK+1 CALL CHAN2 .EXIT $BEGIN: MOV PC,R1 ADD #HEAD-.,R1 EMT 46 MTPS #200 CLR @#177700 CALL @#104054 MTPS #0 1$: TSTB @#177700 BPL 1$ MOV @#177702,R0 MOV R0,-(SP) MOV #3,R1 CLR R2 MOV PC,R3 ADD #NUM-.,R3 BR 3$ 2$: CLR R2 ROLB R0 ROLB R2 3$: ROLB R0 ROLB R2 ROLB R0 ROLB R2 ADD #60,R2 MOVB R2,(R3)+ SOB R1,2$ MOV PC,R1 ADD #NUM-.,R1 EMT 46 MOV (SP)+,R0 CMPB R0,#204 BNE 1$ MOV PC,R1 ADD #$END$-.,R1 EMT 46 BIS #100,@#177700 MOV #AA/2,@#177010 MOV #NOP,@#177014 RETURN HEAD: .BYTE 14,33,246,62,14 .ASCIZ /Scan-code of keys, "Alphaprog", 1993/<15><12> NUM: .ASCIZ /000 / $END$: .BYTE 33,246,61,15,12,0 .EVEN $END: WARN: .ASCIZ /?SCAN-F-No memory for load/ .END START
значением внешней функции для Паскаля или значением входящей переменной
внешней процедуры? И возможно ли в принципе?
Если для решения задачи какую-то часть кода нужно исполнять в осн. исходнике
- орг. вставку на асм. - главное, что бы заработало?
================================================== =====
Ответ, очевидно: "возможно. переписывайте."
У себя пользуюсь вот этими двумя вызовами, думаю их вполне можно приспособить для вызова из Паскаля:
(осторожно, используются 8-ричные значения 8-[ ]
Код:; Подпрограмма: Ожидание символа с клавиатуры: R1 = полученный символ WTKEY: TSTB @#177560 BPL WTKEY CLR R1 MOVB @#177562, R1 ; символ в R1 CMPB R1, #33 BNE RETN ESCKEY: TSTB @#177560 BPL ESCKEY MOVB @#177562, R1 ; символ в R1 BIS #15400,R1 ; #33 в верхний байт RETN: RETURN ; Подпрограмма: Получение символа с клавиатуры: флаг Z=0 = есть символ, R1 = полученный символ GETKEY: TSTB @#177560 ; есть символ? BPL 10$ ; нет символа => выходим MOVB @#177562, R1 ; символ в R1 CMPB R1, #33 ; Esc ? BEQ ESCKEY RETURN 10$: CLR R1 ; возвращаем пустой код клавиши RETURN
Последний раз редактировалось nzeemin; 26.03.2020 в 12:08.
hobot(27.03.2020), Oleg N. Cher(26.03.2020)
А можно спросить: зачем нужно делать CLR R1 перед MOVB @#177562, R1 ?
Я не стебаюсь, если что. Пытаюсь разобраться в местном асме. Вот здесь такая чистка регистра не делается:
Код:TSTB @#177560 ; готовность есть? BPL CY1 ; символ не готов! INSYM: MOVB @#177562,R0 ; прочитать символ
Oleg N. Cher, вероятно он действительно лишний, остаток какого-то копипаста.
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
Если BIS #15400,R1 это действительно аналог операции OR на других процессорах и устанавливает только указанные биты, а прочие игнорирует, тогда CLR R1 всё-таки нужна - она обнуляет старший байт R1.
Но тогда подобная же операция нужна и в подпрограмме GETKEY. Смотрите. В GETKEY после MOVB @#^O177562,R1 старший байт R1 неопределён, и если полученный код Esc, то BIS просто наложит на него маску ^O15400 с неопределённым результатом. А если полученный код не Esc, то будет просто возврат с неопределённым же старшим байтом. Я всё правильно описал? Т.е. если бы старший байт был незначащий, тогда ладно. Но он ведь может иметь значащий код ^O33.
MOVB не так работает. он возьмёт старший бит от байта из источника, и раскопирует его вверх. Т.е. в верхнем байте будет либо 0, либо 255.
Может это как раз и осталось от времён когда я этого не понимал :-)
Oleg N. Cher(26.03.2020)
Нет ли идеи, почему вот такой код может зациклиться? И под отладчиком тоже.
Ведь он же не под ПП работает?Код:WTKEY$: TSTB @#^O177560 ; Ready? BPL WTKEY$ ; No!
- - - Добавлено - - -
Да, кнопки вовсю жму, эхо-печать работает. Но из самой функции WaitKey выхода нет:
Код:FUNCTION WaitKey : INTEGER; EXTERNAL; VAR code: INTEGER; BEGIN WriteLn('Ready>'); REPEAT code := WaitKey; WriteLn('"', CHR(code), '"', code) UNTIL code = 32 END.
Если хотите работать с регистрами канала К0, то необходимо сбросить бит разрешения прерывания в регистре 177560. А так возникает прерывание раньше, чем вы узнаете об установке бита готовности. А прерывание обрабатывает операционная система, она же и выводит эхо-печать. Перед выходом из программы бит разрешения прерывания надо установить.
Соответственно BIC #^O100,@#^O177560 - сброс бита разрешения прерываний, а BIS #^O100,@#^O177560 - установка бита разрешения прерываний.
Но всё это хорошо работает в однотерминальном SJ-мониторе, в многотерминальной системе могут быть проблемы.
nzeemin(26.03.2020), Oleg N. Cher(26.03.2020)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)