Автор Тема: Как заставить транслятор сопоставлять части памяти x86 регистрам mega drive?  (Прочитано 325 раз)

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

Оффлайн Dport

  • Пользователь
  • Сообщений: 18
    • Просмотр профиля
Всем привет, у меня вопрос к местным экспертам: Как заставить транслятор назначать части памяти регистрам mega drive? Я воспользовался транслятором 68k -> x86 и транслировал Obj_Bloominator из Sonic 3 & Knuckles, у которого уже есть дизасм. Вот так выглядит оригинальный код (68к):Obj_Bloominator:
        jsr    (Obj_WaitOffscreen).l
        moveq    #0,d0
        move.b    routine(a0),d0
        move.w    Bloominator_Index(pc,d0.w),d1
        jsr    Bloominator_Index(pc,d1.w)
        jmp    (Sprite_CheckDeleteTouch).l
; ---------------------------------------------------------------------------
 
loc_54B86:
        jsr    SetUp_ObjAttributes(pc)
        move.w    #$1F,$2E(a0)
        move.l    #loc_54BAA,$34(a0)
 
locret_54B9C:
        rts
; ---------------------------------------------------------------------------
 
loc_54B9E:
        tst.b    render_flags(a0)
        bpl.w    locret_54B9C
        jmp    Obj_Wait(pc)
; ---------------------------------------------------------------------------
 
loc_54BAA:
        move.b    #4,routine(a0)
        move.l    #byte_54C3E,$30(a0)
        move.l    #loc_54BF8,$34(a0)
        rts
; ---------------------------------------------------------------------------
 
loc_54BC2:
        jsr    Animate_RawMultiDelay(pc)
        beq.s    locret_54B9C
        cmpi.b    #6,d0
        beq.s    loc_54BD4
        cmpi.b    #$E,d0
        bne.s    locret_54B9C
 
loc_54BD4:
        moveq    #signextendB(sfx_Projectile),d0
        jsr    (Play_SFX).l
        lea    ChildObjDat_54C26(pc),a2
        jsr    CreateChild2_Complex(pc)
        bne.s    locret_54BF6
        addq.b    #1,$39(a0)
        btst    #0,$39(a0)
        beq.s    locret_54BF6
        neg.w    x_vel(a1)
 
locret_54BF6:
        rts
; ---------------------------------------------------------------------------
 
loc_54BF8:
        move.b    #2,routine(a0)
        move.w    #2*60,$2E(a0)
        move.l    #loc_54BAA,$34(a0)
        rts
; ------------------------------------------------------------------------
 
Так выглядит тот код, который был транслирован внутренним инструментом Сеги из официального порта на win 95 (Sonic & Knuckles Collection):hana00:
CALL chk_framein
XOR EAX,EAX
MOV [68k_d0],EAX
MOV EDI,dword ptr [68k_a0]
MOV AL,byte ptr [EDI + 0x5]
MOV [68k_d0],AL
MOVSX ESI,word ptr [68k_d0]
ADD ESI,hana00@@act_tbl
MOV AX,word ptr [ESI]
MOV [68k_d1],AX
MOVSX EAX,word ptr [68k_d1]
LEA EAX,[EAX + hana00@@act_tbl]
CALL EAX
JMP chk_emy_foutc0
 
hana00_init:
MOV EAX,hana00_init_tbl
MOV [68k_a1],EAX
MOV EAX,enemy_init0
CALL EAX
MOV AX,0x1f
MOV EDI,dword ptr [68k_a0]
MOV word ptr [EDI + 0x2e],AX
MOV EAX,hana00_shot_init
MOV EDI,dword ptr [68k_a0]
MOV dword ptr [EDI + 0x34],EAX
 
return45:
RET
 
hana00_wait:
MOV EDI,dword ptr [68k_a0]
MOV AL,byte ptr [EDI + 0x4]
TEST AL,AL
JNS return45
MOV EAX,dec_timer
JMP EAX
 
hana00_shot_init:
MOV AL,0x4
MOV EDI,dword ptr [68k_a0]
MOV byte ptr [EDI + 0x5],AL
MOV EAX,hana00_pg00
MOV EDI,dword ptr [68k_a0]
MOV dword ptr [EDI + 0x30],EAX
MOV EAX,hana00_wait_init
MOV EDI,dword ptr [68k_a0]
MOV dword ptr [EDI + 0x34],EAX
RET
 
hana00_shot:
MOV EAX,time_pg
CALL EAX
JZ return45
MOV BL,0x6
MOV AL,[68k_d0]
CMP AL,BL
JZ hana00_shot@@set_shot
MOV BL,0xe
MOV AL,[68k_d0]
CMP AL,BL
JNZ return45
 
hana00_shot@@set_shot:
MOV dword ptr [68k_d0],0x4d
CALL soundset
MOV EAX,hana00_shot_set_tbl
MOV [68k_a2],EAX
MOV EAX,set_act01
CALL EAX
JNZ hana00_shot@@100
MOV EDI,dword ptr [68k_a0]
MOV AL,byte ptr [EDI + 0x39]
ADD AL,0x1
MOV EDI,dword ptr [68k_a0]
MOV byte ptr [EDI + 0x39],AL
MOV EDI,dword ptr [68k_a0]
MOV EAX,dword ptr [EDI + 0x39]
BT EAX,0x0
SETC AL
AND AL,AL
JZ hana00_shot@@100
MOV EDI,dword ptr [68k_a1]
MOV AX,word ptr [EDI + 0x18]
NEG AX
MOV EDI,dword ptr [68k_a1]
MOV word ptr [EDI + 0x18],AX
 
hana00_shot@@100:
RET
 
