Вложений: 1
клавиатура издевается !!!
Цитата:
Сообщение от
hobot
но в целом это единственный затык
Документация на английском:
RT-11 V5.6: System Subroutine Library Manual
RT-11 V5.6: System Macro Library Manual
RT-11 V5.6: System Internals Manual
PDP-11 MACRO-11 Language Reference Manual (MACRO-11 Version 5)
PDP-11 FORTRAN IV Language Reference Manual (FORTRAN IV Version 2.6)
PDP-11 FORTRAN 77 Language Reference Manual (FORTRAN 77 Version 5.0)
на русском:
РАФОС-ПЛЮС: Системные таблицы и библиотеки. Руководство программиста.
ФОДОС-2: Программирование периферийных устройств.
ФОДОС-2: Ассемблер. Руководство программиста.
ФОДОС-2: Системная макробиблиотека. Руководство программиста.
ФОДОС-2:Монитор системы. Руководство программиста.
Откопалось вот тут http://zx.pk.ru/showpost.php?p=377816&postcount=35
и там же (в той же теме) сейчас читаю советы\вопросы\ответы по "правильному" опросу клавиатуры. И тут странное поведение одного и
того же алгоритма в случае http://zx.pk.ru/showthread.php?p=639...MAN#post639059 - см. исходник SHKEYS.PAS которую я написал как раз с целью опрос клавиатуры проверить - там всегда работает ожидание и никогда не проскакивает !!! Но почему то в другой программе такой алгоритм не срабатывает??? :mad_std:
в общем читаю старую тему, но если будут доп.комментарии\советы буду очень рад любому ответу.
Спасибо.
---------- Post added at 19:34 ---------- Previous post was at 17:54 ----------
2 form, а можно вот этот код как-то (не для фортрана), а более
универсально переписать (что бы получить честный обработчик клавиатуры = процедуру\функцию в программе на паскале?)
Код:
.TITLE KEYB
.MCALL .GTJB,.INTEN,.MTPS,.SYNCH
.GLOBL ATTACH,DETACH
; ПРИМЕР РАБОТЫ С ПРЕРЫВАНИЯМИ ИЗ ФОРТРАНА. ИСПОЛЬЗОВАНИЕ:
;
; EXTERNAL SUBR
; CALL ATTACH(SUBR)
; - УСТАНАВЛИВАЕТ ОБРАБОТЧИК ПРЕРЫВАНИЙ ОТ КЛАВИАТУРЫ
; ПРИ НАЖАТИИ КЛАВИШИ ВЫЗЫВАЕТСЯ CALL SUBR(KEY)
;
; CALL DETACH
; - ВОССТАНАВЛИВАЕТ ВЕКТОР ПРЕРЫВАНИЯ ОТ КЛАВИАТУРЫ
;
; КОНТРОЛЬ ПАРАМЕТРОВ НЕ ВЫПОЛНЯЕТСЯ, ТАКЖЕ НЕ ПРОВЕРЯЕТСЯ БЫЛ ЛИ
; РАНЕЕ ВЫЗВАН ATTACH/DETACH.
SAVKBV: .BLKW 2 ;МЕСТО ПОД ISR ВЕКТОРА КЛАВИАТУРЫ
FORSUB: .BLKW ;МЕСТО ПОД АДРЕС ФОРТРАНОВСКОЙ ПП
FORARG: .WORD 1,KBCODE ;ВЕКТОР АРГУМЕНТОВ ДЛЯ ПП
KBCODE: .BLKW ;АРГУМЕНТ ПП
SYNBLK: .WORD 0,0,0,0 ;БЛОК SYNCH
.WORD FORARG ;...ЗАПИШЕТСЯ В R0 ПОСЛЕ .SYNCH
.WORD -1,0 ;...ДОЛЖНЫ БЫТЬ -1,0
AREA: .BLKW 2 ;ПРОСТРАНСТВО ДЛЯ ВЫЗОВА .GTJB
JOBBLK: .BLKW 8. ;БЛОК ДЛЯ ПОЛУЧЕНИЯ ИНФОРМАЦИИ О
;ЗАДАЧЕ
ATTACH: .GTJB #AREA,#JOBBLK ;ПОЛУЧАЕМ ИНФОРМАЦИЮ О ЗАДАНИИ
MOV JOBBLK,SYNBLK+2 ;ПРОПИСЫВАЕМ НОМЕР ЗАДАНИЯ В БЛОК SYNCH
.MTPS #340 ;ЗАПРЕЩАЕМ ПРЕРЫВАНИЯ
MOV @#60,SAVKBV ;СОХРАНЯЕМ ВЕКТОР КЛАВИАТУРЫ
MOV @#62,SAVKBV+2 ;...
MOV #KBDISR,@#60 ;УСТАНАВЛИВАЕМ ОБРАБОТЧИК ПРЕРЫВАНИЙ
MOV #340,@#62 ;...КЛАВИАТУРЫ
MOV 2(R5),FORSUB ;СОХРАНЯЕМ АДРЕС ФОРТРАНОВСКОЙ ПП
.MTPS #0 ;РАЗРЕШАЕМ ПРЕРЫВАНИЯ
RETURN ;ВОЗВРАЩАЕМСЯ В ФОРТРАН
DETACH: .MTPS #340 ;ЗАПРЕЩАЕМ ПРЕРЫВАНИЯ
MOV SAVKBV,@#60 ;ВОССТАНАВЛИВАЕМ ВЕКТОР КЛАВИАТУРЫ
MOV SAVKBV+2,@#62 ;...
.MTPS #0 ;РАЗРЕШАЕМ ПРЕРЫВАНИЯ
RETURN ;ВОЗВРАЩАЕМСЯ В ФОРТРАН
; СЮДА МЫ ПОПАДАЕМ ПРИ НАЖАТИИ КЛАВИШИ НА КЛАВИАТУРЕ
; ПРИОРИТЕТ ПРОЦЕССОРА УСТАНОВЛЕН НА 7 (ВСЕ ПРЕРЫВАНИЯ ЗАПРЕЩЕНЫ).
; В ЭТОТ МОМЕНТ МЫ НЕ МОЖЕМ ВЫЗЫВАТЬ КАКИЕ-ЛИБО СИСТЕМНЫЕ ВЫЗОВЫ
; ТАК КАК ПРЕРЫВАНИЕ ВОЗНИКАЕТ АСИНХРОННО ПРИ ЗАРАНЕЕ НЕИЗВЕСТНОМ
; ИСХОДНОМ СОСТОЯНИИ.
;
; СНАЧАЛА МАКРОВЫЗОВОМ .INTEN МЫ ПОНИЖАЕМ ПРИОРИТЕТ ПРОЦЕССОРА ДО 5
; И СОХРАНЯЕМ РЕГИСТРЫ R4/R5 (В НАШЕМ СЛУЧАЕ ЭТО НЕ ИСПОЛЬЗУЕТСЯ).
;
; ЗАТЕМ МАКРОВЫЗОВОМ .SYNCH МЫ ПОНИЖАЕМ ПРИОРИТЕТ ПРОЦЕССОРА ДО 0
; И ПЕРЕКЛЮЧАЕМСЯ В КОНТЕКСТ ЗАДАЧИ. ЕСЛИ ПРЕРЫВАНИЕ ВОЗНИКЛО РАНЬШЕ
; ЧЕМ ОТРАБОТАНО СЛЕДУЮЩЕЕ (SYNCH БЛОК ИСПОЛЬЗУЕТСЯ), ПРОСТО ВОЗВРАЩАЕМ
; УПРАВЛЕНИЕ (ОБРАЩАЕМ ВНИМАНИЕ, ЧТО ПОСЛЕ INTEN/SYNCH ВОЗВРАТ ИЗ
; ПРЕРЫВАНИЯ ВЫПОЛНЯЕТСЯ КОМАНДОЙ RETURN (RTS PC), А НЕ RTI).
; ПОСЛЕ УСПЕШНОГО ВЫПОЛНЕНИЯ .SYNCH МЫ НАХОДИМСЯ В КОНТЕКСТЕ НАШЕЙ
; ПРОГРАММЫ И МОЖЕМ ВЫПОЛНЯТЬ СИСТЕМНЫЕ ВЫЗОВЫ.
;
; МЕЖДУ .INTEN И .SYNCH В СТЕК НИЧЕГО НЕ ПИСАТЬ!
;
; ЗАМЕЧАНИЕ: ТАК КАК МЫ ИСПОЛЬЗУЕМ KBCODE ЗДЕСЬ В ТЕОРИИ ПОЗВОЛЯЕТ
; ВОЗНИКНУТЬ СИТУАЦИИ КОГДА СТАРОЕ ЗНАЧЕНИЕ ЕЩЕ НЕ ОБРАБОТАНО, А НОВОЕ
; БУДЕТ ЗАПИСАНО ПОВЕРХ СТАРОГО.
;
KBDISR: MOVB @#177562,KBCODE ;;;СОХРАНЯЕМ КОД КЛАВИШИ
.INTEN 5 ;;;ПЕРЕХОДИМ В КОНТЕКСТ СИСТЕМЫ
.SYNCH #SYNBLK ;;ПЕРЕХОДИМ В КОНТЕКСТ ЗАДАЧИ
BR 10$ ;;ЕСЛИ SYNCH БЛОК ЗАНЯТ - ВОЗВРАТ
MOV R0,R5 ;ВЫЗЫВАЕМ ФОРТРАНОВСКУЮ ПП
CALL @FORSUB ;...С АРГУМЕНТОМ
10$: RETURN ;ВОЗВРАЩАЕМСЯ ИЗ ПРЕРЫВАНИЯ
.END
Для меня сложность в том, что проверенный способ в одном случае
работает, и при совершенно идентичном коде (речь не о программе,
а о опросе клавиатуры) в другом сбоит !!! и как я не ковыряюсь - нет 100% решения вопроса - прямо беда же !!! (мне уже не смешно даже). В данном же исходнике - некоторые ингредиенты просто не знакомы мне - например
Код:
SAVKBV: .BLKW 2 ;МЕСТО ПОД ISR ВЕКТОРА КЛАВИАТУРЫ
Нашёл из старых шпор "драйвер клавиатуры" для УК-НЦ
Может быть из него что то выдернуть ? Мне трудно ассемблер
читать\понимать картину в целом (беда огорчения)
Код:
PROGRAM TEST;
PROCEDURE PER;
BEGIN
/*$C .RADIX 8
MOV #OUTPOS, R2
; BIS #10000, @#44
MOV #4, R1
1$: TSTB @#176674
BPL .-4
MOVB (R2)+, @#176676
SOB R1, 1$
MOV #OK, R0
EMT 351
MOV WYDEL+4, STAPP
MOV WYDEL+4, STAPP1
MOV #8., R1
2$: TSTB @#176674
BPL .-4
MOVB (R2)+, @#176676
SOB R1, 2$
JMP KPER
OK: .ASCIZ <1><2><3><4><5>
OUTPOS: .WORD WYDEL,-1,POSLAT,-1,ZAPUSK,-1
WYDEL: .BYTE ,1,32,0,-1
POSLAT: .BYTE ,20,32,
.EVEN
STAPP: .WORD ,PROG,SIZE
ZAPUSK: .BYTE ,30,32,
STAPP1: 0
PROG: MOV @#300, OLD300
MOV PC, R0
ADD #PRERK-., R0
MOV R0, @#300 ; - ВКЛЮЧЕНИЕ ДРАЙВЕРА КЛАВИАТУРЫ
MOV @#320, OLD320
MOV PC, R0
ADD #PRERT-., R0
MOV R0, @#320 ; - МУЗЫКА ВКЛ.ОТКЛ.
MOV PC, R0
ADD #TIM-., R0
MOV R0, @#100 ; - МИГАНИЕ КУРСОРА
RETURN
TIM: RTI
PRERT: MFPS -(SP)
MTPS #340
MOV R0,-(SP)
MOV R1,-(SP)
MOV R2,-(SP)
BIC #17600, @#177716
CLR R0
MOVB @#177060, R0
CMPB R0, #'9
BGT 5$
CMPB R0, #'0
BLT CANCEL
SUB #'/, R0
MOV #1, R1
1$: ASL R1
SOB R0, 1$
MOV R1, LENGTH
BR CANCEL
5$: MOV PC, R1
ADD #TAB-., R1
2$: CMPB (R1), R0
BEQ 3$
TSTB (R1)+
BEQ CANCEL
BR 2$
3$: MOV LENGTH, R2
4$: BIS #200, @#177716
MOVB 1(R1), R0
SOB R0,.
BIC #200, @#177716
SOB R0,.
SOB R0, 4$
CANCEL: MOV (SP)+, R2
MOV (SP)+, R1
MOV (SP)+, R0
MTPS (SP)+
RTI
LENGTH: 0
PRERK: MOV R0, OLDR0
MOVB @#177702, R0
BIT #200, R0
BNE 2$
BIC #200, R0
ADD PC, R0
ADD #KEYS-., R0
TSTB (R0)
BEQ 1$
MOVB (R0), @#177070
CMPB (R0), #'+
BNE 11$
INC PRESS4
11$: CMPB (R0), #',
BNE 1$
INC PRESS6
1$: MOV OLDR0, R0
RTI
2$: BIC #260, R0
CMPB R0, #11
BNE 3$
TSTB PRESS4
BEQ 1$
MOVB #173, @#177070
CLR PRESS4
BR 1$
3$: CMPB R0, #5
BNE 1$
TSTB PRESS6
BEQ 1$
MOVB #175, @#177070
CLR PRESS6
BR 1$
TAB: .BYTE 'F,177
.BYTE 'Y,161
.BYTE 'W,145
.BYTE 101,137
.BYTE 'P, 125
.BYTE 'R, 113
.BYTE 'O, 103
.BYTE 114, 77
.BYTE 'D, 70
.BYTE 'V, 62
.BYTE '\,57
.BYTE '.,52
.BYTE ' ,47
TABDIE: .BYTE 'C,170
.BYTE 'U,153
.BYTE 113,132
.BYTE 'E,120
.BYTE 'N,107
.BYTE 'G,74
.BYTE '[,65
.BYTE '],55
.BYTE 'Z,50
.BYTE ' ,47
.WORD 0
KEYS: .BYTE 2,2,2,2,2, ,,33,';,0,0,0,'$,0,0,'','(,0,0,0,0,0
.BYTE '-,11,112,'!,'",'#,'E,'%,'&,'[,'],0,0,0,0,0,0
.BYTE 0,'F,'C,'U,113,'P,'N,'G,114,'D,0,0,0,0,0,0,0
.BYTE 'Q,'Y,'W,101,111,'R,'O,'B,'@,0,0,0,0,0,0,0,0
.BYTE '^,'S,'M,' ,'T,'X,'D,'<,0,0,0,0,0,'7,'0,'1,'4,'+
.BYTE 177,'C,'B,'>,'\,'V,0,0,0,0,0,'8,'.,'2,'5,12,15,15,101
.BYTE '_,'H,'Z,0,0,0,0,0,'9,12,'3,'6,14,12,'/,':,'=,'0,'),33
.EVEN
PRESS4: 0
PRESS6: 0
OLDR0: 0
OLD300: 0
OLD320: 0
SIZE= 3000
KPER: .RADIX 10
*/
END;
BEGIN
PER;
END.
к блоку KEYS есть отдельные пометки для системных клавишь в распечатке с которой набивалось (типа вот это "СТОП", а вот это "УСТ"). Последний листинг прилепил к сообщению.