russian ROMhacking
[ Новые сообщения · Участники · Правила форума · Поиск ]
  • Страница 2 из 2
  • «
  • 1
  • 2
Инструкции процессора Motorola 68000
SmokeДата: Понедельник, 17.08.2009, 23:35 | Сообщение # 16
Подполковник
Группа: Проверенные
Сообщений: 139
Статус: Оффлайн
Логические инструкции

------------------
Эти инструкции производят логические операции на битах. Результат может быть либо истинным (1) либо ложным (0)

Code
AND, ANDI  Логическое "И"
OR, ORI    Логическое "ИЛИ"
EOR, EORI  Экстра "ИЛИ"
NOT        Логическое "НЕ"

1)Логическое "И" AND
Производит логическую операцию "И" на операнде побитово.
Рассмотрим ближе эту операцию:
AND:
0 И 0 = 0x0 = 0
0 И 1 = 0x1 = 0
1 И 0 = 1x0 = 0
1 И 1 = 1x1 = 1

Сразу перейдем к примеру. Пусть дана инструкция: and.w #4, d0 (d0 = 0000000A). Разложим операнды на биты
и логически перемножим:

Code
         0100 = $4
AND 1010 = $A
-------------------
           0000 = $0

Возможны 2 случая:
1)Первый операнд -- effective address(<ea>), второй -- регистр данных;
2)Первый операнд -- регистр данныхб второй -- effective address(<ea>);

Синтаксис: AND <ea>,Dn
AND Dn,<ea>

Варианты адресования(<ea>): 1) Dn, (An), (An)+, -(An), x(An), x(An,xr.s), label.w, label.l,
x(PC), x(PC,xr.s), #x
2) (An), (An)+, -(An), x(An), x(An,xr.s), label.w, label.l

Тип данных: Byte, word, longword

Пример:

Code
       Инструкция       До               После
         -----------------------------------------------
         |and.w d1, d2   | d1=00000055  | d1=00000055  |
         |                     | d2=00000078    | d2=00000050  |
         -----------------------------------------------

2)Логическое "И" ANDI
Производит логическую операцию "И" на операнде побитово. Работает также как и AND, только здесь в качестве
первого операнда всегда используется целое число.

Синтаксис: ANDI #<data>,<ea>

Варианты адресования(<ea>): Dn, (An), (An)+, -(An), x(An), x(An,xr.s), label.w, label.l, SR, CCR

Тип данных: Byte, word, longword

Пример:

Code
       Инструкция          До               После
         --------------------------------------------------
         |andi.w #$55, d0   | d0=00000078  | d0=00000050  |
         --------------------------------------------------

3)Логическое "ИЛИ" OR
Производит логическую операцию "ИЛИ" на операнде побитово.
Рассмотрим ближе эту операцию:
OR:
0 И 0 = 0+0 = 0
0 И 1 = 0+1 = 1
1 И 0 = 1+0 = 1
1 И 1 = 1+1 = 1

Пусть дана инструкция: or.w #4, d0 (d0 = 0000000A). Разложим операнды на биты
и логически сложим:

Code
       0100 = $4
OR  1010 = $A
-------------------
          1110 = $E

Возможны 2 случая:
1)Первый операнд -- effective address(<ea>), второй -- регистр данных;
2)Первый операнд -- регистр данныхб второй -- effective address(<ea>);

Синтаксис: OR <ea>,Dn
OR Dn,<ea>

Варианты адресования(<ea>): 1) Dn, (An), (An)+, -(An), x(An), x(An,xr.s), label.w, label.l,
x(PC), x(PC,xr.s), #x
2) (An), (An)+, -(An), x(An), x(An,xr.s), label.w, label.l

Тип данных: Byte, word, longword

Пример:

Code
       Инструкция       До               После
         -----------------------------------------------
         |or.w d1, d2    | d1=00000055  | d1=00000055  |
         |                    | d2=00000070  | d2=00000075  |
         -----------------------------------------------

4)Логическое "ИЛИ" ORI
Производит логическую операцию "ИЛИ" на операнде побитово. Работает также как и OR, только здесь в качестве
первого операнда всегда используется целое число.

Синтаксис: ORI #<data>,<ea>

Варианты адресования(<ea>): Dn, (An), (An)+, -(An), x(An), x(An,xr.s), label.w, label.l, SR, CCR

Тип данных: Byte, word, longword

Пример:

Code
       Инструкция          До               После
        ------------------------------------------------
        |or.w #$55, d0   | d0=00000070  | d0=00000075  |
        ------------------------------------------------