hana00_wait_init:
MOV AL,0x2
MOV EDI,dword ptr [68k_a0]
MOV byte ptr [EDI + 0x5],AL
MOV AX,0x78
MOV EDI,dword ptr [68k_a0]
MOV word ptr [EDI + 0x2e],AX
MOV EAX,hana00_shot_init
MOV EDI,dword ptr [68k_a0]
MOV dword ptr [EDI + 0x34],EAX
RET
А так выглядит тот же код, транслированный собранной мной утилитой(вставил официальные имена переменных из Sonic & Knuckles Collection):hana00:
    CALL chk_framein
    MOV  ESI,offset 0
    MOV  D0.L,ESI
    MOV  EDI,A0.L
    MOV  EBX,ESI
    MOV  BL,routine[EDI].B
    MOV  D0.L,EBX
    MOVSX ESI,BX
    MOV  EBP,D1.L
    MOV  BP,hana00@@act_tbl[ESI].W
    MOV  D1.L,EBP
    MOVSX ESI,BP
    LEA  ECX,hana00@@act_tbl[ESI].L
    CALL ECX
    JMP  chk_emy_foutc0
; ---------------------------------------------------------------------------
 
hana00_init:
    CALL enemy_init0
    MOV  ESI,A0.L
    MOV  $2E[ESI].W,offset 01FH
    MOV  $34[ESI].L,offset hana00_shot_init
 
return45:
    RET
; ---------------------------------------------------------------------------
 
hana00_wait:
    MOV  ESI,A0.L
    CMP  render_flags[ESI].B,offset 0
    JNS  return45
    JMP  dec_timer
; ---------------------------------------------------------------------------
 
hana00_shot_init:
    MOV  ESI,A0.L
    MOV  routine[ESI].B,offset 4
    MOV  $30[ESI].L,offset byte_54C3E
    MOV  $34[ESI].L,offset hana00_wait_init
    RET
; ---------------------------------------------------------------------------
 
hana00_shot:
    CALL time_pg
    JE   return45
    MOV  EBX,D0.L
    CMP  BL,offset 6
    JE   hana00_shot@@set_shot
    CMP  BL,offset 0EH
    JNE  return45
 
hana00_shot@@set_shot:
    MOV  ESI,offset
    MOV  D0.L,ESI
    CALL soundset
    LEA  ESI,[ChildObjDat_54C26]
    MOV  A2.L,ESI
    CALL CreateChild2_Complex
    JNE  hana00_shot@@100
    MOV  ESI,A0.L
    ADD  $39[ESI].B,offset 1
    BT   $39[ESI].L,offset 0
    SBB  EDI,EDI
    JE   hana00_shot@@100
    MOV  EBP,A1.L
    NEG  DS:x_vel[EBP].W
 
hana00_shot@@100:
    RET
; ---------------------------------------------------------------------------
 
hana00_wait_init:
    MOV  ESI,A0.L
    MOV  routine[ESI].B,offset 2
    MOV  $2E[ESI].W,offset 2*60
    MOV  $34[ESI].L,offset hana00_shot_init
    RET
; ---------------------------------------------------------------------------
;TOTAL: IN 60, INSTR 56, LABELS 9, COMMENTS 6, ERRORS 0
Сеговский транслятор сопоставляет части памяти регистрам mega drive, а мой - нет. Я бы задал вопрос ии, но хотелось бы сначала услышать человеческое экспертное мнение

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2901
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
ну значит тебе надо эмулировать память :) чтобы писать туда, после читать оттуда когда надо.

Оффлайн Dport

  • Пользователь
  • Сообщений: 18
    • Просмотр профиля
SeregaZ, а как мне сэмулировать память?

Оффлайн SeregaZ

  • Пользователь
  • Сообщений: 2901
  • Пол: Мужской
  • ливнул с форума
    • Youtube
    • Просмотр профиля
разве в этой самой утилите это все не сделано? я правда не с того конца делал... но суть та-же самая можно сказать. в трассере к эмулятору идут друг за другом команды, которые гонял процессор и что-то куда-то где-то писал. я отобрал те команды, которые пишут в память, после создал кусочек памяти 65 килобайт и туда писал согласно трассеру по нужным адресам нужные данные. и по итогу можно на любой строчке трассера жмакнуть и увидеть состояние памяти в этот момент.

в твоем случае это будет сложнее, ибо у тебя голый код. как объяснить то... когда сам не знаю :) получается надо эмулировать процессор, опрос джойстика, всякие вбланк шбланк, и все прочие блудняки... и по итогу придешь к созданию эмулятора  :lol: :lol: :lol:

наверное я бы предложил сначала пойти по пути создания проигрывателя для трассера. типа пишешь трассер, загружаешь в свой проигрыватель, а он это все показывает средствами винды, а не эмулятора. таким образом вникнешь что именно каждая команда делает, откуда берет данные, куда пишет и весь этот подковерный кипишь. тогда может что и выйдет с переписью 68К в х86.

на самом деле я просто не понимаю какой в этом смысл. это ведь костыли. играется игра на сеге и хрен бы с ней. пусть играется. смысл его куда-то там портировать? все равно тебе понадобится полный дизасм. и это, на сегодня, тупик. как бы да ИИ прям прет семимильными шагами и может в ближайшее время родится наконец дизасмирующий ИИ, рожающий 100% точный код... но на сегодня это самая главная проблема. и поэтому смысла в этом портировании не особо. ну сделаешь ты одну игру. ну может две - сурсы которой найдешь... а сколько ты времени потратишь на создание этого инструмента, который это все конвертирует? а сколько потратишь на отлов всех багов? посему думаю правильней было бы начать копать сурсы эмуляторов. нежели запиливать свое с нуля. хотя чужой код это потёмки... когда делаешь свое - то все изначально понятно.