На самом деле спрайты в HEX нагляднее, в восьмеричной сделал чтобы "староверы" не возмущались. Хотя тебе какая разница ты же не вручную спрайты правишь, можно в пять сек хоть в троичной сохранить:) Этож статичные данные, вставил и забыл.
Вид для печати
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
А можно спросить: зачем нужно делать CLR R1 перед MOVB @#177562, R1 ?
Я не стебаюсь, если что. Пытаюсь разобраться в местном асме. Вот здесь такая чистка регистра не делается:
Код:TSTB @#177560 ; готовность есть?
BPL CY1 ; символ не готов!
INSYM: MOVB @#177562,R0 ; прочитать символ
Oleg N. Cher, вероятно он действительно лишний, остаток какого-то копипаста.
Если BIS #15400,R1 это действительно аналог операции OR на других процессорах и устанавливает только указанные биты, а прочие игнорирует, тогда CLR R1 всё-таки нужна - она обнуляет старший байт R1.
Но тогда подобная же операция нужна и в подпрограмме GETKEY. Смотрите. В GETKEY после MOVB @#^O177562,R1 старший байт R1 неопределён, и если полученный код Esc, то BIS просто наложит на него маску ^O15400 с неопределённым результатом. А если полученный код не Esc, то будет просто возврат с неопределённым же старшим байтом. Я всё правильно описал? Т.е. если бы старший байт был незначащий, тогда ладно. Но он ведь может иметь значащий код ^O33.
MOVB не так работает. он возьмёт старший бит от байта из источника, и раскопирует его вверх. Т.е. в верхнем байте будет либо 0, либо 255.
Может это как раз и осталось от времён когда я этого не понимал :-)
Нет ли идеи, почему вот такой код может зациклиться? И под отладчиком тоже.
Ведь он же не под ПП работает?Код:WTKEY$: TSTB @#^O177560 ; Ready?
BPL WTKEY$ ; No!
http://i.piccy_.info/i9/ee0d6ac1ff06...20134/UKNC.png
- - - Добавлено - - -
Да, кнопки вовсю жму, эхо-печать работает. Но из самой функции 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-мониторе, в многотерминальной системе могут быть проблемы.