5)Экстра "ИЛИ" EOR
Производит логическую операцию "ИЛИ" на операнде побитово. Отличается от простого OR тем, что в случае
логического сложения 1+1 получается не 1, а 0. Остальное то же самое.
EOR:
0 И 0 = 0+0 = 0
0 И 1 = 0+1 = 1
1 И 0 = 1+0 = 1
1 И 1 = 1+1 = 0

Пусть дана инструкция: eor.w #4, d0 (d0 = 0000000A). Разложим операнды на биты
и логически сложим:

Code
       0100 = $4
EOR 1110 = $E
------------------
         1010 = $A

Синтаксис: EOR Dn,<ea>

Варианты адресования(<ea>): Dn, (An), (An)+, -(An), x(An), x(An,xr.s), label.w, label.l

Тип данных: Byte, word, longword

Пример:

Code
       Инструкция       До               После
        -----------------------------------------------
        |eor.w d1, d2   | d1=00000004  | d1=00000004  |
        |                     | d2=0000000E  | d2=0000000A  |
        -----------------------------------------------

6)Экстра "ИЛИ" EORI
Производит логическую операцию "ИЛИ" на операнде побитово. Работает также как и EOR, только здесь в качестве
первого операнда всегда используется целое число.

Синтаксис: EORI #<data>,<ea>

Варианты адресования(<ea>): Dn, (An), (An)+, -(An), x(An), x(An,xr.s), label.w, label.l, SR, CCR

Тип данных: Byte, word, longword

Пример:

Code
       Инструкция          До               После
        -------------------------------------------------
        |eori.w #$4, d0   | d0=0000000E  | d0=0000000A  |
        -------------------------------------------------

7)Логическое "НЕ" NOT
Производит логическую операцию "НЕ" на операнде побитово.
Рассмотрим ближе эту операцию:
NOT:
NOT 1 = 0
NOT 0 = 1
Пусть дана инструкция: not.w d0 (d0 = 0000000A). Рассмотрим ее работу на битах.
NOT 1010 = %0101 = $5

Синтаксис: NOT <ea>

Варианты адресования(<ea>): Dn, (An), (An)+, -(An), x(An), x(An,xr.s), label.w, label.l

Тип данных: Byte, word, longword

Пример:

Code
       Инструкция     До          После
        ------------------------------------------
        |not.w d0  | d0=0000000A  | d0=00000005  |
        ------------------------------------------


Сообщение отредактировал Smoke - Понедельник, 17.08.2009, 23:37
 
zephyrДата: Суббота, 22.05.2010, 12:59 | Сообщение # 17
Сержант
Группа: Проверенные
Сообщений: 20
Статус: Оффлайн
Что-то давно нет новых уроков sad
Почему бы не сделать вводный урок.
С описанием регистров, общей структурой программы на асме под
компилятор SNASM68K и программой "Хелло ворлд!"!?


coder

Сообщение отредактировал zephyr - Суббота, 22.05.2010, 13:11
 
SmokeДата: Суббота, 22.05.2010, 22:46 | Сообщение # 18
Подполковник
Группа: Проверенные
Сообщений: 139
Статус: Оффлайн
В принципе почти все рассмотрел, остались только не очень часто используемые инструкции, но закончить надо. А с разбором структуры простенькой программы есть такая мысль, но из-за наличия больших объемов лени и нехватки времени она была отложена в долгий ящик. Как-нибудь постараюсь заняться вплотную smile
 
Ti_Дата: Пятница, 04.06.2010, 14:53 | Сообщение # 19
Лейтенант
Группа: Проверенные
Сообщений: 58
Статус: Оффлайн
Quote (Smoke)
Инструкция часто используется для записи регистров в SP и последующего оттуда копирования обратно по регистрам.

у тебя маловато написано про стак не каждый поймет, мне вот Шелл объяснял как он работает, как пихать-забирать где можно, нельзя и т.д.
ещё пример не самый удачный, зачем нам сейвить число 12 которое мы знаем? другое дело когда всегда разное и надо сохранять.
Quote (Smoke)
MOVEM (MOVE Multiply)
Вариантов может быть множество. Вот некоторые:
movem d0-d5, -(sp)

это movem.l или movem.w ? сейв целиком регистра или половинку, если посмотреть игры сейвят там где возможно, сейвят word, чтобы меньше "тормозила". как и команды moveq , addq. для чего они и сделаны. надо бы это указать.

кстати у меня sega assembler v.3 movem не понимает. (либо ндо ему по-другому как-то писать, не как в ida)

Добавлено (04.06.2010, 14:42)
---------------------------------------------

