Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
msx:ppi [2020-11-03 21:32] GreyWolf |
msx:ppi [2022-09-01 21:14] (текущий) GreyWolf [Пример опроса клавиатуры без использования подпрограмм ПЗУ] |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
====== MSX — Программируемый периферийный интерфейс (PPI) ====== | ====== MSX — Программируемый периферийный интерфейс (PPI) ====== | ||
- | В MSX PPI (программируемый периферийный интерфейс) — это микросхема, используемая для переключения слотов, управления клавиатурой (включая звук "щелчка") и кассетным магнитофоном. PPI, используемый системами MSX, основан на Intel 8255, хотя в большинстве систем присутствует клон или функциональность интегрирована в микросхему [[msx:msx_engine:msx_engine|]]. | + | В MSX PPI (программируемый периферийный интерфейс) — это микросхема, используемая для переключения слотов, управления клавиатурой (включая звук "щелчка") и [[msx:data_recorder|кассетным магнитофоном]]. |
+ | |||
+ | PPI, используемый системами MSX, основан на Intel 8255, хотя в большинстве систем присутствует клон или функциональность интегрирована в микросхему [[msx:msx_engine:|]]. | ||
Строка 7: | Строка 9: | ||
====== Клавиатура ====== | ====== Клавиатура ====== | ||
- | FIXME | + | Описание клавиатуры приведено на странице: [[msx:russification:|]]. |
- | {{anchor:registers}} | + | {{anchor:work_keyboard_without_rom}} |
- | ====== Регистры ====== | + | ===== Пример опроса клавиатуры без использования подпрограмм ПЗУ ===== |
- | Регистры PPI также могут быть добавлены через следующие порты ввода/вывода. | + | Пример опроса клавиатуры без использования подпрограмм [[msx:rom|]], автор **KoD/SDM** |
- | FIXME | + | Для опроса клавиатуры используются два порта — 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 | | ||
+ | |||
+ | Это пример раскладки без "шифта" и не расширенной клавиатуры: | ||
<code> | <code> | ||
- | Порты программируемого периферийного интерфейса (PPI ports) | + | ;------------------------------------------------------- |
+ | NAMBAS EQU #F922 ; адрес PNT | ||
+ | KEY_MATRIX_LAYOUT EQU #0200 ; адрес алрес таблицы матрицы КРАТНЫЙ 256!!! | ||
- | ┌────────┬─────┬───────┬───────┬──────────────────────────────┐ | + | org #100 |
- | │ Порт │ Бит │ Ввод/ │ Имя │ Значение │ | + | |
- | │ │ │ Вывод │ │ │ | + | di |
- | ├────────┼─────┼───────┼───────┼──────────────────────────────┤ | + | ld hl,(NAMBAS) |
- | │ │ 0 │ │ CS0L │ Выбор слота для адресов в │ | + | ld a,l |
- | │ │ 1 │ В │ CS0H │ диапазоне 0000-3FFF │ | + | out (#99),a |
- | │ ├─────┤ Ы ├───────┼──────────────────────────────┤ | + | ld a,h |
- | │ │ 2 │ В │ CS1L │ Выбор слота для адресов в │ | + | out (#99),a |
- | │ │ 3 │ О │ CS1H │ диапазоне 4000-7FFF │ | + | nop |
- | │ A ├─────┤ Д ├───────┼──────────────────────────────┤ | + | in a,(#98) |
- | │ (A8h) │ 4 │ / │ CS2L │ Выбор слота для адресов в │ | + | ld (save_byte+1),a |
- | │ │ 5 │ В │ CS2H │ диапазоне 8000-BFFF │ | + | ld hl,key_matrix_layout |
- | │ ├─────┤ В ├───────┼──────────────────────────────┤ | + | ld de,KEY_MATRIX_LAYOUT |
- | │ │ 6 │ О │ CS3L │ Выбор слота для адресов в │ | + | ld bc,8*9 |
- | │ │ 7 │ Д │ CS3H │ диапазоне C000-FFFF │ | + | ldir |
- | ├────────┼─────┼───────┼───────┼──────────────────────────────┤ | + | main_loop: |
- | │ │ 0 │ в │ │ │ | + | call KEY_SCAN |
- | │ B │ 1 │ в │ │ Состояние строки клавиатуры │ | + | and a |
- | │ (A9h) │ ... │ о │ │ │ | + | jr z,main_loop ; клавиши не нажимались |
- | │ │ 7 │ д │ │ │ | + | ld h,KEY_MATRIX_LAYOUT/256 ; H=старший байт таблмцы |
- | ├────────┼─────┼───────┼───────┼──────────────────────────────┤ | + | ld a,(hl) |
- | │ │ 0 │ │ KB0 │ │ | + | cp #1B ; ESC? |
- | │ │ 1 │ │ KB1 │ Выбор строки при сканирова‐ │ | + | jr z,exit_2_dos |
- | │ │ 2 │ │ KB2 │ нии клавиатуры │ | + | push af |
- | │ │ 3 │ В │ KB3 │ │ | + | ld hl,(NAMBAS) |
- | │ ├─────┤ ├───────┼──────────────────────────────┤ | + | ld a,l |
- | │ │ 4 │ Ы │ CASON │ CAS CTRL (1-ON) │ | + | out (#99),a |
- | │ │ │ │ │ кассетник включен мотор │ | + | ld a,h |
- | │ C ├─────┤ В ├───────┼──────────────────────────────┤ | + | or #40 |
- | │ (AAh) │ 5 │ │ CASW │ Запись на кассету │ | + | out (#99),a |
- | │ ├─────┤ О ├───────┼──────────────────────────────┤ | + | pop af |
- | │ │ 6 │ │ CAPS │ CAPS LAMP (1-ON) │ | + | out (#98),a ; печатаем символ |
- | │ │ │ Д │ │ Вкл/выкл заглавных букв │ | + | jr main_loop |
- | │ ├─────┤ ├───────┼──────────────────────────────┤ | + | exit_2_dos: |
- | │ │ 7 │ │ SOUND │ Вывод звука (SOFT) │ | + | 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 " " | ||
+ | ;---------------------------------------------------------------------------- | ||
</code> | </code> | ||
- | ===== A8h ===== | ||
- | A8h — это порт для доступа к основному регистру выбора слотов. (Используется PPI порт A) | ||
- | * бит 0–1 = номер слота для выбора на странице 0 (0000h–3FFFh) | ||
- | * бит 2–3 = номер слота для выбора на странице 1 (4000h–7FFFh) | ||
- | * бит 4–5 = номер слота для выбора на странице 2 (8000h–BFFFh) | ||
- | * бит 6–7 = номер слота для выбора на странице 3 (C000h–FFFFh) | ||
- | ===== A9h ===== | + | Более подробно см. здесь: [[http://map.grauw.nl/articles/keymatrix.php|MSX Assembly Page: Keyboard matrices]] |
- | A9h — это порт для чтения строки матрицы клавиатуры, указанной через порт AAh. (Используется PPI порт B) | + | |
- | ===== AAh ===== | ||
- | AAh — это порт для доступа к регистру, который управляет светодиодом CAPS клавиатуры, двумя сигналами для регистратора данных и строкой матрицы (используется PPI порт C). | + | {{anchor:registers}} |
+ | ====== Регистры ====== | ||
- | * бит 0–3 = номер строки указанной [[msx:russification:russification#matrix|матрицы клавиатуры]] для чтения через порт B | + | Здесь приведено соответствие регистров PPI и портов ввода/вывода: |
- | * бит 4 = мотор магнитофона (сброс для включения) | + | ^ Регистр ^ Порт ^ Бит ^ Режим \\ (ввод/выход) ^ Имя ^ Назначение ^ |
- | * бит 5 = режим записи на ленту магнитофона | + | | A {{anchor:reg_a}} | A8 {{anchor:a8}} | 0 | ввод/выход | CS0 L |Выбор слота для адресов в диапазоне 0000-3FFF| |
- | * бит 6 = светодиодный индикатор клавиатуры CAPS (сброс для включения) | + | |:::|:::| 1 |:::| CS0 H |:::| |
- | * бит 7 = 1, затем 0 вскоре после этого, чтобы издать звук "щелчка" (используется для клавиатуры). | + | |:::|:::| 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) Вкл./выкл. режим ввода заглавных букв (индикатор на клавише <key>CAPS</key>)| | ||
+ | |:::|:::| 7 |:::| SOUND |Вывод звука (1, затем 0, чтобы издать звук "щелчка" клавиатуры)| | ||
+ | | Управление {{anchor:reg_m}} | AB {{anchor:ab}} | 0 | вход | |статус бита для изменения| | ||
+ | |:::|:::| 1 |:::| |Номер бита, который необходимо изменить в [[#reg_c|порту C PPI]]| | ||
+ | |:::|:::| 2 |:::| |:::| | ||
+ | |:::|:::| 3 |:::| |:::| | ||
+ | |:::|:::| 4 |:::| |Не используется| | ||
+ | |:::|:::| 5 |:::| |:::| | ||
+ | |:::|:::| 6 |:::| |:::| | ||
+ | |:::|:::| 7 |:::| |Всегда должен быть сброшен| | ||
- | ===== ABh ===== | ||
- | |||
- | ABh — порт для доступа к регистру управления портами (Только запись) | ||
- | |||
- | * бит 0 = статус бита для изменения | ||
- | * бит 1–3 = номер бита, который необходимо изменить в порту C PPI | ||
- | * бит 4–6 = не используется | ||
- | * бит 7 = Всегда должен быть сброшен на MSX. | ||
====== Ссылки ====== | ====== Ссылки ====== | ||
Строка 91: | Строка 183: | ||
- | {{tag>MSX }} | + | {{tag>MSX Norm}} |