Разработка и ромхакинг > Ромхакинг
Нужна помощь по командам M68k
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.
Навигация
Перейти к полной версии