
Сообщение от
caro
Код:
;==========================================================
; На линиях PORTD фиксируются изменения состояния адресов
;4 PCINT2 PORTD
in YL,PIND ;+1 адрес сканирования
ld scanFF,Y ;+2 скан код из текущего буфера
out PORTB,scanFF ;+1 выдать в порт данных
;=8 тактов => 1 Мксек при 8 МГц
; Регистровая пара Y по умолчанию указывает на 256 байтный буфер,
; в котором сформирована таблица с кодами нажатых клавиш
; Это в случае матрицы 8*8
; ----
; Для дополнительных 3 бит нужно будет сформировать еще один буфер на 256 байт
; Для ускорения работы сделаем его со старшим байтом адреса, отличающимся
; на 1 бит от первого буфера, например 0200h и 0300h
sbr YH,1<<0 ;+1 -> Y=03xx
; теперь прочитаем код нажатых клавиш из нового буфера
ld scanFF,Y ;+2
; а вот теперь надо обязательно запомнить регистр статуса МК
in tempS,SREG ;+1 сохранить СТАТУС
in port_C,PINC ;+1 текущее состояние порта C
andi port_C,0xF8 ;+1 обнулить 3 мл. бита
or scanFF,port_C ;+1 добавим 3 бита из буфера клавиш
out PORTC,scanFF ;+1
;= 16 тактов => 2 мксек
; завершили выдачу во второй порт клавиатуры
cbr YH,1<<0 ; Y=02xxh
out SREG,tempS ; восстановить СТАТУС
reti ;+4 возврат
;**********************************************************
Получилось 2 мксек.
Посмотри, если есть возможность, сколько времени в ОРИОНЕ занимает чтение порта клавиатуры.
Если больше 2 мксек до момента фиксации данных, то может и пройдет.
На спектруме, при тактовой частоте 3.5 Мгц реакция должна быть не более 0.7 мксек.
А у Ориона по моему тактовая = 2 МГц если я не ошибаюсь?
Самая короткая (скоростная) последовательность чтения с клавиатуры для Ориона будет такая:
Код:
ld hl,0F400h ; base PPA address
ld a,scancode ; 8 bits
ld (hl),a ; 7 tstates
inc l ; 4 tstates
ld b,(hl) ; 7 tstates
inc l ; 4 tstates
ld c,(hl) ; BC[15..5]=resulting inkey bits
как видим, порядка 10 тактов на реакцию от контроллера, т.е. для частот до 5 Мгц вполне умещаемся.
Причем, это минимальная подпрограмма, большинство прочих написано куда как менее оптимально.