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

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