Код:
; 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