Всем привет, у меня вопрос к местным экспертам: Как заставить транслятор назначать части памяти регистрам 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, а мой - нет. Я бы задал вопрос ии, но хотелось бы сначала услышать человеческое экспертное мнение