Сижу туплю - не могу понять что не так. Прикручиваю к игре управление от клавиатуры, как на ZX Spectrum:
ВЛЕВО и ВПРАВО - кнопки ряда ФЫВА через одну.
ОГОНЬ - копки рядов ЙЦУК и ЯЧСМ
При нажатии кнопок по отдельности всё работает как задумано. Но как только зажимаю ОГОНЬ, то каретка или влево не едет, или вправо, в зависимости от того какую именно клавишу ОГОНЬ зажимаю. Может кто-то свежим взглядом посмотрит и увидит, что не так?
Код:
keyboard_ctrl:
xor a
ld c,a
ld a,#82
ld (#ff03),a ; Переключаем ВВ55 на чтение рядов
ld a,(#ff01)
cpl
ld h,a
and %00010000 ; Проверка ряда ФЫВАПРОЛДЖЭ
jp z,keyboard_ctrl_2 ; Уходим, если ни одна клавиша ряда не нажата
; Опрос ВПРАВО
ld a,#91
ld (#ff03),a ; Переключаем ВВ55 на чтение столбцов
ld a,($ff02) ; Проверка столбцов ФЫВА
cpl
ld d,a
and %00000101
ld b,a
ld a,($ff00) ; Проверка столбцов ПРОЛДЖЭ
cpl
ld e,a
and %01010101
or b
jp z,keyboard_ctrl_1
inc c
keyboard_ctrl_1:
; Опрос ВЛЕВО
ld a,d
and %00001010
ld b,a
ld a,e
and %10101010
or b
jp z,keyboard_ctrl_2
ld a,c
or %00010
ld c,a
keyboard_ctrl_2:
; Опрос ОГОНЬ
ld a,h ; Проверка рядов ЙЦУК и ЯЧСМ
and %00101000
jp z,LA1DB_7
ld a,c
or %10000
ld c,a
LA1DB_7:
LD A,C
LA1DB_71:
LD (ctrl_btns_pressed),A
RET
; Состояние нажатых кнопок джойстика и управления
; Bit 0 - вправо
; Bit 1 - влево
; Bit 2 -
; Bit 3 -
; Bit 4 - огонь
ctrl_btns_pressed:
DEFB $06
О том, как работает клавиатура Специалиста я написал здесь.
Cursor и Interface II реализовал. И там одновременное нажатие огня и наплавленный работает корректно. Причем во всех случаях всё сводится к формированию переменной ctrl_btns_pressed. Так что скорее всего проблема именно где-то в процедуре, которую я привёл выше.