Автор Тема: Нужна помощь по командам M68k  (Прочитано 12150 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1284
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #60 : 14 Октябрь 2012, 19:40:09 »
А в каких целях разрабы столь извращались? То есть нафига это нужно вообще.
Спроси у них :) Место на коде экономили, наверно. Т.е. так тебе на вызов некой глобальной субрутины надо 4-6 байт, а тут всего 2 байта на вызов. В Landstalker как раз та фигня с TRAP и байтами-данными после её вызова, которую ты привёл для Comix Zone. Но там, ЕМНИП, есть пара обычных процедур, не TRAP'овых, которые меняют точку возврата.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #61 : 14 Октябрь 2012, 20:06:28 »
В квакшоте практически все основные процедуры распаковки данных вызываются через трапы. Ну а так код нормальный.
А Tecmo Cup практически весь на F0 XX опкодах и сделан. Но, мне кажется, обработка исключений должна как-то сказываться либо на скорости, либо на обработке команд эмулятором. Все ли они такое понимают?

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #62 : 14 Октябрь 2012, 23:09:01 »
А Tecmo Cup практически весь на F0 XX опкодах и сделан. Но, мне кажется, обработка исключений должна как-то сказываться либо на скорости, либо на обработке команд эмулятором. Все ли они такое понимают?
Можно проверить конечно, но скорее всего все эмули понимают это.  Они только ошибку нечетного bad adress не эмулируют, да и то наверно не все.  Ну на скорости да, ну оно же не намного дольше jsr будет, так что разницы почти никакой, если только не в цикле стоит.

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9386
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #63 : 14 Октябрь 2012, 23:46:39 »
DrMefistO, TRAP и LINE эксепшены одинаковы по тактам, но быстрее чем JSR да и короче аж на 4 байта
трап/ексепшн это обычная комманда, которая выполняется фиксированное кол-во тактов, так что наверняка тайминг верный в эмуляторах.
Цитата: Ti_
Можно проверить конечно, но скорее всего все эмули понимают это.  Они только ошибку нечетного bad adress не эмулируют, да и то наверно не все.

да давно уже все и всё эмулируют, большинство более-менее современных эмуляторов используют ядро М68К Musashi, там и доступ к нечетным адресам эмулится и prefetch.

я уже молчу про WinUAE и его 68020 с потактовой эмуляцией, а в 20ке есть кеш и в зависимости от hit/miss комманды очень разное время могут выполняться.

Оффлайн Ti_

  • Пользователь
  • Сообщений: 3265
  • Пол: Мужской
    • ВКонтакте
    • Youtube
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #64 : 14 Октябрь 2012, 23:53:20 »
DrMefistO, TRAP и LINE эксепшены одинаковы по тактам, но быстрее чем JSR да и короче аж на 4 байта
трап/ексепшн это обычная комманда, которая выполняется фиксированное кол-во тактов, так что наверняка тайминг верный в эмуляторах.
По моим манулам не так:
Цитата
This table indicates the number of clock periods for exception processing.
The number of clock periods includes the time for all stacking, the vector
fetch and the fetch of the first two instruction words of the handler routine.
The number of bus read and write cycles is shown in parenthesis as (r/w).


      Exception Processing Execution Times

   exception         periods

   address error         50(4/7)
   bus error         50(4/7)
   CHK instruction (trap taken)   44(5/3)+
   Divide by Zero         42(5/3)
   illegal instruction      34(4/3)
   interrupt         44(5/3)*
   privilege violation      34(4/3)
        _____
   RESET **         40(6/0)
   trace            34(4/3)
   TRAP instruction      38(4/3)
   TRAPV instruction (trap taken)   34(4/3)

   + add effective address calculation time
   * the interrupt acknowledge cycle is assumed to take four
     clock periods
                                       _____     ____
       ** indicates the time from when RESET and HALT are first
     sampled as negated to when instruction execution starts


Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9386
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #65 : 15 Октябрь 2012, 00:44:27 »
Ti_, тогда наверное так, у меня книжка юзер-мануал по 68030, по нему и смотрел, при мисс-кэш большинство комманд выполняются столько же тактов как и на 000, но видно не все :)

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1284
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #66 : 15 Октябрь 2012, 02:51:23 »
JSR может занимать и 4 байта, и поэтому требовать на 4 такта меньше, чем 6-байтный. Или, что то же самое, BSR на 4 байта. Это если весь код игры кучкуется в одном месте. А RTE выполняется дольше, чем RTS :)

