Адресное пространство памяти, образующее основную память МП КР580ВМ80А, представляет собой линейный одномерный массив из 64 Кб ячеек памяти, так что 16-разрядный адрес дает возможность микропроцессору непосредственно адресовать любой байт памяти. Данные в памяти могут храниться байтами или словами. Слова в памяти хранятся в двух соседних байтах (младший байт слова хранится по младшему адресу). Адресом слова является адрес его младшего байта.
В МП определено 4 способа задания месторасположения данных в памяти:
- прямой;
- косвенный регистровый (через 16-разрядные регистры HL, BC и DE);
- непосредственный;
- автоинкрементный/автодекрементный через указатель стека SP.
При прямой и непосредственной адресации данных могут быть доступны байты или слова, при косвенной адресации - только байты. Стековая адресация применяется только при работе со словами.
В МП ВМ80А используется изолированное адресное пространство ввода-вывода. Эта область организована в виде одномерного массива из 256 восьмиразрядных портов ввода и 256 восьмиразрядных портов вывода. Допускается только прямой способ доступа к пространству ВВ.
Работа с внешними устройствами МП КР580
Работа со всеми внешними устройствами эмулятора заключается в отправке или приёме на (с) соответствующий(его) устройству порт(а) МП-системы значения из (в) регистра-аккумулятора. Это осуществляется путём выполнения на эмуляторе команд ввода-вывода, таких как IN (принять из порта) и OUT (вывести в порт).
Работа с монитором
«Монитор КР580» поддерживает отдельную систему команд, обеспечивающую вывод графической или текстовой информации. Графический режим соответствует разрешению 256x256 пикселей и глубине цвета - 128 бит на пиксель, а текстовый - 39x20 символов и глубине цвета 128 бит на символ. Одновременно монитор поддерживает два этих режима, т.е. может содержать и текст и графику.
Команды засылаются в порт 00h побайтно. Различаются 3-х байтные и 2-х байтные команды:
2-х байтная. 1-ый байт: 1-ый бит - 0-текст, 1-графика; остальные 7 бит на цвет, согласно формуле: FFFFFFh(RGB) / 127 * эти_7_бит. 2-ой байт: номер символа в кодовой таблице OEM/DOS.
3-х байтная. 1-ый байт: 1-ый бит - 0-текст, 1-графика; остальные 7 бит на цвет, согласно формуле: FFFFFFh(RGB) / 127 * эти_7_бит. 2 байт: координата по X. 3 байт: координата по Y.
Работа с дисководом
В порт дисковода КР580 (01h) засылаются или читаются значения, что приводит к их одновременному сохранению (чтению) в (из) файл(а) реальной машины, располагающийся на дискете.
Работа с жёстким диском (порт 02h)
Аналогично работе с дисководом, только связано с жёстким диском реальной машины.
Работа с сетевым адаптером
Отправленные значения в порт 03h пересылаются по сети реальных машин по протоколу TCP/IP на IP-адрес, указанный в настройках.
Работа с принтером
Отправленные значения в порт 04h временно хранятся в буфере до тех пор, пока пользователь не отправит их на печать самостоятельно. Печатаемые символы на принтере реальной машины соответствуют кодировке OEM/DOS.
Практическая часть
Часть 1
1. Написать программу на ассемблере для МП КР580.
Занести в содержимое ячеек ОЗУ программу, начиная с ячейки 000h.
Ячейка | Команда | Мнемоника | Комментарий |
0000 | 3A | LDA adr | Прямая загрузка аккумулятора |
0001 | 0F | PRC | Сдвиг содержимого аккумулятора вправо через флаг переноса |
0002 | 00 | NOP | |
0003 | D3 | OUT N | Содержимое А помещается на двунаправленную шину данных для передачи в указанный порт |
0004 | 00 | NOP | |
0005 | 78 | MOV A,B | Ввод в аккумулятор кода символа |
0006 | D3 | OUT N | Вывод кода символа в монитор |
0007 | 00 | NOP | |
0008 | 78 | INR B | Увеличение содержимого регистра В |
0009 | D3 | JNC adr | Условие перехода. Если указанное условие истинно, то управление передается команде, адрес которой указан во втором и третьем байтах команды перехода. |
000A | 00 | NOP | |
000B | 04 | NOP | |
000C | 76 | HLT | Останов |
000D | 00 | NOP | |
000E | 00 | NOP | |
000F | 15 | DCR D | Декремент кода символа |
2. Включить отображение монитора: Меню Вид\Отобразить монитор…
4. Запустить программу на исполнение:
- перейти на адрес ячейки 0000h (с неё будет начинаться исполнение программы);
- нажать кнопку «Выполнить программу»
- просмотреть и записать в таблицу алгоритма выполнения каждой команды (что, в какой регистр заносится и как перемещаются данные) при каждом нажатии кнопки «Выполнить команду».
Часть 2
Разработать программу вывода всех возможных символов в кодировке DOS на дисплей с изменением цвета каждого символа, провести прямую линию, каждый пиксель которой будет отличаться цветом от предыдущего.
Решение:
Для вывода символов на экран необходимо использовать двухбайтные команды для монитора, где 1 байт хранит информацию о цвете символа, 2 байт хранит информацию о самом символе в кодировке DOS.
Вывод на экран производится командой OUT N (где N– номер порта вывода), в нашем случае OUT 00.
Необходимо отправить 2 байта для вывода одного символа. Данные для вывода 2х байт будем располагать в регистрах B и С соответственно. После вывода 2х байт в монитор необходимо декрементировать В и С, соответственно изменится цвет и символ в следующей передаче данных.
Стартовые значения для регистров В - 7F и С –FF, после выполнения 256 циклов программы регистр С обнулится, далее необходимо вычесть его из аккумулятора, где находится также значение 00, и получить флаг Z. По команде JNZ адр16 программа будет выполнять условия цикла.
Ячейка | Мнемоника | Комментарий |
0000 | MVI B,7F | Ввод в регистр В цвета для 1го символа |
0002 | MVI C,FF | Ввод в регистр С кода 1го символа |
0004 | MOV A,B | Ввод в аккумулятор цвета символа |
0005 | OUT 00 | Вывод цвета из аккумулятора в монитор |
0007 | MOV A,C | Ввод в аккумулятор код символа |
0008 | OUT 00 | Вывод кода символа в монитор |
000А | DCR B | Декремент кода цвета |
000B | DCR C | Декремент кода символа |
000С | MVI A,00 | Ввод в аккумулятор нуля |
000E | SUB C | Вычитания из нуля кода символа |
000F | JNZ 0004 | Проверка аккумулятора на ноль |
0012 | HLT | Останов |
Порядок занесения значений в ОЗУ:
Ячейка | Мнемоника | Комментарий | |
0000 | MVI B,7F | 06 | Ввод в регистр В цвета для 1го символа |
0001 | 7F | ||
0002 | MVI C,FF | 0E | Ввод в регистр С кода 1го символа |
0003 | FF | ||
0004 | MOV A,B | 78 | Ввод в аккумулятор цвета символа |
0005 | OUT 00 | D3 | Вывод цвета из аккумулятора в монитор |
0006 | NOP | 00 | |
0007 | MOV A,C | 79 | Ввод в аккумулятор код символа |
0008 | OUT 00 | D3 | Вывод кода символа в монитор |
0009 | NOP | 00 | |
000А | DCR B | 05 | Декремент кода цвета |
000B | DCR C | 0D | Декремент кода символа |
000С | MVI A,00 | 3E | Ввод в аккумулятор нуля |
000E | SUB C | 91 | Вычитания из нуля кода символа |
000F | JNZ 0004 | Проверка аккумулятора на ноль | |
0010 | 04 | ||
0011 | 00 | ||
0012 | HLT | Останов |
Просмотреть и записать в таблицу алгоритма выполнения каждой команды (что, в какой регистр заносится и как перемещаются данные) при каждом нажатии кнопки «Выполнить команду».