Страница 4 из 126
ЦП, естественно, по самой своей конструкции умеет интерпретировать этот результирующий машинный код. Рассмотрение структуры машинного кода конкретной команды может помочь вам в понимании логики работы ЦП. На рис. 11.2 развернута структура самой употребительной команды МП 68000 MOVE.
Рис. 11.2. Структура команды MOVE.
Пройдемся по ней. Два лидирующих нуля идентифицируют (почти) команду, как операцию MOVE; следующие два бита определяют размер операндов, как это показано на рисунке. Любопытно отметить, что поскольку комбинация бит 00 не используется для описания размера, код 0000ххх…хх не входит число кодов команды MOVE (однако не думайте, что этот код пропадает — фирма Motorola использует его для других команд). Следующие 6 бит описывают режим адресации и регистр (если таковой используется) операнда-приемника, а последние 6 бит заключают ту же информацию об операнде-источнике; на рис. 11.2 показано, как кодируется эта информация. Заметьте, что последние 5 режимов адресации, не использующие регистр, разделяют между собой оставшийся номер режима (111) и различаются «фальшивыми» номерами регистра. Если режим адресации какого-либо из операндов требует дополнительной информации (непосредственные данные, абсолютные адреса, смещения), к коду команды добавляются дополнительные байты, как это показано на рис. 11.2.
Любопытно заметить, что МП 68000 расходует 1/4 х 3/4 = 19 % всех возможных кодов команд на команду MOVE, предоставляя все сочетания режимов адресации и для источника, и для приемника. Фирма Motorola не могла быть столь же расточительной для остальных 50 с лишком команд табл. 11.1, и возможности их адресации пришлось урезать.
К примеру, если использовать фирменное обозначение <еа> для полного набора команд, то можно образовать команды ADD < еа >, Dn или
ADD Dn, <еа>
но не все варианты полного сочетания
ADD <еа>, <еа>
В реальной жизни вы всегда пользуетесь ассемблером (который работает на компьютере или микропроцессорной «системе разработки») для выполнения черной работы по конструированию этих команд. Однако, чтобы убедиться, что мы действительно поняли суть дела, попробуем свои силы в «ручном ассемблировании». Закодируем команду
MOVE.W #$3FFF,(A1) +
Код размера равен 11 (слово); код режима приемника равен 011, а регистра — 001; для приемника код режима равен 111, а «регистра» — 100. Таким образом, код команды составляет
00 11 001 011 111 100, или 32FCH
а полностью команда кодируется как
32 FC 3F FF
Мы не без основания подозреваем, что дальнейшие абстрактные обсуждения системы команд и режимов адресации заставляет вас закрыть эту книгу навсегда. Поэтому давайте рассмотрим прострой пример программирования, после чего перейдем к сигналам магистрали МП 68008. После этого мы сможем выполнить полное проектирование микропроцессорного устройства на базе МП 68008, включая его программное обеспечение.
Иллюстрация команд и режимов адресации МП 68000 дана в программе 11.1, где показаны два способа копирования таблицы из 100Н байт, начинающейся в ячейке $8000, в непосредственно прилегающую область памяти (с адреса $8100).
В первом варианте для пересылки из памяти в память мы использовали косвенную адресацию со смещением (удобное средство, отсутствующее в МП 8086), а также инкремент указателя, декремент счетчика и условный переход. При частоте генератора 10 МГц цикл занимает 6,2 мкс, и вся таблица пересылается за 1,6 мс. Во втором варианте в программу введен второй адресный регистр, указывающий на приемник. В этом случае можно использовать постинкрементную адресацию и отказаться от команды ADDQ, что увеличивает скорость пересылки. Анализ на выход из цикла мы выполняем с помощью более эффективной (но рискованной) команды «декремент и условный переход» DBcc. В результате цикл выполняется почти в два раза быстрее (3,4 мкс на шаг, 0,87 мс на всю пересылку).
Упражнение 11.2. Напишите программу для вычисления суммы 16-разрядных слов в таблице, начинающейся с адреса $10000. Пусть длина таблицы в словах хранится в качестве первого элемента таблицы (он не должен входить в сумму); предположите также, что суммирование не приведет к переполнению.
Упражнение 11.3. Напишите программу для изменения порядка байтов в таблице, имеющей длину $100 байт и начинающуюся с адреса $1000.
Прямолинейный (но медленный) способ решения задачи заключается в изменении порядка байтов в процессе копирования во вспомогательный массив, который затем копируется на место исходного. Более быстрый способ предполагает изменение порядка байтов «на месте» (следите только, чтобы, шагая по таблице, не наступить себе же на ноги). Запрограммируйте оба метода.
11.04. Сигналы магистрали
Если вы усвоили взаимодействие сигналов на магистрали IBM PC, то разобраться с сигналами МП 68008 не составит труда — они схожи. Мы описали их в табл. 11.4 (имеющей тот же формат, что и табл. 10.1) и на рис. 11.3.
Рис. 11.3. Сигналы МП 68008.
Лучше всего воспользоваться уже испытанной последовательностью изучения и рассмотреть сначала программно-управляемую передачу данных («программно-управляемый ввод-вывод»), затем прерывания и, наконец, ПДП. Это не займет много времени.
Программно-управляемая передача данных. Программно-управляемая передача данных показана на рис. 11.4; мы также изобразили сигналы (CLK и AS'), которые в процессе проектирования схемы обычно можно игнорировать.
Рис. 11.4. Циклы чтения/записи МП 68008 (8 МГц, без состояний ожидания).
В МП 68008 используется один сигнал, стробирующий данные (DS'), а также линия направления чтения-записи (R/W) в отличие от IBM PC, где предусмотрены два стробирующих сигнала (IOR', IOW'). В цикле записи ЦП переводит сигнал R/W в низкое состояние, устанавливает адрес и данные и, выждав некоторое время, переводит в низкое состояние сигнал DS'. Приемник (память или устройство ввода-вывода) фиксирует данные, которые (в отличие от IBM PC) гарантированно установлены еще перед фронтом сигнала DS', и подтверждает прием, устанавливая в низкое состояние сигнал DTACK'. ЦП завершает цикл, снимая сигнал DS' и затем (выждав некоторое время на случай использования приемником Прозрачных фиксаторов) снимает адрес и данные. Таким образом, достоверность данных гарантируется в течение DS' плюс короткие интервалы до и после сигнала. Цикл чтения отличается лишь тем, что ЦП поддерживает линию R/W' в высоком состоянии (указывая тем самым, что выполняется чтение) и, к тому же, устанавливает сигнал DS' на один такт раньше, чтобы дать возможность источнику данных отозваться на требование данных. Данные должны быть установлены до окончания сигнала DS'; детали взаимодействия показаны на рис. 11.4.
Действие сигнала DTACK' требует дальнейшего обсуждения. Шина МП 68008 является асинхронной (см. разд. 10.14): установив сигнал DS', ЦП, перед тем, как завершить цикл, ожидает от адресуемого устройства сигнала подтверждения DTACK' (через проводное ИЛИ). Если сигнал DTACK' поступает перед концом такта S4, состояния ожидания не включаются в протокол, и последовательность сигналов выглядит точно так, как показано на рис. 11.4; если же DTACK' задерживается, ЦП удерживает все свои выходные сигналы в стабильном состоянии (включая в протокол магистрали после такта S4 «состояния ожидания») до появления сигнала DTACK', после чего завершает цикл тактами S5-S7. Состояния ожидания требуются только при работе с очень медленными устройствами, поэтому адресуемое устройство должно устанавливать сигнал DTACK' сразу же после распознания им на шине своего адреса (устройство может установить DTACK' по результатам декодирования адреса или образовав логическое И из сигнала декодирования и полученного им из ЦП сигнала AS', который указывает на достоверность адреса). Вообще говоря, если все устройства, подключенные к шине, являются быстрыми, вы можете, с известной долей риска, постоянно удерживать линию DTACK' в низком состоянии и полностью избавиться от состояний ожидания; эта методика отразилась в названии журнала, посвященного высокопроизводительным приложениям семейства МП 68000: «DTACK' заземлен».