Инструменты пользователя

Инструменты сайта


msx:ppi

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
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) 
-│        │  ​ ​│ ​      │ 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" 
 +;строка 
 + db "​cdefghij" ​           
 +;строка 
 + 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|матрицы клавиатуры]] ​для чтения через порт ​+Здесь приведено соответствие регистров PPI и портов ввода/​вывода:​ 
-  * бит ​4 = мотор магнитофона (сброс для включения) +^  Регистр ​ ^  Порт ​ ^  Бит ​ ^  Режим \\ (ввод/​выход) ​ ^  Имя ​ ^  Назначение ​  ^ 
-  * бит 5 режим записи на ленту ​магнитофона +|  A {{anchor:​reg_a}} ​ |  A8 {{anchor:​a8}} ​ |  ​ ​| ​ ввод/​выход ​ |  CS0 L   ​|Выбор слота для адресов в диапазоне 0000-3FFF| 
-  ​бит 6 светодиодный индикатор клавиатуры CAPS (сброс для включения+|:::​|:::​| ​ 1  |:::|  CS0 H  |:::| 
-  ​* бит ​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|магнитофона]]| 
 +|:::​|:::​|  ​ ​|:::​| ​ 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}}
msx/ppi.1604428366.txt.gz · Последние изменения: 2020-11-03 21:32 — GreyWolf