Для скорости LINE Emulator нет смысла использовать, "декодирование" опкода - например, извлечение номера процедуры и прыжок на неё, как в Tecmo Cup, - занимает много времени. Выгода от TRAP тоже сомнительна.
Добавлено позже:
Да и в том же Лэндстолкере в самом начале рома огромная таблица прыжков и 6-байтные JSR'ы на них. Так что TRAP там не для экономии.

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3240
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #67 : 15 Октябрь 2012, 14:32:22 »
ну я например заюзал команду F00X для кода извлечения корня из регистра dX
так можно например массив ссылок написать и вызывать их по номеру.
в своей игруле я такие фичи юзаю по мелочи.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #68 : 18 Октябрь 2012, 16:55:10 »
Поясните, плиз назначение команд типа:
move    #$XXXX,srИли:
or    #$XXXX,srНу и всех подобных с регистром sr.

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9386
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #69 : 18 Октябрь 2012, 18:14:10 »
почитай доку чтоли с описанием битов регистра SR и всё станет понятно
в мегадрайве как правило используется только для вкл/выкл прерываний

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #70 : 18 Октябрь 2012, 18:58:39 »
http://en.wikibooks.org/wiki/68000_Assembly
Тут написано про биты, но не для всех битов написано пояснение. В частности
I0 Interrupt priority mask bit 1
I1 Interrupt priority mask bit 2
I2 Interrupt priority mask bit 3
Что за маска?

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9386
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #71 : 18 Октябрь 2012, 19:26:16 »
DrMefistO, лучше читай вот это http://www.freescale.com/files/archives/doc/ref_manual/M68000PRM.pdf
обычная маска прерываний, 3 бита образуют число 0-7, если уровень прерывания больше него - будет вызван обработчик прерывания, если нет - то нет
в мегадрайве 3 штуки прерываний - VINT (level 6), HINT(level 4), ExtINT(level 2)

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3240
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #72 : 19 Октябрь 2012, 08:52:27 »
такая команда нужна чтобы изменить настройку прерываний.
т.е. на момент команды было и вертикальное прерывание и горизонтальное, а после уже только вертикальное.
это крайне удобно, например, чтобы запустить архиватор, выключить скроллинг слоя и не выключать музыку.
ну это грубый пример (например комикс зон наглядный пример, момент, когда страница перелистывается)
можно даже на определенное время сунуть настройки в стэк, заменить прерывания и после какихто манипуляций вернуть настройку из стэка.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #73 : 04 Ноябрь 2012, 16:08:59 »
ROM:00073A12 sub_73A12:                              ; CODE XREF: sub_739B8+44p
ROM:00073A12                                         ; sub_73AA0+16p
ROM:00073A12                 movea.l a0,a1
ROM:00073A14                 move.w  #$EB,d1 ; 'ы'
ROM:00073A18                 moveq   #0,d2
ROM:00073A1A
ROM:00073A1A loc_73A1A:                              ; CODE XREF: sub_73A12+Aj
ROM:00073A1A                 move.l  d2,(a1)+
ROM:00073A1C                 dbf     d1,loc_73A1A
ROM:00073A20                 rts

В начале процедуры в a0 идет адрес 7679E (ROM). Как такое возможно? Отладчиком проверяю: действительно в цикле оно пишет по адресу в a1.

Оффлайн r57shell

  • Пользователь
  • Сообщений: 1402
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #74 : 04 Ноябрь 2012, 16:28:08 »
SRAM как вариант

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #75 : 04 Ноябрь 2012, 16:33:18 »
Не похоже, т.к. в хедере SRAM поле пустое.

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9386
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #76 : 04 Ноябрь 2012, 16:38:03 »
DrMefistO, или header врёт или глюк, а что за игра кстати ?

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #77 : 04 Ноябрь 2012, 16:39:09 »
Dizzy Adventures (SMD).
Добавлено позже:
А запись по "Bad address" может обрабатываться каким-то исключением?

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9386
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #78 : 04 Ноябрь 2012, 17:13:14 »
Цитата: DrMefistO
Dizzy Adventures (SMD).

в смысле Fantastic Dizzy ? sram в том карте нет, я думаю это ошибка/глюк игры.
Цитата: DrMefistO
А запись по "Bad address" может обрабатываться каким-то исключением?

что ты подразумеваешь под "Bad address" ? если попытку записи в ром то нет.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #79 : 04 Ноябрь 2012, 17:16:24 »
Цитата: MetalliC
в смысле Fantastic Dizzy

Да, и SRAM там нету.
Цитата: MetalliC
я думаю это ошибка/глюк игры.

но эта "ошибка" много где в начале игры есть.
Цитата: MetalliC
если попытку записи в ром то нет.

да, думал что может так как-то)

Оффлайн MetalliC

  • Технический консультант
  • Сообщений: 9386
  • Пол: Мужской
  • Demul team / MAME developer
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #80 : 04 Ноябрь 2012, 17:46:51 »
Цитата: DrMefistO
но эта "ошибка" много где в начале игры есть.

этот код похоже вызывается при ините звукового драйвера, но насколько я вижу с "левым" адресом в А0 она вызывается только в первый раз, в следующих вызовах в А0 уже нормальный адрес в раме.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #81 : 04 Ноябрь 2012, 17:54:30 »
Да, видимо так и есть.

