а |
б |
в |
г |
Рис. 3.19. Интерфейсные схемы клавиатуры: а – формирователь X2; б – флаг клавиатуры; в – формирователь шины данных для ввода; г – расположение клавиш
Анализ назначения нажатой клавиши. Функциональное назначение клавиш показано на рис. 3.19, г: клавиши k = 0, 1, , 7 задают скорость движения цели vj (j = k), k = 8 и 9 – направление движения цели (клавиши 10 и 11
не используются), k = 12, 13, 14, 15 – период Ti сигнала G (i = 1, 2, 3, 4). Коды этих трех групп клавиш различаются значением двух старших
разрядов DO3DO2: 10 – направление движения; 00 и 01 – значение скорости vj; 11 – значение периода Ti. Для принятия решения маской 00001100 выделяются разряды DO3DO2 и содержимое аккумулятора сравнивается с числом 8: содержимое равно 8, если нажатая клавиша имеет коды 10 (клавиши направления движения); содержимое больше 8, если нажатая клавиша имеет коды 11 (клавиши значений периода Ti); содержимое меньше 8, если нажа-
тая клавиша имеет коды 0 (клавиши значений скорости vj). Программа обслуживания клавиатуры при использовании МЭ (два 16-разрядных счетчика для задания периода и один 16-разрядный счетчик для задания скорости
движения vj и программного ввода данных с квитированием имеет вид (зада-
ны адреса клавиатуры – 28h, триггера направления – 68h).
- 26 -
L1: |
IN |
port_KB |
; А = DO DO DO DO DO |
0 |
|||||
|
MOV |
C,A |
|
|
4 |
3 |
2 |
1 |
|
|
; запоминание кода в регистре C |
||||||||
|
ANI |
10h |
; A = 0 0 0 D4 0 0 0 0 (квитирование) |
||||||
|
JZ |
L1 |
; если D4 = IR = 0, повторный ввод |
||||||
|
OUT |
port_KB |
; сброс флага клавиатуры DO4 (см. рис. 3.19, б) |
||||||
|
MVI |
A,0Fh |
; A = 0 0 0 0 1 1 1 1 |
|
|
|
|||
|
ANA |
C |
; 0 0 0 D3D2D1D0 – код нажатой клавиши |
||||||
|
MOV |
C,A |
; запоминание в регистре C кода нажатой клавиши |
||||||
|
ANI |
0Ch |
; A = 0 0 0 0 D3D2 0 0 |
|
|
|
|||
|
CPI |
8 |
; сравнение старших разрядов кода с числом 8 |
||||||
|
JZ |
L2 |
; переход к заданию направления движения |
||||||
|
JC |
L3 |
; переход к заданию скорости движения |
||||||
|
CALL |
TAB |
; подпрограмма чтения таблицы данных |
||||||
|
OUT |
port_dLT |
; запись d |
ML |
в регистр младшего байта счетчика M |
||||
|
INX |
H |
|
|
|
|
|
1i |
|
|
; адрес старшего байта dMM данных |
||||||||
|
MOV |
A,M |
; пересылка dMM в аккумулятор |
||||||
|
OUT |
port_dMT |
; запись d |
MM |
в регистр старшего байта счетчика M |
||||
|
JMP |
L1 |
|
|
|
|
|
1i |
|
L2: |
; переход на ввод кода клавиши |
||||||||
MOV |
A,C |
; A = 0 0 0 0 D3D2D1D0 – код нажатой клавиши |
|||||||
|
OUT |
port_X2 |
; запись D0 = DAL0 в триггер знака (см. рис. 3.19, а) |
||||||
L3: |
JMP |
L1 |
|
|
|
|
|
|
|
CALL |
TAB |
; подпрограмма чтения таблицы данных |
|||||||
|
OUT |
port_dLV |
; запись d |
ML |
в регистр младшего байта счетчика M |
||||
|
INX |
H |
|
|
|
|
|
1j |
|
|
|
|
|
|
|
|
|
||
|
MOV |
A,M |
; A = dMM |
|
|
|
|
|
|
|
OUT |
port_dMV |
; запись d |
MM |
в регистр старшего байта счетчика M |
||||
|
JMP |
L1 |
|
|
|
|
|
1j |
|
|
|
|
|
|
|
|
|
||
TAB: LXI |
H,700h |
; rp H = 0700h |
|
|
|
|
|||
|
MOV |
A,C |
; A = 0 0 0 0 D3D2D1D0 – код нажатой клавиши |
||||||
|
ADD |
A |
; A = A + A = 2C |
|
|
|
|
||
|
MOV |
C,A |
; формирование в rp B числа, равного |
||||||
|
MVI |
B,0 |
; удвоенному коду клавиши |
|
|||||
|
DAD |
B |
; HL = HL + BC = 0700h + 2C – адрес памяти |
||||||
|
MOV |
A,M |
; A = dML – младший байт данных |
||||||
|
RET |
|
|
|
|
|
|
|
|
Для таблицы данных отведена область ПЗУ, начинается с адреса 0700h. Для хранения двухбайтовых чисел используются две соседние ячейки памяти
- 27 -
с адресами A и A + 1. Подпрограмма TAB определяет адрес младшего байта данных и читает его из ПЗУ. Для определения адреса A по коду нажатой клавиши к начальному адресу 0700h прибавляется удвоенный код клавиши. Таким образом, по коду клавиши, например, с номером k = 2, задающей в соот-
ветствии с рис. 3.19, г скорость v2, определяются адреса двух ячеек памяти 0704h и 0705h, где хранятся соответственно младший и старший байты числа dM2 . При выполнении команды OUT port_KB на ЛЭ ИЛИ (см. рис. 3.19, б)
поступают сигналы portKB = 0 и I / OW = 0, на выходе ЛЭ вырабатывается сигнал R = 0, устанавливающий триггер флага клавиатуры в состояние Q = 0, что приводит к сбросу флага клавиатуры (сигнал DO4 = 0). При выполнении команды OUT CSX2 по сигналам portX 2 =0 и I / OW = 0 вырабатывается сигнал = 0 (см. рис. 3.19, а), перепадом с 0 на 1 которого в триггер знака x2
записывается значение разряда BD0 = DO0.
Если ввод данных с клавиатуры производится по прерыванию (сигнал IR подается на вход RST7.5), тогда программа обработки прерываний должна начаться с запоминания содержимого регистровых пар, аккумулятора и регистра признаков. Затем следует ввод данных и их анализ.
PUSH |
H |
PUSH |
B |
PUSH |
PSW |
IN |
CSKB |
MOV |
C,A |
MVI |
A,0Fh |
ANA |
C |
MOV |
C,A |
ANI |
0Ch |
CPI |
8 |
JZ |
L2 |
JC |
L3 |
CALL |
TAB |
OUT |
port_dLT |
INX |
H |
MOV |
A,M |
OUT |
port_dMT |
JMP |
L1 |
;А = DO4DO3DO2DO1DO0
;запоминание кода в регистре C
;A = 0 0 0 0 1 1 1 1
;0 0 0 D3D2D1D0 – код нажатой клавиши
;запоминание в регистре C кода нажатой клавиши
;A = 0 0 0 0 D3D2 0 0
;сравнение старших разрядов кода с числом 8
;переход к заданию направления движения
;переход к заданию скорости движения
;подпрограмма чтения таблицы данных
;записьdML врегистрмладшегобайта(см. рис. 3.12)
;адрес старшего байта dMM данных
;пересылка dMM в аккумулятор
;записьdMM врегистрстаршегобайта(см. рис. 3.12)
- 28 -
L2: |
MOV |
A,C |
|
OUT |
port_X2 |
|
JMP |
L1 |
L3: |
CALL |
TAB |
|
OUT |
port_dLV |
|
INX |
H |
|
MOV |
A,M |
|
OUT |
port_dMV |
|
JMP |
L1 |
TAB: LXI |
H,700h |
|
|
MOV |
A,C |
|
ADD |
A |
|
MOV |
C,A |
|
MVI |
B,0 |
|
DAD |
B |
|
MOV |
A,M |
|
RET |
|
L1: |
POP |
PSW |
|
POP |
B |
|
POP |
H |
|
EI |
|
RET
;A = 0 00 0 D3D2D1D0 – код нажатой клавиши
;записьD0 = DAL0 втриггерзнака(см. рис. 3.19, а)
;подпрограмма чтения таблицы данных
;запись dML в регистр младшего байта счетчика
;M1j, рис. 3.16
;A = dMM
;запись dMM в регистр старшего байта счетчика
;M1j, рис. 3.16
;rp H = 0700h
;A = 0 0 0 0 D3D2D1D0 – код нажатой клавиши
;A = A + A = 2C
;формирование в rp B числа, равного
;удвоенному коду клавиши
;HL = HL + BC = 0700h + 2C – адрес памяти
;A = dML – младший байт данных
;разрешение всех прерываний (после следующей
;команды)
;возврат из подпрограммы обработки прерываний
;RST 7.5
3.7.Приемопередатчик, обслуживающий внешние устройства схемы
Через этот приемопередатчик осуществляется связь системной шины данных с внешними устройствами. На рис. 3.20 представлена схема приемопередатчика, в котором шина DB[7..0] подключена к локальной шине DAL[7..0], а шина DA[7..0] – к системной шине DBS[7..0]. При T = 1 обеспечивается передача от шины DA приемопередатчика к шине DB. Сигнал T =
= RD , поэтому при выполнении команды IN port сигнал RD = 0 и приемопередатчик передает данные от внешнего устройства через локальную шину DB к системной шине DA, а далее от системной шины процессора через приемопередатчик процессора к локальной шине и в процессор. При выполнении
- 29 -
Рис. 3.20. Приемопередатчик внешних устройств
команды OUT port сигнал RD = 1, происходит передача данных от DA к DB в приемопередатчике процессора, т. е. на системную шину данных, а затем от DA к DB в приемопередатчике внешних устройств, т. е. от системной шины данных к локальной и далее во внешнее устройство.
3.8. Дешифратор адресов
При работе имитатора CPU обращается к следующим устройствам: две схемы памяти (ПЗУ и ОЗУ):
○ ПЗУ 573РФ2 объемом 2K 8 бит (для хранения программного обес-
|
печения и таблицы данных); |
|
○ ОЗУ 537РУ10 объемом 2K 8 бит (для |
|
стека и хранения данных). |
|
Поэтому необходимо использовать два |
|
дешифратора адресов – адресов схем памяти и |
|
адресов внешних устройств. Дешифратор адре- |
|
сов схем памяти выполнен на МЭ 74138 |
Рис. 3.21. Дешифратор адресов |
(рис. 3.21). Назначение выходных сигналов де- |
схем памяти |
шифратора, значения начальных ABEG и конеч- |
ных AEND адресов представлены в табл. 3.12. При построении схемы на макроэлементах, в состав которой входят два
16-разрядных счетчика, число внешних устройств увеличивается до восьми:
○регистр младшего байта данных в делителе на M1i
-30 -