POP H ;
RET ;
;
EXIT:
HLT ; Останов
;
;
;
;Загрузка Х в EHLLOAD: LXI H,1000h ;загрузка в HL адреса порядка Х MOV E,M ;загрузка порядка Х в Е LHLD 1001h ;загрузка мантиссы в HL
RET ;
;Загрузка Х в DBC
LOAD1:
PUSH H ;выгрузка в стек HL
LXI H,1000h ;загрузка в HL адреса порядка Х
MOV D,M ;загрузка порядка Х в D
INX H ;
MOV B,M ;
INX H ;
MOV C,M ;загрузка мантиссы в BC
POP H ;загрузка из стека HL
RET ;
;Образование дополнительного кода числа в регистре HL
comp:
mov A,H ;
CMA ;
MOV H,A ;
MOV A,L ;
CMA ;
MOV L,A ;
INX H ;
RET ;
;Проверка знака и образование дополнительного кода
NEG:
MOV A,E ;
ORA E ;
JP NOTDK ;
CALL COMP ; Образование дополнительного кода числа в регистре HL
NOTDK: RET ;
;Сдвиг содержимого HL вправо на 1 бит:
SHIFT:
MOV A,H ;
RAR ;
MOV H,A ;
MOV A,L ;
RAR ;
MOV L,A ;
RET ;
;Обмен содержимого регистров EHL и DBC
SWAP:
PUSH B ;
XTHL ;
POP B ;
MOV A,D ;
MOV D,E ;
MOV E,A ;
RET ;
;Восстановление числа с плавающей точкой
REC:
MOV A,H ;
ADD A ;
MOV A,E ;
RAL ;
MOV E,A ;
MOV A,H ;
ORI 80H ;
MOV H,A ;
RET ;
;Преобразование числа в стандартный формат
PACK:
LDA SIGN ;
ADD A ;
MOV A,E ;
MOV D,A ;
RAR ;
MOV E,A ;
MOV A,H ;
ANI 7FH ;
MOV H,A ;
MOV A,D ;
RRC ;
ANI 80H ;
ORA H ;
MOV H,A ;
RET ;
;Сложение чисел с плавающей точкой
ADDF:
MOV A,D ;
XRA E ;
JP ADDF1 ;
MOV A,D ;
XRI 80H ;
MOV D,A ;
JMP SUBF ;
;
ADDF1:
MOV A,D ;
ORA B ;
ORA C ;
JZ ADDF8 ;
MOV A,E ;
ORA H ;
ORA L ;
JNZ ADDF2 ;
CALL SWAP ; Обмен содержимого регистров EHL и DBC
JMP ADDF8 ;
;
ADDF2:
MOV A,D ;
STA SIGN ;
CALL REC ;
CALL SWAP ; Обмен содержимого регистров EHL и DBC
CALL REC ; Восстановление числа с плавающей точкой
;
MOV A,E ;
SUB D ;
JNC ADDF3 ;
CALL SWAP ; Обмен содержимого регистров EHL и DBC
MOV A,E ;
SUB D ;
;
; В EHL большее число, в аккумуляторе разность потенциалов
ADDF3:
JZ ADDF6 ;
CPI 16 ;
JC ADDF4 ;
JMP ADDF7 ;
;
;Можно сдвигать мантиссу меньшего числа
ADDF4:
MOV E,A ;
CALL SWAP ; Обмен содержимого регистров EHL и DBC
ADDF5:
ORA A ;
CALL SHIFT ; Сдвиг содержимого HL вправо на 1 бит:
INR E ;
DCR D ;
JNZ ADDF5 ;
;
;В регистре Е общий порядок. Можно складывать мантиссы
ADDF6:
DAD B ;
JNC ADDF7 ;
INR E ;
JZ ADDF8 ;
ORA A ;
CALL SHIFT ; Сдвиг содержимого HL вправо на 1 бит:
;
ADDF7:
CALL PACK ; Преобразование числа в стандартный формат
;
ADDF8:
RET ;
;
;Вычитание чисел с плавающей точкой
SUBF:
MOV A,D ;
XRA E ;
JP SUBF1 ;
MOV A,D ;
XRI 80H ;
MOV D,A ;
JMP ADDF ; Сложение чисел с плавающей точкой
SUBF1:
MOV A,D ;
ORA B ;
ORA C ;
JZ SUBFA ;
MOV A,E ;
ORA H ;
ORA L ;
JNZ SUBF2 ;
CALL SWAP ; Обмен содержимого регистров EHL и DBC
MOV A,E ;
XRI 80H ;
MOV E,A ;
JMP SUBFA ;
SUBF2:
MOV A,E ;
STA SIGN ;
CALL REC ; Восстановление числа с плавающей точкой
CALL SWAP ; Обмен содержимого регистров EHL и DBC
CALL REC ; Восстановление числа с плавающей точкой
MOV A,D ;
SUB E ;
JNZ SUBF3 ;
MOV A,B ;
CMP H ;
JNZ SUBF3 ;
MOV A,C ;
CMP L ;
JNZ SUBF3 ;
MVI E,0 ;
LXI H,0 ;
JMP SUBFA ;
;
;операнды не равны, необходимо вычитать
SUBF3:
JNC SUBF4 ;
CALL SWAP ; Обмен содержимого регистров EHL и DBC
LDA SIGN ;
XRI 80H ;
STA SIGN ;
;
SUBF4:
MOV A,D ;
SUB E ;
JZ SUBF7 ;
CPI 16 ;
JC SUBF5 ;
CALL SWAP ; Обмен содержимого регистров EHL и DBC
JMP SUBF ;
;
;В регистре А разность порядков, в DBC больший операнд
SUBF5:
MOV E,A ;
SUBF6:
ORA A ;
CALL SHIFT ; Сдвиг содержимого HL вправо на 1 бит:
DCR E ;
JNZ SUBF6 ;
;
;Вычесть мантиссы, результат в EHL
SUBF7:
MOV A,C ;
SUB L ;
MOV L,A ;
MOV A,B ;
SBB H ;
MOV H,A ;
MOV E,D ;
;
;нормализовать и проверить антипереполнение
SUBF8:
MOV A,H ;
ORA H ;
JM SUBF9 ;
DCR E ;
MOV A,E ;
CPI 0FFH ;
STC ;
JZ SUBFA ;
DAD H ;
JMP SUBF8 ;
;
SUBF9:
CALL PACK ; Преобразование числа в стандартный формат
SUBFA:
RET ;
;
;Умножение чисел с плавающей точкой
MULF:
MOV A,E ;
ORA H ;
ORA L ;
JZ MULF8 ;
MOV A,D ;
ORA B ;
ORA C ;
JNZ MULF1 ;
CALL SWAP ; Обмен содержимого регистров EHL и DBC
JMP MULF8 ;
;
;операнды ненулевые, можно умножать
MULF1:
MOV A,D ;
XRA E ;
STA SIGN ;
CALL REC ; Восстановление числа с плавающей точкой
CALL SWAP ; Обмен содержимого регистров EHL и DBC
CALL REC ; Восстановление числа с плавающей точкой
MOV A,D ;
ADD E ;
JC MULF2 ;
SUI 127 ;
JNC MULF3 ;
JMP MULF8 ;
;
MULF2:
ADI 129 ;
JNC MULF3 ;
JMP MULF8 ;
;
;в аккумуляторе А смещенный порядок произведения
MULF3:
MOV C,A ;
MOV E,B ;
MVI D,0 ;
MOV A,H ;
LXI H,0 ;
XCHG ;
DAD H ;
XCHG ;
;
;начало цикла умножения
MULF4:
ORA A ;
RAR ;
JNC MULF5 ;
DAD D ;
;
MULF5:
JZ MULF6 ;
XCHG ;
DAD H ;
XHG ;
JMP MULF4 ;
;
;проверить нарушение нормализации
MULF6:
JNC MULF7 ;
CALL SHIFT ; Сдвиг содержимого HL вправо на 1 бит:
INR C ;
STC ;
JZ MULF8 ;
;
MULF7:
MOV E,C ;
CALL PACK ; Преобразование числа в стандартный формат
;
MULF8:
RET ;
;
;Деление чисел с плавающей точкой
DIVF:
MOV A,E ;
ORA H ;
ORA L ;
JZ DIVF7 ;
MOV A,D ;
ORA B ;
ORA C ;
STC ;
JZ DIVF7 ;
;операнды не равны нулю
MOV A,D ;
XRA E ;
STA SIGN ;
CALL REC ; Восстановление числа с плавающей точкой
CALL SWAP ; Обмен содержимого регистров EHL и DBC
CALL REC ; Восстановление числа с плавающей точкой
CALL SWAP ; Обмен содержимого регистров EHL и DBC
MOV A,E ;
SUB D ;
JNC DIVF1 ;
ADI 127 ;
CMC ;
JC DIVF7 ; возикло антипереполнение
JMP DIVF2 ; перейти на деление мантисс
;
DIVF1:
ADI 127 ; прибавить смещение
JC DIVF7 ; возникло антипереполнение
;
;можно начинать деление мантисс
DIVF2:
STA EXP ;
XCHG ;
LXI H,0 ;
MVI A,16 ; инициализировать счетчик
PUSH PSW ;
JMP DIVF4 ; войти в цикл деления
;
DIVF3:
PUSH PSW ;
DAD H ; сдвинуть влево
XCHG ; частное и остаток
DAD H ;
XCHG ;
;
DIVF4:
PUSH D ; сохранить остаок в стеке
MOV A,E ; вычесть делитель из остатка
SUB C ;
MOV E,A ;
MOV A,D ;
SBB B ;
MOV D,A ;
JC DIVF5 ;
POP PSW ; удалить остаток из стека
INR L ;
PUSH D ;
;
DIVF5:
POP D ; извлечь предыдущий остаток
POP PSW ; извлечь счетчик
DCR A ; декремент счетчика
JNZ DIVF3 ; повторить цикл деления
; деление мантисс закончено
LDA EXP ;
MOV E,A ;
; нормализовать частное
MOV A,H ;
ORA A ;
JM DIVF6 ;
DAD H ;
DCR E ;
CPI 0FFH ; проверить антипереполнение
STC ;
JZ DIVF7 ; возникло антипереполнение
;
DIVF6:
CALL PACK ; Преобразование числа в стандартный формат
DIVF7:
RET ;
;
Контрольная работа № 3
Задача № 1
Построить модель распределения адресного пространства с указанием диапазонов адресов в 16-й системе счисления. В качестве дешифратора адресов используется стандартный дешифратор, к информационным входам которого подключены линии А15, А12, А9 16-разрядной шины адреса.
Выходы дешиф-ратора | Разряды адреса | Диапазоны адресов | |||||||||||||||
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | ||
Y0 | 0 | X | X | 0 | X | X | 0 | X | X | X | X | X | X | X | X | X | 0000h-01FFh, 0400h-05FFh, 0800h-0DFFh2000h-21FFh, 2400h-25FFh, 2800h-2DFFh4000h-41FFh, 4400h-45FFh, 4800h-4DFFh6000h-61FFh, 6400h-65FFh, 6800h-6DFFh |
Y1 | 0 | X | X | 0 | X | X | 1 | X | X | X | X | X | X | X | X | X | 0200h-03FFh, 0600h-07FFh, 0A00h-0FFFh2200h-23FFh, 2600h-27FFh, 2A00h-2FFFh4200h-43FFh, 4600h-47FFh, 4A00h-4FFFh6200h-63FFh, 6600h-67FFh, 6A00h-6FFFh |
Y2 | 0 | X | X | 1 | X | X | 0 | X | X | X | X | X | X | X | X | X | 1000h-11FFh, 1400h-15FFh, 1800h-1DFFh3000h-31FFh, 3400h-35FFh, 3800h-3DFFh5000h-51FFh, 5400h-55FFh, 5800h-5DFFh7000h-71FFh, 7400h-75FFh, 7800h-7DFFh |
Y3 | 0 | X | X | 1 | X | X | 1 | X | X | X | X | X | X | X | X | X | 1200h-13FFh, 1600h-17FFh, 1A00h-1FFFh3200h-33FFh, 3600h-37FFh, 3A00h-3FFFh5200h-53FFh, 5600h-57FFh, 5A00h-5FFFh7200h-73FFh, 7600h-77FFh, 7A00h-7FFFh |
Y4 | 1 | X | X | 0 | X | X | 0 | X | X | X | X | X | X | X | X | X | 8000h-81FFh, 8400h-85FFh, 8800h-8DFFhA000h-A1FFh, A400h-A5FFh, A800h-ADFFhC000h-C1FFh, C400h-C5FFh, C800h-CDFFhE000h-E1FFh, E400h-E5FFh, E800h-EDFFh |
Y5 | 1 | X | X | 0 | X | X | 1 | X | X | X | X | X | X | X | X | X | 8200h-83FFh, 8600h-87FFh, 8A00h-8FFFhA200h-A3FFh, A600h-A7FFh, AA00h-AFFFhC200h-C3FFh, C600h-C7FFh, CA00h-CFFFhE200h-E3FFh, E600h-E7FFh, EA00h-EFFFh |
Y6 | 1 | X | X | 1 | X | X | 0 | X | X | X | X | X | X | X | X | X | 9000h-91FFh, 9400h-95FFh, 9800h-9DFFhB000h-B1FFh, B400h-B5FFh, B800h-BDFFhD000h-D1FFh, D400h-D5FFh, D800h-DDFFhF000h-F1FFh, F400h-F5FFh, F800h-FDFFh |
Y7 | 1 | X | X | 1 | X | X | 1 | X | X | X | X | X | X | X | X | X | 9200h-93FFh, 9600h-97FFh, 9A00h-9FFFhB200h-B3FFh, B600h-B7FFh, BA00h-BFFFhD200h-D3FFh, D600h-D7FFh, DA00h-DFFFhF200h-F3FFh, F600h-F7FFh, FA00h-FFFFh |
В итоге адресное пространство размером в 64 Кбайт разбито на диапазоны для 8 устройств. В каждом диапазоне выделено 8 участков по 512 байт и 4 участка по 1536 байт.
Задача № 2
Требуется выделить зоны адресного пространства для размещения в них адресов для устройств, указанных в таблице. В качестве адресного дешифратора используется ПЗУ. Построить схемы выделения соответствующих блоков адресов и таблицу диапазонов адресов.
Наименование устройства | Диапазон адресов | Емкость (Кбайт) |
ПЗУ1 | 0000h-03FFh | 1 |
ОЗУ1 | 0400h-0BFFh | 2 |
УВВ1 | 2000h-2FFFh | 4 |
ПЗУ2 | 3000h-4FFFh | 8 |
ОЗУ2 | 5000h-6FFFh | 8 |
УВВ2 | 8000h-FFFFh | 32 |
Так как наименьший блок имеет размер 1К ячеек, то разрешающая способность дешифратора должна обеспечивать деление адресного пространства с точностью до зон размером 1К ячеек. Анализируя шесть старших разрядов адреса, получаем необходимую точность, поскольку они делят все адресное пространство обьемом 64К ячеек на 26 = 64 части по 1К ячеек, что и требуется.
Выбираем за основу ПЗУ с 10 адресными входами 2716 ( К573РФ2 ), имеющее структуру 2К*8 бит . Выходы 00 - 05 этого ПЗУ подключаем к инверсным входам выбора кристалла соответсвующих микросхем.
Разрабатываем прошивку ПЗУ.
Устройство | Диапазон адресов | Адресные входы | Выходы | |||||
A5 | A4 | A3 | A2 | A1 | A0 | 0 1 2 3 4 5 | ||
ROM 1 | 0000h-03FFh | 0 | 0 | 0 | 0 | 0 | 0 | 0 1 1 1 1 1 |
RAM 1 | 0400h-07FFh | 0 | 0 | 0 | 0 | 0 | 1 | 1 0 1 1 1 1 |
0800h-0BFFh | 0 | 0 | 0 | 0 | 1 | 0 | 1 0 1 1 1 1 | |
- | 0C00h-0FFFh | 0 | 0 | 0 | 0 | 1 | 1 | 1 1 1 1 1 1 |
1000h-13FFh | 0 | 0 | 0 | 1 | 0 | 0 | 1 1 1 1 1 1 | |
1400h-17FFh | 0 | 0 | 0 | 1 | 0 | 1 | 1 1 1 1 1 1 | |
1800h-1BFFh | 0 | 0 | 0 | 1 | 1 | 0 | 1 1 1 1 1 1 | |
1C00h-1FFFh | 0 | 0 | 0 | 1 | 1 | 1 | 1 1 1 1 1 1 | |
IN-OUT 1 | 2000h-23FFh | 0 | 0 | 1 | 0 | 0 | 0 | 1 1 0 1 1 1 |
2400h-27FFh | 0 | 0 | 1 | 0 | 0 | 1 | 1 1 0 1 1 1 | |
2800h-2BFFh | 0 | 0 | 1 | 0 | 1 | 0 | 1 1 0 1 1 1 | |
2C00h-2FFFh | 0 | 0 | 1 | 0 | 1 | 1 | 1 1 1 1 1 1 | |
ROM 2 | 3000h-33FFh | 0 | 0 | 1 | 1 | 0 | 0 | 1 1 1 1 1 1 |
3400h-37FFh | 0 | 0 | 1 | 1 | 0 | 1 | 1 1 1 1 1 1 | |
3800h-3BFFh | 0 | 0 | 1 | 1 | 1 | 0 | 1 1 1 1 1 1 | |
3C00h-3FFFh | 0 | 0 | 1 | 1 | 1 | 1 | 1 1 1 1 1 1 | |
4000h-43FFh | 0 | 1 | 0 | 0 | 0 | 0 | 1 1 1 1 1 1 | |
4400h-47FFh | 0 | 1 | 0 | 0 | 0 | 1 | 1 1 1 1 1 1 | |
4800h-4BFFh | 0 | 1 | 0 | 0 | 1 | 0 | 1 1 1 1 1 1 | |
4C00h-4FFFh | 0 | 1 | 0 | 0 | 1 | 1 | 1 1 1 1 1 1 | |
RAM 2 | 5000h-53FFh | 0 | 1 | 0 | 1 | 0 | 0 | 1 1 1 1 1 1 |
5400h-57FFh | 0 | 1 | 0 | 1 | 0 | 1 | 1 1 1 1 1 1 | |
5800h-5BFFh | 0 | 1 | 0 | 1 | 1 | 0 | 1 1 1 1 1 1 | |
5C00h-5FFFh | 0 | 1 | 0 | 1 | 1 | 1 | 1 1 1 1 1 1 | |
6000h-63FFh | 0 | 1 | 1 | 0 | 0 | 0 | 1 1 1 1 1 1 | |
6400h-67FFh | 0 | 1 | 1 | 0 | 0 | 1 | 1 1 1 1 1 1 | |
6800h-6BFFh | 0 | 1 | 1 | 0 | 1 | 0 | 1 1 1 1 1 1 | |
6C00h-6FFFh | 0 | 1 | 1 | 0 | 1 | 1 | 1 1 1 1 1 1 | |
- | 7000h-73FFh | 0 | 1 | 1 | 1 | 0 | 0 | 1 1 1 1 1 1 |
7400h-77FFh | 0 | 1 | 1 | 1 | 0 | 1 | 1 1 1 1 1 1 | |
7800h-7BFFh | 0 | 1 | 1 | 1 | 1 | 0 | 1 1 1 1 1 1 | |
7C00h-7FFFh | 0 | 1 | 1 | 1 | 1 | 1 | 1 1 1 1 1 1 | |
Устройство | Диапазон адресов | Адресные входы | Выходы | |||||
A5 | A4 | A3 | A2 | A1 | A0 | 0 1 2 3 4 5 | ||
IN-OUT 2 | 8000h-83FFh | 1 | 0 | 0 | 0 | 0 | 0 | 1 1 1 1 1 1 |
8400h-87FFh | 1 | 0 | 0 | 0 | 0 | 1 | 1 1 1 1 1 1 | |
8800h-8BFFh | 1 | 0 | 0 | 0 | 1 | 0 | 1 1 1 1 1 1 | |
8C00h-8FFFh | 1 | 0 | 0 | 0 | 1 | 1 | 1 1 1 1 1 1 | |
9000h-93FFh | 1 | 0 | 0 | 1 | 0 | 0 | 1 1 1 1 1 1 | |
9400h-97FFh | 1 | 0 | 0 | 1 | 0 | 1 | 1 1 1 1 1 1 | |
9800h-9BFFh | 1 | 0 | 0 | 1 | 1 | 0 | 1 1 1 1 1 1 | |
9C00h-9FFFh | 1 | 0 | 0 | 1 | 1 | 1 | 1 1 1 1 1 1 | |
A000h-A3FFh | 1 | 0 | 1 | 0 | 0 | 0 | 1 1 1 1 1 1 | |
A400h-A7FFh | 1 | 0 | 1 | 0 | 0 | 1 | 1 1 1 1 1 1 | |
A800h-ABFFh | 1 | 0 | 1 | 0 | 1 | 0 | 1 1 1 1 1 1 | |
AC00h-AFFFh | 1 | 0 | 1 | 0 | 1 | 1 | 1 1 1 1 1 1 | |
B000h-B3FFh | 1 | 0 | 1 | 1 | 0 | 0 | 1 1 1 1 1 1 | |
B400h-B7FFh | 1 | 0 | 1 | 1 | 0 | 1 | 1 1 1 1 1 1 | |
B800h-BBFFh | 1 | 0 | 1 | 1 | 1 | 0 | 1 1 1 1 1 1 | |
BC00h-BFFFh | 1 | 0 | 1 | 1 | 1 | 1 | 1 1 1 1 1 1 | |
C000h-C3FFh | 1 | 1 | 0 | 0 | 0 | 0 | 1 1 1 1 1 1 | |
C400h-C7FFh | 1 | 1 | 0 | 0 | 0 | 1 | 1 1 1 1 1 1 | |
C800h-CBFFh | 1 | 1 | 0 | 0 | 1 | 0 | 1 1 1 1 1 1 | |
CC00h-CFFFh | 1 | 1 | 0 | 0 | 1 | 1 | 1 1 1 1 1 1 | |
D000h-D3FFh | 1 | 1 | 0 | 1 | 0 | 0 | 1 1 1 1 1 1 | |
D400h-D7FFh | 1 | 1 | 0 | 1 | 0 | 1 | 1 1 1 1 1 1 | |
D800h-DBFFh | 1 | 1 | 0 | 1 | 1 | 0 | 1 1 1 1 1 1 | |
DC00h-DFFFh | 1 | 1 | 0 | 1 | 1 | 1 | 1 1 1 1 1 1 | |
E000h-E3FFh | 1 | 1 | 1 | 0 | 0 | 0 | 1 1 1 1 1 1 | |
E400h-E7FFh | 1 | 1 | 1 | 0 | 0 | 1 | 1 1 1 1 1 1 | |
E800h-EBFFh | 1 | 1 | 1 | 0 | 1 | 0 | 1 1 1 1 1 1 | |
EC00h-EFFFh | 1 | 1 | 1 | 0 | 1 | 1 | 1 1 1 1 1 1 | |
F000h-F3FFh | 1 | 1 | 1 | 1 | 0 | 0 | 1 1 1 1 1 1 | |
F400h-F7FFh | 1 | 1 | 1 | 1 | 0 | 1 | 1 1 1 1 1 1 | |
F800h-FBFFh | 1 | 1 | 1 | 1 | 1 | 0 | 1 1 1 1 1 1 | |
FC00h-FFFFh | 1 | 1 | 1 | 1 | 1 | 1 | 1 1 1 1 1 1 |
Схема дешифратора :