Quote (zephyr)
Переходы обычно идут после сравнения двух операндов. Допустим идет сравнение:
cmp.w D0, D1 И после него сразу один из переходов:

нужно бы рассказать что меняется SR, а переходы уже на основе его делаются.

Добавлено (04.06.2010, 14:47)
---------------------------------------------

Quote (Smoke)
В принципе почти все рассмотрел, остались только не очень часто используемые инструкции, но закончить надо

btst, bchg не такие уж редкие, надо бы и их написать. Надеюсь как время будет допишешь!
редкие это rte, stop, illegal smile

Добавлено (04.06.2010, 14:53)
---------------------------------------------

Quote (zephyr)
программой "Хелло ворлд!"!?

а что за программа такая? это уже не пример будет. тут же понадобиться описывать всю программу инициализации железа сеги т.д, регистры vdp, и буквы эти откуда брать? номера спрайтов, сами буквы котороые нужно нарисовать засунуть в rom.
лучше укажите в качестве примера куски кода оригинальных игр, взломанных вами., с полным описанием. мы же не игру создаем целиком, а только взламываем (ромхакинг) и абсолютно всё знать не обязательно.


Сообщение отредактировал Ti_ - Пятница, 04.06.2010, 14:57
 
SmokeДата: Пятница, 04.06.2010, 23:21 | Сообщение # 20
Подполковник
Группа: Проверенные
Сообщений: 139
Статус: Оффлайн
Ti_, спасибо, что указал на недочеты, я доработаю. А хелло ворлд это пример, где будет допустим выводиться графика на экран в виде спрайтов и планов, может проигрываться музыка. Все с комментами. Цель -- дать читающему понятия как работает ром, как работает VDP, чтобы он мог свою графику писать. Ну и суперски это ему поможет для написания своего собственного кода в дальнейшем.
 
SmokeДата: Вторник, 19.10.2010, 20:28 | Сообщение # 21
Подполковник
Группа: Проверенные
Сообщений: 139
Статус: Оффлайн
Давно написал и забыл выложить biggrin
Операции с битами

------------------

Code
BTST  Проверяет бит
BSET  Проверяет бит, затем устанавливает (1)
BCLR  Проверяет бит, затем обнуляет (0)
BCHG  Проверяет бит, затем заменяет (0 -> 1, 1 -> 0)

1)Проверка бита BTST
Эта инструкция проверяет бит, номер которого дается в операнде, по указанному адресу. В зависимости
от того каким был бит до операции (0 или 1) устанавливается Z-флаг. Если бит был 0, то Z-флаг
станет 1.

Синтаксис: BTST Dn,
BTST #,

Варианты адресования(): Dn, (An), (An)+, -(An), x(An), x(An,xr.s), label.w, label.l,
label(PC), label(PC,xr.s)

Тип данных: Byte, longword

Пример:

Code
       Инструкция              До                После
         ------------------------------------------------------------
         |BTST #$1, d0  | d0=$000000FF  | d0=$000000FF  |
         |                      | d0=%11111111| d0=%11111111 |
         ------------------------------------------------------------

2)Установка бита BSET
Эта инструкция проверяет бит, номер которого дается в операнде, по указанному адресу, затем
устанавливает его в 1. В зависимости от того каким был бит до операции (0 или 1)
устанавливается Z-флаг. Если бит был 0, то Z-флаг станет 1.

Синтаксис: BSET Dn,
BSET #,

Варианты адресования(): Dn, (An), (An)+, -(An), x(An), x(An,xr.s), label.w, label.l,
label(PC), label(PC,xr.s)

Тип данных: Byte, longword

Пример:

Code
       Инструкция             До                После
         ------------------------------------------------------------
         |BSET #$1, d0  | d0=$00000000  | d0=$00000002  |
         |                      | d0=%00000000 | d0=%00000010 |
         -------------------------------------------------------------

3)Обнуление бита BCLR
Эта инструкция проверяет бит, номер которого дается в операнде, по указанному адресу, затем
обнуляет его. В зависимости от того каким был бит до операции (0 или 1) устанавливается Z-флаг.
Если бит был 0, то Z-флаг станет 1.

Синтаксис: BCLR Dn,
BCLR #,

Варианты адресования(): Dn, (An), (An)+, -(An), x(An), x(An,xr.s), label.w, label.l,
label(PC), label(PC,xr.s)

Тип данных: Byte, longword

Пример:

Code
       Инструкция            До                После
         ------------------------------------------------------------
         |BCLR #$1, d0  | d0=$000000FF  | d0=$000000FE  |
         |                      | d0=%11111111| d0=%11111101 |
         ------------------------------------------------------------

4)Замена бита BCHG
Эта инструкция проверяет бит, номер которого дается в операнде, по указанному адресу, затем
заменяет его. В зависимости от того каким был бит до операции (0 или 1) устанавливается Z-флаг.
Если бит был 0, то Z-флаг станет 1.

Синтаксис: BCHG Dn,
BCHG #,

Варианты адресования(): Dn, (An), (An)+, -(An), x(An), x(An,xr.s), label.w, label.l,
label(PC), label(PC,xr.s)

Тип данных: Byte, longword

Пример:

Code
       Инструкция             До                   После
         ---------------------------------------------------------------
         | BC HG #$1, d0  | d0=$000000FF    | d0=$000000FE    |
         |                       | d0=%11111111  | d0=%11111101  |
         ----------------------------------------------------------------
         |BCHG #$1, d0  | d0=$00000000   | d0=$00000002    |
         |                       | d0=%00000000  | d0=%00000010  |
         ----------------------------------------------------------------

BCD-инструкции

------------------

Code
ABCD  Сложение
NBCD  Негатив
SBCD  Вычитание

1)Десятичное сложение ABCD
Обычное сложение в десятичной системе счисления.

Синтаксис: ABCD Dn,Dn
ABCD -(An),-(An)

Варианты адресования(): Dn, -(An)

Тип данных: Byte

Пример:

Code
       Инструкция             До               После
        ------------------------------------------------------------
        |ABCD d1, d0  | d0=$00000002  | d0=$00000010   |
        |                     | d1=$00000008  | d1=$00000008   |
        -------------------------------------------------------------

2)Десятичное вычитание SBCD
Обычное вычитание в десятичной системе счисления.

Синтаксис: SBCD Dn,Dn
SBCD -(An),-(An)

Варианты адресования(): Dn, -(An)

Тип данных: Byte

Пример:

Code
       Инструкция            До                 После
        ------------------------------------------------------------
        |SBCD d1, d0  | d0=$0000000B  | d0=$00000003   |
        |                     | d1=$00000008  | d1=$00000008   |
        -------------------------------------------------------------

3)Десятичный негатив NBCD
Негатив в десятичной системе счисления. Исходит из принципа замены числа на такое, что в сумме
они будут давать число, делящееся на 10. Например, 10, 100, 1000 и т.д.

Синтаксис: NBCD

Варианты адресования(): Dn, (An), (An)+, -(An), x(An), label(An,xr.s), label.w, label.l

Тип данных: Byte

Пример:

Code
       Инструкция                До                            После
        --------------------------------------------------------------- -------------
        |NBCD ($00FFFF00).l  | <ea>=$00000045  | <ea>=$00000055   |
        ----------------------------------------------------------------------------


Сообщение отредактировал Smoke - Вторник, 19.10.2010, 20:29
 
facirusДата: Воскресенье, 15.05.2016, 07:05 | Сообщение # 22
Рядовой
Группа: Проверенные
Сообщений: 2
Статус: Оффлайн
Цитата Smoke ()
9)Адресование со смещением относительно PC(Program Counter)

Обозначение <ea>: x(PC)

Синтаксис: move.x n(pc), Dy
где х -- тип данных byte, word или longword
рс -- значение Program Counter в момент выполнения инструкции
n -- величина смещения
Dy -- регистр данных D0-D7

Примечание: величина смещения(n) имеет тип word, также sign, т.е. изменяется в диапазоне -7FFF..+7FFF.

Пример: move.l $100(pc), d0 копирует данные(longword), находящиеся по смещению PC+$102(102 потому что х имеет тип word).
- тут закралась ошибка: 102 не потому что х имеет тип word (х тут имеет тип longword), а потому что инструкция имеет размер 2 байта и на момент ее выполнения рс уже указывает на следующую инструкцию.
 
facirusДата: Воскресенье, 15.05.2016, 07:26 | Сообщение # 23
Рядовой
Группа: Проверенные
Сообщений: 2
Статус: Оффлайн
Цитата Smoke ()
12)Копирование в адресный регистр

Синтаксис: movea.х #$n, Ay
где n -- адрес, который надо поместить в адресный регистр
х -- тип word или longword
Ay -- адресный регистр A0-A7(да, да SP тоже используется)

Вообще то процессор Motorola 68000 имеет стек-ориентированную систему инструкций и теоретически можно использовать любой адресный регистр в качестве SP, или даже использовать одновременно несколько стеков, каждый из которых будет иметь свой указатель. Просто по умолчанию в качестве SP используется адресный регистр А7.
 
  • Страница 2 из 2
  • «
  • 1
  • 2
Поиск: