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 генерируется около получаса. И это не прикол!
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября