Разработка и ромхакинг > Ромхакинг и программирование
Нужна помощь по командам M68k
<< < (3/6) > >>
GManiac:
Да есть такая, "Геймдев под 68к"
MetalliC:
нене, там геймдев, а тут "вижу две комманды, но не пойму что они делают"  :lol:
кстати спасибо, тема доставила
r57shell:
И вообще, в догонку, DrMefistO, ты же наверно пишешь на x86, x64 системах?
На них абсолютно такие же правила. просто больше байтов.
int a = -1 это 0xFFFFFFFF в памяти.
а теперь отгадайте загадку на эту тему
в каких случаях

--- Код: ---int a;
if (a == -a)
    printf("hoho!");
--- Конец кода ---
выведет хохо?
Кто не хочет "спойлерить" своё предположение в личку.
Ti_:

--- Цитата: r57shell от 14 Сентябрь 2012, 23:50:00 ---в каких случаях

--- Код: ---int a;
if (a == -a)
    printf("hoho!");
--- Конец кода ---
выведет хохо?
Кто не хочет "спойлерить" своё предположение в личку.

--- Конец цитаты ---
Подвох наверно какой с минус нулем связанный, может быть при 0 и 0x80000000. Что-то такое ты помню мне рассказывал.
r57shell:
Под предыдущим спойлером кроется истина.
всё просто, как я и говорил, чтобы получить отрицательное число, можно из нуля вычесть число
0 - 0x80000000 = 0 - 0x80000000
то есть в бинарном
0000...0000
1000...0000
=
1000...0000
не забываем занять то, чего нет
или другая известная формула для обратного кода
x = (~x)+1
где ~ побитовое отрицание.
то есть
+x = 1000...0000
~x = 0111...1111
-x = 1000...0000 (добавил 1)
то есть для нуля и 0x80000000 будет x == -x истинно, а вот почему для остальных ложь... а не важно!  :lol:
DrMefistO:
Продолжаю тему. Вопрос касаемо VDP:

--- Код: ---ROM:00000580                 move.w  #$C000,($c00004).l
ROM:00000584                 move.w  #$80,-(sp)
ROM:00000588                 move.w  (sp)+,($c00004).l
--- Конец кода ---
Что делает данный набор команд? Не нашел в доках описания для первой команды.
GManiac:
В каких доках? VDP надо смотреть в доках по сеге, а не по 68к. В данном случае в порт C00004 пишется в два шага двойное слово #$C000 0080. В Sega Tech.doc в переводе от HWMan'а ищем C00004, затем запись в этот адрес. Там написано:
ПЕРВЫЙ ВАРИАНТ ЗАПИСИ : УСТАНОВКА РЕГИСТРА
D7   D6   D5   D4
1   0   0   RS4
У нас 1100, нам не подходит.

Нам подходит ВТОРОЙ ВАРИАНТ ЗАПИСИ : УСТАНОВКА АДРЕСА
D7   D6   D5   D4
CD1   CD0   A13   A12
смотрим табличку, понимаем, что у нас "ЗАПИСЬ В CRAM", но CD5 у нас равен 1, а в табличке 0. При этом ниже написано:
Внимание! Код ID CD5 используется при инициализации и запуска сервиса DMA. При этом дополнительной информации обо всех вариантах кода ID нет. Будьте внимательны, в примерах указаны нормальные значения.

Понимай как хочешь.
DrMefistO:
Да я в доках по VDP и смотрел. Но чего-то про два шага не подумал) Пасибо)
GManiac:
С вопросом по аппаратной части сеги можно сюда
http://gendev.spritesmind.net/forum/index.php

Что за игра хоть? Можно убрать эту команду и посмотреть, как отреагирует эмулятор. Если будут issue с палитрой, значит, эмулятор понимает этот код как запись в CRAM.
DrMefistO:
Собственно да, это запись в CRAM[0,0] с использованием DMA. Игра Quackshot.
Добавлено позже:
Т.к. до этого пишутся значения в регистры начальной адресации DMA.
Segaman:
такой метод видать для четкой реализации дма.
там же  дма заморочек много вроде записи из рам.
вот они и задействовали стэк, потому что он в рам находится.
DrMefistO:
Bad Opcode.
В хексе выглядит как F0 XX. К примеру F0 12. Как игра (Tecmo Cup) понимает такие команды? IDA их не знает. Но это точно код.

Добавлено позже:
Хм, при выполнении F0 12 отладчик идет на RESERV1. Как с этим разобраться?

Еще позже:
Я так понял, что F0 XX - это переход на вектор, где XX - номер вектора. Забавно.

Непонятка:
Но F0 42 куда идет?
GManiac:
Качай табличку
http://www.emu-land.net/forum/index.php?topic=42330.0

А тут показано, как её можно красиво распечатать :)
http://gendev.spritesmind.net/forum/viewtopic.php?p=12074

Коды Fx не будут работать, точнее, они автоматом сбрасываются на спец. вектор для обработки кодов Fx (один!), но вряд ли в обычных играх он зайдествован.
DrMefistO:
Спасибо, конечно, только я не понял, где в этой таблице эти коды?
GManiac:
В таблице как раз в группах 1010 и 1111 написано Invalid opcode. Нет таких кодов, они вызывают прерывание на вектора, которые в оригинальных доках называются Line-A emulator и Line-F emulator, и в тех же доках написано, что эти хексы оставлены на будущее или на кастомную реализацию опкодов разработчиком.
Не знаю, с чего ты взял, что
--- Цитата ---Но это точно код.
--- Конец цитаты ---
Не может такого быть. А если есть, значит, вектор в любой случае один, и надо смотреть обработчик в нём.
DrMefistO:
Точно код, т.к. посреди процедуры частяком в этой игре встречаются такие опкоды. И очень много F0 XX таких. 100% код. Возможно вектор один всего, это пока не проверил.
GManiac:
Называй точно игру и давай свою процедуру. Адрес её. И в каком месте игры вызывается.
В Landstalker тоже часто встречаются байты-некоды посреди процедуры, но они перепрыгиваются предварительным вызовом некой процедурки и увеличением адреса возврата.
DrMefistO:
Игра: Tecmo Cup Football (J).bin
Например процедура: адрес процедуры 0x63C, на 0x67E - опкод.
Добавлено позже:
Уверен, что код, т.к. эти опкоды даже не перепрыгиваются. И процедура нормальная.
Добавлено позже:
Вызывается в начале первого матча.
GManiac:
Ну, это тот редкий случай, когда реализован Line-F Emulator :) В обработчике же явно видно, что он берёт нижний байт команды и рассматривает его для прыжка на нужную подпрограмму (массив процедур). Точнее, это хорошо видно в эмуляторе.

--- Код: ---_00001A7E: 206F 0002                MOVEA.L   $0002(A7),A0
_00001A82: 3018                     MOVE.W    (A0)+,D0
_00001A84: 2F48 0002                MOVE.L    A0,$0002(A7)
_00001A88: 0240 00FF                ANDI.W    #$00FF,D0
_00001A8C: E548                     LSL.W     #$2,D0
_00001A8E: 207B 0010                MOVEA.L   $00001AA0(pc,D0.W),A0
_00001A92: 4E90                     JSR       (A0)
_00001A94: 40D7                     MOVE      SR,(A7)
_00001A96: 4E73                     RTE       
..
_00001AA0: 0000 0E04
_00001AA4: 0000 0E8A
_00001AA8: 0000 0EAC
_00001AAC: 0000 0ED6
_00001AB0: 0000 0F04
_00001AB4: 0000 0F3E
_00001AB8: 0000 0FD0
_00001ABC: 0000 0FDC
_00001AC0: 0000 0FC4
_00001AC4: 0000 0F78
_00001AC8: 0000 1A9A
_00001ACC: 0000 1A9A
_00001AD0: 0000 100E
_00001AD4: 0000 100C
....

--- Конец кода ---
Ti_:

--- Цитата: GManiac от 13 Октябрь 2012, 19:29:01 ---Ну, это тот редкий случай, когда реализован Line-F Emulator :)

--- Конец цитаты ---
А в каких целях разрабы столь извращались? То есть нафига это нужно вообще.
Помню также что в comix zone используются #trap, а 2-байта следом за ним идущие тоже не код, а какие-то свойства для обработки.
Я видел только один опкод который IDA не знает - ori #$700,ccr  и подобное.
Навигация
Главная страница сообщений
Следующая страница
Предыдущая страница

Перейти к полной версии