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

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


msx:ppi

Это старая версия документа!


MSX — Программируемый периферийный интерфейс (PPI)

В MSX PPI (программируемый периферийный интерфейс) — это микросхема, используемая для переключения слотов, управления клавиатурой (включая звук «щелчка») и кассетным магнитофоном.

PPI, используемый системами MSX, основан на Intel 8255, хотя в большинстве систем присутствует клон или функциональность интегрирована в микросхему MSX Engine.

Клавиатура

Описание клавиатуры приведено на странице: Русификация MSX.

Пример опроса клавиатуры без использования подпрограмм ПЗУ

FIXME

Пример опроса клавиатуры без использования подпрограмм MSX — ПЗУ, автор KoD/SDM

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

Для опроса клавиатуры используются два порта - #A9 и #AA

ПОРТ #A9, PPI Port B - Keyboard Column Inputs (Read Only)
Чтение из этого порта вернет состояние выбранной строки клавиатуры (выбранной через порт #AA)
Биты 0-7 соответствует одной из 8 клавиш в каждой строке матрицы клавиатуры 

PS ЕСЛИ КЛАВИША НАЖАТА, ТО СООТВЕТСТВУЮЩИЙ БИТ УСТАНАВЛИВАЕТСЯ В 0


ПОРТ 0AAh, PPI Port C - Keyboard Row,LED,Cassette (Read/Write)
Биты 0-3 соответствуют строке матрицы клавиатуры


Пример интернациональной раскладки матрицы клавиатуры

ПОРТ #A9	bit 7  bit 6  bit 5  bit 4  bit 3  bit 2  bit 1  bit 0

ПОРТ #AA
строка 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

PS  это пример раскладки без "шифта" и не расширеной клавиатуры
    Более подробно см. здесь http://map.grauw.nl/articles/keymatrix.php

;-------------------------------------------------------
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	"        "
;----------------------------------------------------------------------------

MSX Assembly Page: Keyboard matrices

Регистры

Здесь приведено соответствие регистров PPI и портов ввода/вывода:

Регистр Порт Бит Режим
(ввод/вывод)
Имя Назначение
A 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 A9 0 ввод Состояние строки матрицы клавиатуры, указанной через порт AA битами KB1–KB3
1
2
3
4
5
6
7
C AA 0 выход KB0 Выбор строки матрицы клавиатуры для сканирования
1 KB1
2 KB2
3 KB3
4 CASON CAS CTRL (сброс для включения = 1) — Включение мотора магнитофона
5 CASW Включен режим записи на магнитофон
6 CAPS CAPS LAMP (сброс для включения = 1) Вкл./выкл. режим ввода заглавных букв (индикатор на клавише CAPS)
7 SOUND Вывод звука (1, затем 0, чтобы издать звук «щелчка» клавиатуры)
Управление AB 0 вход статус бита для изменения
1 Номер бита, который необходимо изменить в порту C PPI
2
3
4 Не используется
5
6
7 Всегда должен быть сброшен

Ссылки

msx/ppi.1662052430.txt.gz · Последние изменения: 2022-09-01 20:13 — GreyWolf