| Разработка и ромхакинг > Ромхакинг и программирование |
| Нужна помощь по командам M68k |
| << < (4/6) > >> |
| GManiac:
--- Цитата: Ti_ от 14 Октябрь 2012, 19:17:54 ---А в каких целях разрабы столь извращались? То есть нафига это нужно вообще. --- Конец цитаты --- Спроси у них :) Место на коде экономили, наверно. Т.е. так тебе на вызов некой глобальной субрутины надо 4-6 байт, а тут всего 2 байта на вызов. В Landstalker как раз та фигня с TRAP и байтами-данными после её вызова, которую ты привёл для Comix Zone. Но там, ЕМНИП, есть пара обычных процедур, не TRAP'овых, которые меняют точку возврата. |
| DrMefistO:
В квакшоте практически все основные процедуры распаковки данных вызываются через трапы. Ну а так код нормальный. А Tecmo Cup практически весь на F0 XX опкодах и сделан. Но, мне кажется, обработка исключений должна как-то сказываться либо на скорости, либо на обработке команд эмулятором. Все ли они такое понимают? |
| Ti_:
--- Цитата: DrMefistO от 14 Октябрь 2012, 20:06:28 ---А Tecmo Cup практически весь на F0 XX опкодах и сделан. Но, мне кажется, обработка исключений должна как-то сказываться либо на скорости, либо на обработке команд эмулятором. Все ли они такое понимают? --- Конец цитаты --- Можно проверить конечно, но скорее всего все эмули понимают это. Они только ошибку нечетного bad adress не эмулируют, да и то наверно не все. Ну на скорости да, ну оно же не намного дольше jsr будет, так что разницы почти никакой, если только не в цикле стоит. |
| MetalliC:
DrMefistO, TRAP и LINE эксепшены одинаковы по тактам, но быстрее чем JSR да и короче аж на 4 байта трап/ексепшн это обычная комманда, которая выполняется фиксированное кол-во тактов, так что наверняка тайминг верный в эмуляторах. --- Цитата: Ti_ ---Можно проверить конечно, но скорее всего все эмули понимают это. Они только ошибку нечетного bad adress не эмулируют, да и то наверно не все. --- Конец цитаты --- да давно уже все и всё эмулируют, большинство более-менее современных эмуляторов используют ядро М68К Musashi, там и доступ к нечетным адресам эмулится и prefetch. я уже молчу про WinUAE и его 68020 с потактовой эмуляцией, а в 20ке есть кеш и в зависимости от hit/miss комманды очень разное время могут выполняться. |
| Ti_:
--- Цитата: MetalliC от 14 Октябрь 2012, 23:46:39 ---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:
Ti_, тогда наверное так, у меня книжка юзер-мануал по 68030, по нему и смотрел, при мисс-кэш большинство комманд выполняются столько же тактов как и на 000, но видно не все :) |
| GManiac:
JSR может занимать и 4 байта, и поэтому требовать на 4 такта меньше, чем 6-байтный. Или, что то же самое, BSR на 4 байта. Это если весь код игры кучкуется в одном месте. А RTE выполняется дольше, чем RTS :) Для скорости LINE Emulator нет смысла использовать, "декодирование" опкода - например, извлечение номера процедуры и прыжок на неё, как в Tecmo Cup, - занимает много времени. Выгода от TRAP тоже сомнительна. Добавлено позже: Да и в том же Лэндстолкере в самом начале рома огромная таблица прыжков и 6-байтные JSR'ы на них. Так что TRAP там не для экономии. |
| Segaman:
ну я например заюзал команду F00X для кода извлечения корня из регистра dX так можно например массив ссылок написать и вызывать их по номеру. в своей игруле я такие фичи юзаю по мелочи. |
| DrMefistO:
Поясните, плиз назначение команд типа: --- Код: ---move #$XXXX,sr --- Конец кода --- Или: --- Код: ---or #$XXXX,sr --- Конец кода --- Ну и всех подобных с регистром sr. |
| MetalliC:
почитай доку чтоли с описанием битов регистра SR и всё станет понятно в мегадрайве как правило используется только для вкл/выкл прерываний |
| DrMefistO:
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:
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:
такая команда нужна чтобы изменить настройку прерываний. т.е. на момент команды было и вертикальное прерывание и горизонтальное, а после уже только вертикальное. это крайне удобно, например, чтобы запустить архиватор, выключить скроллинг слоя и не выключать музыку. ну это грубый пример (например комикс зон наглядный пример, момент, когда страница перелистывается) можно даже на определенное время сунуть настройки в стэк, заменить прерывания и после какихто манипуляций вернуть настройку из стэка. |
| DrMefistO:
--- Код: ---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:
SRAM как вариант |
| DrMefistO:
Не похоже, т.к. в хедере SRAM поле пустое. |
| MetalliC:
DrMefistO, или header врёт или глюк, а что за игра кстати ? |
| DrMefistO:
Dizzy Adventures (SMD). Добавлено позже: А запись по "Bad address" может обрабатываться каким-то исключением? |
| MetalliC:
--- Цитата: DrMefistO ---Dizzy Adventures (SMD). --- Конец цитаты --- в смысле Fantastic Dizzy ? sram в том карте нет, я думаю это ошибка/глюк игры. --- Цитата: DrMefistO ---А запись по "Bad address" может обрабатываться каким-то исключением? --- Конец цитаты --- что ты подразумеваешь под "Bad address" ? если попытку записи в ром то нет. |
| DrMefistO:
--- Цитата: MetalliC ---в смысле Fantastic Dizzy --- Конец цитаты --- Да, и SRAM там нету. --- Цитата: MetalliC ---я думаю это ошибка/глюк игры. --- Конец цитаты --- но эта "ошибка" много где в начале игры есть. --- Цитата: MetalliC ---если попытку записи в ром то нет. --- Конец цитаты --- да, думал что может так как-то) |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |