Russian Romhacking

[ Новые сообщения · Участники · Правила форума · Поиск ]
Страница 2 из 2«12
Форум ромхакеров » Всё о ромхакинге » Ромхакинг » Инструкции процессора Motorola 68000 (с пояснениями)
Инструкции процессора Motorola 68000
SmokeДата: Понедельник, 17.08.2009, 23:35 | Сообщение # 16
Подполковник
Группа: Модераторы
Сообщений: 122
Статус: Offline
Логические инструкции

------------------
Эти инструкции производят логические операции на битах. Результат может быть либо истинным (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
Рядовой
Группа: Проверенные
Сообщений: 18
Статус: Offline
Что-то давно нет новых уроков sad
Почему бы не сделать вводный урок.
С описанием регистров, общей структурой программы на асме под
компилятор SNASM68K и программой "Хелло ворлд!"!?

coder

Сообщение отредактировал zephyr - Суббота, 22.05.2010, 13:11
 
SmokeДата: Суббота, 22.05.2010, 22:46 | Сообщение # 18
Подполковник
Группа: Модераторы
Сообщений: 122
Статус: Offline
В принципе почти все рассмотрел, остались только не очень часто используемые инструкции, но закончить надо. А с разбором структуры простенькой программы есть такая мысль, но из-за наличия больших объемов лени и нехватки времени она была отложена в долгий ящик. Как-нибудь постараюсь заняться вплотную smile
 
Ti_Дата: Пятница, 04.06.2010, 14:53 | Сообщение # 19
Лейтенант
Группа: Пользователи
Сообщений: 49
Статус: Offline
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
Подполковник
Группа: Модераторы
Сообщений: 122
Статус: Offline
Ti_, спасибо, что указал на недочеты, я доработаю. А хелло ворлд это пример, где будет допустим выводиться графика на экран в виде спрайтов и планов, может проигрываться музыка. Все с комментами. Цель -- дать читающему понятия как работает ром, как работает VDP, чтобы он мог свою графику писать. Ну и суперски это ему поможет для написания своего собственного кода в дальнейшем.
 
SmokeДата: Вторник, 19.10.2010, 20:28 | Сообщение # 21
Подполковник
Группа: Модераторы
Сообщений: 122
Статус: Offline
Давно написал и забыл выложить 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
 
Форум ромхакеров » Всё о ромхакинге » Ромхакинг » Инструкции процессора Motorola 68000 (с пояснениями)
Страница 2 из 2«12
Поиск: