| Разработка и ромхакинг > Ромхакинг и программирование |
| Нужна помощь по командам M68k |
| << < (5/6) > >> |
| MetalliC:
--- Цитата: DrMefistO ---но эта "ошибка" много где в начале игры есть. --- Конец цитаты --- этот код похоже вызывается при ините звукового драйвера, но насколько я вижу с "левым" адресом в А0 она вызывается только в первый раз, в следующих вызовах в А0 уже нормальный адрес в раме. |
| DrMefistO:
Да, видимо так и есть. |
| Segaman:
:lol: |
| DrMefistO:
Подскажите, как реализовать команды ROXL и ROXR на языке высокого уровня (Delphi, C)? Допускается использование ассемблерной вставки. И сопутствующий вопрос: при каких условиях устанавливается X флаг? |
| r57shell:
--- Код: ---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:
Пасибо. В принципе, я суть уловил. Главное знать, где до этого устанавливается X флаг, и совать его на место освободившегося бита. А выдавленный бит совать в X. |
| GManiac:
Эквивалентные команды для x86: rcl, rcr --- Цитата ---И сопутствующий вопрос: при каких условиях устанавливается X флаг? --- Конец цитаты --- А мануал трудно глянуть? Там всё предельно понятно нарисовано и расписано. Флаг X служит буфером для хранения бита. Вдвигаемый (старший) бит берётся из флага X, а записывается туда выдвигаемый (младший, 0-й) бит. И так n раз, сколько в команде указано. Флаг C будет равен X. Добавлено позже: --- Цитата ---Главное знать, где до этого устанавливается X флаг, и совать его на место освободившегося бита. А выдавленный бит совать в X. --- Конец цитаты --- Обрати внимание, освободившийся бит заполняется X-ом на ПЕРВОМ сдвиге, а выдавливается младший бит в X для конечного результата на ПОСЛЕДНЕМ сдвиге (на самом деле он выдавливается n раз, на каждом сдвиге, но для конечного результата нам нужно его только один раз проверить). Если у тебя сдвигов больше одного. |
| DrMefistO:
У меня ROXL, с единичным сдвигом. Т.е. старший выдавливаемый бит идет в X, а то что в X до этого было (у меня значение X, которое "до этого", устанавливается командой asl.l 8, d5) идет в младший бит. Добавлено позже: --- Цитата: GManiac ---Эквивалентные команды для x86: rcl, rcr --- Конец цитаты --- Все бы хорошо, но мне надо до следующего раза таскать CR тогда. Как? |
| DrMefistO:
Подскажите, где можно почитать толковую доку по использованию 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 |
| GManiac:
0x7FD84C * 2 = 0xFFB098 Это совпадает с твоим RAM_Palette1 и есть адрес источника. Добавлено позже: Ты игру на ПК переписываешь, что ли? Смотрю, ты этот Текмо Кап 2 года уже мучаешь, ещё с форума шедевра помню твои темы. |
| DrMefistO:
Т.е. оно везде так: адрес источника должен быть в два раза меньше реального адреса? Добавлено позже: --- Цитата: GManiac ---Ты игру на ПК переписываешь, что ли? --- Конец цитаты --- Нет, просто нужно понять полностью что происходит в коде, и что куда копируется. Знаю, что графа в игре упакована, вот и ищу распаковщик. Но он не является единственной моей целью в этой игре) Добавлено позже: --- Цитата: GManiac ---Ты игру на ПК переписываешь, что ли? Смотрю, ты этот Текмо Кап 2 года уже мучаешь, ещё с форума шедевра помню твои темы. --- Конец цитаты --- Нее) Я на долго забивал на него) Просто сейчас вот решил вернуться с новым опытом) |
| Ti_:
--- Цитата: DrMefistO от 12 Ноябрь 2012, 16:52:04 ---Вот и интересно стало: при пересылке через DMA есть какие-то хитрости при указании адреса источника? --- Конец цитаты --- Всё правильно, адрес источника вначале делится на 2. Адрес куда копировать это $C0000000, если бы было DMA - то $C0000080. То есть почти не отличается от адреса без dma. |
| DrMefistO:
--- Цитата: Ti_ ---Адрес куда копировать это $C0000000, если бы было DMA - то $C0000080. То есть почти не отличается от адреса без dma. --- Конец цитаты --- Ну с этим-то понятно. --- Цитата: Ti_ ---Всё правильно, адрес источника вначале делится на 2. --- Конец цитаты --- Т.е. в любой игре, если мне надо что-то скопировать через DMA, я должен указывать в регистры VDP адрес, поделенный на 2? |
| Ti_:
--- Цитата: DrMefistO от 12 Ноябрь 2012, 17:50:20 ---Т.е. в любой игре, если мне надо что-то скопировать через DMA, я должен указывать в регистры VDP адрес, поделенный на 2? --- Конец цитаты --- Да везде так. |
| DrMefistO:
Снова вопрос: в игре нету ни VBLANK, ни HBLANK. Что может быть им заменой? Или если точнее: как найти то, что является заменой этим ф-циям? --- Код: ---ROM:00000000 ; STACK vector: $000000 ROM:00000000 ; RESET vector: $000200 ROM:00000000 ; BusErr vector: $0003C2 ROM:00000000 ; AdrErr vector: $0003C6 ROM:00000000 ; InvOpc vector: $0003CA ROM:00000000 ; DivBy0 vector: $0003CE ROM:00000000 ; Check vector: $0003D2 ROM:00000000 ; TrapV vector: $0003D6 ROM:00000000 ; GPF vector: $0003DA ROM:00000000 ; Trace vector: $0003DE ROM:00000000 ; Reserv0 vector: $0003E2 ROM:00000000 ; Reserv1 vector: $0003E6 ROM:00000000 ; Reserv2 vector: $0003EA ROM:00000000 ; Reserv3 vector: $0003EA ROM:00000000 ; Reserv4 vector: $0003EA ROM:00000000 ; BadInt vector: $0003EA ROM:00000000 ; Reserv10 vector: $0003EA ROM:00000000 ; Reserv11 vector: $0003EA ROM:00000000 ; Reserv12 vector: $0003EA ROM:00000000 ; Reserv13 vector: $0003EA ROM:00000000 ; Reserv14 vector: $0003EA ROM:00000000 ; Reserv15 vector: $0003EA ROM:00000000 ; Reserv16 vector: $0003EA ROM:00000000 ; Reserv17 vector: $0003EA ROM:00000000 ; Trap0 vector: $0003EA ROM:00000000 ; Trap1 vector: $0003EA ROM:00000000 ; Trap2 vector: $0003EA ROM:00000000 ; Trap3 vector: $0003EA ROM:00000000 ; Trap4 vector: $0003EA ROM:00000000 ; Trap5 vector: $0003EA ROM:00000000 ; Trap6 vector: $0003EA ROM:00000000 ; Trap7 vector: $0003EA ROM:00000000 ; Trap8 vector: $0003EA ROM:00000000 ; Trap9 vector: $0003EA ROM:00000000 ; Trap10 vector: $0003EA ROM:00000000 ; Trap11 vector: $0003EA ROM:00000000 ; Trap12 vector: $0003EA ROM:00000000 ; Trap13 vector: $0003EA ROM:00000000 ; Trap14 vector: $0003EA ROM:00000000 ; Trap15 vector: $0003EA ROM:00000000 ; Reserv30 vector: $0003EA ROM:00000000 ; Reserv31 vector: $0003EA ROM:00000000 ; Reserv32 vector: $0003EA ROM:00000000 ; Reserv33 vector: $0003EA ROM:00000000 ; Reserv34 vector: $0003EA ROM:00000000 ; Reserv35 vector: $0003EA ROM:00000000 ; Reserv36 vector: $0003EA ROM:00000000 ; Reserv37 vector: $0003EA ROM:00000000 ; Reserv38 vector: $0003EA ROM:00000000 ; Reserv39 vector: $0003EA ROM:00000000 ; Reserv3A vector: $0003EA ROM:00000000 ; Reserv3B vector: $0003EA ROM:00000000 ; Reserv3C vector: $0003EA ROM:00000000 ; Reserv3D vector: $0003EA ROM:00000000 ; Reserv3E vector: $0003EA ROM:00000000 ; Reserv3F vector: $0003EA --- Конец кода --- Добавлено позже: Ведь должна же быть функция, которая бы обрабатывала вертикальные и горизонтальные прерывания. |
| Ti_:
--- Цитата: DrMefistO от 20 Ноябрь 2012, 22:12:28 ---Ведь должна же быть функция, которая бы обрабатывала вертикальные и горизонтальные прерывания. --- Конец цитаты --- Попробуй поищи что-то похожее на: ; =============== S U B R O U T I N E ======================================= vdp_wait_for_vbl: ; ... lea (VDPCONTROL).l,a0 loc_0_10BE: ; ... move.w (a0),d0 andi.w #8,d0 beq.s loc_0_10BE rts ; End of function vdp_wait_for_vbl ; =============== S U B R O U T I N E ======================================= vdp_wait_for_no_vbl: ; ... lea (VDPCONTROL).l,a0 loc_0_10CE: ; ... move.w (a0),d0 andi.w #8,d0 bne.s loc_0_10CE rts ; End of function vdp_wait_for_no_vbl |
| DrMefistO:
Подобные процедуры я то нашел, которые проверяют бит 3 контрола, но они всего-то пустышки, как и у тебя в примере. А как же найти процедуру, которая бы что-то делала на период VBLANK/HBLANK'а? |
| Ti_:
--- Цитата: DrMefistO от 21 Ноябрь 2012, 10:05:44 ---Подобные процедуры я то нашел, которые проверяют бит 3 контрола, но они всего-то пустышки, как и у тебя в примере. А как же найти процедуру, которая бы что-то делала на период VBLANK/HBLANK'а? --- Конец цитаты --- Кинь трейс лог на 1кадр. Толи вначале файла, толи в конце будет. (перед rte) |
| r57shell:
DrMefistO, дак такой функции же достаточно чтобы проверить сменился кадр или нет. А всё остальное, можно делать каждый раз после изменения счётчика кадров. Вон, в том же UMK3 код задержки выгледит: --- Код: ---move #задержка, куда-то jsr код_задержки ; процедура в UMK3 спецальная для этого - а тут уже продолжение через несколько кадров. --- Конец кода --- Всё зависит от конкретной игры... можно по разному реализовать можно тем же --- Код: (псевдокод) --- move.l (текущий счётчик кадров), (temp) loop: jsr обновление_чего-то cmp.l (tmp), (текущий счётчик каров) beq loop --- Конец кода --- |
| DrMefistO:
Снова вопросец: --- Код: ---ROM:00006580 neg.w d0 ROM:00006582 ROM:00006582 loc_6582: ; CODE XREF: sub_6532+54j ROM:00006582 move.b (a6,d0.w),(a6)+ ROM:00006586 dbf d2,loc_6582 --- Конец кода --- В данном коде значение d0 делают с минусом, затем по адресу [a6 - d0] копируют байт в [a6] в цикле. Вопрос в том, что буфер для распаковки у меня начался с адреса 0xFF0000. При подходе к данном участку в a6 у меня 0xFF0008, в d0 - 0x250. После инвертирования получается 0xFDB0. Вот и не понимаю, куда оно ссылается, если буфер то еще в позиции 8, а назад оно просит на 0x250. |
| Навигация |
| Главная страница сообщений |
| Следующая страница |
| Предыдущая страница |