PDA

Просмотр полной версии : Сканирование клавиатуры



artyr_n
18.01.2015, 20:01
В Вектор USER №11 в разделе ПРОГРАММИРОВАНИЕ PPI КР580ВВ55А даётся пример сканирования клавиатуры по прерыванию. Попробовал ее использовать, но она почему то пишет в экранную область, где не могу найти. На сколько я разобрался то в ячейке MSXOB+1 хранится номер байта в буфере KEYBUF нажатых кнопок.
Видимо нужно периодически смотреть не ноль ли там. Если не ноль прочесть из буфера нажатые кнопки и обнулить эту ячейку. Может я не правильно понял как этот пример использовать. Может у кого то есть пример исходника сканирования клавиатуры.

; 8080 assembler code
.hexfile keyscan_test.hex
.binfile keyscan_test.r0m
; try "hex" for downloading in hex format
.download bin
.objcopy objcopy
.postbuild echo "Gotovo!"
;.nodump
.org $0
jmp start
.org $38
RST7:
jmp INTRPT


.org $100




STKEY: db 01000010b
;статус клавиатуры
NEWKEY: ds 9
OLDKEY: ds 9
KEYBUF: ds 16
RPTKEY: db 13
INTRPT: push h
push d
push b
push psw
lxi h,STKEY
mov a,m
xri 10000b
mov m,a
ani 10000b
;scan or code?
jz KEYWRK
in 3
sta SCRL+1
mvi a,8Ah
out 0
mov a,m
out 1
mov c,a
inx h
in 1
ori 11111b
mov m,a
mvi b,11111110b
int1: mov a,b
out 3
rlc
mov b,a
in 2
inx h
mov m,a
jc int1
mvi a,88h
out 0
mov a,c
out 1
mvi a,0 ;10000b
out 2
SCRL: mvi a,0 ;dummy
out 3
intf: pop psw
pop b
pop d
pop h
ei
ret


KEYWRK: lxi h,intf
push h
lxi h,0A6AEh
;'xra m, ana m
shld PRESS7 ;@PRESS
;seach for new pressed keys
call PRESS6 ;PRESS?
rnz
lxi h,RPTKEY
dcr m
rnz
inr m
lxi h,0B72Fh
;'cma, ora a
shld PRESS7 ;@PRESS
jmp pres5




PRESS6: lxi h,OLDKEY+8
lxi d,NEWKEY+8
mvi b,9
pres1: ldax d
cmp m
dcx h
dcx d
jnz pres2
dcr b
jnz pres1
MSXOB: lxi h,0
mov a,l
sub h
rat
pres2: mvi a,13
sta RPTKEY
pop h ;-1 ret
pres5: lxi h,OLDKEY+8
lxi d,NEWKEY+8
mvi c,64
pres3: ldax d
mov b,a
PRESS7: nop ;ana m cma
nop ;xra m ora a
mov m,b
jz nokey
;поиск бита
push h
push d
push b
mvi b,8
kcod1: dcr c
rlc
cc putbuf
dcr b
jnz kcod1
pop b
pop d
pop h
nokey: dcx h
dcx d
mov a,c
sui 8
mov c,a
jnz pres3
;else mode keys
ldax d
cmp m
rz
mov m,a
dcx d
cpi 10011111b
;US+SS?
mvi b,00100000b
;CAPS switch
jz ccod1
cpi 01011111b
;RUS+SS?
mvi b,01000000b
;QWER/JCUK switch
jz ccod1
ani 10000000b
;RUS?
rnz
mvi b,10001000b
;Rus & lamp switch
ccod1: ldax d
xra b
stax d
rat


putbuf: push psw
;push or don't modify BC!
lxi h,KBUF
push h
mov a,c
cpi 63 ;space?
mvi a,32
rz
;... ... etc.
mov a,c
cpi 11h ;1
mvi a,33
rz
mov a,c
cpi 07h ;DOWN
mvi a,07h
rz
mov a,c
cpi 05h ;UP
mvi a,05h
rz



