|
Born Dead
#05
06 января 1999 |
|
Мир Амиги - Амига глазами RRA (часть 1).

════════════════════════════════════════════════════════════════
╠╬╣║╞╪╡██╡╪╞║╣╬╠ AMIGA глазами >>RRA>> Часть I ╠╬╣║╞╪╡█╡╪╞║╣╬╠
════════════════════════════════════════════════════════════════
(c)1998 >>RRA>>/AF/SG
Ну что за fuck !!! После того как я набил 20 кило текста у
меня заглючил шлейф дискофлопа и все мои труды накрылись чем-то
мягким и пушистым. Ладно, мне все до фени и пузырь у меня стоит
лишь на четверть опустошенный, поэтому начнем сначала. Очень
уверен, что все вышесказанные слова будут заксорены цензурой aka
Unbel!ever.
В этом цикле статей я хочу кратко и непонятно об'яснить все
основные положения программирования на Амиге. Вообще-то я уже
набил статью о механизме исключений и прерываний, но
оказалось, что довольно мало людей знают ассемблер Амми, и
поэтому все-таки придется весь этот ужас описать (ударение на
последний слог! :) ).
Как может быть вам известно на Амигах стоят процессоры фирмы
Motorola (оказывается они делают не только пейджеры и микрухи
для мотороллеров). Кстати, на большинстве игровых приставок
стоят именно их процессоры, например всем известные Денди и
Сега, которые совратили больше половины юзеров Спекки. В этой
статье я опишу способы адресации, организацию данных и начну
подробное описание команд семейства процессоров MC680x0, которые
и стоят на Амигах. В дальнейших статьях я подробно опишу весь
чипсет Амиги. Хочу послать большой FUCK автору книги "AMIGA:
ПРОГРАММИРОВАНИЕ НА АССЕМБЛЕРЕ", не помню как у него фамилия,
толи Михайлов, толи Михуйлов, толи Михуеловский. Из этой
книги можно вырвать только список функций библиотек Amiga
DOS, остальное можно смело выбросить. Коронная фраза этой
книги: "... подробную информацию о hardware-регистрах вы сможете
найти в технической документации Амиги ...". А интересно где он
ее нашел?! Глава "Наезды" будет содержать полную информацию о
том, что я думая об этой книжице, и об ее авторе. Материал моих
статей был собран по крохам из различный источников, и путем
взлома известной геймы "WALKER" и всяких других софтин. Как это
уже принято, когда говорят об Амиге параллельно обсирают PC.
Этим я заниматься не буду, а PC и Spectrum (к моему глубокому
сожалению они родня) буду использовать для сравнения.
Итак, iNTEL OUTSIDE!
Боевой клич произнесен, начнем про наших баранов:
СЕМЕЙСТВО ПРОЦЕССОРОВ MC680x0
Это семейство довольно таки обширное: MC68000, MC68EC000,
MC68HC000, MC68008, MC68010, MC68020, MC68EC020, MC68030,
MC68EC030, MC68040, MC68LC040, MC68EC040, MC68330, MC68340,
устроиство управления страничной памятью MC68851 и
математические сопроцессоры MC68881, MC68882. Здесь я
остановлюсь на процессорах, которые стоят на Амигах: MC68000,
MC68020, MC68030, MC68040, MC68060 и некоторые их вариации типа
MC68EC020.
Из этого набора более всего отличается процессор MC68000.
Он имеет меньше способов адресации, команд и управляющих
регистров. MC68000 стоял на Амигах с чипсетами OSC и ESC.
Остальные процессоры по командам и регистрам фактически похожи.
Далее под словами "старшие процессоры" я буду подразумевать
процессоры старше, чем MC68000.
Все эти процессоры работают в двух режимах:
юзера (пользователя) и супервизора. В режиме юзера процессор не
имеет доступа к управляющим регистрам и не может выполнять
команды работающие с ними (это приводит к исключению "нарушение
привилегий", подробнее об этом будет написано позже). Эти режимы
были введены для многозадачных систем. Например Workbench
работает в режиме супервизора и имеет доступ ко всем ресурсам
процессора и всей Амиги в целом, а юзерский софт соответственно
работает в режиме юзера и может только выполнять всяческие
вычисления и глюки особенно не влияя на общее здоровье Амиги.
РЕГИСТРЫ В РЕЖИМЕ ЮЗЕРА
Регистры данных D0-D7 (32 бита): в них вы можете хранить
данные и проводить на них всяческие арифметические извраты. Так
же используются как индексные регистры. Размер операций с этими
регистрами: бит, битовое поле, байт (.B), слово (.W), длинное
слово (.L), четверное слово (любые 2 регистра данных).
Регистры адреса A0-A7 (32 бита): используются как индексные
регистры или как регистры базового адреса. Размер операций с
этими регистрами: слово и длинное слово. Регистр A7 используется
как указатель стека (SP - stack pointer). В режиме юзера
используется стек юзера (USP - user SP) (вообще их 3 на старших
процессорах - USP,ISP,MSP, и 2 на MC68000 - USP,SSP. смотри
следующую главу). Надеюсь об'яснять что такое стек вам не
требуется.
Регистр PC (32 бита): это не тот PC, который suxx, а тот
который указывает на текущую выполняемую команду, так сказать
program counter.
Регистр CCR - condition code register (8 бит): одним словом
это регистр флагов, а с англицкого регистр кодов условий (ух как
заморочено). Честно сказать это всего лишь 5 младших битов
более навороченого регистра SR доступного полностью только в
режиме супервизора (см. след. главу).
бит 0: C - CARRY, флаг переноса. Устанавливается, если прои-
зoшел перенос старшего бита при сложении или заем
при вычитании (когда я это прочитал в книжке по
ассемблеру спектрума, то тогда я ничего не понял,
и кстати я знаю товарищей, которые до сих пор не
умеют его юзать хотя уже почти дописали свою
прогу). Также этот флаг изменяется командами
сдвига.
Используется командами условного ветвления.
бит 1: V - OVERFLOW, флаг переполнения. Устанавливается,
если произошло арифметическое переполнение, то
бишь результат не укладывается в заданный размер.
бит 2: Z - ZERO, флаг нуля. Ламеру понятно, что этот флаг
устанавливается когда результат равен нулю.
бит 3: N - NEGATIVE, флаг знака. Если результат отрицатель-
ный, то флаг установлен. Одним словом копия стар-
шего бита результата.
бит 4: X - EXTEND. Копия флага C, хотя некоторые команды его
в отличии от C не затрагивают. Используется для
арифметических команд и команд сдвига.
В режиме юзера также доступны регистры математического
сопроцессора, но к сожалению я абсолютно не бычу в плавающей
арифметике поэтому ничего по этому вопросу сказать не могу.
РЕГИСТРЫ В РЕЖИМЕ СУПЕРВИЗОРА
В добавок к вышеперечисленным регистрам в режиме
супервизора доступны следующие:
Регистр A7',A7'' - в принципе это один и тот же A7, который был
в режиме юзера, только значения в разных режимах отличное. На
старших процессорах это соответственно главный стек (MSP -
master stack) и стек прерывания (ISP - interrupt stack). Первый
врубается когда вы переключаетесь в режим супервизора, второй
если наступило прерывание (к сведению: все прерывания и
исключения работают в режиме супервизора не зависимо от того, в
каком режиме до этого вы находились. При выходе режим
восстанавливается). На MC68000 в режиме супервизора работает
системный стек (SSP - system stack, а не supervisor stack, как
это было сказано в книге, которой я шлю уже второй fuck).
Регистр SR (status register): регистр флагов или регистp
статуса, называйте как хотите.
биты 0-4: флаги условий. см. регистр CCR.
биты 5-7: равны 0.
биты 8-10: I0-I2 - маска приоритета прерываний (об'ясмю
позже)
бит 11: равен 0.
бит 12: M - 0 = ISP
1 = MSP
бит 13: S - 0 = режим юзера
1 = режим супервизора
биты 14,15: T0,T1 - режим трассировки.
T1 T0 режим
0 0 не трассировать
1 0 трассировка каждой команды
0 1 трассировать только команды ветвления
(старшие процессоры)
1 1 don't work!
Регистр VBR (vector base register) (старшие процессоры) -
содержит адрес таблицы векторов прерываний (будет разжевано
позже).
Регистры SFC/DFC (source/destination alternate function
code register) (старшие процессоры) - содержат 3 бита, которые
дополняют логический адрес. В следствии этого процессор может
обращаться к 8-ми, 4-х гигабайтным областям памяти. Конечно я
хотел бы иметь Амигу с 32-мя гигами, но это похоже
проблематично, поэтому использование этих регистров
нецелесообразно.
Управляющих регистров вообще-то довольно много, здесь я
перечислил основные. А сейчас я дам список всех управляющих
регистров и процессоры в которых они живут.
AC1,AC0 - ACCESS CONTROL REGISTER: 68EC030
ACUSR - ACCESS CONTROL UNIT STATUS REGISTER: 68EC030
CAAR - CACHE ADDRESS REGISTER: 68020,68EC020,68030,68EC030.
CACR - CACHE CONTROL REGISTER: 68020,68EC020,68030,68EC030,
68040,68EC040,68LC040.
DACR0,DACR1 - DATA ACCESS CONTROL REGISTER: 68EC040
DTT0,DTT1 - DATA TRANSPARENT TRANSLATION: 68040,68LC040.
IACR0,IACR1 - INSTRUCTION ACCESS CONTROL REGISTER: 68EC040
ITT0,ITT1 - INSTRUCTION TRANSPARENT TRANSLATION REGISTER:
68040,68LC040.
TT0,TT1 - TRANSPARENT TRANSLATION REGISTER: 68030
CRP - CPU ROOT POINTER: 68030
PMMUSR - PAGED MEMORY MANAGMENT UNIT STATUS REGISTER: 68030,
68040,68LC040.
MMUSR - MEMORY MANAGMENT UNIT STATUS REGISTER: 68030,68040,
68LC040.
SRP - SUPERVISOR ROOT POINTER: 68030,68040,68LC040.
TC - TRANSLATION CONTROL REGISTER: 68030,68040,68LC040.
URP - USER ROOT POINTER: 68040,68LC040.
Тут часто встречается термин transparent translation, не знаю
точно как перевести этот mustdie, но смысл я примерно понял.
Такие регистры живут в процессорах со встроенным MMU (не
путайте с M.M.A. - последний переводится как местный маньяк
Амиги, а MMU есть не что иное как memory managment unit, то бишь
устройство управления памятью). Так вот эта самая трансляция
является перводом логического адреса в физический при
страничной организации памяти. Может быть я и вру. Поскольку с
MMU у меня опытов общения не было. Регистры ACCESS CONTROL тоже
причастны к этому непонятному процессу. Процессоры со встроенным
MMU - MC68030, MC68040, MC68LC040.
ФОРМАТЫ ДАННЫХ
Данные процессоры оперируют со следующими типами данных:
бит 1 бит
битовое поле 1-32 бита последовательность бит
(старшие процессоры)
BCD-число 8 бит пакованое: 2 числа на байт
непакованое: 1 число на байт
байт 8 бит
слово 16 бит
длинное слово 32 бита
четверное слово 64 бита любые 2 регистра данных
16-байтовый блок 128 бит в памяти. Адрес кратен 16-ти.
Только на процессоре MC68040.
ОРГАНИЗАЦИЯ ДАННЫХ В РЕГИСТРАХ И В ПАМЯТИ
Данные в регистрах располагаются так:
31 0
длинное слово X X X X
слово . . X X
байт . . . X
Данные в памяти располагаются по схеме big-endian, т.е.
старший байт по младшему адресу. На PC и Spectrum'е применяется
схема little-endian, младший байт по младшему адресу. Например:
число 12345678 в памяти будет располагаться так:
на Амиге:
адрес число
1000 12
1001 34
1002 56
1003 78
а на PC и Spectrum'е:
1000 78
1001 56
1002 34
1003 12
Вроде бы тут все ясно.
СПОСОБЫ АДРЕСАЦИИ
В этой статье часто будет встречаться такое понятие как
эффективный адрес <еа>, оно обозначает адрес операнда. Например
данные находятся в ячейке с адресом 500, <еа> операнда задающего
эти данные будет 500. Здесь я опишу все юттоды адресации
семейства процессоров MC680x0.
1) РЕГИСТРОВАЯ ПО РЕГИСТРУ ДАННЫХ. Операнд в регистре
данных. Запись в ассемблере: Dn.
2) РЕГИСТРОВАЯ ПО РЕГИСТРУ АДРЕСА. Операнд в регистре
адреса. Запись в ассемблере: An.
3) КОСВЕННАЯ РЕГИСТРОВАЯ. <еа> операнда в регистре
адреса. Запись в ассемблере: (An)
4) КОСВЕННАЯ РЕГИСТРОВАЯ С ПОСТИНКРЕМЕНТОМ. <еа> операнда в
регистре адреса. После использования <еа> регистр адреса
инкрементируется на 1,2 или 4 байта в зависимости от размера
операции (.B,.W или .L). Запись в ассемблере: (An)+.
5) КОСВЕННАЯ РЕГИСТРОВАЯ С ПРЕДЕКРЕМЕНТОМ. Регистр адреса
декрементируется на 1,2 или 4 байта в зависимости от размера
операции (.B,.W или .L). <еа> операнда находится в этом регистре
адреса. Запись в ассемблере: -(An).
6) КОСВЕННАЯ РЕГИСТРОВАЯ С 16-БИТНЫМ СМЕЩЕНИЕМ. <еа> операнда
равен содержимому регистра адреса плюс 16-битное знаковое
смещение. Запись в ассемблере: d16(An).
7) КОСВЕННАЯ РЕГИСТРОВАЯ С ИНДЕКСОМ И 8-МИБИТНЫМ СМЕЩЕНИЕМ.
<еа> операнда равен сумме содержимого регистра адреса, знакового
8-мибитного смещения и масштабированого (*1,*2,*4 или *8)
индексного регистра (регистр данных или адреса). Размер
индексного регистра может быть .W или .L. Запись в ассемблере:
d8(An,Xn.size*scale).
8) АБСОЛЮТНАЯ КОРОТКАЯ. <еа> операнда задается непосредственно
предварительно расширеное до 32-ух бит с учетом знака. Запись в
ассемблере: (xxx).W
9) АБСОЛЮТНАЯ ДЛИННАЯ. <еа> операнда задается
непосредственно. Запись в ассемблере: (xxx).L
10) НЕПОСРЕДСТВЕННАЯ. Операнд задается непосредственно. Запись
в ассемблере: #xxx
Остальные способы адресации работают только на старших
процессорах.
11) КОСВЕННАЯ РЕГИСТРОВАЯ С ИНДЕСКСОМ И БАЗОВЫМ СМЕЩЕНИЕМ.
<еа> операнда равен сумме содержимого регистра адреса, базового
смещения и масштабированого индексного регистра. Все эти
параметры необязательны. Если ни один параметр не задан - <еа>
равен 0. Запись в ассемблере: (bd,An,Xn.size*scale).
12) КОСВЕННАЯ ПОСТИНДЕКСНАЯ ЧЕРЕЗ ПАМЯТЬ. Для начала берется
число из адреса равного сумме базового смещения и содержимого
регистра адреса. <еа> операнда равен сумме этого
числа, масштабированного индексного регистра и внешнего
смещения. Все параметры необязательны. Запись в ассемблере:
([bd,An],Xn.size*scale,od).
13) КОСВЕННАЯ ПРЕИНДЕКСНАЯ ЧЕРЕЗ ПАМЯТЬ. Для начала берется
число по адресу равного сумме содержимого регистра
адреса, базового смещения и масштабированого индексного
регистра. <еа> операнда равен сумме этого числа и внешнего
смещения. Все эти параметры не обязательны. Запись в ассемблере:
([bd,An,Xn.size*scale],od).
Адресации 6,7,11,12 и 13 могут использовать вместо базового
регистра адреса програмный счетчик PC.
На данный момент мне сказать больше нечего, кроме как
послать третий fuck автору вышеопущеной книжки. В следующей
статье я опишу всю (а может быть и не всю) командную систему
процессоров MC680x0. Good bye!
<---─────────────────────────────────────────────────────────-->
От Редакции:
Предвосхищая всякие глупые наезды заявляем сами: данный цикл
статей считаем полезным и интересным, причем не только для
спектрумистов, но и для бывалых амижников. Пришло, товарищи,
время познакомиться с другой платформой поближе, пришло! Для тех
же кто до сих пор не понял прикола повторяем еще раз: у автора
нет своей АМИГИ, а большинство из вышеописанного Рома осознал
сам изучая коды амижных программ на родном ZX в самодельном
эмуляторе/отладчике. И это только начало! Сейчас >>RRA>>
ковыряет Sony PlayStation - готов аналогичный эмулятор. Только
две его характеристики: память эмулируется с использованием 6
(шести!) дискет и кэширования, а один frame генерируется около
получаса. И это не прикол!
Другие статьи номера:
Похожие статьи:
Дефлорация - Майкл встал, подошел к креслу, на котором сидела Джулия, и присел на корточки у ее ног.
В этот день... 24 октября