Здесь показаны различия между двумя версиями данной страницы.
Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия Последняя версия Следующая версия справа и слева | ||
msx:ppi [2020-11-05 11:04] GreyWolf [Регистры] |
msx:ppi [2022-09-01 21:13] GreyWolf [Пример опроса клавиатуры без использования подпрограмм ПЗУ] |
||
---|---|---|---|
Строка 3: | Строка 3: | ||
В MSX PPI (программируемый периферийный интерфейс) — это микросхема, используемая для переключения слотов, управления клавиатурой (включая звук "щелчка") и [[msx:data_recorder|кассетным магнитофоном]]. | В MSX PPI (программируемый периферийный интерфейс) — это микросхема, используемая для переключения слотов, управления клавиатурой (включая звук "щелчка") и [[msx:data_recorder|кассетным магнитофоном]]. | ||
- | PPI, используемый системами MSX, основан на Intel 8255, хотя в большинстве систем присутствует клон или функциональность интегрирована в микросхему [[msx:msx_engine:msx_engine|]]. | + | PPI, используемый системами MSX, основан на Intel 8255, хотя в большинстве систем присутствует клон или функциональность интегрирована в микросхему [[msx:msx_engine:|]]. |
{{anchor:keyboard}} | {{anchor:keyboard}} | ||
====== Клавиатура ====== | ====== Клавиатура ====== | ||
+ | |||
+ | Описание клавиатуры приведено на странице: [[msx:russification:|]]. | ||
+ | |||
+ | {{anchor:work_keyboard_without_rom}} | ||
+ | ===== Пример опроса клавиатуры без использования подпрограмм ПЗУ ===== | ||
FIXME | FIXME | ||
+ | |||
+ | Пример опроса клавиатуры без использования подпрограмм [[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 | | ||
+ | |||
+ | Это пример раскладки без "шифта" и не расширенной клавиатуры: | ||
+ | <code> | ||
+ | ;------------------------------------------------------- | ||
+ | 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 " " | ||
+ | ;---------------------------------------------------------------------------- | ||
+ | </code> | ||
+ | |||
+ | Более подробно см. здесь: [[http://map.grauw.nl/articles/keymatrix.php|MSX Assembly Page: Keyboard matrices]] | ||
+ | |||
{{anchor:registers}} | {{anchor:registers}} | ||
Строка 15: | Строка 144: | ||
Здесь приведено соответствие регистров PPI и портов ввода/вывода: | Здесь приведено соответствие регистров PPI и портов ввода/вывода: | ||
- | ^ Регистр ^ Порт ^ Бит ^ Режим \\ (ввод/вывод) ^ Имя ^ Назначение ^ | + | ^ Регистр ^ Порт ^ Бит ^ Режим \\ (ввод/выход) ^ Имя ^ Назначение ^ |
- | | {{anchor:reg_a}} A | {{anchor:a8}} A8 | 0 | ввод/вывод | CS0L |Выбор слота для адресов в диапазоне 0000-3FFF| | + | | A {{anchor:reg_a}} | A8 {{anchor:a8}} | 0 | ввод/выход | CS0 L |Выбор слота для адресов в диапазоне 0000-3FFF| |
- | |:::|:::| 1 |:::| CS0H |:::| | + | |:::|:::| 1 |:::| CS0 H |:::| |
- | |:::|:::| 2 |:::| CS1L |Выбор слота для адресов в диапазоне 4000-7FFF| | + | |:::|:::| 2 |:::| CS1 L |Выбор слота для адресов в диапазоне 4000-7FFF| |
- | |:::|:::| 3 |:::| CS1H |:::| | + | |:::|:::| 3 |:::| CS1 H |:::| |
- | |:::|:::| 4 |:::| CS2L |Выбор слота для адресов в диапазоне 8000-BFFF| | + | |:::|:::| 4 |:::| CS2 L |Выбор слота для адресов в диапазоне 8000-BFFF| |
- | |:::|:::| 5 |:::| CS2H |:::| | + | |:::|:::| 5 |:::| CS2 H |:::| |
- | |:::|:::| 6 |:::| CS3L |Выбор слота для адресов в диапазоне C000-FFFF| | + | |:::|:::| 6 |:::| CS3 L |Выбор слота для адресов в диапазоне C000-FFFF| |
- | |:::|:::| 7 |:::| CS3H |:::| | + | |:::|:::| 7 |:::| CS3 H |:::| |
- | | {{anchor:reg_b}} B | {{anchor:a9}} A9 | 0 | ввод | |Состояние строки [[msx:russification:russification#matrix|матрицы клавиатуры]], указанной через порт [[#AA]] битами KB1–KB3| | + | | B {{anchor:reg_b}} | A9 {{anchor:a9}} | 0 | ввод | |Состояние строки [[msx:russification:#matrix|матрицы клавиатуры]], указанной через порт [[#AA]] битами KB1–KB3 \\ **Если клавиша нажата, то соответствующий бит устанавливается в 0**| |
|:::|:::| 1 |:::|:::|:::| | |:::|:::| 1 |:::|:::|:::| | ||
|:::|:::| 2 |:::|:::|:::| | |:::|:::| 2 |:::|:::|:::| | ||
Строка 32: | Строка 161: | ||
|:::|:::| 6 |:::|:::|:::| | |:::|:::| 6 |:::|:::|:::| | ||
|:::|:::| 7 |:::|:::|:::| | |:::|:::| 7 |:::|:::|:::| | ||
- | | {{anchor:reg_c}} C | {{anchor:aa}} AA | 0 | выход | KB0 |Выбор строки [[msx:russification:russification#matrix|матрицы клавиатуры]] для сканирования| | + | | C {{anchor:reg_c}} | AA {{anchor:aa}} | 0 | выход | KB0 |Выбор строки [[msx:russification:russification#matrix|матрицы клавиатуры]] для сканирования| |
|:::|:::| 1 |:::| KB1 |:::| | |:::|:::| 1 |:::| KB1 |:::| | ||
|:::|:::| 2 |:::| KB2 |:::| | |:::|:::| 2 |:::| KB2 |:::| | ||
Строка 40: | Строка 169: | ||
|:::|:::| 6 |:::| CAPS |CAPS LAMP (сброс для включения = 1) Вкл./выкл. режим ввода заглавных букв (индикатор на клавише <key>CAPS</key>)| | |:::|:::| 6 |:::| CAPS |CAPS LAMP (сброс для включения = 1) Вкл./выкл. режим ввода заглавных букв (индикатор на клавише <key>CAPS</key>)| | ||
|:::|:::| 7 |:::| SOUND |Вывод звука (1, затем 0, чтобы издать звук "щелчка" клавиатуры)| | |:::|:::| 7 |:::| SOUND |Вывод звука (1, затем 0, чтобы издать звук "щелчка" клавиатуры)| | ||
- | | {{anchor:reg_m}} Управление | {{anchor:ab}} AB | 0 | вход | |статус бита для изменения| | + | | Управление {{anchor:reg_m}} | AB {{anchor:ab}} | 0 | вход | |статус бита для изменения| |
|:::|:::| 1 |:::| |Номер бита, который необходимо изменить в [[#reg_c|порту C PPI]]| | |:::|:::| 1 |:::| |Номер бита, который необходимо изменить в [[#reg_c|порту C PPI]]| | ||
|:::|:::| 2 |:::| |:::| | |:::|:::| 2 |:::| |:::| | ||
Строка 57: | Строка 186: | ||
{{tag>MSX Norm}} | {{tag>MSX Norm}} | ||
- |