KBUF: mov e,a
lhld MSXOB+1 ;Загрузить в HL содержимое ячейки с адресом a16
mov a,l
inr a ;инкрементировать A
ani 15 ;Логическое И непосредственные данные с A
cmp h ;Сравнить A с H
jz kbuf1
sta MSXOB+1 ;Записать A по адресу a16
mvi a,1
out 0
mov a,l
lxi h,KEYBUF
add l
mov l,a
jnc adhla
inr h
adhla: xra a
out 0
mov m,e
kbuf1: pop psw
rat


start:

ei


cicl:
nop
jmp cicl

ivagor
18.01.2015, 20:35
почему то пишет в экранную область
В приведенном фрагменте нет инициализации стека. Возможно запускаете из под начального загрузчика, а он устанавливает стек в экранную область.

Тоже сейчас думаю, откуда бы украсть опрос клавиатуры. Или выковырять из бейсика ("драйверы устройств"), или разобраться в варианте PPC (http://robotz.googlecode.com/svn/trunk/GML/hid/) из robotz, или накропать что-то свое

KTSerg
18.01.2015, 20:35
А чего, в этом коде не видно начальных установок для стека например?
И ещё, я видать совсем асм забыл, но тупой вопрос: откуда будет считано значение в аккумулятор после команд
INTRPT: push h
push d
push b
push psw
lxi h,STKEY
mov a,m
вроде задается только значение "H", а значение "L" - остается тем, которое было до входа в прерывание... или я снова глючу...?

artyr_n
18.01.2015, 20:43
В приведенном фрагменте нет инициализации стека.
да действительно, установил стек ниже экрана и на экран мусорить перестало.

---------- Post added at 21:43 ---------- Previous post was at 21:41 ----------


вроде задается только значение "H", а значение "L" -
вроде как задается HL
LXI H,d16 21 Загрузить в HL непосредственные данные d16

KTSerg
18.01.2015, 20:47
...
Тоже сейчас думаю, откуда бы украсть опрос клавиатуры. Или выковырять из бейсика ("драйверы устройств"), или разобраться из robotz, или накропать что-то свое

В любой игрушке сделанной на основе "драйверов" есть "стандартная" обработка клавы :)
Посмотреть, самое начало, там должна быть настройка переходов на прерывания, ну и станет ясно где смотреть...

artyr_n
18.01.2015, 20:47
Или выковырять из бейсика ("драйверы устройств")
Пробовал дизассемблировать драйверы устройств, но очень быстро там потерялся.

KTSerg
18.01.2015, 20:53
вроде как задается HL
LXI H,d16 21 Загрузить в HL непосредственные данные d16
Смутило, что STKEY имеет формат Байта, а не Слова.
Реально загружается видимо 0042h.

artyr_n
18.01.2015, 21:04
Смутило, что STKEY имеет формат Байта, а не Слова.
в HL загрузится адрес этой метки, а в А соответственно значение этой ячейки памяти


0100 42 STKEY: db 01000010b
;статус клавиатуры
0101 00 00 00 00 NEWKEY: ds 9
. . .
0109 00
010A 00 00 00 00 OLDKEY: ds 9
. . .
0112 00
0113 00 00 00 00 KEYBUF: ds 16
. . .
011F 00 00 00 00
0123 0D RPTKEY: db 13
0124 E5 INTRPT: push h
0125 D5 push d
0126 C5 push b
0127 F5 push psw
0128 21 00 01 lxi h,STKEY
012B 7E mov a, m

KTSerg
19.01.2015, 17:34
Кстати, на счет сканирования клавиатуры, у меня в архиве есть файл под названием "RETEXD.ASM" - это исходник текстового редактора на сколько я понимаю. Там есть обработка клавиатуры и преобразование кодов в КОИ и таблица знакогенератора (12 байт на символ)

artyr_n
19.01.2015, 19:50
у меня в архиве есть файл под названием "RETEXD.ASM"
а ссылочку можно или на почту.

KTSerg
19.01.2015, 20:02
а ссылочку можно или на почту.
В почте.

x-code
20.01.2015, 17:53
Еще где-то то ли на форуме, то ли в картотеке пробегали исходники Филиппова, содержавшие его собственный вариант "драйверов устройств", оптимизированный именно под игры. Код опроса клавиатуры, помнится, там тоже был.