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

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


msx:ppi

Различия

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

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

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
Последняя версия Следующая версия справа и слева
msx:ppi [2020-11-05 10:17]
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}}
 ====== Регистры ====== ====== Регистры ======
  
-Регистры PPI также могут быть добавлены через следующие порты ввода/​вывода+Здесь приведено соответствие регистров PPI и портов ввода/​вывода:​ 
- +^  Регистр ​ ^  Порт ​ ^  Бит ​ ^  Режим \\ (ввод/​выход)  ^  Имя ​ ^  Назначение ​  ^ 
-FIXME +|  ​{{anchor:​reg_a}} ​ |  ​A8 {{anchor:​a8}} ​ |  0  |  ввод/​выход  |  ​CS0 L   |Выбор слота для адресов в диапазоне 0000-3FFF| 
- +|:::​|:::​| ​ 1  |:::​|  ​CS0 H  ​|:::​| 
-Порты программируемого периферийного интерфейса (PPI ports)+|:::​|:::​| ​ 2  |:::​|  ​CS1 L   |Выбор слота для адресов в диапазоне 4000-7FFF| 
-^  Регистр ​ ^  Порт ​ ^  Бит ​ ^  Режим \\ (ввод/​вывод)  ^  Имя ​ ^  Назначение ​  ^ +|:::​|:::​| ​ 3  |:::​|  ​CS1 H  ​|:::​| 
-|  {{anchor:​reg_a}} ​ ​| ​ {{anchor:​a8}} ​A8  ​| ​ 0  |  ввод/​вывод  |  ​CS0L   |Выбор слота для адресов в диапазоне 0000-3FFF| +|:::​|:::​| ​ 4  |:::​|  ​CS2 L   |Выбор слота для адресов в диапазоне 8000-BFFF| 
-|:::​|:::​| ​ 1  |:::​|  ​CS0H  ​|:::​| +|:::​|:::​| ​ 5  |:::​|  ​CS2 H  ​|:::​| 
-|:::​|:::​| ​ 2  |:::​|  ​CS1L   |Выбор слота для адресов в диапазоне 4000-7FFF| +|:::​|:::​| ​ 6  |:::​|  ​CS3 L   |Выбор слота для адресов в диапазоне C000-FFFF| 
-|:::​|:::​| ​ 3  |:::​|  ​CS1H  ​|:::​| +|:::​|:::​| ​ 7  |:::​|  ​CS3 H  ​|:::​| 
-|:::​|:::​| ​ 4  |:::​|  ​CS2L   |Выбор слота для адресов в диапазоне 8000-BFFF| +|  ​{{anchor:​reg_b}} ​ |  ​A9 {{anchor:​a9}} ​ |  0  |  ввод ​ |  |Состояние строки ​[[msx:​russification:#​matrix|матрицы ​клавиатуры]], указанной через порт [[#AA]] битами KB1–KB3 \\ **Если клавиша нажата,​ то соответствующий бит устанавливается в 0**|
-|:::​|:::​| ​ 5  |:::​|  ​CS2H  ​|:::​| +
-|:::​|:::​| ​ 6  |:::​|  ​CS3L   |Выбор слота для адресов в диапазоне C000-FFFF| +
-|:::​|:::​| ​ 7  |:::​|  ​CS3H  ​|:::​| +
-|  {{anchor:​reg_b}} ​ ​| ​ {{anchor:​a9}} ​A9  ​| ​ 0  |  ввод ​ |  |Состояние строки клавиатуры|+
 |:::​|:::​| ​ 1  |:::​|:::​|:::​| |:::​|:::​| ​ 1  |:::​|:::​|:::​|
 |:::​|:::​| ​ 2  |:::​|:::​|:::​| |:::​|:::​| ​ 2  |:::​|:::​|:::​|
Строка 36: Строка 161:
 |:::​|:::​| ​ 6  |:::​|:::​|:::​| |:::​|:::​| ​ 6  |:::​|:::​|:::​|
 |:::​|:::​| ​ 7  |:::​|:::​|:::​| |:::​|:::​| ​ 7  |:::​|:::​|:::​|
-|  {{anchor:​reg_c}} ​ ​| ​ {{anchor:​aa}} ​AA  ​| ​ 0  |  выход ​ |  KB0  |Выбор строки ​при сканировании клавиатуры|+|  ​{{anchor:​reg_c}} ​ |  ​AA {{anchor:​aa}} ​ |  0  |  выход ​ |  KB0  |Выбор строки ​[[msx:​russification:​russification#​matrix|матрицы клавиатуры]] для сканирования|
 |:::​|:::​| ​ 1  |:::|  KB1  |:::| |:::​|:::​| ​ 1  |:::|  KB1  |:::|
 |:::​|:::​| ​ 2  |:::|  KB2  |:::| |:::​|:::​| ​ 2  |:::|  KB2  |:::|
 |:::​|:::​| ​ 3  |:::|  KB3  |:::| |:::​|:::​| ​ 3  |:::|  KB3  |:::|
-|:::​|:::​| ​ 4  |:::|  CASON  |CAS CTRL (1-ON) — Включен мотор[[msx:​data_recorder|магнитофона]]|+|:::​|:::​| ​ 4  |:::|  CASON  |CAS CTRL (сброс для включения = 1) — Включение мотора [[msx:​data_recorder|магнитофона]]|
 |:::​|:::​| ​ 5  |:::|  CASW  |Включен режим записи на [[msx:​data_recorder|магнитофон]]| |:::​|:::​| ​ 5  |:::|  CASW  |Включен режим записи на [[msx:​data_recorder|магнитофон]]|
-|:::​|:::​| ​ 6  |:::|  CAPS  |CAPS LAMP (1-ON) Вкл./​выкл. режим ввода заглавных букв (индикатор на клавише <​key>​CAPS</​key>​)| +|:::​|:::​| ​ 6  |:::|  CAPS  |CAPS LAMP (сброс для включения = 1) Вкл./​выкл. режим ввода заглавных букв (индикатор на клавише <​key>​CAPS</​key>​)| 
-|:::​|:::​| ​ 7  |:::|  SOUND  |Вывод звука (SOFT)|+|:::​|:::​| ​ 7  |:::|  SOUND  |Вывод звука (1, затем 0, чтобы издать звук "​щелчка"​ клавиатуры)
 +|  Управление {{anchor:​reg_m}} ​ |  AB {{anchor:​ab}} ​ |  0  |  вход ​ |  |статус бита для изменения| 
 +|:::​|:::​| ​ 1  |:::|   ​|Номер бита, который необходимо изменить в [[#​reg_c|порту C PPI]]| 
 +|:::​|:::​| ​ 2  |:::|   ​|:::​| 
 +|:::​|:::​| ​ 3  |:::|   ​|:::​| 
 +|:::​|:::​| ​ 4  |:::|   |Не используется| 
 +|:::​|:::​| ​ 5  |:::|   ​|:::​| 
 +|:::​|:::​| ​ 6  |:::|   ​|:::​| 
 +|:::​|:::​| ​ 7  |:::|   ​|Всегда должен быть сброшен|
  
-===== 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 ===== 
-A9h — это порт для чтения строки матрицы клавиатуры,​ указанной через порт AAh. (Используется PPI порт B) 
- 
-===== AAh ===== 
- 
-AAh — это порт для доступа к регистру,​ который управляет светодиодом CAPS клавиатуры,​ двумя сигналами для регистратора данных и строкой матрицы (используется PPI порт C). 
- 
-  * бит 0–3 = номер строки указанной [[msx:​russification:​russification#​matrix|матрицы клавиатуры]] для чтения через порт B 
-  * бит 4 = мотор магнитофона (сброс для включения) 
-  * бит 5 = режим записи на ленту магнитофона 
-  * бит 6 = светодиодный индикатор клавиатуры CAPS (сброс для включения) 
-  * бит 7 = 1, затем 0 вскоре после этого, чтобы издать звук "​щелчка"​ (используется для клавиатуры). 
- 
-===== ABh ===== 
- 
-ABh — порт для доступа к регистру управления портами (Только запись) 
- 
-  * бит 0 = статус бита для изменения 
-  * бит 1–3 = номер бита, который необходимо изменить в порту C PPI 
-  * бит 4–6 = не используется 
-  * бит 7 = Всегда должен быть сброшен на MSX. 
 ====== Ссылки ====== ====== Ссылки ======
  
Строка 81: Строка 186:
  
 {{tag>​MSX Norm}} {{tag>​MSX Norm}}
- 
msx/ppi.txt · Последние изменения: 2022-09-01 21:14 — GreyWolf