Оффлайн Segaman

  • Пользователь
  • Сообщений: 3240
  • Пол: Мужской
  • Blast Processing!
    • Youtube
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #82 : 05 Ноябрь 2012, 11:11:03 »

 :lol:

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #83 : 09 Ноябрь 2012, 12:55:20 »
Подскажите, как реализовать команды ROXL и ROXR на языке высокого уровня (Delphi, C)? Допускается использование ассемблерной вставки.

И сопутствующий вопрос: при каких условиях устанавливается X флаг?
« Последнее редактирование: 09 Ноябрь 2012, 13:15:35 от DrMefistO »

Оффлайн r57shell

  • Пользователь
  • Сообщений: 1402
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #84 : 09 Ноябрь 2012, 13:55:09 »
int rorx(unsigned short a, char n, char &x)
{
 char xx = x;
 x = (a>>(n-1))&1;
 return (a>>n) | (a<<(33-n)) |( (xx?1:0)<<(32-n))
}
что-то типо того.
могут быть крайние случаи где возникнет баг. надо тестить.
ах да, это для сдвига word.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #85 : 09 Ноябрь 2012, 14:03:05 »
Пасибо. В принципе, я суть уловил. Главное знать, где до этого устанавливается X флаг, и совать его на место освободившегося бита. А выдавленный бит совать в X.

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1284
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #86 : 09 Ноябрь 2012, 16:07:47 »
Эквивалентные команды для x86: rcl, rcr

Цитата
И сопутствующий вопрос: при каких условиях устанавливается X флаг?
А мануал трудно глянуть? Там всё предельно понятно нарисовано и расписано. Флаг X служит буфером для хранения бита. Вдвигаемый (старший) бит берётся из флага X, а записывается туда выдвигаемый (младший, 0-й) бит. И так n раз, сколько в команде указано. Флаг C будет равен X.
Добавлено позже:
Цитата
Главное знать, где до этого устанавливается X флаг, и совать его на место освободившегося бита. А выдавленный бит совать в X.
Обрати внимание, освободившийся бит заполняется X-ом на ПЕРВОМ сдвиге, а выдавливается младший бит в X для конечного результата на ПОСЛЕДНЕМ сдвиге (на самом деле он выдавливается n раз, на каждом сдвиге, но для конечного результата нам нужно его только один раз проверить). Если у тебя сдвигов больше одного.

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #87 : 09 Ноябрь 2012, 18:18:10 »
У меня ROXL, с единичным сдвигом. Т.е. старший выдавливаемый бит идет в X, а то что в X до этого было (у меня значение X, которое "до этого", устанавливается командой asl.l 8, d5) идет в младший бит.
Добавлено позже:
Цитата: GManiac
Эквивалентные команды для x86: rcl, rcr

Все бы хорошо, но мне надо до следующего раза таскать CR тогда. Как?

Оффлайн DrMefistO

  • Пользователь
  • Сообщений: 1294
  • Пол: Мужской
  • Sega Mega Drive reversing
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #88 : 12 Ноябрь 2012, 16:52:04 »
Подскажите, где можно почитать толковую доку по использованию DMA? А то в Sega_Tech_Rus как-то все неопределенно.
Добавлено позже:
Вопрос возник потому, что:
ROM:0000135E sub_135E:                               ; CODE XREF: sub_1256+4Ap
ROM:0000135E                                         ; sub_13F4+Cj ...
ROM:0000135E                 move.l  #$C0000000,d1
ROM:00001364                 move.l  #RAM_Palette1,d2
ROM:0000136A                 move.w  #$40,d3 ; '@'
ROM:0000136E                 jsr     sub_10CA        ; d1 = VDP Command
ROM:0000136E                                         ; d2 = ?
ROM:0000136E                                         ; d3 = DMA Size (WORDS)
ROM:00001372                 rts
ROM:00001372 ; End of function sub_135E
RAM_Palette1 = 0xFFB098
Затем, по ходу процедуры значения d1 и d3 применяются так как я и написал в комментарии к процедуре, но d2 в итоге записывается в VDPControl как 0x7FD84C (это ведь 0xFFD84C?) (адрес для источника DMA), что странно...

Вот и интересно стало: при пересылке через DMA есть какие-то хитрости при указании адреса источника?

Игра: Tecmo Cup Football.bin
« Последнее редактирование: 12 Ноябрь 2012, 17:31:17 от DrMefistO »

Оффлайн GManiac

  • Пользователь
  • Сообщений: 1284
    • Просмотр профиля
Re: Нужна помощь по командам M68k
« Ответ #89 : 12 Ноябрь 2012, 17:38:33 »
0x7FD84C * 2 = 0xFFB098
Это совпадает с твоим RAM_Palette1 и есть адрес источника.
Добавлено позже:
Ты игру на ПК переписываешь, что ли? Смотрю, ты этот Текмо Кап 2 года уже мучаешь, ещё с форума шедевра помню твои темы.