Born Dead #05
06 января 1999
  Amiga  

Мир Амиги - Амига глазами 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 генерируется  около
получаса. И это не прикол!




Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Новинка - Презентация игры X-Reversy.
Розыск - Розыск 3 игр: TURBO ESPRIT, 15'S, MUMMY MUMMY...
Оттяг - Тест "На сколько ты любишь пиво".

В этот день...   20 сентября