====== MSX — Программируемый периферийный интерфейс (PPI) ======
В MSX PPI (программируемый периферийный интерфейс) — это микросхема, используемая для переключения слотов, управления клавиатурой (включая звук "щелчка") и [[msx:data_recorder|кассетным магнитофоном]].
PPI, используемый системами MSX, основан на Intel 8255, хотя в большинстве систем присутствует клон или функциональность интегрирована в микросхему [[msx:msx_engine:|]].
{{anchor:keyboard}}
====== Клавиатура ======
Описание клавиатуры приведено на странице: [[msx:russification:|]].
{{anchor:work_keyboard_without_rom}}
===== Пример опроса клавиатуры без использования подпрограмм ПЗУ =====
Пример опроса клавиатуры без использования подпрограмм [[msx:rom|]], автор **KoD/SDM**
Для опроса клавиатуры используются два порта — A9 и AA:
^ Регистр ^ Порт ^ Описание ^
| A9 | B |Колонка матрицы клавиатуры (Только чтение) \\ Чтение из этого порта вернёт состояние выбранной строки клавиатуры (выбранной через порт AA) \\ Биты 0–7 соответствует одной из 8 клавиш в каждой строке матрицы клавиатуры \\ **Если клавиша нажата, то соответствующий бит устанавливается в 0**|
| AA | C |Строка матрицы клавиатуры, LED, Cassette (Чтение/Запись) \\ Биты 0-3 соответствуют строке матрицы клавиатуры|
Полное описание регистров/портов приведено [[#registers|ниже]].
Пример интернациональной раскладки матрицы клавиатуры:
| ^ Порт #A9 ^^^^^^^^
^ Порт #AA ^ бит 7 ^ бит 6 ^ бит 5 ^ бит 4 ^ бит 3 ^ бит 2 ^ бит 1 ^ бит 0 ^
^строка 0| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
^строка 1| ; | ] | [ | \ | = | - | 9 | 8 |
^строка 2| b | a | DEAD | / | . | , | ` | ' |
^строка 3| j | i | h | g | f | e | d | c |
^строка 4| r | q | p | o | n | m | l | k |
^строка 5| z | y | x | w | v | u | t | s |
^строка 6| F3 | F2 | F1 | CODE | CAPS | GRAPH | CTRL | SHIFT |
^строка 7| RET | SELECT | BS | STOP | TAB | ESC | F5 | F4 |
^строка 8| → | ↓ | ↑ | ← | DEL | INS | HOME | SPACE |
Это пример раскладки без "шифта" и не расширенной клавиатуры:
;-------------------------------------------------------
NAMBAS EQU #F922 ; адрес PNT
KEY_MATRIX_LAYOUT EQU #0200 ; адрес алрес таблицы матрицы КРАТНЫЙ 256!!!
org #100
di
ld hl,(NAMBAS)
ld a,l
out (#99),a
ld a,h
out (#99),a
nop
in a,(#98)
ld (save_byte+1),a
ld hl,key_matrix_layout
ld de,KEY_MATRIX_LAYOUT
ld bc,8*9
ldir
main_loop:
call KEY_SCAN
and a
jr z,main_loop ; клавиши не нажимались
ld h,KEY_MATRIX_LAYOUT/256 ; H=старший байт таблмцы
ld a,(hl)
cp #1B ; ESC?
jr z,exit_2_dos
push af
ld hl,(NAMBAS)
ld a,l
out (#99),a
ld a,h
or #40
out (#99),a
pop af
out (#98),a ; печатаем символ
jr main_loop
exit_2_dos:
ld hl,(NAMBAS)
ld a,l
out (#99),a
ld a,h
or #40
out (#99),a
save_byte:
ld a,0
out (#98),a ; восстанавливаем что было на экране
ei
ret
;-------------------------------------------------------
; На выходе- L=индекс клавиши; A=флаг (1-нажатие 0-нет)
KEY_SCAN:
ld l,0 ; индекс нажатой клавиши
ld e,0 ; строка матрицы клавиатуры
key_scan_loop2:
ld b,8 ; одни ряд - 8 клавиш
in a,(#AA)
and #F0 ; очищаем 4 младших бита (биты 0-3 номер строки)
or e ; устанавливаем строку матрицы клавиатуры
out (#AA),a
in a,(#A9) ; читаем состояние строки матрицы клавиатуры
key_scan_loop1:
rrca
jr nc,key_pressed ; переход если клавиша нажата
inc l ; увеличиваем индекс
djnz key_scan_loop1
inc e ; следующая строка матрицы клавиатуры
ld a,e
cp #09
jr nz,key_scan_loop2 ; переход если не все строки обработаны
xor a ; все строки обработаны, клавиши не нажимались
ret
key_pressed:
ld a,1 ; клавиши нажимались
ret
;----------------------------------------------------------------------------
key_matrix_layout:
;строка 0
db "01234567"
;строка 1
db "89-=\[];"
;строка 2
db "'`,./ ab"
;строка 3
db "cdefghij"
;строка 4
db "klmnopqr"
;строка 5
db "stuvwxyz"
;строка 6
db " "
;строка 7
db " ",#1B," " ; #1B-ESC
;строка 8
db " "
;----------------------------------------------------------------------------
Более подробно см. здесь: [[http://map.grauw.nl/articles/keymatrix.php|MSX Assembly Page: Keyboard matrices]]
{{anchor:registers}}
====== Регистры ======
Здесь приведено соответствие регистров PPI и портов ввода/вывода:
^ Регистр ^ Порт ^ Бит ^ Режим \\ (ввод/выход) ^ Имя ^ Назначение ^
| A {{anchor:reg_a}} | A8 {{anchor:a8}} | 0 | ввод/выход | CS0 L |Выбор слота для адресов в диапазоне 0000-3FFF|
|:::|:::| 1 |:::| CS0 H |:::|
|:::|:::| 2 |:::| CS1 L |Выбор слота для адресов в диапазоне 4000-7FFF|
|:::|:::| 3 |:::| CS1 H |:::|
|:::|:::| 4 |:::| CS2 L |Выбор слота для адресов в диапазоне 8000-BFFF|
|:::|:::| 5 |:::| CS2 H |:::|
|:::|:::| 6 |:::| CS3 L |Выбор слота для адресов в диапазоне C000-FFFF|
|:::|:::| 7 |:::| CS3 H |:::|
| B {{anchor:reg_b}} | A9 {{anchor:a9}} | 0 | ввод | |Состояние строки [[msx:russification:#matrix|матрицы клавиатуры]], указанной через порт [[#AA]] битами KB1–KB3 \\ **Если клавиша нажата, то соответствующий бит устанавливается в 0**|
|:::|:::| 1 |:::|:::|:::|
|:::|:::| 2 |:::|:::|:::|
|:::|:::| 3 |:::|:::|:::|
|:::|:::| 4 |:::|:::|:::|
|:::|:::| 5 |:::|:::|:::|
|:::|:::| 6 |:::|:::|:::|
|:::|:::| 7 |:::|:::|:::|
| C {{anchor:reg_c}} | AA {{anchor:aa}} | 0 | выход | KB0 |Выбор строки [[msx:russification:russification#matrix|матрицы клавиатуры]] для сканирования|
|:::|:::| 1 |:::| KB1 |:::|
|:::|:::| 2 |:::| KB2 |:::|
|:::|:::| 3 |:::| KB3 |:::|
|:::|:::| 4 |:::| CASON |CAS CTRL (сброс для включения = 1) — Включение мотора [[msx:data_recorder|магнитофона]]|
|:::|:::| 5 |:::| CASW |Включен режим записи на [[msx:data_recorder|магнитофон]]|
|:::|:::| 6 |:::| CAPS |CAPS LAMP (сброс для включения = 1) Вкл./выкл. режим ввода заглавных букв (индикатор на клавише CAPS)|
|:::|:::| 7 |:::| SOUND |Вывод звука (1, затем 0, чтобы издать звук "щелчка" клавиатуры)|
| Управление {{anchor:reg_m}} | AB {{anchor:ab}} | 0 | вход | |статус бита для изменения|
|:::|:::| 1 |:::| |Номер бита, который необходимо изменить в [[#reg_c|порту C PPI]]|
|:::|:::| 2 |:::| |:::|
|:::|:::| 3 |:::| |:::|
|:::|:::| 4 |:::| |Не используется|
|:::|:::| 5 |:::| |:::|
|:::|:::| 6 |:::| |:::|
|:::|:::| 7 |:::| |Всегда должен быть сброшен|
====== Ссылки ======
[[msxorg>wiki/PPI|PPI]]
[[github>oboroc/msx-books/blob/master/msx2-fb-1993-ru.md#порты-программируемого-периферийного-интерфейса-ppi-ports|Архитектура и устройства микрокомпьютеров стандарта MSX-2 — Порты программируемого периферийного интерфейса (PPI ports)]]
{{tag>MSX Norm}}